summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChung-yih Wang <cywang@google.com>2010-10-07 07:12:42 +0800
committerChung-yih Wang <cywang@google.com>2010-10-07 07:12:42 +0800
commit4dee5796d1064d03c7a15dc7a9f570977f1af5a5 (patch)
treef95d86999f471994f20b08cfff2430a58ba4e801
parentb7d4b7cb5090922aac9c616e9ab27bbde5c5c62a (diff)
downloadandroid_external_nist-sip-4dee5796d1064d03c7a15dc7a9f570977f1af5a5.tar.gz
android_external_nist-sip-4dee5796d1064d03c7a15dc7a9f570977f1af5a5.tar.bz2
android_external_nist-sip-4dee5796d1064d03c7a15dc7a9f570977f1af5a5.zip
Cleanup the unused files in nist-sip.
Change-Id: Ic5e58b684d6465997f9049a802a6c5e7e1c53b70
-rw-r--r--Android.mk.sample41
-rw-r--r--demo/com/android/sip/SipServiceBinder.java76
-rw-r--r--demo/com/android/sip/demo/IncomingCallReceiver.java43
-rw-r--r--demo/com/android/sip/demo/OutgoingCallReceiver.java96
-rw-r--r--demo/com/android/sip/demo/SipCallSetup.java386
-rw-r--r--demo/com/android/sip/demo/SipCallUi.java581
-rw-r--r--demo/com/android/sip/demo/SipMain.java701
-rw-r--r--phone/Android.mk.sample41
-rw-r--r--phone/AndroidManifest.xml408
-rw-r--r--phone/CleanSpec.mk49
-rw-r--r--phone/res/anim/touch_lock_fade_in.xml26
-rw-r--r--phone/res/color-finger/dialer_button_text.xml28
-rw-r--r--phone/res/color-finger/ota_title_color.xml23
-rw-r--r--phone/res/drawable-finger/btn_dial.xml28
-rw-r--r--phone/res/drawable-finger/btn_dial_action.xml32
-rw-r--r--phone/res/drawable-finger/btn_dial_blue.xml28
-rw-r--r--phone/res/drawable-finger/btn_dial_delete.xml33
-rw-r--r--phone/res/drawable-finger/btn_dial_green.xml28
-rw-r--r--phone/res/drawable-finger/btn_dial_textfield.xml25
-rw-r--r--phone/res/drawable-finger/btn_dial_textfield_active.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_0.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_1_no_vm.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_2.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_3.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_4.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_5.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_6.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_7.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_8.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_9.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_pound.xml25
-rw-r--r--phone/res/drawable-finger/dial_num_star.xml25
-rw-r--r--phone/res/drawable-finger/ic_dial_number.xml25
-rw-r--r--phone/res/drawable-finger/ic_tab_contacts.xml21
-rw-r--r--phone/res/drawable-finger/ic_tab_dialer.xml21
-rw-r--r--phone/res/drawable-finger/ic_tab_recent.xml21
-rw-r--r--phone/res/drawable-finger/ic_tab_starred.xml21
-rw-r--r--phone/res/drawable-finger/tray_handle_strip.xml23
-rw-r--r--phone/res/drawable-finger/tray_handle_tab.xml23
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_left_disable.9.pngbin2453 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_left_disable_focused.9.pngbin3021 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_left_normal.9.pngbin2453 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_left_pressed.9.pngbin3204 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_left_selected.9.pngbin3337 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_middle_disable.9.pngbin458 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_middle_disable_focused.9.pngbin645 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_middle_normal.9.pngbin458 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_middle_pressed.9.pngbin601 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_middle_selected.9.pngbin628 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_right_disable.9.pngbin2543 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_right_disable_focused.9.pngbin3198 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_right_normal.9.pngbin2543 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_right_pressed.9.pngbin3368 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_action_right_selected.9.pngbin3461 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_normal.9.pngbin1313 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_normal_blue.9.pngbin1857 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_normal_green.9.pngbin1842 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_pressed.9.pngbin2057 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_selected.9.pngbin2116 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_textfield_activated.9.pngbin491 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_textfield_normal.9.pngbin350 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_textfield_normal_full.9.pngbin1231 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_textfield_normal_full_sm.9.pngbin1010 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_textfield_pressed.9.pngbin500 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/btn_dial_textfield_selected.9.pngbin502 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_0_blk.pngbin701 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_0_wht.pngbin1823 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_1_no_vm_blk.pngbin389 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_1_no_vm_wht.pngbin800 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_2_blk.pngbin1024 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_2_wht.pngbin2998 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_3_blk.pngbin882 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_3_wht.pngbin2675 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_4_blk.pngbin782 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_4_wht.pngbin2465 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_5_blk.pngbin793 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_5_wht.pngbin2351 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_6_blk.pngbin1101 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_6_wht.pngbin3226 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_7_blk.pngbin1002 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_7_wht.pngbin3167 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_8_blk.pngbin988 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_8_wht.pngbin2707 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_9_blk.pngbin1104 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_9_wht.pngbin3698 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_pound_blk.pngbin560 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_pound_wht.pngbin1635 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_star_blk.pngbin698 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dial_num_star_wht.pngbin1475 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/dialpad_lock.9.pngbin75353 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_dial_action_call.pngbin2660 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_dial_action_delete.pngbin1361 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_dial_action_voice_mail.pngbin1702 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_dial_number_blk.pngbin1003 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_dial_number_wht.pngbin2069 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_menu_contact.pngbin2260 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_tab_selected_contacts.pngbin978 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_tab_selected_dialer.pngbin1671 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_tab_selected_recent.pngbin2957 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_tab_selected_stared.pngbin1420 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_tab_unselected_contacts.pngbin1131 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_tab_unselected_dialer.pngbin2065 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_tab_unselected_recent.pngbin3520 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/ic_tab_unselected_stared.pngbin1560 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/tray_handle_strip_normal.9.pngbin289 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/tray_handle_strip_pressed.9.pngbin327 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/tray_handle_strip_selected.9.pngbin321 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/tray_handle_tab_normal.9.pngbin4029 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/tray_handle_tab_pressed.9.pngbin5381 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi-finger/tray_handle_tab_selected.9.pngbin5388 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/bg_in_call_gradient_bluetooth.9.pngbin537 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/bg_in_call_gradient_connected.9.pngbin501 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/bg_in_call_gradient_ended.9.pngbin536 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/bg_in_call_gradient_on_hold.9.pngbin528 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/bg_in_call_gradient_unidentified.9.pngbin418 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_answer_dotted_green.9.pngbin6551 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_answer_dotted_red.9.pngbin6332 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_answer_normal.9.pngbin1869 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_answer_pressed.9.pngbin3117 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_main_disable.9.pngbin1322 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_main_disable_focused.9.pngbin1367 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_main_normal.9.pngbin1322 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_main_pressed.9.pngbin2199 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_main_selected.9.pngbin2245 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_manage_conf_normal.9.pngbin14763 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_manage_conf_pressed.9.pngbin15096 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_manage_conf_selected.9.pngbin15174 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_round_disable.pngbin1990 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_round_disable_focused.pngbin3103 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_round_normal.pngbin4376 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_round_pressed.pngbin4582 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_round_selected.pngbin4688 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_off_disable.9.pngbin1405 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_off_disable_focused.9.pngbin1467 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_off_normal.9.pngbin1455 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_off_pressed.9.pngbin2230 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_off_selected.9.pngbin2326 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_on_disable.9.pngbin1614 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_on_disable_focused.9.pngbin1669 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_on_normal.9.pngbin1668 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_on_pressed.9.pngbin2266 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/btn_in_call_switch_on_selected.9.pngbin2377 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/dialog_bg_calling_via.9.pngbin2657 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/green_divider.pngbin434 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/green_selected.9.pngbin854 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_button_conference_end.pngbin1267 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_button_conference_private.pngbin1596 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_button_contacts.pngbin1765 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_dialog_call.pngbin1332 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_add_call.pngbin2999 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_answer.pngbin4385 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_dialpad.pngbin3831 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_dialpad_close.pngbin4861 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_end.pngbin3254 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_hold.pngbin1455 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_merge_call.pngbin3504 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_round_add_call.pngbin1075 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_round_hold.pngbin954 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_round_manage_conference.pngbin1652 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_round_merge_call.pngbin1933 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_round_swap.pngbin2425 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_round_unhold.pngbin1399 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_round_unhold_alt.pngbin2073 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_swap.pngbin3245 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_in_call_touch_unhold.pngbin2497 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_incall_end.pngbin1045 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_incall_ongoing.pngbin1302 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_incall_ongoing_bluetooth.pngbin1757 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_incall_onhold.pngbin713 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_incoming_call_bluetooth.pngbin2560 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_jog_dial_answer.pngbin6203 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_jog_dial_answer_and_end.pngbin6640 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_jog_dial_answer_and_hold.pngbin6919 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_jog_dial_decline.pngbin5703 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_jog_dial_silence_ringer.pngbin5744 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_jog_dial_sound_off.pngbin5698 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_jog_dial_sound_on.pngbin5685 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_jog_dial_unlock.pngbin5758 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/ic_jog_dial_voice_search.pngbin5275 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_launcher_phone.pngbin5445 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_menu_answer_call.pngbin2811 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_menu_dial_pad.pngbin3580 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_menu_end_call.pngbin1985 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_menu_merge_calls.pngbin2557 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_menu_silence_ringer.pngbin3190 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/ic_menu_swap_calls.pngbin2822 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/incall_photo_border_lg.9.pngbin2131 -> 0 bytes
-rwxr-xr-xphone/res/drawable-hdpi/incall_photo_border_med.9.pngbin1545 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/picture_busy.pngbin4789 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/picture_conference.pngbin4902 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/picture_dialing.pngbin2726 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/picture_emergency25x25.pngbin2252 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/picture_emergency32x32.pngbin2231 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/picture_unknown.pngbin3564 -> 0 bytes
-rw-r--r--phone/res/drawable-hdpi/red_selected.9.pngbin863 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_left_disable.9.pngbin1451 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_left_disable_focused.9.pngbin1728 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_left_normal.9.pngbin1451 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_left_pressed.9.pngbin1874 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_left_selected.9.pngbin1885 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_middle_disable.9.pngbin399 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_middle_disable_focused.9.pngbin527 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_middle_normal.9.pngbin399 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_middle_pressed.9.pngbin500 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_middle_selected.9.pngbin524 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_right_disable.9.pngbin1541 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_right_disable_focused.9.pngbin1815 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_right_normal.9.pngbin1541 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_right_pressed.9.pngbin1941 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_action_right_selected.9.pngbin1974 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_normal.9.pngbin988 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_normal_blue.9.pngbin1299 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_normal_green.9.pngbin1301 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_pressed.9.pngbin1307 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_selected.9.pngbin1405 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_textfield_activated.9.pngbin378 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_textfield_normal.9.pngbin313 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_textfield_normal_full.9.pngbin8517 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_textfield_normal_full_sm.9.pngbin1096 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_textfield_pressed.9.pngbin360 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/btn_dial_textfield_selected.9.pngbin389 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_0_blk.pngbin511 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_0_wht.pngbin1279 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_1_no_vm_blk.pngbin296 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_1_no_vm_wht.pngbin589 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_2_blk.pngbin626 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_2_wht.pngbin1970 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_3_blk.pngbin663 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_3_wht.pngbin1847 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_4_blk.pngbin570 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_4_wht.pngbin1613 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_5_blk.pngbin550 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_5_wht.pngbin1601 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_6_blk.pngbin725 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_6_wht.pngbin2071 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_7_blk.pngbin670 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_7_wht.pngbin2183 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_8_blk.pngbin644 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_8_wht.pngbin1874 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_9_blk.pngbin707 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_9_wht.pngbin2370 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_pound_blk.pngbin371 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_pound_wht.pngbin975 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_star_blk.pngbin474 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dial_num_star_wht.pngbin1080 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/dialpad_lock.9.pngbin16824 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_dial_action_call.pngbin1809 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_dial_action_delete.pngbin1208 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_dial_action_voice_mail.pngbin1182 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_dial_number_blk.pngbin564 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_dial_number_wht.pngbin1180 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_menu_contact.pngbin1673 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_tab_selected_contacts.pngbin1168 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_tab_selected_dialer.pngbin1012 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_tab_selected_recent.pngbin1749 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_tab_selected_stared.pngbin1178 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_tab_unselected_contacts.pngbin1207 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_tab_unselected_dialer.pngbin3753 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_tab_unselected_recent.pngbin1825 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/ic_tab_unselected_stared.pngbin1168 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/tray_handle_strip_normal.9.pngbin205 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/tray_handle_strip_pressed.9.pngbin213 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/tray_handle_strip_selected.9.pngbin218 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/tray_handle_tab_normal.9.pngbin1295 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/tray_handle_tab_pressed.9.pngbin1525 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi-finger/tray_handle_tab_selected.9.pngbin1583 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/bg_in_call_gradient_bluetooth.9.pngbin409 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/bg_in_call_gradient_connected.9.pngbin405 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/bg_in_call_gradient_ended.9.pngbin604 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/bg_in_call_gradient_on_hold.9.pngbin392 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/bg_in_call_gradient_unidentified.9.pngbin295 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_answer_dotted_green.9.pngbin3183 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_answer_dotted_red.9.pngbin3228 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_answer_normal.9.pngbin1339 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_answer_pressed.9.pngbin2213 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_main_disable.9.pngbin977 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_main_disable_focused.9.pngbin952 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_main_normal.9.pngbin3726 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_main_pressed.9.pngbin1570 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_main_selected.9.pngbin1651 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_manage_conf_normal.9.pngbin8312 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_manage_conf_pressed.9.pngbin8364 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_manage_conf_selected.9.pngbin8438 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_round_disable.pngbin1353 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_round_disable_focused.pngbin2083 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_round_normal.pngbin2592 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_round_pressed.pngbin2726 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_round_selected.pngbin2811 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_off_disable.9.pngbin1060 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_off_disable_focused.9.pngbin1063 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_off_normal.9.pngbin1089 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_off_pressed.9.pngbin1476 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_off_selected.9.pngbin1559 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_on_disable.9.pngbin1166 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_on_disable_focused.9.pngbin1154 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_on_normal.9.pngbin1209 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_on_pressed.9.pngbin1492 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/btn_in_call_switch_on_selected.9.pngbin1593 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/dialog_bg_calling_via.9.pngbin1600 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/green_divider.pngbin320 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/green_selected.9.pngbin696 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_btn_next.pngbin779 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_button_conference_end.pngbin882 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_button_conference_private.pngbin1061 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_button_contacts.pngbin5049 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_dialog_call.pngbin3996 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_add_call.pngbin1837 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_answer.pngbin2716 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_dialpad.pngbin2212 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_dialpad_close.pngbin2892 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_end.pngbin2014 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_hold.pngbin959 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_merge_call.pngbin2106 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_round_add_call.pngbin721 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_round_hold.pngbin707 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_round_manage_conference.pngbin1056 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_round_merge_call.pngbin1201 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_round_swap.pngbin1459 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_round_unhold.pngbin872 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_round_unhold_alt.pngbin1250 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_swap.pngbin2038 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_in_call_touch_unhold.pngbin1524 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_incall_end.pngbin750 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_incall_ongoing.pngbin955 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_incall_ongoing_bluetooth.pngbin1196 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_incall_onhold.pngbin3264 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_incoming_call_bluetooth.pngbin1245 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_jog_dial_answer.pngbin3610 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_jog_dial_answer_and_end.pngbin3875 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_jog_dial_answer_and_hold.pngbin4039 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_jog_dial_decline.pngbin3284 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_jog_dial_silence_ringer.pngbin3258 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_jog_dial_sound_off.pngbin3401 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_jog_dial_sound_on.pngbin3213 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_jog_dial_unlock.pngbin3339 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/ic_jog_dial_voice_search.pngbin2994 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_launcher_phone.pngbin3184 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_menu_answer_call.pngbin4995 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_menu_dial_pad.pngbin5394 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_menu_end_call.pngbin4368 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_menu_merge_calls.pngbin4768 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_menu_silence_ringer.pngbin5360 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/ic_menu_swap_calls.pngbin5404 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/incall_photo_border_lg.9.pngbin1863 -> 0 bytes
-rwxr-xr-xphone/res/drawable-mdpi/incall_photo_border_med.9.pngbin1026 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/picture_busy.pngbin11911 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/picture_conference.pngbin9248 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/picture_dialing.pngbin4444 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/picture_emergency25x25.pngbin3666 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/picture_emergency32x32.pngbin1111 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/picture_unknown.pngbin5917 -> 0 bytes
-rw-r--r--phone/res/drawable-mdpi/red_selected.9.pngbin608 -> 0 bytes
-rw-r--r--phone/res/drawable/incall_button.xml41
-rw-r--r--phone/res/drawable/incall_round_button.xml42
-rw-r--r--phone/res/drawable/incall_toggle_button.xml91
-rw-r--r--phone/res/drawable/manage_conference_photo_button.xml26
-rw-r--r--phone/res/layout-finger/dialer_activity.xml42
-rw-r--r--phone/res/layout-finger/dialpad.xml112
-rw-r--r--phone/res/layout-finger/dtmf_twelve_key_dialer.xml118
-rw-r--r--phone/res/layout-finger/emergency_dialer.xml46
-rw-r--r--phone/res/layout-finger/non_drawer_dialpad.xml152
-rw-r--r--phone/res/layout-finger/voicemail_dial_delete.xml75
-rw-r--r--phone/res/layout-land-finger/emergency_dialer.xml44
-rw-r--r--phone/res/layout-long-finger/dialpad.xml116
-rw-r--r--phone/res/layout-long-finger/emergency_dialer.xml46
-rw-r--r--phone/res/layout-long-finger/non_drawer_dialpad.xml152
-rw-r--r--phone/res/layout-long-finger/voicemail_dial_delete.xml77
-rw-r--r--phone/res/layout-long-land-finger/emergency_dialer.xml44
-rw-r--r--phone/res/layout/adn_list.xml34
-rw-r--r--phone/res/layout/call_card.xml112
-rw-r--r--phone/res/layout/call_card_person_info.xml128
-rw-r--r--phone/res/layout/caller_in_conference.xml113
-rw-r--r--phone/res/layout/change_sim_pin_screen.xml125
-rw-r--r--phone/res/layout/delete_fdn_contact_screen.xml23
-rw-r--r--phone/res/layout/dialog_ussd_response.xml25
-rw-r--r--phone/res/layout/edit_fdn_contact_screen.xml91
-rw-r--r--phone/res/layout/enable_fdn_screen.xml51
-rw-r--r--phone/res/layout/enable_sim_pin_screen.xml51
-rw-r--r--phone/res/layout/eri_text_layout.xml32
-rw-r--r--phone/res/layout/fake_phone_activity.xml45
-rw-r--r--phone/res/layout/get_pin2_screen.xml48
-rw-r--r--phone/res/layout/incall_screen.xml136
-rw-r--r--phone/res/layout/incall_touch_ui.xml230
-rw-r--r--phone/res/layout/manage_conference_panel.xml145
-rw-r--r--phone/res/layout/ongoing_call_notification.xml59
-rw-r--r--phone/res/layout/otacall_card.xml157
-rw-r--r--phone/res/layout/pref_dialog_editphonenumber.xml58
-rw-r--r--phone/res/layout/pref_dialog_editpin.xml31
-rw-r--r--phone/res/layout/sim_import_list_entry.xml24
-rw-r--r--phone/res/layout/sim_missing.xml48
-rw-r--r--phone/res/layout/sim_ndp.xml85
-rw-r--r--phone/res/layout/sim_unlock.xml103
-rw-r--r--phone/res/values-cs/strings.xml600
-rw-r--r--phone/res/values-da/strings.xml600
-rw-r--r--phone/res/values-de/strings.xml600
-rw-r--r--phone/res/values-el/strings.xml600
-rw-r--r--phone/res/values-es-rUS/strings.xml600
-rw-r--r--phone/res/values-es/strings.xml600
-rw-r--r--phone/res/values-fr/strings.xml600
-rw-r--r--phone/res/values-it/strings.xml600
-rw-r--r--phone/res/values-ja/strings.xml600
-rw-r--r--phone/res/values-ko/strings.xml600
-rw-r--r--phone/res/values-nb/strings.xml600
-rw-r--r--phone/res/values-nl/strings.xml600
-rw-r--r--phone/res/values-pl/strings.xml600
-rw-r--r--phone/res/values-pt-rPT/strings.xml600
-rw-r--r--phone/res/values-pt/strings.xml600
-rw-r--r--phone/res/values-ru/strings.xml600
-rw-r--r--phone/res/values-sv/strings.xml600
-rw-r--r--phone/res/values-tr/strings.xml600
-rw-r--r--phone/res/values-zh-rCN/strings.xml600
-rw-r--r--phone/res/values-zh-rTW/strings.xml600
-rw-r--r--phone/res/values/attrs.xml52
-rw-r--r--phone/res/values/colors.xml31
-rw-r--r--phone/res/values/config.xml122
-rw-r--r--phone/res/values/dimens.xml9
-rwxr-xr-xphone/res/values/ids.xml39
-rwxr-xr-xphone/res/values/strings.xml1192
-rw-r--r--phone/res/values/styles.xml229
-rw-r--r--phone/res/xml/call_feature_setting.xml119
-rw-r--r--phone/res/xml/callforward_options.xml77
-rw-r--r--phone/res/xml/carrier_select.xml29
-rw-r--r--phone/res/xml/cdma_call_options.xml11
-rw-r--r--phone/res/xml/cdma_options.xml27
-rw-r--r--phone/res/xml/cell_broadcast_sms.xml317
-rw-r--r--phone/res/xml/data_usage_settings.xml43
-rw-r--r--phone/res/xml/eri_text_appwidget.xml22
-rw-r--r--phone/res/xml/fdn_setting.xml46
-rw-r--r--phone/res/xml/gsm_umts_additional_options.xml21
-rw-r--r--phone/res/xml/gsm_umts_call_options.xml25
-rw-r--r--phone/res/xml/gsm_umts_options.xml49
-rw-r--r--phone/res/xml/network_setting.xml73
-rw-r--r--phone/src/com/android/phone2/ADNList.java205
-rw-r--r--phone/src/com/android/phone2/AccelerometerListener.java161
-rw-r--r--phone/src/com/android/phone2/BluetoothAtPhonebook.java420
-rw-r--r--phone/src/com/android/phone2/BluetoothCmeError.java43
-rw-r--r--phone/src/com/android/phone2/BluetoothHandsfree.java2356
-rw-r--r--phone/src/com/android/phone2/BluetoothHeadsetService.java815
-rw-r--r--phone/src/com/android/phone2/ButtonGridLayout.java177
-rw-r--r--phone/src/com/android/phone2/CLIRListPreference.java165
-rwxr-xr-xphone/src/com/android/phone2/CallCard.java1478
-rw-r--r--phone/src/com/android/phone2/CallFeaturesSetting.java1731
-rw-r--r--phone/src/com/android/phone2/CallForwardEditPreference.java249
-rw-r--r--phone/src/com/android/phone2/CallLogAsync.java221
-rwxr-xr-xphone/src/com/android/phone2/CallNotifier.java1918
-rw-r--r--phone/src/com/android/phone2/CallTime.java231
-rw-r--r--phone/src/com/android/phone2/CallWaitingCheckBoxPreference.java113
-rw-r--r--phone/src/com/android/phone2/CarrierLogo.java55
-rw-r--r--phone/src/com/android/phone2/CdmaCallOptions.java45
-rwxr-xr-xphone/src/com/android/phone2/CdmaDisplayInfo.java86
-rw-r--r--phone/src/com/android/phone2/CdmaOptions.java57
-rwxr-xr-xphone/src/com/android/phone2/CdmaPhoneCallState.java155
-rw-r--r--phone/src/com/android/phone2/CdmaRoamingListPreference.java172
-rw-r--r--phone/src/com/android/phone2/CdmaVoicePrivacyCheckBoxPreference.java89
-rw-r--r--phone/src/com/android/phone2/CellBroadcastSms.java670
-rw-r--r--phone/src/com/android/phone2/ChangeIccPinScreen.java307
-rwxr-xr-xphone/src/com/android/phone2/DTMFTwelveKeyDialer.java1078
-rw-r--r--phone/src/com/android/phone2/DTMFTwelveKeyDialerView.java97
-rw-r--r--phone/src/com/android/phone2/DataUsage.java98
-rw-r--r--phone/src/com/android/phone2/DataUsageListener.java233
-rw-r--r--phone/src/com/android/phone2/DeleteFdnContactScreen.java183
-rw-r--r--phone/src/com/android/phone2/EditFdnContactScreen.java442
-rw-r--r--phone/src/com/android/phone2/EditPhoneNumberPreference.java499
-rw-r--r--phone/src/com/android/phone2/EditPinPreference.java112
-rw-r--r--phone/src/com/android/phone2/EmergencyCallHandler.java204
-rw-r--r--phone/src/com/android/phone2/EmergencyCallbackModeExitDialog.java348
-rw-r--r--phone/src/com/android/phone2/EmergencyCallbackModeService.java241
-rw-r--r--phone/src/com/android/phone2/EmergencyDialer.java604
-rw-r--r--phone/src/com/android/phone2/EnableFdnScreen.java151
-rw-r--r--phone/src/com/android/phone2/EnableIccPinScreen.java146
-rw-r--r--phone/src/com/android/phone2/EventLogTags.logtags9
-rw-r--r--phone/src/com/android/phone2/FakePhoneActivity.java78
-rw-r--r--phone/src/com/android/phone2/FdnList.java145
-rw-r--r--phone/src/com/android/phone2/FdnSetting.java434
-rw-r--r--phone/src/com/android/phone2/GetPin2Screen.java88
-rw-r--r--phone/src/com/android/phone2/GsmUmtsAdditionalCallOptions.java77
-rw-r--r--phone/src/com/android/phone2/GsmUmtsCallForwardOptions.java156
-rw-r--r--phone/src/com/android/phone2/GsmUmtsCallOptions.java43
-rw-r--r--phone/src/com/android/phone2/GsmUmtsOptions.java66
-rw-r--r--phone/src/com/android/phone2/HapticFeedback.java159
-rw-r--r--phone/src/com/android/phone2/INetworkQueryService.aidl45
-rw-r--r--phone/src/com/android/phone2/INetworkQueryServiceCallback.aidl39
-rw-r--r--phone/src/com/android/phone2/IccMissingPanel.java46
-rw-r--r--phone/src/com/android/phone2/IccNetworkDepersonalizationPanel.java217
-rw-r--r--phone/src/com/android/phone2/IccPanel.java91
-rw-r--r--phone/src/com/android/phone2/IccPinUnlockPanel.java372
-rw-r--r--phone/src/com/android/phone2/IccProvider.java26
-rw-r--r--phone/src/com/android/phone2/InCallControlState.java215
-rwxr-xr-xphone/src/com/android/phone2/InCallMenu.java472
-rw-r--r--phone/src/com/android/phone2/InCallMenuItemView.java189
-rw-r--r--phone/src/com/android/phone2/InCallMenuView.java486
-rwxr-xr-xphone/src/com/android/phone2/InCallScreen.java4943
-rw-r--r--phone/src/com/android/phone2/InCallScreenShowActivation.java60
-rw-r--r--phone/src/com/android/phone2/InCallTouchUi.java777
-rw-r--r--phone/src/com/android/phone2/ManageConferenceUtils.java341
-rw-r--r--phone/src/com/android/phone2/NetworkQueryService.java220
-rw-r--r--phone/src/com/android/phone2/NetworkSetting.java441
-rw-r--r--phone/src/com/android/phone2/NotificationMgr.java972
-rw-r--r--phone/src/com/android/phone2/OtaStartupReceiver.java99
-rw-r--r--phone/src/com/android/phone2/OtaUtils.java1019
-rw-r--r--phone/src/com/android/phone2/OutgoingCallBroadcaster.java372
-rwxr-xr-xphone/src/com/android/phone2/PhoneApp.java1665
-rw-r--r--phone/src/com/android/phone2/PhoneInterfaceManager.java729
-rwxr-xr-xphone/src/com/android/phone2/PhoneUtils.java2390
-rw-r--r--phone/src/com/android/phone2/ProcessOutgoingCallTest.java80
-rw-r--r--phone/src/com/android/phone2/Profiler.java126
-rw-r--r--phone/src/com/android/phone2/Ringer.java325
-rw-r--r--phone/src/com/android/phone2/Settings.java475
-rw-r--r--phone/src/com/android/phone2/SimContacts.java369
-rw-r--r--phone/src/com/android/phone2/SpecialCharSequenceMgr.java248
-rw-r--r--phone/src/com/android/phone2/TimeConsumingPreferenceActivity.java176
-rw-r--r--phone/src/com/android/phone2/Use2GOnlyCheckBoxPreference.java109
-rw-r--r--phone/src2/com/android/internal/telephony/SipPhoneNotifier.java236
-rw-r--r--phone/src2/com/android/internal/telephony/sip/CallFailCause.java50
-rw-r--r--phone/src2/com/android/internal/telephony/sip/CallProxy.java114
-rw-r--r--phone/src2/com/android/internal/telephony/sip/SipCallBase.java103
-rw-r--r--phone/src2/com/android/internal/telephony/sip/SipCommandInterface.java373
-rw-r--r--phone/src2/com/android/internal/telephony/sip/SipConnectionBase.java246
-rwxr-xr-xphone/src2/com/android/internal/telephony/sip/SipPhone.java751
-rwxr-xr-xphone/src2/com/android/internal/telephony/sip/SipPhoneBase.java558
-rw-r--r--phone/src2/com/android/internal/telephony/sip/SipPhoneFactory.java67
-rw-r--r--phone/src2/com/android/internal/telephony/sip/SipPhoneProxy.java745
-rw-r--r--phone/src2/com/android/phone2/SipBroadcastReceiver.java81
-rw-r--r--res/drawable/voip.gifbin756 -> 0 bytes
-rw-r--r--res/layout/call_setup.xml108
-rw-r--r--res/layout/call_ui.xml115
-rw-r--r--res/layout/sip_settings_ui.xml56
-rw-r--r--res/values/array.xml23
-rw-r--r--res/values/strings.xml76
-rw-r--r--res/xml/dev_pref.xml68
-rw-r--r--res/xml/sip_edit.xml98
-rw-r--r--res/xml/sip_setting.xml31
-rw-r--r--settings/com/android/settings/sip/BootCompletedReceiver.java54
-rw-r--r--settings/com/android/settings/sip/ProfileUtil.java32
-rw-r--r--settings/com/android/settings/sip/SipAutoRegistration.java74
-rw-r--r--settings/com/android/settings/sip/SipEditor.java328
-rw-r--r--settings/com/android/settings/sip/SipSettings.java432
-rw-r--r--src/android/net/sip/BinderHelper.java79
-rw-r--r--src/android/net/sip/ISipService.aidl42
-rw-r--r--src/android/net/sip/ISipSession.aidl147
-rw-r--r--src/android/net/sip/ISipSessionListener.aidl126
-rw-r--r--src/android/net/sip/SdpSessionDescription.java428
-rw-r--r--src/android/net/sip/SessionDescription.aidl19
-rw-r--r--src/android/net/sip/SessionDescription.java83
-rw-r--r--src/android/net/sip/SipAudioCall.java306
-rw-r--r--src/android/net/sip/SipManager.java512
-rw-r--r--src/android/net/sip/SipProfile.aidl19
-rw-r--r--src/android/net/sip/SipProfile.java401
-rw-r--r--src/android/net/sip/SipRegistrationListener.java48
-rw-r--r--src/android/net/sip/SipSessionAdapter.java67
-rw-r--r--src/android/net/sip/SipSessionState.java66
-rw-r--r--src/com/android/sip/FLog.java108
-rw-r--r--src/com/android/sip/SipAudioCallImpl.java700
-rw-r--r--src/com/android/sip/SipHelper.java452
-rw-r--r--src/com/android/sip/SipServiceImpl.java829
-rw-r--r--src/com/android/sip/SipSessionGroup.java1054
-rw-r--r--src/com/android/sip/SipSessionListenerProxy.java206
-rw-r--r--src/com/android/sip/WakeupTimer.java316
-rw-r--r--src/com/android/sip/media/Decoder.java34
-rw-r--r--src/com/android/sip/media/Encoder.java31
-rw-r--r--src/com/android/sip/media/G711ACodec.java87
-rw-r--r--src/com/android/sip/media/G711UCodec.java77
-rw-r--r--src/com/android/sip/media/RtpAudioSession.java668
-rw-r--r--src/com/android/sip/media/RtpFactory.java68
-rw-r--r--src/com/android/sip/media/RtpPacket.java134
-rw-r--r--src/com/android/sip/media/RtpSession.java32
566 files changed, 0 insertions, 68566 deletions
diff --git a/Android.mk.sample b/Android.mk.sample
deleted file mode 100644
index a322ae1..0000000
--- a/Android.mk.sample
+++ /dev/null
@@ -1,41 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-# build lib
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- $(call all-java-files-under, java) \
- $(call all-java-files-under, src)
-LOCAL_SRC_FILES += \
- src/android/net/sip/ISipSession.aidl \
- src/android/net/sip/ISipSessionListener.aidl \
- src/android/net/sip/ISipService.aidl
-
-LOCAL_MODULE := android.sip
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# build app
-include $(CLEAR_VARS)
-
-#LOCAL_SRC_FILES := \
- $(call all-java-files-under, java) \
- $(call all-java-files-under, src) \
- $(call all-java-files-under, settings) \
- $(call all-java-files-under, demo)
-#LOCAL_SRC_FILES += \
- src/android/net/sip/ISipSession.aidl \
- src/android/net/sip/ISipSessionListener.aidl \
- src/android/net/sip/ISipService.aidl
-LOCAL_SRC_FILES := \
- $(call all-java-files-under, settings) \
- $(call all-java-files-under, demo)
-
-LOCAL_PACKAGE_NAME := Sip
-#LOCAL_CERTIFICATE := platform
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-#LOCAL_JNI_SHARED_LIBRARIES := libsiprtp
-LOCAL_STATIC_JAVA_LIBRARIES := android.sip
-
-include $(BUILD_PACKAGE)
diff --git a/demo/com/android/sip/SipServiceBinder.java b/demo/com/android/sip/SipServiceBinder.java
deleted file mode 100644
index 2a5f523..0000000
--- a/demo/com/android/sip/SipServiceBinder.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip;
-
-import com.android.settings.sip.R;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.Uri;
-import android.os.IBinder;
-
-// Remove this class once we move the code to framework.
-public class SipServiceBinder extends Service {
- private static final String START_AUTO = "android.net.sip.START_AUTO";
- private static final String SIP_NOTIFY = "android.net.sip.NOTIFY";
- private static final int NOTIFICATION_ID = 1;
-
- private SipServiceImpl mService;
-
- @Override
- public void onCreate() {
- super.onCreate();
- mService = new SipServiceImpl(this);
- sendBroadcast(new Intent(START_AUTO));
- startForeground(NOTIFICATION_ID, createNotification());
- registerOutgoingCallReceiver();
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return mService;
- }
-
- private void registerOutgoingCallReceiver() {
- IntentFilter intentfilter = new IntentFilter();
- intentfilter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
- intentfilter.setPriority(-1);
- registerReceiver(new com.android.sip.demo.OutgoingCallReceiver(),
- intentfilter);
- }
-
- private Notification createNotification() {
- String title = "SIP service on";
- Notification n = new Notification(R.drawable.voip, title,
- System.currentTimeMillis());
- n.setLatestEventInfo(SipServiceBinder.this, title, "",
- prepareNotificationIntent());
- n.flags |= Notification.FLAG_NO_CLEAR;
- n.flags |= Notification.FLAG_ONGOING_EVENT;
- return n;
- }
-
- private PendingIntent prepareNotificationIntent() {
- // bogus intent
- return PendingIntent.getActivity(SipServiceBinder.this, 0,
- new Intent(SIP_NOTIFY), 0);
- }
-}
diff --git a/demo/com/android/sip/demo/IncomingCallReceiver.java b/demo/com/android/sip/demo/IncomingCallReceiver.java
deleted file mode 100644
index 06c8b18..0000000
--- a/demo/com/android/sip/demo/IncomingCallReceiver.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.demo;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.util.Log;
-
-/**
- * Broadcast receiver that handles incoming call intents.
- */
-public class IncomingCallReceiver extends BroadcastReceiver {
- private static final String TAG = IncomingCallReceiver.class.getSimpleName();
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
-
- if (!action.equals(SipMain.class.getName())) {
- Log.v(TAG, "action not processed: " + action);
- return;
- }
-
- intent.setClass(context, SipCallUi.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- }
-}
diff --git a/demo/com/android/sip/demo/OutgoingCallReceiver.java b/demo/com/android/sip/demo/OutgoingCallReceiver.java
deleted file mode 100644
index 3bba511..0000000
--- a/demo/com/android/sip/demo/OutgoingCallReceiver.java
+++ /dev/null
@@ -1,96 +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.sip.demo;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.net.sip.SipProfile;
-import android.net.sip.SipManager;
-import android.os.Parcelable;
-import android.util.Log;
-
-import com.android.settings.sip.ProfileUtil;
-import com.android.settings.sip.SipAutoRegistration;
-
-import java.util.List;
-import javax.sip.SipException;
-
-/**
- * Broadcast receiver that handles incoming call intents.
- */
-public class OutgoingCallReceiver extends BroadcastReceiver {
- private static final String TAG = OutgoingCallReceiver.class.getSimpleName();
- private SipManager mSipManager;
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- String number = getResultData();
-
- if (mSipManager == null) {
- mSipManager = SipManager.getInstance(context);
- setResultData(number);
- return;
- }
-
- if (!action.equals(Intent.ACTION_NEW_OUTGOING_CALL) || number == null) {
- Log.v(TAG, "action not processed: " + action);
- return;
- }
- SharedPreferences settings = context.getSharedPreferences(
- SipAutoRegistration.SIP_SHARED_PREFERENCES,
- Context.MODE_WORLD_READABLE);
- boolean sipCallFirst = settings.getBoolean(
- SipAutoRegistration.SIP_CALL_FIRST_FLAG, false);
-
- if (!sipCallFirst || !makeCall(context, number)) {
- setResultData(number);
- return;
- }
- setResultData(null);
- }
-
- private boolean makeCall(Context context, String number) {
- List<SipProfile> profiles = ProfileUtil.retrieveSipProfiles(
- "/data/data/com.android.settings.sip/files/");
- for (SipProfile profile: profiles) {
- try {
-
- if (mSipManager.isOpened(profile.getUriString())) {
- Log.v(TAG, "CALLING " + number + "@" +
- profile.getSipDomain());
-
- Intent intent = new Intent(context, SipCallUi.class);
- intent.setAction("call");
- intent.putExtra("caller", (Parcelable) profile);
- intent.putExtra("callee", number + "@" +
- profile.getSipDomain());
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- return true;
- }
- } catch (SipException e) {
- Log.e(TAG, "can not get status of profile" +
- profile.getProfileName(), e);
- }
- }
- return false;
- }
-}
-
diff --git a/demo/com/android/sip/demo/SipCallSetup.java b/demo/com/android/sip/demo/SipCallSetup.java
deleted file mode 100644
index a4058ab..0000000
--- a/demo/com/android/sip/demo/SipCallSetup.java
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.demo;
-
-import com.android.settings.sip.ProfileUtil;
-import com.android.settings.sip.R;
-import com.android.settings.sip.SipSettings;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.sip.SipProfile;
-import android.net.sip.SipManager;
-import android.net.sip.SipRegistrationListener;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.AdapterView;
-import android.widget.AutoCompleteTextView;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.Spinner;
-import android.widget.SpinnerAdapter;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- */
-public class SipCallSetup extends Activity implements OnClickListener {
- public static final String INCOMING_CALL_ACTION =
- SipSettings.INCOMING_CALL_ACTION;
- private static final String TAG = SipCallSetup.class.getSimpleName();
- private static final String CALLEE_SET_PATH = "/sdcard/teseellacpis";
-
- private TextView mMyIp;
- private TextView mCallStatus;
- private AutoCompleteTextView mCallee;
- private Spinner mCaller;
- private Button mCallButton;
- private Button mRegisterButton;
- private Button mSettingsButton;
-
- private Set<String> mCalleeSet;
-
- private SipManager mSipManager;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.call_setup);
- mCallStatus = (TextView) findViewById(R.id.status);
- mMyIp = (TextView) findViewById(R.id.localip);
- mCallee = (AutoCompleteTextView) findViewById(R.id.callee);
- mCaller = (Spinner) findViewById(R.id.caller);
- mCallButton = (Button) findViewById(R.id.call_btn);
- mRegisterButton = (Button) findViewById(R.id.register_btn);
- mSettingsButton = (Button) findViewById(R.id.settings_btn);
-
- ((TextView) findViewById(R.id.localip_title)).setText("Local IP:");
- ((TextView) findViewById(R.id.status_title)).setText("Status:");
- ((TextView) findViewById(R.id.caller_title)).setText("Who am I");
- ((TextView) findViewById(R.id.callee_title)).setText("Who to call");
- mCallButton.setText("Call");
- mRegisterButton.setText("Register");
- mSettingsButton.setText("Settings");
-
- mCallButton.setOnClickListener(this);
- mRegisterButton.setOnClickListener(this);
- mSettingsButton.setOnClickListener(this);
-
- new Thread(new Runnable() {
- public void run() {
- setText(mMyIp, getLocalIp());
- mSipManager = SipManager.getInstance(SipCallSetup.this);
- setRegistrationListener(createRegistrationListener());
- setCallerSpinnerListener();
- }
- }).start();
- getCalleeSet();
- setupCallees();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- setupCallers();
- setCallStatus("...");
- setRegistrationListener(createRegistrationListener());
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- setRegistrationListener(null);
- }
-
- private void setupCallers() {
- List<ProfileWrapper> profiles = getSipProfiles();
- Log.v(TAG, "profiles read: " + profiles.size());
- ArrayAdapter adapter = new ArrayAdapter(
- this, android.R.layout.simple_spinner_item, profiles);
- adapter.setDropDownViewResource(
- android.R.layout.simple_spinner_dropdown_item);
- ProfileWrapper profileWrapper = (ProfileWrapper)
- mCaller.getSelectedItem();
- mCaller.setAdapter(adapter);
-
- // restore selection
- if (profileWrapper == null) return;
- SipProfile profile = profileWrapper.mProfile;
- for (ProfileWrapper w : profiles) {
- if (w.mProfile.getUriString().equals(profile.getUriString())) {
- mCaller.setSelection(profiles.indexOf(w));
- break;
- }
- }
- }
-
- private void setupCallees() {
- String[] callees = new String[mCalleeSet.size()];
- Log.v(TAG, "callees: " + callees.length);
- mCalleeSet.toArray(callees);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
- android.R.layout.simple_dropdown_item_1line, callees);
- mCallee.setAdapter(adapter);
- }
-
- private void setCallerSpinnerListener() {
- mCaller.setOnItemSelectedListener(
- new AdapterView.OnItemSelectedListener() {
- public void onItemSelected(AdapterView<?> parent, View view,
- int position, long id) {
- SipProfile profile = getProfile(position);
- boolean registered = false;
- try {
- registered = mSipManager.isRegistered(
- profile.getUriString());
- } catch (Exception e) {
- Log.e(TAG, "OnItemSelected: " + e);
- }
- setCallStatus(
- registered ? "Registered" : "Unregistered");
- }
-
- public void onNothingSelected(AdapterView<?> parent) {
- // no-op
- }
- });
- }
-
- private List<ProfileWrapper> getSipProfiles() {
- List<SipProfile> profiles = ProfileUtil.retrieveSipProfiles(
- getFilesDir().getAbsolutePath());
- List<ProfileWrapper> wrappers =
- new ArrayList<ProfileWrapper>(profiles.size());
- for (SipProfile p : profiles) {
- wrappers.add(new ProfileWrapper(p));
- }
- return wrappers;
- }
-
- private void setCallStatus(Throwable e) {
- setCallStatus(e.toString());
- }
-
- private void setCallStatus(String message) {
- setText(mCallStatus, message);
- }
-
- public synchronized void onClick(View v) {
- if (mCallButton == v) {
- makeCall();
- } else if (mRegisterButton == v) {
- register();
- } else if (mSettingsButton == v) {
- String action = "android.net.sip.NOTIFY";
- startActivity(new Intent(action));
- }
- }
-
- private void makeCall() {
- String callee = mCallee.getText().toString();
- ProfileWrapper caller = (ProfileWrapper) mCaller.getSelectedItem();
- Log.v(TAG, "calling " + callee + " from " + caller);
- if (caller == null) {
- showToast("Press 'Settings' to set up a SIP profile");
- return;
- }
- if (TextUtils.isEmpty(callee)) {
- showToast("No one to call to.");
- return;
- }
- if (!callee.contains("@")) {
- callee += "@" + caller.mProfile.getSipDomain();
- mCallee.setText(callee);
- }
- updateCalleeSet(callee);
- call(caller.mProfile, callee);
- }
-
- private void call(SipProfile caller, String callee) {
- Intent intent = new Intent(this, SipCallUi.class);
- intent.setAction("call");
- intent.putExtra("caller", (Parcelable) caller);
- intent.putExtra("callee", callee);
- startActivity(intent);
- }
-
- private void register() {
- ProfileWrapper myself = (ProfileWrapper) mCaller.getSelectedItem();
- if (myself == null) return;
- try {
- if (mSipManager.isOpened(myself.mProfile.getUriString())) {
- mSipManager.register(myself.mProfile, 3600,
- createRegistrationListener());
- } else {
- mSipManager.open(myself.mProfile, INCOMING_CALL_ACTION,
- createRegistrationListener());
- }
- } catch (Exception e) {
- Log.e(TAG, "register()", e);
- setCallStatus(e);
- }
- }
-
- private synchronized void setRegistrationListener(
- SipRegistrationListener listener) {
- if (mSipManager == null) return;
- SpinnerAdapter adapter = mCaller.getAdapter();
- for (int i = 0, count = adapter.getCount(); i < count; i++) {
- SipProfile profile = ((ProfileWrapper) adapter.getItem(i)).mProfile;
- try {
- mSipManager.setRegistrationListener(profile.getUriString(),
- listener);
- } catch (Exception e) {
- Log.e(TAG, "setRegistrationListener()", e);
- }
- }
- }
-
- private SipProfile getProfile(int position) {
- return ((ProfileWrapper) mCaller.getAdapter().getItem(position))
- .mProfile;
- }
-
- private SipRegistrationListener createRegistrationListener() {
- return new SipRegistrationListener() {
- public void onRegistrationDone(String uri, long expiryTime) {
- setCallStatus("Registered");
- showToast("Registration done: " + uri);
- }
-
- public void onRegistrationFailed(String uri, String className,
- String message) {
- setCallStatus("failed to register " + uri + ": " + message);
- showToast("Registration failed");
- }
-
- public void onRegistering(String uri) {
- setCallStatus("Registering...");
- showToast("Registering " + uri + "...");
- }
- };
- }
-
- private void updateCalleeSet(String callee) {
- if (mCalleeSet.contains(callee)) return;
- try {
- mCalleeSet.add(callee);
- setupCallees();
- saveCalleeSet();
- } catch (IOException e) {
- Log.v(TAG, "updateCalleeSet", e);
- }
- }
-
- private void getCalleeSet() {
- File f = new File(CALLEE_SET_PATH);
- if (f.exists()) {
- try {
- mCalleeSet = retrieveCalleeSet(f);
- } catch (IOException e) {
- Log.v(TAG, "getCalleeSet", e);
- }
- } else {
- mCalleeSet = new HashSet<String>();
- }
- }
-
- private void saveCalleeSet() throws IOException {
- File f = new File(CALLEE_SET_PATH);
- ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
- oos.writeObject(mCalleeSet);
- oos.close();
- }
-
- private Set<String> retrieveCalleeSet(File setFile) throws IOException {
- try {
- ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
- setFile));
- Set<String> s = (Set<String>) ois.readObject();
- ois.close();
- return s;
- } catch (ClassNotFoundException e) {
- Log.d(TAG, "deserialize a profile", e);
- return null;
- }
- }
-
-
- private void setText(final TextView view, final String text) {
- runOnUiThread(new Runnable() {
- public void run() {
- view.setText(text);
- }
- });
- }
-
- private String getLocalIp() {
- try {
- DatagramSocket s = new DatagramSocket();
- s.connect(InetAddress.getByName("192.168.1.1"), 80);
- return s.getLocalAddress().getHostAddress();
- } catch (IOException e) {
- Log.w(TAG, "getLocalIp(): " + e);
- return "127.0.0.1";
- }
- }
-
- private void showToast(final String message) {
- runOnUiThread(new Runnable() {
- public void run() {
- Toast.makeText(SipCallSetup.this, message, Toast.LENGTH_SHORT)
- .show();
- }
- });
- }
-
- private static class ProfileWrapper {
- SipProfile mProfile;
- ProfileWrapper(SipProfile p) {
- mProfile = p;
- }
-
- public String toString() {
- SipProfile p = mProfile;
- String protocol = p.getProtocol();
- if (protocol.toUpperCase().equals("UDP")) {
- protocol = "";
- } else {
- protocol = "(" + protocol + ")";
- }
- return p.getUserName() + "@" + p.getSipDomain() + protocol;
- }
- }
-}
diff --git a/demo/com/android/sip/demo/SipCallUi.java b/demo/com/android/sip/demo/SipCallUi.java
deleted file mode 100644
index 2b5a2e3..0000000
--- a/demo/com/android/sip/demo/SipCallUi.java
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.demo;
-
-import com.android.settings.sip.R;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
-import android.net.sip.SipProfile;
-import android.net.sip.SipAudioCall;
-import android.net.sip.SipManager;
-import android.net.sip.SipSessionState;
-import android.os.Bundle;
-import android.provider.CallLog;
-import android.provider.CallLog.Calls;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.util.Date;
-import javax.sip.SipException;
-
-/**
- */
-public class SipCallUi extends Activity implements OnClickListener,
- SipAudioCall.Listener {
- private static final String TAG = SipCallUi.class.getSimpleName();
-
- private TextView mPeerBox;
- private TextView mMyIp;
- private TextView mCallStatus;
- private Button mEndButton;
- private Button mMuteButton;
- private Button mHoldButton;
- private Button mDtmfButton;
- private Button mModeButton;
-
- private SipManager mSipManager;
- private SipAudioCall mAudioCall;
-
- private MyDialog mDialog;
- private Throwable mError;
- private boolean mSpeakerMode;
-
- private long mCallTime = 0;
- private String mCallee;
- private String mCaller;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.call_ui);
- mPeerBox = (TextView) findViewById(R.id.caller);
- mCallStatus = (TextView) findViewById(R.id.call_status);
- mMyIp = (TextView) findViewById(R.id.local_ip);
- mEndButton = (Button) findViewById(R.id.hang_up_btn);
- mMuteButton = (Button) findViewById(R.id.mute_btn);
- mHoldButton = (Button) findViewById(R.id.hold_btn);
- mDtmfButton = (Button) findViewById(R.id.dtmf_btn);
- mModeButton = (Button) findViewById(R.id.mode_btn);
-
- ((TextView) findViewById(R.id.local_ip_title)).setText("Local IP");
- ((TextView) findViewById(R.id.call_status_title)).setText("Call status");
- mEndButton.setText("End call");
- mDtmfButton.setText("DTMF 1");
- mPeerBox.setText("...");
-
- mEndButton.setOnClickListener(this);
- mMuteButton.setOnClickListener(this);
- mHoldButton.setOnClickListener(this);
- mDtmfButton.setOnClickListener(this);
- mModeButton.setOnClickListener(this);
-
- setCallStatus();
-
- final Intent intent = getIntent();
- setIntent(null);
- new Thread(new Runnable() {
- public void run() {
- setText(mMyIp, getLocalIp());
-
- mSipManager = SipManager.getInstance(SipCallUi.this);
- if (SipManager.isIncomingCallIntent(intent)) {
- receiveCall(intent);
- } else {
- makeCall(intent);
- }
- }
- }).start();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- enableProximitySensor();
- if (mAudioCall != null) continueCall();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- disableProximitySensor();
- if (mAudioCall != null) holdCall();
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- closeAudioCall();
- }
-
- private void receiveCall(Intent intent) {
- Log.v(TAG, "receiveCall(): any call comes in? " + intent);
- if (SipManager.isIncomingCallIntent(intent)) {
- createSipAudioCall(intent);
- setIntent(null);
- }
- }
-
- private void makeCall(Intent intent) {
- if ("call".equals(intent.getAction())) {
- SipProfile caller = (SipProfile)
- intent.getParcelableExtra("caller");
- mCallee = intent.getStringExtra("callee");
- Log.v(TAG, "call from " + caller + " to " + mCallee);
- try {
- makeAudioCall(caller, mCallee);
- setText(mPeerBox, "Dialing " + mCallee + "...");
- setAllButtonsEnabled(true, true, false);
- } catch (Exception e) {
- Log.e(TAG, "makeCall()", e);
- setCallStatus(e);
- }
- }
- }
-
- private void createSipAudioCall(Intent intent) {
- try {
- Log.v(TAG, "create SipAudioCall");
- mAudioCall = mSipManager.takeAudioCall(this, intent, null);
- mAudioCall.setListener(this, true);
- if (mAudioCall == null) {
- throw new SipException("no session to handle audio call");
- }
- } catch (SipException e) {
- setCallStatus(e);
- }
- }
-
- private void makeAudioCall(SipProfile caller, String calleeUri)
- throws Exception {
- if (mAudioCall != null) {
- Log.v(TAG, "a call is ongoing; no new call is made");
- return;
- }
- SipProfile callee = new SipProfile.Builder(calleeUri).build();
- mAudioCall = mSipManager.makeAudioCall(this, caller, callee, this);
- }
-
- private void setCallStatus(Throwable e) {
- mError = e;
- setCallStatus();
- }
-
- private void setCallStatus() {
- setText(mCallStatus, getCallStatus());
- if (mError != null) {
- setText(mPeerBox, mError.getMessage());
- }
- mError = null;
- }
-
- private void showCallNotificationDialog(SipProfile caller) {
- mDialog = new CallNotificationDialog(caller);
- runOnUiThread(new Runnable() {
- public void run() {
- showDialog(mDialog.getId());
- }
- });
- }
-
- public synchronized void onChanged(SipAudioCall call) {
- Log.v(TAG, "onChanged(): " + call + " <--> " + mAudioCall);
- if (mAudioCall != call) return;
- setCallStatus();
- }
-
- public synchronized void onCalling(SipAudioCall call) {
- if (mAudioCall != call) return;
- setCallStatus();
- showToast("Dialing...");
- }
-
- public synchronized void onRinging(SipAudioCall call, SipProfile caller) {
- Log.v(TAG, "onRinging(): " + call + " <--> " + mAudioCall);
- if (mAudioCall != call) return;
- mCaller = caller.getUserName() + '@' + caller.getSipDomain();
- showCallNotificationDialog(caller);
- setCallStatus();
- }
-
- public void onRingingBack(SipAudioCall call) {
- }
-
- public void onReadyToCall(SipAudioCall call) {
- }
-
- public synchronized void onCallEstablished(SipAudioCall call) {
- Log.v(TAG, "onCallEstablished(): " + call + " <--> " + mAudioCall);
- mCallTime = new Date().getTime();
- if (mAudioCall != call) return;
- setCallStatus();
- setText(mPeerBox, getDisplayName(call.getPeerProfile()));
- showToast("Call established");
- setAllButtonsEnabled(true, true, true);
- }
-
- public void onCallHeld(SipAudioCall call) {
- }
-
- public void onCallBusy(SipAudioCall call) {
- if (mAudioCall != call) return;
- mError = new SipException("Line busy");
- setCallStatus();
- mAudioCall = null;
- setAllButtonsEnabled(false, false, false);
- showToast("Line busy");
- }
-
- public synchronized void onCallEnded(SipAudioCall call) {
- Log.v(TAG, "onCallEnded(): " + call + " <--> " + mAudioCall);
- if (mAudioCall != call) return;
- if (mDialog != null) {
- runOnUiThread(new Runnable() {
- public void run() {
- dismissDialog(mDialog.getId());
- }
- });
- }
- setCallStatus();
- mAudioCall = null;
- addCallLog();
- setAllButtonsEnabled(false, false, false);
- setText(mPeerBox, "...");
- showToast("Call ended");
- finish();
- }
-
- public synchronized void onError(SipAudioCall call, String errorMessage) {
- Log.v(TAG, "onError(): " + call + " <--> " + mAudioCall);
- if (mAudioCall != call) return;
- mError = new SipException(errorMessage);
- setCallStatus();
- mAudioCall = null;
- setAllButtonsEnabled(false, false, false);
- showToast("Call ended");
- }
-
- private void closeAudioCall() {
- if (mAudioCall != null) mAudioCall.close();
- }
-
- private void endCall() {
- try {
- mAudioCall.endCall();
- mSpeakerMode = false;
- addCallLog();
- } catch (SipException e) {
- Log.e(TAG, "endCall()", e);
- setCallStatus(e);
- }
- }
-
- private void addCallLog() {
- if (mCallee != null) addOutgoingCallLog(mCallee);
- if (mCaller != null) addIncomingCallLog(mCaller);
- mCaller = mCallee = null;
- mCallTime = 0;
- }
-
- private void addOutgoingCallLog(String callee) {
- addCallRecord(Calls.OUTGOING_TYPE, callee);
- }
-
- private void addIncomingCallLog(String caller) {
- addCallRecord((mCallTime != 0) ? Calls.INCOMING_TYPE:
- Calls.MISSED_TYPE, caller);
- }
-
- private void addCallRecord(int callType, String address) {
- long insertDate = new Date().getTime();
- ContentValues value = new ContentValues();
- //value.put(Calls.NUMBER, address.substring(0, address.indexOf('@')));
- value.put(Calls.NUMBER, address);
- value.put(Calls.DATE, insertDate);
- value.put(Calls.DURATION,
- (mCallTime != 0) ? (insertDate - mCallTime)/1000 : 0);
- value.put(Calls.TYPE, callType);
- value.put(Calls.NEW, 0);
- try {
- getContentResolver().acquireProvider(
- CallLog.AUTHORITY).insert(Calls.CONTENT_URI, value);
- } catch (android.os.RemoteException e) {
- Log.e(TAG, "cannot add calllog", e);
- }
- }
-
- private void answerCall() {
- try {
- mAudioCall.answerCall();
- } catch (SipException e) {
- Log.e(TAG, "answerCall()", e);
- setCallStatus(e);
- }
- }
-
- private void holdCall() {
- try {
- mAudioCall.holdCall();
- } catch (SipException e) {
- Log.e(TAG, "holdCall()", e);
- setCallStatus(e);
- }
- }
-
- private void continueCall() {
- try {
- mAudioCall.continueCall();
- } catch (SipException e) {
- Log.e(TAG, "continueCall()", e);
- setCallStatus(e);
- }
- }
-
- private boolean isOnHold() {
- if (mAudioCall == null) return false;
- return mAudioCall.isOnHold();
- }
-
- private void sendDtmf() {
- mAudioCall.sendDtmf(1);
- }
-
- private void setSpeakerMode() {
- mAudioCall.setSpeakerMode();
- }
-
- private void setInCallMode() {
- mAudioCall.setInCallMode();
- }
-
- public synchronized void onClick(View v) {
- if (mEndButton == v) {
- endCall();
- } else if (mModeButton == v) {
- mSpeakerMode = !mSpeakerMode;
- if (mSpeakerMode) {
- setSpeakerMode();
- } else {
- setInCallMode();
- }
- } else if (mDtmfButton == v) {
- sendDtmf();
- } else if (mMuteButton == v) {
- mAudioCall.toggleMute();
- } else if (mHoldButton == v) {
- if (isOnHold()) {
- continueCall();
- } else {
- holdCall();
- }
- }
- }
-
- private SipSessionState getCallState() {
- if (mAudioCall == null) return SipSessionState.READY_TO_CALL;
- return mAudioCall.getState();
- }
-
- private String getCallStatus() {
- if (mError != null) return "Error!";
- if (mAudioCall == null) return "Ready to call";
- switch (getCallState()) {
- case READY_TO_CALL:
- return "Call ended";
- case INCOMING_CALL:
- return "Ringing...";
- case INCOMING_CALL_ANSWERING:
- return "Answering...";
- case OUTGOING_CALL:
- return "Calling...";
- case OUTGOING_CALL_RING_BACK:
- return "Ringing back...";
- case OUTGOING_CALL_CANCELING:
- return "Cancelling...";
- case IN_CALL:
- return (isOnHold() ? "On hold" : "In call");
- default:
- return "Unknown";
- }
- }
-
- private void setText(final TextView view, final String text) {
- runOnUiThread(new Runnable() {
- public void run() {
- view.setText(text);
- }
- });
- }
-
- private void setAllButtonsEnabled(final boolean endButton,
- final boolean modeButton, final boolean others) {
- runOnUiThread(new Runnable() {
- public void run() {
- for (Button button : otherButtons()) {
- button.setEnabled(others);
- }
- mEndButton.setEnabled(endButton);
- mModeButton.setEnabled(modeButton);
- }
- });
- }
-
- private Button[] otherButtons() {
- return new Button[] {
- mMuteButton, mHoldButton, mDtmfButton
- };
- }
-
- @Override
- protected Dialog onCreateDialog (int id) {
- return ((mDialog == null) ? null : mDialog.createDialog(id));
- }
-
- @Override
- protected void onPrepareDialog (int id, Dialog dialog) {
- if (mDialog != null) mDialog.prepareDialog(id, dialog);
- }
-
- private String getDisplayName(SipProfile profile) {
- String name = profile.getDisplayName();
- if (TextUtils.isEmpty(name)) {
- name = profile.getUserName() + "@" + profile.getSipDomain();
- }
- return name;
- }
-
- private class CallNotificationDialog implements MyDialog {
- private SipProfile mCaller;
-
- CallNotificationDialog(SipProfile caller) {
- mCaller = caller;
- }
-
- public int getId() {
- return 0;
- }
-
- public Dialog createDialog(int id) {
- if (id != getId()) return null;
- Log.d(TAG, "create call notification dialog");
- return new AlertDialog.Builder(SipCallUi.this)
- .setTitle(getDisplayName(mCaller))
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setPositiveButton("Answer",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int w) {
- answerCall();
- mPeerBox.setText(getDisplayName(mCaller));
- }
- })
- .setNegativeButton("Hang up",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int w) {
- endCall();
- }
- })
- .setOnCancelListener(new DialogInterface.OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- endCall();
- }
- })
- .create();
- }
-
- public void prepareDialog(int id, Dialog dialog) {
- if (id != getId()) return;
- dialog.setTitle(getDisplayName(mCaller));
- }
- }
-
- private interface MyDialog {
- int getId();
- Dialog createDialog(int id);
- void prepareDialog(int id, Dialog dialog);
- }
-
- private String getLocalIp() {
- try {
- DatagramSocket s = new DatagramSocket();
- s.connect(InetAddress.getByName("192.168.1.1"), 80);
- return s.getLocalAddress().getHostAddress();
- } catch (IOException e) {
- Log.w(TAG, "getLocalIp(): " + e);
- return "127.0.0.1";
- }
- }
-
- private void showToast(final String message) {
- runOnUiThread(new Runnable() {
- public void run() {
- Toast.makeText(SipCallUi.this, message, Toast.LENGTH_SHORT)
- .show();
- }
- });
- }
-
- private void enableProximitySensor() {
- SensorManager sensorManager = (SensorManager)
- getSystemService(Context.SENSOR_SERVICE);
- Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
-
- sensorManager.registerListener(mProximityListener, sensor,
- SensorManager.SENSOR_DELAY_NORMAL);
- }
-
- private void disableProximitySensor() {
- ((SensorManager) getSystemService(Context.SENSOR_SERVICE))
- .unregisterListener(mProximityListener);
- }
-
- private synchronized void onProximityChanged(float[] values) {
- if ((mAudioCall == null) || !mAudioCall.isInCall()) return;
- StringBuilder b = new StringBuilder();
- for (float f : values) {
- b.append(", " + f);
- }
- Log.v("Proximity", "onSensorChanged: " + b);
- boolean far = (values[0] > 1f);
- setAllButtonsEnabled(far, far, far);
- }
-
- SensorEventListener mProximityListener = new SensorEventListener() {
- public void onSensorChanged(SensorEvent event) {
- onProximityChanged(event.values);
- }
-
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- }
- };
-}
diff --git a/demo/com/android/sip/demo/SipMain.java b/demo/com/android/sip/demo/SipMain.java
deleted file mode 100644
index 8a2419d..0000000
--- a/demo/com/android/sip/demo/SipMain.java
+++ /dev/null
@@ -1,701 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.demo;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.sip.ISipSession;
-import android.net.sip.SipProfile;
-import android.net.sip.SipAudioCall;
-import android.net.sip.SipManager;
-import android.net.sip.SipRegistrationListener;
-import android.net.sip.SipSessionState;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.preference.EditTextPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.text.ParseException;
-import javax.sip.SipException;
-
-/**
- */
-public class SipMain extends PreferenceActivity
- implements Preference.OnPreferenceChangeListener {
- private static final String TAG = SipMain.class.getSimpleName();
- private static final String INCOMING_CALL_ACTION = SipMain.class.getName();
- private static final int EXPIRY_TIME = 3600;
- private static final int MENU_REGISTER = Menu.FIRST;
- private static final int MENU_CALL = Menu.FIRST + 1;
- private static final int MENU_HANGUP = Menu.FIRST + 2;
- private static final int MENU_SEND_DTMF_1 = Menu.FIRST + 3;
- private static final int MENU_SPEAKER_MODE = Menu.FIRST + 4;
- private static final int MENU_MUTE = Menu.FIRST + 5;
- private static final int MENU_HOLD = Menu.FIRST + 6;
-
- private SipManager mSipManager;
- private Preference mCallStatus;
- private EditTextPreference mPeerUri;
- private EditTextPreference mServerUri;
- private EditTextPreference mPassword;
- private EditTextPreference mDisplayName;
- private EditTextPreference mOutboundProxy;
- private Preference mMyIp;
-
- private SipProfile mLocalProfile;
- private SipAudioCall mAudioCall;
- private ISipSession mSipSession;
-
- private MyDialog mDialog;
- private Throwable mError;
- private boolean mChanged;
- private boolean mSpeakerMode;
-
- private BroadcastReceiver mIncomingCallReceiver =
- new IncomingCallReceiver();
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(com.android.settings.sip.R.xml.dev_pref);
-
- mCallStatus = getPreferenceScreen().findPreference("call_status");
- mPeerUri = setupEditTextPreference("peer");
- mServerUri = setupEditTextPreference("server_address");
- mPassword = (EditTextPreference)
- getPreferenceScreen().findPreference("password");
- mPassword.setOnPreferenceChangeListener(this);
- mDisplayName = setupEditTextPreference("display_name");
- mOutboundProxy = setupEditTextPreference("proxy_address");
- mMyIp = getPreferenceScreen().findPreference("my_ip");
- mMyIp.setOnPreferenceClickListener(
- new OnPreferenceClickListener() {
- public boolean onPreferenceClick(Preference preference) {
- // for testing convenience: copy my IP to server address
- if (TextUtils.isEmpty(mServerUri.getText())) {
- String myIp = mMyIp.getSummary().toString();
- String uri = "test@" + myIp + ":5060";
- mServerUri.setText(uri);
- mServerUri.setSummary(uri);
- }
- return true;
- }
- });
-
- mCallStatus.setOnPreferenceClickListener(
- new OnPreferenceClickListener() {
- public boolean onPreferenceClick(Preference preference) {
- actOnCallStatus();
- return true;
- }
- });
- setCallStatus();
-
- final Intent intent = getIntent();
- setIntent(null);
- new Thread(new Runnable() {
- public void run() {
- final String localIp = getLocalIp();
- runOnUiThread(new Runnable() {
- public void run() {
- mMyIp.setSummary(localIp);
- }
- });
-
- mSipManager = SipManager.getInstance(SipMain.this);
- receiveCall(intent, "thread");
- }
- }).start();
-
- registerIncomingCallReceiver(mIncomingCallReceiver);
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- Log.v(TAG, " onNewIntent(): " + intent);
- setIntent(intent);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- receiveCall(getIntent(), "onResume()");
- }
-
- private synchronized void receiveCall(Intent intent, String msg) {
- Log.v(TAG, msg + ": receiveCall(): any call comes in? " + intent);
- if (SipManager.isIncomingCallIntent(intent)) {
- createSipAudioCall(intent);
- setIntent(null);
- }
- }
-
- private void createSipAudioCall(Intent intent) {
- // TODO: what happens if another call is going
- try {
- Log.v(TAG, "create SipAudioCall");
- mAudioCall = mSipManager.takeAudioCall(this, intent,
- createListener());
- if (mAudioCall == null) {
- throw new SipException("no session to handle audio call");
- }
- } catch (SipException e) {
- setCallStatus(e);
- }
- }
-
- private void makeAudioCall() throws Exception {
- if ((mAudioCall == null) || mChanged) {
- if (mChanged) register();
- closeAudioCall();
- mAudioCall = mSipManager.makeAudioCall(this, createLocalProfile(),
- createPeerSipProfile(), createListener());
- Log.v(TAG, "info changed; recreate AudioCall isntance");
- }
- }
-
- private EditTextPreference setupEditTextPreference(String key) {
- EditTextPreference pref = (EditTextPreference)
- getPreferenceScreen().findPreference(key);
- pref.setOnPreferenceChangeListener(this);
- pref.setSummary(pref.getText());
- return pref;
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- unregisterReceiver(mIncomingCallReceiver);
- closeAudioCall();
- }
-
- public boolean onPreferenceChange(Preference pref, Object newValue) {
- String value = (String) newValue;
- if (value == null) value = "";
- if (pref != mPassword) pref.setSummary(value);
- if ((pref != mPeerUri)
- && !value.equals(((EditTextPreference) pref).getText())) {
- mChanged = true;
- }
- return true;
- }
-
- private String getText(EditTextPreference preference) {
- CharSequence text = preference.getText();
- return ((text == null) ? "" : text.toString());
- }
-
- private SipProfile createLocalProfile() throws SipException {
- try {
- if ((mLocalProfile == null) || mChanged) {
- String serverUri = getText(mServerUri);
- if (TextUtils.isEmpty(serverUri)) {
- throw new SipException("Server address missing");
- }
- mLocalProfile = new SipProfile.Builder(serverUri)
- .setPassword(getText(mPassword))
- .setDisplayName(getText(mDisplayName))
- .setOutboundProxy(getText(mOutboundProxy))
- .build();
- }
- return mLocalProfile;
- } catch (ParseException e) {
- throw new SipException("createLoalSipProfile", e);
- }
- }
-
- private SipProfile createPeerSipProfile() {
- try {
- return new SipProfile.Builder(getPeerUri()).build();
- } catch (ParseException e) {
- throw new RuntimeException(e);
- }
- }
-
- private void setCallStatus(Throwable e) {
- mError = e;
- setCallStatus();
- }
-
- private void setCallStatus() {
- runOnUiThread(new Runnable() {
- public void run() {
- mCallStatus.setSummary(getCallStatus());
- mError = null;
- }
- });
- }
-
- private void showCallNotificationDialog(SipProfile caller) {
- mDialog = new CallNotificationDialog(caller);
- runOnUiThread(new Runnable() {
- public void run() {
- showDialog(mDialog.getId());
- }
- });
- }
-
- private SipAudioCall.Listener createListener() {
- return new SipAudioCall.Adapter() {
- public void onChanged(SipAudioCall call) {
- Log.v(TAG, "onChanged(): " + call + " <--> " + mAudioCall);
- if (mAudioCall != call) return;
- setCallStatus();
- }
-
- public void onCalling(SipAudioCall call) {
- if (mAudioCall != call) return;
- mSipSession = call.getSipSession();
- setCallStatus();
- }
-
- public void onRinging(SipAudioCall call, SipProfile caller) {
- Log.v(TAG, "onRinging(): " + call + " <--> " + mAudioCall);
- if (mAudioCall != null) return;
- mSipSession = call.getSipSession();
- showCallNotificationDialog(caller);
- setCallStatus();
- }
-
- public void onCallEstablished(SipAudioCall call) {
- Log.v(TAG, "onCallEstablished(): " + call + " <--> " + mAudioCall);
- if (mAudioCall != call) return;
- setAllPreferencesEnabled(false);
- setCallStatus();
- }
-
- public void onCallEnded(SipAudioCall call) {
- Log.v(TAG, "onCallEnded(): " + call + " <--> " + mAudioCall);
- if (mAudioCall != call) return;
- if (mDialog != null) {
- runOnUiThread(new Runnable() {
- public void run() {
- dismissDialog(mDialog.getId());
- }
- });
- }
- setCallStatus();
- mSipSession = null;
- mAudioCall = null;
- setAllPreferencesEnabled(true);
- }
-
- public void onError(SipAudioCall call, String errorMessage) {
- Log.v(TAG, "onError(): " + call + " <--> " + mAudioCall);
- if (mAudioCall != call) return;
- mError = new SipException(errorMessage);
- setCallStatus();
- mSipSession = null;
- mAudioCall = null;
- setAllPreferencesEnabled(true);
- }
- };
- }
-
- private void closeAudioCall() {
- if (mAudioCall != null) mAudioCall.close();
- }
-
- private SipRegistrationListener createRegistrationListener() {
- return new SipRegistrationListener() {
- public void onRegistrationDone(String uri, long expiryTime) {
- setCallStatus();
- }
-
- public void onRegistrationFailed(String uri, String className,
- String message) {
- mError = new SipException("registration error: " + message);
- setCallStatus();
- }
-
- public void onRegistering(String uri) {
- setCallStatus();
- }
- };
- }
-
- private void register() {
- try {
- if (mLocalProfile == null) createLocalProfile();
- if (mChanged) {
- mSipManager.unregister(mLocalProfile, null);
- }
- mSipManager.register(createLocalProfile(), EXPIRY_TIME,
- createRegistrationListener());
- mChanged = false;
- setCallStatus();
- } catch (Exception e) {
- Log.e(TAG, "register()", e);
- setCallStatus(e);
- }
- }
-
- private void makeCall() {
- try {
- makeAudioCall();
- } catch (Exception e) {
- Log.e(TAG, "makeCall()", e);
- setCallStatus(e);
- }
- }
-
- private void endCall() {
- try {
- mAudioCall.endCall();
- mSpeakerMode = false;
- } catch (SipException e) {
- Log.e(TAG, "endCall()", e);
- setCallStatus(e);
- }
- }
-
- private void holdOrEndCall() {
- if (Math.random() > 0.4) {
- holdCall();
- } else {
- endCall();
- }
- }
-
- private void answerCall() {
- try {
- mAudioCall.answerCall();
- } catch (SipException e) {
- Log.e(TAG, "answerCall()", e);
- setCallStatus(e);
- }
- }
-
- private void answerOrEndCall() {
- if (Math.random() > 0) {
- answerCall();
- } else {
- endCall();
- }
- }
-
- private void holdCall() {
- try {
- mAudioCall.holdCall();
- } catch (SipException e) {
- Log.e(TAG, "holdCall()", e);
- setCallStatus(e);
- }
- }
-
- private void continueCall() {
- try {
- mAudioCall.continueCall();
- } catch (SipException e) {
- Log.e(TAG, "continueCall()", e);
- setCallStatus(e);
- }
- }
-
- private boolean isOnHold() {
- if (mAudioCall == null) return false;
- return mAudioCall.isOnHold();
- }
-
- private void toggleOnHold() {
- if (isOnHold()) {
- continueCall();
- } else {
- holdCall();
- }
- }
-
- private void toggleMute() {
- mAudioCall.toggleMute();
- }
-
- private void sendDtmf() {
- mAudioCall.sendDtmf(1);
- }
-
- private void setSpeakerMode() {
- mAudioCall.setSpeakerMode();
- }
-
- private void setInCallMode() {
- mAudioCall.setInCallMode();
- }
-
- private void setAllPreferencesEnabled(final boolean enabled) {
- runOnUiThread(new Runnable() {
- public void run() {
- for (Preference preference : allPreferences()) {
- preference.setEnabled(enabled);
- }
- }
- });
- }
-
- private Preference[] allPreferences() {
- return new Preference[] {
- mCallStatus, mPeerUri, mServerUri, mPassword, mDisplayName, mOutboundProxy, mMyIp
- };
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
- SipSessionState state = ((mAudioCall == null) || mChanged)
- ? SipSessionState.READY_TO_CALL
- : getCallState();
- boolean muted = (mAudioCall == null) ? false : mAudioCall.isMuted();
- boolean onHold = isOnHold();
-
- Log.v(TAG, "onPrepareOptionsMenu(), status=" + state);
- menu.clear();
- switch (state) {
- case READY_TO_CALL:
- menu.add(0, MENU_REGISTER, 0, "Register");
- menu.add(0, MENU_CALL, 0, "Call");
- break;
- case IN_CALL:
- menu.add(0, MENU_SPEAKER_MODE, 0, (mSpeakerMode ?
- "Speaker OFF" : "Speaker ON"));
- menu.add(0, MENU_SEND_DTMF_1, 0, "Send DTMF_1");
- menu.add(0, MENU_MUTE, 0,
- (muted ? "Unmute" : "Mute"));
- menu.add(0, MENU_HOLD, 0,
- (onHold ? "Unhold" : "Hold"));
- /* pass through */
- default:
- menu.add(0, MENU_HANGUP, 0, "Hang up");
- }
- return true;
- }
-
- @Override
- public synchronized boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case MENU_REGISTER:
- register();
- setCallStatus();
- return true;
-
- case MENU_CALL:
- makeCall();
- return true;
-
- case MENU_HANGUP:
- endCall();
- return true;
-
- case MENU_SPEAKER_MODE:
- mSpeakerMode = !mSpeakerMode;
- if (mSpeakerMode == true) {
- setSpeakerMode();
- } else {
- setInCallMode();
- }
- return true;
-
- case MENU_SEND_DTMF_1:
- sendDtmf();
- return true;
-
- case MENU_MUTE:
- toggleMute();
- return true;
-
- case MENU_HOLD:
- toggleOnHold();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- private String getPeerUri() {
- return getText(mPeerUri);
- }
-
- private SipSessionState getCallState() {
- if (mSipSession == null) return SipSessionState.READY_TO_CALL;
- try {
- String state = mSipSession.getState();
- return Enum.valueOf(SipSessionState.class, state);
- } catch (RemoteException e) {
- return SipSessionState.REMOTE_ERROR;
- }
- }
-
- private String getCallStatus() {
- if (mError != null) return mError.getMessage();
- if (mSipSession == null) return "Ready to call";
- switch (getCallState()) {
- case REGISTERING:
- return "Registering...";
- case READY_TO_CALL:
- return "Ready to call";
- case INCOMING_CALL:
- return "Ringing...";
- case INCOMING_CALL_ANSWERING:
- return "Answering...";
- case OUTGOING_CALL:
- return "Calling...";
- case OUTGOING_CALL_RING_BACK:
- return "Ringing back...";
- case OUTGOING_CALL_CANCELING:
- return "Cancelling...";
- case IN_CALL:
- return (isOnHold() ? "On hold" : "Established");
- default:
- return "Unknown";
- }
- }
-
- private void actOnCallStatus() {
- if ((mAudioCall == null) || mChanged) {
- register();
- } else {
- switch (getCallState()) {
- case READY_TO_CALL:
- makeCall();
- break;
- case INCOMING_CALL:
- answerOrEndCall();
- break;
- case OUTGOING_CALL_RING_BACK:
- case OUTGOING_CALL:
- endCall();
- break;
- case IN_CALL:
- if (isOnHold()) {
- continueCall();
- } else {
- holdOrEndCall();
- }
- break;
- case OUTGOING_CALL_CANCELING:
- case REGISTERING:
- case INCOMING_CALL_ANSWERING:
- default:
- // do nothing
- break;
- }
- }
-
- setCallStatus();
- }
-
- @Override
- protected Dialog onCreateDialog (int id) {
- return ((mDialog == null) ? null : mDialog.createDialog(id));
- }
-
- @Override
- protected void onPrepareDialog (int id, Dialog dialog) {
- if (mDialog != null) mDialog.prepareDialog(id, dialog);
- }
-
- private class CallNotificationDialog implements MyDialog {
- private SipProfile mCaller;
-
- CallNotificationDialog(SipProfile caller) {
- mCaller = caller;
- }
-
- public int getId() {
- return 0;
- }
-
- private String getCallerName() {
- String name = mCaller.getDisplayName();
- if (TextUtils.isEmpty(name)) name = mCaller.getUri().toString();
- return name;
- }
-
- public Dialog createDialog(int id) {
- if (id != getId()) return null;
- Log.d(TAG, "create call notification dialog");
- return new AlertDialog.Builder(SipMain.this)
- .setTitle(getCallerName())
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setPositiveButton("Answer",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int w) {
- answerCall();
- }
- })
- .setNegativeButton("Hang up",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int w) {
- endCall();
- }
- })
- .setOnCancelListener(new DialogInterface.OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- endCall();
- }
- })
- .create();
- }
-
- public void prepareDialog(int id, Dialog dialog) {
- if (id != getId()) return;
- dialog.setTitle(getCallerName());
- }
- }
-
- private interface MyDialog {
- int getId();
- Dialog createDialog(int id);
- void prepareDialog(int id, Dialog dialog);
- }
-
- private String getLocalIp() {
- try {
- DatagramSocket s = new DatagramSocket();
- s.connect(InetAddress.getByName("192.168.1.1"), 80);
- return s.getLocalAddress().getHostAddress();
- } catch (IOException e) {
- Log.w(TAG, "getLocalIp(): " + e);
- return "127.0.0.1";
- }
- }
-
- private void registerIncomingCallReceiver(BroadcastReceiver r) {
- IntentFilter filter = new IntentFilter();
- filter.addAction(INCOMING_CALL_ACTION);
- registerReceiver(r, filter);
- }
-
- private class IncomingCallReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- receiveCall(intent, "onReceive()");
- }
- }
-}
diff --git a/phone/Android.mk.sample b/phone/Android.mk.sample
deleted file mode 100644
index bb1a824..0000000
--- a/phone/Android.mk.sample
+++ /dev/null
@@ -1,41 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-## Static library with some common classes for the phone apps.
-## To use it add this line in your Android.mk
-## LOCAL_STATIC_JAVA_LIBRARIES := com.android.phone.common
-#include $(CLEAR_VARS)
-#
-#LOCAL_MODULE_TAGS := user
-#
-#LOCAL_SRC_FILES := \
-# src/com/android/phone/ButtonGridLayout.java \
-# src/com/android/phone/CallLogAsync.java \
-# src/com/android/phone/HapticFeedback.java
-#
-#LOCAL_MODULE := com.android.phone.common
-#include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# Build the Phone app which includes the emergency dialer. See Contacts
-# for the 'other' dialer.
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_SRC_FILES += \
- src/com/android/phone2/EventLogTags.logtags \
- src/com/android/phone2/INetworkQueryService.aidl \
- src/com/android/phone2/INetworkQueryServiceCallback.aidl
-
-LOCAL_SRC_FILES += $(call all-java-files-under, src2)
-
-LOCAL_PACKAGE_NAME := Phone2
-LOCAL_CERTIFICATE := platform
-LOCAL_STATIC_JAVA_LIBRARIES := android.sip
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-include $(BUILD_PACKAGE)
-
-## Build the test package
-#include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/phone/AndroidManifest.xml b/phone/AndroidManifest.xml
deleted file mode 100644
index 035edca..0000000
--- a/phone/AndroidManifest.xml
+++ /dev/null
@@ -1,408 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.phone2"
- android:sharedUserId="android.uid.phone"
- android:sharedUserLabel="@string/dialerIconLabel"
->
-
-
- <protected-broadcast android:name="android.intent.action.SERVICE_STATE" />
- <protected-broadcast android:name="android.intent.action.RADIO_TECHNOLOGY" />
- <protected-broadcast android:name="android.intent.action.EMERGENCY_CALLBACK_MODE_CHANGED" />
- <protected-broadcast android:name="android.intent.action.SIG_STR" />
- <protected-broadcast android:name="android.intent.action.ANY_DATA_STATE" />
- <protected-broadcast android:name="android.intent.action.DATA_CONNECTION_FAILED" />
- <protected-broadcast android:name="android.intent.action.SIM_STATE_CHANGED" />
- <protected-broadcast android:name="android.intent.action.NETWORK_SET_TIME" />
- <protected-broadcast android:name="android.intent.action.NETWORK_SET_TIMEZONE" />
- <protected-broadcast android:name="android.intent.action.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS" />
- <protected-broadcast android:name="android.intent.action.ACTION_MDN_STATE_CHANGED" />
- <protected-broadcast android:name="android.provider.Telephony.SPN_STRINGS_UPDATED" />
-
- <uses-permission android:name="android.permission.BROADCAST_STICKY" />
- <uses-permission android:name="android.permission.CALL_PHONE" />
- <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
- <uses-permission android:name="android.permission.WRITE_SETTINGS" />
- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
- <uses-permission android:name="android.permission.READ_CONTACTS" />
- <uses-permission android:name="android.permission.WRITE_CONTACTS" />
- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
- <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
- <uses-permission android:name="android.permission.ADD_SYSTEM_SERVICE" />
- <uses-permission android:name="android.permission.VIBRATE" />
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
- <uses-permission android:name="android.permission.REORDER_TASKS" />
- <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
- <uses-permission android:name="android.permission.WAKE_LOCK" />
- <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
- <uses-permission android:name="android.permission.STATUS_BAR" />
- <uses-permission android:name="android.permission.READ_SMS" />
- <uses-permission android:name="android.permission.WRITE_SMS" />
- <uses-permission android:name="android.permission.SET_TIME_ZONE" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
- <uses-permission android:name="android.permission.DEVICE_POWER" />
- <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
- <uses-permission android:name="android.permission.BROADCAST_SMS"/>
- <uses-permission android:name="android.permission.BROADCAST_WAP_PUSH"/>
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <uses-permission android:name="android.permission.SHUTDOWN" />
- <uses-permission android:name="android.permission.RECORD_AUDIO" />
-
- <!-- This tells the activity manager to not delay any of our activity
- start requests, even if they happen immediately after the user
- presses home. -->
- <uses-permission android:name="android.permission.STOP_APP_SWITCHES" />
-
- <application android:name="PhoneApp"
- android:persistent="true"
- android:label="@string/dialerIconLabel"
- android:icon="@drawable/ic_launcher_phone">
- <provider android:name="IccProvider"
- android:authorities="icc2"
- android:multiprocess="true"
- android:readPermission="android.permission.READ_CONTACTS"
- android:writePermission="android.permission.WRITE_CONTACTS" />
-
- <!-- Dialer UI that only allows emergency calls -->
- <activity android:name="EmergencyDialer"
- android:label="@string/emergencyDialerIconLabel"
- android:screenOrientation="nosensor">
- <intent-filter>
- <action android:name="com.android.phone2.EmergencyDialer.DIAL" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <activity android:name="ADNList" />
-
- <activity android:name="SimContacts"
- android:label="@string/simContacts_title">
-
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/sim-contact" />
- </intent-filter>
- </activity>
-
- <activity android:name="FdnList" android:label="@string/fdnListLabel">
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/sim-contact" />
- </intent-filter>
- </activity>
-
- <activity android:name="OutgoingCallBroadcaster"
- android:permission="android.permission.CALL_PHONE"
- android:theme="@android:style/Theme.NoDisplay"
- android:configChanges="orientation|keyboardHidden">
- <!-- CALL action intent filters, for the various ways
- of initiating an outgoing call. -->
- <intent-filter>
- <action android:name="android.intent.action.CALL" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="tel" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.CALL" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="voicemail" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.CALL" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/phone" />
- <data android:mimeType="vnd.android.cursor.item/phone_v2" />
- <data android:mimeType="vnd.android.cursor.item/person" />
- </intent-filter>
- </activity>
-
- <activity-alias android:name="EmergencyOutgoingCallBroadcaster"
- android:targetActivity="OutgoingCallBroadcaster"
- android:permission="android.permission.CALL_PRIVILEGED"
- android:theme="@android:style/Theme.NoDisplay">
- <intent-filter>
- <action android:name="android.intent.action.CALL_EMERGENCY" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="tel" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.CALL_EMERGENCY" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="voicemail" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.CALL_EMERGENCY" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/phone" />
- <data android:mimeType="vnd.android.cursor.item/person" />
- </intent-filter>
- </activity-alias>
-
- <activity-alias android:name="PrivilegedOutgoingCallBroadcaster"
- android:targetActivity="OutgoingCallBroadcaster"
- android:theme="@android:style/Theme.NoDisplay"
- android:permission="android.permission.CALL_PRIVILEGED">
- <intent-filter>
- <action android:name="android.intent.action.CALL_PRIVILEGED" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="tel" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.CALL_PRIVILEGED" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="voicemail" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.CALL_PRIVILEGED" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.item/phone" />
- <data android:mimeType="vnd.android.cursor.item/phone_v2" />
- <data android:mimeType="vnd.android.cursor.item/person" />
- </intent-filter>
- </activity-alias>
-
- <receiver android:name="ProcessOutgoingCallTest" android:exported="false"
- android:enabled="false">
- <intent-filter android:priority="1">
- <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </receiver>
-
- <activity android:name="InCallScreen"
- android:theme="@android:style/Theme.NoTitleBar"
- android:label="@string/phoneIconLabel"
- android:excludeFromRecents="true"
- android:launchMode="singleInstance"
- android:screenOrientation="portrait"
- android:configChanges="orientation|keyboardHidden"
- android:exported="false">
- </activity>
-
- <activity android:name="InCallScreenShowActivation"
- android:permission="android.permission.PERFORM_CDMA_PROVISIONING"
- android:label="@string/phoneIconLabel"
- android:excludeFromRecents="true">
- <intent-filter>
- <action android:name="com.android.phone2.InCallScreen.SHOW_ACTIVATION" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <!-- general settings -->
- <activity android:name="Settings" android:label="@string/settings_label">
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <action android:name="android.intent.action.MAIN" />
- <action android:name="android.settings.DATA_ROAMING_SETTINGS" />
- </intent-filter>
- </activity>
-
- <!-- networks setting -->
- <!-- service to handle network query requests sent to RIL -->
- <service android:name="NetworkQueryService" />
-
- <activity android:name="NetworkSetting"
- android:label="@string/networks"
- android:configChanges="orientation|keyboardHidden">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <action android:name="android.settings.NETWORK_OPERATOR_" />
- </intent-filter>
- </activity>
-
- <activity android:name="GsmUmtsOptions"
- android:label="@string/gsm_umts_options">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <activity android:name="CdmaOptions"
- android:label="@string/cdma_options">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <activity android:name="GsmUmtsCallOptions"
- android:label="@string/gsm_umts_options">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <activity android:name="CdmaCallOptions"
- android:label="@string/cdma_options">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <activity android:name="GsmUmtsCallForwardOptions"
- android:label="@string/labelCF"
- android:configChanges="orientation|keyboardHidden">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <activity android:name="GsmUmtsAdditionalCallOptions"
- android:label="@string/labelGSMMore"
- android:configChanges="orientation|keyboardHidden">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <activity android:name="CellBroadcastSms"
- android:label="@string/cell_broadcast_sms">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <!-- fdn setting -->
- <activity android:name="FdnSetting" android:label="@string/fdn">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <activity android:name="EnableFdnScreen" android:label="">
- </activity>
-
- <!-- SIM PIN setting -->
- <activity android:name="EnableIccPinScreen" android:label="@string/enable_pin">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
- </intent-filter>
- </activity>
-
- <activity android:name="ChangeIccPinScreen" android:label="@string/change_pin">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
- </intent-filter>
- </activity>
-
- <activity android:name="GetPin2Screen" android:label="@string/get_pin2"
- android:windowSoftInputMode="stateVisible">
- </activity>
-
- <activity android:name="EditFdnContactScreen"
- android:windowSoftInputMode="stateVisible">
- </activity>
-
- <activity android:name="DeleteFdnContactScreen"
- android:label="@string/delete_fdn_contact">
- </activity>
-
- <activity android:name="DataRoamingReenable" android:label="@string/android:dialog_alert_title"
- android:theme="@android:style/Theme.Dialog">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <!-- Data usage and throttling setting -->
- <activity android:name="DataUsage"
- android:label="@string/throttle_data_usage">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <!-- data roaming setting -->
- <activity android:name="RoamingSetting" android:label="@string/roaming">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- </intent-filter>
- </activity>
-
- <!-- call feature setting -->
- <activity android:name="CallFeaturesSetting" android:label="@string/call_settings"
- android:configChanges="orientation|keyboardHidden">
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <action android:name="android.intent.action.MAIN" />
- <action android:name="com.android.phone2.CallFeaturesSetting.ADD_VOICEMAIL" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <!-- emergency call handler, coordinates emergency calls -->
- <activity android:name="EmergencyCallHandler" android:label="@string/phoneIconLabel"
- android:excludeFromRecents="true"
- android:launchMode="singleInstance">
- </activity>
-
- <!-- bluetooth headset service -->
- <service android:name="BluetoothHeadsetService">
- <intent-filter>
- <action android:name="android.bluetooth.IBluetoothHeadset" />
- </intent-filter>
- </service>
-
- <!-- Broadcast Receiver that will process BOOT Complete and launch OTA -->
- <receiver android:name="OtaStartupReceiver" android:exported="false">
- <intent-filter android:priority="100">
- <action android:name="android.intent.action.BOOT_COMPLETED"/>
- </intent-filter>
- </receiver>
-
- <!-- CDMA Emergency Callback Mode -->
- <service android:name="EmergencyCallbackModeService">
- </service>
-
- <activity android:name="EmergencyCallbackModeExitDialog"
- android:excludeFromRecents="true"
- android:label="@string/ecm_exit_dialog"
- android:launchMode="singleTop"
- android:theme="@android:style/Theme.Translucent.NoTitleBar">
- <intent-filter>
- <action android:name="com.android.phone2.action.ACTION_SHOW_ECM_EXIT_DIALOG" />
- <action android:name="android.intent.action.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
-
- <receiver
- android:name="SipBroadcastReceiver">
- <intent-filter>
- <action android:name="com.android.phone.SIP_INCOMING_CALL" />
- <action android:name="com.android.phone.SIP_ADD_PHONE" />
- </intent-filter>
- </receiver>
-
- </application>
-</manifest>
-
diff --git a/phone/CleanSpec.mk b/phone/CleanSpec.mk
deleted file mode 100644
index b84e1b6..0000000
--- a/phone/CleanSpec.mk
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright (C) 2007 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# If you don't need to do a full clean build but would like to touch
-# a file or delete some intermediate files, add a clean step to the end
-# of the list. These steps will only be run once, if they haven't been
-# run before.
-#
-# E.g.:
-# $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
-# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
-#
-# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
-# files that are missing or have been moved.
-#
-# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
-# Use $(OUT_DIR) to refer to the "out" directory.
-#
-# If you need to re-do something that's already mentioned, just copy
-# the command and add it to the bottom of the list. E.g., if a change
-# that you made last week required touching a file and a change you
-# made today requires touching the same file, just copy the old
-# touch step and add it to the end of the list.
-#
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
-
-# For example:
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
-#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
-#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
-
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
diff --git a/phone/res/anim/touch_lock_fade_in.xml b/phone/res/anim/touch_lock_fade_in.xml
deleted file mode 100644
index 1f2cac1..0000000
--- a/phone/res/anim/touch_lock_fade_in.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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.
--->
-
-<!-- Fade-in animation for the in-call "touch lock" overlay.
- The "touch lock overlay" itself is semi-transparent over most of the screen,
- so this animation (which runs from alpha=0 to alpha=1) will result in
- a smooth fade from "invisible" to "semi-transparent".)
- -->
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/decelerate_interpolator"
- android:fromAlpha="0.0"
- android:toAlpha="1.0"
- android:duration="500" />
diff --git a/phone/res/color-finger/dialer_button_text.xml b/phone/res/color-finger/dialer_button_text.xml
deleted file mode 100644
index a841adc..0000000
--- a/phone/res/color-finger/dialer_button_text.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- Half-way between #FFF and #000 -->
- <item android:state_enabled="false" android:color="#888"/>
-
- <item android:state_pressed="true" android:color="#000"/>
- <item android:state_selected="true" android:color="#000"/>
- <item android:state_focused="true" android:color="#FFF"/>
- <item android:color="#FFF"/> <!-- not selected -->
-
-</selector>
-
diff --git a/phone/res/color-finger/ota_title_color.xml b/phone/res/color-finger/ota_title_color.xml
deleted file mode 100644
index 2081703..0000000
--- a/phone/res/color-finger/ota_title_color.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright (c) 2008 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.
- */
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="#FFA6C839"/>
-</selector>
-
diff --git a/phone/res/drawable-finger/btn_dial.xml b/phone/res/drawable-finger/btn_dial.xml
deleted file mode 100644
index 52f26b1..0000000
--- a/phone/res/drawable-finger/btn_dial.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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.
--->
-
-<!-- Background resource for digit buttons in the various dialpads
- used by the phone app (see dialpad.xml).
- Also see btn_dial_green.xml for a slight variation of this,
- used in the new "non-drawer" in-call dialpad. -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/btn_dial_pressed" />
- <item android:state_focused="true"
- android:drawable="@drawable/btn_dial_selected" />
- <item
- android:drawable="@drawable/btn_dial_normal" />
-</selector>
diff --git a/phone/res/drawable-finger/btn_dial_action.xml b/phone/res/drawable-finger/btn_dial_action.xml
deleted file mode 100644
index 9ffb31b..0000000
--- a/phone/res/drawable-finger/btn_dial_action.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?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.
--->
-
-<!-- Background resource for dial button for the various 12 key dialers. -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Disabled views -->
- <item android:state_focused="true" android:state_enabled="false"
- android:drawable="@drawable/btn_dial_action_middle_disable_focused" />
- <item android:state_enabled="false"
- android:drawable="@drawable/btn_dial_action_middle_disable" />
-
- <!-- Enabled views -->
- <item android:state_pressed="true" android:state_enabled="true"
- android:drawable="@drawable/btn_dial_action_middle_pressed" />
- <item android:state_focused="true" android:state_enabled="true"
- android:drawable="@drawable/btn_dial_action_middle_selected" />
- <item android:state_enabled="true"
- android:drawable="@drawable/btn_dial_action_middle_normal" />
-</selector>
diff --git a/phone/res/drawable-finger/btn_dial_blue.xml b/phone/res/drawable-finger/btn_dial_blue.xml
deleted file mode 100644
index d06aaf9..0000000
--- a/phone/res/drawable-finger/btn_dial_blue.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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.
--->
-
-<!-- Background resource for digit buttons in the "new" style in-call
- DTMF dialpad (see non_drawer_dialpad.xml) when bluetooth is used.
- This is just like btn_dial.xml, except the default state uses the
- "normal_blue" asset rather than the plain "normal" asset. -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/btn_dial_pressed" />
- <item android:state_focused="true"
- android:drawable="@drawable/btn_dial_selected" />
- <item
- android:drawable="@drawable/btn_dial_normal_blue" />
-</selector>
diff --git a/phone/res/drawable-finger/btn_dial_delete.xml b/phone/res/drawable-finger/btn_dial_delete.xml
deleted file mode 100644
index b8c672d..0000000
--- a/phone/res/drawable-finger/btn_dial_delete.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?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.
--->
-
-<!-- Background resource for backspace button for the various 12 key dialers. -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- Disabled views -->
- <item android:state_focused="true" android:state_enabled="false"
- android:drawable="@drawable/btn_dial_action_right_disable_focused" />
- <item android:state_enabled="false"
- android:drawable="@drawable/btn_dial_action_right_disable" />
-
- <!-- Enabled views -->
- <item android:state_pressed="true" android:state_enabled="true"
- android:drawable="@drawable/btn_dial_action_right_pressed" />
- <item android:state_focused="true" android:state_enabled="true"
- android:drawable="@drawable/btn_dial_action_right_selected" />
- <item android:state_enabled="true"
- android:drawable="@drawable/btn_dial_action_right_normal" />
-</selector>
-
diff --git a/phone/res/drawable-finger/btn_dial_green.xml b/phone/res/drawable-finger/btn_dial_green.xml
deleted file mode 100644
index 2a4df8e..0000000
--- a/phone/res/drawable-finger/btn_dial_green.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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.
--->
-
-<!-- Background resource for digit buttons in the "new" style in-call
- DTMF dialpad (see non_drawer_dialpad.xml).
- This is just like btn_dial.xml, except the default state uses the
- "normal_green" asset rather than the plain "normal" asset. -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/btn_dial_pressed" />
- <item android:state_focused="true"
- android:drawable="@drawable/btn_dial_selected" />
- <item
- android:drawable="@drawable/btn_dial_normal_green" />
-</selector>
diff --git a/phone/res/drawable-finger/btn_dial_textfield.xml b/phone/res/drawable-finger/btn_dial_textfield.xml
deleted file mode 100644
index 4eabf18..0000000
--- a/phone/res/drawable-finger/btn_dial_textfield.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/btn_dial_textfield_pressed" />
- <item android:state_focused="true"
- android:drawable="@drawable/btn_dial_textfield_selected" />
- <item
- android:drawable="@drawable/btn_dial_textfield_normal" />
-</selector>
-
diff --git a/phone/res/drawable-finger/btn_dial_textfield_active.xml b/phone/res/drawable-finger/btn_dial_textfield_active.xml
deleted file mode 100644
index 18b84c6..0000000
--- a/phone/res/drawable-finger/btn_dial_textfield_active.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/btn_dial_textfield_pressed" />
- <item android:state_focused="true"
- android:drawable="@drawable/btn_dial_textfield_selected" />
- <item
- android:drawable="@drawable/btn_dial_textfield_activated" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_0.xml b/phone/res/drawable-finger/dial_num_0.xml
deleted file mode 100644
index cd4d727..0000000
--- a/phone/res/drawable-finger/dial_num_0.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_0_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_0_blk" />
- <item
- android:drawable="@drawable/dial_num_0_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_1_no_vm.xml b/phone/res/drawable-finger/dial_num_1_no_vm.xml
deleted file mode 100644
index 45bee17..0000000
--- a/phone/res/drawable-finger/dial_num_1_no_vm.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_1_no_vm_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_1_no_vm_blk" />
- <item
- android:drawable="@drawable/dial_num_1_no_vm_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_2.xml b/phone/res/drawable-finger/dial_num_2.xml
deleted file mode 100644
index 1a087f6..0000000
--- a/phone/res/drawable-finger/dial_num_2.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_2_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_2_blk" />
- <item
- android:drawable="@drawable/dial_num_2_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_3.xml b/phone/res/drawable-finger/dial_num_3.xml
deleted file mode 100644
index dda794a..0000000
--- a/phone/res/drawable-finger/dial_num_3.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_3_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_3_blk" />
- <item
- android:drawable="@drawable/dial_num_3_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_4.xml b/phone/res/drawable-finger/dial_num_4.xml
deleted file mode 100644
index 511e58b..0000000
--- a/phone/res/drawable-finger/dial_num_4.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_4_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_4_blk" />
- <item
- android:drawable="@drawable/dial_num_4_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_5.xml b/phone/res/drawable-finger/dial_num_5.xml
deleted file mode 100644
index a857bc7..0000000
--- a/phone/res/drawable-finger/dial_num_5.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_5_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_5_blk" />
- <item
- android:drawable="@drawable/dial_num_5_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_6.xml b/phone/res/drawable-finger/dial_num_6.xml
deleted file mode 100644
index b494458..0000000
--- a/phone/res/drawable-finger/dial_num_6.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_6_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_6_blk" />
- <item
- android:drawable="@drawable/dial_num_6_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_7.xml b/phone/res/drawable-finger/dial_num_7.xml
deleted file mode 100644
index a22c894..0000000
--- a/phone/res/drawable-finger/dial_num_7.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_7_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_7_blk" />
- <item
- android:drawable="@drawable/dial_num_7_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_8.xml b/phone/res/drawable-finger/dial_num_8.xml
deleted file mode 100644
index 8ac7930..0000000
--- a/phone/res/drawable-finger/dial_num_8.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_8_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_8_blk" />
- <item
- android:drawable="@drawable/dial_num_8_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_9.xml b/phone/res/drawable-finger/dial_num_9.xml
deleted file mode 100644
index d0b7fd9..0000000
--- a/phone/res/drawable-finger/dial_num_9.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_9_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_9_blk" />
- <item
- android:drawable="@drawable/dial_num_9_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_pound.xml b/phone/res/drawable-finger/dial_num_pound.xml
deleted file mode 100644
index 609d748..0000000
--- a/phone/res/drawable-finger/dial_num_pound.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_pound_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_pound_blk" />
- <item
- android:drawable="@drawable/dial_num_pound_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/dial_num_star.xml b/phone/res/drawable-finger/dial_num_star.xml
deleted file mode 100644
index 3b3304a..0000000
--- a/phone/res/drawable-finger/dial_num_star.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/dial_num_star_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/dial_num_star_blk" />
- <item
- android:drawable="@drawable/dial_num_star_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/ic_dial_number.xml b/phone/res/drawable-finger/ic_dial_number.xml
deleted file mode 100644
index 1ba449e..0000000
--- a/phone/res/drawable-finger/ic_dial_number.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/ic_dial_number_blk" />
- <item android:state_focused="true"
- android:drawable="@drawable/ic_dial_number_blk" />
- <item
- android:drawable="@drawable/ic_dial_number_wht" />
-</selector>
-
diff --git a/phone/res/drawable-finger/ic_tab_contacts.xml b/phone/res/drawable-finger/ic_tab_contacts.xml
deleted file mode 100644
index 3341f41..0000000
--- a/phone/res/drawable-finger/ic_tab_contacts.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/ic_tab_selected_contacts" />
- <item android:drawable="@drawable/ic_tab_unselected_contacts" />
-</selector>
-
diff --git a/phone/res/drawable-finger/ic_tab_dialer.xml b/phone/res/drawable-finger/ic_tab_dialer.xml
deleted file mode 100644
index 36115fa..0000000
--- a/phone/res/drawable-finger/ic_tab_dialer.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/ic_tab_selected_dialer" />
- <item android:drawable="@drawable/ic_tab_unselected_dialer" />
-</selector>
-
diff --git a/phone/res/drawable-finger/ic_tab_recent.xml b/phone/res/drawable-finger/ic_tab_recent.xml
deleted file mode 100644
index 548d0b7..0000000
--- a/phone/res/drawable-finger/ic_tab_recent.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/ic_tab_selected_recent" />
- <item android:drawable="@drawable/ic_tab_unselected_recent" />
-</selector>
-
diff --git a/phone/res/drawable-finger/ic_tab_starred.xml b/phone/res/drawable-finger/ic_tab_starred.xml
deleted file mode 100644
index d3cb44b..0000000
--- a/phone/res/drawable-finger/ic_tab_starred.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/ic_tab_selected_stared" />
- <item android:drawable="@drawable/ic_tab_unselected_stared" />
-</selector>
-
diff --git a/phone/res/drawable-finger/tray_handle_strip.xml b/phone/res/drawable-finger/tray_handle_strip.xml
deleted file mode 100644
index faf20d4..0000000
--- a/phone/res/drawable-finger/tray_handle_strip.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/tray_handle_strip_normal" />
- <item android:state_pressed="true" android:drawable="@drawable/tray_handle_strip_pressed" />
- <item android:state_focused="true" android:state_enabled="true" android:drawable="@drawable/tray_handle_strip_selected" />
- <item android:state_enabled="true" android:drawable="@drawable/tray_handle_strip_normal" />
- <item android:state_focused="true" android:drawable="@drawable/tray_handle_strip_selected" />
-</selector>
diff --git a/phone/res/drawable-finger/tray_handle_tab.xml b/phone/res/drawable-finger/tray_handle_tab.xml
deleted file mode 100644
index d8314ff..0000000
--- a/phone/res/drawable-finger/tray_handle_tab.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/tray_handle_tab_normal" />
- <item android:state_pressed="true" android:drawable="@drawable/tray_handle_tab_pressed" />
- <item android:state_focused="true" android:state_enabled="true" android:drawable="@drawable/tray_handle_tab_selected" />
- <item android:state_enabled="true" android:drawable="@drawable/tray_handle_tab_normal" />
- <item android:state_focused="true" android:drawable="@drawable/tray_handle_tab_selected" />
-</selector>
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_left_disable.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_left_disable.9.png
deleted file mode 100644
index 7ba8672..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_left_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_left_disable_focused.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_left_disable_focused.9.png
deleted file mode 100644
index b4300b6..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_left_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_left_normal.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_left_normal.9.png
deleted file mode 100644
index 7ba8672..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_left_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_left_pressed.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_left_pressed.9.png
deleted file mode 100644
index 1dc40b7..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_left_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_left_selected.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_left_selected.9.png
deleted file mode 100644
index 4f6c7cf..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_left_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_disable.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_middle_disable.9.png
deleted file mode 100644
index 0a6cd66..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_disable_focused.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_middle_disable_focused.9.png
deleted file mode 100644
index b28176f..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_normal.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_middle_normal.9.png
deleted file mode 100644
index 0a6cd66..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_pressed.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_middle_pressed.9.png
deleted file mode 100644
index 58f187d..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_selected.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_middle_selected.9.png
deleted file mode 100644
index f201dee..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_middle_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_right_disable.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_right_disable.9.png
deleted file mode 100644
index 6e6fa30..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_right_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_right_disable_focused.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_right_disable_focused.9.png
deleted file mode 100644
index 46a042f..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_right_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_right_normal.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_right_normal.9.png
deleted file mode 100644
index 6e6fa30..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_right_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_right_pressed.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_right_pressed.9.png
deleted file mode 100644
index d66a509..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_right_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_action_right_selected.9.png b/phone/res/drawable-hdpi-finger/btn_dial_action_right_selected.9.png
deleted file mode 100644
index d2ee98b..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_action_right_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_normal.9.png b/phone/res/drawable-hdpi-finger/btn_dial_normal.9.png
deleted file mode 100644
index 5702e47..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_normal_blue.9.png b/phone/res/drawable-hdpi-finger/btn_dial_normal_blue.9.png
deleted file mode 100644
index ddad155..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_normal_blue.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_normal_green.9.png b/phone/res/drawable-hdpi-finger/btn_dial_normal_green.9.png
deleted file mode 100644
index dbb0f97..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_normal_green.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_pressed.9.png b/phone/res/drawable-hdpi-finger/btn_dial_pressed.9.png
deleted file mode 100644
index a5b51d5..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_selected.9.png b/phone/res/drawable-hdpi-finger/btn_dial_selected.9.png
deleted file mode 100644
index b578146..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_textfield_activated.9.png b/phone/res/drawable-hdpi-finger/btn_dial_textfield_activated.9.png
deleted file mode 100644
index c937c5e..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_textfield_activated.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_textfield_normal.9.png b/phone/res/drawable-hdpi-finger/btn_dial_textfield_normal.9.png
deleted file mode 100644
index 0c38b39..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_textfield_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_textfield_normal_full.9.png b/phone/res/drawable-hdpi-finger/btn_dial_textfield_normal_full.9.png
deleted file mode 100644
index 05dd8b6..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_textfield_normal_full.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_textfield_normal_full_sm.9.png b/phone/res/drawable-hdpi-finger/btn_dial_textfield_normal_full_sm.9.png
deleted file mode 100644
index ea92feb..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_textfield_normal_full_sm.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_textfield_pressed.9.png b/phone/res/drawable-hdpi-finger/btn_dial_textfield_pressed.9.png
deleted file mode 100644
index 22d8235..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_textfield_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/btn_dial_textfield_selected.9.png b/phone/res/drawable-hdpi-finger/btn_dial_textfield_selected.9.png
deleted file mode 100644
index 1fe4dfc..0000000
--- a/phone/res/drawable-hdpi-finger/btn_dial_textfield_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_0_blk.png b/phone/res/drawable-hdpi-finger/dial_num_0_blk.png
deleted file mode 100644
index 960d968..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_0_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_0_wht.png b/phone/res/drawable-hdpi-finger/dial_num_0_wht.png
deleted file mode 100644
index c257817..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_0_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_1_no_vm_blk.png b/phone/res/drawable-hdpi-finger/dial_num_1_no_vm_blk.png
deleted file mode 100644
index d150354..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_1_no_vm_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_1_no_vm_wht.png b/phone/res/drawable-hdpi-finger/dial_num_1_no_vm_wht.png
deleted file mode 100644
index 9a1152b..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_1_no_vm_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_2_blk.png b/phone/res/drawable-hdpi-finger/dial_num_2_blk.png
deleted file mode 100644
index 7b0cee7..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_2_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_2_wht.png b/phone/res/drawable-hdpi-finger/dial_num_2_wht.png
deleted file mode 100644
index cad5485..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_2_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_3_blk.png b/phone/res/drawable-hdpi-finger/dial_num_3_blk.png
deleted file mode 100644
index d2efe88..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_3_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_3_wht.png b/phone/res/drawable-hdpi-finger/dial_num_3_wht.png
deleted file mode 100644
index ddb890c..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_3_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_4_blk.png b/phone/res/drawable-hdpi-finger/dial_num_4_blk.png
deleted file mode 100644
index fc3ed43..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_4_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_4_wht.png b/phone/res/drawable-hdpi-finger/dial_num_4_wht.png
deleted file mode 100644
index bb8064c..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_4_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_5_blk.png b/phone/res/drawable-hdpi-finger/dial_num_5_blk.png
deleted file mode 100644
index 5c78c75..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_5_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_5_wht.png b/phone/res/drawable-hdpi-finger/dial_num_5_wht.png
deleted file mode 100644
index 1368d36..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_5_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_6_blk.png b/phone/res/drawable-hdpi-finger/dial_num_6_blk.png
deleted file mode 100644
index 583fb2a..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_6_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_6_wht.png b/phone/res/drawable-hdpi-finger/dial_num_6_wht.png
deleted file mode 100644
index 7f1bf4a..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_6_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_7_blk.png b/phone/res/drawable-hdpi-finger/dial_num_7_blk.png
deleted file mode 100644
index 793660b..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_7_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_7_wht.png b/phone/res/drawable-hdpi-finger/dial_num_7_wht.png
deleted file mode 100644
index d8038c7..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_7_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_8_blk.png b/phone/res/drawable-hdpi-finger/dial_num_8_blk.png
deleted file mode 100644
index 0ee87fe..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_8_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_8_wht.png b/phone/res/drawable-hdpi-finger/dial_num_8_wht.png
deleted file mode 100644
index 9d0d0eb..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_8_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_9_blk.png b/phone/res/drawable-hdpi-finger/dial_num_9_blk.png
deleted file mode 100644
index 920235a..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_9_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_9_wht.png b/phone/res/drawable-hdpi-finger/dial_num_9_wht.png
deleted file mode 100644
index ac3727d..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_9_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_pound_blk.png b/phone/res/drawable-hdpi-finger/dial_num_pound_blk.png
deleted file mode 100644
index fcfc58c..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_pound_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_pound_wht.png b/phone/res/drawable-hdpi-finger/dial_num_pound_wht.png
deleted file mode 100644
index df67810..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_pound_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_star_blk.png b/phone/res/drawable-hdpi-finger/dial_num_star_blk.png
deleted file mode 100644
index ddda118..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_star_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dial_num_star_wht.png b/phone/res/drawable-hdpi-finger/dial_num_star_wht.png
deleted file mode 100644
index ded1900..0000000
--- a/phone/res/drawable-hdpi-finger/dial_num_star_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/dialpad_lock.9.png b/phone/res/drawable-hdpi-finger/dialpad_lock.9.png
deleted file mode 100644
index b512db4..0000000
--- a/phone/res/drawable-hdpi-finger/dialpad_lock.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_dial_action_call.png b/phone/res/drawable-hdpi-finger/ic_dial_action_call.png
deleted file mode 100644
index 1ba3a98..0000000
--- a/phone/res/drawable-hdpi-finger/ic_dial_action_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_dial_action_delete.png b/phone/res/drawable-hdpi-finger/ic_dial_action_delete.png
deleted file mode 100644
index 2e206c8..0000000
--- a/phone/res/drawable-hdpi-finger/ic_dial_action_delete.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_dial_action_voice_mail.png b/phone/res/drawable-hdpi-finger/ic_dial_action_voice_mail.png
deleted file mode 100644
index 8a3f366..0000000
--- a/phone/res/drawable-hdpi-finger/ic_dial_action_voice_mail.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_dial_number_blk.png b/phone/res/drawable-hdpi-finger/ic_dial_number_blk.png
deleted file mode 100644
index 788af90..0000000
--- a/phone/res/drawable-hdpi-finger/ic_dial_number_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_dial_number_wht.png b/phone/res/drawable-hdpi-finger/ic_dial_number_wht.png
deleted file mode 100644
index 4bcbdbb..0000000
--- a/phone/res/drawable-hdpi-finger/ic_dial_number_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_menu_contact.png b/phone/res/drawable-hdpi-finger/ic_menu_contact.png
deleted file mode 100644
index 6afda6c..0000000
--- a/phone/res/drawable-hdpi-finger/ic_menu_contact.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_tab_selected_contacts.png b/phone/res/drawable-hdpi-finger/ic_tab_selected_contacts.png
deleted file mode 100644
index 16ac2b4..0000000
--- a/phone/res/drawable-hdpi-finger/ic_tab_selected_contacts.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_tab_selected_dialer.png b/phone/res/drawable-hdpi-finger/ic_tab_selected_dialer.png
deleted file mode 100644
index 7fcd2c8..0000000
--- a/phone/res/drawable-hdpi-finger/ic_tab_selected_dialer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_tab_selected_recent.png b/phone/res/drawable-hdpi-finger/ic_tab_selected_recent.png
deleted file mode 100644
index 9b0eee3..0000000
--- a/phone/res/drawable-hdpi-finger/ic_tab_selected_recent.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_tab_selected_stared.png b/phone/res/drawable-hdpi-finger/ic_tab_selected_stared.png
deleted file mode 100644
index be8be5e..0000000
--- a/phone/res/drawable-hdpi-finger/ic_tab_selected_stared.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_tab_unselected_contacts.png b/phone/res/drawable-hdpi-finger/ic_tab_unselected_contacts.png
deleted file mode 100644
index 17ef42d..0000000
--- a/phone/res/drawable-hdpi-finger/ic_tab_unselected_contacts.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_tab_unselected_dialer.png b/phone/res/drawable-hdpi-finger/ic_tab_unselected_dialer.png
deleted file mode 100644
index b86e17b..0000000
--- a/phone/res/drawable-hdpi-finger/ic_tab_unselected_dialer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_tab_unselected_recent.png b/phone/res/drawable-hdpi-finger/ic_tab_unselected_recent.png
deleted file mode 100644
index bcdd417..0000000
--- a/phone/res/drawable-hdpi-finger/ic_tab_unselected_recent.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/ic_tab_unselected_stared.png b/phone/res/drawable-hdpi-finger/ic_tab_unselected_stared.png
deleted file mode 100644
index 01bc334..0000000
--- a/phone/res/drawable-hdpi-finger/ic_tab_unselected_stared.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/tray_handle_strip_normal.9.png b/phone/res/drawable-hdpi-finger/tray_handle_strip_normal.9.png
deleted file mode 100644
index 4e79d43..0000000
--- a/phone/res/drawable-hdpi-finger/tray_handle_strip_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/tray_handle_strip_pressed.9.png b/phone/res/drawable-hdpi-finger/tray_handle_strip_pressed.9.png
deleted file mode 100644
index 859d01f..0000000
--- a/phone/res/drawable-hdpi-finger/tray_handle_strip_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/tray_handle_strip_selected.9.png b/phone/res/drawable-hdpi-finger/tray_handle_strip_selected.9.png
deleted file mode 100644
index b227c90..0000000
--- a/phone/res/drawable-hdpi-finger/tray_handle_strip_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/tray_handle_tab_normal.9.png b/phone/res/drawable-hdpi-finger/tray_handle_tab_normal.9.png
deleted file mode 100644
index ae9b910..0000000
--- a/phone/res/drawable-hdpi-finger/tray_handle_tab_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/tray_handle_tab_pressed.9.png b/phone/res/drawable-hdpi-finger/tray_handle_tab_pressed.9.png
deleted file mode 100644
index d6ec380..0000000
--- a/phone/res/drawable-hdpi-finger/tray_handle_tab_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi-finger/tray_handle_tab_selected.9.png b/phone/res/drawable-hdpi-finger/tray_handle_tab_selected.9.png
deleted file mode 100644
index 9d20a92..0000000
--- a/phone/res/drawable-hdpi-finger/tray_handle_tab_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/bg_in_call_gradient_bluetooth.9.png b/phone/res/drawable-hdpi/bg_in_call_gradient_bluetooth.9.png
deleted file mode 100755
index 20b13e8..0000000
--- a/phone/res/drawable-hdpi/bg_in_call_gradient_bluetooth.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/bg_in_call_gradient_connected.9.png b/phone/res/drawable-hdpi/bg_in_call_gradient_connected.9.png
deleted file mode 100755
index a4974cd..0000000
--- a/phone/res/drawable-hdpi/bg_in_call_gradient_connected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/bg_in_call_gradient_ended.9.png b/phone/res/drawable-hdpi/bg_in_call_gradient_ended.9.png
deleted file mode 100755
index ead572f..0000000
--- a/phone/res/drawable-hdpi/bg_in_call_gradient_ended.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/bg_in_call_gradient_on_hold.9.png b/phone/res/drawable-hdpi/bg_in_call_gradient_on_hold.9.png
deleted file mode 100755
index 4b65018..0000000
--- a/phone/res/drawable-hdpi/bg_in_call_gradient_on_hold.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/bg_in_call_gradient_unidentified.9.png b/phone/res/drawable-hdpi/bg_in_call_gradient_unidentified.9.png
deleted file mode 100755
index 7d04eb5..0000000
--- a/phone/res/drawable-hdpi/bg_in_call_gradient_unidentified.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_answer_dotted_green.9.png b/phone/res/drawable-hdpi/btn_in_call_answer_dotted_green.9.png
deleted file mode 100755
index d19571e..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_answer_dotted_green.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_answer_dotted_red.9.png b/phone/res/drawable-hdpi/btn_in_call_answer_dotted_red.9.png
deleted file mode 100755
index 59efaab..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_answer_dotted_red.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_answer_normal.9.png b/phone/res/drawable-hdpi/btn_in_call_answer_normal.9.png
deleted file mode 100755
index d975434..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_answer_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_answer_pressed.9.png b/phone/res/drawable-hdpi/btn_in_call_answer_pressed.9.png
deleted file mode 100755
index ead97ab..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_answer_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_main_disable.9.png b/phone/res/drawable-hdpi/btn_in_call_main_disable.9.png
deleted file mode 100755
index 1a8bb4e..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_main_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_main_disable_focused.9.png b/phone/res/drawable-hdpi/btn_in_call_main_disable_focused.9.png
deleted file mode 100755
index 8dfc4cf..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_main_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_main_normal.9.png b/phone/res/drawable-hdpi/btn_in_call_main_normal.9.png
deleted file mode 100755
index 1a8bb4e..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_main_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_main_pressed.9.png b/phone/res/drawable-hdpi/btn_in_call_main_pressed.9.png
deleted file mode 100755
index 46766eb..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_main_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_main_selected.9.png b/phone/res/drawable-hdpi/btn_in_call_main_selected.9.png
deleted file mode 100755
index 56a1850..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_main_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_manage_conf_normal.9.png b/phone/res/drawable-hdpi/btn_in_call_manage_conf_normal.9.png
deleted file mode 100755
index 2368b55..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_manage_conf_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_manage_conf_pressed.9.png b/phone/res/drawable-hdpi/btn_in_call_manage_conf_pressed.9.png
deleted file mode 100755
index 9825031..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_manage_conf_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_manage_conf_selected.9.png b/phone/res/drawable-hdpi/btn_in_call_manage_conf_selected.9.png
deleted file mode 100755
index 9e409da..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_manage_conf_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_round_disable.png b/phone/res/drawable-hdpi/btn_in_call_round_disable.png
deleted file mode 100755
index 0591d51..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_round_disable.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_round_disable_focused.png b/phone/res/drawable-hdpi/btn_in_call_round_disable_focused.png
deleted file mode 100755
index 1b870ac..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_round_disable_focused.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_round_normal.png b/phone/res/drawable-hdpi/btn_in_call_round_normal.png
deleted file mode 100755
index 9182f3f..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_round_normal.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_round_pressed.png b/phone/res/drawable-hdpi/btn_in_call_round_pressed.png
deleted file mode 100755
index 7d47a84..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_round_pressed.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_round_selected.png b/phone/res/drawable-hdpi/btn_in_call_round_selected.png
deleted file mode 100755
index 1f6846a..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_round_selected.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_off_disable.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_off_disable.9.png
deleted file mode 100755
index 59eaff8..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_off_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_off_disable_focused.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_off_disable_focused.9.png
deleted file mode 100755
index 2a6aaba..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_off_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_off_normal.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_off_normal.9.png
deleted file mode 100755
index c16e23b..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_off_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_off_pressed.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_off_pressed.9.png
deleted file mode 100755
index 194009f..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_off_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_off_selected.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_off_selected.9.png
deleted file mode 100755
index 79d5d9d..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_off_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_on_disable.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_on_disable.9.png
deleted file mode 100755
index 979b87a..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_on_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_on_disable_focused.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_on_disable_focused.9.png
deleted file mode 100755
index c7e20f5..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_on_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_on_normal.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_on_normal.9.png
deleted file mode 100755
index fbed2d0..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_on_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_on_pressed.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_on_pressed.9.png
deleted file mode 100755
index 6c2f3ae..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_on_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/btn_in_call_switch_on_selected.9.png b/phone/res/drawable-hdpi/btn_in_call_switch_on_selected.9.png
deleted file mode 100755
index 99e4bc9..0000000
--- a/phone/res/drawable-hdpi/btn_in_call_switch_on_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/dialog_bg_calling_via.9.png b/phone/res/drawable-hdpi/dialog_bg_calling_via.9.png
deleted file mode 100644
index ab5ded7..0000000
--- a/phone/res/drawable-hdpi/dialog_bg_calling_via.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/green_divider.png b/phone/res/drawable-hdpi/green_divider.png
deleted file mode 100644
index 99e7c6b..0000000
--- a/phone/res/drawable-hdpi/green_divider.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/green_selected.9.png b/phone/res/drawable-hdpi/green_selected.9.png
deleted file mode 100644
index 3983e85..0000000
--- a/phone/res/drawable-hdpi/green_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_button_conference_end.png b/phone/res/drawable-hdpi/ic_button_conference_end.png
deleted file mode 100644
index a075999..0000000
--- a/phone/res/drawable-hdpi/ic_button_conference_end.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_button_conference_private.png b/phone/res/drawable-hdpi/ic_button_conference_private.png
deleted file mode 100644
index 7609089..0000000
--- a/phone/res/drawable-hdpi/ic_button_conference_private.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_button_contacts.png b/phone/res/drawable-hdpi/ic_button_contacts.png
deleted file mode 100644
index 04f065c..0000000
--- a/phone/res/drawable-hdpi/ic_button_contacts.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_dialog_call.png b/phone/res/drawable-hdpi/ic_dialog_call.png
deleted file mode 100644
index 0531e31..0000000
--- a/phone/res/drawable-hdpi/ic_dialog_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_add_call.png b/phone/res/drawable-hdpi/ic_in_call_touch_add_call.png
deleted file mode 100755
index a8a49a3..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_add_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_answer.png b/phone/res/drawable-hdpi/ic_in_call_touch_answer.png
deleted file mode 100755
index e93733e..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_answer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_dialpad.png b/phone/res/drawable-hdpi/ic_in_call_touch_dialpad.png
deleted file mode 100755
index def2bdb..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_dialpad.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_dialpad_close.png b/phone/res/drawable-hdpi/ic_in_call_touch_dialpad_close.png
deleted file mode 100755
index 930cfa4..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_dialpad_close.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_end.png b/phone/res/drawable-hdpi/ic_in_call_touch_end.png
deleted file mode 100755
index 1675013..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_end.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_hold.png b/phone/res/drawable-hdpi/ic_in_call_touch_hold.png
deleted file mode 100755
index 8adf7a5..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_hold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_merge_call.png b/phone/res/drawable-hdpi/ic_in_call_touch_merge_call.png
deleted file mode 100755
index 343e8ff..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_merge_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_round_add_call.png b/phone/res/drawable-hdpi/ic_in_call_touch_round_add_call.png
deleted file mode 100755
index a913b32..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_round_add_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_round_hold.png b/phone/res/drawable-hdpi/ic_in_call_touch_round_hold.png
deleted file mode 100755
index 629d28b..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_round_hold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_round_manage_conference.png b/phone/res/drawable-hdpi/ic_in_call_touch_round_manage_conference.png
deleted file mode 100755
index 5185d00..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_round_manage_conference.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_round_merge_call.png b/phone/res/drawable-hdpi/ic_in_call_touch_round_merge_call.png
deleted file mode 100755
index dd16a7e..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_round_merge_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_round_swap.png b/phone/res/drawable-hdpi/ic_in_call_touch_round_swap.png
deleted file mode 100755
index 2405b14..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_round_swap.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_round_unhold.png b/phone/res/drawable-hdpi/ic_in_call_touch_round_unhold.png
deleted file mode 100755
index 76b42f9..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_round_unhold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_round_unhold_alt.png b/phone/res/drawable-hdpi/ic_in_call_touch_round_unhold_alt.png
deleted file mode 100755
index c72c973..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_round_unhold_alt.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_swap.png b/phone/res/drawable-hdpi/ic_in_call_touch_swap.png
deleted file mode 100755
index cd6db27..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_swap.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_in_call_touch_unhold.png b/phone/res/drawable-hdpi/ic_in_call_touch_unhold.png
deleted file mode 100755
index 623d61c..0000000
--- a/phone/res/drawable-hdpi/ic_in_call_touch_unhold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_incall_end.png b/phone/res/drawable-hdpi/ic_incall_end.png
deleted file mode 100644
index ee50472..0000000
--- a/phone/res/drawable-hdpi/ic_incall_end.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_incall_ongoing.png b/phone/res/drawable-hdpi/ic_incall_ongoing.png
deleted file mode 100644
index e79158f..0000000
--- a/phone/res/drawable-hdpi/ic_incall_ongoing.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_incall_ongoing_bluetooth.png b/phone/res/drawable-hdpi/ic_incall_ongoing_bluetooth.png
deleted file mode 100644
index a8f868e..0000000
--- a/phone/res/drawable-hdpi/ic_incall_ongoing_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_incall_onhold.png b/phone/res/drawable-hdpi/ic_incall_onhold.png
deleted file mode 100644
index 67deef6..0000000
--- a/phone/res/drawable-hdpi/ic_incall_onhold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_incoming_call_bluetooth.png b/phone/res/drawable-hdpi/ic_incoming_call_bluetooth.png
deleted file mode 100644
index 050c3e7..0000000
--- a/phone/res/drawable-hdpi/ic_incoming_call_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_jog_dial_answer.png b/phone/res/drawable-hdpi/ic_jog_dial_answer.png
deleted file mode 100755
index ca0a825..0000000
--- a/phone/res/drawable-hdpi/ic_jog_dial_answer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_jog_dial_answer_and_end.png b/phone/res/drawable-hdpi/ic_jog_dial_answer_and_end.png
deleted file mode 100755
index 82237bd..0000000
--- a/phone/res/drawable-hdpi/ic_jog_dial_answer_and_end.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_jog_dial_answer_and_hold.png b/phone/res/drawable-hdpi/ic_jog_dial_answer_and_hold.png
deleted file mode 100755
index 4946ada..0000000
--- a/phone/res/drawable-hdpi/ic_jog_dial_answer_and_hold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_jog_dial_decline.png b/phone/res/drawable-hdpi/ic_jog_dial_decline.png
deleted file mode 100755
index 006a6e4..0000000
--- a/phone/res/drawable-hdpi/ic_jog_dial_decline.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_jog_dial_silence_ringer.png b/phone/res/drawable-hdpi/ic_jog_dial_silence_ringer.png
deleted file mode 100755
index cef67bd..0000000
--- a/phone/res/drawable-hdpi/ic_jog_dial_silence_ringer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_jog_dial_sound_off.png b/phone/res/drawable-hdpi/ic_jog_dial_sound_off.png
deleted file mode 100755
index d73db48..0000000
--- a/phone/res/drawable-hdpi/ic_jog_dial_sound_off.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_jog_dial_sound_on.png b/phone/res/drawable-hdpi/ic_jog_dial_sound_on.png
deleted file mode 100755
index 90da6e3..0000000
--- a/phone/res/drawable-hdpi/ic_jog_dial_sound_on.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_jog_dial_unlock.png b/phone/res/drawable-hdpi/ic_jog_dial_unlock.png
deleted file mode 100755
index a9af1af..0000000
--- a/phone/res/drawable-hdpi/ic_jog_dial_unlock.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_jog_dial_voice_search.png b/phone/res/drawable-hdpi/ic_jog_dial_voice_search.png
deleted file mode 100755
index 4009a34..0000000
--- a/phone/res/drawable-hdpi/ic_jog_dial_voice_search.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_launcher_phone.png b/phone/res/drawable-hdpi/ic_launcher_phone.png
deleted file mode 100644
index 0943ce5..0000000
--- a/phone/res/drawable-hdpi/ic_launcher_phone.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_menu_answer_call.png b/phone/res/drawable-hdpi/ic_menu_answer_call.png
deleted file mode 100644
index e0bee0b..0000000
--- a/phone/res/drawable-hdpi/ic_menu_answer_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_menu_dial_pad.png b/phone/res/drawable-hdpi/ic_menu_dial_pad.png
deleted file mode 100644
index 6eb406a..0000000
--- a/phone/res/drawable-hdpi/ic_menu_dial_pad.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_menu_end_call.png b/phone/res/drawable-hdpi/ic_menu_end_call.png
deleted file mode 100644
index aff4c52..0000000
--- a/phone/res/drawable-hdpi/ic_menu_end_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_menu_merge_calls.png b/phone/res/drawable-hdpi/ic_menu_merge_calls.png
deleted file mode 100644
index 6646899..0000000
--- a/phone/res/drawable-hdpi/ic_menu_merge_calls.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_menu_silence_ringer.png b/phone/res/drawable-hdpi/ic_menu_silence_ringer.png
deleted file mode 100644
index e09ed9f..0000000
--- a/phone/res/drawable-hdpi/ic_menu_silence_ringer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/ic_menu_swap_calls.png b/phone/res/drawable-hdpi/ic_menu_swap_calls.png
deleted file mode 100644
index 36deb05..0000000
--- a/phone/res/drawable-hdpi/ic_menu_swap_calls.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/incall_photo_border_lg.9.png b/phone/res/drawable-hdpi/incall_photo_border_lg.9.png
deleted file mode 100755
index 351df2d..0000000
--- a/phone/res/drawable-hdpi/incall_photo_border_lg.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/incall_photo_border_med.9.png b/phone/res/drawable-hdpi/incall_photo_border_med.9.png
deleted file mode 100755
index 395c85c..0000000
--- a/phone/res/drawable-hdpi/incall_photo_border_med.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/picture_busy.png b/phone/res/drawable-hdpi/picture_busy.png
deleted file mode 100644
index 98deacf..0000000
--- a/phone/res/drawable-hdpi/picture_busy.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/picture_conference.png b/phone/res/drawable-hdpi/picture_conference.png
deleted file mode 100644
index 33211bb..0000000
--- a/phone/res/drawable-hdpi/picture_conference.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/picture_dialing.png b/phone/res/drawable-hdpi/picture_dialing.png
deleted file mode 100644
index 0099598..0000000
--- a/phone/res/drawable-hdpi/picture_dialing.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/picture_emergency25x25.png b/phone/res/drawable-hdpi/picture_emergency25x25.png
deleted file mode 100644
index b0cb522..0000000
--- a/phone/res/drawable-hdpi/picture_emergency25x25.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/picture_emergency32x32.png b/phone/res/drawable-hdpi/picture_emergency32x32.png
deleted file mode 100644
index 481666e..0000000
--- a/phone/res/drawable-hdpi/picture_emergency32x32.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/picture_unknown.png b/phone/res/drawable-hdpi/picture_unknown.png
deleted file mode 100644
index 00d9e24..0000000
--- a/phone/res/drawable-hdpi/picture_unknown.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-hdpi/red_selected.9.png b/phone/res/drawable-hdpi/red_selected.9.png
deleted file mode 100644
index 235519b..0000000
--- a/phone/res/drawable-hdpi/red_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_left_disable.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_left_disable.9.png
deleted file mode 100644
index 6ab27d8..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_left_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_left_disable_focused.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_left_disable_focused.9.png
deleted file mode 100644
index 5bba3c4..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_left_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_left_normal.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_left_normal.9.png
deleted file mode 100644
index 6ab27d8..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_left_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_left_pressed.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_left_pressed.9.png
deleted file mode 100644
index 542abe7..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_left_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_left_selected.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_left_selected.9.png
deleted file mode 100644
index 34caba1..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_left_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_disable.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_middle_disable.9.png
deleted file mode 100644
index 0740c95..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_disable_focused.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_middle_disable_focused.9.png
deleted file mode 100644
index c57627f..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_normal.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_middle_normal.9.png
deleted file mode 100644
index 0740c95..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_pressed.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_middle_pressed.9.png
deleted file mode 100644
index a5f9f98..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_selected.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_middle_selected.9.png
deleted file mode 100644
index dcd4b82..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_middle_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_right_disable.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_right_disable.9.png
deleted file mode 100644
index 85dfff0..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_right_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_right_disable_focused.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_right_disable_focused.9.png
deleted file mode 100644
index 1f76f0c..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_right_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_right_normal.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_right_normal.9.png
deleted file mode 100644
index 85dfff0..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_right_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_right_pressed.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_right_pressed.9.png
deleted file mode 100644
index 226633f..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_right_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_action_right_selected.9.png b/phone/res/drawable-mdpi-finger/btn_dial_action_right_selected.9.png
deleted file mode 100644
index 9cca52c..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_action_right_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_normal.9.png b/phone/res/drawable-mdpi-finger/btn_dial_normal.9.png
deleted file mode 100644
index 748dd8a..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_normal_blue.9.png b/phone/res/drawable-mdpi-finger/btn_dial_normal_blue.9.png
deleted file mode 100644
index 7c8c2ca..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_normal_blue.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_normal_green.9.png b/phone/res/drawable-mdpi-finger/btn_dial_normal_green.9.png
deleted file mode 100644
index b220650..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_normal_green.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_pressed.9.png b/phone/res/drawable-mdpi-finger/btn_dial_pressed.9.png
deleted file mode 100644
index 83f9c62..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_selected.9.png b/phone/res/drawable-mdpi-finger/btn_dial_selected.9.png
deleted file mode 100644
index edc7bcb..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_textfield_activated.9.png b/phone/res/drawable-mdpi-finger/btn_dial_textfield_activated.9.png
deleted file mode 100644
index de65d44..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_textfield_activated.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_textfield_normal.9.png b/phone/res/drawable-mdpi-finger/btn_dial_textfield_normal.9.png
deleted file mode 100644
index d3613e3..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_textfield_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_textfield_normal_full.9.png b/phone/res/drawable-mdpi-finger/btn_dial_textfield_normal_full.9.png
deleted file mode 100644
index fb54e54..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_textfield_normal_full.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_textfield_normal_full_sm.9.png b/phone/res/drawable-mdpi-finger/btn_dial_textfield_normal_full_sm.9.png
deleted file mode 100644
index 24e0357..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_textfield_normal_full_sm.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_textfield_pressed.9.png b/phone/res/drawable-mdpi-finger/btn_dial_textfield_pressed.9.png
deleted file mode 100644
index fa7147e..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_textfield_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/btn_dial_textfield_selected.9.png b/phone/res/drawable-mdpi-finger/btn_dial_textfield_selected.9.png
deleted file mode 100644
index 09db422..0000000
--- a/phone/res/drawable-mdpi-finger/btn_dial_textfield_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_0_blk.png b/phone/res/drawable-mdpi-finger/dial_num_0_blk.png
deleted file mode 100644
index d04add7..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_0_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_0_wht.png b/phone/res/drawable-mdpi-finger/dial_num_0_wht.png
deleted file mode 100644
index c3b3f2c..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_0_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_1_no_vm_blk.png b/phone/res/drawable-mdpi-finger/dial_num_1_no_vm_blk.png
deleted file mode 100644
index 75a8ed8..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_1_no_vm_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_1_no_vm_wht.png b/phone/res/drawable-mdpi-finger/dial_num_1_no_vm_wht.png
deleted file mode 100644
index a5bdb41..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_1_no_vm_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_2_blk.png b/phone/res/drawable-mdpi-finger/dial_num_2_blk.png
deleted file mode 100644
index 1d8a35c..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_2_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_2_wht.png b/phone/res/drawable-mdpi-finger/dial_num_2_wht.png
deleted file mode 100644
index ac99cec..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_2_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_3_blk.png b/phone/res/drawable-mdpi-finger/dial_num_3_blk.png
deleted file mode 100644
index cf78e04..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_3_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_3_wht.png b/phone/res/drawable-mdpi-finger/dial_num_3_wht.png
deleted file mode 100644
index 69170b9..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_3_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_4_blk.png b/phone/res/drawable-mdpi-finger/dial_num_4_blk.png
deleted file mode 100644
index c9c12c2..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_4_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_4_wht.png b/phone/res/drawable-mdpi-finger/dial_num_4_wht.png
deleted file mode 100644
index 48a02a5..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_4_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_5_blk.png b/phone/res/drawable-mdpi-finger/dial_num_5_blk.png
deleted file mode 100644
index a89dd8f..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_5_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_5_wht.png b/phone/res/drawable-mdpi-finger/dial_num_5_wht.png
deleted file mode 100644
index e3c9940..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_5_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_6_blk.png b/phone/res/drawable-mdpi-finger/dial_num_6_blk.png
deleted file mode 100644
index c282afb..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_6_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_6_wht.png b/phone/res/drawable-mdpi-finger/dial_num_6_wht.png
deleted file mode 100644
index ab12781..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_6_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_7_blk.png b/phone/res/drawable-mdpi-finger/dial_num_7_blk.png
deleted file mode 100644
index df273a2..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_7_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_7_wht.png b/phone/res/drawable-mdpi-finger/dial_num_7_wht.png
deleted file mode 100644
index 9e66205..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_7_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_8_blk.png b/phone/res/drawable-mdpi-finger/dial_num_8_blk.png
deleted file mode 100644
index 9e5654f..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_8_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_8_wht.png b/phone/res/drawable-mdpi-finger/dial_num_8_wht.png
deleted file mode 100644
index 2af30fa..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_8_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_9_blk.png b/phone/res/drawable-mdpi-finger/dial_num_9_blk.png
deleted file mode 100644
index 6ae1943..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_9_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_9_wht.png b/phone/res/drawable-mdpi-finger/dial_num_9_wht.png
deleted file mode 100644
index 1c99b61..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_9_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_pound_blk.png b/phone/res/drawable-mdpi-finger/dial_num_pound_blk.png
deleted file mode 100644
index add133e..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_pound_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_pound_wht.png b/phone/res/drawable-mdpi-finger/dial_num_pound_wht.png
deleted file mode 100644
index e17f2bf..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_pound_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_star_blk.png b/phone/res/drawable-mdpi-finger/dial_num_star_blk.png
deleted file mode 100644
index f649f14..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_star_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dial_num_star_wht.png b/phone/res/drawable-mdpi-finger/dial_num_star_wht.png
deleted file mode 100644
index 86113ed..0000000
--- a/phone/res/drawable-mdpi-finger/dial_num_star_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/dialpad_lock.9.png b/phone/res/drawable-mdpi-finger/dialpad_lock.9.png
deleted file mode 100644
index 103b4a9..0000000
--- a/phone/res/drawable-mdpi-finger/dialpad_lock.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_dial_action_call.png b/phone/res/drawable-mdpi-finger/ic_dial_action_call.png
deleted file mode 100644
index 1942899..0000000
--- a/phone/res/drawable-mdpi-finger/ic_dial_action_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_dial_action_delete.png b/phone/res/drawable-mdpi-finger/ic_dial_action_delete.png
deleted file mode 100644
index 440ae37..0000000
--- a/phone/res/drawable-mdpi-finger/ic_dial_action_delete.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_dial_action_voice_mail.png b/phone/res/drawable-mdpi-finger/ic_dial_action_voice_mail.png
deleted file mode 100644
index cb07d1a..0000000
--- a/phone/res/drawable-mdpi-finger/ic_dial_action_voice_mail.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_dial_number_blk.png b/phone/res/drawable-mdpi-finger/ic_dial_number_blk.png
deleted file mode 100644
index c1f572d..0000000
--- a/phone/res/drawable-mdpi-finger/ic_dial_number_blk.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_dial_number_wht.png b/phone/res/drawable-mdpi-finger/ic_dial_number_wht.png
deleted file mode 100644
index d303b2b..0000000
--- a/phone/res/drawable-mdpi-finger/ic_dial_number_wht.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_menu_contact.png b/phone/res/drawable-mdpi-finger/ic_menu_contact.png
deleted file mode 100644
index 29b7cd9..0000000
--- a/phone/res/drawable-mdpi-finger/ic_menu_contact.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_tab_selected_contacts.png b/phone/res/drawable-mdpi-finger/ic_tab_selected_contacts.png
deleted file mode 100644
index a0d2832..0000000
--- a/phone/res/drawable-mdpi-finger/ic_tab_selected_contacts.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_tab_selected_dialer.png b/phone/res/drawable-mdpi-finger/ic_tab_selected_dialer.png
deleted file mode 100644
index 4b67b96..0000000
--- a/phone/res/drawable-mdpi-finger/ic_tab_selected_dialer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_tab_selected_recent.png b/phone/res/drawable-mdpi-finger/ic_tab_selected_recent.png
deleted file mode 100644
index f539799..0000000
--- a/phone/res/drawable-mdpi-finger/ic_tab_selected_recent.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_tab_selected_stared.png b/phone/res/drawable-mdpi-finger/ic_tab_selected_stared.png
deleted file mode 100644
index 0a0c2ea..0000000
--- a/phone/res/drawable-mdpi-finger/ic_tab_selected_stared.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_tab_unselected_contacts.png b/phone/res/drawable-mdpi-finger/ic_tab_unselected_contacts.png
deleted file mode 100644
index 55e1917..0000000
--- a/phone/res/drawable-mdpi-finger/ic_tab_unselected_contacts.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_tab_unselected_dialer.png b/phone/res/drawable-mdpi-finger/ic_tab_unselected_dialer.png
deleted file mode 100644
index d15974f..0000000
--- a/phone/res/drawable-mdpi-finger/ic_tab_unselected_dialer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_tab_unselected_recent.png b/phone/res/drawable-mdpi-finger/ic_tab_unselected_recent.png
deleted file mode 100644
index 0598172..0000000
--- a/phone/res/drawable-mdpi-finger/ic_tab_unselected_recent.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/ic_tab_unselected_stared.png b/phone/res/drawable-mdpi-finger/ic_tab_unselected_stared.png
deleted file mode 100644
index 58066c8..0000000
--- a/phone/res/drawable-mdpi-finger/ic_tab_unselected_stared.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/tray_handle_strip_normal.9.png b/phone/res/drawable-mdpi-finger/tray_handle_strip_normal.9.png
deleted file mode 100644
index dde0f1e..0000000
--- a/phone/res/drawable-mdpi-finger/tray_handle_strip_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/tray_handle_strip_pressed.9.png b/phone/res/drawable-mdpi-finger/tray_handle_strip_pressed.9.png
deleted file mode 100644
index 9ba4302..0000000
--- a/phone/res/drawable-mdpi-finger/tray_handle_strip_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/tray_handle_strip_selected.9.png b/phone/res/drawable-mdpi-finger/tray_handle_strip_selected.9.png
deleted file mode 100644
index 6a46931..0000000
--- a/phone/res/drawable-mdpi-finger/tray_handle_strip_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/tray_handle_tab_normal.9.png b/phone/res/drawable-mdpi-finger/tray_handle_tab_normal.9.png
deleted file mode 100644
index bc00120..0000000
--- a/phone/res/drawable-mdpi-finger/tray_handle_tab_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/tray_handle_tab_pressed.9.png b/phone/res/drawable-mdpi-finger/tray_handle_tab_pressed.9.png
deleted file mode 100644
index 9fab484..0000000
--- a/phone/res/drawable-mdpi-finger/tray_handle_tab_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi-finger/tray_handle_tab_selected.9.png b/phone/res/drawable-mdpi-finger/tray_handle_tab_selected.9.png
deleted file mode 100644
index 6df753f..0000000
--- a/phone/res/drawable-mdpi-finger/tray_handle_tab_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/bg_in_call_gradient_bluetooth.9.png b/phone/res/drawable-mdpi/bg_in_call_gradient_bluetooth.9.png
deleted file mode 100755
index bb0d4d4..0000000
--- a/phone/res/drawable-mdpi/bg_in_call_gradient_bluetooth.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/bg_in_call_gradient_connected.9.png b/phone/res/drawable-mdpi/bg_in_call_gradient_connected.9.png
deleted file mode 100755
index aa0155e..0000000
--- a/phone/res/drawable-mdpi/bg_in_call_gradient_connected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/bg_in_call_gradient_ended.9.png b/phone/res/drawable-mdpi/bg_in_call_gradient_ended.9.png
deleted file mode 100755
index 35451d4..0000000
--- a/phone/res/drawable-mdpi/bg_in_call_gradient_ended.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/bg_in_call_gradient_on_hold.9.png b/phone/res/drawable-mdpi/bg_in_call_gradient_on_hold.9.png
deleted file mode 100755
index 800689e..0000000
--- a/phone/res/drawable-mdpi/bg_in_call_gradient_on_hold.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/bg_in_call_gradient_unidentified.9.png b/phone/res/drawable-mdpi/bg_in_call_gradient_unidentified.9.png
deleted file mode 100755
index adb3abd..0000000
--- a/phone/res/drawable-mdpi/bg_in_call_gradient_unidentified.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_answer_dotted_green.9.png b/phone/res/drawable-mdpi/btn_in_call_answer_dotted_green.9.png
deleted file mode 100755
index 89b9dd6..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_answer_dotted_green.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_answer_dotted_red.9.png b/phone/res/drawable-mdpi/btn_in_call_answer_dotted_red.9.png
deleted file mode 100755
index 18f24db..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_answer_dotted_red.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_answer_normal.9.png b/phone/res/drawable-mdpi/btn_in_call_answer_normal.9.png
deleted file mode 100755
index 5ff50ec..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_answer_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_answer_pressed.9.png b/phone/res/drawable-mdpi/btn_in_call_answer_pressed.9.png
deleted file mode 100755
index d7e285a..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_answer_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_main_disable.9.png b/phone/res/drawable-mdpi/btn_in_call_main_disable.9.png
deleted file mode 100755
index 6ade892..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_main_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_main_disable_focused.9.png b/phone/res/drawable-mdpi/btn_in_call_main_disable_focused.9.png
deleted file mode 100755
index 178f08a..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_main_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_main_normal.9.png b/phone/res/drawable-mdpi/btn_in_call_main_normal.9.png
deleted file mode 100755
index f0c1826..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_main_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_main_pressed.9.png b/phone/res/drawable-mdpi/btn_in_call_main_pressed.9.png
deleted file mode 100755
index 8a22809..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_main_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_main_selected.9.png b/phone/res/drawable-mdpi/btn_in_call_main_selected.9.png
deleted file mode 100755
index 749965f..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_main_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_manage_conf_normal.9.png b/phone/res/drawable-mdpi/btn_in_call_manage_conf_normal.9.png
deleted file mode 100755
index 3eab57b..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_manage_conf_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_manage_conf_pressed.9.png b/phone/res/drawable-mdpi/btn_in_call_manage_conf_pressed.9.png
deleted file mode 100755
index 1cfea1c..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_manage_conf_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_manage_conf_selected.9.png b/phone/res/drawable-mdpi/btn_in_call_manage_conf_selected.9.png
deleted file mode 100755
index de71406..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_manage_conf_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_round_disable.png b/phone/res/drawable-mdpi/btn_in_call_round_disable.png
deleted file mode 100755
index 3598375..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_round_disable.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_round_disable_focused.png b/phone/res/drawable-mdpi/btn_in_call_round_disable_focused.png
deleted file mode 100755
index 8680a23..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_round_disable_focused.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_round_normal.png b/phone/res/drawable-mdpi/btn_in_call_round_normal.png
deleted file mode 100755
index d7524f6..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_round_normal.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_round_pressed.png b/phone/res/drawable-mdpi/btn_in_call_round_pressed.png
deleted file mode 100755
index c3dd47d..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_round_pressed.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_round_selected.png b/phone/res/drawable-mdpi/btn_in_call_round_selected.png
deleted file mode 100755
index 79b5516..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_round_selected.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_off_disable.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_off_disable.9.png
deleted file mode 100755
index 37b1e13..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_off_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_off_disable_focused.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_off_disable_focused.9.png
deleted file mode 100755
index 14e7878..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_off_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_off_normal.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_off_normal.9.png
deleted file mode 100755
index b463f44..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_off_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_off_pressed.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_off_pressed.9.png
deleted file mode 100755
index 0222381..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_off_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_off_selected.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_off_selected.9.png
deleted file mode 100755
index 5a02f20..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_off_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_on_disable.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_on_disable.9.png
deleted file mode 100755
index 4799987..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_on_disable.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_on_disable_focused.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_on_disable_focused.9.png
deleted file mode 100755
index ee75b53..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_on_disable_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_on_normal.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_on_normal.9.png
deleted file mode 100755
index 0b52de4..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_on_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_on_pressed.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_on_pressed.9.png
deleted file mode 100755
index 5a8ca65..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_on_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/btn_in_call_switch_on_selected.9.png b/phone/res/drawable-mdpi/btn_in_call_switch_on_selected.9.png
deleted file mode 100755
index f8e7016..0000000
--- a/phone/res/drawable-mdpi/btn_in_call_switch_on_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/dialog_bg_calling_via.9.png b/phone/res/drawable-mdpi/dialog_bg_calling_via.9.png
deleted file mode 100644
index 8095604..0000000
--- a/phone/res/drawable-mdpi/dialog_bg_calling_via.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/green_divider.png b/phone/res/drawable-mdpi/green_divider.png
deleted file mode 100644
index 8b3dbd0..0000000
--- a/phone/res/drawable-mdpi/green_divider.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/green_selected.9.png b/phone/res/drawable-mdpi/green_selected.9.png
deleted file mode 100644
index 385b7c6..0000000
--- a/phone/res/drawable-mdpi/green_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_btn_next.png b/phone/res/drawable-mdpi/ic_btn_next.png
deleted file mode 100755
index c6cf436..0000000
--- a/phone/res/drawable-mdpi/ic_btn_next.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_button_conference_end.png b/phone/res/drawable-mdpi/ic_button_conference_end.png
deleted file mode 100644
index 389c7c0..0000000
--- a/phone/res/drawable-mdpi/ic_button_conference_end.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_button_conference_private.png b/phone/res/drawable-mdpi/ic_button_conference_private.png
deleted file mode 100644
index 4ee6050..0000000
--- a/phone/res/drawable-mdpi/ic_button_conference_private.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_button_contacts.png b/phone/res/drawable-mdpi/ic_button_contacts.png
deleted file mode 100644
index 70f7c2c..0000000
--- a/phone/res/drawable-mdpi/ic_button_contacts.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_dialog_call.png b/phone/res/drawable-mdpi/ic_dialog_call.png
deleted file mode 100644
index 6863e7b..0000000
--- a/phone/res/drawable-mdpi/ic_dialog_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_add_call.png b/phone/res/drawable-mdpi/ic_in_call_touch_add_call.png
deleted file mode 100755
index 52f5a51..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_add_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_answer.png b/phone/res/drawable-mdpi/ic_in_call_touch_answer.png
deleted file mode 100755
index 11a8fc3..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_answer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_dialpad.png b/phone/res/drawable-mdpi/ic_in_call_touch_dialpad.png
deleted file mode 100755
index 5d465c5..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_dialpad.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_dialpad_close.png b/phone/res/drawable-mdpi/ic_in_call_touch_dialpad_close.png
deleted file mode 100755
index 9810fff..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_dialpad_close.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_end.png b/phone/res/drawable-mdpi/ic_in_call_touch_end.png
deleted file mode 100755
index 8592993..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_end.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_hold.png b/phone/res/drawable-mdpi/ic_in_call_touch_hold.png
deleted file mode 100755
index 714f4fd..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_hold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_merge_call.png b/phone/res/drawable-mdpi/ic_in_call_touch_merge_call.png
deleted file mode 100755
index b7f0e42..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_merge_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_round_add_call.png b/phone/res/drawable-mdpi/ic_in_call_touch_round_add_call.png
deleted file mode 100755
index b21c916..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_round_add_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_round_hold.png b/phone/res/drawable-mdpi/ic_in_call_touch_round_hold.png
deleted file mode 100755
index 31dfcc4..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_round_hold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_round_manage_conference.png b/phone/res/drawable-mdpi/ic_in_call_touch_round_manage_conference.png
deleted file mode 100755
index 640e00f..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_round_manage_conference.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_round_merge_call.png b/phone/res/drawable-mdpi/ic_in_call_touch_round_merge_call.png
deleted file mode 100755
index 76abefb..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_round_merge_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_round_swap.png b/phone/res/drawable-mdpi/ic_in_call_touch_round_swap.png
deleted file mode 100755
index a42caaa..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_round_swap.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_round_unhold.png b/phone/res/drawable-mdpi/ic_in_call_touch_round_unhold.png
deleted file mode 100755
index 59e897d..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_round_unhold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_round_unhold_alt.png b/phone/res/drawable-mdpi/ic_in_call_touch_round_unhold_alt.png
deleted file mode 100755
index cc23a10..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_round_unhold_alt.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_swap.png b/phone/res/drawable-mdpi/ic_in_call_touch_swap.png
deleted file mode 100755
index ad43d9f..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_swap.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_in_call_touch_unhold.png b/phone/res/drawable-mdpi/ic_in_call_touch_unhold.png
deleted file mode 100755
index 90b8cca..0000000
--- a/phone/res/drawable-mdpi/ic_in_call_touch_unhold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_incall_end.png b/phone/res/drawable-mdpi/ic_incall_end.png
deleted file mode 100644
index fa33196..0000000
--- a/phone/res/drawable-mdpi/ic_incall_end.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_incall_ongoing.png b/phone/res/drawable-mdpi/ic_incall_ongoing.png
deleted file mode 100644
index 1a4bb10..0000000
--- a/phone/res/drawable-mdpi/ic_incall_ongoing.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_incall_ongoing_bluetooth.png b/phone/res/drawable-mdpi/ic_incall_ongoing_bluetooth.png
deleted file mode 100644
index 8e02d22..0000000
--- a/phone/res/drawable-mdpi/ic_incall_ongoing_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_incall_onhold.png b/phone/res/drawable-mdpi/ic_incall_onhold.png
deleted file mode 100644
index c830425..0000000
--- a/phone/res/drawable-mdpi/ic_incall_onhold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_incoming_call_bluetooth.png b/phone/res/drawable-mdpi/ic_incoming_call_bluetooth.png
deleted file mode 100644
index 4b317c1..0000000
--- a/phone/res/drawable-mdpi/ic_incoming_call_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_jog_dial_answer.png b/phone/res/drawable-mdpi/ic_jog_dial_answer.png
deleted file mode 100755
index e2bc483..0000000
--- a/phone/res/drawable-mdpi/ic_jog_dial_answer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_jog_dial_answer_and_end.png b/phone/res/drawable-mdpi/ic_jog_dial_answer_and_end.png
deleted file mode 100755
index aa0fab2..0000000
--- a/phone/res/drawable-mdpi/ic_jog_dial_answer_and_end.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_jog_dial_answer_and_hold.png b/phone/res/drawable-mdpi/ic_jog_dial_answer_and_hold.png
deleted file mode 100755
index 9effe37..0000000
--- a/phone/res/drawable-mdpi/ic_jog_dial_answer_and_hold.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_jog_dial_decline.png b/phone/res/drawable-mdpi/ic_jog_dial_decline.png
deleted file mode 100755
index 81c76b5..0000000
--- a/phone/res/drawable-mdpi/ic_jog_dial_decline.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_jog_dial_silence_ringer.png b/phone/res/drawable-mdpi/ic_jog_dial_silence_ringer.png
deleted file mode 100755
index b950f54..0000000
--- a/phone/res/drawable-mdpi/ic_jog_dial_silence_ringer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_jog_dial_sound_off.png b/phone/res/drawable-mdpi/ic_jog_dial_sound_off.png
deleted file mode 100755
index b9aec69..0000000
--- a/phone/res/drawable-mdpi/ic_jog_dial_sound_off.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_jog_dial_sound_on.png b/phone/res/drawable-mdpi/ic_jog_dial_sound_on.png
deleted file mode 100755
index 4952746..0000000
--- a/phone/res/drawable-mdpi/ic_jog_dial_sound_on.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_jog_dial_unlock.png b/phone/res/drawable-mdpi/ic_jog_dial_unlock.png
deleted file mode 100755
index e697d91..0000000
--- a/phone/res/drawable-mdpi/ic_jog_dial_unlock.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_jog_dial_voice_search.png b/phone/res/drawable-mdpi/ic_jog_dial_voice_search.png
deleted file mode 100755
index b592ba6..0000000
--- a/phone/res/drawable-mdpi/ic_jog_dial_voice_search.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_launcher_phone.png b/phone/res/drawable-mdpi/ic_launcher_phone.png
deleted file mode 100644
index 88336a3..0000000
--- a/phone/res/drawable-mdpi/ic_launcher_phone.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_menu_answer_call.png b/phone/res/drawable-mdpi/ic_menu_answer_call.png
deleted file mode 100644
index c0844a0..0000000
--- a/phone/res/drawable-mdpi/ic_menu_answer_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_menu_dial_pad.png b/phone/res/drawable-mdpi/ic_menu_dial_pad.png
deleted file mode 100644
index 6a75173..0000000
--- a/phone/res/drawable-mdpi/ic_menu_dial_pad.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_menu_end_call.png b/phone/res/drawable-mdpi/ic_menu_end_call.png
deleted file mode 100644
index f5fa249..0000000
--- a/phone/res/drawable-mdpi/ic_menu_end_call.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_menu_merge_calls.png b/phone/res/drawable-mdpi/ic_menu_merge_calls.png
deleted file mode 100644
index ba4907c..0000000
--- a/phone/res/drawable-mdpi/ic_menu_merge_calls.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_menu_silence_ringer.png b/phone/res/drawable-mdpi/ic_menu_silence_ringer.png
deleted file mode 100644
index 4d2ad6d..0000000
--- a/phone/res/drawable-mdpi/ic_menu_silence_ringer.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/ic_menu_swap_calls.png b/phone/res/drawable-mdpi/ic_menu_swap_calls.png
deleted file mode 100644
index 024ada5..0000000
--- a/phone/res/drawable-mdpi/ic_menu_swap_calls.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/incall_photo_border_lg.9.png b/phone/res/drawable-mdpi/incall_photo_border_lg.9.png
deleted file mode 100755
index e68eb98..0000000
--- a/phone/res/drawable-mdpi/incall_photo_border_lg.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/incall_photo_border_med.9.png b/phone/res/drawable-mdpi/incall_photo_border_med.9.png
deleted file mode 100755
index 40f9550..0000000
--- a/phone/res/drawable-mdpi/incall_photo_border_med.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/picture_busy.png b/phone/res/drawable-mdpi/picture_busy.png
deleted file mode 100644
index ca1c6bf..0000000
--- a/phone/res/drawable-mdpi/picture_busy.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/picture_conference.png b/phone/res/drawable-mdpi/picture_conference.png
deleted file mode 100644
index 09ba842..0000000
--- a/phone/res/drawable-mdpi/picture_conference.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/picture_dialing.png b/phone/res/drawable-mdpi/picture_dialing.png
deleted file mode 100644
index cd6b4f0..0000000
--- a/phone/res/drawable-mdpi/picture_dialing.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/picture_emergency25x25.png b/phone/res/drawable-mdpi/picture_emergency25x25.png
deleted file mode 100644
index ebf1c93..0000000
--- a/phone/res/drawable-mdpi/picture_emergency25x25.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/picture_emergency32x32.png b/phone/res/drawable-mdpi/picture_emergency32x32.png
deleted file mode 100644
index b3d7555..0000000
--- a/phone/res/drawable-mdpi/picture_emergency32x32.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/picture_unknown.png b/phone/res/drawable-mdpi/picture_unknown.png
deleted file mode 100644
index 873ce48..0000000
--- a/phone/res/drawable-mdpi/picture_unknown.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable-mdpi/red_selected.9.png b/phone/res/drawable-mdpi/red_selected.9.png
deleted file mode 100644
index 3d0a980..0000000
--- a/phone/res/drawable-mdpi/red_selected.9.png
+++ /dev/null
Binary files differ
diff --git a/phone/res/drawable/incall_button.xml b/phone/res/drawable/incall_button.xml
deleted file mode 100644
index 711579b..0000000
--- a/phone/res/drawable/incall_button.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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.
--->
-
-<!-- StateListDrawable used for buttons in the in-call onscreen touch UI. -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
- <item android:state_window_focused="false" android:state_enabled="true"
- android:drawable="@drawable/btn_in_call_main_normal" />
-
- <item android:state_window_focused="false" android:state_enabled="false"
- android:drawable="@drawable/btn_in_call_main_disable" />
-
- <item android:state_pressed="true"
- android:drawable="@drawable/btn_in_call_main_pressed" />
-
- <item android:state_focused="true" android:state_enabled="true"
- android:drawable="@drawable/btn_in_call_main_selected" />
-
- <item android:state_enabled="true"
- android:drawable="@drawable/btn_in_call_main_normal" />
-
- <item android:state_focused="true"
- android:drawable="@drawable/btn_in_call_main_disable_focused" />
-
- <item
- android:drawable="@drawable/btn_in_call_main_disable" />
-
-</selector>
diff --git a/phone/res/drawable/incall_round_button.xml b/phone/res/drawable/incall_round_button.xml
deleted file mode 100644
index 5750c07..0000000
--- a/phone/res/drawable/incall_round_button.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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.
--->
-
-<!-- StateListDrawable used for the small round ImageButtons at the upper
- corners of the in-call onscreen touch UI. -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
- <item android:state_window_focused="false" android:state_enabled="true"
- android:drawable="@drawable/btn_in_call_round_normal" />
-
- <item android:state_window_focused="false" android:state_enabled="false"
- android:drawable="@drawable/btn_in_call_round_disable" />
-
- <item android:state_pressed="true"
- android:drawable="@drawable/btn_in_call_round_pressed" />
-
- <item android:state_focused="true" android:state_enabled="true"
- android:drawable="@drawable/btn_in_call_round_selected" />
-
- <item android:state_enabled="true"
- android:drawable="@drawable/btn_in_call_round_normal" />
-
- <item android:state_focused="true"
- android:drawable="@drawable/btn_in_call_round_disable_focused" />
-
- <item
- android:drawable="@drawable/btn_in_call_round_disable" />
-
-</selector>
diff --git a/phone/res/drawable/incall_toggle_button.xml b/phone/res/drawable/incall_toggle_button.xml
deleted file mode 100644
index 784a38d..0000000
--- a/phone/res/drawable/incall_toggle_button.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?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.
--->
-
-<!-- StateListDrawable used for toggle buttons in the in-call onscreen touch UI. -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- TODO: For now, we spell out every possible combination of
- checked/focused/enabled/pressed here, since the assets were
- created that way.
- But instead, consider using a <layer-list> here so that the
- background and the "toggle" indicator can be separate drawables.
- That way, only the background drawable needs to care about the
- focused/enabled/pressed state, and only the toggle indicator
- needs to care about the "checked" state. This would reduce the
- number of separate image assets we need by almost half. (See
- btn_toggle_bg.xml in the framework for an example of this
- design.) -->
-
- <!-- "checked" states -->
-
- <item android:state_window_focused="false" android:state_enabled="true"
- android:state_checked="true"
- android:drawable="@drawable/btn_in_call_switch_on_normal" />
-
- <item android:state_window_focused="false" android:state_enabled="false"
- android:state_checked="true"
- android:drawable="@drawable/btn_in_call_switch_on_disable" />
-
- <item android:state_pressed="true"
- android:state_checked="true"
- android:drawable="@drawable/btn_in_call_switch_on_pressed" />
-
- <item android:state_focused="true" android:state_enabled="true"
- android:state_checked="true"
- android:drawable="@drawable/btn_in_call_switch_on_selected" />
-
- <item android:state_enabled="true"
- android:state_checked="true"
- android:drawable="@drawable/btn_in_call_switch_on_normal" />
-
- <item android:state_focused="true"
- android:state_checked="true"
- android:drawable="@drawable/btn_in_call_switch_on_disable_focused" />
-
- <item
- android:state_checked="true"
- android:drawable="@drawable/btn_in_call_switch_on_disable" />
-
- <!-- "unchecked" states -->
-
- <item android:state_window_focused="false" android:state_enabled="true"
- android:state_checked="false"
- android:drawable="@drawable/btn_in_call_switch_off_normal" />
-
- <item android:state_window_focused="false" android:state_enabled="false"
- android:state_checked="false"
- android:drawable="@drawable/btn_in_call_switch_off_disable" />
-
- <item android:state_pressed="true"
- android:state_checked="false"
- android:drawable="@drawable/btn_in_call_switch_off_pressed" />
-
- <item android:state_focused="true" android:state_enabled="true"
- android:state_checked="false"
- android:drawable="@drawable/btn_in_call_switch_off_selected" />
-
- <item android:state_enabled="true"
- android:state_checked="false"
- android:drawable="@drawable/btn_in_call_switch_off_normal" />
-
- <item android:state_focused="true"
- android:state_checked="false"
- android:drawable="@drawable/btn_in_call_switch_off_disable_focused" />
-
- <item
- android:drawable="@drawable/btn_in_call_switch_off_disable" />
-
-</selector>
diff --git a/phone/res/drawable/manage_conference_photo_button.xml b/phone/res/drawable/manage_conference_photo_button.xml
deleted file mode 100644
index c221565..0000000
--- a/phone/res/drawable/manage_conference_photo_button.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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.
--->
-
-<!-- StateListDrawable for the big "Manage conference" button that we show
- in place of the usual contact photo during a conference call. -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true"
- android:drawable="@drawable/btn_in_call_manage_conf_pressed" />
- <item android:state_focused="true"
- android:drawable="@drawable/btn_in_call_manage_conf_selected" />
- <item
- android:drawable="@drawable/btn_in_call_manage_conf_normal" />
-</selector>
diff --git a/phone/res/layout-finger/dialer_activity.xml b/phone/res/layout-finger/dialer_activity.xml
deleted file mode 100644
index 57eee91..0000000
--- a/phone/res/layout-finger/dialer_activity.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2006 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <TabWidget android:id="@android:id/tabs"
- android:layout_width="match_parent"
- android:layout_height="68dip"
- android:paddingLeft="1dip"
- android:paddingRight="1dip"
- android:paddingTop="4dip"
- />
-
- <FrameLayout android:id="@android:id/tabcontent"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
- </LinearLayout>
-</TabHost>
-
diff --git a/phone/res/layout-finger/dialpad.xml b/phone/res/layout-finger/dialpad.xml
deleted file mode 100644
index 135f0fb..0000000
--- a/phone/res/layout-finger/dialpad.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2006 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<com.android.phone2.ButtonGridLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/dialpad"
- android:paddingLeft="7dp"
- android:paddingRight="7dp"
- android:paddingTop="6dp"
- android:paddingBottom="6dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_weight="1"
->
- <ImageButton android:id="@+id/one"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_1_no_vm"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/two"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_2"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/three"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_3"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/four"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_4"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/five"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_5"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/six"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_6"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/seven"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_7"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/eight"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_8"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/nine"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_9"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/star"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_star"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/zero"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_0"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/pound"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_pound"
- android:background="@drawable/btn_dial"
- />
-</com.android.phone2.ButtonGridLayout>
-
diff --git a/phone/res/layout-finger/dtmf_twelve_key_dialer.xml b/phone/res/layout-finger/dtmf_twelve_key_dialer.xml
deleted file mode 100644
index b0202e2..0000000
--- a/phone/res/layout-finger/dtmf_twelve_key_dialer.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-<?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.
--->
-
-<!-- Sliding drawer widget containing the in-call DTMF dialpad.
-
- On devices that do *not* use an onscreen InCallTouchUi
- widget, the dialpad is contained within a SlidingDrawer
- (which provides a "handle" that the user must drag open
- to access the dialpad.)
-
- See non_drawer_dialpad.xml for the corresponding layout file
- for devices that *do* use an InCallTouchUi widget.
- -->
-<SlidingDrawer
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/dialer_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:topOffset="5dp"
- android:bottomOffset="7dp"
- android:handle="@+id/dialer_tab"
- android:content="@+id/dtmf_dialer"
- android:allowSingleTap="false"
- android:visibility="gone"
- >
-
- <!-- Drawer handle -->
- <LinearLayout
- android:id="@id/dialer_tab"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="bottom"
- android:focusable="true"
- >
- <ImageView
- android:layout_width="1dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:scaleType="fitXY"
- android:duplicateParentState="true"
- android:src="@drawable/tray_handle_strip"
- />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/dtmfDialpadHandleLabel"
- android:singleLine="true"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textStyle="bold"
- android:shadowDy="1"
- android:shadowRadius="0.9"
- android:shadowColor="#ffffffff"
- android:duplicateParentState="true"
- android:background="@drawable/tray_handle_tab"/>
- <ImageView
- android:layout_width="1dip"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:scaleType="fitXY"
- android:src="@drawable/tray_handle_strip"
- android:duplicateParentState="true"
- />
- </LinearLayout>
-
- <!-- drawer content dialer view -->
- <com.android.phone2.DTMFTwelveKeyDialerView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/dtmf_dialer"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:layout_marginTop="1dip"
- android:background="@color/dtmf_dialer_background">
-
- <!-- Number Display Field, padded for correct text alignment -->
- <EditText android:id="@+id/dtmfDialerField"
- android:layout_width="match_parent"
- android:layout_height="66dp"
- android:layout_marginTop="14dp"
- android:layout_marginBottom="6dp"
- android:layout_marginLeft="3dp"
- android:layout_marginRight="3dp"
- android:paddingRight="16dp"
- android:paddingLeft="16dp"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:textSize="28sp"
- android:freezesText="true"
- android:background="@drawable/btn_dial_textfield_normal_full"
- android:textColor="@color/dtmf_dialer_display_text"
- android:focusableInTouchMode="false"
- android:clickable="false"/>
-
- <!-- Keypad section -->
- <include layout="@layout/dialpad" />
-
- <!-- Dummy element to pad below the dialpad -->
- <View android:layout_height="1dp"
- android:layout_width="match_parent"
- android:layout_weight="1"/>
-
- </com.android.phone2.DTMFTwelveKeyDialerView>
-
-</SlidingDrawer>
diff --git a/phone/res/layout-finger/emergency_dialer.xml b/phone/res/layout-finger/emergency_dialer.xml
deleted file mode 100644
index 90f286e..0000000
--- a/phone/res/layout-finger/emergency_dialer.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2006 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/top"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
->
-
- <!-- Text field above the keypad where the digits are displayed -->
- <!-- TODO: Use a textAppearance to control the display of the number -->
- <EditText android:id="@+id/digits"
- android:layout_width="match_parent"
- android:layout_height="67dip"
- android:gravity="center"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:textSize="33sp"
- android:freezesText="true"
- android:background="@drawable/btn_dial_textfield"
- android:textColor="@color/dialer_button_text"
- android:focusableInTouchMode="false"
- android:layout_weight="0"
- />
-
- <!-- Keypad section -->
- <include layout="@layout/dialpad" />
-
- <!-- Horizontal row of buttons (Voicemail + DialButton + Delete.) -->
- <include layout="@layout/voicemail_dial_delete" />
-
-</LinearLayout>
diff --git a/phone/res/layout-finger/non_drawer_dialpad.xml b/phone/res/layout-finger/non_drawer_dialpad.xml
deleted file mode 100644
index b90480d..0000000
--- a/phone/res/layout-finger/non_drawer_dialpad.xml
+++ /dev/null
@@ -1,152 +0,0 @@
-<?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.
--->
-
-<!-- New style in-call DTMF dialpad, for devices that use the
- InCallTouchUi widget, and thus do NOT use a SlidingDrawer
- to contain the dialpad.
-
- This provides basically the same UI elements as
- dtmf_twelve_key_dialer.xml and dialpad.xml, but in a more
- compact layout, and without the SlidingDrawer container.
- -->
-<com.android.phone2.DTMFTwelveKeyDialerView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/non_drawer_dtmf_dialer"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:layout_marginTop="1dip"
- android:visibility="gone"
- >
-
- <!-- Display of the digits you've typed so far -->
- <EditText
- android:id="@+id/dtmfDialerField"
- android:layout_width="match_parent"
- android:layout_height="32dp"
- android:layout_marginTop="10dp"
- android:layout_marginBottom="5dp"
- android:layout_marginLeft="32dp"
- android:layout_marginRight="32dp"
- android:paddingRight="16dp"
- android:paddingLeft="16dp"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:textSize="24sp"
- android:gravity="center"
- android:freezesText="true"
- android:background="@null"
- android:textColor="@color/dtmf_dialer_display_text"
- android:focusableInTouchMode="false"
- android:clickable="false"/>
-
- <!-- The dialpad itself -->
- <com.android.phone2.ButtonGridLayout
- android:id="@+id/dialpad"
- android:paddingLeft="7dp"
- android:paddingRight="7dp"
- android:paddingTop="6dp"
- android:paddingBottom="6dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- >
- <ImageButton android:id="@+id/one"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_1_no_vm"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/two"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_2"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/three"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_3"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/four"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_4"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/five"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_5"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/six"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_6"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/seven"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_7"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/eight"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_8"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/nine"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_9"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/star"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_star"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/zero"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_0"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/pound"
- android:layout_width="88dp"
- android:layout_height="50dp"
- android:src="@drawable/dial_num_pound"
- android:background="@drawable/btn_dial_green"
- />
- </com.android.phone2.ButtonGridLayout>
-
-</com.android.phone2.DTMFTwelveKeyDialerView>
diff --git a/phone/res/layout-finger/voicemail_dial_delete.xml b/phone/res/layout-finger/voicemail_dial_delete.xml
deleted file mode 100644
index 0d04226..0000000
--- a/phone/res/layout-finger/voicemail_dial_delete.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?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.
--->
-
-<!-- Horizontal row of buttons: Voicemail + DialButton + Delete (aka 'torpedo')
- for the emergency dialer: The voicemail icon is dimmed down to 33%.
-
- In HVGA layouts the vertical padding between the last dialpad row
- and the torpedo is the same as the amount of padding between the dialpad's
- buttons: 12dip.
- However the dialpad's last row already specified 6dip of bottom padding
- so here we pick up the remainder: 6dip.
-
- The enclosing LinearLayout has a layout_weight of 1 which controls
- how much the remaining free space will be placed below the torpedo.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/voicemailAndDialAndDelete"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_weight="1"
- android:paddingTop="6dip"
- android:orientation="horizontal">
-
- <!-- Onscreen "Voicemail" button. The background is hardcoded
- to disable and the foreground has been dimmed down to 30%.
- The width is 75 (from the mocks) + 12 of padding from the
- 9patch, total is 87.
- -->
- <ImageButton android:id="@+id/voicemailButton"
- android:layout_width="87dip"
- android:layout_height="50dip"
- android:layout_gravity="center_vertical|top"
- android:state_enabled="false"
- android:background="@drawable/btn_dial_action_left_disable"
- android:tint="#ff555555"
- android:src="@drawable/ic_dial_action_voice_mail" />
-
- <!-- Onscreen "Dial" button, used on all platforms by
- default. Its usage can be disabled using resources (see
- config.xml.) -->
- <ImageButton android:id="@+id/dialButton"
- android:layout_width="116dip"
- android:layout_height="50dip"
- android:layout_gravity="center_vertical|top"
- android:state_enabled="false"
- android:background="@drawable/btn_dial_action"
- android:src="@drawable/ic_dial_action_call" />
-
- <!-- Onscreen "Backspace/Delete" button
- The width is 75 (from the mocks) + 12 of padding from the
- 9patch, total is 87.
- -->
- <ImageButton android:id="@+id/deleteButton"
- android:layout_width="87dip"
- android:layout_height="50dip"
- android:layout_gravity="center_vertical|top"
- android:state_enabled="false"
- android:background="@drawable/btn_dial_delete"
- android:src="@drawable/ic_dial_action_delete" />
-</LinearLayout>
-
diff --git a/phone/res/layout-land-finger/emergency_dialer.xml b/phone/res/layout-land-finger/emergency_dialer.xml
deleted file mode 100644
index 89fbb76..0000000
--- a/phone/res/layout-land-finger/emergency_dialer.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2006 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/top"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
->
-
- <!-- Text field above the keypad where the digits are displayed -->
- <!-- TODO: Use a textAppearance to control the display of the number -->
- <EditText android:id="@+id/digits"
- android:layout_width="match_parent"
- android:layout_height="66dip"
- android:layout_marginBottom="69dip"
- android:layout_marginTop="1dip"
- android:gravity="center"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:textSize="28sp"
- android:freezesText="true"
- android:background="@drawable/btn_dial_textfield"
- android:textColor="@color/dialer_button_text"
- android:hint="@string/dialerKeyboardHintText"
- />
-
- <!-- Horizontal row of buttons (Voicemail + DialButton + Delete.) -->
- <include layout="@layout/voicemail_dial_delete" />
-
-</LinearLayout>
diff --git a/phone/res/layout-long-finger/dialpad.xml b/phone/res/layout-long-finger/dialpad.xml
deleted file mode 100644
index 510b0b6..0000000
--- a/phone/res/layout-long-finger/dialpad.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<?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.
--->
-
-<!-- Dialpad in the Phone app.
- Tall screen version with taller buttons.
- -->
-
-<com.android.phone2.ButtonGridLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/dialpad"
- android:paddingLeft="7dp"
- android:paddingRight="7dp"
- android:paddingTop="6dp"
- android:paddingBottom="6dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_weight="1"
->
- <ImageButton android:id="@+id/one"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_1_no_vm"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/two"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_2"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/three"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_3"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/four"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_4"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/five"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_5"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/six"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_6"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/seven"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_7"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/eight"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_8"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/nine"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_9"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/star"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_star"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/zero"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_0"
- android:background="@drawable/btn_dial"
- />
-
- <ImageButton android:id="@+id/pound"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_pound"
- android:background="@drawable/btn_dial"
- />
-</com.android.phone2.ButtonGridLayout>
-
diff --git a/phone/res/layout-long-finger/emergency_dialer.xml b/phone/res/layout-long-finger/emergency_dialer.xml
deleted file mode 100644
index bf5b122..0000000
--- a/phone/res/layout-long-finger/emergency_dialer.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/top"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
->
-
- <!-- Text field above the keypad where the digits are displayed -->
- <!-- TODO: Use a textAppearance to control the display of the number -->
- <EditText android:id="@+id/digits"
- android:layout_width="match_parent"
- android:layout_height="74dip"
- android:gravity="center"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:textSize="34sp"
- android:freezesText="true"
- android:background="@drawable/btn_dial_textfield"
- android:textColor="@color/dialer_button_text"
- android:focusableInTouchMode="false"
- android:layout_weight="0"
- />
-
- <!-- Keypad section -->
- <include layout="@layout/dialpad" />
-
- <!-- Horizontal row of buttons (Voicemail + DialButton + Delete.) -->
- <include layout="@layout/voicemail_dial_delete" />
-
-</LinearLayout>
diff --git a/phone/res/layout-long-finger/non_drawer_dialpad.xml b/phone/res/layout-long-finger/non_drawer_dialpad.xml
deleted file mode 100644
index 34a5b93..0000000
--- a/phone/res/layout-long-finger/non_drawer_dialpad.xml
+++ /dev/null
@@ -1,152 +0,0 @@
-<?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.
--->
-
-<!-- New style in-call DTMF dialpad, for devices that use the
- InCallTouchUi widget, and thus do NOT use a SlidingDrawer
- to contain the dialpad.
-
- This provides basically the same UI elements as
- dtmf_twelve_key_dialer.xml and dialpad.xml, but in a more
- compact layout, and without the SlidingDrawer container.
- -->
-<com.android.phone2.DTMFTwelveKeyDialerView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/non_drawer_dtmf_dialer"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:layout_marginTop="1dip"
- android:visibility="gone"
- >
-
- <!-- Display of the digits you've typed so far -->
- <EditText
- android:id="@+id/dtmfDialerField"
- android:layout_width="match_parent"
- android:layout_height="32dp"
- android:layout_marginTop="10dp"
- android:layout_marginBottom="5dp"
- android:layout_marginLeft="32dp"
- android:layout_marginRight="32dp"
- android:paddingRight="16dp"
- android:paddingLeft="16dp"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:textSize="24sp"
- android:gravity="center"
- android:freezesText="true"
- android:background="@null"
- android:textColor="@color/dtmf_dialer_display_text"
- android:focusableInTouchMode="false"
- android:clickable="false"/>
-
- <!-- The dialpad itself -->
- <com.android.phone2.ButtonGridLayout
- android:id="@+id/dialpad"
- android:paddingLeft="7dp"
- android:paddingRight="7dp"
- android:paddingTop="6dp"
- android:paddingBottom="6dp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- >
- <ImageButton android:id="@+id/one"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_1_no_vm"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/two"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_2"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/three"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_3"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/four"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_4"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/five"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_5"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/six"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_6"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/seven"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_7"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/eight"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_8"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/nine"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_9"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/star"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_star"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/zero"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_0"
- android:background="@drawable/btn_dial_green"
- />
-
- <ImageButton android:id="@+id/pound"
- android:layout_width="88dp"
- android:layout_height="58dp"
- android:src="@drawable/dial_num_pound"
- android:background="@drawable/btn_dial_green"
- />
- </com.android.phone2.ButtonGridLayout>
-
-</com.android.phone2.DTMFTwelveKeyDialerView>
diff --git a/phone/res/layout-long-finger/voicemail_dial_delete.xml b/phone/res/layout-long-finger/voicemail_dial_delete.xml
deleted file mode 100644
index 52aa38c..0000000
--- a/phone/res/layout-long-finger/voicemail_dial_delete.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?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.
--->
-
-<!-- Horizontal row of buttons: Voicemail + DialButton + Delete (aka 'torpedo')
- for the emergency dialer: The voicemail icon is dimmed down to 33%.
-
- Tall screen version with taller buttons and more padding between the dialpad:
-
- In long layouts the vertical padding between the last dialpad row
- and the torpedo is twice the amount of padding between the dialpad's
- buttons: 2x12dip = 24dip.
- However the dialpad's last row already specified 6dip of bottom padding
- so here we pick up the remainder: 18dip.
-
- The enclosing LinearLayout has a layout_weight of 1 which controls
- how much the remaining free space will be placed below the torpedo.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/voicemailAndDialAndDelete"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_weight="1"
- android:paddingTop="18dip"
- android:orientation="horizontal">
-
- <!-- Onscreen "Voicemail" button. The background is hardcoded to
- disable and the foreground has been dimmed down to 30%. The
- width is 75 (from the mocks) + 12 of padding from the 9patch,
- total is 87.
- -->
- <ImageButton android:id="@+id/voicemailButton"
- android:layout_width="87dip"
- android:layout_height="58dip"
- android:layout_gravity="center_vertical|top"
- android:state_enabled="false"
- android:background="@drawable/btn_dial_action_left_disable"
- android:tint="#ff555555"
- android:src="@drawable/ic_dial_action_voice_mail" />
-
- <!-- Onscreen "Dial" button, used on all platforms by
- default. Its usage can be disabled using resources (see
- config.xml.) -->
- <ImageButton android:id="@+id/dialButton"
- android:layout_width="116dip"
- android:layout_height="58dip"
- android:layout_gravity="center_vertical|top"
- android:state_enabled="false"
- android:background="@drawable/btn_dial_action"
- android:src="@drawable/ic_dial_action_call" />
-
- <!-- Onscreen "Backspace/Delete" button
- The width is 75 (from the mocks) + 12 of padding from the
- 9patch, total is 87.
- -->
- <ImageButton android:id="@+id/deleteButton"
- android:layout_width="87dip"
- android:layout_height="58dip"
- android:layout_gravity="center_vertical|top"
- android:state_enabled="false"
- android:background="@drawable/btn_dial_delete"
- android:src="@drawable/ic_dial_action_delete" />
-</LinearLayout>
-
diff --git a/phone/res/layout-long-land-finger/emergency_dialer.xml b/phone/res/layout-long-land-finger/emergency_dialer.xml
deleted file mode 100644
index 0ae53bd..0000000
--- a/phone/res/layout-long-land-finger/emergency_dialer.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/top"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
->
-
- <!-- Text field above the keypad where the digits are displayed -->
- <!-- TODO: Use a textAppearance to control the display of the number -->
- <EditText android:id="@+id/digits"
- android:layout_width="match_parent"
- android:layout_height="74dip"
- android:layout_marginBottom="60dip"
- android:layout_marginTop="1dip"
- android:gravity="center"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:textSize="34sp"
- android:freezesText="true"
- android:background="@drawable/btn_dial_textfield"
- android:textColor="@color/dialer_button_text"
- android:hint="@string/dialerKeyboardHintText"
- />
-
- <!-- Horizontal row of buttons (Voicemail + DialButton + Delete.) -->
- <include layout="@layout/voicemail_dial_delete" />
-
-</LinearLayout>
diff --git a/phone/res/layout/adn_list.xml b/phone/res/layout/adn_list.xml
deleted file mode 100644
index 233221a..0000000
--- a/phone/res/layout/adn_list.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/adnRoot"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <ListView android:id="@android:id/list"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
-
- <TextView android:id="@android:id/empty"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:text="@string/simContacts_emptyLoading"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="center"
- />
-</FrameLayout>
diff --git a/phone/res/layout/call_card.xml b/phone/res/layout/call_card.xml
deleted file mode 100644
index f32edb5..0000000
--- a/phone/res/layout/call_card.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- XML resource file for the *children* of a CallCard used in the Phone app.
- The CallCard itself is a subclass of FrameLayout, and its (single)
- child is the LinearLayout found here. (In the CallCard constructor,
- we inflate this file and add it as a child.)
- TODO: consider just <include>ing this directly from incall_screen.xml? -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
-
- <!-- Info about the "secondary" call, displayed at the upper right of
- the screen. (If you're on a call with both lines in use, this
- area displays the status and caller-id info of the call on hold.)
-
- This block of info needs to be Z-ordered underneath the
- primaryCallInfo block, so it's the first child listed here. -->
- <LinearLayout android:id="@+id/secondaryCallInfo"
- android:orientation="vertical"
- android:layout_width="160dp"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:layout_alignParentTop="true"
- android:layout_alignParentRight="true"
- android:layout_marginTop="16dp"
- >
- <TextView android:id="@+id/secondaryCallStatus"
- android:text="@string/onHold"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textSize="14sp"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <TextView android:id="@+id/secondaryCallName"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textSize="14sp"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="-2dip"
- />
-
- <!-- Scaled-down photo, or else a generic placeholder image. -->
- <ImageView android:id="@+id/secondaryCallPhoto"
- android:layout_width="106dp"
- android:layout_height="101dp"
- android:layout_marginTop="-6dip"
- android:background="@drawable/incall_photo_border_med"
- />
- </LinearLayout>
-
- <!-- The main block of info about the "primary" or "active" call -->
- <LinearLayout
- android:id="@+id/primaryCallInfo"
- android:orientation="vertical"
- android:gravity="center_horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentTop="true"
- android:layout_marginTop="18dip"
- >
-
- <!-- "Upper title" at the very top of the CallCard. -->
- <TextView android:id="@+id/upperTitle"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textSize="28sp"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="10dip"
- />
-
- <!-- "Person info": photo / name / number -->
- <include layout="@layout/call_card_person_info" />
-
- </LinearLayout> <!-- End of (1) The main call card -->
-
- <!-- The hint about the Menu button, below all the call info.
- This is only ever shown on devices that actually have a
- menu while in-call, i.e. it's never shown on devices where the
- InCallTouchUi is enabled (see InCallScreen.updateMenuButtonHint().) -->
- <TextView android:id="@+id/menuButtonHint"
- android:text="@string/menuButtonHint"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textSize="18sp"
- android:textColor="?android:attr/textColorSecondary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/primaryCallInfo"
- android:layout_marginTop="22dip"
- android:layout_centerHorizontal="true"
- android:visibility="gone"
- />
-
-</RelativeLayout>
diff --git a/phone/res/layout/call_card_person_info.xml b/phone/res/layout/call_card_person_info.xml
deleted file mode 100644
index e2c9489..0000000
--- a/phone/res/layout/call_card_person_info.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<?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.
--->
-
-<!-- XML resource file for the "person info" area of the main
- CallCard of the in-call UI, which includes the photo and
- name/number TextViews. -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/callCardPersonInfo"
- android:orientation="vertical"
- android:gravity="center_horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
-
- <!-- Photo, with elapsed time widget off to the side. -->
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="172dp"
- >
- <!-- Photo, or else a generic placeholder image. -->
- <!-- Contact photos are generally 96x96 (but may be smaller.)
- The layout size of this ImageView is larger than that, though,
- to account for the incall_photo_border background, which
- adds a white border around the image (and a shadow around
- the white border.) -->
- <ImageView android:id="@+id/photo"
- android:layout_width="172dp"
- android:layout_height="166dp"
- android:layout_centerHorizontal="true"
- android:background="@drawable/incall_photo_border_lg"
- />
-
- <!-- The big "Manage conference" button that we show in place of
- the contact photo during a conference call (but only on
- devices where the in-call touch UI is enabled.) The photo is
- invisible if this button is visible, and vice-versa. -->
- <Button android:id="@+id/manageConferencePhotoButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:text="@string/onscreenManageConferenceText"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorPrimary"
- android:background="@drawable/manage_conference_photo_button"
- android:layout_marginTop="16dip"
- />
-
- <!-- Elapsed time indication for a call in progress. -->
- <TextView android:id="@+id/elapsedTime"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textSize="15sp"
- android:textStyle="bold"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/photo"
- android:layout_alignParentBottom="true"
- android:layout_marginBottom="19dip"
- android:layout_marginLeft="-14dip"
- />
- </RelativeLayout>
-
- <!-- Name (or the phone number, if we don't have a name to display). -->
- <TextView android:id="@+id/name"
- android:gravity="center_horizontal"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textSize="28sp"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="-22dip"
- android:paddingLeft="4dip"
- android:paddingRight="4dip"
- android:paddingBottom="4dip"
- />
-
- <!-- Label (like "Mobile" or "Work", if present) and phone number, side by side -->
- <LinearLayout android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:layout_marginTop="-6dip">
- <TextView android:id="@+id/label"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textSize="18sp"
- android:textColor="?android:attr/textColorSecondary"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingRight="6dip"
- />
- <TextView android:id="@+id/phoneNumber"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textSize="18sp"
- android:textColor="?android:attr/textColorSecondary"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
-
- <!-- Social status -->
- <TextView android:id="@+id/socialStatus"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textSize="16sp"
- android:textColor="?android:attr/textColorSecondary"
- android:maxLines="2"
- android:ellipsize="end"
- android:paddingLeft="10dip"
- android:paddingRight="10dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
-</LinearLayout>
diff --git a/phone/res/layout/caller_in_conference.xml b/phone/res/layout/caller_in_conference.xml
deleted file mode 100644
index 630b44b..0000000
--- a/phone/res/layout/caller_in_conference.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?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:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical">
-
- <!-- List element -->
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical">
-
- <!-- "End" button for this caller -->
- <ImageButton
- android:id="@+id/conferenceCallerDisconnect"
- style="?android:attr/buttonStyleSmall"
- android:src="@drawable/ic_button_conference_end"
- android:layout_width="46dp"
- android:layout_height="46dp"
- android:layout_marginTop="2dp"
- android:layout_marginLeft="6dp"
- android:scaleType="center"/>
-
- <!-- Caller information -->
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="1dp"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:layout_marginLeft="4dp">
-
- <!-- Name or number of this caller -->
- <TextView
- android:id="@+id/conferenceCallerName"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textSize="22sp"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_marginRight="2dp"
- />
-
- <!-- Number of this caller if name is supplied above -->
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="center_vertical">
-
- <!-- Number type -->
- <TextView
- android:id="@+id/conferenceCallerNumberType"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textStyle="bold"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_marginRight="4dp"
- android:layout_marginBottom="2dp"/>
-
- <!-- Number -->
- <TextView
- android:id="@+id/conferenceCallerNumber"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:singleLine="true"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"/>
-
- </LinearLayout> <!-- End of caller number -->
-
- </LinearLayout> <!-- End of caller information -->
-
- <!-- "Separate" (i.e. "go private") button for this caller -->
- <ImageButton
- android:id="@+id/conferenceCallerSeparate"
- style="?android:attr/buttonStyleSmall"
- android:src="@drawable/ic_button_conference_private"
- android:layout_width="46dp"
- android:layout_height="46dp"
- android:layout_marginTop="2dp"
- android:layout_marginRight="6dp"
- android:scaleType="center"/>
-
- </LinearLayout> <!-- End of single list element -->
-
- <!-- List Divider -->
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:src="@android:drawable/divider_horizontal_dark"
- android:scaleType="fitXY"
- android:layout_marginTop="8dp"
- android:layout_marginBottom="8dp"/>
-
-</LinearLayout>
diff --git a/phone/res/layout/change_sim_pin_screen.xml b/phone/res/layout/change_sim_pin_screen.xml
deleted file mode 100644
index dd7d7f3..0000000
--- a/phone/res/layout/change_sim_pin_screen.xml
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scroll"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- style="@style/info_layout"
- android:orientation="vertical">
-
- <TextView
- style="@style/info_label"
- android:text="@string/oldPinLabel"/>
-
- <EditText android:id="@+id/old_pin"
- android:maxLines="1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="none"
- android:password="true"/>
-
- <TextView android:id="@+id/bad_pin"
- android:textSize="12sp"
- android:textColor="#FF888888"
- android:visibility="gone"
- android:text="@string/badPin"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="10dip"
- android:paddingTop="1dip"
- android:paddingRight="5dip"
- android:paddingBottom="1dip"/>
-
- <TextView
- style="@style/info_label"
- android:text="@string/newPinLabel"/>
-
- <EditText android:id="@+id/new_pin1"
- android:maxLines="1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="none"
- android:password="true"/>
-
- <TextView
- style="@style/info_label"
- android:text="@string/confirmPinLabel"/>
-
- <EditText android:id="@+id/new_pin2"
- android:maxLines="1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="none"
- android:password="true"/>
-
- <TextView android:id="@+id/mismatch"
- android:textSize="12sp"
- android:textColor="#FF888888"
- android:visibility="gone"
- android:text="@string/mismatchPin"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="10dip"
- android:paddingTop="1dip"
- android:paddingRight="5dip"
- android:paddingBottom="1dip"/>
-
- <Button android:id="@+id/button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/doneButton"/>
-
- </LinearLayout>
-
- </ScrollView>
-
- <LinearLayout
- android:id="@+id/puk_panel"
- style="@style/info_layout"
- android:visibility="gone"
- android:orientation="vertical">
-
- <TextView
- style="@style/info_label"
- android:text="@string/label_puk2_code"/>
-
- <EditText android:id="@+id/puk_code"
- android:maxLines="1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="none"
- android:password="true"/>
-
- <Button android:id="@+id/puk_submit"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/doneButton"/>
- </LinearLayout>
-</RelativeLayout>
diff --git a/phone/res/layout/delete_fdn_contact_screen.xml b/phone/res/layout/delete_fdn_contact_screen.xml
deleted file mode 100644
index ec8a2e0..0000000
--- a/phone/res/layout/delete_fdn_contact_screen.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <!-- Modified to remove the status field in favor of a toast.-->
-
-</RelativeLayout>
diff --git a/phone/res/layout/dialog_ussd_response.xml b/phone/res/layout/dialog_ussd_response.xml
deleted file mode 100644
index dabce3e..0000000
--- a/phone/res/layout/dialog_ussd_response.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?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.
--->
-
-<!-- Layout used as the dialog's content View for the USSD dialog.
- The message field is actually contained within the AlertDialog's
- scrollView ScrollView, in the contentPanel LinearLayout, so it
- does not need to be replaced here. For now, all we have is the
- input_field EditText to display user data entry. -->
-<EditText xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/input_field"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
diff --git a/phone/res/layout/edit_fdn_contact_screen.xml b/phone/res/layout/edit_fdn_contact_screen.xml
deleted file mode 100644
index 467fb57..0000000
--- a/phone/res/layout/edit_fdn_contact_screen.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?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.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <!-- Keyboard Version -->
- <!-- Modified for greater consistency with the rest of settings. -->
- <LinearLayout android:id="@+id/pinc"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="15dip"
- android:paddingBottom="5dip">
-
- <TextView
- android:layout_width="100dip"
- android:layout_height="wrap_content"
- android:paddingLeft="10dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="@string/name" />
-
- <EditText android:id="@+id/fdn_name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginRight="10dip"
- android:inputType="textPersonName"
- android:imeOptions="actionNext"
- android:singleLine="true"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="words" />
-
- </LinearLayout>
-
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="5dip"
- android:paddingBottom="5dip">
-
- <TextView
- android:layout_width="100dip"
- android:layout_height="wrap_content"
- android:paddingLeft="10dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="@string/number" />
-
- <EditText android:id="@+id/fdn_number"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginRight="10dip"
- android:inputType="phone"
- android:imeOptions="actionDone"
- android:singleLine="true"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="none" />
-
- </LinearLayout>
-
- <Button android:id="@+id/button"
- android:layout_marginTop="8dip"
- android:layout_marginLeft="10dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/save" />
-
- </LinearLayout>
-
-</RelativeLayout>
diff --git a/phone/res/layout/enable_fdn_screen.xml b/phone/res/layout/enable_fdn_screen.xml
deleted file mode 100644
index 9eb6fa5..0000000
--- a/phone/res/layout/enable_fdn_screen.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <!-- Keyboard Version -->
- <LinearLayout android:id="@+id/pinc"
- style="@style/entry_layout"
- android:orientation="vertical"
- android:layout_centerInParent="true">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="@string/enter_pin2_text" />
-
- <EditText android:id="@+id/pin"
- android:layout_width="200dip"
- android:layout_height="wrap_content"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="none"
- android:password="true" />
-
- </LinearLayout>
-
- <TextView android:id="@+id/status"
- android:layout_centerInParent="true"
- android:visibility="gone"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#FF000000" />
-
-</RelativeLayout>
diff --git a/phone/res/layout/enable_sim_pin_screen.xml b/phone/res/layout/enable_sim_pin_screen.xml
deleted file mode 100644
index 417cbd9..0000000
--- a/phone/res/layout/enable_sim_pin_screen.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <!-- Keyboard Version -->
- <LinearLayout android:id="@+id/pinc"
- style="@style/entry_layout"
- android:orientation="vertical"
- android:layout_centerInParent="true">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#FF000000"
- android:text="@string/enter_pin_text" />
-
- <EditText android:id="@+id/pin"
- android:layout_width="200dip"
- android:layout_height="wrap_content"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="none"
- android:password="true" />
-
- </LinearLayout>
-
- <TextView android:id="@+id/status"
- android:layout_centerInParent="true"
- android:visibility="gone"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#FF000000" />
-
-</RelativeLayout>
diff --git a/phone/res/layout/eri_text_layout.xml b/phone/res/layout/eri_text_layout.xml
deleted file mode 100644
index 95133cc..0000000
--- a/phone/res/layout/eri_text_layout.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/widget"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/message"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="12dip"
- android:padding="10dip"
- android:gravity="center"
- style="@style/TextAppearance.EriWidget" />
-
-</LinearLayout>
diff --git a/phone/res/layout/fake_phone_activity.xml b/phone/res/layout/fake_phone_activity.xml
deleted file mode 100644
index 7cb8b86..0000000
--- a/phone/res/layout/fake_phone_activity.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="3dip">
-
- <TextView android:id="@+id/infoText"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/fake_phone_activity_infoText_text" />
-
- <EditText android:id="@+id/phoneNumber"
- android:layout_marginTop="2dip"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="none"
- android:singleLine="true"
- android:text="@string/fake_phone_activity_phoneNumber_text"
- />
-
- <Button android:id="@+id/placeCall"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/fake_phone_activity_placeCall_text">
- <requestFocus />
- </Button>
-</LinearLayout>
diff --git a/phone/res/layout/get_pin2_screen.xml b/phone/res/layout/get_pin2_screen.xml
deleted file mode 100644
index 27073a9..0000000
--- a/phone/res/layout/get_pin2_screen.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?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.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <!-- Keyboard Version -->
- <!-- Modified for greater consistency with the rest of settings. -->
- <LinearLayout android:id="@+id/pinc"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="15dip"
- android:layout_marginLeft="15dip">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingBottom="5dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="@string/enter_pin2_text" />
-
- <EditText android:id="@+id/pin"
- android:layout_width="200dip"
- android:layout_height="wrap_content"
- android:maxLines="1"
- android:scrollHorizontally="true"
- android:autoText="false"
- android:capitalize="none"
- android:password="true" />
-
- </LinearLayout>
-
-</RelativeLayout>
diff --git a/phone/res/layout/incall_screen.xml b/phone/res/layout/incall_screen.xml
deleted file mode 100644
index e291ac1..0000000
--- a/phone/res/layout/incall_screen.xml
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- In-call state of the Phone UI. -->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
-
- <!-- Main frame containing the main set of in-call UI elements. -->
- <FrameLayout android:id="@+id/mainFrame"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingTop="10dip"
- android:paddingLeft="6dip"
- android:paddingRight="6dip"
- >
-
- <!-- (1) inCallPanel: the main set of in-call UI elements.
- We update this view's background to indicate the state of the
- current call; see updateInCallPanelBackground(). -->
- <RelativeLayout android:id="@+id/inCallPanel"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
- <!-- The "Call Card", which displays info about the currently
- active phone call(s) on the device. See call_card.xml. -->
- <com.android.phone2.CallCard android:id="@+id/callCard"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
- </RelativeLayout> <!-- End of inCallPanel -->
-
- <!-- Contains all OTA-related UI elements for CDMA -->
- <ViewStub android:id="@+id/otaCallCardStub"
- android:layout="@layout/otacall_card"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
-
- </FrameLayout> <!-- End of mainFrame -->
-
- <!-- 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. -->
- <ViewStub android:id="@+id/manageConferencePanelStub"
- android:layout="@layout/manage_conference_panel"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
-
- <!-- The sliding drawer control containing the DTMF dialpad.
- Note this isn't a child of mainFrame, which ensures that it'll be
- able to use the full width of the screen. (And a SlidingDrawer
- widget needs to be be a direct child of a FrameLayout anyway.)
- This is used only on devices that do *not* have an onscreen
- InCallTouchUi widget.-->
- <!-- TODO: this should be a ViewStub, and should only get inflated
- on platforms that need it. -->
- <include layout="@layout/dtmf_twelve_key_dialer"/>
-
- <!-- Finally, the "touch lock" overlay, drawn on top of the DTMF
- dialpad (after some delay) to prevent false touches from
- triggering DTMF tones. (When the overlay is up, you need to
- double-tap the "lock" icon to unlock the dialpad.) -->
- <RelativeLayout android:id="@+id/touchLockOverlay"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone"
- android:background="#8000"
- >
- <!-- Layout note: we could use android:layout_centerInParent="true"
- here to center the lock icon exactly in the middle of the screen.
- But it actually looks better to have the lock roughly in the
- middle of the dialpad key area, so instead we position it a
- fixed distance from the bottom of the screen. -->
- <TextView android:id="@+id/touchLockIcon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:layout_alignParentBottom="true"
- android:layout_centerHorizontal="true"
- android:layout_marginBottom="70dip"
- android:text="@string/touchLockText"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:background="@drawable/dialpad_lock"
- />
- </RelativeLayout>
-
- <!-- In-call onscreen touch controls, used on some platforms. -->
- <!-- TODO: if this widget ends up being totally unused on some platforms,
- then this should probably be a ViewStub. -->
- <com.android.phone2.InCallTouchUi
- android:id="@+id/inCallTouchUi"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- />
-
- <!-- Frame where the provider's badge will be
- inflated. The badge must fit in the available height.
- The badge is displayed for 5s on top of the contact's
- picture.
- -->
- <FrameLayout android:id="@+id/inCallProviderOverlay"
- android:background="@drawable/dialog_bg_calling_via"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="88dip"
- android:layout_marginTop="8dip"
- android:layout_gravity="top"
- android:visibility="gone">
- <TextView android:id="@+id/callingVia"
- android:text="@string/calling_via_template"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:gravity="center"
- android:textAppearance="?android:attr/textAppearanceMediumInverse"
- android:textSize="16sp"
- />
- </FrameLayout>
-
-</FrameLayout>
diff --git a/phone/res/layout/incall_touch_ui.xml b/phone/res/layout/incall_touch_ui.xml
deleted file mode 100644
index a85f8cc..0000000
--- a/phone/res/layout/incall_touch_ui.xml
+++ /dev/null
@@ -1,230 +0,0 @@
-<?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.
--->
-
-<!-- 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 FrameLayout with 2 children:
- (1) incomingCallWidget: the UI displayed while an incoming call is ringing
- (2) inCallControls: the widgets visible while a regular call (or calls) is in progress
- Exactly one of these is visible at any given moment.
- -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
-
- <!-- (1) incomingCallWidget: the UI displayed while an incoming call is ringing. -->
- <com.android.internal.widget.SlidingTab
- android:id="@+id/incomingCallWidget"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"
- android:layout_alignParentBottom="true"
- android:layout_marginBottom="80dip"
- />
-
- <!--
- (2) inCallControls: the widgets visible while a regular call
- (or calls) is in progress
- -->
- <RelativeLayout android:id="@+id/inCallControls"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_alignParentTop="true"
- android:visibility="gone"
- >
- <!-- Buttons visible in the upper corners of the screen (in some states). -->
- <!-- These are small round ImageButtons with a text label floating
- off to the side. -->
-
- <!-- "Hold" (upper left) -->
- <!-- (Note "Hold", "Swap" and "Merge" are never available at
- the same time. That's why it's OK for them to be in the
- same position onscreen.) -->
- <LinearLayout android:id="@+id/holdButtonContainer"
- style="@style/InCallRoundButtonContainer"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="10dip"
- android:visibility="gone">
- <ImageButton android:id="@+id/holdButton"
- style="@style/InCallRoundTouchButton"
- android:src="@drawable/ic_in_call_touch_round_hold" />
- <TextView android:id="@+id/holdButtonLabel"
- style="@style/InCallRoundButtonLabel" />
- </LinearLayout>
-
- <!-- "Swap" (upper left) -->
- <!-- This button's label changes to "Manage calls" in some CDMA states. -->
- <LinearLayout android:id="@+id/swapButtonContainer"
- style="@style/InCallRoundButtonContainer"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="10dip"
- android:visibility="gone">
- <ImageButton android:id="@+id/swapButton"
- style="@style/InCallRoundTouchButton"
- android:src="@drawable/ic_in_call_touch_round_swap" />
- <TextView android:id="@+id/swapButtonLabel"
- style="@style/InCallRoundButtonLabel" />
- </LinearLayout>
-
- <!-- CDMA-specific "Merge" (upper left) -->
- <!-- This button is used only on CDMA devices, where we can't use
- the Merge button in the main cluster (because the "Add Call"
- button might need to be enabled at the same time.) -->
- <LinearLayout android:id="@+id/cdmaMergeButtonContainer"
- style="@style/InCallRoundButtonContainer"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="10dip"
- android:visibility="gone">
- <ImageButton android:id="@+id/cdmaMergeButton"
- style="@style/InCallRoundTouchButton"
- android:src="@drawable/ic_in_call_touch_round_merge_call" />
- <TextView
- style="@style/InCallRoundButtonLabel"
- android:text="@string/onscreenMergeCallsText" />
- </LinearLayout>
-
- <!-- DTMF dialpad shown in the upper part of the screen
- (above the main cluster of buttons.) -->
- <!-- TODO: this should be a ViewStub, and should only get inflated
- when first needed. -->
- <include layout="@layout/non_drawer_dialpad"/>
-
- <!-- Main cluster of onscreen buttons on the lower part of the screen. -->
- <LinearLayout android:id="@+id/bottomButtons"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:paddingLeft="4dip"
- android:paddingRight="4dip"
- android:paddingBottom="4dip"
- >
-
- <LinearLayout android:id="@+id/inCallControlsRow1"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <!-- The buttons in the top row all have an icon *and* a
- text label, so we use a <Button> with a "top"
- compound drawable (rather than an ImageButton, which
- can't have a label.) Some buttons set the icon image
- here; others do it from Java if the image depends on
- the current state of the call. -->
-
- <!-- The upper-left button in the main cluster is either
- "Add" or "Merge", depending on the state of the call. -->
- <FrameLayout
- android:layout_width="1dip"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:layout_marginTop="8dip"
- android:layout_marginBottom="8dip"
- android:layout_marginLeft="8dip"
- android:layout_marginRight="8dip"
- >
- <!-- "Add Call" -->
- <Button android:id="@+id/addButton"
- style="@style/InCallTouchButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="0dip"
- android:layout_marginBottom="0dip"
- android:layout_marginLeft="0dip"
- android:layout_marginRight="0dip"
- android:text="@string/onscreenAddCallText"
- android:drawableTop="@drawable/ic_in_call_touch_add_call"
- />
- <!-- "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. -->
- <Button android:id="@+id/mergeButton"
- style="@style/InCallTouchButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="0dip"
- android:layout_marginBottom="0dip"
- android:layout_marginLeft="0dip"
- android:layout_marginRight="0dip"
- android:text="@string/onscreenMergeCallsText"
- android:drawableTop="@drawable/ic_in_call_touch_merge_call"
- />
- </FrameLayout>
-
- <!-- "End call" -->
- <Button android:id="@+id/endButton"
- style="@style/InCallTouchButton"
- android:layout_width="1dip"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:text="@string/onscreenEndCallText"
- android:drawableTop="@drawable/ic_in_call_touch_end"
- android:textColor="@color/incall_endButtonLabel"
- />
-
- <!-- "Dialpad" -->
- <Button android:id="@+id/dialpadButton"
- style="@style/InCallTouchButton"
- android:layout_width="1dip"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:text="@string/onscreenShowDialpadText"
- />
- </LinearLayout>
- <LinearLayout android:id="@+id/inCallControlsRow2"
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
- <!-- "Bluetooth" -->
- <ToggleButton android:id="@+id/bluetoothButton"
- style="@style/InCallTouchToggleButton"
- android:layout_width="1dip"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:textOn="@string/onscreenBluetoothText"
- android:textOff="@string/onscreenBluetoothText"
- />
- <!-- "Mute" -->
- <ToggleButton android:id="@+id/muteButton"
- style="@style/InCallTouchToggleButton"
- android:layout_width="1dip"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:textOn="@string/onscreenMuteText"
- android:textOff="@string/onscreenMuteText"
- />
- <!-- "Speaker" -->
- <ToggleButton android:id="@+id/speakerButton"
- style="@style/InCallTouchToggleButton"
- android:layout_width="1dip"
- android:layout_weight="1"
- android:layout_height="wrap_content"
- android:textOn="@string/onscreenSpeakerText"
- android:textOff="@string/onscreenSpeakerText"
- />
- </LinearLayout>
-
- </LinearLayout>
-
- </RelativeLayout>
-
-</RelativeLayout>
diff --git a/phone/res/layout/manage_conference_panel.xml b/phone/res/layout/manage_conference_panel.xml
deleted file mode 100644
index 8db0c94..0000000
--- a/phone/res/layout/manage_conference_panel.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?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. -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/manageConferencePanel"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone"
- >
- <!-- This original header (with timer) is currently not being used,
- but may be of use in the future. -->
- <!-- Header, including chronometer and List divider -->
- <Chronometer
- android:id="@+id/manageConferencePanelHeader"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:textSize="24sp"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:layout_alignParentTop="true"
- android:layout_marginTop="5dip"
- android:layout_marginBottom="5dip"
- android:visibility="gone"/>
-
- <ImageView
- android:id="@+id/manageConferencePanelDivider"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:src="@android:drawable/divider_horizontal_dark"
- android:scaleType="fitXY"
- android:layout_below="@id/manageConferencePanelHeader"
- android:visibility="gone"/>
- <!-- End of the original header -->
-
- <!-- New header, based on the list separator in Contacts. -->
- <LinearLayout android:id="@+id/manageConferenceHeader"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:background="@android:drawable/dark_header"
- android:textColor="?android:attr/textColorSecondary"
- android:textStyle="bold"
- android:textSize="14sp"
- android:paddingLeft="8dip"
- android:text="@string/menu_manageConference"/>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="1dip"
- android:background="?android:attr/listDivider"/>
-
- </LinearLayout> <!-- End of new header -->
-
- <!-- The scrollview wrapper for the list of callers on
- the conference call (in case the list gets too long). -->
- <ScrollView
- android:id="@+id/conferenceList"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/manageConferenceHeader"
- android:layout_marginTop="8dip"
- android:layout_marginBottom="60dip">
-
- <!-- The actual list of callers; this embedded LinearLayout
- required since scrollview only supports a single child. -->
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <!-- A conference can have at most MAX_CALLERS_IN_CONFERENCE (= 5) callers,
- so just define all those UI elements here. -->
-
- <!-- Caller 0 -->
- <include
- layout="@layout/caller_in_conference"
- android:id="@+id/caller0"/>
-
- <!-- Caller 1 -->
- <include
- layout="@layout/caller_in_conference"
- android:id="@+id/caller1"/>
-
- <!-- Caller 2 -->
- <include
- layout="@layout/caller_in_conference"
- android:id="@+id/caller2"/>
-
- <!-- Caller 3 -->
- <include
- layout="@layout/caller_in_conference"
- android:id="@+id/caller3"/>
-
- <!-- Caller 4 -->
- <include
- layout="@layout/caller_in_conference"
- android:id="@+id/caller4"/>
-
- </LinearLayout> <!-- End of "list of callers on conference call" -->
-
- </ScrollView> <!-- End of scrolling list wrapper for the linear layout -->
-
- <!-- The grey footer, background behind the "Back to call" button -->
- <View
- android:layout_width="match_parent"
- android:layout_height="54dip"
- android:gravity="center_vertical"
- android:layout_alignParentBottom="true"
- android:background="@android:drawable/dark_header"/>
-
- <!-- The "Back to call" button -->
- <Button android:id="@+id/manage_done"
- style="?android:attr/buttonStyleSmall"
- android:text="@string/caller_manage_manage_done_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_centerHorizontal="true"
- android:paddingTop="14dip"
- android:paddingBottom="18dip"
- android:paddingLeft="42dip"
- android:paddingRight="42dip"/>
-
-</RelativeLayout>
diff --git a/phone/res/layout/ongoing_call_notification.xml b/phone/res/layout/ongoing_call_notification.xml
deleted file mode 100644
index a7302d3..0000000
--- a/phone/res/layout/ongoing_call_notification.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?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.
--->
-
-<!-- Layout file for the custom "expanded view" used by the ongoing call
- Notification; see NotificationMgr.updateInCallNotification(). -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:baselineAligned="false"
- android:gravity="center_vertical"
- android:layout_width="match_parent"
- android:layout_height="65sp"
- android:background="@android:drawable/status_bar_item_background"
- >
-
- <ImageView android:id="@+id/icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingLeft="4dip"
- android:layout_marginRight="6dip" />
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- >
- <!-- The appearance of these 2 lines of text matches the other
- kinds of notifications (see status_bar_latest_event.xml).
- TODO: There should probably be common styles for these, though. -->
- <Chronometer android:id="@+id/text1"
- android:textStyle="bold"
- android:textSize="18sp"
- android:textColor="#ff000000"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- />
- <TextView android:id="@+id/text2"
- android:textSize="14sp"
- android:textColor="#ff000000"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- />
- </LinearLayout>
-
-</LinearLayout>
diff --git a/phone/res/layout/otacall_card.xml b/phone/res/layout/otacall_card.xml
deleted file mode 100644
index 246c042..0000000
--- a/phone/res/layout/otacall_card.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Outer layout for all OTA elements. This contains:
- (1) Certain call card elements used for the other various OTA screens
- (2) Activate/Cancel buttons specific to the OTA Activate screen
- (3) Buttons used on the listen/progress screens
- (4) Button used for the final success/failure screen -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:gravity="center_horizontal"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- >
-
- <!-- (1) The ota call card shared widgets -->
- <ScrollView android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <LinearLayout android:id="@+id/otaBase"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
-
- <TextView android:id="@+id/otaTitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textAppearance="@style/ccOtaWizardTitle"
- android:text="@string/ota_title_activate"
- />
-
- <View
- android:layout_width="wrap_content"
- android:layout_height="1dip"
- android:layout_gravity="center"
- android:background="@drawable/green_divider"
- android:layout_marginTop="14dip"
- android:focusable="false"
- android:clickable="false"
- />
-
- <TextView android:id="@+id/otaActivate"
- android:layout_marginTop="@dimen/otaactivate_layout_marginTop"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textAppearance="@style/ccOtaTextPrimary"
- android:visibility="gone"
- android:text="@string/ota_touch_activate"
- />
-
- <ScrollView android:id="@+id/otaListenProgressContainer"
- android:layout_marginTop="@dimen/otalistenprogress_layout_marginTop"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone">
- <TextView android:id="@+id/otaListenProgress"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textAppearance="@style/ccOtaTextPrimary"
- />
- </ScrollView>
-
- <ProgressBar android:id="@+android:id/progress_large"
- style="?android:attr/progressBarStyleHorizontal"
- android:layout_marginTop="20dip"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone"/>
-
- <TextView android:id="@+id/otaSuccessFailStatus"
- android:gravity="left"
- android:layout_marginTop="@dimen/otasuccessfail_layout_marginTop"
- android:layout_marginLeft="5dip"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textAppearance="@style/ccOtaTextPrimary"
- android:visibility="gone"
- />
-
- <!-- DTMF Dialer section -->
- <com.android.phone2.DTMFTwelveKeyDialerView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/otaDtmfDialer"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginTop="1dip"
- android:visibility="gone" >
-
- <!-- Note there's no "dtmfDialerField" EditText here;
- in the OTA UI there's no visible "digits" display
- attached to the dialpad. -->
-
- <!-- Keypad section -->
- <include layout="@layout/dialpad" />
-
- </com.android.phone2.DTMFTwelveKeyDialerView>
-
- </LinearLayout>
-
- </ScrollView>
-
- <View
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
-
- <!-- "Speaker" button -->
- <ToggleButton android:id="@+id/otaSpeakerButton"
- android:layout_gravity="center"
- android:textOn="@string/ota_speaker"
- android:textOff="@string/ota_speaker"
- style="@style/ccOtaButton" />
-
- <!-- (2) Activate/cancel buttons -->
- <RelativeLayout android:id="@+id/callCardOtaActivate"
- android:visibility="gone"
- style="@style/ccOtaButtonBar" >
-
- <!-- "Activate" button -->
- <Button android:id="@+id/otaActivateButton"
- android:text="@string/ota_activate"
- style="@style/ccOtaNextButton" />
-
- <!-- "Skip" button --> <!-- TODO: borrowing another button's label for now because I missed the localization deadline for adding a @string/ota_skip -->
- <Button android:id="@+id/otaSkipButton"
- android:text="@string/ota_skip_activation_dialog_skip_label"
- style="@style/ccOtaSkipButton" />
-
- </RelativeLayout>
-
- <!-- (3) OTA listen/progress buttons -->
- <RelativeLayout android:id="@+id/callCardOtaListenProgress"
- android:visibility="gone"
- style="@style/ccOtaButtonBar" >
-
- <!-- "End" button -->
- <Button android:id="@+id/otaEndButton"
- android:text="@string/ota_call_end"
- style="@style/ccOtaSkipButton" />
- </RelativeLayout>
-
- <!-- (4) OTA Success/Failure button -->
- <RelativeLayout android:id="@+id/callCardOtaFailOrSuccessful"
- android:visibility="gone"
- style="@style/ccOtaButtonBar" >
-
- <!-- "Next" button -->
- <Button android:id="@+id/otaNextButton"
- android:text="@string/ota_next"
- style="@style/ccOtaNextButton" />
-
- <!-- "Try Again" button -->
- <Button android:id="@+id/otaTryAgainButton"
- android:text="@string/ota_try_again"
- style="@style/ccOtaSkipButton" />
- </RelativeLayout>
-</LinearLayout>
diff --git a/phone/res/layout/pref_dialog_editphonenumber.xml b/phone/res/layout/pref_dialog_editphonenumber.xml
deleted file mode 100644
index fc25d8c..0000000
--- a/phone/res/layout/pref_dialog_editphonenumber.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2006 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Layout used as the dialog's content View for EditPhoneNumberPreference. -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="5dip"
- android:orientation="vertical">
-
- <TextView android:id="@+android:id/message"
- style="?android:attr/textAppearanceMedium"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="?android:attr/textColorPrimary"
- android:paddingLeft="10dip"
- android:paddingRight="10dip"/>
-
- <LinearLayout
- android:id="@+id/number_field"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1.0"
- android:addStatesFromChildren="true"
- android:gravity="center_vertical"
- android:baselineAligned="false"
- android:paddingLeft="10dip"
- android:paddingRight="10dip">
-
- <!-- The EditText field in the dialog is now created programmatically.
- We're replacing the field in this layout with a container to
- attach the EditText field. -->
- <LinearLayout android:id="@+id/edit_container"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:layout_height="wrap_content"/>
-
- <ImageButton android:id="@+id/select_contact"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="10dip"
- android:src="@drawable/ic_button_contacts" />
- </LinearLayout>
-
-</LinearLayout>
diff --git a/phone/res/layout/pref_dialog_editpin.xml b/phone/res/layout/pref_dialog_editpin.xml
deleted file mode 100644
index a5376a8..0000000
--- a/phone/res/layout/pref_dialog_editpin.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?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.
--->
-
-<!-- Layout used as the dialog's content View for EditTextPreference. -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@*android:id/edittext_container"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="5dip"
- android:orientation="vertical">
-
- <TextView android:id="@+android:id/message"
- style="?android:attr/textAppearanceSmall"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="?android:attr/textColorSecondary" />
-
-</LinearLayout>
diff --git a/phone/res/layout/sim_import_list_entry.xml b/phone/res/layout/sim_import_list_entry.xml
deleted file mode 100644
index 9f238d8..0000000
--- a/phone/res/layout/sim_import_list_entry.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/text1"
- android:layout_width="match_parent"
- android:layout_height="?android:attr/listPreferredItemHeight"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:drawableLeft="@android:drawable/ic_input_add"
- android:gravity="center_vertical"
-/>
diff --git a/phone/res/layout/sim_missing.xml b/phone/res/layout/sim_missing.xml
deleted file mode 100644
index 183a1f8..0000000
--- a/phone/res/layout/sim_missing.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/simMissingPane"
- android:paddingLeft="20dip"
- android:paddingRight="20dip"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true">
-
- <TextView android:id="@+id/msg"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="#FFFFFFFF"
- android:text="@string/sim_missing_msg_text" />
-
- <Button android:id="@+id/continueView"
- android:textSize="16sp"
- android:textColor="#FF000000"
- android:layout_marginTop="8dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/msg"
- android:layout_centerHorizontal="true"
- android:paddingLeft="10dip"
- android:paddingRight="10dip"
- android:text="@string/sim_missing_continueView_text" />
-
- </RelativeLayout>
-</RelativeLayout>
diff --git a/phone/res/layout/sim_ndp.xml b/phone/res/layout/sim_ndp.xml
deleted file mode 100644
index 64b3373..0000000
--- a/phone/res/layout/sim_ndp.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<!-- Layout for the Phone app's IccNetworkDepersonalizationPanel. -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingLeft="20dip"
- android:paddingRight="20dip">
-
- <LinearLayout
- android:id="@+id/entry_panel"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true">
-
- <TextView
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/label_ndp"/>
-
- <EditText android:id="@+id/pin_entry"
- android:inputType="textPassword"
- android:imeOptions="actionDone"
- android:layout_marginTop="8dip"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scrollHorizontally="true" />
-
- <Button android:id="@+id/ndp_unlock"
- android:layout_gravity="center_horizontal"
- android:text="@string/sim_ndp_unlock_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingLeft="20dip"
- android:paddingRight="20dip"
- android:layout_centerHorizontal="true" />
-
- <!-- Dismiss button. (Not present in some products; see
- sim_network_unlock_allow_dismiss in config.xml.) -->
- <Button android:id="@+id/ndp_dismiss"
- android:layout_gravity="center_horizontal"
- android:text="@string/sim_ndp_dismiss_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingLeft="20dip"
- android:paddingRight="20dip"
- android:layout_centerHorizontal="true" />
-
- </LinearLayout>
-
- <LinearLayout android:id="@+id/status_panel"
- android:orientation="vertical"
- android:visibility="gone"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:colorBackground="#80808080"
- android:panelColorBackground="#fff">
-
- <TextView android:id="@+id/status_text"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textStyle="bold"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:colorBackground="#80808080"
- android:text="@string/requesting_unlock" />
- </LinearLayout>
-
-</RelativeLayout>
diff --git a/phone/res/layout/sim_unlock.xml b/phone/res/layout/sim_unlock.xml
deleted file mode 100644
index 3e1c609..0000000
--- a/phone/res/layout/sim_unlock.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingLeft="20dip"
- android:paddingRight="20dip">
-
- <LinearLayout
- android:id="@+id/simPINPane"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true">
-
- <TextView
- android:id="@+id/failure"
- android:visibility="gone"
- android:textSize="20sp"
- android:textStyle="bold"
- android:textColor="#FFFFFFFF"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <TextView
- android:id="@+id/label"
- android:textSize="18sp"
- android:textColor="#FFFFFFFF"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
-
- <EditText android:id="@+id/entry"
- android:textSize="18sp"
- android:textColor="#FF000000"
- android:maxLines="1"
- android:layout_marginTop="8dip"
- android:capitalize="none"
- android:autoText="false"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scrollHorizontally="true"
- android:password="true" />
-
- <RelativeLayout
- android:layout_marginTop="10dip"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" >
-
- <Button android:id="@+id/unlock"
- android:textSize="16sp"
- android:textColor="#FF000000"
- android:gravity="center_horizontal"
- android:text="@string/sim_unlock_unlock_text"
- android:layout_width="150dip"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true" />
-
- <Button android:id="@+id/dismiss"
- android:textSize="16sp"
- android:textColor="#FF000000"
- android:gravity="center_horizontal"
- android:text="@string/sim_unlock_dismiss_text"
- android:layout_marginTop="3dip"
- android:layout_width="150dip"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_below="@id/unlock"/>
- </RelativeLayout>
-
- </LinearLayout>
-
- <LinearLayout android:id="@+id/progress"
- android:orientation="vertical"
- android:visibility="gone"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true">
-
- <TextView android:id="@+id/status"
- android:textSize="18sp"
- android:textStyle="bold"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="#FFFFFFFF"
- android:text="@string/sim_unlock_status_text" />
- </LinearLayout>
-</RelativeLayout>
diff --git a/phone/res/values-cs/strings.xml b/phone/res/values-cs/strings.xml
deleted file mode 100644
index 0d33459..0000000
--- a/phone/res/values-cs/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Kontakty"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Oblíbené"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Vytáčení"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Tísňové vytáčení"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Hovory"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Seznam povolených telefonních čísel"</string>
- <string name="unknown" msgid="6878797917991465859">"Neznámý volající"</string>
- <string name="private_num" msgid="6713286113000232309">"Soukromé číslo"</string>
- <string name="payphone" msgid="1931775086311769314">"Veřejný telefon"</string>
- <string name="onHold" msgid="9035493194749959955">"Přidržený hovor"</string>
- <string name="ongoing" msgid="8300874342848721367">"Aktuální hovor"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Linka je obsazená."</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Síť je zaneprázdněna."</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Není signál."</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Byl dosažen limit ACM."</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Rádio je vypnuto"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Karta SIM chybí nebo nefunguje."</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Nepokrytá oblast."</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Odchozí hovory jsou omezeny na povolená telefonní čísla."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Pokud je zapnuto blokování hovorů, nelze provádět odchozí hovory."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Všechny hovory jsou omezeny řízením přístupu."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Tísňová volání jsou omezena řízením přístupu."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Běžné hovory jsou omezeny řízením přístupu."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: Telefon uzamčen do dalšího cyklu nabíjení."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: Hovor přerušen."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: Hovor přerušen."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: přeuspořádání."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: Odmítnutí možnosti služby."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: Pořadí opakování."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: Chyba přístupu."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: Zabráněno."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Jsou možná jen tísňová volání."</string>
- <string name="confCall" msgid="1904840547188336828">"Konferenční hovor"</string>
- <string name="call_lost" msgid="317670617901479594">"Hovor byl ztracen."</string>
- <string name="retry" msgid="8462986804300767852">"Zkusit znovu"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Hovor byl ztracen"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"Kód MMI byl spuštěn"</string>
- <string name="ussdRunning" msgid="485588686340541690">"Kód USSD je spuštěn..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"Kód MMI byl zrušen"</string>
- <string name="cancel" msgid="5044513931633602634">"Zrušit"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Hlasitě"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Ztlumit"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Přidržet"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Ukončit"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Přepnout"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Spojit"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Přidat hovor"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Spravovat konferenční hovor"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Zobrazit číselník"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Skrýt číselník"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Přidržet aktuální hovor"\n"a odpovědět"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Ukončit aktuální hovor"\n"a odpovědět"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Stisknutím tlačítka Menu otevřete možnosti hovoru."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Stisknutím tlačítka Menu otevřete možnosti hovorů • Číslo vytočíte pomocí klávesnice"</string>
- <string name="menu_answer" msgid="116686205042231098">"Přijmout"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorovat"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Odeslat následující tóny?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Odesílání tónů"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Odeslat"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Ano"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Ne"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Nahradit zástupný znak znakem"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Chybí číslo hlasové schránky"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Na kartě SIM není uloženo žádné číslo hlasové schránky."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Přidat číslo"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Načítání..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Kartu SIM odblokujete zadáním kódu PIN:"</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"Karta SIM byla odblokována."</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Nový kód PIN karty SIM"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Potvrďte nový kód PIN karty SIM"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Zadané kódy PIN karty SIM se neshodují. Zkuste to znovu."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Kartu SIM odblokujete zadáním kódu PUK"</string>
- <string name="badPuk" msgid="3213017898690275965">"Zadaný kód PUK je nesprávný."</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Pokračovat"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"Karta SIM byla odblokována. Telefon se odblokovává..."</string>
- <string name="label_ndp" msgid="780479633159517250">"Kód PIN odblokování sítě pro kartu SIM"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Odemknout"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Zavřít"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Žádost o odblokování sítě..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Požadavek na odblokování sítě se nezdařil."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Síť byla úspěšně odblokována."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Nastavení hovorů GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Nastavení hovorů CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Názvy přístupových bodů"</string>
- <string name="settings_label" msgid="3876743539816984008">"Nastavení sítě"</string>
- <string name="voicemail" msgid="8693759337917898954">"Hlasová schránka"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"HS:"</string>
- <string name="networks" msgid="8873030692174541976">"Síťoví operátoři"</string>
- <string name="call_settings" msgid="6112441768261754562">"Nastavení hovorů"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Další nastavení"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Další nastavení hovorů, pouze GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Další nastavení hovorů CDMA"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Další nastavení hovorů, pouze CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Nastavení síťové služby"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"ID volajícího"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Číslo je v odchozích hovorech skryto"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Číslo je v odchozích hovorech zobrazeno"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Zobrazení čísla v odchozích hovorech se bude řídit výchozím nastavením operátora"</string>
- <string name="labelCW" msgid="6120513814915920200">"Další hovor na lince"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Oznamuje příchozí hovory i při probíhajícím hovoru"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Oznamovat příchozí hovory i při probíhajícím hovoru"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Nastavení přesměrování hovorů"</string>
- <string name="labelCF" msgid="2574386948026924737">"Přesměrování hovorů"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Přesměrovat vždy"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Vždy používat toto číslo"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Všechny hovory budou přesměrovány"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Všechny hovory budou přesměrovány na {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Číslo není k dispozici"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Vypnuto"</string>
- <string name="labelCFB" msgid="218938523102207587">"Přesměrovat, je-li obsazeno"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Číslo při obsazené lince"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Hovory budou přesměrovány na {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Vypnuto"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Váš operátor neumožňuje deaktivaci přesměrování, je-li telefon obsazen."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Přesměrovat – nečinnost"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Číslo při nečinnosti"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Hovory budou přesměrovány na {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Vypnuto"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Váš operátor neumožňuje deaktivaci přesměrování, jestliže telefon neodpovídá."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Přesměrovat – nedostupnost"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Číslo při nedostupnosti"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Hovory budou přesměrovány na {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Vypnuto"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Váš operátor neumožňuje deaktivaci přesměrování, je-li telefon nedostupný."</string>
- <string name="updating_title" msgid="6146755386174019046">"Nastavení hovorů"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Chyba nastavení hovorů"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Načítání nastavení..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"Probíhá aktualizace nastavení..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Probíhá vrácení předchozích nastavení…"</string>
- <string name="response_error" msgid="6674110501330139405">"Neočekávaná odpověď sítě."</string>
- <string name="exception_error" msgid="7027667130619518211">"Došlo k chybě sítě nebo karty SIM."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Před zobrazením nastavení zapněte rádio."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Povolit"</string>
- <string name="disable" msgid="7274240979164762320">"Vypnout"</string>
- <string name="change_num" msgid="239476305819844391">"Aktualizovat"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Výchozí nastavení sítě"</item>
- <item msgid="7876195870037833661">"Skrýt číslo"</item>
- <item msgid="1108394741608734023">"Zobrazit číslo"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Uložit číslo hlasové schránky"</string>
- <string name="vm_changed" msgid="380744030726254139">"Číslo hlasové schránky bylo změněno."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Změna čísla hlasové schránky se nezdařila."\n"Pokud problém přetrvává, obraťte se na svého operátora."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Změna čísla pro přesměrování se nezdařila."\n"Pokud problém přetrvává, obraťte se na svého operátora."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Načtení a uložení aktuálního nastavení čísla pro přesměrování se nezdařilo."\n"Chcete přesto přepnout na nového poskytovatele?"</string>
- <string name="no_change" msgid="3186040086622435212">"Nebyly provedeny žádné změny."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Zvolte službu hlasové schránky"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Můj operátor"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Nastavení mobilní sítě"</string>
- <string name="label_available" msgid="1181658289009300430">"Dostupné sítě"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Vyhledávání..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Žádná síť nebyla nalezena."</string>
- <string name="search_networks" msgid="1601136049300882441">"Vyhledávání sítí"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Při vyhledávání sítí došlo k chybě."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Probíhá registrace v síti <xliff:g id="NETWORK">%s</xliff:g>..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"Vaše karta SIM nepovoluje připojení k této síti."</string>
- <string name="connect_later" msgid="500090982903469816">"K této síti se nyní nelze připojit. Zkuste to znovu později."</string>
- <string name="registration_done" msgid="495135664535876612">"Přihlášení k síti bylo úspěšné."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Umožňuje vybrat síťového operátora"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Vyhledá všechny dostupné sítě"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Automatická volba"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Upřednostňovaná síť je volena automaticky"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Automatická registrace..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Režim sítě"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Změnit provozní režim sítě"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Upřednostňovaný režim sítě"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Globální"</item>
- <item msgid="3273348576277144124">"Pouze EvDo"</item>
- <item msgid="454610224530856274">"CDMA bez EvDo"</item>
- <item msgid="8928247118825616081">"CDMA / EvDo – automaticky"</item>
- <item msgid="8595462903294812666">"GSM / WCDMA – automaticky"</item>
- <item msgid="5189164180446264504">"Pouze WCDMA"</item>
- <item msgid="5714714953966979187">"Pouze GSM"</item>
- <item msgid="4775796025725908913">"GSM / WCDMA – upřednostňováno"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Datové přenosy aktivovány"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Aktivuje datový přístup prostřednictvím mobilní sítě"</string>
- <string name="roaming" msgid="8871412572928323707">"Datové služby při roamingu"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Datové služby se mohou připojovat při roamingu"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Datové služby se mohou připojovat při roamingu"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Připojení datových služeb bylo přerušeno, protože jste opustili domovskou síť a datové služby při roamingu máte vypnuty."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Opravdu chcete povolit datové služby při roamingu? Vystavujete se nebezpečí vysokých poplatků."</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Možnosti GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Možnosti CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Využití dat"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Zásady operátora pro data"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Data využitá v aktuálním období"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Období využití dat"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Zásady pro přenosovou rychlost"</string>
- <string name="throttle_help" msgid="243651091785169900">"Další informace"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) z limitu <xliff:g id="USED_2">%3$s</xliff:g> pro období"\n"Počet dní do začátku dalšího období: <xliff:g id="USED_3">%4$d</xliff:g> (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) z limitu <xliff:g id="USED_2">%3$s</xliff:g> pro období"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Byl překročen limit <xliff:g id="USED_0">%1$s</xliff:g>"\n"Přenosová rychlost byla snížena na <xliff:g id="USED_1">%2$d</xliff:g> kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"Uplynulo <xliff:g id="USED_0">%1$d</xliff:g>٪ cyklu"\n"Počet dní do začátku dalšího období: <xliff:g id="USED_1">%2$d</xliff:g> (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"V případě překročení limitu využití dat se přenosová rychlost sníží na <xliff:g id="USED">%1$d</xliff:g> kb/s"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Další informace o zásadách využití dat v mobilní síti vašeho mobilního operátora"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"SMS Cell Broadcast"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"SMS Cell Broadcast"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"SMS Cell Broadcast"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"SMS Cell Broadcast povoleny"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"SMS Cell Broadcast zakázány"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Nastavení SMS Cell Broadcast"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Tísňové vysílání"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Tísňové vysílání povoleno"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Tísňové vysílání zakázáno"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Administrativní"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Administrativní povoleny"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Administrativní zakázány"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Údržba"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Údržba povolena"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Údržba zakázána"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Obecné zprávy"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Obchodní a finanční zprávy"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Sportovní zprávy"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Zprávy z kultury"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Místní"</string>
- <string name="local_enable" msgid="6370463247609136359">"Místní zprávy povoleny"</string>
- <string name="local_disable" msgid="4405691986943795798">"Místní zprávy zakázány"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regionální"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Regionální zprávy povoleny"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Regionální zprávy zakázány"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Národní"</string>
- <string name="national_enable" msgid="1172443648912246952">"Národní zprávy povoleny"</string>
- <string name="national_disable" msgid="326018148178601166">"Národní zprávy zakázány"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Mezinárodní"</string>
- <string name="international_enable" msgid="5855356769925044927">"Mezinárodní zprávy povoleny"</string>
- <string name="international_disable" msgid="2850648591041088931">"Mezinárodní zprávy zakázány"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Jazyk"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Vyberte jazyk zpráv"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"angličtina"</item>
- <item msgid="1151988412809572526">"francouzština"</item>
- <item msgid="577840534704312665">"španělština"</item>
- <item msgid="8385712091143148180">"japonština"</item>
- <item msgid="1858401628368130638">"korejština"</item>
- <item msgid="1933212028684529632">"čínština"</item>
- <item msgid="1908428006803639064">"hebrejština"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Jazyky"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Místní počasí"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Místní počasí povoleno"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Místní počasí zakázáno"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Oblastní přehledy dopravy"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Oblastní přehledy dopravy povoleny"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Oblastní přehledy dopravy zakázány"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Místní přílety a odlety"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Místní přílety a odlety povoleny"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Místní přílety a odlety zakázány"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restaurace"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restaurace povoleny"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restaurace zakázány"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Ubytování"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Ubytování povolena"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Ubytování zakázána"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Adresář prodejců"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Adresář prodejců povolen"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Adresář prodejců zakázán"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Reklamy"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Reklamy povoleny"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Reklamy zakázány"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Zprávy z akciových trhů"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Zprávy z akciových trhů zakázány"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Zprávy z akciových trhů zakázány"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Pracovní příležitosti"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Pracovní příležitosti povoleny"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Pracovní příležitosti zakázány"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Lékařství, zdraví a nemocnice"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Lékařství, zdraví a nemocnice povoleny"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Lékařství, zdraví a nemocnice zakázány"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Technologické zprávy"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Technologické zprávy povoleny"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Technologické zprávy zakázány"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Více kategorií"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Více kategorií povoleno"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Více kategorií zakázáno"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Nastavení sítě GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Dosud neimplementováno"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Nastavení sítě GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (automatický režim)"</item>
- <item msgid="8912042051809329533">"Pouze WCDMA"</item>
- <item msgid="8776934131146642662">"Pouze GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (preferováno WCDMA)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Používat pouze sítě 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Šetří baterii"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Výběr systému"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Změnit režim roamingu CDMA"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Výběr systému"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Pouze plocha"</item>
- <item msgid="1205664026446156265">"Automaticky"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Režim roamingu CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Změnit režim roamingu CDMA"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"Režim roamingu CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Pouze domovské sítě"</item>
- <item msgid="8174642753290624634">"Partnerské sítě"</item>
- <item msgid="2241951431403168661">"Jakákoli síť"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Nastavení sítě CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Dosud neimplementováno"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Nastavení sítě CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Pouze CDMA"</item>
- <item msgid="2683555124647197574">"Pouze EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"TEST odběru CDMA"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Přepnout mezi RUIM/SIM a NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"odběr"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Povolená telefonní čísla"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Seznam povolených telefonních čísel"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Aktivace povolených telefonních čísel"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Funkce Povolená telefonní čísla je zapnuta"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Funkce Povolená telefonní čísla je vypnuta"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Zapnout funkci Povolená telefonní čísla"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Vypnout funkci Povolená telefonní čísla"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Změna kódu PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Vypnout funkci Povolená telefonní čísla"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Zapnout funkci Povolená telefonní čísla"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Umožňuje spravovat povolená telefonní čísla"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Umožňuje změnit kód PIN pro přístup k povoleným telefonním číslům"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Správa telefonního seznamu"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Ochrana soukromí hlasové pošty"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Povolit režim vylepšené ochrany soukromí"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Režim TTY"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Povolit režim TTY"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Režim TTY"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Nastavit režim TTY"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Automaticky zkusit znovu"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Aktivovat režim Automaticky zkusit znovu"</string>
- <string name="menu_add" msgid="1882023737425114762">"Přidat kontakt"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Upravit kontakt"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Smazat kontakt"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Zadat kód PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Jméno"</string>
- <string name="number" msgid="7905950798349903858">"Číslo"</string>
- <string name="save" msgid="4094274636321939086">"Uložit"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Přidat povolené telefonní číslo"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Přidávání povoleného telefonního čísla..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Povolené telefonní číslo bylo přidáno."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Upravit povolené telefonní číslo"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Probíhá aktualizace povoleného telefonního čísla..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Povolené telefonní číslo bylo aktualizováno."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Smazat povolené telefonní číslo"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Mazání povoleného telefonního čísla..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Povolené telefonní číslo bylo smazáno."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"Povolené telefonní číslo nebylo aktualizováno: Zadali jste nesprávný kód PIN."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"Povolené telefonní číslo nebylo aktualizováno: Délka čísla nemůže přesahovat 20 číslic."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Čtení z karty SIM..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Na kartě SIM nejsou žádné kontakty."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Vybrat kontakty pro import"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Povolit nebo zakázat kód PIN karty SIM"</string>
- <string name="change_pin" msgid="9174186126330785343">"Změnit kód PIN karty SIM"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"Kód PIN karty SIM:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Původní kód PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Nový kód PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Potvrďte nový kód PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"Původní kód PIN byl zadán nesprávně. Zkuste to znovu."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Zadané kódy PIN se neshodují. Zkuste to znovu."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Zadejte kód PIN o délce 4-8 číslic."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Zakázat kód PIN karty SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Povolit kód PIN karty SIM"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Čekejte prosím..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"Kód PIN karty SIM je povolen."</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"Kód PIN karty SIM je zakázán."</string>
- <string name="pin_failed" msgid="6597695909685242127">"Zadaný kód PIN je nesprávný."</string>
- <string name="pin_changed" msgid="9000716792724195093">"Kód PIN karty SIM byl úspěšně změněn."</string>
- <string name="puk_requested" msgid="3898394204193202803">"Neplatné heslo, karta SIM je zablokována. Zadejte kód PUK2."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Původní kód PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Nový kód PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Potvrdit nový kód PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"Původní kód PUK2 byl zadán nesprávně. Zkuste to znovu."</string>
- <string name="badPin2" msgid="515218795152422178">"Původní kód PIN2 byl zadán nesprávně. Zkuste to znovu."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Zadané kódy PIN2 se neshodují. Zkuste to znovu."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Zadejte kód PIN2 o délce 4-8 číslic."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Zadejte 8místný kód PUK2."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"Kód PIN2 byl úspěšně změněn."</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Zadejte kód PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Heslo je nesprávné. Změňte kód PIN2 a zkuste to znovu."</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Neplatné heslo, karta SIM je zablokována. Zadejte kód PUK2."</string>
- <string name="doneButton" msgid="2859593360997984240">"Hotovo"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Konferenční hovor <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Zpět k hovoru"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Pokračovat bez karty SIM"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Karta SIM nebyla nalezena. Vložte do telefonu kartu SIM."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Zavřít"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Odemknout"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Ověřování kódu PIN..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Číslo hlasové schránky"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Vytáčení"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Nový pokus"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Aktuální hovor"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Konferenční hovor"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Příchozí hovor"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Čekající hovor CDMA"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Hovor ukončen"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Přidržený hovor"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Zavěšování"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Probíhá hovor"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Zmeškaný hovor"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Zmeškané hovory"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"Zmeškané hovory: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>."</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Zmeškaný hovor od volajícího <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>."</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Aktuální hovor (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Přidržený hovor"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Nová hlasová zpráva"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nová hlasová zpráva (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Volat hlasovou schránku <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Číslo hlasové schránky je neznámé."</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Žádný signál"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Vybraná síť (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) není k dispozici"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Chcete-li telefonovat, vypněte nejprve režim V letadle."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Přihlášení k síti nebylo úspěšné."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Mobilní síť je nedostupná."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Hovor nelze spojit, nebylo zadáno platné číslo."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Hovor nebyl spojen."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Spouštění sekvence MMI..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Spouštění sekvence kódu funkce…"</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Nepodporovaná služba."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Hovory nelze přepnout."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Hovor nelze oddělit."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Hovor nelze předat."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Hovory nelze spojit do konferenčního hovoru."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Hovor nelze odmítnout."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Hovor není možné uvolnit."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Tísňové volání"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Zapínání rádia..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Nepokrytá oblast, opakování pokusu..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Hovor nelze spojit, <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> není číslo nouzového volání."</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Hovor nebyl spojen, vytočte číslo tísňového volání."</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Číslo vytočíte pomocí klávesnice."</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Tónová klávesnice"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Číselník"</string>
- <string name="touchLockText" msgid="566824588267376287">"Dvojitým klepnutím"\n"odemkněte"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Dvojitým klepnutím"\n"hovor přijmete"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Dvojitým klepnutím"\n"hovor odmítnete"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Přidržet"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Pokračovat"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Ukončit"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Číselník"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Skrýt"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Hlasitě"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Ztlumit"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Přidat hovor"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Spojit hovory"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Zaměnit"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Spravovat hovory"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Spravovat"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importovat"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importovat vše"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importování kontaktů z karty SIM"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Import z kontaktů"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Naslouchátka"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Zapnout režim kompatibility s naslouchátkem"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY vypnuto"</item>
- <item msgid="3971695875449640648">"Úplný režim TTY"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Text ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Tóny DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Nastavit délku tónů DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normální"</item>
- <item msgid="2883365539347850535">"Dlouhé"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Zpráva sítě"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Aktivujte svůj telefon"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"K aktivaci telefonní služby je potřeba uskutečnit speciální hovor. "\n\n"Stiskněte tlačítko Aktivovat a aktivujte telefon podle pokynů, které vám budou sděleny."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Dotkněte se tlačítka Aktivovat. Uskutečníte tak zvláštní hovor, kterým telefon aktivujete v mobilní síti svého operátora, abyste mohli volat a připojovat se k mobilním datovým sítím."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Přeskočit aktivaci?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Pokud přeskočíte aktivaci, nemůžete volat ani se připojovat k mobilním datovým sítím (můžete se ale připojit k sítím WiFi). Dokud svůj telefon neaktivujete, bude se zobrazovat výzva k aktivaci při každém zapnutí."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Přeskočit"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Aktivovat"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Aktivovat"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Telefon je aktivován."</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problém s aktivací"</string>
- <string name="ota_listen" msgid="162923839877584937">"Postupujte podle hlasových pokynů, dokud nebudete informováni o dokončení aktivace."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Klávesnice"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Hlasitě"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Počkejte prosím, než bude telefon naprogramován."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programování se nezdařilo"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Váš telefon je nyní aktivován. Spuštění služby může trvat až 15 minut."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Váš telefon nebyl aktivován."\n"Možná bude nutné vyhledat oblast s lepším pokrytím (blízko okna nebo venku). "\n\n"Zkuste to znovu nebo kontaktujte oddělení zákaznických služeb, kde získáte další možnosti."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"PŘÍLIŠ MNOHO SELHÁNÍ CERTIFIKÁTŮ SPC"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Zpět"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Zkuste to znovu"</string>
- <string name="ota_next" msgid="3904945374358235910">"Další"</string>
- <string name="ota_back" msgid="2190038043403850052">"Zpět"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"Dialog ukončení režimu tísňového zpětného volání"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Byl aktivován režim tísňového zpětného volání"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Režim tísňového zpětného volání"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Datové spojení zakázáno"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Žádné datové připojení po dobu <xliff:g id="COUNT">%s</xliff:g> min"</item>
- <item quantity="other" msgid="3122217344579273583">"Žádné datové připojení po dobu <xliff:g id="COUNT">%s</xliff:g> min"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Telefon bude v režimu tísňového zpětného volání po dobu <xliff:g id="COUNT">%s</xliff:g> min. V tomto režimu nelze použít žádné aplikace využívající datové připojení. Chcete režim ukončit nyní?"</item>
- <item quantity="other" msgid="3231879566243957821">"Telefon bude v režimu tísňového zpětného volání po dobu <xliff:g id="COUNT">%s</xliff:g> min. V tomto režimu nelze použít žádné aplikace využívající datové připojení. Chcete režim ukončit nyní?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"Vybraná akce není v režimu tísňového zpětného volání dostupná. Telefon bude v tomto režimu po dobu <xliff:g id="COUNT">%s</xliff:g> min. Chcete režim ukončit nyní?"</item>
- <item quantity="other" msgid="3489076611710869904">"Vybraná akce není v režimu tísňového zpětného volání dostupná. Telefon bude v tomto režimu po dobu <xliff:g id="COUNT">%s</xliff:g> min. Chcete režim ukončit nyní?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"Během tísňového volání není vybraná akce k dispozici"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Ukončení režimu tísňového zpětného volání"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Ano"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Ne"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Zavřít"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Nastavení hlasové schránky"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;nenastaveno&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Služba hlasové schránky"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Nastavení pro poskytovatele <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Další nastavení hovorů"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Vytočit"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Volání prostřednictvím ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Přetažením doprava hovor přijmete"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Přetažením doleva ztlumíte vyzvánění"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Přetažením doleva hovor odmítnete"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Přetažením doprava hovor přijmete"\n"a aktivní přidržíte"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Přetažením doprava hovor přijmete"\n"a aktivní ukončíte"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Přetažením doprava hovor přijmete"\n"a přidržený ukončíte"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Přijmout"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Odmítnout"</string>
-</resources>
diff --git a/phone/res/values-da/strings.xml b/phone/res/values-da/strings.xml
deleted file mode 100644
index f303b93..0000000
--- a/phone/res/values-da/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Kontakter"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoritter"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Opkald"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Nødopkald"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Opk.liste"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Liste over faste opkald"</string>
- <string name="unknown" msgid="6878797917991465859">"Ukendt"</string>
- <string name="private_num" msgid="6713286113000232309">"Privat nummer"</string>
- <string name="payphone" msgid="1931775086311769314">"Betalingstelefon"</string>
- <string name="onHold" msgid="9035493194749959955">"Ventende"</string>
- <string name="ongoing" msgid="8300874342848721367">"Aktuelt opkald"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Linjen er optaget"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Netværket er optaget"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Der er intet signal"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"ACM-grænsen er overskredet"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Slå radio fra"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Der er intet SIM-kort, eller der er SIM-kortfejl"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Området er uden for netværksdækning"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Udgående opkald er begrænset af faste opkaldsnumre."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Du kan ikke foretage udgående opkald, mens opkaldsspærring er slået til."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Alle opkald er begrænset af adgangskontrol."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Nødopkald er begrænset af adgangskontrol."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Normale opkald er begrænset af adgangskontrol."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: Telefon låst indtil strømcyklus."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: Opkald opgivet."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: Opkald aflyttet."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: genkald."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: Servicemulighed afvist."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: prøv genkald igen."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: Adgangsfejl."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: Flyttet."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Det er kun muligt at foretage nødopkald."</string>
- <string name="confCall" msgid="1904840547188336828">"Telefonmøde"</string>
- <string name="call_lost" msgid="317670617901479594">"Opkaldet er mistet."</string>
- <string name="retry" msgid="8462986804300767852">"Prøv igen"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Mistet opkald"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMI-nummer er startet"</string>
- <string name="ussdRunning" msgid="485588686340541690">"USSD-kode kører ..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMI-nummer annulleret"</string>
- <string name="cancel" msgid="5044513931633602634">"Annuller"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Højttaler"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Slå lyd fra"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Hold"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Afslut opk."</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Byt opkald"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Saml opkald"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Tilføj opk."</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Administrer telefonmøder"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Vis nummerblok"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Skjul nummerblok"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Hold aktuelt opkald"\n", og besvar"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Afslut aktuelt opkald,"\n"og besvar"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Tryk på Menu for at få opkaldsvalgmuligheder."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Tryk på Menu for indstillinger for opkald • Brug tastaturet til at ringe op"</string>
- <string name="menu_answer" msgid="116686205042231098">"Svar"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorer"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Send følgende toner?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Sender toner"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Send"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Nej"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Erstat jokertegnet med"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Manglende voicemailnummer"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Der er ikke gemt noget voicemailnummer på SIM-kortet."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Tilføj nummer"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Indlæser ..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Indtast PIN-kode for at låse SIM-kortet op."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM-kortet er låst op"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Ny PIN-kode til SIM-kortet"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Indtast ny PIN-kode igen for at bekræfte"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"De PIN-koder til SIM-kortet, du indtastede, stemmer ikke overens. Prøv igen."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Indtast PUK-kode for at låse SIM-kortet op."</string>
- <string name="badPuk" msgid="3213017898690275965">"Forkert PUK-kode."</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Fortsæt"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"Blokeringen af dit SIM-kort er blevet ophævet. Din telefon låser op ..."</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN-kode til oplåsning af SIM-netværket"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Lås op"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Annuller"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Anmoder om oplåsning af netværk ..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Anmodningen om oplåsning af netværk mislykkedes."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Netværket blev låst op."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI-nummer"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Indstillinger for GSM-opkald"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Indstillinger for CDMA-opkald"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Navne på adgangspkt."</string>
- <string name="settings_label" msgid="3876743539816984008">"Indstillinger for netværk"</string>
- <string name="voicemail" msgid="8693759337917898954">"Voicemail"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
- <string name="networks" msgid="8873030692174541976">"Netværksudbydere"</string>
- <string name="call_settings" msgid="6112441768261754562">"Indstillinger for opkald"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Yderligere indstillinger"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Yderligere indstillinger for opkald er for kun GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Yderligere CDMA-opkaldsindstillinger"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Yderligere indstillinger for opkald er for kun CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Indstillinger for netværkstjeneste"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"Opkalds-id"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Nummer skjules i udgående opkald"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Nummer vises i udgående opkald"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Brug udbyderens standardindstillinger til at vise mine numre i udgående opkald"</string>
- <string name="labelCW" msgid="6120513814915920200">"Ventende opkald"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Fortæl mig om indgående opkald under et opkald"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Fortæl mig om indgående opkald under et opkald"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Indstillinger for viderestilling af opkald"</string>
- <string name="labelCF" msgid="2574386948026924737">"Viderestilling af opkald"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Viderestil altid"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Brug altid dette nummer"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Viderestiller alle opkald"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Viderestiller alle opkald til \\\\{0\\\\}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Nummeret er ikke tilgængeligt"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Deaktiveret"</string>
- <string name="labelCFB" msgid="218938523102207587">"Viderestil ved optaget"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Nummer ved optaget"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Viderestiller til \\\\{0\\\\}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Deaktiveret"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Din udbyder understøtter ikke, deaktivering af viderestilling af opkald, når telefonen er optaget."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Viderestil ved ubesvaret"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Nummer ved ubesvaret"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Viderestiller til \\\\{0\\\\}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Deaktiveret"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Din udbyder understøtter ikke, deaktivering af viderestilling af opkald, når telefonen ikke bliver taget."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Viderestil ved utilgængelig"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Nummer ved utilgængelig"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Viderestiller til \\\\{0\\\\}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Deaktiveret"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Din udbyder understøtter ikke, deaktivering af viderestilling af opkald, når telefonen er utilgængelig."</string>
- <string name="updating_title" msgid="6146755386174019046">"Indstillinger for opkald"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Fejl i indstillinger for opkald"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Læser indstillinger ..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"Opdaterer indstillinger ..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Tilbagefører indstillinger …"</string>
- <string name="response_error" msgid="6674110501330139405">"Uventet svar fra netværk."</string>
- <string name="exception_error" msgid="7027667130619518211">"Fejl på netværk eller SIM-kort."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Slå radioen til, inden du viser disse indstillinger."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Aktiver"</string>
- <string name="disable" msgid="7274240979164762320">"Deaktiver"</string>
- <string name="change_num" msgid="239476305819844391">"Opdater"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Netværksstandard"</item>
- <item msgid="7876195870037833661">"Skjul nummer"</item>
- <item msgid="1108394741608734023">"Vis nummer"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Gem voicemailnummer"</string>
- <string name="vm_changed" msgid="380744030726254139">"Voicemailnummeret blev ændret."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Nummeret til voicemail blev ikke ændret."\n"Kontakt din udbyder, hvis problemet fortsætter."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Nummeret til viderestilling blev ikke ændret."\n"Kontakt din udbyder, hvis problemet fortsætter."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Aktuelle indstillinger for viderestillingsnummer kunne ikke hentes og gemmes."\n"Ønsker du at skifte til den nye udbyder alligevel?"</string>
- <string name="no_change" msgid="3186040086622435212">"Der blev ikke foretaget nogen ændringer."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Vælg voicemail-tjeneste"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Min udbyder"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Indstillinger for mobilnetværk"</string>
- <string name="label_available" msgid="1181658289009300430">"Tilgængelige netværk"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Søger ..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Der blev ikke fundet nogen netværk."</string>
- <string name="search_networks" msgid="1601136049300882441">"Søg efter netværk"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Der opstod en fejl, mens der blev søgt efter netværk."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Registrerer på <xliff:g id="NETWORK">%s</xliff:g> ..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"Dit SIM-kort tillader ikke en forbindelse til dette netværk."</string>
- <string name="connect_later" msgid="500090982903469816">"Der kan ikke oprettes forbindelse til dette netværk lige nu. Prøv igen senere."</string>
- <string name="registration_done" msgid="495135664535876612">"Registreret på netværket."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Vælg en netværksudbyder"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Søg efter alle tilgængelige netværk"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Vælg automatisk"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Vælg automatisk det foretrukne netværk"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Automatisk registrering ..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Netværkstilstand"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Skift netværksdriftstilstand"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Foretrukken netværkstilstand"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Global"</item>
- <item msgid="3273348576277144124">"Kun EvDo"</item>
- <item msgid="454610224530856274">"CDMA u. EvDo"</item>
- <item msgid="8928247118825616081">"Automatisk CDMA/EvDo"</item>
- <item msgid="8595462903294812666">"Automatisk GSM/WCDMA"</item>
- <item msgid="5189164180446264504">"Kun WCDMA"</item>
- <item msgid="5714714953966979187">"Kun GSM"</item>
- <item msgid="4775796025725908913">"GSM/WCDMA foretrækkes"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Data aktiveret"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Aktiver dataadgang via mobilnetværk"</string>
- <string name="roaming" msgid="8871412572928323707">"Dataroaming"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Opret forbindelse til datatjenester under roaming"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Opret forbindelse til datatjenester under roaming"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Du har mistet dataforbindelsen, fordi du har forladt dit hjemmenetværk, og dataroaming er slået fra."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Tillad dataroaming? Der kan være væsentlige gebyrer for dataroaming."</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Indstillinger for GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Indstillinger for CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Databrug"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Mobilselskabets datapolitik"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Databrug i denne periode"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Periode for databrug"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Politik om datahastighed"</string>
- <string name="throttle_help" msgid="243651091785169900">"Flere oplysninger"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %) af <xliff:g id="USED_2">%3$s</xliff:g> periodens maksimum"\n"Næste periode om <xliff:g id="USED_3">%4$d</xliff:g> dage (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %) af <xliff:g id="USED_2">%3$s</xliff:g> periodens maksimum"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"<xliff:g id="USED_0">%1$s</xliff:g> maksimum er overskredet"\n"Datahastigheden er nedsat til <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g> % af forløbet er gennemført"\n"Næste periode om <xliff:g id="USED_1">%2$d</xliff:g> dage (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Datahastigheden er nedsat til <xliff:g id="USED">%1$d</xliff:g> Kb/s, hvis datagrænsen overskrides"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Oplysninger om mobilselskabets politik om databrug på netværket"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Celletransmissions-sms"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Celletransmissions-sms"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Celletransmissions-sms"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Celletransmissions-sms er aktiveret"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Celletransmissions-sms deaktiveret"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Indstillinger for celletransmissions-sms"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Nødtransmission"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Nødtransmission er aktiveret"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Nødtransmission er deaktiveret"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Administration"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Administration er aktiveret"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Administration er deaktiveret"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Vedligeholdelse"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Vedligeholdelse er aktiveret"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Vedligeholdelse er deaktiveret"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Generelle nyheder"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Erhvervs- og økonomiske nyheder"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Sportsnyheder"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Underholdningsnyheder"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Lokal"</string>
- <string name="local_enable" msgid="6370463247609136359">"Lokale nyheder er aktiveret"</string>
- <string name="local_disable" msgid="4405691986943795798">"Lokale nyheder er deaktiveret"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regional"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Regionale nyheder er aktiveret"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Regionale nyheder er deaktiveret"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"National"</string>
- <string name="national_enable" msgid="1172443648912246952">"Nationale nyheder er aktiveret"</string>
- <string name="national_disable" msgid="326018148178601166">"Nationale nyheder er deaktiveret"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"International"</string>
- <string name="international_enable" msgid="5855356769925044927">"Internationale nyheder er aktiveret"</string>
- <string name="international_disable" msgid="2850648591041088931">"Internationale nyheder er deaktiveret"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Sprog"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Vælg nyhedssprog"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Engelsk"</item>
- <item msgid="1151988412809572526">"Fransk"</item>
- <item msgid="577840534704312665">"Spansk"</item>
- <item msgid="8385712091143148180">"Japansk"</item>
- <item msgid="1858401628368130638">"Koreansk"</item>
- <item msgid="1933212028684529632">"Kinesisk"</item>
- <item msgid="1908428006803639064">"Hebraisk"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Sprog"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Lokalt vejr"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Lokalt vejr er aktiveret"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Lokalt vejr er deaktiveret"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Trafikmeldinger i området"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Trafikmeldinger i området er aktiveret"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Trafikmeldinger i området er deaktiveret"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Flyafgange for lokal lufthavn"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Flyafgange for lokal lufthavn er aktiveret"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Flyafgange for lokal lufthavn er deaktiveret"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restauranter"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restauranter er aktiveret"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restauranter er deaktiveret"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Logi"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Logi er aktiveret"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Logi er deaktiveret"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Detailindeks"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Detailindeks er aktiveret"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Detailindeks er deaktiveret"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Annoncer"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Annoncer er aktiveret"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Annoncer deaktiveret"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Aktiekurser"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Aktiekurser er aktiveret"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Aktiekurser er deaktiveret"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Jobmuligheder"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Jobmuligheder er aktiveret"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Jobmuligheder er deaktiveret"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Læger, sundhed og hospital"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Læger, sundhed og hospital er aktiveret"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Læger, sundhed og hospital er deaktiveret"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Teknologinyheder"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Teknologinyheder er deaktiveret"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Teknologinyheder er deaktiveret"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Flere kategorier"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Flere kategorier er aktiveret"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Flere kategorier er deaktiveret"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"GSM-/UMTS-netværkspræferencer"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Ikke implementeret endnu!"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"GSM-/UMTS-netværkspræferencer"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (automatisk tilstand)"</item>
- <item msgid="8912042051809329533">"Kun WCDMA"</item>
- <item msgid="8776934131146642662">"Kun GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (WCDMA foretrukken)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Brug kun 2G-netværk"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Spar på batteriet"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Vælg system"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Skift cdma-roamingtilstand"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Vælg system"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Kun hjemme"</item>
- <item msgid="1205664026446156265">"Automatisk"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMA-roamingtilstand"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Skift cdma-roamingtilstand"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMA-roamingtilstand"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Kun hjemmenetværk"</item>
- <item msgid="8174642753290624634">"Tilknyttede netværk"</item>
- <item msgid="2241951431403168661">"Alle netværk"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"CDMA-netværkspræferencer"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Ikke implementeret endnu!"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"CDMA-netværkspræferencer"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Kun CDMA"</item>
- <item msgid="2683555124647197574">"Kun EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"CDMA-abonnement TEST"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Skift mellem RUIM/SIM og NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"abonnement"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Faste opkaldsnumre"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Liste over faste opkald"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Aktivering af faste opkald"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Faste opkaldsnumre er aktiveret"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Faste opkaldsnumre er deaktiveret"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Aktiver faste opkald"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Deaktiver faste opkald"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Skift PIN2-kode"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Deaktiver faste opkald"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Aktiver faste opkald"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Administrer faste opkaldsnumre"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Skift PIN-kode for at få adgang til faste opkald."</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Administrer telefonnummerliste"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Stemme Fortrolighed"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Aktiver øget fortrolighedstilstand"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTY-tilstand"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Aktiver TTY-tilstand"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTY-tilstand"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Angiv TTY-tilstand"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Prøv automatisk igen"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Aktiver automatisk gentagelsestilstand"</string>
- <string name="menu_add" msgid="1882023737425114762">"Tilføj kontakt"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Rediger kontakt"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Slet kontakt"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Indtast PIN2-kode"</string>
- <string name="name" msgid="7329028332786872378">"Navn"</string>
- <string name="number" msgid="7905950798349903858">"Nummer"</string>
- <string name="save" msgid="4094274636321939086">"Gem"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Tilføj fast opkaldsnummer"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Tilføjer fast opkaldsnummer..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Fast opkaldsnummer blev tilføjet."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Rediger fast opkaldsnummer"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Opdaterer fast opkaldsnummer..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Fast opkaldsnummer blev opdateret."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Slet fast opkaldsnummer"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Sletter fast opkaldsnummer..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Det faste opkaldsnummer blev slettet."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"Fast opkaldsnummer er ikke opdateret: Du har indtastet en forkert PIN-kode."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"Fast opkaldsnumner er ikke opdateret: Nummer kan højst indeholde 20 tal."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Læser fra SIM-kort ..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Der er ingen kontakter på dit SIM-kort."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Vælg kontakter, der skal importeres"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Aktiver/deaktiver PIN-kode til SIM-kort"</string>
- <string name="change_pin" msgid="9174186126330785343">"Skift PIN-kode til SIM-kort"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"PIN-kode til SIM-kort:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Nuværende PIN-kode"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Ny PIN-kode"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Bekræft ny PIN-kode"</string>
- <string name="badPin" msgid="4154316827946559447">"Den gamle PIN-kode, du indtastede, er forkert. Prøv igen."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"De PIN-koder, du indtastede, stemmer ikke overens. Prøv igen."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Indtast en PIN-kode på mellem 4 og 8 tal."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Deaktiver PIN-kode til SIM-kort"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Aktiver PIN-kode til SIM-kort"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Vent ..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"PIN-koden til SIM-kortet blev aktiveret"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"PIN-koden til SIM-kortet er deaktiveret"</string>
- <string name="pin_failed" msgid="6597695909685242127">"Den indtastede PIN-kode er forkert"</string>
- <string name="pin_changed" msgid="9000716792724195093">"PIN-kode til SIM-kort blev ændret."</string>
- <string name="puk_requested" msgid="3898394204193202803">"Adgangskoden er forkert. SIM-kortet er låst. PUK2-kode er påkrævet."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2-kode"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Nuværende PIN2-kode"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Ny PIN2-kode"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Bekræft ny PIN2-kode"</string>
- <string name="badPuk2" msgid="4072035207011308856">"Den indtastede PUK2-kode er forkert. Prøv igen."</string>
- <string name="badPin2" msgid="515218795152422178">"Den gamle PIN2-kode, du indtastede, er forkert. Prøv igen."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"De PIN2-koder, du indtastede, stemmer ikke overens. Prøv igen."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Indtast en PIN2-kode på mellem 4 og 8 tal."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Indtast en PUK2-kode på 8 tal."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2-koden blev ændret"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Indtast PUK2-kode"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Forkert adgangskode. Skift PIN2-kode, og prøv igen."</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Adgangskoden er forkert. SIM-kortet er låst. PUK2 er påkrævet."</string>
- <string name="doneButton" msgid="2859593360997984240">"Udfør"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Telefonmøde <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Tilbage til opkald"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Fortsæt uden SIM-kort"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Der blev ikke fundet noget SIM-kort. Indsæt et SIM-kort i telefonen."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Annuller"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Lås op"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Autentificerer PIN-kode ..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Voicemailnummer"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Ringer op"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Prøver igen"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Aktuelt opkald"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Telefonmøde"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Indgående opkald"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Cdma opkaldventer"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Opkaldet er afsluttet"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Ventende"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Lægger på"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Opkald i gang"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Ubesvarede opkald"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Ubesvarede opkald"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ubesvarede opkald"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Ubesvarede opkald fra <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Aktuelt opkald (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Ventende"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Ny voicemail"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Ny voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Ring til <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Voicemailnummeret er ukendt"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Ingen dækning"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Det valgte netværk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) er ikke tilgængeligt"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Slå Flytilstand fra først for at foretage et opkald."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ikke registreret på netværk."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Mobilnetværket er ikke tilgængeligt."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Opkaldet blev ikke sendt. Der blev ikke indtastet et gyldigt nummer."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Opkaldet blev ikke sendt."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Starter MMI-sekvens ..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Starter funktionskodesekvens ..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Tjenesten understøttes ikke."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Der kan ikke skiftes mellem opkald."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Opkaldet kunne ikke separeres."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Opkaldet kunne ikke overføres."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Der kunne ikke oprettes mødeopkald."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Opkaldet kunne ikke afvises."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Der kunne ikke foretages opkald."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Nødopkald"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Tænder for radio ..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Området er ude af drift. Prøver igen ..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Opkaldet blev ikke sendt. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> er ikke et nødnummer."</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Opkaldet blev ikke sendt. Indtast et nødnummer."</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Brug tastatur til at ringe op"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Touch-tone-tastatur"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Nummerblok"</string>
- <string name="touchLockText" msgid="566824588267376287">"Tryk to gange"\n"for at låse op"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Tryk to gange"\n"for at svare"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Tryk to gange"\n"for at afvise"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Hold"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Hold fra"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Afslut"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Nummerblok"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Skjul"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Højttaler"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Ignorer"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Tilføj opkald"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Slå opkald sammen"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Skift"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Administrer opkald"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Administrer"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importer"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importer alle"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importerer SIM-kontakter"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importer fra kontakter"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Høreapparater"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Slå høreapparatskompatibilitet til"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY fra"</item>
- <item msgid="3971695875449640648">"TTY er fuld"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERI-tekst"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMF-toner"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Angiv længden på DTMF-toner"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normal"</item>
- <item msgid="2883365539347850535">"Lang"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Netværksbesked"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Aktiver din telefon"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Der skal foretages et særligt opkald for at aktivere din telefontjeneste. "\n\n" Lyt til instruktionerne, når du har trykket på “Aktiver” for at aktivere din telefon."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Tryk på “Aktiver” for at foretage et særligt opkald, der aktiverer din telefon på dit telefonselskabs mobilnetværk, så du kan foretage opkald og oprette forbindelse til mobile datanetværk."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Spring aktivering over?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Hvis du springer aktiveringen over, kan du ikke foretage opkald eller oprette forbindelse til mobildatanetværk (du kan dog godt oprette forbindelse til Wi-Fi-netværk). Du vil blive bedt om at aktivere din telefon, hver gang du tænder den, indtil du gør det."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Spring over"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Aktiver"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Aktiver"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Telefonen er aktiveret!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Der opstod et problem med aktiveringen"</string>
- <string name="ota_listen" msgid="162923839877584937">"Følg talevejledningen, indtil du hører, at aktiveringen er gennemført."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Tastatur"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Højttaler"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Vent, mens din telefon bliver programmeret."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programmering mislykkedes"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Din telefon er nu aktiveret. Det kan tage op til 15 minutter, før tjenesten begynder."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Din telefon blev ikke aktiveret. "\n"Du skal muligvis finde et område med bedre dækning (ved et vindue eller udenfor). "\n\n"Prøv igen, eller ring til kundeservice for at få flere oplysninger om andre muligheder."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"FOR MANGE SPC-FEJL"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Tilbage"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Prøv igen"</string>
- <string name="ota_next" msgid="3904945374358235910">"Næste"</string>
- <string name="ota_back" msgid="2190038043403850052">"Tilbage"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"NttAfslutDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Gik i nødtilbagekaldstilstand"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Nødtilbagekaldstilstand"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Dataforbindelsen er deaktiveret"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Ingen dataforbindelse i <xliff:g id="COUNT">%s</xliff:g> minut"</item>
- <item quantity="other" msgid="3122217344579273583">"Ingen dataforbindelse i <xliff:g id="COUNT">%s</xliff:g> minutter"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Telefonen vil være i nødtilbagekaldstilstand i <xliff:g id="COUNT">%s</xliff:g> minut. I denne tilstand kan der ikke anvendes programmer, der anvender en dataforbindelse. Vil du afslutte nu?"</item>
- <item quantity="other" msgid="3231879566243957821">"Telefonen vil være i nødtilbagekaldstilstand i <xliff:g id="COUNT">%s</xliff:g> minutter. I denne tilstand kan der ikke anvendes programmer, der anvender en dataforbindelse. Vil du afslutte nu?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"Den valgte handling er ikke tilgængelig, når telefonen er i nødtilbagekaldstilstand. Telefonen vil være i denne tilstand i <xliff:g id="COUNT">%s</xliff:g> minut. Ønsker du at afslutte?"</item>
- <item quantity="other" msgid="3489076611710869904">"Den valgte handling er ikke tilgængelig, når telefonen er i nødtilbagekaldstilstand. Telefonen vil være i denne tilstand i <xliff:g id="COUNT">%s</xliff:g> minutter. Ønsker du at afslutte?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"Den valgte handling er ikke tilgængelig ved nødopkald"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Eksisterende nødtilbagekaldstilstand"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Ja"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Nej"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Annuller"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Indstillinger for voicemail"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;ikke indstillet&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Voicemail-tjeneste"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Indstillinger for <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Andre indstillinger for opkald"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Ring til"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Ringer op via ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Træk til højre for at besvare"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Træk til venstre for at sætte ringetonen på lydløs"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Træk til venstre for at afvise"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Træk til højre for at besvare og"\n"stille aktivt opkald på hold"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Træk til højre for at besvare og"\n"afslutte aktivt opkald"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Træk til højre for at besvare og"\n"afslutte ventende opkald"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Svar"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Afvis"</string>
-</resources>
diff --git a/phone/res/values-de/strings.xml b/phone/res/values-de/strings.xml
deleted file mode 100644
index 1958ab7..0000000
--- a/phone/res/values-de/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Kontakte"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoriten"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Telefon"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Notrufwählprogramm"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Anrufe"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Anrufbegrenzung"</string>
- <string name="unknown" msgid="6878797917991465859">"Unbekannt"</string>
- <string name="private_num" msgid="6713286113000232309">"Private Nummer"</string>
- <string name="payphone" msgid="1931775086311769314">"Telefonzelle"</string>
- <string name="onHold" msgid="9035493194749959955">"Gehaltener Anruf"</string>
- <string name="ongoing" msgid="8300874342848721367">"Aktueller Anruf"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Leitung besetzt"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Netzwerk ausgelastet"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Kein Signal"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"ACM-Grenzwert überschritten"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Mobilfunkverbindung aus"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Keine SIM-Karte, SIM-Kartenfehler"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Gebiet ohne Netzabdeckung"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Ausgehende Anrufe unterliegen der Anrufbegrenzung."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Sie können keine Anrufe tätigen, wenn die Anrufsperre aktiviert ist."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Alle Anrufe werden durch die Zugriffssteuerung beschränkt."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Notrufe werden durch die Zugriffssteuerung beschränkt."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Normale Anrufe werden durch die Zugriffssteuerung beschränkt."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: Telefon bis zum Einschalten gesperrt"</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: Anruf beendet"</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: Anruf unterbrochen"</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: Erneuter Aufruf"</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: Ablehnung der Serviceoption"</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: Wiederholungsaufruf"</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: Zugriffsfehler"</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: Vorzeitig entfernt"</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Es sind nur Notrufe möglich."</string>
- <string name="confCall" msgid="1904840547188336828">"Telefonkonferenz"</string>
- <string name="call_lost" msgid="317670617901479594">"Anruf ist verloren gegangen."</string>
- <string name="retry" msgid="8462986804300767852">"Wiederholen"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Anruf verloren"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMI-Code gestartet"</string>
- <string name="ussdRunning" msgid="485588686340541690">"USSD-Code wird ausgeführt..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMI-Code abgebrochen"</string>
- <string name="cancel" msgid="5044513931633602634">"Abbrechen"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Lautspr."</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Ton aus"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Halten"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Beenden"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Wechseln"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Konferenz"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Hinzufügen"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Telefonkonferenz verwalten"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Wähltasten zeigen"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Wähltasten ausblenden"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Aktuellen Anruf halten"\n"und annehmen"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Aktuellen Anruf beenden"\n"und annehmen"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Zum Anzeigen der Anrufoptionen die Menütaste drücken"</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Zum Anzeigen der Anrufoptionen die Menütaste drücken • Zum Wählen Tastatur verwenden"</string>
- <string name="menu_answer" msgid="116686205042231098">"Antwort"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorieren"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Folgende Töne senden?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Töne werden gesendet"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Senden"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Nein"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Platzhalter ersetzen durch"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Fehlende Mailboxnummer"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Auf der SIM-Karte ist keine Mailboxnummer gespeichert."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Nummer hinzufügen"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Wird geladen..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Geben Sie zum Entsperren der SIM-Karte den PIN-Code ein."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM-Karte entsperrt"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Neuer PIN-Code der SIM-Karte"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Neuen PIN-Code für SIM-Karte zur Bestätigung erneut eingeben"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Die von Ihnen eingegebenen PIN-Codes für die SIM-Karte stimmen nicht überein. Versuchen Sie es erneut."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Geben Sie zum Entsperren der SIM-Karte den PUK ein"</string>
- <string name="badPuk" msgid="3213017898690275965">"Falscher PUK-Code!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Fortfahren"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"Ihre SIM-Karte wurde entsperrt. Ihr Telefon wird nun entsperrt..."</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN zur Entsperrung des SIM-Netzwerks"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Entsperren"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Verwerfen"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Netzwerkentsperrung wird angefordert..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Anfrage für Entsperrung des Netzwerks war nicht erfolgreich."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Entsperrung des Netzwerks nicht erfolgreich."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"GSM-Anrufeinstellungen"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"CDMA-Anrufeinstellungen"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Zugangspunkte"</string>
- <string name="settings_label" msgid="3876743539816984008">"Netzwerkeinstellungen"</string>
- <string name="voicemail" msgid="8693759337917898954">"Mailbox"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"MB:"</string>
- <string name="networks" msgid="8873030692174541976">"Netzbetreiber"</string>
- <string name="call_settings" msgid="6112441768261754562">"Anrufeinstellungen"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Zusätzliche Einstellungen"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Zusätzliche Anrufeinstellungen nur für GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Zusätzliche CDMA-Anrufeinstellungen"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Zusätzliche Anrufeinstellungen nur für CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Einstellungen für Netzwerkservice"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"Anrufer-ID"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Nummer bei abgehenden Anrufen unterdrückt"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Nummer bei abgehenden Anrufen angezeigt"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Standardeinst. zur Anzeige meiner Nr. bei abgehenden Anrufen verwenden"</string>
- <string name="labelCW" msgid="6120513814915920200">"Anklopfen"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Mich während eines Anrufs über eingehende Anrufe benachrichtigen"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Mich während eines Anrufs über eingehende Anrufe benachrichtigen"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Einstellungen"</string>
- <string name="labelCF" msgid="2574386948026924737">"Rufweiterleitung"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Immer weiterleiten"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Diese Nummer immer verwenden"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Alle Anrufe weiterleiten"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Alle Anrufe weiterleiten an {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Nummer nicht verfügbar"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Deaktiviert"</string>
- <string name="labelCFB" msgid="218938523102207587">"Weiterleiten falls besetzt"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Nummer falls besetzt"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Weiterleitung an {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Deaktiviert"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Ihr Netzbetreiber unterstützt die Deaktivierung der Anrufweiterleitung bei besetzter Leitung nicht."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Weiterl. falls keine Antw."</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Nummer falls keine Antwort"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Weiterleitung an {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Deaktiviert"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Ihr Netzbetreiber unterstützt die Deaktivierung der Anrufweiterleitung bei Nichtbeantwortung nicht."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Weiterl. falls n. erreichb."</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Nummer falls nicht erreichbar"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Weiterleitung an {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Deaktiviert"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Ihr Netzbetreiber unterstützt die Deaktivierung der Anrufweiterleitung bei Nichterreichbarkeit nicht."</string>
- <string name="updating_title" msgid="6146755386174019046">"Anrufeinstellungen"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Fehler bei Anrufeinstellungen"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Einstellungen werden gelesen…"</string>
- <string name="updating_settings" msgid="8171225533884883252">"Einstellungen werden aktualisiert…"</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Einstellungen werden zurückgesetzt..."</string>
- <string name="response_error" msgid="6674110501330139405">"Unerwartete Antwort von Netzwerk"</string>
- <string name="exception_error" msgid="7027667130619518211">"Netzwerk- oder SIM-Kartenfehler"</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Aktivieren Sie Ihre Mobilfunkverbindung, bevor Sie diese Einstellungen anzeigen."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Aktivieren"</string>
- <string name="disable" msgid="7274240979164762320">"Deaktivieren"</string>
- <string name="change_num" msgid="239476305819844391">"Aktualisieren"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Netzwerk-Standardeinstellung"</item>
- <item msgid="7876195870037833661">"Rufnummer unterdrücken"</item>
- <item msgid="1108394741608734023">"Rufnummer anzeigen"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Mailboxnummer speichern"</string>
- <string name="vm_changed" msgid="380744030726254139">"Mailboxnummer geändert."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Die Mailboxnummer konnte nicht geändert werden."\n"Kontaktieren Sie Ihren Netzbetreiber, wenn dieses Problem weiterhin besteht."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Die Weiterleitungsnummer konnte nicht geändert werden."\n"Kontaktieren Sie Ihren Netzbetreiber, wenn dieses Problem weiterhin besteht."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Die aktuellen Einstellungen der Weiterleitungsnummern konnten nicht abgerufen und gespeichert werden."\n"Möchten Sie trotzdem zum neuen Anbieter wechseln?"</string>
- <string name="no_change" msgid="3186040086622435212">"Es wurden keine Änderungen vorgenommen."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Mailbox-Dienst auswählen"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Mein Netzbetreiber"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobile Netzwerkeinstellungen"</string>
- <string name="label_available" msgid="1181658289009300430">"Verfügbare Netzwerke"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Suchvorgang läuft...."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Keine Netzwerke gefunden"</string>
- <string name="search_networks" msgid="1601136049300882441">"Netzwerke suchen"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Fehler bei der Netzwerksuche"</string>
- <string name="register_on_network" msgid="9055203954040805084">"Registrierung in <xliff:g id="NETWORK">%s</xliff:g> läuft..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"Ihre SIM-Karte unterstützt keine Verbindung mit diesem Netzwerk."</string>
- <string name="connect_later" msgid="500090982903469816">"Es kann derzeit keine Verbindung zu diesem Netzwerk hergestellt werden. Versuchen Sie es später erneut."</string>
- <string name="registration_done" msgid="495135664535876612">"In Netzwerk registriert."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Netzbetreiber auswählen"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Nach allen verfügbaren Netzwerken suchen"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Automatisch auswählen"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Bevorzugtes Netzwerk automatisch auswählen"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Automatische Registrierung..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Netzwerkmodus"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Netzwerkbetriebsmodus ändern"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Bevorzugter Netzwerkmodus"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Global"</item>
- <item msgid="3273348576277144124">"Nur EvDo"</item>
- <item msgid="454610224530856274">"CDMA ohne EvDo"</item>
- <item msgid="8928247118825616081">"CDMA/EvDo (automatisch)"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA (automatisch)"</item>
- <item msgid="5189164180446264504">"Nur WCDMA"</item>
- <item msgid="5714714953966979187">"Nur GSM"</item>
- <item msgid="4775796025725908913">"GSM/WCDMA bevorzugt"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Daten aktiviert"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Datenzugriff über mobile Netzwerke aktivieren"</string>
- <string name="roaming" msgid="8871412572928323707">"Daten-Roaming"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Bei Roaming mit Datendienst verbinden"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Bei Roaming mit Datendienst verbinden"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Die Datenverbindung wurde unterbrochen, da Sie Ihr Mobilfunknetz verlassen haben und Daten-Roaming nicht aktiviert ist."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Daten-Roaming zulassen? Es können beträchtliche Roaming-Gebühren anfallen!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"GSM-/UMTS-Optionen"</string>
- <string name="cdma_options" msgid="4016822858172249884">"CDMA-Optionen"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Datennutzung"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Datenrichtlinien des Mobilfunkanbieters"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Im aktuellen Zeitraum verwendete Daten"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Zeitraum der Datennutzung"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Richtlinien zur Datenrate"</string>
- <string name="throttle_help" msgid="243651091785169900">"Weitere Informationen"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> Prozent) des maximalen Zeitraums von <xliff:g id="USED_2">%3$s</xliff:g>."\n"Der nächste Zeitraum beginnt in <xliff:g id="USED_3">%4$d</xliff:g> Tagen (<xliff:g id="USED_4">%5$s</xliff:g>)."</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> Prozent) des maximalen Zeitraums von <xliff:g id="USED_2">%3$s</xliff:g>"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Maximum von <xliff:g id="USED_0">%1$s</xliff:g> wurde überschritten."\n"Datenrate wurde auf <xliff:g id="USED_1">%2$d</xliff:g> kbit/s reduziert."</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g> Prozent des Zyklus sind verstrichen. "\n"Der nächste Zeitraum beginnt in <xliff:g id="USED_1">%2$d</xliff:g> Tagen (<xliff:g id="USED_2">%3$s</xliff:g>)."</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Datenrate wird auf <xliff:g id="USED">%1$d</xliff:g> kbit/s reduziert, wenn Datennutzungslimit überschritten wird."</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Weitere Informationen über die Richtlinien Ihres Mobilfunkanbieters zur Nutzung mobiler Netzwerkdaten"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Cell Broadcast SMS"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Cell Broadcast SMS"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Cell Broadcast SMS"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Cell Broadcast SMS aktiviert"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Cell Broadcast SMS deaktiviert"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Einstellungen für Cell Broadcast SMS"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Notfall-Broadcast"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Notfall-Broadcast aktiviert"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Notfall-Broadcast deaktiviert"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Verwaltung"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Verwaltung aktiviert"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Verwaltung deaktiviert"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Wartung"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Wartung aktiviert"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Wartung deaktiviert"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Allgemeine Nachrichten"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Geschäfts- und Finanznachrichten"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Sportnachrichten"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Entertainment-Nachrichten"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Lokal"</string>
- <string name="local_enable" msgid="6370463247609136359">"Lokalnachrichten aktiviert"</string>
- <string name="local_disable" msgid="4405691986943795798">"Lokalnachrichten deaktiviert"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regional"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Regionalnachrichten aktiviert"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Regionalnachrichten deaktiviert"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"National"</string>
- <string name="national_enable" msgid="1172443648912246952">"Nationale Nachrichten aktiviert"</string>
- <string name="national_disable" msgid="326018148178601166">"Nationale Nachrichten deaktiviert"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"International"</string>
- <string name="international_enable" msgid="5855356769925044927">"Internationale Nachrichten aktiviert"</string>
- <string name="international_disable" msgid="2850648591041088931">"Internationale Nachrichten deaktiviert"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Sprache"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Sprache für Nachrichten auswählen"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Englisch"</item>
- <item msgid="1151988412809572526">"Französisch"</item>
- <item msgid="577840534704312665">"Spanisch"</item>
- <item msgid="8385712091143148180">"Japanisch"</item>
- <item msgid="1858401628368130638">"Koreanisch"</item>
- <item msgid="1933212028684529632">"Chinesisch"</item>
- <item msgid="1908428006803639064">"Hebräisch"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Sprachen"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Lokalwetter"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Lokalwetter aktiviert"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Lokalwetter deaktiviert"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Verkehrsberichte"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Verkehrsberichte aktiviert"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Verkehrsberichte deaktiviert"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Flugpläne lokaler Flughäfen"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Flugpläne lokaler Flughäfen aktiviert"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Flugpläne lokaler Flughäfen deaktiviert"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restaurants"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restaurants aktiviert"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restaurants deaktiviert"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Unterkünfte"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Unterkünfte aktiviert"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Unterkünfte deaktiviert"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Handelsverzeichnis"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Handelsverzeichnis aktiviert"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Handelsverzeichnis deaktiviert"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Anzeigen"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Anzeigen aktiviert"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Anzeigen deaktiviert"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Börsennotierungen"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Börsennotierungen aktiviert"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Börsennotierungen deaktiviert"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Jobmöglichkeiten"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Jobmöglichkeiten aktiviert"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Jobmöglichkeiten deaktiviert"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Medizin, Gesundheit und Krankenhäuser"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Medizin, Gesundheit und Krankenhäuser aktiviert"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Medizin, Gesundheit und Krankenhäuser deaktiviert"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Technologienachrichten"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Technologienachrichten aktiviert"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Technologienachrichten deaktiviert"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Mehrere Kategorien"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Mehrere Kategorien aktiviert"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Mehrere Kategorien deaktiviert"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"GSM-/UMTS-Netzwerkeinstellungen"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Noch nicht implementiert"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"GSM-/UMTS-Netzwerkeinstellungen"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (automatischer Modus)"</item>
- <item msgid="8912042051809329533">"Nur WCDMA"</item>
- <item msgid="8776934131146642662">"Nur GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (WCDMA bevorzugt)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Nur 2G-Netzwerke"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Energiesparend"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Systemauswahl"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"CDMA-Roamingmodus ändern"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Systemauswahl"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Nur Startseite"</item>
- <item msgid="1205664026446156265">"Automatisch"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMA-Roamingmodus"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"CDMA-Roamingmodus ändern"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMA-Roamingmodus"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Nur private Netzwerke"</item>
- <item msgid="8174642753290624634">"Zugehörige Netzwerke"</item>
- <item msgid="2241951431403168661">"Beliebiges Netzwerk"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"CDMA-Netzwerkeinstellungen"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Noch nicht implementiert"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"CDMA-Netzwerkeinstellungen"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Nur CDMA"</item>
- <item msgid="2683555124647197574">"Nur EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"CDMA-Abonnement TEST"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Zwischen RUIM/SIM und NV ändern"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"Abo"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Anrufbegrenzung"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Zugelassene Rufnummern"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Aktivierung der Anrufbegrenzung"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Anrufbegrenzung ist aktiviert"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Anrufbegrenzung ist deaktiviert"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Begrenzung aktivieren"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Anrufbegrenzung deaktivieren"</string>
- <string name="change_pin2" msgid="2153563695382176676">"PIN2 ändern"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Anrufbegrenzung deaktivieren"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Begrenzung aktivieren"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Zugelassene Rufnummern verwalten"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Anrufbegrenzungs-PIN ändern"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Telefonnummernliste verwalten"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Datenschutz von Sprachnotizen"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Erweiterten Datenschutzmodus aktivieren"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTY-Modus"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"TTY-Modus aktivieren"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTY-Modus"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"TTY-Modus einstellen"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Automatische Wiederholung"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Modus für automatische Wiederholung aktivieren"</string>
- <string name="menu_add" msgid="1882023737425114762">"Kontakt hinzufügen"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Kontakt bearbeiten"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Kontakt löschen"</string>
- <string name="get_pin2" msgid="1198225482542827652">"PIN2 eingeben"</string>
- <string name="name" msgid="7329028332786872378">"Name"</string>
- <string name="number" msgid="7905950798349903858">"Nummer"</string>
- <string name="save" msgid="4094274636321939086">"Speichern"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Zugelassene Rufnummer hinzufügen"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Zugelassene Rufnummer wird hinzugefügt..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Zugelassene Rufnummer hinzugefügt"</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Zugelassene Rufnummer bearbeiten"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Zugelassene Rufnummer wird aktualisiert..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Zugelassene Rufnummer aktualisiert"</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Zugelassene Rufnummer löschen"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Zugelassene Rufnummer wird gelöscht..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Zugelassene Rufnummer gelöscht"</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN nicht aktualisiert: Falsche PIN eingegeben"</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN nicht aktualisiert: Nummer darf maximal 20 Ziffern lang sein."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"SIM-Karte wird ausgelesen..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Keine Kontakte auf Ihrer SIM-Karte"</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Kontakte für Import auswählen"</string>
- <string name="enable_pin" msgid="5422767284133234860">"PIN-Abfrage für SIM-Karte aktivieren/deaktivieren"</string>
- <string name="change_pin" msgid="9174186126330785343">"PIN ändern"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"PIN der SIM-Karte:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Alte PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Neue PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Neue PIN bestätigen"</string>
- <string name="badPin" msgid="4154316827946559447">"Die von Ihnen eingegebene alte PIN ist nicht korrekt. Versuchen Sie es erneut."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Die von Ihnen eingegebenen PIN-Codes stimmen nicht überein. Versuchen Sie es erneut."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Geben Sie eine 4- bis 8-stellige PIN ein."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"PIN-Abfrage für SIM-Karte deaktivieren"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"PIN-Abfrage für SIM-Karte aktivieren"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Bitte warten..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"PIN für SIM-Karte aktiviert"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"PIN-Abfrage für SIM-Karte deaktiviert"</string>
- <string name="pin_failed" msgid="6597695909685242127">"Die von Ihnen eingegebene PIN war nicht korrekt."</string>
- <string name="pin_changed" msgid="9000716792724195093">"Änderung der PIN für SIM-Karte erfolgreich"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Passwort falsch, SIM-Karte gesperrt! Eingabe des PUK2 erforderlich."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Alte PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Neue PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Neue PIN2 bestätigen"</string>
- <string name="badPuk2" msgid="4072035207011308856">"Der von Ihnen eingegebene PUK2 ist nicht korrekt. Versuchen Sie es erneut."</string>
- <string name="badPin2" msgid="515218795152422178">"Die von Ihnen eingegebene alte PIN2 ist nicht korrekt. Versuchen Sie es erneut."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Die von Ihnen eingegebenen PIN2-Codes stimmen nicht überein. Versuchen Sie es erneut."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Geben Sie eine 4- bis 8-stellige PIN2 ein."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Geben Sie einen 8-stelligen PUK2 ein."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2 erfolgreich geändert"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"PUK2 eingeben"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Passwort falsch. Ändern Sie die PIN2 und versuchen Sie es erneut!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Passwort falsch, SIM-Karte gesperrt! Eingabe des PUK2 erforderlich."</string>
- <string name="doneButton" msgid="2859593360997984240">"Fertig"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Telefonkonferenz <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Zurück zu Anruf"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Ohne SIM-Karte fortfahren"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Keine SIM-Karte gefunden. Legen Sie eine SIM-Karte in das Telefon ein."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Verwerfen"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Entsperren"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"PIN wird authentifiziert..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Mailboxnummer"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Rufaufbau"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Wird wiederholt"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Aktueller Anruf"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Telefonkonferenz"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Eingehender Anruf"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"CDMA-Anruf wartet"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Anruf beendet"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Gehaltener Anruf"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Auflegen"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Anruf"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Entgangener Anruf"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Entgangene Anrufe"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> entgangene Anrufe"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Entgangener Anruf von <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Aktueller Anruf (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Gehaltener Anruf"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Neue Nachricht"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Neue Nachricht (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> wählen"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Mailboxnummer unbekannt"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"kein Dienst"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Ausgewähltes Netzwerk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nicht verfügbar"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Deaktivieren Sie zunächst den Flugmodus, um einen Anruf zu tätigen."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Nicht in Netzwerk registriert."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Mobiles Netzwerk ist nicht verfügbar."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Anruf nicht verbunden; keine gültige Nummer."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Anruf nicht verbunden."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI-Sequenz wird gestartet..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Funktionscodesequenz wird gestartet..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Nicht unterstützter Dienst."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Wechsel zwischen Anrufen nicht möglich."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Anruf kann nicht getrennt werden."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Anruf kann nicht übertragen werden."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Keine Telefonkonferenz möglich."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Anruf kann nicht abgelehnt werden."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Anrufe können nicht freigegeben werden."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Notruf"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Mobilfunkverbindung wird aktiviert..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Gebiet ohne Netzabdeckung, erneuter Versuch..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Anruf nicht verbunden; <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ist keine Notrufnummer!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Anruf nicht verbunden. Wählen Sie eine Notrufnummer!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Zum Wählen Tastatur verwenden"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Tonwahltasten"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Wähltasten"</string>
- <string name="touchLockText" msgid="566824588267376287">"Zum Entsperren"\n"zweimal berühren"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Zum Antworten"\n"zweimal tippen"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Zum Ablehnen"\n"zweimal tippen"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Halten"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Fortsetzen"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Ende"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Wähltasten"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Ausblenden"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Lautspr."</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Ton aus"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Anruf hinzufügen"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Anrufe verbinden"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Wechseln"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Anrufe verwalten"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Verwalten"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importieren"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Alle importieren"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"SIM-Kontakte werden importiert"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Aus Kontakten importieren"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Hörhilfen"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Hörhilfekompatibilität aktivieren"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY aus"</item>
- <item msgid="3971695875449640648">"TTY (vollständig)"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERI-Text"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMF-Töne"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Länge der DTMF-Töne einstellen"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normal"</item>
- <item msgid="2883365539347850535">"Lang"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Netzwerknachricht"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Ihr Telefon aktivieren"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Zur Aktivierung Ihres Telefondienstes muss ein spezieller Anruf getätigt werden. "\n\n"Wählen Sie \"Aktivieren\" und befolgen Sie die Anweisungen zur Aktivierung Ihres Telefons."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Wählen Sie \"Aktivieren\", um über einen speziellen Anruf Ihr Telefon beim mobilen Netzwerk Ihres Anbieters zu aktivieren. Anschließend können Sie Anrufe tätigen und sich mit mobilen Datennetzwerken verbinden."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Aktivierung überspringen?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Wenn Sie die Aktivierung überspringen, können Sie keine Anrufe tätigen oder sich mit mobilen Datennetzwerken verbinden (Sie können sich allerdings mit WLAN-Netzwerken verbinden). Bis Sie Ihr Telefon aktivieren, werden Sie bei jedem Einschalten zur Aktivierung aufgefordert."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Überspringen"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Aktivieren"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Aktivieren"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Telefon ist aktiviert!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problem mit der Aktivierung"</string>
- <string name="ota_listen" msgid="162923839877584937">"Folgen Sie den Anweisungen bis Sie hören, dass die Aktivierung abgeschlossen ist."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Tastatur"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Lautspr."</string>
- <string name="ota_progress" msgid="4644512049143969504">"Bitte warten Sie, während Ihr Telefon programmiert wird."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programmierung nicht erfolgreich"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Ihr Telefon ist jetzt aktiviert. Es kann bis zu 15 Minuten dauern, bis der Dienst gestartet wird."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Ihr Telefon wurde nicht aktiviert. "\n"Suchen Sie einen Bereich auf, in dem Sie besseren Empfang haben, zum Beispiel in der Nähe eines Fensters oder unter freiem Himmel."\n\n"Versuchen Sie es erneut oder rufen Sie den Kundenservice an."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"ZU VIELE SPC-FEHLER"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Zurück"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Erneut versuchen"</string>
- <string name="ota_next" msgid="3904945374358235910">"Weiter"</string>
- <string name="ota_back" msgid="2190038043403850052">"Zurück"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Notfallrückrufmodus aktiviert"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Notfallrückrufmodus"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Datenverbindung deaktiviert"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"<xliff:g id="COUNT">%s</xliff:g> Minute lang keine Datenverbindung"</item>
- <item quantity="other" msgid="3122217344579273583">"<xliff:g id="COUNT">%s</xliff:g> Minuten lang keine Datenverbindung"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Das Telefon wird sich <xliff:g id="COUNT">%s</xliff:g> Minute lang im Notfallrückrufmodus befinden. Während dieser Zeit können keine Anwendungen, die eine Datenverbindung verwenden, genutzt werden. Möchten Sie den Vorgang jetzt beenden?"</item>
- <item quantity="other" msgid="3231879566243957821">"Das Telefon wird sich <xliff:g id="COUNT">%s</xliff:g> Minuten im Notfallrückrufmodus befinden. Während dieser Zeit können keine Anwendungen, die eine Datenverbindung verwenden, genutzt werden. Möchten Sie den Vorgang jetzt beenden?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"Die ausgewählte Aktion ist im Notfallrückrufmodus nicht verfügbar. Das Telefon bleibt <xliff:g id="COUNT">%s</xliff:g> Minuten in diesem Modus. Möchten Sie den Vorgang jetzt beenden?"</item>
- <item quantity="other" msgid="3489076611710869904">"Die ausgewählte Aktion ist im Notfallrückrufmodus nicht verfügbar. Das Telefon wird sich <xliff:g id="COUNT">%s</xliff:g> Minuten in diesem Modus befinden. Möchten Sie den Vorgang jetzt beenden?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"Die ausgewählte Aktion ist während eines Notrufs nicht verfügbar."</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Notfallrückrufmodus wird beendet."</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Ja"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Nein"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Verwerfen"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Mailbox-Einstellungen"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;nicht festgelegt&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Mailbox-Dienst"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Einstellungen für <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Sonstige Anrufeinstellungen"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Wählen"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Anruf über ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Zum Annehmen nach rechts ziehen"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Zum Stummschalten des Klingeltons nach links ziehen"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Zum Ablehnen nach links ziehen"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Zum Annehmen nach rechts ziehen und"\n"aktiven Anruf halten"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Zum Annehmen nach rechts ziehen und"\n"aktiven Anruf beenden"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Zum Annehmen nach rechts ziehen und"\n"gehaltenen Anruf beenden"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Antwort"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Ablehnen"</string>
-</resources>
diff --git a/phone/res/values-el/strings.xml b/phone/res/values-el/strings.xml
deleted file mode 100644
index d79922f..0000000
--- a/phone/res/values-el/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Επαφές"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Αγαπ."</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Κλήσεις"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Πρόγραμμα κλήσης έκτακτης ανάγκης"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Τηλέφωνο"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Αρχείο"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Λίστα FDN"</string>
- <string name="unknown" msgid="6878797917991465859">"Άγνωστος"</string>
- <string name="private_num" msgid="6713286113000232309">"Απόκρυψη"</string>
- <string name="payphone" msgid="1931775086311769314">"Καρτοτηλέφωνο"</string>
- <string name="onHold" msgid="9035493194749959955">"Σε αναμονή"</string>
- <string name="ongoing" msgid="8300874342848721367">"Τρέχουσα κλήση"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Η γραμμή είναι απασχολημένη"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Το δίκτυο είναι απασχολημένο"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Δεν υπάρχει σήμα"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Υπέρβαση ορίου ACM"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Ο πομπός είναι απενεργοποιημένος"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Δεν υπάρχει κάρτα SIM ή σφάλμα κάρτας SIM"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Εκτός περιοχής κάλυψης"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Οι εξερχόμενες κλήσεις περιορίζονται από το FDN."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Δεν μπορείτε να πραγματοποιήσετε εξερχόμενες κλήσεις όσο η φραγή κλήσεων είναι ενεργοποιημένη."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Όλες οι κλήσεις περιορίζονται από τον έλεγχο πρόσβασης."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Οι κλήσεις επείγουσας ανάγκης περιορίζονται από τον έλεγχο πρόσβασης."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Οι κανονικές κλήσεις περιορίζονται από τον έλεγχο πρόσβασης."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: Κλείδωμα τηλεφώνου έως τον επόμενο κύκλο ενέργειας."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: Η κλήση απορρίφθηκε."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: Διακοπή κλήσης."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: αναδιάταξη."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA:απόρριψη επιλογής υπηρεσίας."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: σειρά επανάληψης."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: Αποτυχία πρόσβασης."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: Προκαθορίστηκε."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Μόνο κλήσεις έκτακτης ανάγκης."</string>
- <string name="confCall" msgid="1904840547188336828">"Κλήση συνδιάσκεψης"</string>
- <string name="call_lost" msgid="317670617901479594">"Αναπάντητη κλήση."</string>
- <string name="retry" msgid="8462986804300767852">"Νέα προσπάθεια"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Αναπάντητη κλήση"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"Έναρξη κώδικα MMI"</string>
- <string name="ussdRunning" msgid="485588686340541690">"Ο κώδικας USSD εκτελείται..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"Ο κώδικας MMI ακυρώθηκε"</string>
- <string name="cancel" msgid="5044513931633602634">"Ακύρωση"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Ηχείο"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Σίγαση"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Αναμονή"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Τερματισμός"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Αλλαγή κλ."</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Συγχώνευση"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Προσθήκη"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Διαχείριση κλήσης συνδιάσκεψης"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Εμφάνιση πληκτρολογίου κλήσης"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Απόκρυψη πληκτρολογίου κλήσης"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Τρέχουσα κλήση σε αναμονή "\n"&amp; απάντηση"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Τερματισμός τρέχουσας κλήσης"\n"&amp; απάντηση"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Πατήστε το Μενού για να δείτε τις επιλογές κλήσης."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Πατήστε το Μενού για να δείτε τις επιλογές κλήσης • Χρησιμοποιήστε το πληκτρολόγιο για να πραγματοποιήσετε κλήση"</string>
- <string name="menu_answer" msgid="116686205042231098">"Απάντηση"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Παράβλεψη"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Αποστολή των παρακάτω τόνων;"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Τόνοι αποστολής"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Αποστολή"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Ναι"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Όχι"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Αντικατάσταση του χαρακτήρα μπαλαντέρ με"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Λείπει ο αριθμός αυτόματου τηλεφωνητή"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Δεν έχει αποθηκευτεί αριθμός για τον αυτόματο τηλεφωνητή στην κάρτα SIM."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Προσθήκη αριθμού"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Φόρτωση..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Πληκτρολογήστε τον κώδικα PIN για να ξεκλειδώσετε την κάρτα SIM."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"Η κάρτα SIM ξεκλειδώθηκε"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Νέος κώδικας αριθμού PIN της κάρτας SIM"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Για επιβεβαίωση, πληκτρολογήστε ξανά τον νέο αριθμό PIN της κάρτας SIM"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Οι αριθμοί PIN της κάρτας SIM που πληκτρολογήσατε δεν ταιριάζουν. Δοκιμάστε ξανά."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Πληκτρολογήστε τον κώδικα PUK για να ξεκλειδώσετε την κάρτα SIM"</string>
- <string name="badPuk" msgid="3213017898690275965">"Λανθασμένος κώδικας PUK!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Συνέχεια"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"Καταργήθηκε ο αποκλεισμός της κάρτας SIM. Το τηλέφωνό σας ξεκλειδώνεται..."</string>
- <string name="label_ndp" msgid="780479633159517250">"Αριθμός PIN ξεκλειδώματος δικτύου κάρτας SIM"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Ξεκλείδωμα"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Παράβλεψη"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Αίτηση ξεκλειδώματος δικτύου..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Ανεπιτυχές αίτημα ξεκλειδώματος δικτύου."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Το ξεκλείδωμα δικτύου ήταν επιτυχές."</string>
- <string name="imei" msgid="8552502717594321281">"Αριθμός ΙΜΕΙ"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Ρυθμίσεις κλήσης GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Ρυθμίσεις κλήσης CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Ονόματα σημείου πρόσβασης"</string>
- <string name="settings_label" msgid="3876743539816984008">"Ρυθμίσεις δικτύου"</string>
- <string name="voicemail" msgid="8693759337917898954">"Αυτόματος τηλεφωνητής"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"ΑΤ:"</string>
- <string name="networks" msgid="8873030692174541976">"Εταιρείες δικτύου"</string>
- <string name="call_settings" msgid="6112441768261754562">"Ρυθμίσεις κλήσης"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Πρόσθετες ρυθμίσεις"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Πρόσθετες ρυθμίσεις κλήσης μόνο GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Επιπρόσθετες ρυθμίσεις κλήσης CDMA"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Πρόσθετες ρυθμίσεις κλήσης μόνο CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Ρυθμίσεις υπηρεσίας δικτύου"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"Αναγνώριση κλήσης"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Απόκρυψη αριθμού στις εξερχόμενες κλήσεις"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Αριθμός που προβάλλεται στις εξερχόμενες κλήσεις"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Χρήση των προεπιλεγμένων ρυθμίσεων της εταιρείας για την προβολή του αριθμού μου στις εξερχόμενες κλήσεις"</string>
- <string name="labelCW" msgid="6120513814915920200">"Αναμ. κλήσ."</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Κατά τη διάρκεια μιας κλήσης, να ειδοποιούμαι για τις εισερχόμενες κλήσεις"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Κατά τη διάρκεια μιας κλήσης, να ειδοποιούμαι για τις εισερχόμενες κλήσεις"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Ρυθμίσεις προώθησης κλήσης"</string>
- <string name="labelCF" msgid="2574386948026924737">"Προώθηση κλήσης"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Προώθηση πάντα"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Να γίνεται πάντα χρήση αυτού του αριθμού"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Προώθηση όλων των κλήσεων"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Προώθηση όλων των κλήσεων προς \\\\{0\\\\}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Ο αριθμός δεν είναι διαθέσιμος"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Απενεργοποιημένη"</string>
- <string name="labelCFB" msgid="218938523102207587">"Προώθηση όταν είμαι απασχολημένος/η"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Αριθμός όταν είμαι απασχολημένος/ή"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Προώθηση προς \\\\{0\\\\}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Απενεργοποιημένη"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Ο φορέας σας δεν υποστηρίζει την απενεργοποίηση της προώθησης κλήσεων όταν το τηλέφωνό σας είναι απασχολημένο."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Προώθηση όταν δεν απαντάω"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Αριθμός όταν δεν απαντάω"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Προώθηση προς \\\\{0\\\\}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Απενεργοποιημένη"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Ο φορέας σας δεν υποστηρίζει την απενεργοποίηση της προώθησης κλήσεων όταν το τηλέφωνό σας δεν απαντάει."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Προώθηση όταν δεν είμαι διαθέσιμος/η"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Αριθμός όταν δεν είμαι διαθέσιμος/η"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Προώθηση προς \\\\{0\\\\}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Απενεργοποιημένη"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Ο φορέας σας δεν υποστηρίζει την απενεργοποίηση της προώθησης κλήσεων όταν το τηλέφωνό σας δεν έχει σήμα."</string>
- <string name="updating_title" msgid="6146755386174019046">"Ρυθμίσεις κλήσης"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Σφάλμα ρυθμίσεων κλήσης"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Ανάγνωση ρυθμίσεων…"</string>
- <string name="updating_settings" msgid="8171225533884883252">"Ενημέρωση ρυθμίσεων..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Επαναφορά ρυθμίσεων…"</string>
- <string name="response_error" msgid="6674110501330139405">"Μη αναμενόμενη απάντηση από το δίκτυο."</string>
- <string name="exception_error" msgid="7027667130619518211">"Σφάλμα δικτύου ή κάρτας SIM."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Πριν προβάλετε αυτές τις ρυθμίσεις, ενεργοποιήστε τον πομπό."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Ενεργοποίηση"</string>
- <string name="disable" msgid="7274240979164762320">"Απενεργοποίηση"</string>
- <string name="change_num" msgid="239476305819844391">"Ενημέρωση"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Προεπιλογή δικτύου"</item>
- <item msgid="7876195870037833661">"Απόκρυψη αριθμού"</item>
- <item msgid="1108394741608734023">"Εμφάνιση αριθμού"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Αποθήκευση αριθμού αυτόματου τηλεφωνητή"</string>
- <string name="vm_changed" msgid="380744030726254139">"Ο αριθμός αυτόματου τηλεφωνητή άλλαξε."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Μη επιτυχής αλλαγή αριθμού αυτόματου τηλεφωνητή."\n"Επικοινωνήστε με την εταιρεία σας παροχής υπηρεσιών εάν δεν επιλυθεί το πρόβλημα."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Μη επιτυχής αλλαγή αριθμού προώθησης κλήσης."\n"Επικοινωνήστε με την εταιρεία σας παροχής υπηρεσιών εάν δεν επιλυθεί το πρόβλημα."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Αποτυχία ανάκτησης και αποθήκευσης των τρεχουσών ρυθμίσεων αριθμού προώθησης."\n"Θέλετε να πραγματοποιήσετε οπωσδήποτε μετάβαση στο νέο πάροχο υπηρεσιών;"</string>
- <string name="no_change" msgid="3186040086622435212">"Δεν έγιναν αλλαγές."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Επιλογή υπηρεσίας αυτόματου τηλεφωνητή"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Η εταιρεία μου"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Ρυθμίσεις δικτύου κινητής τηλεφωνίας"</string>
- <string name="label_available" msgid="1181658289009300430">"Διαθέσιμα δίκτυα"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Αναζήτηση..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Δεν βρέθηκαν δίκτυα."</string>
- <string name="search_networks" msgid="1601136049300882441">"Αναζήτηση δικτύων"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Προέκυψε σφάλμα κατά την αναζήτηση δικτύων."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Εγγραφή στο δίκτυο <xliff:g id="NETWORK">%s</xliff:g>…"</string>
- <string name="not_allowed" msgid="3540496123717833833">"Η κάρτα SIM δεν επιτρέπει τη σύνδεση με αυτό το δίκτυο."</string>
- <string name="connect_later" msgid="500090982903469816">"Δεν είναι δυνατή η σύνδεση σε αυτό το δίκτυο αυτήν τη στιγμή. Προσπαθήστε ξανά αργότερα."</string>
- <string name="registration_done" msgid="495135664535876612">"Έγινε εγγραφή στο δίκτυο."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Επιλέξτε εταιρεία δικτύου"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Αναζήτηση διαθέσιμων δικτύων"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Αυτόματη επιλογή"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Αυτόματη επιλογή προτιμώμενου δικτύου"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Αυτόματη εγγραφή..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Λειτουργία δικτύου"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Αλλαγή κατάστασης λειτουργίας δικτύου"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Προτιμώμενη λειτουργία δικτύου"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Παγκόσμιο"</item>
- <item msgid="3273348576277144124">"Μόνο EvDo"</item>
- <item msgid="454610224530856274">"CDMA w/o EvDo"</item>
- <item msgid="8928247118825616081">"Αυτόματο CDMA / EvDo"</item>
- <item msgid="8595462903294812666">"Αυτόματο GSM / WCDMA"</item>
- <item msgid="5189164180446264504">"Μόνο WCDMA"</item>
- <item msgid="5714714953966979187">"Μόνο GSM"</item>
- <item msgid="4775796025725908913">"Προτιμώνται GSM / WCDMA"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Ενεργοποίηση δεδομένων"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Ενεργοποίηση της πρόσβασης δεδομένων μέσω του δικτύου κινητής τηλεφωνίας"</string>
- <string name="roaming" msgid="8871412572928323707">"Περιαγωγή δεδομένων"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Σύνδεση στις υπηρεσίες δεδομένων κατά την περιαγωγή"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Σύνδεση στις υπηρεσίες δεδομένων κατά την περιαγωγή"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Χάσατε τη σύνδεση δεδομένων επειδή φύγατε από το οικείο δίκτυο έχοντας την περιαγωγή δεδομένων απενεργοποιημένη."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Να επιτρέπεται η περιαγωγή δεδομένων; Ενδέχεται να επιβαρυνθείτε με σημαντικά έξοδα περιαγωγής!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Επιλογές GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Επιλογές CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Χρήση δεδομένων"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Πολιτική δεδομένων εταιρείας"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Δεδομένα που χρησιμοποιήθηκαν την τρέχουσα περίοδο"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Περίοδος χρήσης δεδομένων"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Πολιτική ταχύτητας δεδομένων"</string>
- <string name="throttle_help" msgid="243651091785169900">"Μάθετε περισσότερα"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) με μέγιστη περίοδο <xliff:g id="USED_2">%3$s</xliff:g>"\n"Η επόμενη περίδος ξεκινά σε <xliff:g id="USED_3">%4$d</xliff:g> ημέρες (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) με μέγιστη περίοδο <xliff:g id="USED_2">%3$s</xliff:g>"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Συμπληρώθηκε το μέγιστο όριο <xliff:g id="USED_0">%1$s</xliff:g>"\n"Η ταχύτητα δεδομένων μειώθηκε σε <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"Έχει περάσει το <xliff:g id="USED_0">%1$d</xliff:g>٪ του κύκλου"\n"Η επόμενη περίοδος ξεκινά σε <xliff:g id="USED_1">%2$d</xliff:g> ημέρες (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Εάν το όριο χρήσης δεδομένων ξεπεραστεί, τότε η ταχύτητα δεδομένων θα μειωθεί σε <xliff:g id="USED">%1$d</xliff:g> Kb/s"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Περισσότερες πληροφορίες σχετικά με την πολιτική χρήσης δεδομένων στο δίκτυο της εταιρείας κινητής τηλεφωνίας"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Cell Broadcast SMS"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Cell Broadcast SMS"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Cell Broadcast SMS"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Ενεργοποιήθηκε η μετάδοση SMS μέσω κινητού τηλεφώνου"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Απενεργοποιήθηκε το Cell Broadcast SMS"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Ρυθμίσεις μετάδοσης SMS μέσω κινητού τηλεφώνου"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Μετάδοση έκτακτης ανάγκης"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Ενεργοποιήθηκε η μετάδοση έκτακτης ανάγκης"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Απενεργοποίηση κλήσης έκτακτης ανάγκης"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Διαχειριστικά"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Ενεργοποιήθηκε η προβολή διαχειριστικών"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Απενεργοποιήθηκε η προβολή διαχειριστικών"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Συντήρηση"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Ενεργοποιήθηκε η λειτουργία συντήρησης"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Απενεργοποιήθηκε η λειτουργία συντήρησης"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Γενικά νέα"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Επιχειρηματικά και Οικονομικά Νέα"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Αθλητικά νέα"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Νέα ψυχαγωγίας"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Τοπικά"</string>
- <string name="local_enable" msgid="6370463247609136359">"Ενεργοποιήθηκε η προβολή τοπικών νέων"</string>
- <string name="local_disable" msgid="4405691986943795798">"Απενεργοποιήθηκε η προβολή τοπικών νέων"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Περιφερειακός"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Ενεργοποιήθηκε η προβολή περιφερειακών νέων"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Απενεργοποιήθηκε η προβολή περιφερειακών νέων"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Εθνικός"</string>
- <string name="national_enable" msgid="1172443648912246952">"Ενεργοποιήθηκε η προβολή εθνικών ειδήσεων"</string>
- <string name="national_disable" msgid="326018148178601166">"Απενεργοποιήθηκε η προβολή εθνικών ειδήσεων"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Διεθνή"</string>
- <string name="international_enable" msgid="5855356769925044927">"Ενεργοποιήθηκε η προβολή διεθνών ειδήσεων"</string>
- <string name="international_disable" msgid="2850648591041088931">"Απενεργοποιήθηκε η προβολή διεθνών ειδήσεων"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Γλώσσα"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Επιλογή γλώσσας νέων"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Αγγλικά"</item>
- <item msgid="1151988412809572526">"Γαλλικά"</item>
- <item msgid="577840534704312665">"Ισπανικά"</item>
- <item msgid="8385712091143148180">"Ιαπωνικά"</item>
- <item msgid="1858401628368130638">"Κορεατικά"</item>
- <item msgid="1933212028684529632">"Κινεζικά"</item>
- <item msgid="1908428006803639064">"Εβραϊκά"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Γλώσσες"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Τοπική πρόγνωση καιρού"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Ενεργοποιήθηκε η προβολή τοπικών προβλέψεων καιρού"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Απενεργοποιήθηκε η προβολή τοπικών προβλέψεων καιρού"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Αναφορές δελτίου κυκλοφορίας της περιοχής"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Ενεργοποιήθηκε η προβολή αναφορών δελτίου κυκλοφορίας της περιοχής"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Απενεργοποιήθηκε η προβολή αναφορών δελτίου κυκλοφορίας της περιοχής"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Προγράμματα τοπικών αεροπορικών πτήσεων"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Ενεργοποιήθηκε η προβολή προγραμμάτων τοπικών αεροπορικών πτήσεων"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Απενεργοποιήθηκε η προβολή προγράμματος τοπικών αεροπορικών πτήσεων"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Εστιατόρια"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Ενεργοποιήθηκε η προβολή εστιατορίων"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Απενεργοποιήθηκε η προβολή εστιατορίων"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Lodgings"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Ενεργοποιήθηκε η λειτουργία Lodgings"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Απενεργοποιήθηκε η λειτουργία Lodgings"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Κατάλογος λιανικού εμπορίου"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Ενεργοποιήθηκε προβολή καταλόγου λιανικού εμπορίου"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Απενεργοποιήθηκε η προβολή καταλόγου λιανικού εμπορίου"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Διαφημίσεις"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Ενεργοποιήθηκαν διαφημίσεις"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Απενεργοποιήθηκε η προβολή διαφημίσεων"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Τιμές μετοχών"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Ενεργοποιήθηκε η προβολή τιμών μετοχών"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Απενεργοποιήθηκε η προβολή τιμών μετοχών"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Ευκαιρίες καριέρας"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Ενεργοποιήθηκε η προβολή ευκαιριών καριέρας"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Απενεργοποιήθηκε η προβολή ευκαιριών καριέρας"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Ιατρικά θέματα, Υγεία και Νοσοκομεία"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Ενεργοποιήθηκε η προβολή Ιατρικών θεμάτων, Υγείας και Νοσοκομείων"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Απενεργοποιήθηκε η προβολή Ιατρικών θεμάτων, Υγείας και Νοσοκομείων"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Τεχνολογικά νέα"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Ενεργοποιήθηκε η προβολή τεχνολογικών νέων"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Απενεργοποιήθηκε η προβολή τεχνολογικών νέων"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Πολλές κατηγορίες"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Ενεργοποιήθηκε η προβολή πολλών κατηγοριών"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Απενεργοποιήθηκε η προβολή πολλών κατηγοριών"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Προτιμήσεις δικτύου GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Δεν εφαρμόστηκε ακόμη!"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Προτιμήσεις δικτύου GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (αυτόματη λειτουργία)"</item>
- <item msgid="8912042051809329533">"Μόνο WCDMA"</item>
- <item msgid="8776934131146642662">"Μόνο GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (προτιμάται WCDMA)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Χρήση μόνο δικτύων 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Εξοικονόμηση μπαταρίας"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Επιλογή συστήματος"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Αλλαγή της λειτουργίας περιαγωγής cdma"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Επιλογή συστήματος"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Μόνο αρχική σελίδα"</item>
- <item msgid="1205664026446156265">"Αυτόματο"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Λειτουργία περιαγωγής CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Αλλαγή της λειτουργίας περιαγωγής cdma"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"Λειτουργία περιαγωγής CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Μόνο οικιακά δίκτυα"</item>
- <item msgid="8174642753290624634">"Συνεργαζόμενα δίκτυα"</item>
- <item msgid="2241951431403168661">"Οποιοδήποτε δίκτυο"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Προτιμήσεις δικτύου CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Δεν εφαρμόστηκε ακόμη!"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Προτιμήσεις δικτύου CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Μόνο CDMA"</item>
- <item msgid="2683555124647197574">"Μόνο EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"ΔΟΚΙΜΗ συνδρομής CDMA"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Αλλαγή μεταξύ RUIM/SIM και NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"συνδρομή"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Αριθμοί κλήσης καθορισμένων αριθμών"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Λίστα FDN"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Ενεργοποίηση FDN"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Οι αριθμοί κλήσης καθορισμένων αριθμών είναι ενεργοποιημένοι"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Οι αριθμοί κλήσης καθορισμένων αριθμών είναι απενεργοποιημένοι"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Ενεργοποίηση FDN"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Απενεργοποίηση του FDN"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Αλλαγή του αριθμού PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Απενεργοποίηση του FDN"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Ενεργοποίηση FDN"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Διαχείριση αριθμών κλήσης καθορισμένων αριθμών"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Αλλαγή αριθμού PIN για πρόσβαση FDN"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Διαχείριση λίστας αριθμών τηλεφώνου"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Απόρρητο φωνής"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Ενεργοποίηση λειτουργίας σύνθετου απορρήτου"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Λειτουργία TTY"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Ενεργοποίηση λειτουργίας TTY"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Λειτουργία TTY"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Ορισμός λειτουργίας TTY"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Αυτόματη επανάληψη"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Ενεργοποίηση λειτουργίας αυτόματης επανάληψης"</string>
- <string name="menu_add" msgid="1882023737425114762">"Προσθήκη επαφής"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Επεξεργασία επαφής"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Διαγραφή επαφής"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Εισάγετε τον αριθμό PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Όνομα"</string>
- <string name="number" msgid="7905950798349903858">"Αριθμός"</string>
- <string name="save" msgid="4094274636321939086">"Αποθ/ση"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Προσθήκη καθορισμένου αριθμού κλήσης"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Προσθήκη καθορισμένου αριθμού κλήσης…"</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Ο καθορισμένος αριθμός κλήσης προστέθηκε."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Επεξεργασία καθορισμένου αριθμού κλήσης"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Ενημέρωση καθορισμένου αριθμού κλήσης…"</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Ο καθορισμένος αριθμός κλήσης ενημερώθηκε."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Διαγραφή καθορισμένου αριθμού κλήσης"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Διαγραφή καθορισμένου αριθμού κλήσης…"</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Ο καθορισμένος αριθμός κλήσης διαγράφηκε."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"Το FDN δεν ενημερώθηκε: εισαγάγατε εσφαλμένο PIN."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"Το FDN δεν ενημερώθηκε: ο αριθμός δεν μπορεί να περιέχει περισσότερα από 20 ψηφία."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Ανάγνωση από κάρτα SIM…"</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Δεν υπάρχουν επαφές στην κάρτα SIM."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Επιλέξτε επαφές για εισαγωγή"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Ενεργοποίηση/απενεργοποίηση αριθμού PIN της κάρτας SIM"</string>
- <string name="change_pin" msgid="9174186126330785343">"Αλλαγή αριθμού PIN της κάρτας SIM"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"Αριθμός PIN της κάρτας SIM:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Παλιός αριθμός PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Νέος αριθμός PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Επιβεβαίωση νέου αριθμού PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"Ο παλιός αριθμός PIN που πληκτρολογήσατε δεν είναι σωστός. Δοκιμάστε ξανά."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Οι αριθμοί PIN που πληκτρολογήσατε δεν ταιριάζουν. Δοκιμάστε ξανά."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Πληκτρολογήστε έναν αριθμό PIN που να αποτελείται από 4 έως 8 αριθμούς."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Απενεργοποίηση αριθμού PIN της κάρτας SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Ενεργοποίηση αριθμού PIN της κάρτας SIM"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Περιμένετε..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"Ο αριθμός PIN της κάρτας SIM ενεργοποιήθηκε"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"Ο αριθμός PIN της κάρτας SIM απενεργοποιήθηκε"</string>
- <string name="pin_failed" msgid="6597695909685242127">"Ο αριθμός PIN που πληκτρολογήσατε είναι λανθασμένος"</string>
- <string name="pin_changed" msgid="9000716792724195093">"Η αλλαγή του αριθμού PIN της κάρτας SIM ήταν επιτυχημένη"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Λανθασμένος κωδικός πρόσβασης, η κάρτα SIM κλειδώθηκε! Ζητήθηκε κωδικός PUK2."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"Αριθμός PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Παλιός αριθμός PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Νέος αριθμός PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Επιβεβαίωση νέου αριθμού PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"Ο αριθμός PUK2 που πληκτρολογήσατε δεν είναι σωστός. Δοκιμάστε ξανά."</string>
- <string name="badPin2" msgid="515218795152422178">"Ο παλιός αριθμός PIN2 που πληκτρολογήσατε δεν είναι σωστός. Δοκιμάστε ξανά."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Ο αριθμός PIN2 που εισάγατε δεν ταιριάζει. Δοκιμάστε ξανά."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Πληκτρολογήστε έναν αριθμό PIN2 που να αποτελείται από 4 έως 8 αριθμούς."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Πληκτρολογήστε έναν αριθμό PUK2 που αποτελείται από 8 αριθμούς."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"Η αλλαγή του αριθμού PIN2 ήταν επιτυχημένη"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Πληκτρολογήστε τον κώδικα PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Ο κωδικός πρόσβασης είναι λανθασμένος, αλλάξτε τον αριθμό PIN2 και δοκιμάστε ξανά!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Λανθασμένος κωδικός πρόσβασης, η κάρτα SIM κλειδώθηκε! Ζητήθηκε κωδικός PUK2."</string>
- <string name="doneButton" msgid="2859593360997984240">"Τέλος"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Κλήση συνδιάσκεψης <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Επιστροφή στην κλήση"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Συνέχεια χωρίς κάρτα SIM"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Δεν βρέθηκε κάρτα SIM. Εισάγετε μια κάρτα SIM στο τηλέφωνο."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Παράβλεψη"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Ξεκλείδωμα"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Έλεγχος ταυτότητας αριθμού PIN…"</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Αριθμός αυτόματου τηλεφωνητή"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Κλήση"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Νέα προσπάθεια"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Τρέχουσα κλήση"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Κλήση συνδιάσκεψης"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Εισερχόμενη κλήση"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Αναμονή κλήσης Cdma"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Η κλήση τερματίστηκε"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Σε αναμονή"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Κλείσιμο γραμμής"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Σε κλήση"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Αναπάντητη κλήση"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Αναπάντητες κλήσεις"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> αναπάντητες κλήσεις"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Αναπάντητη κλήση από <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Τρέχουσα κλήση (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Σε αναμονή"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Νέο μήνυμα στον αυτόματο τηλεφωνητή"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Νέο μήνυμα στον αυτόματο τηλεφωνητή (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Καλέστε <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Ο αριθμός αυτόματου τηλεφωνητή είναι άγνωστος"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Δίκτυο μη διαθέσιμο"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Επιλεγμένο δίκτυο (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) μη διαθέσιμο"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Για να πραγματοποιήσετε μια κλήση, απενεργοποιήστε πρώτα τη λειτουργία πτήσης."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Δεν έχετε εγγραφεί στο δίκτυο."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Το δίκτυο κινητής τηλεφωνίας δεν είναι διαθέσιμο."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Η κλήση δεν πραγματοποιήθηκε, δεν έγινε εισαγωγή έγκυρου αριθμού."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"H κλήση δεν πραγματοποιήθηκε."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Έναρξη ακολουθίας MMI..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Έναρξη αλληλουχίας κωδικού λειτουργίας..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Μη υποστηριζόμενη υπηρεσία."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Αδύνατη η εναλλαγή κλήσεων."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Δεν ήταν δυνατός ο διαχωρισμός της κλήσης."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Δεν ήταν δυνατή η μεταφορά της κλήσης."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Αδύνατη η πραγματοποίηση κλήσεων συνδιάσκεψης."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Δεν ήταν δυνατή η απόρριψη της κλήσης."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Αδύνατη η επαναφορά κλήσης (κλήσεων)."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Κλήσεις επείγουσας ανάγκης"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Ενεργοποίηση πομπού..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Εκτός περιοχής κάλυψης, επανάληψη κλήσης..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Η κλήση δεν πραγματοποιήθηκε, το <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> δεν είναι αριθμός επείγουσας ανάγκης!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Η κλήση δεν πραγματοποιήθηκε, καλέστε έναν αριθμό επείγουσας ανάγκης!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Χρησιμοποιήστε το πληκτρολόγιο για να πραγματοποιήσετε καλέσετε έναν αριθμό"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Αγγίξτε το πληκτρολόγιο τόνων"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Πληκτρολόγιο κλήσης"</string>
- <string name="touchLockText" msgid="566824588267376287">"Για ξεκλείδωμα"\n"πατήστε δύο φορές"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Διπλό άγγιγμα"\n"για απάντηση"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Διπλό άγγιγμα"\n"για απόρριψη"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Αναμονή"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Διακοπή αναμονής"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Τέλος"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Πληκτρολόγιο κλήσης"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Απόκρυψη"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Ηχείο"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Σίγαση"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Προσθήκη κλήσης"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Συγχώνευση κλήσεων"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Ανταλλαγή"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Διαχείριση κλήσεων"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Διαχείριση"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Εισαγωγή"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Εισαγωγή όλων"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Εισαγωγή επαφών από κάρτα SIM"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Εισαγωγή από επαφές"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Βοηθήματα ακρόασης"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Ενεργοποίηση συμβατότητας βοηθήματος ακρόασης"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY Απενεργοποιήθηκε"</item>
- <item msgid="3971695875449640648">"TTY πλήρες"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Κείμενο ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Τόνοι DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Ορισμός διάρκειας τόνων DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Κανονική"</item>
- <item msgid="2883365539347850535">"Συνεχόμενος"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Μήνυμα δικτύου"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Ενεργοποίηση του τηλεφώνου σας"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Πρέπει να γίνει ειδική κλήση για την ενεργοποίηση της υπηρεσίας του τηλεφώνου που διαθέτετε. "\n\n"Αφού πατήσετε την \"Ενεργοποίηση\", ακούστε τις οδηγίες που παρέχονται για να ενεργοποιήσετε το τηλέφωνό σας."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Αγγίξτε την ένδειξη “Ενεργοποίηση” για να πραγματοποιήσετε μια ειδική κλήση που ενεργοποιεί το τηλέφωνό σας στο δίκτυο της εταιρείας κινητής τηλεφωνίας που χρησιμοποιείτε ώστε να μπορείτε να πραγματοποιείτε κλήσεις και να συνδέεστε σε δίκτυα δεδομένων κινητής τηλεφωνίας."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Παράβλεψη ενεργοποίησης;"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Εάν παραλείψετε την ενεργοποίηση, δεν θα μπορείτε να πραγματοποιήσετε κλήσεις ή να συνδεθείτε σε δίκτυα δεδομένων κινητής τηλεφωνίας (αν και θα μπορείτε να συνδεθείτε σε δίκτυα Wi-Fi). Μέχρι να ενεργοποιήσετε το τηλέφωνό σας, θα σας ζητείται να το ενεργοποιήσετε κάθε φορά που θα το θέτετε σε λειτουργία."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Παράβλεψη"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Ενεργοποίηση"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Ενεργοποίηση"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Το τηλέφωνο ενεργοποιήθηκε!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Πρόβλημα κατά την ενεργοποίηση"</string>
- <string name="ota_listen" msgid="162923839877584937">"Ακολουθήστε τις φωνητικές οδηγίες μέχρι να ακούσετε ότι η ενεργοποίηση ολοκληρώθηκε."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Πληκτρολόγιο"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Ηχείο"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Περιμένετε μέχρι να ολοκληρωθεί ο προγραμματισμός του τηλεφώνου σας."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Μη επιτυχής προγραμματισμός"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Το τηλέφωνό σας ενεργοποιήθηκε. Ενδέχεται να χρειαστούν έως και 15 λεπτά για την έναρξη της υπηρεσίας."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Το τηλέφωνό σας δεν ενεργοποιήθηκε. "\n"Ίσως χρειάζεται να βρείτε μια περιοχή με καλύτερη κάλυψη (κοντά σε ένα παράθυρο ή σε εξωτερικό χώρο). "\n\n"Δοκιμάστε ξανά ή καλέστε την υπηρεσία εξυπηρέτησης πελατών για περισσότερες επιλογές."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"EXCESS SPC FAILURES"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Πίσω"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Προσπαθήστε ξανά"</string>
- <string name="ota_next" msgid="3904945374358235910">"Επόμενο"</string>
- <string name="ota_back" msgid="2190038043403850052">"Πίσω"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"Παράθυρο διαλόγου εξόδου από λειτουργία κλήσης έκτακτης ανάγκης"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Είσοδος σε λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Απενεργοποιήθηκε η σύνδεση δεδομένων"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Δεν θα υπάρχει σύνδεση δεδομένων για <xliff:g id="COUNT">%s</xliff:g> λεπτό"</item>
- <item quantity="other" msgid="3122217344579273583">"Δεν θα υπάρχει σύνδεση δεδομένων για <xliff:g id="COUNT">%s</xliff:g> λεπτά"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Το τηλέφωνο θα βρίσκεται σε λειτουργία επιστροφής κλήσης έκτακτης ανάγκης για <xliff:g id="COUNT">%s</xliff:g> λεπτό. Κατά τη διάρκεια αυτής της λειτουργίας η χρήση εφαρμογών που χρησιμοποιούν σύνδεση δεδομένων δεν θα είναι εφικτή. Θέλετε να πραγματοποιήσετε έξοδο τώρα;"</item>
- <item quantity="other" msgid="3231879566243957821">"Το τηλέφωνο θα βρίσκεται σε λειτουργία επιστροφής κλήσης έκτακτης ανάγκης για <xliff:g id="COUNT">%s</xliff:g> λεπτά. Κατά τη διάρκεια αυτής της λειτουργίας η χρήση εφαρμογών που χρησιμοποιούν σύνδεση δεδομένων δεν θα είναι εφικτή. Θέλετε να πραγματοποιήσετε έξοδο τώρα;"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"Η επιλεγμένη ενέργεια δεν είναι διαθέσιμη κατά τη λειτουργία επιστροφής κλήσης έκτακτης ανάγκης. Το τηλέφωνο θα παραμείνει σε αυτήν τη λειτουργία για <xliff:g id="COUNT">%s</xliff:g> λεπτό. Θέλετε να πραγματοποιήσετε έξοδο τώρα;"</item>
- <item quantity="other" msgid="3489076611710869904">"Η επιλεγμένη ενέργεια δεν είναι διαθέσιμη κατά τη λειτουργία επιστροφής κλήσης έκτακτης ανάγκης. Το τηλέφωνο θα παραμείνει σε αυτήν τη λειτουργία για <xliff:g id="COUNT">%s</xliff:g> λεπτά. Θέλετε να πραγματοποιήσετε έξοδο τώρα;"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"Η επιλεγμένη ενέργεια δεν είναι διαθέσιμη κατά τη διάρκεια κλήσης επείγουσας ανάγκης"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Έξοδος από τη λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Ναι"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Όχι"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Απόρριψη"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Ρυθμίσεις αυτόματου τηλεφωνητή"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;δεν έχει οριστεί&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Υπηρεσία αυτόματου τηλεφωνητή"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Ρυθμίσεις για <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Άλλες ρυθμίσεις κλήσης"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Κλήση"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Κλήση μέσω ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Μεταφορά δεξιά για απάντηση"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Μεταφορά αριστερά για σίγαση ειδοποίησης ήχου"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Μεταφορά αριστερά για απόρριψη"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Μεταφορά δεξιά για απάντηση και"\n"θέση ενεργής κλήσης σε αναμονή"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Μεταφορά δεξιά για απάντηση και"\n"τερματισμό ενεργής κλήσης"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Μεταφορά δεξιά για απάντηση και"\n"τερματισμό κλήσης σε αναμονή"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Απάντηση"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Απόρριψη"</string>
-</resources>
diff --git a/phone/res/values-es-rUS/strings.xml b/phone/res/values-es-rUS/strings.xml
deleted file mode 100644
index 11358b1..0000000
--- a/phone/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Contactos"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoritos"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Marcador"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Marcador de emergencia"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Teléfono"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Registro"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Lista de NMF"</string>
- <string name="unknown" msgid="6878797917991465859">"Desconocida"</string>
- <string name="private_num" msgid="6713286113000232309">"Número privado"</string>
- <string name="payphone" msgid="1931775086311769314">"Teléfono pago"</string>
- <string name="onHold" msgid="9035493194749959955">"En espera"</string>
- <string name="ongoing" msgid="8300874342848721367">"Llamada actual"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Línea ocupada"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Red ocupada"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"No hay señal"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Se excedió el límite de ACM"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Radio apagada"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Sin SIM o error de SIM"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Área fuera de servicio"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Las llamadas salientes están restringidas por NMF."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"No puedes realizar llamadas salientes cuando está activada la restricción de llamadas."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Todas las llamadas están restringidas por control de acceso."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Las llamadas de emergencia están restringidas por control de acceso."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Las llamadas normales están restringidas por control de acceso."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: teléfono bloqueado hasta el ciclo de activación."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: llamada perdida."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: llamada interceptada."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: reordenar."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: rechazo de la opción de servicio."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: intentar nuevamente la orden."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: error de acceso."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: desplazado."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Sólo es posible realizar llamadas de emergencia."</string>
- <string name="confCall" msgid="1904840547188336828">"Llamada en conferencia"</string>
- <string name="call_lost" msgid="317670617901479594">"La llamada se ha perdido."</string>
- <string name="retry" msgid="8462986804300767852">"Intentar nuevamente"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Llamada perdida"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"Código de MMI iniciado"</string>
- <string name="ussdRunning" msgid="485588686340541690">"Ejecutando código USSD..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"Código MMI cancelado"</string>
- <string name="cancel" msgid="5044513931633602634">"Cancelar"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Altavoces"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Silenciar"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Retener"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Fin de llam."</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Intercamb. Llam."</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Comb. Llam."</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Agregar llamada"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Administrar llamada en conferencia"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Mostrar teclado telefónico"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Ocultar teclado telefónico"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Retener la llamada actual"\n" respuesta"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Finalizar la llamada actual"\n" respuesta"</string>
- <string name="ok" msgid="3811371167865772377">"Aceptar"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Pulsa Menú para obtener las opciones de llamada."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Pulsa Menú para obtener las opciones de llamada • Utiliza el teclado para marcar"</string>
- <string name="menu_answer" msgid="116686205042231098">"Respuesta"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorar"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"¿Deseas enviar los siguientes tonos?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Enviando tonos"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Enviar"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Sí"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Reemplazar el caracter comodín con"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Falta el número de correo de voz"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"No hay un número de correo de voz almacenado en la tarjeta SIM."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Agregar número"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Cargando…"</string>
- <string name="enterPin" msgid="4753300834213388397">"Escribe el código PIN para desbloquear la tarjeta SIM:"</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM desbloqueado"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Nuevo Código de PIN de SIM"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Escribe nuevamente el código PIN de SIM nuevo para confirmarlo"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Los PIN de SIM que has ingresado no coinciden. Vuelve a intentarlo."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Escribe el código PUK para desbloquear la tarjeta SIM"</string>
- <string name="badPuk" msgid="3213017898690275965">"Código PUK incorrecto."</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Continuar"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"Tu tarjeta SIM ha sido desbloqueada. Tu teléfono está desbloqueando..."</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN de desbloqueo de red SIM"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Desbloquear"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Descartar"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Solicitando desbloqueo de red..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Solicitud de desbloqueo de red incorrecta."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Desbloqueo de red correcto."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Config. de llam. GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Configuración de llamadas de CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Nombres de puntos de acc."</string>
- <string name="settings_label" msgid="3876743539816984008">"Configuración de red"</string>
- <string name="voicemail" msgid="8693759337917898954">"Correo de voz"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"Correo de voz:"</string>
- <string name="networks" msgid="8873030692174541976">"Operadores de red"</string>
- <string name="call_settings" msgid="6112441768261754562">"Configuración de llamada"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Configuración adicional"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Configuración de llamadas de GSM adicionales únicamente"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Configuración de llamadas de CDMA adicionales"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Configuración de llamadas de CDMA adicionales únicamente"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Configuración de servicios de red"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"ID de llamada entrante"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Número escondido en llamadas salientes"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Número visualizado en llamadas salientes"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Utilizar configuración del operador predeterminada para visualizar mi número en las llamadas salientes"</string>
- <string name="labelCW" msgid="6120513814915920200">"Llamada en espera"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Configuración de reenvío de llamadas"</string>
- <string name="labelCF" msgid="2574386948026924737">"Reenvío de llamada"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Reenviar siempre"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Usar este teléfono siempre"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Reenviar todas las llamadas"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Reenviar todas las llamadas a \\\\{0\\\\}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"El número no está disponible"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Desactivado"</string>
- <string name="labelCFB" msgid="218938523102207587">"Reenviar si está ocup."</string>
- <string name="messageCFB" msgid="3711089705936187129">"Número cuando está ocupado"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Reenviar a \\\\{0\\\\}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Desactivado"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Tu proveedor no es compatible con la desactivación del reenvío de llamadas cuando tu teléfono esté ocupado."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Reenviar si no contesta"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Número cuando no contesta"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Reenviar a \\\\{0\\\\}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Deshabilitado"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Tu proveedor no es compatible con la desactivación del reenvío de llamadas cuando tu teléfono no conteste."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Reenv. si no se alcanza"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Número cuando no se puede alcanzar"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Reenviar a \\\\{0\\\\}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Desactivado"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Tu proveedor no es compatible con la desactivación del reenvío de llamadas cuando tu teléfono se encuentre inaccesible."</string>
- <string name="updating_title" msgid="6146755386174019046">"Config. de llamada"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Error en configuración de llamada"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Leyendo configuración..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"Actualizando configuración..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Revirtiendo configuraciones..."</string>
- <string name="response_error" msgid="6674110501330139405">"Respuesta inesperada de la red."</string>
- <string name="exception_error" msgid="7027667130619518211">"Error en la red o en la tarjeta SIM."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Enciende la radio antes de ver esta configuración."</string>
- <string name="close_dialog" msgid="2365884406356986917">"Aceptar"</string>
- <string name="enable" msgid="1059008390636773574">"Habilitar"</string>
- <string name="disable" msgid="7274240979164762320">"Desactivar"</string>
- <string name="change_num" msgid="239476305819844391">"Actualizar"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Red predeterminada"</item>
- <item msgid="7876195870037833661">"Ocultar número"</item>
- <item msgid="1108394741608734023">"Mostrar número"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Guardar número de correo de voz"</string>
- <string name="vm_changed" msgid="380744030726254139">"Número de correo de voz cambiado."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"No se ha realizado correctamente el cambio del buzón de voz. "\n"Comunícate con tu proveedor si el problema continúa."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"No se ha realizado correctamente el cambio del número de desvío. "\n"Comunícate con tu proveedor si el problema continúa."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Error al recuperar y al guardar la configuración actual del número de desvío."\n"¿Deseas cambiar al nuevo proveedor de todos modos?"</string>
- <string name="no_change" msgid="3186040086622435212">"No se realizaron cambios."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Elegir servicio de buzón de voz"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Mi proveedor"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Configuración de red móvil"</string>
- <string name="label_available" msgid="1181658289009300430">"Red disponible"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Buscando..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"No se encontraron redes."</string>
- <string name="search_networks" msgid="1601136049300882441">"Buscar redes"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Error al buscar redes."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Registrando en <xliff:g id="NETWORK">%s</xliff:g>..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"Tu tarjeta SIM no permite una conexión a esta red."</string>
- <string name="connect_later" msgid="500090982903469816">"No se ha podido conectar con la red en este momento. Vuelve a intentarlo más tarde."</string>
- <string name="registration_done" msgid="495135664535876612">"Registrado en la red."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Seleccionar un operador de red"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Buscar todas las redes disponibles"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Seleccionar automát."</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Seleccionar la red preferida automáticamente"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Registro automático..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Modo de red"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Cambiar el modo operativo de la red"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Modo de red preferido"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Global"</item>
- <item msgid="3273348576277144124">"EvDo solamente"</item>
- <item msgid="454610224530856274">"CDMA sin EvDo"</item>
- <item msgid="8928247118825616081">"CDMA/EvDo automático"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA automático"</item>
- <item msgid="5189164180446264504">"WCDMA solamente"</item>
- <item msgid="5714714953966979187">"GSM solamente"</item>
- <item msgid="4775796025725908913">"GSM/WCDMA preferidas"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Datos habilitados"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Habilitar acceso a datos para red móvil"</string>
- <string name="roaming" msgid="8871412572928323707">"Roaming de datos"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Conectarse a servicios de datos en el roaming"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Conectarse a servicios de datos en el roaming"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Has perdido la conectividad de los datos porque has dejado la red doméstica con roaming de datos desactivado."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"¿Deseas permitir el roaming de datos? Ten en cuenta que podrás incurrir en gastos significativos."</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Opciones de GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Opciones de CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Utilización de datos "</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Política de velocidad de la transferencia de datos"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Datos utilizados en el período actual"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Período de utilización de datos"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Política de velocidad de transferencia de datos"</string>
- <string name="throttle_help" msgid="243651091785169900">"Más información"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) de <xliff:g id="USED_2">%3$s</xliff:g> del período máximo "\n"El próximo período comienza en <xliff:g id="USED_3">%4$d</xliff:g> días (<xliff:g id="USED_4">%5$s</xliff:g>)."</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) de <xliff:g id="USED_2">%3$s</xliff:g> máximo del período"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"<xliff:g id="USED_0">%1$s</xliff:g>máximo excedido"\n"La velocidad de la transferencia de datos se redujo a <xliff:g id="USED_1">%2$d</xliff:g> kb/seg."</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g>% del ciclo transcurrido"\n"El siguiente período comienza en <xliff:g id="USED_1">%2$d</xliff:g> días (<xliff:g id="USED_2">%3$s</xliff:g>)."</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"La velocidad de la transferencia de datos se reduce a <xliff:g id="USED">%1$d</xliff:g> Kb/seg. si se excede el límite de utilización de datos."</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Más información acerca de la política de utilización de datos de la red móvil de tu proveedor de servicios de telefonía móvil"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"SMS de emisión celular"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"SMS de emisión celular"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"SMS de emisión celular"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"SMS de emisión celular activado"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"SMS de emisión celular activado"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Configuración de SMS de emisión celular"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Emisión de emergencia"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Emisión de emergencia activada"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Emisión de emergencia desactivada"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Administrativo"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Administrativo activado"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Administrativo desactivado"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Mantenimiento"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Mantenimiento activado"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Mantenimiento desactivado"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Noticias generales"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Noticias de negocios y finanzas"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Noticias de deportes"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Noticias de espectáculos"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Local"</string>
- <string name="local_enable" msgid="6370463247609136359">"Noticias locales activadas"</string>
- <string name="local_disable" msgid="4405691986943795798">"Noticias locales activadas"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regional"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Noticias regionales activadas"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Noticias regionales desactivadas"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Nacional"</string>
- <string name="national_enable" msgid="1172443648912246952">"Noticias nacionales activadas"</string>
- <string name="national_disable" msgid="326018148178601166">"Noticias nacionales desactivadas"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Internacional"</string>
- <string name="international_enable" msgid="5855356769925044927">"Noticias internacionales activadas"</string>
- <string name="international_disable" msgid="2850648591041088931">"Noticias internacionales desactivadas"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Idioma"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Seleccionar el idioma de las noticias"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Inglés"</item>
- <item msgid="1151988412809572526">"Francés"</item>
- <item msgid="577840534704312665">"Español"</item>
- <item msgid="8385712091143148180">"Japonés"</item>
- <item msgid="1858401628368130638">"Coreano"</item>
- <item msgid="1933212028684529632">"Chino"</item>
- <item msgid="1908428006803639064">"Hebreo"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Idiomas"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Clima local"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Clima local activado"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Clima local desactivado"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Informes del tráfico de área"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Informes del tráfico de área activados"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Informes del tráfico de área desactivados"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Programaciones de vuelo del aeropuerto local"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Programaciones de vuelo del aeropuerto local activadas"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Programaciones de vuelo del aeropuerto local activadas"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restaurantes"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restaurantes habilitados"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restaurantes desactivados"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Alojamientos"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Alojamientos activados"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Alojamientos desactivados"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Directorio Reventa"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Directorio Reventa activado"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Directorio Reventa desactivado"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Anuncios"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Anuncios activados"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Anuncios desactivados"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Stock Quotes"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Stock Quotes activado"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Stock Quotes desactivado"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Oportunidades de empleo"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Oportunidades de empleo activadas"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Oportunidades de empleo desactivadas"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Medicina, salud y hospitales"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Medicina, salud y hospitales activado"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Medicina, salud y hospitales desactivado"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Noticias de tecnología"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Noticias de tecnología desactivadas"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Noticias de tecnología activadas"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Varias categorías"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Varias categorías activadas"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Varias categorías desactivadas"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Preferencias de red de GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Aún no está implementado"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Preferencias de red de GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (modo automático)"</item>
- <item msgid="8912042051809329533">"WCDMA solamente"</item>
- <item msgid="8776934131146642662">"GSM solamente"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (WCDMA preferido)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Utilizar sólo redes 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Guarda la batería"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Sistema seleccionado"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Cambiar el modo de roaming de CDMA"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Sistema seleccionado"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Página principal solamente"</item>
- <item msgid="1205664026446156265">"Automático"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Modo de roaming CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Cambiar el modo de roaming de CDMA"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"Modo de roaming CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Redes de inicio solamente"</item>
- <item msgid="8174642753290624634">"Redes afiliadas"</item>
- <item msgid="2241951431403168661">"Cualquier red"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Preferencias de red CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Aún no está implementado"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Preferencia de red CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"CDMA solamente"</item>
- <item msgid="2683555124647197574">"EvDo solamente"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"PRUEBA de suscripción de CDMA"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Cambiar entre RUIM/SIM y NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"suscripción"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Números de marc. fijos"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Lista de NMF"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Activación de NMF"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Los números de marcación fija están activados"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Los números de marcación fija (NMF) están desactivados"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Habilitar NMF"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Desactivar NMF"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Cambiar PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Desactivar NMF"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Activar NMF"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Administrar números de marcación fija"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Cambiar PIN para acceso de NMF"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Administrar lista de números de teléfono"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Privacidad de voz"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Activar modo de privacidad mejorada"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Modo TTY"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Activar modo TTY"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Modo TTY"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Establecer modo de TTY"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Intentar nuevamente automáticamente"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Activar modo Intentar nuevamente automáticamente"</string>
- <string name="menu_add" msgid="1882023737425114762">"Agregar contacto"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Editar contacto"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Eliminar contacto"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Ingresar PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Nombre"</string>
- <string name="number" msgid="7905950798349903858">"Número"</string>
- <string name="save" msgid="4094274636321939086">"Guardar"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Agregar número de marcación fija"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Agregando número de marcación fija..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Número de marcación fija agregado"</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Editar número de marcación fija"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Actualizando número de marcación fija..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Número de marcación fija actualizado"</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Eliminar número de marcación fija"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Eliminando número de marcación fija..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Número de marcación fija eliminado"</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN (Número fijo) desactualizado: Ingresaste un NIP incorrecto."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN (Número fijo) desactualizado: El número no puede exceder los 20 dígitos."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Leyendo la tarjeta SIM..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"No hay contactos en tu tarjeta SIM."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Seleccionar contactos para importar"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Habilitar/inhabilitar PIN de SIM"</string>
- <string name="change_pin" msgid="9174186126330785343">"Cambiar PIN de SIM"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"PIN de SIM:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"PIN anterior"</string>
- <string name="newPinLabel" msgid="207488227285336897">"PIN nuevo"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Confirmar PIN nuevo"</string>
- <string name="badPin" msgid="4154316827946559447">"El PIN anterior ingresado no es correcto. Vuelve a intentarlo."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Los PIN que has ingresado no coinciden. Vuelve a intentarlo."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Escribe un PIN que tenga de 4 a 8 números."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Desactivar PIN de SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Habilitar PIN de SIM"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Espera, por favor..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"PIN de SIM activado"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"PIN de SIM desactivado"</string>
- <string name="pin_failed" msgid="6597695909685242127">"El PIN que has ingresado es incorrecto"</string>
- <string name="pin_changed" msgid="9000716792724195093">"PIN de SIM cambiado correctamente"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Contraseña incorrecta. La tarjeta SIM está bloqueada. Se solicitó PUK2."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Reenviar cuando está ocupado"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"PIN2 nuevo"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Confirmar PIN2 nuevo"</string>
- <string name="badPuk2" msgid="4072035207011308856">"El PUK2 ingresado no es correcto. Vuelve a intentarlo."</string>
- <string name="badPin2" msgid="515218795152422178">"El PIN2 anterior ingresado no es correcto. Vuelve a intentarlo."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Los PIN2 ingresados no coinciden. Vuelve a intentarlo."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Escribe un PIN2 que tenga de 4 a 8 números."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Escribe un PUK2 de 8 cifras."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN 2 cambiado correctamente"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Escribir código PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Contraseña incorrecta. Cambia el PIN2 y vuelve a intentarlo."</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Contraseña incorrecta. La tarjeta SIM está bloqueada. Se solicitó PUK2."</string>
- <string name="doneButton" msgid="2859593360997984240">"Finalizado"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Llamada en conferencia <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Volver a la llamada"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Continuar sin tarjeta SIM"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"No se encontró tarjeta SIM. Coloca una en el teléfono."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Descartar"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Desbloquear"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Autenticando PIN..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Núm. de correo de voz"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Marcando"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Intentando nuevamente"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Llamada actual"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Llamada en conferencia"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Llamada entrante"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Llamada en espera de CDMA"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Llamada finalizada"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"En espera"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Colgando"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"En llamada"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Llamada perdida"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Llamadas perdidas"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> llamadas perdidas"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Se perdieron las llamadas de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Llamada actual (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"En espera"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Correo de voz nuevo"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Correo de voz nuevo (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Marcar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número de correo de voz desconocido"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Sin servicio"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"La red seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no está disponible"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Para realizar una llamada, primero desactive el modo Airplane."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"No registrado en la red."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"La red móvil no está disponible."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Llamada no enviada. No se ingresó un número válido."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Llamada no enviada."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Iniciar la secuencia de MMI"</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Iniciando secuencia de códigos de función..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Servicio no admitido."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"No es posible cambiar llamadas."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"No es posible separar la llamada."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"No es posible transferir la llamada."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"No es posible realizar llamadas en conferencia."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"No es posible rechazar la llamada."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"No es posible publicar la(s) llamada(s)."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Llamada de emergencia"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Encendiendo radio..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Área fuera de servicio. Intentando nuevamente..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Llamada no enviada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> no es un número de emergencia."</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"La llamada no pudo enviarse. ¡Marca un número de emergencia!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilizar teclado para marcar"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Teclado de tonos del teléfono"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Teclado telefónico"</string>
- <string name="touchLockText" msgid="566824588267376287">"hacer doble golpe"\n"para desbloquear"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Presiona dos veces"\n"para responder"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Presiona dos veces"\n"para rechazar"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Retener"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"No retener"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Finalizar"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclado telefónico"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Ocultar"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Altavoces"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Silenciar"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Agreg. Llam."</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Combinar llamadas"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Cambiar"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Administrar llamadas"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Administrar"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importar"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importar todo"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importando contactos SIM"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importar desde contactos"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Ayudas auditivas"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Activar compatibilidad de ayuda auditiva"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY apagado"</item>
- <item msgid="3971695875449640648">"TTY total"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Texto de ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Tonos de DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Establecer la longitud de los tonos de DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normal"</item>
- <item msgid="2883365539347850535">"Largo"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Mensaje de red"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Activar tu teléfono"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Es necesario realizar una llamada especial para activar tu servicio de teléfono."\n\n"Luego de presionar \"Activar\", escucha las instrucciones suministradas para activar tu teléfono."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Toca “Activar” para colocar una llamada especial que active tu teléfono en la red móvil de tu proveedor de servicios de telefonía móvil, para que puedas colocar llamadas y conectarte con redes de datos móviles."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"¿Deseas omitir la activación?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Si omites la activación, no puedes colocar llamadas o conectarte con redes móviles de datos (a pesar de que te puedes conectar a redes de Wi-Fi). Hasta que actives tu teléfono, se te solicitará que lo actives cada vez que lo enciendas."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Omitir"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Activar"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Activar"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"¡Se activó el teléfono!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problema con la activación"</string>
- <string name="ota_listen" msgid="162923839877584937">"Sigue las instrucciones habladas hasta que escuches que la activación se completó."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Teclado numérico"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Altavoces"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Espera mientras se programa tu teléfono"</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programación incorrecta"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Ahora tu teléfono se encuentra activado. Puede tomar hasta unos 15 minutos para que comience el servicio."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Tu teléfono no se activó. "\n" Es posible que necesites encontrar un área con mejor cobertura (cerca de una ventana, o afuera). "\n\n"Vuelve a intentarlo o llama al servicio para el cliente para más opciones."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"ERROR EN SPC EN EXCESO"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Atrás"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Vuelve a intentarlo"</string>
- <string name="ota_next" msgid="3904945374358235910">"Siguiente"</string>
- <string name="ota_back" msgid="2190038043403850052">"Atrás"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Modo de devolución de llamada de emergencia ingresado"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Modo de devolución de llamada de emergencia"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"La conexión de datos se ha desactivado"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Sin conexión de datos por <xliff:g id="COUNT">%s</xliff:g> minuto"</item>
- <item quantity="other" msgid="3122217344579273583">"Sin conexión de datos por <xliff:g id="COUNT">%s</xliff:g> minutos"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"El teléfono estará en modo de devolución de llamada de emergencia por <xliff:g id="COUNT">%s</xliff:g> minuto. Mientras se encuentre en este modo, no se pueden utilizar las aplicaciones que usen una conexión de datos. ¿Deseas salir ahora?"</item>
- <item quantity="other" msgid="3231879566243957821">"El teléfono estará en modo de devolución de llamada de emergencia por <xliff:g id="COUNT">%s</xliff:g> minutos. Mientras se encuentre en este modo, no se pueden utilizar las aplicaciones que usen una conexión de datos. ¿Deseas salir ahora?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"La acción seleccionada no está disponible en el modo de devolución de llamada de emergencia. El teléfono estará en este modo por <xliff:g id="COUNT">%s</xliff:g> minuto. ¿Deseas salir ahora?"</item>
- <item quantity="other" msgid="3489076611710869904">"La acción seleccionada no está disponible en el modo de devolución de llamada de emergencia. El teléfono estará en este modo por <xliff:g id="COUNT">%s</xliff:g> minutos. ¿Deseas salir ahora?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"La acción seleccionada no está disponible mientras se realice una llamada de emergencia"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Saliendo de modo de devolución de llamada de emergencia"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Sí"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"No"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Descartar"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Config. de correo de voz"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;no establecido&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Serv. de correo de voz"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Configuraciones para <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Otras configuraciones de llamada"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Marcar"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Llamar mediante ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Arrastrar a la derecha para responder"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Arrastra a la izquierda para silenciar el timbre"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Arrastra a la izquierda para rechazar"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Arrastra a la derecha para responder y"\n" mantener la llamada activa."</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Arrastra a la derecha para responder y"\n" finalizar la llamada activa."</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Arrastra a la derecha para responder y"\n"finalizar la llamada en espera."</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Respuesta"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Rechazar"</string>
-</resources>
diff --git a/phone/res/values-es/strings.xml b/phone/res/values-es/strings.xml
deleted file mode 100644
index 04838b3..0000000
--- a/phone/res/values-es/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Contactos"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoritos"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Llamar"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Llamada de emergencia"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Teléfono"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Registro"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Lista de FDN"</string>
- <string name="unknown" msgid="6878797917991465859">"Desconocido"</string>
- <string name="private_num" msgid="6713286113000232309">"Número privado"</string>
- <string name="payphone" msgid="1931775086311769314">"Teléfono público"</string>
- <string name="onHold" msgid="9035493194749959955">"En espera"</string>
- <string name="ongoing" msgid="8300874342848721367">"Llamada actual"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Línea ocupada"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Red ocupada"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"No hay señal"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Se ha superado el límite de ACM."</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Señal móvil desactivada"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"No hay tarjeta SIM o se ha producido un error de tarjeta SIM."</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Área fuera de servicio"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Las llamadas salientes están restringidas por FDN."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"No se pueden realizar llamadas salientes mientras esté activada la restricción de llamadas."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Todas las llamadas están limitadas por el control de acceso."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Las llamadas de emergencia están limitadas por el control de acceso."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Las llamadas normales están limitadas por el control de acceso."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: teléfono bloqueado hasta el próximo ciclo de carga"</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: llamada finalizada"</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: llamada interceptada"</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: reorganización"</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: rechazo de opción de servicio"</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: orden de reintento"</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: error de acceso"</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: reemplazada"</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Solo es posible realizar llamadas de emergencia."</string>
- <string name="confCall" msgid="1904840547188336828">"Conferencia telefónica"</string>
- <string name="call_lost" msgid="317670617901479594">"La llamada se ha perdido."</string>
- <string name="retry" msgid="8462986804300767852">"Reintentar"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Llamada perdida"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"El código MMI se ha iniciado."</string>
- <string name="ussdRunning" msgid="485588686340541690">"Código USSD en ejecución..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"El código MMI se ha cancelado."</string>
- <string name="cancel" msgid="5044513931633602634">"Cancelar"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Altavoz"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Silenciar"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Retener"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Finalizar"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Alternar"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"A tres"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Añadir"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Administrar conferencia telefónica"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Mostrar teclado"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Ocultar teclado"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Retener llamada actual"\n"y responder"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Finalizar llamada actual"\n"y responder"</string>
- <string name="ok" msgid="3811371167865772377">"Aceptar"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Pulsa la tecla de menú para ver las opciones de llamada."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Pulsa la tecla de menú para ver las opciones de llamada. Utiliza el teclado para marcar"</string>
- <string name="menu_answer" msgid="116686205042231098">"Responder"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorar"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"¿Deseas enviar los siguientes tonos?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Enviando tonos"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Enviar"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Sí"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Sustituir el carácter comodín por"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Falta el número del buzón de voz."</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"No se ha almacenado ningún número de buzón de voz en la tarjeta SIM."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Añadir número"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Cargando..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Introduce el código PIN para desbloquear la tarjeta SIM."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"La tarjeta SIM se ha desbloqueado."</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Nuevo código PIN de tarjeta SIM"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Vuelve a introducir el nuevo código PIN de la tarjeta SIM para confirmarlo."</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Los códigos PIN de tarjeta SIM introducidos no coinciden. Inténtalo de nuevo."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Introduce el código PUK para desbloquear la tarjeta SIM."</string>
- <string name="badPuk" msgid="3213017898690275965">"El código PUK es incorrecto."</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Seguir"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"La tarjeta SIM se ha desbloqueado. El teléfono se está desbloqueando..."</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN de desbloqueo de red de tarjeta SIM"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Desbloquear"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Descartar"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Solicitando desbloqueo de red..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"La solicitud de desbloqueo de red no se ha realizado correctamente."</string>
- <string name="unlock_success" msgid="6770085622238180152">"El desbloqueo de red se ha realizado correctamente."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Configuración de llamadas GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Configuración de llamada CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"APN"</string>
- <string name="settings_label" msgid="3876743539816984008">"Configuración de red"</string>
- <string name="voicemail" msgid="8693759337917898954">"Buzón de voz"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"Buzón de voz:"</string>
- <string name="networks" msgid="8873030692174541976">"Operadores de red"</string>
- <string name="call_settings" msgid="6112441768261754562">"Configuración de llamada"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Configuración adicional"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Configuración adicional de llamadas solo GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Configuración adicional de llamadas CDMA"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Configuración adicional de llamadas solo CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Configuración del servicio de red"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"ID de emisor"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Número oculto en llamadas salientes"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Número mostrado en llamadas salientes"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Utilizar la configuración de operador predeterminada para mostrar mi número en las llamadas salientes"</string>
- <string name="labelCW" msgid="6120513814915920200">"Llamada en espera"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Informarme de las llamadas entrantes durante las llamadas"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Informarme de las llamadas entrantes durante las llamadas"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Configuración de desvío de llamada"</string>
- <string name="labelCF" msgid="2574386948026924737">"Desvío de llamada"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Siempre"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Utilizar siempre este número"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Desviar todas las llamadas"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Desviar todas las llamadas a {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Número no disponible"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Inhabilitado"</string>
- <string name="labelCFB" msgid="218938523102207587">"Línea ocupada"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Número cuando la línea esté ocupada"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Desviando a {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Inhabilitado"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Tu operador no permite inhabilitar el desvío de llamadas cuando el teléfono está ocupado."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Llamada sin respuesta"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Número cuando no se responde la llamada"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Desviando a {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Inhabilitado"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Tu operador no permite inhabilitar el desvío de llamadas cuando el teléfono no responde."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"No se establece la llamada"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Número cuando no se puede establecer la llamada"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Desviando a {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Inhabilitado"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Tu operador no permite inhabilitar el desvío de llamadas cuando el teléfono no puede establecer la llamada."</string>
- <string name="updating_title" msgid="6146755386174019046">"Configuración de llamada"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Error de configuración de llamada"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Leyendo configuración..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"Actualizando configuración..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Restableciendo configuración…"</string>
- <string name="response_error" msgid="6674110501330139405">"Respuesta inesperada de la red"</string>
- <string name="exception_error" msgid="7027667130619518211">"Error en la tarjeta SIM o en la red."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Activar la señal móvil antes de ver esta configuración"</string>
- <string name="close_dialog" msgid="2365884406356986917">"Aceptar"</string>
- <string name="enable" msgid="1059008390636773574">"Habilitar"</string>
- <string name="disable" msgid="7274240979164762320">"Inhabilitar"</string>
- <string name="change_num" msgid="239476305819844391">"Actualizar"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Valor predeterminado de red"</item>
- <item msgid="7876195870037833661">"Ocultar número"</item>
- <item msgid="1108394741608734023">"Mostrar número"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Guardar número de buzón de voz"</string>
- <string name="vm_changed" msgid="380744030726254139">"El número del buzón de voz se ha cambiado."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"El cambio de número de buzón de voz no se ha realizado correctamente."\n"Si el problema persiste, ponte en contacto con tu operador."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"El cambio de número de desvío no se ha realizado correctamente."\n"Si el problema persiste, ponte en contacto con tu operador."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Se ha producido un error al recuperar y guardar la configuración actual del número de desvío."\n"¿Quieres realizar el cambio al nuevo operador de todas formas?"</string>
- <string name="no_change" msgid="3186040086622435212">"No se ha realizado ningún cambio."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Seleccionar servicio de buzón de voz"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Mi operador"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Configuración de red móvil"</string>
- <string name="label_available" msgid="1181658289009300430">"Redes disponibles"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Buscando..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"No se ha encontrado ninguna red."</string>
- <string name="search_networks" msgid="1601136049300882441">"Buscar redes"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Se ha producido un error al buscar redes."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Registrándose en <xliff:g id="NETWORK">%s</xliff:g>..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"La tarjeta SIM no permite una conexión a esta red."</string>
- <string name="connect_later" msgid="500090982903469816">"No se puede establecer conexión con la red, inténtalo de nuevo más tarde."</string>
- <string name="registration_done" msgid="495135664535876612">"Registrado en la red"</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Seleccionar un operador de red"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Buscar todas las redes disponibles"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Selección automática"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Seleccionar la red preferida de forma automática"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Registro automático..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Modo de red"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Cambiar el modo operativo de la red"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Preferencia de modo de red"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Global"</item>
- <item msgid="3273348576277144124">"Solo EvDo"</item>
- <item msgid="454610224530856274">"CDMA sin EvDo"</item>
- <item msgid="8928247118825616081">"Modo automático de CDMA/EvDo"</item>
- <item msgid="8595462903294812666">"Modo automático de GSM/WCDMA"</item>
- <item msgid="5189164180446264504">"Solo WCDMA"</item>
- <item msgid="5714714953966979187">"Solo GSM"</item>
- <item msgid="4775796025725908913">"Preferencia de GSM/WCDMA"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Datos habilitados"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Permitir el acceso a los datos a través de la red móvil"</string>
- <string name="roaming" msgid="8871412572928323707">"Itinerancia de datos"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Establecer conexión con servicios de datos en itinerancia"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Establecer conexión con servicios de datos en itinerancia"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Has perdido la conectividad de datos porque has dejado desactivada la itinerancia de datos de tu red doméstica."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"¿Permitir itinerancia de datos? Los costes de itinerancia que deberás asumir pueden ser significativos."</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Opciones GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Opciones de CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Uso de datos"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Polít datos operador"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Datos del período actual"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Período uso datos"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Política velocidad datos"</string>
- <string name="throttle_help" msgid="243651091785169900">"Más información"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%) de período máximo de <xliff:g id="USED_2">%3$s</xliff:g>."\n"Próx período en <xliff:g id="USED_3">%4$d</xliff:g> días (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%) de período máx de <xliff:g id="USED_2">%3$s</xliff:g>"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Máx de <xliff:g id="USED_0">%1$s</xliff:g> superado."\n"Frec datos reducida a <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g>% del ciclo transcurrido."\n"Próx período en <xliff:g id="USED_1">%2$d</xliff:g> días (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Frec datos se reduce a <xliff:g id="USED">%1$d</xliff:g> Kb/s si se supera límite uso datos"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Más información sobre política de uso de datos móviles de tu operador"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"SMS de difusión móvil"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"SMS de difusión móvil"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"SMS de difusión móvil"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"SMS de difusión móvil habilitado"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"SMS de difusión móvil inhabilitado"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Configuración de SMS de difusión móvil"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Difusión de emergencia"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Difusión de emergencia habilitada"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Difusión de emergencia inhabilitada"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Servicios administrativos"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Servicios administrativos habilitados"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Servicios administrativos habilitados"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Mantenimiento"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Mantenimiento habilitado"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Mantenimiento inhabilitado"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Noticias generales"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Noticias financieras y comerciales"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Noticias deportivas"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Noticias de ocio"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Local"</string>
- <string name="local_enable" msgid="6370463247609136359">"Noticias locales habilitadas"</string>
- <string name="local_disable" msgid="4405691986943795798">"Noticias locales inhabilitadas"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regional"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Noticias regionales habilitadas"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Noticias regionales inhabilitadas"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Nacional"</string>
- <string name="national_enable" msgid="1172443648912246952">"Noticias nacionales habilitadas"</string>
- <string name="national_disable" msgid="326018148178601166">"Noticias nacionales inhabilitadas"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Internacional"</string>
- <string name="international_enable" msgid="5855356769925044927">"Noticias internacionales habilitadas"</string>
- <string name="international_disable" msgid="2850648591041088931">"Noticias internacionales inhabilitadas"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Idioma"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Seleccionar el idioma de las noticias"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Inglés"</item>
- <item msgid="1151988412809572526">"Francés"</item>
- <item msgid="577840534704312665">"Español"</item>
- <item msgid="8385712091143148180">"Japonés"</item>
- <item msgid="1858401628368130638">"Coreano"</item>
- <item msgid="1933212028684529632">"Chino"</item>
- <item msgid="1908428006803639064">"Hebreo"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Idiomas"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Información meteorológica local"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Información meteorológica local habilitada"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Información meteorológica habilitada"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Informes de tráfico de área"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Informes de tráfico de área habilitados"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Informes de tráfico de área inhabilitados"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Horarios de vuelos del aeropuerto local"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Horarios de vuelos del aeropuerto local habilitados"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Horarios de vuelos del aeropuerto local inhabilitados"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restaurantes"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restaurantes habilitados"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restaurantes inhabilitados"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Alojamientos"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Alojamientos habilitados"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Alojamientos inhabilitados"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Directorio de comercios"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Directorio de comercios habilitado"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Directorio de comercios inhabilitado"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Anuncios"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Anuncios habilitados"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Anuncios inhabilitados"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Cotizaciones en bolsa"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Cotizaciones en bolsa habilitadas"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Cotizaciones en bolsa inhabilitadas"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Oportunidades de empleo"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Oportunidades de empleo habilitadas"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Oportunidades de empleo inhabilitadas"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Servicios médicos, sanitarios y hospitalarios"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Servicios médicos, sanitarios y hospitalarios\nhabilitados"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Servicios médicos, sanitarios y hospitalarios inhabilitados"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Noticias tecnológicas"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Noticias tecnológicas habilitadas"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Noticias tecnológicas inhabilitadas"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Categoría múltiple"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Categoría múltiple habilitada"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Categoría múltiple inhabilitada"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Preferencias de red GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Aún no se ha implementado."</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Preferencias de red GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (modo automático)"</item>
- <item msgid="8912042051809329533">"Sólo WCDMA"</item>
- <item msgid="8776934131146642662">"Solo GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (preferencia de WCDMA)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Utilizar sólo redes 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Ahorrar batería"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Selección de sistema"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Cambiar modo de itinerancia CDMA"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Selección de sistema"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Solo sistema doméstico"</item>
- <item msgid="1205664026446156265">"Automático"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Modo de itinerancia CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Cambiar modo de itinerancia CDMA"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"modo de itinerancia CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Solo redes domésticas"</item>
- <item msgid="8174642753290624634">"Redes afiliadas"</item>
- <item msgid="2241951431403168661">"Cualquier red"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Preferencias de red CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Aún no se ha implementado."</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Preferencias de red CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Sólo CDMA"</item>
- <item msgid="2683555124647197574">"Solo EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"PRUEBA de suscripción CDMA"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Cambiar entre RUIM/SIM y NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"suscripción"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Marcación fija"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Lista de FDN"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Activación de FDN"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Los números de marcación fija están habilitados."</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Los números de marcación fija están inhabilitados."</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Habilitar FDN"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Inhabilitar FDN"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Cambiar PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Inhabilitar FDN"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Habilitar FDN"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Administrar números de marcación fija"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Cambiar PIN para acceso de FDN"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Administrar lista de números de teléfono"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Privacidad de voz"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Habilitar modo de privacidad mejorado"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Modo TTY"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Habilitar modo TTY"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Modo TTY"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Establecer modo TTY"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Reintento automático"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Habilitar modo de reintento automático"</string>
- <string name="menu_add" msgid="1882023737425114762">"Añadir contacto"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Editar contacto"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Eliminar contacto"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Introducir PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Nombre"</string>
- <string name="number" msgid="7905950798349903858">"Número"</string>
- <string name="save" msgid="4094274636321939086">"Guardar"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Añadir número de marcación fija"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Añadiendo número de marcación fija..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Se ha añadido el número de marcación fija."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Editar número de marcación fija"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Actualizando número de marcación fija..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Se ha actualizado el número de marcación fija."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Eliminar número de marcación fija"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Eliminando número de marcación fija..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Se ha eliminado el número de marcación fija."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN no actualizado: has introducido un PIN incorrecto."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN no actualizado: el número no puede superar los 20 dígitos."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Leyendo desde tarjeta SIM…"</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"No hay ningún contacto en la tarjeta SIM."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Seleccionar contactos para importar"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Habilitar/inhabilitar PIN de tarjeta SIM"</string>
- <string name="change_pin" msgid="9174186126330785343">"Cambiar PIN de tarjeta SIM"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"PIN de tarjeta SIM:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"PIN antiguo"</string>
- <string name="newPinLabel" msgid="207488227285336897">"PIN nuevo"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Confirmar PIN nuevo"</string>
- <string name="badPin" msgid="4154316827946559447">"El PIN antiguo que has introducido no es correcto. Inténtalo de nuevo."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Los códigos PIN introducidos no coinciden. Inténtalo de nuevo."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Introduce un código PIN con una longitud comprendida entre cuatro y ocho dígitos."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Inhabilitar PIN de tarjeta SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Habilitar PIN de tarjeta SIM"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Por favor, espera..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"El PIN de la tarjeta SIM se ha habilitado."</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"El PIN de la tarjeta SIM está inhabilitado."</string>
- <string name="pin_failed" msgid="6597695909685242127">"El PIN que has introducido no es correcto."</string>
- <string name="pin_changed" msgid="9000716792724195093">"El PIN de la tarjeta SIM se ha modificado correctamente."</string>
- <string name="puk_requested" msgid="3898394204193202803">"Contraseña incorrecta; la tarjeta SIM está bloqueada. Se ha solicitado el código PUK2."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"PIN2 antiguo"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"PIN2 nuevo"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Confirmar PIN2 nuevo"</string>
- <string name="badPuk2" msgid="4072035207011308856">"El PUK2 que has introducido no es correcto. Inténtalo de nuevo."</string>
- <string name="badPin2" msgid="515218795152422178">"El PIN2 antiguo que has introducido no es correcto. Inténtalo de nuevo."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Los códigos PIN2 introducidos no coinciden. Inténtalo de nuevo."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Introduce un código PIN2 con una longitud comprendida entre cuatro y ocho dígitos."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Introduce un código PUK2 con una longitud de 8 dígitos."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"El PIN2 se ha cambiado correctamente."</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Introducir código PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Contraseña incorrecta; cambia el PIN2 e inténtalo de nuevo."</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Contraseña incorrecta; la tarjeta SIM está bloqueada. Se ha solicitado el código PUK2."</string>
- <string name="doneButton" msgid="2859593360997984240">"Listo"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Conferencia telefónica<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Volver a la llamada"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Continuar sin tarjeta SIM"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"No se ha encontrado ninguna tarjeta SIM. Inserta una tarjeta SIM en el teléfono."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Descartar"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Desbloquear"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Autenticando PIN..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Número del buzón de voz"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Llamando"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Reintentando"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Llamada actual"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Conferencia telefónica"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Llamada entrante"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Llamada en espera de CDMA"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Llamada finalizada"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"En espera"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Colgando"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Llamada entrante"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Llamada perdida"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Llamadas perdidas"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> llamadas perdidas"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Llamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Llamada actual (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"En espera"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Buzón de voz nuevo"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Buzón de voz nuevo (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Marcar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número del buzón de voz desconocido"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Sin servicio"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"La red seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no está disponible."</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Para realizar una llamada, primero debes desactivar el modo avión."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"No se ha registrado en la red."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"La red móvil no está disponible."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"No se ha realizado la llamada; el número introducido no es válido."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"La llamada no se ha enviado."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Iniciando secuencia MMI..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Iniciando secuencia de código de función…"</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Servicio no admitido"</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"No se ha podido cambiar de llamada."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"No se ha podido desvincular la llamada."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"No se ha podido transferir la llamada."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"No se ha podido realizar la conferencia telefónica."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"No se ha podido rechazar la llamada."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"No es posible finalizar las llamadas activas."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Llamada de emergencia"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Activando señal móvil…"</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Área fuera de servicio; reintentando..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"No se ha realizado 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="5048645338094088229">"La llamada no se ha enviado; marca un número de emergencia."</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilizar teclado para marcar"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Teclado táctil de tonos"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Teclado"</string>
- <string name="touchLockText" msgid="566824588267376287">"Da dos toques"\n"para desbloquear"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Toca dos veces"\n"para responder."</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Toca dos veces"\n"para rechazar la llamada."</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Retener"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Soltar"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Finalizar"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclado"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Ocultar"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Altavoz"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Silenciar"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Añadir llamada"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Llamada a tres"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Cambiar"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Administrar llamadas"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Administrar"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importar"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importar todos"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importando contactos de tarjeta SIM..."</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importar de contactos"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Audífonos"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Activar compatibilidad con audífono"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY desactivado"</item>
- <item msgid="3971695875449640648">"Modo TTY completo"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Texto de ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Tonos DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Establecer la longitud de los tonos DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normal"</item>
- <item msgid="2883365539347850535">"Largo"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Mensaje de red"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Activar tu teléfono"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Es necesario realizar una llamada especial para activar el servicio telefónico. "\n\n"Tras pulsar \"Activar\", escucha las instrucciones sobre cómo activar el teléfono."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Toca \"Activar\" para realizar una llamada especial que active el teléfono en la red móvil de tu operador. De este modo, podrás realizar llamadas y conectarte a las redes de datos móviles."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"¿Quieres omitir la activación?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Si omites la activación, no podrás realizar llamadas ni conectarte a las redes de datos móviles (aunque sí podrás conectarte a las redes Wi-Fi). Se te pedirá que actives el teléfono cada vez que lo enciendas hasta que realices la activación."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Omitir"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Activar"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Activar"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"El teléfono está activado."</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problema con la activación"</string>
- <string name="ota_listen" msgid="162923839877584937">"Sigue las instrucciones habladas hasta que escuches que la activación se ha completado."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Teclado"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Altavoz"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Espera mientras se programa tu teléfono."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programación incorrecta"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Tu teléfono ya está activado. El servicio puede tardar un máximo de 15 minutos en iniciarse."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"El teléfono no se ha activado. "\n"Es posible que necesites situarte en un área con mejor cobertura (cerca de una ventana o en el exterior). "\n\n"Inténtalo de nuevo o llama al servicio de atención al cliente para consultar más opciones."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"EXCESO DE ERRORES DE SPC"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Atrás"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Volver a intentarlo"</string>
- <string name="ota_next" msgid="3904945374358235910">"Siguiente"</string>
- <string name="ota_back" msgid="2190038043403850052">"Anterior"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Se ha activado el modo de devolución de llamada de emergencia."</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Modo de devolución de llamada de emergencia"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Conexión de datos inhabilitada"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Ninguna conexión de datos durante <xliff:g id="COUNT">%s</xliff:g> minuto"</item>
- <item quantity="other" msgid="3122217344579273583">"Ninguna conexión de datos durante <xliff:g id="COUNT">%s</xliff:g> minutos"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"El teléfono permanecerá en modo de devolución de llamada de emergencia durante <xliff:g id="COUNT">%s</xliff:g> minuto. Mientras este modo esté activo, no se podrá utilizar ninguna aplicación que utilice una conexión de datos. ¿Deseas salir ahora?"</item>
- <item quantity="other" msgid="3231879566243957821">"El teléfono permanecerá en modo de devolución de llamada de emergencia durante <xliff:g id="COUNT">%s</xliff:g> minutos. Mientras este modo esté activo, no se podrá utilizar ninguna aplicación que utilice una conexión de datos. ¿Deseas salir ahora?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"La acción seleccionada no está disponible en el modo de devolución de llamada de emergencia. El teléfono permanecerá en este modo durante <xliff:g id="COUNT">%s</xliff:g> minuto. ¿Deseas salir ahora?"</item>
- <item quantity="other" msgid="3489076611710869904">"La acción seleccionada no está disponible en el modo de devolución de llamada de emergencia. El teléfono permanecerá en este modo durante <xliff:g id="COUNT">%s</xliff:g> minutos. ¿Deseas salir ahora?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"La acción seleccionada no está disponible en modo de llamada de emergencia."</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Saliendo del modo de devolución de llamada de emergencia"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Sí"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"No"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Descartar"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Configuración de buzón de voz"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;sin definir&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Servicio de buzón de voz"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Configuración de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Otras opciones de llamada"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Llamar"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Llamando a través de ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Arrastrar a la derecha para responder"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Arrastrar a la izquierda para silenciar el timbre"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Arrastrar a la izquierda para rechazar"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Arrastrar a la derecha para responder y"\n"retener una llamada activa"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Arrastrar a la derecha para responder y"\n"finalizar una llamada activa"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Arrastrar a la derecha para responder y"\n"finalizar una llamada en espera"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Responder"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Rechazar"</string>
-</resources>
diff --git a/phone/res/values-fr/strings.xml b/phone/res/values-fr/strings.xml
deleted file mode 100644
index e31a77d..0000000
--- a/phone/res/values-fr/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Contacts"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoris"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Appeler"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Appels d\'urgence"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Téléphone"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Appels"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Liste de numéros autorisés"</string>
- <string name="unknown" msgid="6878797917991465859">"Inconnu"</string>
- <string name="private_num" msgid="6713286113000232309">"Numéro privé"</string>
- <string name="payphone" msgid="1931775086311769314">"Cabine téléphonique"</string>
- <string name="onHold" msgid="9035493194749959955">"En attente"</string>
- <string name="ongoing" msgid="8300874342848721367">"Appel en cours"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Ligne occupée"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Réseau occupé"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Aucun signal"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Limite ACM dépassée"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Signal radio désactivé"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Aucune carte SIM ou erreur de carte SIM"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Hors zone de couverture"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Les appels sortants sont restreints par la liste de numéros autorisés."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Vous ne pouvez pas passer d\'appels sortants tant que l\'interdiction d\'appel est activée."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Tous les appels sont restreints par un contrôle d\'accès."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Les appels d\'urgence sont restreints par un contrôle d\'accès."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Les appels ordinaires sont restreints par un contrôle d\'accès."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA : téléphone bloqué jusqu\'au prochain redémarrage"</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA : appel abandonné"</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA : appel intercepté"</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA : retrier"</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA : rejet de l\'option de service"</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA : nouvelle tentative de tri"</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA : échec de l\'accès"</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA : anticipé"</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Services d\'urgence uniquement"</string>
- <string name="confCall" msgid="1904840547188336828">"Conférence tél."</string>
- <string name="call_lost" msgid="317670617901479594">"L\'appel a été perdu."</string>
- <string name="retry" msgid="8462986804300767852">"Réessayer"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Appel manqué"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"Le code IHM a été lancé."</string>
- <string name="ussdRunning" msgid="485588686340541690">"Exécution du code USSD..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"Code IHM annulé"</string>
- <string name="cancel" msgid="5044513931633602634">"Annuler"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Ht. parleur"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Silencieux"</string>
- <string name="menu_hold" msgid="6970441130344786273">"En attente"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Fin d\'appel"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Permuter"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Fusionner"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Ajouter"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Gérer la conférence téléphonique"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Afficher le clavier"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Masquer le clavier"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Suspendre l\'appel"\n"et répondre"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Terminer l\'appel"\n"et répondre"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Appuyez sur \"Menu\" pour afficher les options d\'appel."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Appuyez sur \"Menu\" pour afficher les options d\'appel • Utilisez le clavier pour composer un numéro"</string>
- <string name="menu_answer" msgid="116686205042231098">"Répondre"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorer"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Envoyer les tonalités suivantes ?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Envoi des tonalités"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Envoyer"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Oui"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Non"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Remplacer le caractère générique par"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Numéro de messagerie vocale manquant"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Aucun numéro de messagerie vocale n\'est enregistré sur la carte SIM."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Ajouter un numéro"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Chargement..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Saisissez un code PIN pour débloquer la carte SIM."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"Carte SIM déverrouillée"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Nouveau code PIN de la carte SIM"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Saisissez une nouvelle fois le nouveau code PIN de la carte SIM pour le confirmer"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Les codes PIN de la carte SIM saisis ne correspondent pas. Veuillez réessayer."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Saisissez la clé PUK pour débloquer la carte SIM"</string>
- <string name="badPuk" msgid="3213017898690275965">"La clé PUK est incorrecte !"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Continuer"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"Votre carte SIM a été déverrouillée. Votre téléphone est en cours de déverrouillage..."</string>
- <string name="label_ndp" msgid="780479633159517250">"Code PIN de déblocage du réseau SIM"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Débloquer"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Rejeter"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Demande de déblocage du réseau…"</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Échec de la demande de déblocage du réseau."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Le réseau a bien été débloqué."</string>
- <string name="imei" msgid="8552502717594321281">"Code IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Paramètres d\'appel GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Paramètres d\'appel CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Noms des points d\'accès"</string>
- <string name="settings_label" msgid="3876743539816984008">"Paramètres du réseau"</string>
- <string name="voicemail" msgid="8693759337917898954">"Messagerie vocale"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"MV :"</string>
- <string name="networks" msgid="8873030692174541976">"Opérateur de réseau"</string>
- <string name="call_settings" msgid="6112441768261754562">"Paramètres d\'appel"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Autres paramètres"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Autres paramètres d\'appel \"GSM uniquement\""</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Autres paramètres d\'appel CDMA"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Autres paramètres d\'appel \"CDMA uniquement\""</string>
- <string name="labelNwService" msgid="4699970172021870983">"Paramètres du service réseau"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"Numéro de l\'appelant"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Numéro masqué pour les appels sortants"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Numéro affiché pour les appels sortants"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Utiliser les paramètres opérateur pour afficher mon n° pour les appels sortants"</string>
- <string name="labelCW" msgid="6120513814915920200">"Appel en attente"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Me signaler les appels entrants lorsque je suis en communication"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Me signaler les appels entrants lorsque je suis en communication"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Paramètres de transfert d\'appel"</string>
- <string name="labelCF" msgid="2574386948026924737">"Transfert d\'appel"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Toujours transférer"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Toujours utiliser ce numéro"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Transfert de tous les appels"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Transfert de tous les appels à {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Numéro indisponible"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Désactivé"</string>
- <string name="labelCFB" msgid="218938523102207587">"Transf. si ligne occupée"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Numéro de renvoi lorsque la ligne est occupée"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Transfert vers le {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Désactivé"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Votre opérateur ne prend pas en charge la désactivation du transfert d\'appel lorsque votre téléphone est occupé."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Transf. si sans réponse"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Numéro de renvoi lorsque vous ne répondez pas"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Transfert vers le {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Désactivé"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Votre opérateur ne prend pas en charge la désactivation du transfert d\'appel lorsque votre téléphone ne répond pas."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Transf. si injoignable"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Numéro de renvoi si injoignable"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Transfert vers le {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Désactivé"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Votre opérateur ne prend pas en charge la désactivation du transfert d\'appel lorsque votre téléphone n\'est pas joignable."</string>
- <string name="updating_title" msgid="6146755386174019046">"Paramètres d\'appel"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Erreur des paramètres d\'appel"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Lecture des paramètres..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"Mise à jour des paramètres..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Rétablissement des paramètres…"</string>
- <string name="response_error" msgid="6674110501330139405">"Réponse inattendue du réseau"</string>
- <string name="exception_error" msgid="7027667130619518211">"Erreur de réseau ou de carte SIM."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Veuillez allumer le signal radio avant d\'afficher ces paramètres."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Activer"</string>
- <string name="disable" msgid="7274240979164762320">"Désactiver"</string>
- <string name="change_num" msgid="239476305819844391">"Mettre à jour"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Réseau par défaut"</item>
- <item msgid="7876195870037833661">"Masquer le numéro"</item>
- <item msgid="1108394741608734023">"Afficher le numéro"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Enregistrer le numéro de messagerie vocale"</string>
- <string name="vm_changed" msgid="380744030726254139">"Le numéro de messagerie vocale a été modifié."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Échec de la modification du numéro de messagerie vocale."\n"Si le problème persiste, veuillez contacter votre opérateur."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Échec de la modification du numéro de transfert."\n"Si le problème persiste, veuillez contacter votre opérateur."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Échec de la récupération et de l\'enregistrement des paramètres actuels du numéro de transfert."\n"Voulez-vous tout de même changer d\'opérateur ?"</string>
- <string name="no_change" msgid="3186040086622435212">"Aucune modification n\'a été apportée."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Choisissez un service de messagerie vocale."</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Mon opérateur"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Paramètres du réseau mobile"</string>
- <string name="label_available" msgid="1181658289009300430">"Réseaux disponibles"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Recherche..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Aucun réseau trouvé."</string>
- <string name="search_networks" msgid="1601136049300882441">"Rechercher les réseaux"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Une erreur s\'est produite lors de la recherche de réseaux."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Enregistrement sur <xliff:g id="NETWORK">%s</xliff:g>..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"Votre carte SIM ne vous autorise pas à vous connecter à ce réseau."</string>
- <string name="connect_later" msgid="500090982903469816">"Impossible de se connecter au réseau pour l\'instant. Veuillez réessayer ultérieurement."</string>
- <string name="registration_done" msgid="495135664535876612">"Enregistré sur le réseau."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Choisir un opérateur réseau"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Chercher tous les réseaux disponibles"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Sélection automatique"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Sélectionner automatiquement"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Enregistrement automatique…"</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Mode réseau"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Changer le mode de fonctionnement du réseau"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Mode réseau préféré"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Général"</item>
- <item msgid="3273348576277144124">"EvDo uniquement"</item>
- <item msgid="454610224530856274">"CDMA sans EvDo"</item>
- <item msgid="8928247118825616081">"CDMA/EvDo automatique"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA automatique"</item>
- <item msgid="5189164180446264504">"WCDMA uniquement"</item>
- <item msgid="5714714953966979187">"GSM uniquement"</item>
- <item msgid="4775796025725908913">"GSM/WCDMA préféré"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Données activées"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Activer l\'accès aux données sur le réseau mobile"</string>
- <string name="roaming" msgid="8871412572928323707">"Itinérance des données"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Se connecter aux services de données lors de l\'itinérance"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Se connecter aux services de données lors de l\'itinérance"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Vous avez été déconnecté car vous avez quitté votre réseau alors que l\'itinérance des données était désactivée."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Autoriser l\'itinérance des données ? Des frais d\'itinérance importants peuvent s\'appliquer !"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Options GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Options CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Utilisation des données"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Règles de l\'opérateur en matière de données"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Données utilisées sur la période en cours"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Période d\'utilisation des données"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Règles relatives au taux de transfert des données"</string>
- <string name="throttle_help" msgid="243651091785169900">"En savoir plus"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> sur <xliff:g id="USED_2">%3$s</xliff:g> - (<xliff:g id="USED_1">%2$d</xliff:g> ٪) du maximum par période"\n"La prochaine période démarre dans <xliff:g id="USED_3">%4$d</xliff:g> jours (<xliff:g id="USED_4">%5$s</xliff:g>)."</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> sur <xliff:g id="USED_2">%3$s</xliff:g> - (<xliff:g id="USED_1">%2$d</xliff:g> ٪) du maximum par période"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"<xliff:g id="USED_0">%1$s</xliff:g> maximum dépassé"\n"Taux de transfert des données réduit à <xliff:g id="USED_1">%2$d</xliff:g> Ko/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g> ٪ du cycle écoulé"\n"La prochaine période démarre dans <xliff:g id="USED_1">%2$d</xliff:g> jours (<xliff:g id="USED_2">%3$s</xliff:g>)."</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Taux de transfert des données réduit à <xliff:g id="USED">%1$d</xliff:g> Ko/s si le plafond d\'utilisation est dépassé"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Plus d\'informations sur les règles de votre opérateur mobile concernant l\'utilisation des données sur son réseau"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Diffusion cellulaire par SMS"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Diffusion cellulaire par SMS"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Cell Broadcast SMS"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Option \"Diffusion cellulaire par SMS\" activée"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Option \"Diffusion cellulaire par SMS\" désactivée"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Paramètres de la diffusion cellulaire par SMS"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Diffusion des services d\'urgence"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Option \"Diffusion des services d\'urgence\" activée"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Option \"Diffusion des services d\'urgence\" désactivée"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Administration"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Option \"Administration\" activée"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Option \"Administration\" désactivée"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Maintenance"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Option \"Maintenance\" activée"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Option \"Maintenance\" désactivée"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Actualités générales"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Économie et finance"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Actualités sportives"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Culture et loisirs"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Locales"</string>
- <string name="local_enable" msgid="6370463247609136359">"Option \"Actualités locales\" activée"</string>
- <string name="local_disable" msgid="4405691986943795798">"Option \"Actualités locales\" désactivée"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Régionales"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Option \"Actualités régionales\" activée"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Option \"Actualités régionales\" désactivée"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Nationales"</string>
- <string name="national_enable" msgid="1172443648912246952">"Option \"Actualités nationales\" activée"</string>
- <string name="national_disable" msgid="326018148178601166">"Option \"Actualités nationales\" désactivée"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Internationales"</string>
- <string name="international_enable" msgid="5855356769925044927">"Option \"Actualités internationales\" activée"</string>
- <string name="international_disable" msgid="2850648591041088931">"Option \"Actualités internationales\" désactivée"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Langue"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Sélectionnez la langue des actualités"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Anglais"</item>
- <item msgid="1151988412809572526">"Français"</item>
- <item msgid="577840534704312665">"Espagnol"</item>
- <item msgid="8385712091143148180">"Japonais"</item>
- <item msgid="1858401628368130638">"Coréen"</item>
- <item msgid="1933212028684529632">"Chinois"</item>
- <item msgid="1908428006803639064">"Hébreu"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Langues"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Météo locale"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Option \"Météo locale\" activée"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Option \"Météo locale\" désactivée"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Infos trafic locales"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Option \"Infos trafic locales\" activée"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Option \"Infos trafic locales\" désactivée"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Horaires des vols des aéroports à proximité"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Option \"Horaires des vols des aéroports à proximité\" activée"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Option \"Horaires des vols des aéroports à proximité\" désactivée"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restaurants"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Option \"Restaurants\" activée"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Option \"Restaurants\" désactivée"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Hébergements"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Option \"Hébergements\" activée"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Option \"Hébergements\" désactivée"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Annuaire des commerces"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Option \"Annuaire des commerces\""</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Option \"Annuaire des commerces\" désactivée"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Annonces"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Option \"Annonces\" activée"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Option \"Annonces\" désactivée"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Cours de bourse"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Option \"Cours de bourse\" activée"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Option \"Cours de bourse\" désactivée"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Offres d\'emploi"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Option \"Offres d\'emploi\" activée"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Option \"Offres d\'emploi\" désactivée"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Médecine, services de santé et hôpitaux"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Option \"Médecine, services de santé et hôpitaux\" activée"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Médecine, services de santé et hôpitaux"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Technologies"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Option \"Nouvelles technologies\" activée"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Option \"Technologies\" désactivée"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Multi-catégories"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Option \"Multi-catégories\" activée"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Option \"Multi-catégories\" désactivée"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Préférences réseau GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Pas encore implémenté"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Préférences réseau GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (mode automatique)"</item>
- <item msgid="8912042051809329533">"WCDMA uniquement"</item>
- <item msgid="8776934131146642662">"GSM uniquement"</item>
- <item msgid="4684679567848300935">"GSM/WCDMA (WCDMA préféré)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Uniquement les réseaux 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Économise la batterie"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Sélection système"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Modifier le mode d\'itinérance CDMA"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Sélection système"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Réseaux domestiques uniquement"</item>
- <item msgid="1205664026446156265">"Automatique"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Mode d\'itinérance CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Modifier le mode d\'itinérance CDMA"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"Mode d\'itinérance CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Réseaux domestiques uniquement"</item>
- <item msgid="8174642753290624634">"Réseaux affiliés"</item>
- <item msgid="2241951431403168661">"N\'importe quel réseau"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Préférences réseau CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Pas encore implémenté"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Préférences réseau CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"CDMA uniquement"</item>
- <item msgid="2683555124647197574">"EvDo uniquement"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"Test d\'enregistrement CDMA"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Basculer entre les cartes RUIM/SIM et NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"abonnement"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Numéros autorisés"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Liste de numéros autorisés"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Activation des numéros autorisés"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"La liste de numéros autorisés est activée."</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Liste de numéros autorisés désactivée"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Activer numéros autorisés"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Désactiver numéros autorisés"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Modifier le code PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Désactiver numéros autorisés"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Activer"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Gérer la liste de numéros autorisés"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Modifier le code PIN pour l\'accès aux numéros autorisés"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Gérer la liste des numéros de téléphone"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Confidentialité vocale"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Activer le mode de confidentialité amélioré"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Mode TTY"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Activer le mode TTY"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Mode TTY"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Définir le mode TTY"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Réessayer automatiquement"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Activer le mode Réessayer automatiquement"</string>
- <string name="menu_add" msgid="1882023737425114762">"Ajouter un contact"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Modifier le contact"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Supprimer le contact"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Saisir le code PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Nom"</string>
- <string name="number" msgid="7905950798349903858">"Numéro"</string>
- <string name="save" msgid="4094274636321939086">"Enregistrer"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Ajouter un numéro autorisé"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Ajout du numéro autorisé..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Numéro autorisé ajouté"</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Modifier le numéro autorisé"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Mise à jour du numéro autorisé…"</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Mise à jour du numéro autorisé effectuée"</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Supprimer un numéro autorisé"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Suppression du numéro autorisé…"</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Numéro autorisé supprimé"</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"Impossible de mettre à jour le numéro autorisé : le code PIN que vous avez saisi est incorrect."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"Impossible de mettre à jour le numéro autorisé : ce type de numéro ne peut pas comporter plus de 20 chiffres."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Lecture de la carte SIM…"</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Aucun contact n\'a été trouvé sur votre carte SIM."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Sélection des contacts à importer"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Activer/désactiver le code PIN de la carte SIM"</string>
- <string name="change_pin" msgid="9174186126330785343">"Modifier le code PIN de la carte SIM"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"Code PIN de la carte SIM :"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Ancien code PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Nouveau code PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Confirmer le nouveau code PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"L\'ancien code PIN saisi est incorrect. Veuillez réessayer."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Les codes PIN saisis ne correspondent pas. Veuillez réessayer."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Saisissez un code PIN comprenant 4 à 8 chiffres."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Désactiver le code PIN de la carte SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Activer le code PIN de la carte SIM"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Merci de patienter..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"Le code PIN de la carte SIM est activé"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"Code PIN de la carte SIM désactivé"</string>
- <string name="pin_failed" msgid="6597695909685242127">"Le code PIN saisi était incorrect."</string>
- <string name="pin_changed" msgid="9000716792724195093">"Le code PIN de la carte SIM a bien été modifié."</string>
- <string name="puk_requested" msgid="3898394204193202803">"Mot de passe incorrect. La carte SIM est verrouillée ! Clé PUK2 requise."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Ancien code PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Nouveau code PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Confirmer le nouveau code PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"Le code PIN2 saisi est incorrect. Veuillez réessayer."</string>
- <string name="badPin2" msgid="515218795152422178">"L\'ancien code PIN2 saisi est incorrect. Veuillez réessayer."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Les codes PIN2 saisis ne correspondent pas. Merci de réessayer."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Saisissez un code PIN2 comprenant 4 à 8 chiffres."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Saisissez une clé PUK2 à 8 chiffres."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"Le code PIN2 a été modifié."</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Saisissez la clé PUK2."</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Le mot de passe est incorrect. Veuillez modifier le code PIN2 et réessayez."</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Mot de passe incorrect. La carte SIM est verrouillée ! Clé PUK2 requise."</string>
- <string name="doneButton" msgid="2859593360997984240">"OK"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Conférence téléphonique à <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Retour à l\'appel"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Continuer sans carte SIM"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Aucune carte SIM n\'a été trouvée. Insérez une carte SIM dans le téléphone."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Rejeter"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Débloquer"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Authentification du code PIN..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"N° messagerie vocale"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Appel en cours…"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Nouvelle tentative"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Appel en cours"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Conférence téléphonique"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Appel entrant"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Appel CDMA en attente"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Fin de l\'appel"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"En attente"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Fin d\'appel"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Appel en cours"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Appel manqué"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Appels manqués"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> appels manqués"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Appel manqué de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Appel en cours (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"En attente"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Nouvelle messagerie vocale"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nouveaux messages vocaux (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Composer le <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Numéro de messagerie vocale inconnu"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Aucun service"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Réseau sélectionné (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non disponible"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Veuillez d\'abord désactiver le mode Avion, afin d\'effectuer un appel."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Non enregistré sur le réseau."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Réseau mobile non disponible"</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"L\'appel n\'a pas été effectué. Le numéro composé n\'est pas valide."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"L\'appel n\'a pas été effectué."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Lancement de la séquence IHM..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Lancement de la séquence de codes de service"</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Ce service n\'est pas pris en charge."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Impossible de changer d\'appel."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Impossible de dissocier l\'appel"</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Impossible de transférer l\'appel."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Impossible d\'effectuer des conférences téléphoniques."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Impossible de refuser l\'appel."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Impossible de libérer le(s) appel(s)."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Appel d\'urgence"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Activation du signal radio..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Hors zone de couverture. Nouvelle tentative..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"L\'appel n\'a pas été effectué. <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="5048645338094088229">"L\'appel n\'a pas été effectué. Veuillez composer un numéro d\'urgence !"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilisez le clavier pour composer un numéro."</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Touches sonores"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Clavier"</string>
- <string name="touchLockText" msgid="566824588267376287">"Appuyez deux fois"\n"pour déverrouiller"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Appuyez deux fois"\n"pour répondre."</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Appuyez deux fois"\n"pour refuser."</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"En attente"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Reprendre"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Raccrocher"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Clavier"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Masquer"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Ht. parleur"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Silencieux"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Autre appel"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Fusionner les appels"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Permuter"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gérer les appels"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Gérer"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importer"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Tout importer"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importation des contacts SIM"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importer à partir des contacts"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Assistance auditive"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Activer la compatibilité du service d\'assistance auditive"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"Mode TTY désactivé"</item>
- <item msgid="3971695875449640648">"TTY complet"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Texte ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Tonalités DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Définir la durée des tonalités DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normales"</item>
- <item msgid="2883365539347850535">"Longues"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Message réseau"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Activer votre téléphone"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Vous devez passer un appel spécial pour activer le service de téléphonie. "\n\n"Après avoir appuyé sur \"Activer\", écoutez les instructions qui vous permettront d\'activer votre téléphone."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Touchez Activer pour passer un appel spécial qui activera votre téléphone sur le réseau mobile de votre opérateur. Vous pourrez ensuite téléphoner et vous connecter à des réseaux de données mobiles."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Ignorer l\'activation ?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Si vous poursuivez sans activer votre mobile, vous ne pourrez ni téléphoner, ni vous connecter à des réseaux de données mobiles. La connexion à un réseau Wi-Fi reste possible. Vous serez invité à effectuer l\'activation à chaque démarrage du téléphone."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Ignorer"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Activer"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Activer"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Votre téléphone est activé !"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problème lors de l\'activation"</string>
- <string name="ota_listen" msgid="162923839877584937">"Suivez les instructions orales jusqu\'au bout de la procédure d\'activation."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Clavier"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Ht. parleur"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Veuillez patienter pendant la programmation de votre téléphone."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Échec de la programmation"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Votre téléphone est désormais activé. Un délai de 15 minutes peut être nécessaire avant de démarrer le service."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Votre téléphone n\'a pas pu être activé. "\n"Vous devez peut-être vous déplacer vers une zone disposant d\'une meilleure couverture (près d\'une fenêtre ou à l\'extérieur). "\n\n"Réessayez ou appelez le service clientèle pour plus d\'options."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"NOMBRE EXCESSIF D\'ÉCHECS SPC"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Retour"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Réessayer"</string>
- <string name="ota_next" msgid="3904945374358235910">"Suivant"</string>
- <string name="ota_back" msgid="2190038043403850052">"Précédent"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Mode de rappel d\'urgence activé"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Mode de rappel d\'urgence"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Connexion des données désactivée"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Aucune connexion de données pendant <xliff:g id="COUNT">%s</xliff:g> minute"</item>
- <item quantity="other" msgid="3122217344579273583">"Aucune connexion de données pendant <xliff:g id="COUNT">%s</xliff:g> minutes"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT">%s</xliff:g> minute. Dans ce mode, aucune application utilisant une connexion de données ne peut être utilisée. Souhaitez-vous quitter ce mode maintenant ?"</item>
- <item quantity="other" msgid="3231879566243957821">"Le téléphone sera en mode de rappel d\'urgence pendant <xliff:g id="COUNT">%s</xliff:g> minutes. Dans ce mode, aucune application utilisant une connexion de données ne peut être utilisée. Souhaitez-vous quitter ce mode maintenant ?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"L\'action sélectionnée n\'est pas disponible lorsque le téléphone est en mode de rappel d\'urgence. Ce mode restera activé pendant <xliff:g id="COUNT">%s</xliff:g> minute. Souhaitez-vous quitter dès maintenant ?"</item>
- <item quantity="other" msgid="3489076611710869904">"L\'action sélectionnée n\'est pas disponible lorsque le téléphone est en mode de rappel d\'urgence. Ce mode restera activé pendant <xliff:g id="COUNT">%s</xliff:g> minutes. Souhaitez-vous quitter dès maintenant ?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"L\'action sélectionnée n\'est pas disponible pendant un appel d\'urgence."</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Sortie du mode de rappel d\'urgence"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Oui"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Non"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Ignorer"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Messagerie vocale"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;non défini&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Service de messagerie"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Paramètres pour <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Autres paramètres d\'appel"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Composer"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Appel via ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Déplacer vers la droite pour répondre"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Déplacer vers la gauche pour passer en mode silencieux"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Déplacer vers la gauche pour refuser"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Déplacer vers la droite pour répondre et"\n"mettre l\'appel en cours en attente"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Déplacer vers la droite pour répondre et"\n"terminer l\'appel en cours"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Déplacer vers la droite pour répondre et"\n"terminer l\'appel en attente"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Répondre"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Refuser"</string>
-</resources>
diff --git a/phone/res/values-it/strings.xml b/phone/res/values-it/strings.xml
deleted file mode 100644
index cd53e62..0000000
--- a/phone/res/values-it/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Contatti"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Preferiti"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Telefono"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Chiamata di emergenza"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefono"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Chiamate"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Elenco FDN"</string>
- <string name="unknown" msgid="6878797917991465859">"Sconosciuto"</string>
- <string name="private_num" msgid="6713286113000232309">"Numero privato"</string>
- <string name="payphone" msgid="1931775086311769314">"Telefono a monete"</string>
- <string name="onHold" msgid="9035493194749959955">"In attesa"</string>
- <string name="ongoing" msgid="8300874342848721367">"Chiamata corrente"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Linea occupata"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Rete occupata"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Nessun segnale"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Limite ACM superato"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Segnale cellulare disattivato"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Nessuna SIM o errore della SIM"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Area non coperta dal servizio"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Chiamate in uscita limitate da FDN."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Impossibile effettuare chiamate in uscita con il blocco chiamate attivo."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Tutte le chiamate sono limitate dal controllo di accesso."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Chiamate di emergenza limitate dal controllo di accesso."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Le normali chiamate sono limitate dal controllo di accesso."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: telefono bloccato fino a ciclo alimentazione."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: chiamata interrotta."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: chiamata intercettata."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: riordinamento."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: rifiuto opzione di servizio."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: riprova ordinamento."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: accesso non riuscito."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: annullato."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Sono possibili solo chiamate di emergenza."</string>
- <string name="confCall" msgid="1904840547188336828">"Audioconferenza"</string>
- <string name="call_lost" msgid="317670617901479594">"La chiamata è stata persa."</string>
- <string name="retry" msgid="8462986804300767852">"Riprova"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Chiama Persa"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"Codice MMI avviato"</string>
- <string name="ussdRunning" msgid="485588686340541690">"Esecuzione codice USSD..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"Codice MMI annullato"</string>
- <string name="cancel" msgid="5044513931633602634">"Annulla"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Altoparlante"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"No audio"</string>
- <string name="menu_hold" msgid="6970441130344786273">"In attesa"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Chiudi"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Scambia"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Unisci"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Aggiungi"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Gestisci audioconferenza"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Mostra tastierino"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Nascondi tastierino"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Sospendi chiamata corrente"\n"e rispondi"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Chiudi chiamata corrente"\n"e rispondi"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Premi Menu per opzioni chiamata."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Premi Menu per opzioni chiamata • Usa tastiera per comporre"</string>
- <string name="menu_answer" msgid="116686205042231098">"Risposta"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignora"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Inviare i numeri successivi?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Invio toni"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Invia"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Sì"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Sostituisci carattere jolly con"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Numero segreteria mancante"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Nessun numero di segreteria presente nella SIM."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Aggiungi numero"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Caricamento..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Digita il codice PIN per sbloccare la SIM."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM sbloccata"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Nuovo PIN della SIM"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Ridigita il nuovo PIN della SIM per confermare"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"I PIN della SIM inseriti non corrispondono. Riprova."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Digita il codice PUK per sbloccare la SIM"</string>
- <string name="badPuk" msgid="3213017898690275965">"Codice PUK errato."</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Continua"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"La SIM è stata sbloccata. Sblocco del telefono in corso..."</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN sblocco rete SIM"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Sblocca"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Chiudi"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Richiesta sblocco rete..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Richiesta di sblocco della rete respinta."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Sblocco della rete riuscito."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Imp. chiamate GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Impostazioni di chiamata CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Nomi punti di accesso"</string>
- <string name="settings_label" msgid="3876743539816984008">"Impostazioni di rete"</string>
- <string name="voicemail" msgid="8693759337917898954">"Segreteria"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"ST:"</string>
- <string name="networks" msgid="8873030692174541976">"Operatori di rete"</string>
- <string name="call_settings" msgid="6112441768261754562">"Impostazioni chiamate"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Altre impostazioni"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Altre impostazioni chiamata solo GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Altre impostazioni chiamata CDMA"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Altre impostazioni chiamata solo CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Impostazioni servizio di rete"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"ID chiamante"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Numero nascosto per chiamate in uscita"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Numero visualizzato in chiamate in uscita"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Usa impostazioni operatore per visualizzare il mio numero in chiamate in uscita"</string>
- <string name="labelCW" msgid="6120513814915920200">"Avviso di chiamata"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Notifica chiamate in entrata durante telefonata"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Notifica chiamate in entrata durante telefonata"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Deviazione chiamate"</string>
- <string name="labelCF" msgid="2574386948026924737">"Deviazione chiamate"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Devia sempre"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Usa sempre questo numero"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Deviazione di tutte le chiamate"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Deviazione di tutte le chiamate al numero {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Numero non disponibile"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Disattivato"</string>
- <string name="labelCFB" msgid="218938523102207587">"Devia se occupato"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Numero se occupato"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Deviazione al numero {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Disattivato"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Il tuo gestore di telefonia mobile non supporta la disattivazione dell\'inoltro chiamate quando il telefono è occupato."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Devia se non si risponde"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Numero se non si risponde"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Deviazione al numero {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Disattivato"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Il tuo gestore di telefonia mobile non supporta la disattivazione dell\'inoltro chiamate quando il telefono non risponde."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Devia se non raggiungib."</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Numero se non raggiungibile"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Deviazione al numero {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Disattivato"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Il tuo gestore di telefonia mobile non supporta la disattivazione dell\'inoltro chiamate quando il telefono non è raggiungibile."</string>
- <string name="updating_title" msgid="6146755386174019046">"Impostazioni chiamate"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Errore durante aggiornam. impostaz. chiamate"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Lettura impostazioni..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"Aggiornamento impostazioni..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Annullamento impostazioni..."</string>
- <string name="response_error" msgid="6674110501330139405">"Risposta imprevista dalla rete."</string>
- <string name="exception_error" msgid="7027667130619518211">"Errore di rete o della SIM."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Attiva il segnale cellulare per visualizzare queste impostazioni."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Attiva"</string>
- <string name="disable" msgid="7274240979164762320">"Disattiva"</string>
- <string name="change_num" msgid="239476305819844391">"Aggiorna"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Rete predefinita"</item>
- <item msgid="7876195870037833661">"Nascondi numero"</item>
- <item msgid="1108394741608734023">"Mostra numero"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Salva numero segreteria"</string>
- <string name="vm_changed" msgid="380744030726254139">"Numero segreteria modificato."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Modifica del numero di segreteria non riuscita."\n"Se il problema persiste, contattare l\'operatore di telefonia."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Modifica del numero di inoltro non riuscita."\n"Se il problema persiste, contattare l\'operatore di telefonia."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Recupero e salvataggio impostazioni numero di deviazione attuale non riusciti."\n"Passare comunque al nuovo provider?"</string>
- <string name="no_change" msgid="3186040086622435212">"Nessuna modifica effettuata."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Scegli il servizio di segreteria"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Il mio gestore"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Impostazioni reti mobili"</string>
- <string name="label_available" msgid="1181658289009300430">"Reti disponibili"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Ricerca..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Nessuna rete trovata."</string>
- <string name="search_networks" msgid="1601136049300882441">"Cerca reti"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Errore durante la ricerca di reti."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Registrazione su <xliff:g id="NETWORK">%s</xliff:g>..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"La SIM non consente la connessione a questa rete."</string>
- <string name="connect_later" msgid="500090982903469816">"Impossibile connettersi a questa rete adesso. Riprova più tardi."</string>
- <string name="registration_done" msgid="495135664535876612">"Registrato sulla rete."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Seleziona un operatore di rete"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Cerca tutte le reti disponibili"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Seleziona automaticamente"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Seleziona automaticamente la rete preferita"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Registrazione automatica..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Modalità rete"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Cambia la modalità di funzionamento della rete"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Modalità di rete preferita"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Globali"</item>
- <item msgid="3273348576277144124">"Solo EvDo"</item>
- <item msgid="454610224530856274">"CDMA senza EvDo"</item>
- <item msgid="8928247118825616081">"CDMA / EvDo automatico"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA automatico"</item>
- <item msgid="5189164180446264504">"Solo WCDMA"</item>
- <item msgid="5714714953966979187">"Solo GSM"</item>
- <item msgid="4775796025725908913">"GSM/WCDMA preferito"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Dati attivati"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Attiva l\'accesso ai dati sulla rete cellulare"</string>
- <string name="roaming" msgid="8871412572928323707">"Roaming dati"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Connessione a servizi di dati in caso di roaming"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Connessione a servizi di dati in roaming"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Connettività dati persa: hai lasciato la rete del tuo operatore con il roaming dati disattivato."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Consentire il roaming dati? I costi potrebbero essere elevati."</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Opzioni GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Opzioni CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Utilizzo dati"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Norme dati gestore"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Dati utilizzati nel periodo corrente"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Periodo utilizzo dati"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Norme velocità dati"</string>
- <string name="throttle_help" msgid="243651091785169900">"Ulteriori informazioni"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%) del <xliff:g id="USED_2">%3$s</xliff:g> max periodo"\n"Il periodo succ. inizia tra <xliff:g id="USED_3">%4$d</xliff:g> gg (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>%) del <xliff:g id="USED_2">%3$s</xliff:g> max periodo"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"<xliff:g id="USED_0">%1$s</xliff:g> max superato"\n"Velocità dati ridotta a <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g>% del ciclo trascorso"\n"Il periodo succ. inizia tra <xliff:g id="USED_1">%2$d</xliff:g> gg (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Velocità dati ridotta a <xliff:g id="USED">%1$d</xliff:g> Kb/s se limite utilizzo dati superato"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Informazioni sulla norme di utilizzo dati della rete cellulare del gestore"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"SMS cell broadcast"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"SMS cell broadcast"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"SMS cell broadcast"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"SMS cell broadcast attivato"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"SMS cell broadcast disattivato"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Impostazioni SMS cell broadcast"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Emergency broadcast"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Emergency broadcast attivato"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Emergency broadcast disattivato"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Amministrative"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Amministrative attivate"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Amministrative disattivate"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Manutenzione"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Manutenzione attivata"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Manutenzione disattivata"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"News generiche"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"News di business e finanza"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"News sportive"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"News di intrattenimento"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Locali"</string>
- <string name="local_enable" msgid="6370463247609136359">"News locali attivate"</string>
- <string name="local_disable" msgid="4405691986943795798">"News locali disattivate"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regionali"</string>
- <string name="regional_enable" msgid="4434680415437834759">"News regionali attivate"</string>
- <string name="regional_disable" msgid="5359325527213850077">"News regionali disattivate"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Nazionali"</string>
- <string name="national_enable" msgid="1172443648912246952">"News nazionali attivate"</string>
- <string name="national_disable" msgid="326018148178601166">"News nazionali disattivate"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Internazionali"</string>
- <string name="international_enable" msgid="5855356769925044927">"News internazionali attivate"</string>
- <string name="international_disable" msgid="2850648591041088931">"News internazionali disattivate"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Lingua"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Seleziona la lingua desiderata per le news"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Inglese"</item>
- <item msgid="1151988412809572526">"Francese"</item>
- <item msgid="577840534704312665">"Spagnolo"</item>
- <item msgid="8385712091143148180">"Giapponese"</item>
- <item msgid="1858401628368130638">"Coreano"</item>
- <item msgid="1933212028684529632">"Cinese"</item>
- <item msgid="1908428006803639064">"Ebraico"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Lingue"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Meteo locale"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Meteo locale attivato"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Meteo locale disattivato"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Bollettini sul traffico dell\'area"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Bollettini sul traffico dell\'area attivati"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Bollettini sul traffico dell\'area disattivati"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Orari di volo aeroporto locale"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Orari di volo aeroporto locale attivati"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Orari di volo aeroporto locale disattivati"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Ristoranti"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Ristoranti attivati"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Ristoranti disattivati"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Alberghi"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Alberghi attivati"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Alberghi disattivati"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Elenco di vendita al dettaglio"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Elenco di vendita al dettaglio attivato"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Elenco di vendita al dettaglio disattivato"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Pubblicità"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Pubblicità attivate"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Pubblicità disattivate"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Quotazioni titoli"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Quotazioni titoli attivate"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Quotazioni titoli disattivate"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Opportunità di impiego"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Opportunità di impiego attivate"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Opportunità di impiego disattivate"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Medicina, salute e ospedale"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Medicina, salute e ospedale attivate"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Medicina, salute e ospedale disattivate"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"News di tecnologia"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"News di tecnologia attivate"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"News di tecnologia disattivate"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Multicategoria"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Multicategoria attivata"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Multicategoria disattivata"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Preferenze di rete GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Non ancora implementato."</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Preferenze di rete GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (modalità automatica)"</item>
- <item msgid="8912042051809329533">"Solo WCDMA"</item>
- <item msgid="8776934131146642662">"Solo GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (WCDMA preferito)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Usa solo reti 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Risparmia batteria"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Selezione sistema"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Cambia la modalità roaming CDMA"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Selezione sistema"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Solo domestica"</item>
- <item msgid="1205664026446156265">"Automatiche"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Modalità roaming CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Cambia la modalità roaming CDMA"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"Modalità roaming CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Solo reti domestiche"</item>
- <item msgid="8174642753290624634">"Reti affiliate"</item>
- <item msgid="2241951431403168661">"Qualsiasi rete"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Preferenze di rete CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Non ancora implementato."</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Preferenze di rete CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Solo CDMA"</item>
- <item msgid="2683555124647197574">"Solo EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"TEST abbonamento CDMA"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Cambia tra RUIM/SIM e NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"abbonamento"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Numeri selezione fissa (FDN)"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Elenco FDN"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Attivazione FDN"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Numeri di selezione fissa attivi"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Numeri di selezione fissa non attivi"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Attiva FDN"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Disattiva FDN"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Cambia PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Disattiva FDN"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Attiva FDN"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Gestisci numeri di selezione fissa"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Cambia PIN per accesso FDN"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Gestisci elenco numeri"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Privacy pacchetti vocali"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Attiva modalità privacy ottimizzata"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Modalità TTY"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Attiva modalità TTY"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Modalità TTY"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Imposta modalità TTY"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Nuovo tentativo automatico"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Attiva la modalità Nuovo tentativo automatico"</string>
- <string name="menu_add" msgid="1882023737425114762">"Aggiungi contatto"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Modifica contatto"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Elimina contatto"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Inserisci PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Nome"</string>
- <string name="number" msgid="7905950798349903858">"Numero"</string>
- <string name="save" msgid="4094274636321939086">"Salva"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Aggiungi numero selezione fissa"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Aggiunta numero selezione fissa in corso..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Numero di selezione fissa aggiunto."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Modifica numero selezione fissa"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Aggiornamento numero selezione fissa in corso..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Numero di selezione fissa aggiornato."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Elimina numero selezione fissa"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Eliminazione numero selezione fissa in corso..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Numero di selezione fissa eliminato."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN non aggiornato: il PIN inserito non è corretto."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN non aggiornato: il numero non superare 20 cifre."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Lettura da SIM..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Nessun contatto presente nella SIM."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Seleziona contatti da importare"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Attiva/disattiva PIN di SIM"</string>
- <string name="change_pin" msgid="9174186126330785343">"Cambia PIN SIM"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"PIN della SIM:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"PIN attuale"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Nuovo PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Conferma nuovo PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"Il PIN attuale digitato è errato. Riprova."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"I PIN inseriti non corrispondono. Riprova."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Il PIN deve essere di 4-8 numeri."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Disattiva PIN SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Attiva PIN di SIM"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Attendere..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"PIN della SIM attivato"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"PIN della SIM disattivato"</string>
- <string name="pin_failed" msgid="6597695909685242127">"Il PIN digitato è errato"</string>
- <string name="pin_changed" msgid="9000716792724195093">"PIN della SIM modificato"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Password errata. La SIM è bloccata. Inserisci il codice PUK2."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"PIN2 attuale"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Nuovo PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Conferma nuovo PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"Il PUK2 digitato è errato. Riprova."</string>
- <string name="badPin2" msgid="515218795152422178">"Il vecchio PIN2 digitato è errato. Riprova."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"I PIN2 inseriti non corrispondono. Riprova."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Il PIN2 deve essere di 4-8 numeri."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Il PUK2 deve essere di 8 numeri."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2 modificato"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Digita il codice PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Password errata. Modifica il PIN2 e riprova."</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Password errata. La SIM è bloccata. Inserire il codice PUK2."</string>
- <string name="doneButton" msgid="2859593360997984240">"Fine"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Audioconferenza <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Torna a chiamata"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Continua senza SIM"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Nessuna SIM trovata. Inserisci una SIM nel telefono."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Chiudi"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Sblocca"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Autenticazione PIN..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Numero segreteria"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Chiamata in corso"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Nuovo tentativo in corso"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Chiamata corrente"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Audioconferenza"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Chiamata in arrivo"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Chiamata CDMA in attesa"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Chiamata terminata"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"In attesa"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"In fase di chiusura"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Chiamata"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chiamata senza risposta"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Chiamate senza risposta"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chiamate senza risposta"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Chiamata senza risposta da <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Chiamata corrente (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"In attesa"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Nuovo msg vocale"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nuovo msg vocale (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Componi <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Numero segreteria sconosciuto"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Nessun servizio"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Rete selezionata (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non disponibile"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Per fare una telefonata, disattiva la modalità aereo."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Non registrato sulla rete."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Rete cellulare non disponibile."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Chiamata non inviata. Nessun numero valido inserito."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Chiamata non inviata."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Inizio sequenza MMI..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Inizio sequenza codice funzione..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Servizio non supportato."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Impossibile passare all\'altra chiamata."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Impossibile separare le chiamate."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Impossibile trasferire la chiamata."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Audioconferenze non disponibili"</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Impossibile rifiutare la chiamata."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Impossibile riprendere le chiamate."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Chiamata di emergenza"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Attivazione segnale cellulare..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Area non coperta dal servizio. Nuovo tentativo..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Chiamata non inviata. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> non è un numero di emergenza."</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Chiamata non inviata. Componi un numero di emergenza."</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Usa tastiera"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Selezione a toni"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Tastierino"</string>
- <string name="touchLockText" msgid="566824588267376287">"Tocca due volte"\n"per sbloccare"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Tocca due volte"\n"per rispondere"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Tocca due volte"\n"per rifiutare"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"In attesa"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Riprendi"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Chiudi"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Tastierino"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Nascondi"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Altoparlante"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"No audio"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Aggiungi"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Unisci"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Scambia"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gestisci chiamate"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Gestisci"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importa"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importa tutti"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importazione contatti SIM"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importa da contatti"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Apparecchi acustici"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Attiva la compatibilità con apparecchi acustici"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY disattivato"</item>
- <item msgid="3971695875449640648">"TTY completa"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Testo ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Toni DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Imposta la lunghezza dei toni DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normali"</item>
- <item msgid="2883365539347850535">"Lunghi"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Messaggio di rete"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Attiva il telefono"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"È necessario effettuare una chiamata speciale per attivare il servizio telefonico. "\n\n"Dopo avere premuto \"Attiva\", ascolta le istruzioni fornite per attivare il telefono."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Tocca \"Attiva\" per effettuare una chiamata speciale che attiva il telefono sulla rete cellulare del tuo gestore, in modo da poter effettuare chiamate e poterti connettere a reti di dati mobili."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Saltare l\'attivazione?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Se salti l\'attivazione, non potrai effettuare chiamate o connetterti a reti di dati mobili (ma potrai connetterti a reti Wi-Fi). Finché non attiverai il telefono, ti verrà chiesto di attivarlo ogni volta che lo accendi."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Salta"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Attiva"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Attiva"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Il telefono è attivo."</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problema con l\'attivazione"</string>
- <string name="ota_listen" msgid="162923839877584937">"Segui le istruzioni vocali fino al segnale di attivazione completata."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Tastierino"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Altoparlante"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Attendi la programmazione del telefono."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programmazione non riuscita"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Il telefono è attivo. L\'avvio del servizio potrebbe richiedere fino a 15 minuti."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Il telefono non è stato attivato. "\n"Potrebbe essere necessario trovare una zona con copertura migliore (vicino a una finestra o all\'esterno). "\n\n"Riprova o contatta l\'assistenza tecnica per conoscere altre soluzioni."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"TROPPI ERRORI SPC"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Indietro"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Riprova"</string>
- <string name="ota_next" msgid="3904945374358235910">"Avanti"</string>
- <string name="ota_back" msgid="2190038043403850052">"Indietro"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Modalità di richiamata di emergenza attivata"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Modalità di richiamata di emergenza"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Connessione dati disabilitata"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Nessuna connessione dati per <xliff:g id="COUNT">%s</xliff:g> minuto"</item>
- <item quantity="other" msgid="3122217344579273583">"Nessuna connessione dati per <xliff:g id="COUNT">%s</xliff:g> minuti"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Il telefono sarà in modalità di richiamata di emergenza per <xliff:g id="COUNT">%s</xliff:g> minuto. In questa modalità non è possibile utilizzare alcuna applicazione che richiede una connessione dati. Uscire ora?"</item>
- <item quantity="other" msgid="3231879566243957821">"Il telefono sarà in modalità di richiamata di emergenza per <xliff:g id="COUNT">%s</xliff:g> minuti. In questa modalità non è possibile utilizzare alcuna applicazione che richiede una connessione dati. Uscire ora?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"L\'azione selezionata non è disponibile in modalità di richiamata di emergenza. Il telefono sarà in questa modalità per <xliff:g id="COUNT">%s</xliff:g> minuto. Uscire ora?"</item>
- <item quantity="other" msgid="3489076611710869904">"L\'azione selezionata non è disponibile in modalità di richiamata di emergenza. Il telefono sarà in questa modalità per <xliff:g id="COUNT">%s</xliff:g> minuti. Uscire ora?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"L\'azione selezionata non è disponibile in modalità di chiamata di emergenza"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Uscita dalla modalità di richiamata di emergenza in corso"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Sì"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"No"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Ignora"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Impostazioni segreteria"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;non impostato&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Servizio di segreteria"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Impostazioni per <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Altre impostazioni chiamate"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Componi"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Chiamata in corso tramite ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Trascina a destra per rispondere"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Trascina a sinistra per disattivare la suoneria"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Trascina a sinistra per rifiutare"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Trascina a destra per rispondere e"\n"mettere in attesa la chiamata attiva"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Trascina a destra per rispondere e"\n"terminare la chiamata attiva"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Trascina a destra per rispondere e"\n"terminare la chiamata in attesa"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Risposta"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Rifiuta"</string>
-</resources>
diff --git a/phone/res/values-ja/strings.xml b/phone/res/values-ja/strings.xml
deleted file mode 100644
index 97f0952..0000000
--- a/phone/res/values-ja/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"連絡先"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"お気に入り"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"電話"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"緊急通報"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"電話"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"通話履歴"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"発信番号制限リスト"</string>
- <string name="unknown" msgid="6878797917991465859">"通知不可能"</string>
- <string name="private_num" msgid="6713286113000232309">"非通知"</string>
- <string name="payphone" msgid="1931775086311769314">"公衆電話発信"</string>
- <string name="onHold" msgid="9035493194749959955">"保留中"</string>
- <string name="ongoing" msgid="8300874342848721367">"通話中"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"話し中"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"ネットワークがビジーです"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"圏外"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"ACMの制限を超えています"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"無線通信をオフ"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"エラーまたはSIMなし"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"圏外"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"発信番号制限により発信が制限されています。"</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"発信できません。発信制限がかかっています。"</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"発信制限が設定されています。"</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"緊急通報の発信制限が設定されています。"</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"緊急通報以外は発信制限が設定されています。"</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: 携帯端末は電源を入れ直すまでロックされています。"</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: 通話が遮断されました。"</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: 通話が傍受されました。"</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: 順序が変更されました。"</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: サービスオプションが拒否されました。"</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: 再試行の順序。"</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: アクセスできませんでした。"</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: 取得済みです。"</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"緊急通報のみ可能です。"</string>
- <string name="confCall" msgid="1904840547188336828">"グループ通話"</string>
- <string name="call_lost" msgid="317670617901479594">"通話が切れました。"</string>
- <string name="retry" msgid="8462986804300767852">"再試行"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"通話が切れました"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMIコードの開始"</string>
- <string name="ussdRunning" msgid="485588686340541690">"USSDコードを実行中..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMIコードはキャンセルされました"</string>
- <string name="cancel" msgid="5044513931633602634">"キャンセル"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"スピーカー"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"ミュート"</string>
- <string name="menu_hold" msgid="6970441130344786273">"保留"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"通話を終了"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"相手切替"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"グループ通話"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"通話を追加"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"グループ通話オプション"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"ダイヤルキー表示"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"ダイヤルキー非表示"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"通話を保留"\n"して応答"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"現在の通話を終了"\n"して応答"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"MENUキーで通話オプション表示"</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Menuキーを押して通話オプションを表示 • キーボードからダイヤル"</string>
- <string name="menu_answer" msgid="116686205042231098">"電話に出る"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"無視"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"次の番号を送信しますか?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"番号を送信中"\n</string>
- <string name="send_button" msgid="4106860097497818751">"送信"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"はい"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"いいえ"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"ワイルド文字と入れ替える文字"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"ボイスメール番号がありません"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"SIMカードにボイスメールの番号がありません。"</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"番号を追加"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"読み込み中..."</string>
- <string name="enterPin" msgid="4753300834213388397">"PINコードを入力してSIMカードのロックを解除します。"</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIMロックを解除しました"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"新しいSIM PINコード"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"確認のため新しいSIM PINコードを再入力"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"SIM PINと一致しません。入力し直してください。"</string>
- <string name="enterPuk" msgid="6144749655582862324">"SIMカードのロック解除のためPUKコードを入力"</string>
- <string name="badPuk" msgid="3213017898690275965">"PUKコードが正しくありません。"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"次へ"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"SIMカードロックを解除しました。端末のロックを解除しています..."</string>
- <string name="label_ndp" msgid="780479633159517250">"SIMネットワークのロック解除PIN"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"ロック解除"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"無効"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"ネットワークのロック解除をリクエスト中..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"ネットワークロックを解除できませんでした。"</string>
- <string name="unlock_success" msgid="6770085622238180152">"ネットワークロックを解除しました。"</string>
- <string name="imei" msgid="8552502717594321281">"IMEI(端末識別番号)"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"GSM通話設定"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"CDMA通話設定"</string>
- <string name="apn_settings" msgid="9043423184895642077">"アクセスポイント名"</string>
- <string name="settings_label" msgid="3876743539816984008">"ネットワーク設定"</string>
- <string name="voicemail" msgid="8693759337917898954">"ボイスメール"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
- <string name="networks" msgid="8873030692174541976">"ネットワークオペレーター"</string>
- <string name="call_settings" msgid="6112441768261754562">"通話設定"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"その他の設定"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"その他のGSM専用通話設定"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"その他のCDMA通話設定"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"その他のCDMA専用通話設定"</string>
- <string name="labelNwService" msgid="4699970172021870983">"ネットワークサービス設定"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"発信者番号"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"発信時に番号を通知しない"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"発信時に番号を通知する"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"発信者番号表示にオペレータの既定値を使用"</string>
- <string name="labelCW" msgid="6120513814915920200">"通話中着信"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"通話中も着信を知らせる"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"通話中も着信を知らせる"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"着信転送設定"</string>
- <string name="labelCF" msgid="2574386948026924737">"着信転送"</string>
- <string name="labelCFU" msgid="8147177368148660600">"常に転送"</string>
- <string name="messageCFU" msgid="3560082430662923687">"常にこの番号を使用"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"電話をすべて転送する"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"電話をすべて{0}に転送する"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"番号が利用できません"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"無効"</string>
- <string name="labelCFB" msgid="218938523102207587">"通話中の着信時に転送"</string>
- <string name="messageCFB" msgid="3711089705936187129">"通話中着信の転送番号"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"\\\\{0\\\\}に転送する"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"無効"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"ご利用の携帯通信会社では通話中の着信時の転送を無効にすることができません。"</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"不在着信時に転送"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"不在着信時の転送番号"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"\\\\{0\\\\}に転送する"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"無効"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"ご利用の携帯通信会社では不在着信時の転送を無効にすることができません。"</string>
- <string name="labelCFNRc" msgid="47183615370850000">"着信不能時に転送"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"着信不能時の転送番号"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"\\\\{0\\\\}に転送する"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"無効"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"ご利用の携帯通信会社では着信不能時の転送を無効にすることができません。"</string>
- <string name="updating_title" msgid="6146755386174019046">"通話設定"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"通話設定エラー"</string>
- <string name="reading_settings" msgid="1920291699287055284">"設定を読み取り中..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"設定を更新中..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"設定を元に戻しています..."</string>
- <string name="response_error" msgid="6674110501330139405">"ネットワークから予期しない応答が返されました。"</string>
- <string name="exception_error" msgid="7027667130619518211">"ネットワークまたはSIMカードのエラーです。"</string>
- <string name="radio_off_error" msgid="6717116288405111269">"無線通信をオンにしてから設定を表示してください。"</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"有効にする"</string>
- <string name="disable" msgid="7274240979164762320">"無効にする"</string>
- <string name="change_num" msgid="239476305819844391">"更新"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"ネットワーク既定"</item>
- <item msgid="7876195870037833661">"番号を非通知"</item>
- <item msgid="1108394741608734023">"番号を通知"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"ボイスメールの番号の保存"</string>
- <string name="vm_changed" msgid="380744030726254139">"ボイスメールの番号が変更されました。"</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"ボイスメールの番号を変更できませんでした。"\n"問題が解決しない場合は携帯通信会社に問い合わせてください。"</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"転送先番号を変更できませんでした。"\n"問題が解決しない場合は携帯通信会社に問い合わせてください。"</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"現在の転送先番号設定の取得と保存ができませんでした。"\n"別の通信事業者に切り替えますか?"</string>
- <string name="no_change" msgid="3186040086622435212">"変更されていません。"</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"ボイスメールサービスを選択"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"携帯通信会社"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"モバイルネットワーク設定"</string>
- <string name="label_available" msgid="1181658289009300430">"利用可能なネットワーク"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"検索中..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"ネットワークが見つかりません。"</string>
- <string name="search_networks" msgid="1601136049300882441">"ネットワークを検索"</string>
- <string name="network_query_error" msgid="6828516148953325006">"ネットワークの検索中にエラーが発生しました。"</string>
- <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g>に登録中..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"このSIMカードではこのネットワークに接続できません。"</string>
- <string name="connect_later" msgid="500090982903469816">"現在このネットワークに接続できません。後ほどもう一度お試しください。"</string>
- <string name="registration_done" msgid="495135664535876612">"ネットワークに登録されました。"</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"ネットワークオペレーターの選択"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"利用可能なすべてのネットワークを検索する"</string>
- <string name="select_automatically" msgid="8615980695510888796">"自動選択"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"最適なネットワークを自動的に選択する"</string>
- <string name="register_automatically" msgid="6272031189219101172">"自動登録..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"ネットワークモード"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"ネットワーク動作モードの変更"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"優先ネットワークモード"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"世界"</item>
- <item msgid="3273348576277144124">"EV-DOのみ"</item>
- <item msgid="454610224530856274">"CDMA(EV-DO非準拠)"</item>
- <item msgid="8928247118825616081">"CDMA/EV-DO自動"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA自動"</item>
- <item msgid="5189164180446264504">"WCDMAのみ"</item>
- <item msgid="5714714953966979187">"GSMのみ"</item>
- <item msgid="4775796025725908913">"GSM/WCDMAを優先"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"データ通信を有効にする"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"モバイルネットワーク経由のデータアクセスを有効にする"</string>
- <string name="roaming" msgid="8871412572928323707">"データローミング"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"ローミング時にデータサービスに接続する"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"ローミング時にデータサービスに接続する"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"データローミングをオフにしてホームネットワークを離れたため、データ接続が切断されました。"</string>
- <string name="roaming_warning" msgid="7820963598559553967">"データローミングを許可すると、ローミング料金が発生する場合があります。"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTSオプション"</string>
- <string name="cdma_options" msgid="4016822858172249884">"CDMAオプション"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"データ使用"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"携帯通信会社のデータポリシー"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"現期間で使用したデータ"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"データ使用期間"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"転送速度ポリシー"</string>
- <string name="throttle_help" msgid="243651091785169900">"詳細"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g>(<xliff:g id="USED_1">%2$d</xliff:g>٪)/期間最大値<xliff:g id="USED_2">%3$s</xliff:g>"\n"次の期間は<xliff:g id="USED_3">%4$d</xliff:g>日で始まります(<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g>(<xliff:g id="USED_1">%2$d</xliff:g>٪)/期間最大値<xliff:g id="USED_2">%3$s</xliff:g>"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"最大値<xliff:g id="USED_0">%1$s</xliff:g>を超えました"\n"転送速度は<xliff:g id="USED_1">%2$d</xliff:g>Kb/秒に低下"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"サイクルの٪<xliff:g id="USED_0">%1$d</xliff:g>を経過"\n"次の期間は<xliff:g id="USED_1">%2$d</xliff:g>日で始まります(<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"データ利用制限を超えると、転送速度が<xliff:g id="USED">%1$d</xliff:g>Kb/秒まで低下します"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"携帯通信会社のモバイルネットワークデータ利用ポリシーの詳細"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"セルブロードキャストSMS"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"セルブロードキャストSMS"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"セルブロードキャストSMS"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"セルブロードキャストSMSは有効になっています"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"セルブロードキャストSMSは無効になっています"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"セルブロードキャストSMS設定"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"緊急ブロードキャスト"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"緊急ブロードキャストは有効になっています"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"緊急ブロードキャストは無効になっています"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"管理"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"管理は有効になっています"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"管理は無効になっています"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"メンテナンス"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"メンテナンスは有効になっています"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"メンテナンスは無効になっています"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"一般ニュース"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"ビジネス金融ニュース"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"スポーツニュース"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"エンターテインメント情報"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"ローカル"</string>
- <string name="local_enable" msgid="6370463247609136359">"ローカルニュースは有効になっています"</string>
- <string name="local_disable" msgid="4405691986943795798">"ローカルニュースは無効になっています"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"地域"</string>
- <string name="regional_enable" msgid="4434680415437834759">"地域ニュースは有効になっています"</string>
- <string name="regional_disable" msgid="5359325527213850077">"地域ニュースは無効になっています"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"国内"</string>
- <string name="national_enable" msgid="1172443648912246952">"国内ニュースは有効になっています"</string>
- <string name="national_disable" msgid="326018148178601166">"国内ニュースは無効になっています"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"国際"</string>
- <string name="international_enable" msgid="5855356769925044927">"国際ニュースは有効になっています"</string>
- <string name="international_disable" msgid="2850648591041088931">"国際ニュースは無効になっています"</string>
- <string name="list_language_title" msgid="2841683501919760043">"言語"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"ニュースの言語の選択"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"英語"</item>
- <item msgid="1151988412809572526">"フランス語"</item>
- <item msgid="577840534704312665">"スペイン語"</item>
- <item msgid="8385712091143148180">"日本語"</item>
- <item msgid="1858401628368130638">"韓国語"</item>
- <item msgid="1933212028684529632">"中国語"</item>
- <item msgid="1908428006803639064">"ヘブライ語"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"言語"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"各地の天気"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"各地の天気は有効になっています"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"各地の天気は無効になっています"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"各地の交通情報"</string>
- <string name="atr_enable" msgid="5541757457789181799">"各地の交通情報は有効になっています"</string>
- <string name="atr_disable" msgid="7085558154727596455">"各地の交通情報は無効になっています"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"各地のフライトスケジュール"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"各地のフライトスケジュールは有効になっています"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"各地のフライトスケジュールは無効になっています"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"レストラン"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"レストランは有効になっています"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"レストランは無効になっています"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"ロッジング"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"ロッジングは有効になっています"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"ロッジングは無効になっています"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"お店情報"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"お店情報は有効になっています"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"お店情報は無効になっています"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"広告"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"広告は有効になっています"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"広告は無効になっています"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"株価情報"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"株価情報は有効になっています"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"株価情報は無効になっています"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"求人情報"</string>
- <string name="eo_enable" msgid="8623559062015685813">"求人情報は有効になっています"</string>
- <string name="eo_disable" msgid="3863812478090907609">"求人情報は無効になっています"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"医療、健康、病院情報"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"医療、健康、病院情報は有効になっています"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"医療、健康、病院情報は無効になっています"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"テクノロジーニュース"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"テクノロジーニュースは有効になっています"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"テクノロジーニュースは無効になっています"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"複数カテゴリ"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"複数カテゴリは有効になっています"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"複数カテゴリは無効になっています"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"GSM/UMTSネットワーク設定"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"まだ実装されていません。"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"GSM/UMTSネットワーク設定"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA(自動モード)"</item>
- <item msgid="8912042051809329533">"WCDMAのみ"</item>
- <item msgid="8776934131146642662">"GSMのみ"</item>
- <item msgid="4684679567848300935">"GSM/WCDA(WCDMAを優先)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"2Gネットワークのみ使用"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"節電"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"システムの選択"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"CDMAローミングモードを変更する"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"システムの選択"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"ホームのみ"</item>
- <item msgid="1205664026446156265">"自動"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMAローミングモード"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"CDMAローミングモードの変更"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMAローミングモード"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"ホームネットワークのみ"</item>
- <item msgid="8174642753290624634">"提携ネットワーク"</item>
- <item msgid="2241951431403168661">"すべてのネットワーク"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"CDMAネットワーク設定"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"まだ実装されていません。"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"CDMAネットワーク設定"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EV-DO"</item>
- <item msgid="6143696847467859795">"CDMAのみ"</item>
- <item msgid="2683555124647197574">"EV-DOのみ"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"CDMA登録テスト"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"RUIM/SIMとNVを切り替える"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"登録チャンネル"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"発信番号制限"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"発信番号制限リスト"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"発信番号制限の有効化"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"発信番号制限はONになっています"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"発信番号制限はOFFになっています"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"発信番号制限をONにする"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"発信番号制限をOFFにする"</string>
- <string name="change_pin2" msgid="2153563695382176676">"PIN2を変更"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"発信番号制限をOFFにする"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"発信番号制限をONにする"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"電話番号の指定による発信制限"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"発信番号制限のPINを変更"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"電話番号リストを管理"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"音声のプライバシー"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"拡張プライバシーモードを有効にする"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTYモード"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"TTYモードを有効にする"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTYモード"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"TTYモードの設定"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"自動再試行"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"自動再試行モードを有効にする"</string>
- <string name="menu_add" msgid="1882023737425114762">"連絡先を追加"</string>
- <string name="menu_edit" msgid="7143003705504672374">"連絡先を編集"</string>
- <string name="menu_delete" msgid="3977150783449642851">"連絡先を削除"</string>
- <string name="get_pin2" msgid="1198225482542827652">"PIN2を入力"</string>
- <string name="name" msgid="7329028332786872378">"名前"</string>
- <string name="number" msgid="7905950798349903858">"電話番号"</string>
- <string name="save" msgid="4094274636321939086">"保存"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"発信番号制限の追加"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"発信番号制限を追加しています..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"発信番号制限を追加しました。"</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"発信番号制限の編集"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"発信番号制限を更新しています..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"発信番号制限を更新しました。"</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"発信番号制限の削除"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"発信番号制限を削除しています..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"発信番号制限を削除しました。"</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"発信番号制限が更新されませんでした。PINが正しくありません。"</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"発信番号制限が更新されませんでした。番号は20桁以内にする必要があります。"</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"SIMカードから読み取り中..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"SIMカードに連絡先がありません。"</string>
- <string name="simContacts_title" msgid="1861472842524839921">"インポートする連絡先の選択"</string>
- <string name="enable_pin" msgid="5422767284133234860">"SIM PINの有効/無効"</string>
- <string name="change_pin" msgid="9174186126330785343">"SIM PINの変更"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"SIM PIN:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"古いPIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"新しいPIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"新しいPINを確認"</string>
- <string name="badPin" msgid="4154316827946559447">"PINが正しくありません。入力し直してください。"</string>
- <string name="mismatchPin" msgid="5974597541268042785">"PINと一致しません。入力し直してください。"</string>
- <string name="invalidPin" msgid="5981171102258684792">"4~8桁の数字のPINを入力してください。"</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"SIM PINを無効にする"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"SIM PINを有効にする"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"お待ちください..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"SIM PINは有効です"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"SIM PINは無効です"</string>
- <string name="pin_failed" msgid="6597695909685242127">"入力したPINは正しくありません"</string>
- <string name="pin_changed" msgid="9000716792724195093">"SIM PINが変更されました"</string>
- <string name="puk_requested" msgid="3898394204193202803">"パスワードが正しくありません。SIMがロックされています。PUK2を入力してください。"</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"古いPIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"新しいPIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"新しいPIN2の確認"</string>
- <string name="badPuk2" msgid="4072035207011308856">"PUK2が正しくありません。入力し直してください。"</string>
- <string name="badPin2" msgid="515218795152422178">"PIN2が正しくありません。入力し直してください。"</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"PIN2と一致しません。入力し直してください。"</string>
- <string name="invalidPin2" msgid="8237110107480395938">"PIN2を4~8桁の数字で入力してください。"</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"8桁の数字のPUK2を入力してください。"</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2が変更されました"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"PUK2コードを入力"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"パスワードが正しくありません。PIN2を変更して再入力してください。"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"パスワードが正しくありません。SIMがロックされています。PUK2を入力してください。"</string>
- <string name="doneButton" msgid="2859593360997984240">"完了"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"グループ通話 <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"通話に戻る"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"SIMカードなしで続ける"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"SIMカードが見つかりません。SIMカードを携帯電話に挿入してください。"</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"無効"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"ロック解除"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"PINを認証中..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"ボイスメールの番号"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"発信中"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"再試行中"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"現在の通話"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"グループ通話"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"着信"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"CDMA通話中着信"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"通話終了"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"保留中"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"通話終了"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"着信"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"不在着信"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"不在着信"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"不在着信<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>件"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>さんからの不在着信"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"通話中(<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"保留中"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"新しいボイスメール"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"新しいボイスメール(<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>にダイヤル"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"ボイスメールの番号が不明です"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"通信サービスなし"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"選択したネットワーク(<xliff:g id="OPERATOR_NAME">%s</xliff:g>)が利用できません"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"機内モードをOFFにしてから発信してください。"</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"ご加入の通信サービスがありません"</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"モバイルネットワークが利用できません。"</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"発信できません。有効な番号が入力されていません。"</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"発信できません。"</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMIシーケンスを開始中..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"一連の機能コードを開始中..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"対応していないサービスです。"</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"通話を切り替えられません。"</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"通話を分割できません。"</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"電話を転送できません。"</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"グループ通話を利用できません。"</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"着信を拒否できません。"</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"通話を解放できません。"</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"緊急通報"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"無線通信をオンにしています..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"圏外 - 再試行中..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g>は緊急通報番号ではないので発信できません。"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"発信できません。緊急通報番号におかけください。"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"キーボードで番号を入力してください"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"タッチトーンキー"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"ダイヤルキー"</string>
- <string name="touchLockText" msgid="566824588267376287">"ロックを解除するには"\n"ここをダブルタップ"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"ダブルタップで電話に"\n"出ることができます"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"ダブルタップで"\n"拒否できます"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"保留"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"保留解除"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"終了"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ダイヤルキー"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"非表示"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"スピーカー"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"ミュート"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"通話を追加"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"グループ通話"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"切り替え"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"通話の管理"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"管理"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"インポート"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"すべてインポート"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"SIMの連絡先をインポート中"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"連絡先からインポート"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"補聴機能"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"補聴機能の互換をON"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY OFF"</item>
- <item msgid="3971695875449640648">"TTYフル"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERIテキスト"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMFトーン"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"DTMFトーンの長さを設定します"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"標準"</item>
- <item msgid="2883365539347850535">"長め"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"ネットワークメッセージ"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"携帯電話を有効にする"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"通話サービスを有効にするには特別な通話が必要です。"\n\n"[有効にする]を押してから、流れてくる音声に従って電話を有効にしてください。"</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"特別な通話を行うには[有効にする]にタップします。これによりお使いの携帯が携帯通信会社のモバイルネットワークで有効になり、通話とモバイルデータネットワークへの接続が可能になります。"</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"スキップして有効にしない"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"スキップして有効にしない場合、通話やモバイルデータネットワークの接続ができません(Wi-Fiネットワークには接続できます)。携帯を有効にするまでは、電源を入れるたびに有効にするかどうかを尋ねるメッセージが表示されます。"</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"スキップ"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"有効にする"</string>
- <string name="ota_activate" msgid="1368528132525626264">"有効にする"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"携帯が有効に設定されました。"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"有効にする際のエラー"</string>
- <string name="ota_listen" msgid="162923839877584937">"完了したというメッセージが流れるまで音声ガイダンスに従ってください。"</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"キーパッド"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"スピーカー"</string>
- <string name="ota_progress" msgid="4644512049143969504">"プログラムが設定されるまでお待ちください。"</string>
- <string name="ota_failure" msgid="8600027551822478181">"プログラムの設定に失敗しました"</string>
- <string name="ota_successful" msgid="1880780692887077407">"携帯が有効に設定されました。サービスが開始されるまで最大で15分ほどかかることがあります。"</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"携帯を有効に設定できませんでした。"\n"通信状態の良い場所(窓のそばや戸外)に移動することをおすすめします。"\n\n"もう一度やり直すかカスタマーサービスに問い合わせてください。"</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"超過SPCによる失敗"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"戻る"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"再試行"</string>
- <string name="ota_next" msgid="3904945374358235910">"次へ"</string>
- <string name="ota_back" msgid="2190038043403850052">"戻る"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"緊急通報待機モードになりました"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"緊急通報待機モード"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"データ接続が無効です"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"<xliff:g id="COUNT">%s</xliff:g>分間データ接続できません"</item>
- <item quantity="other" msgid="3122217344579273583">"<xliff:g id="COUNT">%s</xliff:g>分間データ接続できません"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"<xliff:g id="COUNT">%s</xliff:g>分間緊急通報待機モードになります。このモード中はデータ接続が必要なアプリケーションは利用できません。今すぐ終了しますか?"</item>
- <item quantity="other" msgid="3231879566243957821">"<xliff:g id="COUNT">%s</xliff:g>分間緊急通報待機モードになります。このモード中はデータ接続が必要なアプリケーションは利用できません。今すぐ終了しますか?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"緊急通報待機モード中のため選択した操作は利用できません。このモードはあと<xliff:g id="COUNT">%s</xliff:g>分間続行します。今すぐ終了しますか?"</item>
- <item quantity="other" msgid="3489076611710869904">"緊急通報待機中なので、選択した操作は利用できません。あと<xliff:g id="COUNT">%s</xliff:g>分間このモードです。今すぐ終了しますか?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"選択した操作は緊急通報待機時には実行できません"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"緊急通報待機モードを終了中"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"はい"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"いいえ"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"解除"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"ボイスメールの設定"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;未設定&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"ボイスメールサービス"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>の設定"</string>
- <string name="other_settings" msgid="3672912580359716394">"その他の通話設定"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"発信"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"^1で発信中:"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"右にドラッグして応答"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"左にドラッグして着信音を消音"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"左にドラッグして応答を拒否"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"右にドラッグして応答し"\n"現在の通話を保留"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"右にドラッグして応答し"\n"現在の通話を終了"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"右にドラッグして応答し"\n"保留中の通話を終了"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"電話に出る"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"拒否"</string>
-</resources>
diff --git a/phone/res/values-ko/strings.xml b/phone/res/values-ko/strings.xml
deleted file mode 100644
index 578aec7..0000000
--- a/phone/res/values-ko/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"주소록"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"즐겨찾기"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"다이얼러"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"긴급 통화"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"휴대전화"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"통화기록"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"FDN 목록"</string>
- <string name="unknown" msgid="6878797917991465859">"알 수 없음"</string>
- <string name="private_num" msgid="6713286113000232309">"비공개 번호"</string>
- <string name="payphone" msgid="1931775086311769314">"공중전화"</string>
- <string name="onHold" msgid="9035493194749959955">"대기 중"</string>
- <string name="ongoing" msgid="8300874342848721367">"현재 통화"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"통화 중입니다."</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"네트워크 사용량이 많습니다."</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"신호 없음"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"ACM 제한 초과"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"무선 연결 끊김"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"SIM이 없거나 SIM에 오류가 있습니다."</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"서비스 지역을 벗어났습니다."</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"발신전화가 FDN으로 제한됩니다."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"착발신 제한이 설정되어 있는 동안에는 전화를 걸 수 없습니다."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"모든 전화가 액세스 제어에 의해 제한되어 있습니다."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"긴급 전화가 액세스 제어에 의해 제한되어 있습니다."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"일반 전화가 액세스 제어에 의해 제한되어 있습니다."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: 전원을 껐다 켤 때까지 휴대전화가 잠깁니다."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: 전화가 끊겼습니다."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: 통화를 가로채기 당했습니다."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: 순서를 재지정합니다."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: 서비스 옵션이 거부되었습니다."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: 명령을 다시 시도합니다."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: 액세스에 실패했습니다."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: 선 점유되었습니다."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"긴급 통화만 가능합니다."</string>
- <string name="confCall" msgid="1904840547188336828">"다자간 통화"</string>
- <string name="call_lost" msgid="317670617901479594">"통화가 끊겼습니다."</string>
- <string name="retry" msgid="8462986804300767852">"다시 시도"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"통화 끊김"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMI 코드 시작됨"</string>
- <string name="ussdRunning" msgid="485588686340541690">"USSD 코드 실행 중..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMI 코드 취소됨"</string>
- <string name="cancel" msgid="5044513931633602634">"취소"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"스피커"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"음소거"</string>
- <string name="menu_hold" msgid="6970441130344786273">"보류"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"통화 종료"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"통화 전환"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"통화 합치기"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"통화 추가"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"다자간 통화 관리"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"다이얼패드 표시"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"다이얼패드 숨기기"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"현재 통화를 보류하고"\n" 전화받기"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"현재 통화를 끊고"\n" 전화받기"</string>
- <string name="ok" msgid="3811371167865772377">"확인"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"통화 옵션을 보려면 \'메뉴\'를 누르세요."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"통화 옵션을 보려면 메뉴를 누르세요. • 키보드를 사용하여 전화걸기"</string>
- <string name="menu_answer" msgid="116686205042231098">"응답"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"무시"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"다음 톤을 보내시겠습니까?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"신호음 보내기"\n</string>
- <string name="send_button" msgid="4106860097497818751">"전송"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"예"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"아니요"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"와일드 문자를 다음으로 바꾸기"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"음성사서함 번호 없음"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM 카드에 저장된 음성사서함 번호가 없습니다."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"번호 추가"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"로드 중..."</string>
- <string name="enterPin" msgid="4753300834213388397">"SIM 카드의 잠금을 해제하려면 PIN 코드를 입력하세요."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM 잠금해제됨"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"새 SIM PIN 코드"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"확인을 위해 새 SIM PIN 코드 다시 입력"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"입력한 SIM PIN이 일치하지 않습니다. 다시 시도해 주세요."</string>
- <string name="enterPuk" msgid="6144749655582862324">"SIM 카드의 잠금을 해제하려면 PUK 코드 입력"</string>
- <string name="badPuk" msgid="3213017898690275965">"PUK 코드가 잘못되었습니다."</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"계속"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"SIM 카드의 잠금이 해제되었습니다. 휴대전화의 잠금해제 중..."</string>
- <string name="label_ndp" msgid="780479633159517250">"SIM 네트워크 잠금해제 PIN"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"잠금해제"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"취소"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"네트워크 잠금해제 요청 중..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"네트워크 잠금해제 요청이 실패했습니다."</string>
- <string name="unlock_success" msgid="6770085622238180152">"네트워크의 잠금을 해제했습니다."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"GSM 통화 설정"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"CDMA 통화 설정"</string>
- <string name="apn_settings" msgid="9043423184895642077">"APN"</string>
- <string name="settings_label" msgid="3876743539816984008">"네트워크 설정"</string>
- <string name="voicemail" msgid="8693759337917898954">"음성사서함"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
- <string name="networks" msgid="8873030692174541976">"네트워크 운영자"</string>
- <string name="call_settings" msgid="6112441768261754562">"통화 설정"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"추가 설정"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"GSM 전용 통화 설정 추가"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"추가 CDMA 통화 설정"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"CDMA 전용 통화 설정 추가"</string>
- <string name="labelNwService" msgid="4699970172021870983">"네트워크 서비스 설정"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"발신자 ID"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"발신자 표시 제한"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"발신전화의 번호 표시"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"기본 사업자 설정을 사용하여 발신전화에 내 번호 표시"</string>
- <string name="labelCW" msgid="6120513814915920200">"통화중 대기"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"통화 중 수신전화 알림"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"통화 중 수신전화 알림"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"착신전환 설정"</string>
- <string name="labelCF" msgid="2574386948026924737">"착신전환"</string>
- <string name="labelCFU" msgid="8147177368148660600">"항상 착신전환"</string>
- <string name="messageCFU" msgid="3560082430662923687">"항상 이 번호 사용"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"모든 통화 착신전환"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"모든 통화를 {0}(으)로 착신전환"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"없는 전화번호입니다."</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"사용 중지됨"</string>
- <string name="labelCFB" msgid="218938523102207587">"통화 중일 경우"</string>
- <string name="messageCFB" msgid="3711089705936187129">"통화 중인 경우 착신전환할 번호"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"{0}(으)로 착신전환"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"사용 중지됨"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"이동통신사에서 휴대전화가 사용 중일 때 착신전환 사용 중지를 지원하지 않습니다."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"받지 않은 경우"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"전화를 받지 않은 경우 착신전환할 번호"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"{0}(으)로 착신전환"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"사용 중지됨"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"이동통신사에서 휴대전화가 응답하지 않을 때 착신전환 사용 중지를 지원하지 않습니다."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"받을 수 없는 경우"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"전화를 받을 수 없는 경우 착신전환할 번호"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"{0}(으)로 착신전환"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"사용 중지됨"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"이동통신사에서 전화를 받을 수 없을 때 착신전환 사용 중지를 지원하지 않습니다."</string>
- <string name="updating_title" msgid="6146755386174019046">"통화 설정"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"통화 설정 오류"</string>
- <string name="reading_settings" msgid="1920291699287055284">"설정을 읽는 중..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"설정 업데이트 중..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"원래 설정으로 되돌리는 중..."</string>
- <string name="response_error" msgid="6674110501330139405">"네트워크에서 예기치 않은 응답이 전송되었습니다."</string>
- <string name="exception_error" msgid="7027667130619518211">"네트워크 또는 SIM 카드 오류입니다."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"이러한 설정을 보려면 무선을 사용해야 합니다."</string>
- <string name="close_dialog" msgid="2365884406356986917">"확인"</string>
- <string name="enable" msgid="1059008390636773574">"사용"</string>
- <string name="disable" msgid="7274240979164762320">"사용 중지"</string>
- <string name="change_num" msgid="239476305819844391">"업데이트"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"네트워크 기본값"</item>
- <item msgid="7876195870037833661">"발신자 표시 제한"</item>
- <item msgid="1108394741608734023">"발신자 표시"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"음성사서함 번호 저장"</string>
- <string name="vm_changed" msgid="380744030726254139">"음성사서함 번호가 변경되었습니다."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"음성사서함 번호를 변경하지 못했습니다."\n"문제가 계속되면 이동통신사에 문의하세요."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"착신전환할 번호를 변경하지 못했습니다."\n"문제가 계속되면 이동통신사에 문의하세요."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"현재 착신전환할 번호를 검색하고 저장하는 데 실패했습니다."\n"새로운 통신사로 전환하시겠습니까?"</string>
- <string name="no_change" msgid="3186040086622435212">"변경사항이 없습니다."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"음성사서함 서비스 선택"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"내 이동통신사"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"모바일 네트워크 설정"</string>
- <string name="label_available" msgid="1181658289009300430">"사용 가능한 네트워크"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"검색 중..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"네트워크를 찾을 수 없습니다."</string>
- <string name="search_networks" msgid="1601136049300882441">"네트워크 검색"</string>
- <string name="network_query_error" msgid="6828516148953325006">"네트워크를 검색하는 동안 오류가 발생했습니다."</string>
- <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g>에 등록 중..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"SIM 카드에서 이 네트워크에 연결할 수 없습니다."</string>
- <string name="connect_later" msgid="500090982903469816">"현재 네트워크에 연결할 수 없습니다. 나중에 다시 시도해 주세요."</string>
- <string name="registration_done" msgid="495135664535876612">"네트워크에 등록되었습니다."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"네트워크 운영자 선택"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"사용 가능한 모든 네트워크 검색"</string>
- <string name="select_automatically" msgid="8615980695510888796">"자동으로 선택"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"기본 설정 네트워크를 자동으로 선택"</string>
- <string name="register_automatically" msgid="6272031189219101172">"자동 등록..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"네트워크 모드"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"네트워크 작동 모드 변경"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"기본 설정된 네트워크 모드"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"글로벌"</item>
- <item msgid="3273348576277144124">"EvDo 전용"</item>
- <item msgid="454610224530856274">"EvDo없는 CDMA"</item>
- <item msgid="8928247118825616081">"CDMA/EvDo 자동"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA 자동"</item>
- <item msgid="5189164180446264504">"WCDMA 전용"</item>
- <item msgid="5714714953966979187">"GSM 전용"</item>
- <item msgid="4775796025725908913">"GSM/WCDMA로 기본 설정"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"데이터 사용"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"모바일 네트워크에서 데이터 액세스 사용"</string>
- <string name="roaming" msgid="8871412572928323707">"데이터 로밍"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"로밍 시 데이터 서비스에 연결"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"로밍 시 데이터 서비스에 연결"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"데이터 로밍을 사용 중지한 상태에서 홈 네트워크를 벗어났으므로 데이터 연결이 끊어졌습니다."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"데이터 로밍을 허용하시겠습니까? 높은 로밍 요금이 부과될 수 있습니다."</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS 옵션"</string>
- <string name="cdma_options" msgid="4016822858172249884">"CDMA 옵션"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"데이터 사용"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"이동통신사 데이터 정책"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"현재 데이터 사용량"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"데이터 사용 기간"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"데이터 속도 정책"</string>
- <string name="throttle_help" msgid="243651091785169900">"자세히 알아보기"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"최대 기간 <xliff:g id="USED_2">%3$s</xliff:g> 중 <xliff:g id="USED_0">%1$s</xliff:g>(<xliff:g id="USED_1">%2$d</xliff:g>٪)"\n"다음 기간은 <xliff:g id="USED_3">%4$d</xliff:g>일 후에 시작(<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"최대 기간 <xliff:g id="USED_2">%3$s</xliff:g> 중 <xliff:g id="USED_0">%1$s</xliff:g>(<xliff:g id="USED_1">%2$d</xliff:g>٪)"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"최대치 <xliff:g id="USED_0">%1$s</xliff:g> 초과"\n"데이터 속도가 <xliff:g id="USED_1">%2$d</xliff:g>Kb/s로 감소"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"주기의 <xliff:g id="USED_0">%1$d</xliff:g>٪ 경과"\n"다음 기간은 <xliff:g id="USED_1">%2$d</xliff:g>일 후에 시작(<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"데이터 사용량 제한을 초과하면 데이터 속도는 <xliff:g id="USED">%1$d</xliff:g>Kb/s로 줄어듭니다."</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"이동통신사의 모바일 네트워크 데이터 사용 정책에 대한 자세한 정보"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"셀 브로드캐스트 SMS"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"셀 브로드캐스트 SMS"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"셀 브로드캐스트 SMS"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"셀 브로드캐스트 SMS 사용"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"셀 브로드캐스트 SMS 사용 중지"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"셀 브로드캐스트 SMS 설정"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"긴급 방송"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"긴급 방송 사용"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"긴급 방송 사용 중지"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"관리 기능"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"관리 기능 사용"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"관리 기능 사용 중지"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"유지보수"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"유지보수 사용"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"유지보수 사용 중지"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"일반 뉴스"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"경제 뉴스"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"스포츠 뉴스"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"연예 뉴스"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"지역"</string>
- <string name="local_enable" msgid="6370463247609136359">"지역 뉴스 사용"</string>
- <string name="local_disable" msgid="4405691986943795798">"지역 뉴스 사용 중지"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"지역 정보"</string>
- <string name="regional_enable" msgid="4434680415437834759">"지역 뉴스 사용"</string>
- <string name="regional_disable" msgid="5359325527213850077">"지역 뉴스 사용 중지"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"국내 정보"</string>
- <string name="national_enable" msgid="1172443648912246952">"국내 뉴스 사용"</string>
- <string name="national_disable" msgid="326018148178601166">"국내 뉴스 사용 중지"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"국제 뉴스"</string>
- <string name="international_enable" msgid="5855356769925044927">"국제 뉴스 사용"</string>
- <string name="international_disable" msgid="2850648591041088931">"국제 뉴스 사용 중지"</string>
- <string name="list_language_title" msgid="2841683501919760043">"언어"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"새 언어 선택"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"영어"</item>
- <item msgid="1151988412809572526">"프랑스어"</item>
- <item msgid="577840534704312665">"스페인어"</item>
- <item msgid="8385712091143148180">"일본어"</item>
- <item msgid="1858401628368130638">"한국어"</item>
- <item msgid="1933212028684529632">"중국어"</item>
- <item msgid="1908428006803639064">"히브리어"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"언어"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"지역 날씨 정보"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"지역 날씨 정보 사용"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"지역 날씨 정보 사용 중지"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"지역 교통정보"</string>
- <string name="atr_enable" msgid="5541757457789181799">"지역 교통정보 사용"</string>
- <string name="atr_disable" msgid="7085558154727596455">"지역 교통정보 사용 중지"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"현지 항공기 일정"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"현지 항공기 일정 사용"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"현지 항공기 일정 사용 중지"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"식당 정보"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"식당 정보 사용"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"식당 정보 사용 중지"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"숙박 정보"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"숙박 정보 사용"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"숙박 정보 사용 중지"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"소매점 디렉토리"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"소매점 디렉토리 사용"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"소매점 디렉토리 사용 중지"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"광고"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"광고 사용"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"광고 사용 중지"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"주가지수"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"주가지수 사용"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"주가지수 사용 중지"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"채용 정보"</string>
- <string name="eo_enable" msgid="8623559062015685813">"채용 정보 사용"</string>
- <string name="eo_disable" msgid="3863812478090907609">"채용 정보 사용 중지"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"의료, 건강 및 병원 정보"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"의료, 건강 및 병원 정보 사용"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"의료, 건강 및 병원 정보 사용 중지"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"기술 뉴스"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"기술 뉴스 사용"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"기술 뉴스 사용 중지"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"다중 카테고리"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"다중 카테고리 사용"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"다중 카테고리 사용 중지"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"GSM/UMTS 네트워크 환경설정"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"아직 구현되지 않았습니다."</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"GSM/UMTS 네트워크 환경설정"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA(자동 모드)"</item>
- <item msgid="8912042051809329533">"WCDMA 전용"</item>
- <item msgid="8776934131146642662">"GSM 전용"</item>
- <item msgid="4684679567848300935">"GSM/WCDA(WCDMA로 기본 설정)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"2G 네트워크만 사용"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"배터리 절약"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"시스템 선택"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"cdma 로밍 모드 변경"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"시스템 선택"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"집 전용"</item>
- <item msgid="1205664026446156265">"자동"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMA 로밍 모드"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"cdma 로밍 모드 변경"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMA 로밍 모드"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"홈 네트워크 전용"</item>
- <item msgid="8174642753290624634">"소속된 네트워크"</item>
- <item msgid="2241951431403168661">"모든 네트워크"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"CDMA 네트워크 환경설정"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"아직 구현되지 않았습니다."</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"CDMA 네트워크 환경설정"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"CDMA 전용"</item>
- <item msgid="2683555124647197574">"EvDo 전용"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"CDMA 가입 테스트"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"RUIM/SIM과 NV 간 변경"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"가입"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"발신 허용 번호"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"FDN 목록"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"FDN 활성화"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"발신 허용 번호 사용"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"발신 허용 번호 사용 중지됨"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"FDN 사용"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"FDN 사용 중지"</string>
- <string name="change_pin2" msgid="2153563695382176676">"PIN2 변경"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"FDN 사용 중지"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"FDN 사용"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"발신 허용 번호 관리"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"FDN 액세스를 위해 PIN 변경"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"전화번호 목록 관리"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"음성 개인정보 보호"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"향상된 개인정보 보호 모드 사용"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTY 모드"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"TTY 모드 사용"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTY 모드"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"TTY 모드 설정"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"자동으로 다시 시도"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"자동 다시 시도 모드 사용"</string>
- <string name="menu_add" msgid="1882023737425114762">"연락처 추가"</string>
- <string name="menu_edit" msgid="7143003705504672374">"연락처 수정"</string>
- <string name="menu_delete" msgid="3977150783449642851">"연락처 삭제"</string>
- <string name="get_pin2" msgid="1198225482542827652">"PIN2 입력"</string>
- <string name="name" msgid="7329028332786872378">"이름"</string>
- <string name="number" msgid="7905950798349903858">"번호"</string>
- <string name="save" msgid="4094274636321939086">"저장"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"발신 허용 번호 추가"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"발신 허용 번호를 추가하는 중..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"발신 허용 번호가 추가되었습니다."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"발신 허용 번호 편집"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"발신 허용 번호 업데이트 중..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"발신 허용 번호가 업데이트되었습니다."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"발신 허용 번호 삭제"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"발신 허용 번호를 삭제하는 중..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"발신 허용 번호가 삭제되었습니다."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN 업데이트 안됨: 잘못된 PIN을 입력했습니다."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN 업데이트 안됨: 번호는 20자리를 초과할 수 없습니다."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"SIM 카드에서 읽는 중..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"SIM 카드에 주소록이 없습니다."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"가져올 주소록 선택"</string>
- <string name="enable_pin" msgid="5422767284133234860">"SIM PIN 사용/사용 중지"</string>
- <string name="change_pin" msgid="9174186126330785343">"SIM PIN 변경"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"SIM PIN:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"이전 PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"새 PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"새 PIN 확인"</string>
- <string name="badPin" msgid="4154316827946559447">"입력한 이전 PIN이 올바르지 않습니다. 다시 시도해 주세요."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"입력한 PIN이 일치하지 않습니다. 다시 시도해 주세요."</string>
- <string name="invalidPin" msgid="5981171102258684792">"4~ 8자리 숫자로 된 PIN을 입력하세요."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"SIM PIN 사용 중지"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"SIM PIN 사용"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"잠시 기다려 주세요..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"SIM PIN 사용"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"SIM PIN 사용 중지됨"</string>
- <string name="pin_failed" msgid="6597695909685242127">"입력한 PIN이 올바르지 않습니다."</string>
- <string name="pin_changed" msgid="9000716792724195093">"SIM PIN이 변경되었습니다."</string>
- <string name="puk_requested" msgid="3898394204193202803">"비밀번호 틀림. SIM 잠겨 있음! PUK2 요청됨."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"이전 PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"새 PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"새 PIN2 확인"</string>
- <string name="badPuk2" msgid="4072035207011308856">"입력한 PUK2가 올바르지 않습니다. 다시 시도해 주세요."</string>
- <string name="badPin2" msgid="515218795152422178">"입력한 이전 PIN2가 올바르지 않습니다. 다시 시도해 주세요."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"입력한 PIN2가 일치하지 않습니다. 다시 시도해 주세요."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"4-8자리 수로 구성된 PIN2를 입력합니다."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"8자리 숫자로 된 PUK2를 입력하세요."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2가 변경되었습니다."</string>
- <string name="label_puk2_code" msgid="302845876240219560">"PUK2 코드 입력"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"비밀번호가 잘못되었습니다. PIN2를 변경한 후 다시 시도하세요."</string>
- <string name="puk2_requested" msgid="5863580927788820813">"비밀번호 틀림. SIM 잠겨 있음! PUK2 요청됨."</string>
- <string name="doneButton" msgid="2859593360997984240">"완료"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"다자간 통화 <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"통화로 돌아가기"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"SIM 카드 없이 계속"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"SIM 카드가 없습니다. 휴대전화에 SIM 카드를 삽입하세요."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"취소"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"잠금해제"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"PIN을 인증하는 중..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"음성사서함 번호"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"전화 거는 중"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"다시 시도 중"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"현재 통화"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"다자간 통화"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"수신전화"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Cdma 통화 대기"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"통화 종료됨"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"대기 중"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"전화 끊는 중"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"통화 상태"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"부재중 전화"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"부재중 통화"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"부재중 통화 <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>통"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>의 부재중 전화"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"현재 통화(<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"대기 중"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"새 음성사서함"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"새 음성사서함(<xliff:g id="COUNT">%d</xliff:g>개)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>(으)로 전화걸기"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"알 수 없는 음성사서함 번호"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"서비스 불가"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"선택한 네트워크(<xliff:g id="OPERATOR_NAME">%s</xliff:g>)를 사용할 수 없음"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"전화를 걸려면 먼저 비행기 모드를 해제하세요."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"네트워크에서 등록되지 않았습니다."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"모바일 네트워크를 사용할 수 없습니다."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"잘못된 번호를 입력했으므로 전화를 걸지 못했습니다."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"전화를 걸지 못했습니다."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI 시퀀스 시작 중..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"기능 코드 시퀀스 시작 중..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"지원되지 않는 서비스입니다."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"통화를 전환할 수 없습니다."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"통화를 분리할 수 없습니다."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"통화를 전달할 수 없습니다."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"다자간 통화를 할 수 없습니다."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"통화를 거부할 수 없습니다."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"통화를 끊을 수 없습니다."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"긴급 전화"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"무선을 켜는 중..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"서비스 지역을 벗어났습니다. 다시 시도하는 중..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g>은(는) 비상 번호가 아니므로 전화를 걸지 못했습니다."</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"전화를 걸지 못했습니다. 긴급 전화번호로 전화를 걸어 보세요."</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"키보드를 사용하여 전화걸기"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"터치톤 키패드"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"다이얼패드"</string>
- <string name="touchLockText" msgid="566824588267376287">"잠금해제하려면"\n"두 번 누르세요."</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"전화를 받으려면"\n"두 번 누르기"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"거부하려면"\n"두 번 누르기"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"대기"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"대기 해제"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"종료"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"다이얼패드"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"숨기기"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"스피커"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"음소거"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"통화 추가"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"통화 병합"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"전환"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"통화 관리"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"관리"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"가져오기"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"모두 가져오기"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"SIM 주소록 가져오는 중"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"주소록에서 가져오기"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"보청기"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"보청기 호환 사용"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY 사용 안함"</item>
- <item msgid="3971695875449640648">"TTY 전체"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERI 텍스트"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMF 신호음"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"DTMF 신호음 길이 설정"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"보통"</item>
- <item msgid="2883365539347850535">"길게"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"네트워크 메시지"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"전화 활성화"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"전화 서비스를 활성화하려면 특수 통화를 해야 합니다. "\n\n"\'활성화\'를 누른 다음 지시사항을 듣고 전화를 활성화하세요."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"\'활성화\'를 터치하면 이동통신사의 모바일 네트워크에서 휴대전화를 활성화하는 특수 통화가 걸리며 모바일 데이터 네트워크에 연결할 수 있습니다."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"활성화를 건너뛰시겠습니까?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"활성화를 건너뛰면 Wi-Fi 네트워크에는 연결할 수 있지만 전화를 걸거나 모바일 데이터 네트워크에 연결할 수 없습니다. 휴대전화를 활성화할 때까지 휴대전화를 켤 때마다 활성화하라는 메시지가 표시됩니다."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"건너뛰기"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"활성화"</string>
- <string name="ota_activate" msgid="1368528132525626264">"활성화"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"전화가 활성화되었습니다."</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"활성화 문제"</string>
- <string name="ota_listen" msgid="162923839877584937">"활성화가 완료되었다는 메시지를 들을 때까지 음성 안내를 따르세요."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"키패드"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"스피커"</string>
- <string name="ota_progress" msgid="4644512049143969504">"전화가 프로그래밍되는 동안 기다려 주세요."</string>
- <string name="ota_failure" msgid="8600027551822478181">"프로그래밍 실패"</string>
- <string name="ota_successful" msgid="1880780692887077407">"전화가 이제 활성화되었습니다. 서비스가 시작하는 데 최대 15분이 걸릴 수 있습니다."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"전화가 활성화되지 않았습니다. "\n"신호가 잘 잡히는 지역(창 근처나 바깥)을 찾아야 할 수 있습니다. "\n\n"다시 시도하거나 고객지원팀에 전화해서 다른 옵션에 대해 문의하세요."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"너무 많은 SPC 실패"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"뒤로"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"다시 시도"</string>
- <string name="ota_next" msgid="3904945374358235910">"다음"</string>
- <string name="ota_back" msgid="2190038043403850052">"뒤로"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"긴급 콜백 모드 시작"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"긴급 콜백 모드"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"데이터 연결이 끊김"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"<xliff:g id="COUNT">%s</xliff:g>분 동안 데이터 연결 없음"</item>
- <item quantity="other" msgid="3122217344579273583">"<xliff:g id="COUNT">%s</xliff:g>분 동안 데이터 연결 없음"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"전화의 긴급 콜백 모드가 <xliff:g id="COUNT">%s</xliff:g>분 동안 지속됩니다. 이 모드에서는 데이터 연결을 사용하는 응용프로그램을 사용할 수 없습니다. 지금 종료하시겠습니까?"</item>
- <item quantity="other" msgid="3231879566243957821">"전화의 긴급 콜백 모드가 <xliff:g id="COUNT">%s</xliff:g>분 동안 지속됩니다. 이 모드에서는 데이터 연결을 사용하는 응용프로그램을 사용할 수 없습니다. 지금 종료하시겠습니까?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"긴급 콜백 모드에서는 선택한 동작을 사용할 수 없습니다. 휴대전화의 긴급 콜백 모드 상태가 <xliff:g id="COUNT">%s</xliff:g>분 동안 지속됩니다. 지금 종료하시겠습니까?"</item>
- <item quantity="other" msgid="3489076611710869904">"긴급 콜백 모드에서는 선택한 동작을 사용할 수 없습니다. 휴대전화의 긴급 콜백 모드 상태가 <xliff:g id="COUNT">%s</xliff:g>분 동안 지속됩니다. 지금 종료하시겠습니까?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"긴급 통화 중에는 선택한 동작을 사용할 수 없습니다."</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"긴급 콜백 모드 종료하는 중"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"예"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"아니요"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"해제"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"음성사서함 설정"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;설정 안함&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"음성사서함 서비스"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> 설정"</string>
- <string name="other_settings" msgid="3672912580359716394">"기타 통화 설정"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"전화걸기"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"^1"\n<b>"^2"</b>"을(를) 통해 전화걸기"</string>
- <string name="slide_to_answer" msgid="255903188611244476">"응답하려면 오른쪽으로 드래그"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"벨소리 장치를 무음 모드로 전환하려면 왼쪽으로 드래그"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"거부하려면 왼쪽으로 드래그"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"응답하고"\n"현재 통화를 보류하려면 오른쪽으로 드래그"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"응답하고"\n"현재 통화를 종료하려면 오른쪽으로 드래그"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"응답하고"\n"보류 중인 통화를 종료하려면 오른쪽으로 드래그"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"응답"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"거부"</string>
-</resources>
diff --git a/phone/res/values-nb/strings.xml b/phone/res/values-nb/strings.xml
deleted file mode 100644
index 276d316..0000000
--- a/phone/res/values-nb/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Kontakter"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoritter"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Telefon"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Nødnummer"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Logg"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Faste nummer"</string>
- <string name="unknown" msgid="6878797917991465859">"Ukjent"</string>
- <string name="private_num" msgid="6713286113000232309">"Hemmelig nummer"</string>
- <string name="payphone" msgid="1931775086311769314">"Telefonkiosk"</string>
- <string name="onHold" msgid="9035493194749959955">"Parkert"</string>
- <string name="ongoing" msgid="8300874342848721367">"Aktiv samtale"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Opptatt"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Nettverket er opptatt"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Mangler signal"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"ACM-grense nådd"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Radioen er av"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Mangler SIM-kort, eller SIM-feil"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Utenfor dekningsområde"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Utgående samtaler er begrenset til faste nummer."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Du kan ikke ringe ut mens samtaleblokkering er på."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Alle samtaler er begrenset av tilgangskontroll."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Nødsamtaler er begrenset av tilgangskontroll."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Vanlige samtaler er begrenset av tilgangskontroll."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: Telefonen er låst til varmstart."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: Samtalen ble droppet."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: Samtalen ble avskåret."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: omordnet."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: tjenestevalg avslått."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: forsøk ordning på nytt."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: tilgangsfeil."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: ble kommet i forkjøpet."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Kun nødsamtaler er mulig."</string>
- <string name="confCall" msgid="1904840547188336828">"Telefonmøte"</string>
- <string name="call_lost" msgid="317670617901479594">"Samtalen er mistet."</string>
- <string name="retry" msgid="8462986804300767852">"Prøv på nytt"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Samtale mistet"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMI-kode påbegynt"</string>
- <string name="ussdRunning" msgid="485588686340541690">"USSD-kode kjører…"</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMI-kode avbrutt"</string>
- <string name="cancel" msgid="5044513931633602634">"Avbrutt"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Høyttaler"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Demp"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Parker"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Avslutt samtale"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Bytt samtale"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Slå sammen samtaler"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Legg til samtale"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Styr telefonmøte"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Vis talltastatur"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Skjul talltastatur"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Parker denne samtalen"\n"og svar"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Avslutt denne samtalen"\n"og svar"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Trykk menyknappen for samtalevalg."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Trykk menyknappen for samtalevalg • Bruk tastaturet for å ringe"</string>
- <string name="menu_answer" msgid="116686205042231098">"Svar"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorer"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Send disse tonene?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Sender ringetoner"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Send"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Nei"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Erstatt jokertegnet med"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Mangler nummer til telefonsvarer"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Det er ikke lagret noe telefonsvarernummer på SIM-kortet."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Legg til nummer"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Laster…"</string>
- <string name="enterPin" msgid="4753300834213388397">"Skriv inn PIN-kode for å låse opp SIM-kortet."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM-kort låst opp"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Ny PIN-kode for SIM-kort"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Skriv SIM-koden igjen for å bekrefte"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"PIN-kodene du skrev inn stemmer ikke overens. Prøv igjen."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Skriv inn PUK-kode for å låse opp SIM-kortet"</string>
- <string name="badPuk" msgid="3213017898690275965">"Gal PUK-kode!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Fortsett"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"SIM-kortet er blitt avblokkert. Telefonen låses opp…"</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN-kode for å fjerne operatørlås"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Lås opp"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Skjul"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Spør om fjerning av operatørlås…"</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Fikk ikke fjerne operatørlås."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Operatørlåsen er fjernet."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Innstillinger for GSM-samtaler"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Innstillinger for CDMA-samtaler"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Navn på aksesspunkt"</string>
- <string name="settings_label" msgid="3876743539816984008">"Nettverksinnstillinger"</string>
- <string name="voicemail" msgid="8693759337917898954">"Telefonsvarer"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"Svarer:"</string>
- <string name="networks" msgid="8873030692174541976">"Nettoperatører"</string>
- <string name="call_settings" msgid="6112441768261754562">"Samtaleinnstillinger"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Flere innstillinger"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Flere GSM-spesifikke innstillinger"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Flere CDMA-innstillinger"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Flere CDMA-spesifikke innstillinger"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Nettverkstjenester"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"Nummervisning"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Skjul nummer ved utgående samtaler"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Vis nummer ved utgående samtaler"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"La operatøren bestemme om nummeret vises ved utgående samtaler"</string>
- <string name="labelCW" msgid="6120513814915920200">"Samtale venter"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Under samtaler, varsle om innkommende anrop"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Under samtaler, ikke varsle om innkommende anrop"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Innstillinger for viderekobling"</string>
- <string name="labelCF" msgid="2574386948026924737">"Viderekobling"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Alltid viderekoble"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Alltid bruk dette nummeret"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Viderekoble alle anrop"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Viderekoble alle anrop til {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Nummeret er ikke tilgjengelig"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Deaktivert"</string>
- <string name="labelCFB" msgid="218938523102207587">"Viderekoble når opptatt"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Nummer ved opptattsignal"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Viderekoble til {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Deaktivert"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Operatøren håndterer ikke deaktivering av viderekobling når telefonen er opptatt."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Viderekoble når det ikke svares"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Nummer for når det ikke svares"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Viderekobler til {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Deaktivert"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Operatøren håndterer ikke deaktivering av viderekobling når anropet ikke besvares."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Viderekoble ved manglende dekning"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Nummer ved manglende dekning"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Viderekobler til {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Deaktivert"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Operatøren håndterer ikke deaktivering av viderekobling når telefonen er utenfor dekning."</string>
- <string name="updating_title" msgid="6146755386174019046">"Samtaleinnstillinger"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Feil ved samtaleinnstillinger"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Leser innstillinger…"</string>
- <string name="updating_settings" msgid="8171225533884883252">"Oppdaterer innstillinger…"</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Tilbakestiller innstillinger ..."</string>
- <string name="response_error" msgid="6674110501330139405">"Uventet svar fra nettverket."</string>
- <string name="exception_error" msgid="7027667130619518211">"Nettverks- eller SIM-kort-feil."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Slå på radioen før du ser på disse innstillingene."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Aktiver"</string>
- <string name="disable" msgid="7274240979164762320">"Deaktiver"</string>
- <string name="change_num" msgid="239476305819844391">"Oppdater"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Nettverksstandard"</item>
- <item msgid="7876195870037833661">"Skjul nummer"</item>
- <item msgid="1108394741608734023">"Vis nummer"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Lagre nummer til telefonsvarer"</string>
- <string name="vm_changed" msgid="380744030726254139">"Telefonsvarernummeret ble endret."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Endring av nummeret til talemeldingtjenesten mislyktes."\n"Ta kontakt med operatøren hvis dette problemet vedvarer."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Videresending av nummerendring mislyktes."\n"Ta kontakt med operatøren hvis dette problemet vedvarer."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Kunne ikke kopiere over gjeldende viderekoblingsinnstillinger."\n"Ønsker du å bytte til den nye leverandøren uansett?"</string>
- <string name="no_change" msgid="3186040086622435212">"Ingen endringer ble utført."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Velg talemeldingsleverandør"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Min teleoperatør"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Innstillinger for mobilnettverk"</string>
- <string name="label_available" msgid="1181658289009300430">"Tilgjengelige nettverk"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Søker…"</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Fant ingen nettverk."</string>
- <string name="search_networks" msgid="1601136049300882441">"Søk etter nettverk"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Det oppsto en feil under søking etter nettverk."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Kobler til <xliff:g id="NETWORK">%s</xliff:g>…"</string>
- <string name="not_allowed" msgid="3540496123717833833">"SIM-kortet tillater ikke tilkobling til dette nettverket."</string>
- <string name="connect_later" msgid="500090982903469816">"Kan ikke koble til nettverket. Prøv på nytt senere."</string>
- <string name="registration_done" msgid="495135664535876612">"Registrert i nettverket."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Velg en nettoperatør"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Søk etter alle tilgjengelige nettverk"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Velg automatisk"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Velg foretrukket nettverk automatisk"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Automatisk registrering …"</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Nettverksmodus"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Bytt nettverksmodus"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Foretrukket nettverksmodus"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Global"</item>
- <item msgid="3273348576277144124">"Kun EvDo"</item>
- <item msgid="454610224530856274">"CDMA uten EvDo"</item>
- <item msgid="8928247118825616081">"CDMA / EvDo auto"</item>
- <item msgid="8595462903294812666">"GSM / WCDMA auto"</item>
- <item msgid="5189164180446264504">"Kun WCDMA"</item>
- <item msgid="5714714953966979187">"Kun GSM"</item>
- <item msgid="4775796025725908913">"GSM / WCDMA foretrukket"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Data aktivert"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Aktiver datatilgang i mobilnettverk"</string>
- <string name="roaming" msgid="8871412572928323707">"Dataroaming"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Koble til datatjenester ved roaming"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Koble til datatjenester ved roaming"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Du har mistet datakonnektivitet fordi du har forlatt hjemmenettet ditt med dataroaming slått av."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Tillat dataroaming? Dette kan koste mye penger!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS-innstillinger"</string>
- <string name="cdma_options" msgid="4016822858172249884">"CDMA-innstillinger"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Databruk"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Retningslinjer for mobildata"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Data som er brukt i inneværende periode"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Databrukperiode"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Retningslinjer for datahastighet"</string>
- <string name="throttle_help" msgid="243651091785169900">"Les mer"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %) av maksimum <xliff:g id="USED_2">%3$s</xliff:g> for perioden"\n"Neste periode starter om <xliff:g id="USED_3">%4$d</xliff:g> dager (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %) av maksimum <xliff:g id="USED_2">%3$s</xliff:g> for perioden"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"<xliff:g id="USED_0">%1$s</xliff:g> har overskredet maksimumsgrensen"\n"Datahastigheten er redusert til <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g> % av syklusen er fullført"\n"Neste periode starter om <xliff:g id="USED_1">%2$d</xliff:g> dager (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Datahastigheten reduseres til <xliff:g id="USED">%1$d</xliff:g> Kb/s hvis databruken overskrider grenseverdien"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Les mer om mobiloperatørens retningslinjer for bruk av nettverksdata"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Kringkastings-SMS"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Kringkastings-SMS"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Kringkastings-SMS"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Kringkastings-SMS aktivert"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Kringkastings-SMS deaktivert"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Innstillinger for kringkastings-SMS"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Nødkringkasting"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Nødkringkasting aktivert"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Nødkringkasting deaktivert"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Administrativia"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Administrativia aktivert"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Administartivia aktivert"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Vedlikehold"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Vedlikehold aktivert"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Vedlikehold deaktivert"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Generelle nyheter"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Bedrifts- og finansnyheter"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Sportsnyheter"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Underholdningsnyheter"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Lokal"</string>
- <string name="local_enable" msgid="6370463247609136359">"Lokalnyheter aktivert"</string>
- <string name="local_disable" msgid="4405691986943795798">"Lokalnyheter deaktivert"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regional"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Regionalnyheter aktivert"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Regionalnyheter deaktivert"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Nasjonal"</string>
- <string name="national_enable" msgid="1172443648912246952">"Nasjonale nyheter aktivert"</string>
- <string name="national_disable" msgid="326018148178601166">"Nasjonale nyheter deaktivert"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Verden"</string>
- <string name="international_enable" msgid="5855356769925044927">"Verdensnyheter aktivert"</string>
- <string name="international_disable" msgid="2850648591041088931">"Verdensnyheter deaktivert"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Språk"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Velg nyhetsspråk"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Engelsk"</item>
- <item msgid="1151988412809572526">"Fransk"</item>
- <item msgid="577840534704312665">"Spansk"</item>
- <item msgid="8385712091143148180">"Japansk"</item>
- <item msgid="1858401628368130638">"Koreansk"</item>
- <item msgid="1933212028684529632">"Kinesisk"</item>
- <item msgid="1908428006803639064">"Hebraisk"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Språk"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Lokalt vær"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Lokalt vær aktivert"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Lokalt vær deaktivert"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Lokale trafikkmeldinger"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Lokale trafikkmeldinger aktivert"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Lokale trafikkmeldinger deaktivert"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Lokale flytider"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Lokale flytider aktivert"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Lokale flytider deaktivert"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restauranter"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restauranter aktivert"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restauranter deaktivert"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Losji"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Losji aktivert"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Losji deaktivert"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Varehandel"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Varehandel aktivert"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Varehandel deaktivert"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Reklame"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Reklame aktivert"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Reklame deaktivert"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Aksjekurser"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Aksjekurser aktivert"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Aksjekurser deaktivert"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Jobbmuligheter"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Jobbmuligheter aktivert"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Jobbmuligheter deaktivert"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Helse og sykehus"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Helse og sykehus aktivert"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Helse og sykehus deaktivert"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Teknologinyheter"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Teknologinyheter aktivert"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Teknologinyheter deaktivert"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Multikategori"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Multikategori aktivert"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Multikategori deaktivert"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"GSM/UMTS-nettverksvalg"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Ikke implementert ennå!"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"GSM/UMTS-nettverksvalg"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (automodus)"</item>
- <item msgid="8912042051809329533">"Bare WCDMA"</item>
- <item msgid="8776934131146642662">"Kun GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (WCDMA foretrekkes)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Bruk kun 2G-nettverk"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Sparer batteri"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Systemvalg"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Velg roamingmodus for CDMA"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Systemvalg"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Kun hjemmenett"</item>
- <item msgid="1205664026446156265">"Automatisk"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMA-roamingmodus"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Velg roamingmodus for CDMA"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMA-roamingmodus"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Kun hjemmenett"</item>
- <item msgid="8174642753290624634">"Tilknyttede nettverk"</item>
- <item msgid="2241951431403168661">"Alle nettverk"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"CDMA-nettverksinnstillinger"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Ikke implementert ennå!"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"CDMA-nettverksinnstillinger"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Bare CDMA"</item>
- <item msgid="2683555124647197574">"Kun EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"CDMA-abonnements-TEST"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Bytt mellom RUIM/SIM og NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"Abonnement"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Faste nummer"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Liste over faste nummer"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Aktivering av faste nummer"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Kun faste nummer kan ringes"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Faste nummer er deaktivert"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Aktiver faste nummer"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Slå av faste nummer"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Endre PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Slå av faste nummer"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Aktiver faste nummer"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Vedlikehold liste over faste nummer"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Endre PIN-kode for å styre faste nummer"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Endre liste over telefonnummer"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Samtale-personvern"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Aktiver forbedret personvern"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTY-modus"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Aktiver TTY-modus"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTY-modus"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Velg TTY-modus"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Automatisk nytt forsøk"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Aktiver Automatisk nytt forsøk"</string>
- <string name="menu_add" msgid="1882023737425114762">"Legg til kontakt"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Rediger kontakt"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Fjern kontakt"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Skriv inn PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Navn"</string>
- <string name="number" msgid="7905950798349903858">"Num,er"</string>
- <string name="save" msgid="4094274636321939086">"Lagre"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Legg til programmert telefonnummer"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Legger til programmert telefonnummer ..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Programmert telefonnummer er lagt til."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Rediger programmert telefonnummer"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Oppdaterer programmert telefonnummer ..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Programmert telefonnummer er oppdatert."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Slett programmert telefonnummer"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Sletter programmert telefonnummer ..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Programmert telefonnummer er slettet."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"Anropsbegrensning er ikke oppdatert: du har angitt feil PIN-kode."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"Anropsbegrensning er ikke oppdatert: nummeret kan kun inneholde 20 sifrer."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Leser fra SIM-kort…"</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Ingen kontakter på SIM-kortet."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Velg kontakter som skal importeres"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Slå av/på PIN-kode for SIM-kort"</string>
- <string name="change_pin" msgid="9174186126330785343">"Endre PIN-kode for SIM-kort"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"SIM-kortets PIN-kode:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Gammel PIN-kode"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Ny PIN-kode"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Bekreft ny PIN-kode"</string>
- <string name="badPin" msgid="4154316827946559447">"Du skrev gal gammel PIN-kode. Prøv igjen."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"PIN-kodene du skrev inn, stemmer ikke overens. Prøv igjen."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Skriv inn en PIN-kode som er fra 4 til 8 siffer."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Slå av PIN-kode for SIM-kort"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Slå på PIN-kode for SIM-kort"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Vent litt…"</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"PIN-kode for SIM-kort slått på"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"PIN-kode for SIM-kort slått av"</string>
- <string name="pin_failed" msgid="6597695909685242127">"PIN-koden du skrev inn var gal"</string>
- <string name="pin_changed" msgid="9000716792724195093">"PIN-koden for SIM-kortet ble endret"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Galt passord, SIM-kortet er låst! Skriv inn PUK2-koden."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2-kode"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Gammel PIN2-kode"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Ny PIN2-kode"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Bekreft ny PIN2-kode"</string>
- <string name="badPuk2" msgid="4072035207011308856">"PUK2-koden er ikke riktig. Prøv igjen."</string>
- <string name="badPin2" msgid="515218795152422178">"Den gamle PIN2-koden du skrev er ikke riktig. Prøv igjen."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"PIN2-kodene du skrev inn, stemmer ikke overens. Prøv igjen."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Skriv inn en PIN2-kode som er mellom 4 og 8 siffer."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Skriv inn en PUK2-kode som er 8 siffer."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2-koden ble endret."</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Skriv inn PUk2-kode"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Galt passord, endre PIN2-koden og prøv igjen!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Galt passord, SIM-kortet er låst! Skriv inn PUK2-koden."</string>
- <string name="doneButton" msgid="2859593360997984240">"Ferdig"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Telefonmøte <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Tilbake til samtale"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Fortsett uten SIM-kort"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Fant ikke noe SIM-kort. Sett et SIM-kort i telefonen."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Skjul"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Lås opp"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Godkjenner PIN-kode…"</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Nummer til telefonsvarer"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Ringer"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Prøver på nytt"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Aktiv samtale"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Telefonmøte"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Innkommende anrop"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"CDMA samtale venter"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Samtale avsluttet"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Parkert"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Legger på"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Samtale pågår"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Tapt anrop"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Tapte anrop"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> tapte anrop"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Tapt anrop fra <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Aktiv samtale (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Parkert"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Nye beskjeder på telefonsvarer"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nye beskjeder på telefonsvarer (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Ring <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Mangler nummer til telefonsvarer"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Ingen tjeneste"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Valgt nettverk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) er ikke tilgjengelig"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"For å ringe, slå av flymodus først."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ikke registrert på nettverket."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Mobilnettverket er ikke tilgjengelig."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Samtalen ble ikke opprettet, mangler eller ugyldig nummer."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Samtalen ble ikke opprettet."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Begynner MMI-sekvens…"</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Starter funksjonskode …"</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Ustøttet tjeneste."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Kan ikke bytte samtale."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Kan ikke skille samtale."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Kan ikke overføre samtale."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Kan ikke opprette telefonmøte."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Kan ikke avvise anrop."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Kan ikke legge på."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Nødanrop"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Slår på radio…"</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Utenfor dekningsområde, prøver igjen…"</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Samtalen ble ikke opprettet, <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> er ikke et nødnummer!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Samtalen ble ikke opprettet, ring et nødnummer!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Bruk tastaturet for å ringe"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Talltastatur for tastetoner"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Talltastatur"</string>
- <string name="touchLockText" msgid="566824588267376287">"Trykk to ganger"\n" for å låse opp"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Trykk to ganger"\n" for å svare"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Trykk to ganger "\n" for å avslå"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Hold"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Opphev"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Avslutt"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Talltastatur"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Skjul"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Høyttaler"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Ignorer"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Legg til anrop"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Slå sammen samtaler"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Bytt"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Administrer samtaler"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Administrer"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importer"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importer alle"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importerer kontakter fra SIM-kortet"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importer fra kontakter"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Høreapparater"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Slå på kompatibilitet med høreapparat"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY av"</item>
- <item msgid="3971695875449640648">"TTY full"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERI-tekst"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMF-toner"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Velg lengde på DTMF-toner"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Vanlig"</item>
- <item msgid="2883365539347850535">"Lang"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Nettverksmelding"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Aktiver telefonen din"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Det må foretas en spesifikk oppringning for at telefontjenesten skal aktiveres. "\n\n"Trykk «Aktiver», og lytt deretter til instruksjonene for å aktivere telefonen."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Trykk på Aktiver for å foreta et spesielt anrop som aktiverer telefonen på mobiltjenesteleverandørens nettverk, slik at du kan foreta anrop og koble til mobildatanettverk."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Hopp over aktivering?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Hvis du hopper over aktiveringen, kan du ikke foreta anrop eller koble til mobildatanettverk (du kan imidlertid koble til trådløse nettverk). Du blir bedt om å aktivere hver gang du slår på telefonen, inntil aktivering er fullført."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Hopp over"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Aktiver"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Aktiver"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Telefonen er aktivert!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problemer med aktivering"</string>
- <string name="ota_listen" msgid="162923839877584937">"Følg taleinstruksjonene inntil du får beskjed om at aktiveringen er fullført."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Tastatur"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Høyttaler"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Vent mens telefonen programmeres."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programmering mislyktes"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Telefonen din er aktivert. Det kan ta opptil 15 minutter før tjenestene er i gang."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Telefonen din ble ikke aktivert. "\n" Prøv å finne et område med bedre dekning (ved et vindu eller utendørs). "\n\n"Prøv på nytt, eller ring kundetjenestene for å få flere forslag."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"Omfattende SPC-feil"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Tilbake"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Prøv igjen"</string>
- <string name="ota_next" msgid="3904945374358235910">"Neste"</string>
- <string name="ota_back" msgid="2190038043403850052">"Tilbake"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Startet modusen nødsamtale-tilbakeringing"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Modusen nødsamtale-tilbakeringing"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Datatilkobling deaktivert"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Ingen datatilkobling i <xliff:g id="COUNT">%s</xliff:g> minutt"</item>
- <item quantity="other" msgid="3122217344579273583">"Ingen datatilkobling i <xliff:g id="COUNT">%s</xliff:g> minutter"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Telefonen vil være i modusen nødsamtale-tilbakeringing i <xliff:g id="COUNT">%s</xliff:g> minutt. Ingen programmer med datatilkobling kan brukes når telefonen er i denne modusen. Vil du avslutte?"</item>
- <item quantity="other" msgid="3231879566243957821">"Telefonen vil være i modusen nødsamtale-tilbakeringing i <xliff:g id="COUNT">%s</xliff:g> minutter. Ingen programmer med datatilkobling kan brukes når telefonen er i denne modusen. Vil du avslutte?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"Den valgte handlingen er ikke tilgjengelig i modusen nødsamtale-tilbakeringing. Telefonen vil være i denne modusen i <xliff:g id="COUNT">%s</xliff:g> minutt. Vil du avslutte?"</item>
- <item quantity="other" msgid="3489076611710869904">"Den valgte handlingen er ikke tilgjengelig i modusen nødsamtale-tilbakeringing. Telefonen vil være i denne modusen i <xliff:g id="COUNT">%s</xliff:g> minutter. Vil du avslutte?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"Ikke mulig under en nødsamtale"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Avslutter modusen nødsamtale-tilbakeringing"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Ja"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Nei"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Lukk"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Innstillinger for talemelding"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;ikke angitt&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Talemeldingtjeneste"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Innstillinger for <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Andre ringeinnstillinger"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Ring"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Ring via ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Dra mot høyre for å svare"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Dra mot venstre for å slå av ringetonen"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Dra mot venstre for å avslå"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Dra mot høyre for·å·svare·og·sette"\n"aktiv samtale på vent"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Dra mot høyre for å svare og"\n"avslutte aktiv samtale"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Dra mot høyre for·å·svare og"\n"avslutte ventende samtale"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Svar"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Ikke del"</string>
-</resources>
diff --git a/phone/res/values-nl/strings.xml b/phone/res/values-nl/strings.xml
deleted file mode 100644
index 5890529..0000000
--- a/phone/res/values-nl/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Contacten"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoriet"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Kiezer"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Kiezer noodoproep"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefoon"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Oproeplogboek"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"FDN-lijst"</string>
- <string name="unknown" msgid="6878797917991465859">"Onbekend"</string>
- <string name="private_num" msgid="6713286113000232309">"Privénummer"</string>
- <string name="payphone" msgid="1931775086311769314">"Betaaltelefoon"</string>
- <string name="onHold" msgid="9035493194749959955">"In de wacht"</string>
- <string name="ongoing" msgid="8300874342848721367">"Huidige oproep"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Lijn is bezet"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Netwerk bezet"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Geen kiestoon"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"ACM-limiet overschreden"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Radio uit"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Geen SIM-kaart of fout met SIM-kaart"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Buiten servicegebied"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Uitgaande oproepen worden beperkt door FDN."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Uitgaande oproepen zijn niet mogelijk als de functie voor oproepen blokkeren is ingeschakeld."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Alle oproepen worden beperkt door toegangsbeheer."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Noodoproepen worden beperkt door toegangsbeheer."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Normale oproepen worden beperkt door toegangsbeheer."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: telefoon vergrendeld tot opstartcyclus."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: oproep afgebroken."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: oproep onderschept."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: nieuwe opdracht."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: serviceoptie geweigerd."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: opdracht opnieuw proberen."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: toegangsfout."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: preëmptief gemaakt."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Alleen noodoproepen zijn mogelijk."</string>
- <string name="confCall" msgid="1904840547188336828">"Telefonische vergadering"</string>
- <string name="call_lost" msgid="317670617901479594">"De verbinding is verbroken."</string>
- <string name="retry" msgid="8462986804300767852">"Opnieuw proberen"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Verbinding verbroken"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMI-code gestart"</string>
- <string name="ussdRunning" msgid="485588686340541690">"USSD-code uitvoeren..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMI-code geannuleerd"</string>
- <string name="cancel" msgid="5044513931633602634">"Annuleren"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Luidspreker"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Dempen"</string>
- <string name="menu_hold" msgid="6970441130344786273">"In de wacht"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Beëindigen"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Wisselen"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Samenvoegen"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Toevoegen"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Telefonische vergadering beheren"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Toetsenblok weergeven"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Toetsenblok verbergen"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Hdg. opr. in wacht"\n"en opnemen"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Hdg. opr. beëindigen"\n"en opnemen"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Druk op \'Menu\' voor oproep-opties."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Druk op \'Menu\' voor oproep-opties • Toetsen gebruiken om te bellen"</string>
- <string name="menu_answer" msgid="116686205042231098">"Antwoord"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Negeren"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"De volgende tonen verzenden?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Nummers verzenden"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Verzenden"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Nee"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Het jokerteken vervangen door"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Voicemailnummer ontbreekt"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Er is geen voicemailnummer op de SIM-kaart opgeslagen."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Nummer toevoegen"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Laden..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Voer de PIN-code in om de SIM-kaart te ontgrendelen."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM-kaart ontgrendeld"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Nieuwe SIM PIN-code"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Voer de nieuwe SIM PIN-code nogmaals in ter bevestiging"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"De SIM PIN-codes die u heeft ingevoerd, komen niet overeen. Probeer het opnieuw."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Voer de PUK-code in om de SIM-kaart te ontgrendelen"</string>
- <string name="badPuk" msgid="3213017898690275965">"Onjuiste PUK-code!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Doorgaan"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"Uw SIM-kaart is gedeblokkeerd. Uw telefoon wordt ontgrendeld..."</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN-code voor ontgrendelen SIM-netwerk"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Ontgrendelen"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Negeren"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Verzoek om ontgrendelen netwerk..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Verzoek voor ontgrendelen netwerk mislukt."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Het netwerk is ontgrendeld."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI-nummer"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"GSM-oproepinstellingen"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"CDMA-oproepinstellingen"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Namen toegangspunten"</string>
- <string name="settings_label" msgid="3876743539816984008">"Netwerkinstellingen"</string>
- <string name="voicemail" msgid="8693759337917898954">"Voicemail"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
- <string name="networks" msgid="8873030692174541976">"Mobiele providers"</string>
- <string name="call_settings" msgid="6112441768261754562">"Oproepinstellingen"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Aanvullende instellingen"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Aanvullende oproepinstellingen voor alleen GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Aanvullende CDMA-oproepinstellingen"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Aanvullende oproepinstellingen voor alleen CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Instellingen voor netwerkservice"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"Beller-id"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Nummer verborgen bij uitgaande oproepen"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Nummer weergegeven bij uitgaande oproepen"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Gebruik de standaard operatorinstellingen om mijn nummer bij uitgaande oproepen weer te geven"</string>
- <string name="labelCW" msgid="6120513814915920200">"Wisselgesprek"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Inkomende oproepen melden als ik aan het bellen ben"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Inkomende oproepen melden als ik aan het bellen ben"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Instellingen voor doorschakelen van oproepen"</string>
- <string name="labelCF" msgid="2574386948026924737">"Oproep doorschakelen"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Altijd doorschakelen"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Altijd dit nummer gebruiken"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Alle oproepen doorschakelen"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Alle oproepen doorschakelen naar {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Het telefoonnummer is niet beschikbaar"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Uitgeschakeld"</string>
- <string name="labelCFB" msgid="218938523102207587">"Doorsch. bij in gesprek"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Nummer indien in gesprek"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Doorschakelen naar {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Uitgeschakeld"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Uw provider biedt geen ondersteuning voor het uitschakelen van oproepdoorschakelingen wanneer uw telefoon bezet is."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Doorsch. bij onbeantwoord"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Nummer indien onbeantwoord"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Doorschakelen naar {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Uitgeschakeld"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Uw provider biedt geen ondersteuning voor het uitschakelen van oproepdoorschakelingen wanneer uw telefoon niet wordt opgenomen."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Doorsch. bij onbereikbaar"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Nummer indien onbereikbaar"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Doorschakelen naar {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Uitgeschakeld"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Uw provider biedt geen ondersteuning voor het uitschakelen van oproepdoorschakelingen wanneer uw telefoon niet bereikbaar is."</string>
- <string name="updating_title" msgid="6146755386174019046">"Oproepinstellingen"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Fout met oproepinstellingen"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Instellingen lezen..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"Instellingen bijwerken..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Instellingen terugzetten..."</string>
- <string name="response_error" msgid="6674110501330139405">"Onverwachte reactie van netwerk."</string>
- <string name="exception_error" msgid="7027667130619518211">"Netwerk- of SIM-kaartfout."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Schakel de radio in voordat u deze instellingen bekijkt."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Inschakelen"</string>
- <string name="disable" msgid="7274240979164762320">"Uitschakelen"</string>
- <string name="change_num" msgid="239476305819844391">"Bijwerken"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Netwerkstandaard"</item>
- <item msgid="7876195870037833661">"Nummer verbergen"</item>
- <item msgid="1108394741608734023">"Nummer weergeven"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Voicemailnummer opslaan"</string>
- <string name="vm_changed" msgid="380744030726254139">"Voicemailnummer gewijzigd."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Het wijzigen van het voicemailnummer is mislukt."\n"Neem contact op met uw provider als dit probleem zich blijft voordoen."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Het wijzigen van het doorschakelnummer is mislukt."\n"Neem contact op met uw provider als dit probleem zich blijft voordoen."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Kan huidige instellingen voor doorschakelnummer niet ophalen en opslaan."\n"Wilt u toch overgaan naar de nieuwe provider?"</string>
- <string name="no_change" msgid="3186040086622435212">"Er zijn geen wijzigingen aangebracht."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Service voor voicemail selecteren"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Mijn provider"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Instellingen mobiel netwerk"</string>
- <string name="label_available" msgid="1181658289009300430">"Beschikbare netwerken"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Zoeken..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Geen netwerken gevonden."</string>
- <string name="search_networks" msgid="1601136049300882441">"Netwerken zoeken"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Fout tijdens zoeken naar netwerken."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Registreren op <xliff:g id="NETWORK">%s</xliff:g>…"</string>
- <string name="not_allowed" msgid="3540496123717833833">"Uw SIM-kaart staat geen verbinding met dit netwerk toe."</string>
- <string name="connect_later" msgid="500090982903469816">"Kan momenteel geen verbinding maken met dit netwerk. Probeer het later opnieuw."</string>
- <string name="registration_done" msgid="495135664535876612">"Geregistreerd op netwerk."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Een mobiele provider selecteren"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Alle beschikbare netwerken zoeken"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Automatisch selecteren"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Voorkeursnetwerk automatisch selecteren"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Automatische registratie..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Netwerkmodus"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"De netwerkgebruiksmodus wijzigen"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Voorkeursnetwerkmodus"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Globaal"</item>
- <item msgid="3273348576277144124">"Alleen EvDo"</item>
- <item msgid="454610224530856274">"CDMA zonder EvDo"</item>
- <item msgid="8928247118825616081">"CDMA/EvDo automatisch"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA automatisch"</item>
- <item msgid="5189164180446264504">"Alleen WCDMA"</item>
- <item msgid="5714714953966979187">"Alleen GSM"</item>
- <item msgid="4775796025725908913">"Voorkeur voor GSM/WCDMA"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Gegevenstoegang aan"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Gegevenstoegang via mobiel netwerk inschakelen"</string>
- <string name="roaming" msgid="8871412572928323707">"Gegevensroaming"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Verbinding maken met gegevensservices tijdens roaming"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Verbinding maken met gegevensservices tijdens roaming"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"De gegevensverbinding is verbroken, omdat u uw thuisnetwerk heeft verlaten terwijl gegevensroaming was uitgeschakeld."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Gegevensroaming toestaan? Er kunnen hoge roamingkosten in rekening worden gebracht."</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"GSM-/UMTS-opties"</string>
- <string name="cdma_options" msgid="4016822858172249884">"CDMA-opties"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Gegevensgebruik"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Gegevensbeleid van provider"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Gegevensgebruik in huidige periode"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Periode voor gegevensgebruik"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Beleid voor gegevenssnelheid"</string>
- <string name="throttle_help" msgid="243651091785169900">"Meer informatie"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) van periodemaximum van <xliff:g id="USED_2">%3$s</xliff:g>"\n"De volgende periode start over<xliff:g id="USED_3">%4$d</xliff:g> dagen (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) van periodemaximum van <xliff:g id="USED_2">%3$s</xliff:g>"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Maximum van <xliff:g id="USED_0">%1$s</xliff:g> overschreden"\n"Gegevenssnelheid verlaagd tot <xliff:g id="USED_1">%2$d</xliff:g> kB/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">" ٪<xliff:g id="USED_0">%1$d</xliff:g>van cyclus verstreken"\n"De volgende periode start over <xliff:g id="USED_1">%2$d</xliff:g> dagen (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Gegevenssnelheid wordt verlaagd tot <xliff:g id="USED">%1$d</xliff:g> kB/s als de limiet voor gegevensgebruik wordt overschreden"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Meer informatie over het beleid voor gegevensgebruik van uw mobiele provider"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Infodienstbericht"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Infodienstbericht"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"SMS Infodienstbericht"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"SMS Infodienstbericht ingeschakeld"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Infodienstbericht uitgeschakeld"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Instellingen voor SMS infodienstberichten"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Bericht bij noodsituatie"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Bericht bij noodsituatie ingeschakeld"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Bericht bij noodsituatie uitgeschakeld"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Beheer"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Beheer ingeschakeld"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Beheer uitgeschakeld"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Onderhoud"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Onderhoud ingeschakeld"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Onderhoud uitgeschakeld"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Algemeen nieuws"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Zakelijk en financieel nieuws"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Sportnieuws"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Amusementsnieuws"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Lokaal"</string>
- <string name="local_enable" msgid="6370463247609136359">"Lokaal nieuws ingeschakeld"</string>
- <string name="local_disable" msgid="4405691986943795798">"Lokaal nieuws uitgeschakeld"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regionaal"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Regionaal nieuws ingeschakeld"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Regionaal nieuws uitgeschakeld"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Binnenlands"</string>
- <string name="national_enable" msgid="1172443648912246952">"Binnenlands nieuws ingeschakeld"</string>
- <string name="national_disable" msgid="326018148178601166">"Binnenlands nieuws uitgeschakeld"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Buitenlands"</string>
- <string name="international_enable" msgid="5855356769925044927">"Buitenlands nieuws ingeschakeld"</string>
- <string name="international_disable" msgid="2850648591041088931">"Buitenlands nieuws uitgeschakeld"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Taal"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"De taal voor het nieuws selecteren"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Engels"</item>
- <item msgid="1151988412809572526">"Frans"</item>
- <item msgid="577840534704312665">"Spaans"</item>
- <item msgid="8385712091143148180">"Japans"</item>
- <item msgid="1858401628368130638">"Koreaans"</item>
- <item msgid="1933212028684529632">"Chinees"</item>
- <item msgid="1908428006803639064">"Hebreeuws"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Talen"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Lokaal weerbericht"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Lokaal weerbericht ingeschakeld"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Lokaal weerbericht uitgeschakeld"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Verkeersberichten"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Verkeersberichten ingeschakeld"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Verkeersberichten uitgeschakeld"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Vluchttijden voor lokaal vliegveld"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Vluchttijden voor lokaal vliegveld ingeschakeld"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Vluchttijden voor lokaal vliegveld uitgeschakeld"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restaurants"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restaurants ingeschakeld"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restaurants uitgeschakeld"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Overnachtingen"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Overnachtingen ingeschakeld"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Overnachtingen uitgeschakeld"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Winkeloverzicht"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Winkeloverzicht ingeschakeld"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Winkeloverzicht uitgeschakeld"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Advertenties"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Advertenties ingeschakeld"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Advertenties uitgeschakeld"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Aandelenkoersen"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Aandelenkoersen ingeschakeld"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Aandelenkoersen uitgeschakeld"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Vacatures"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Vacatures ingeschakeld"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Vacatures uitgeschakeld"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Medisch, gezondheid en ziekenhuis"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Medisch, gezondheid en ziekenhuis ingeschakeld"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Medisch, gezondheid en ziekenhuis uitgeschakeld"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Technologienieuws"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Technologienieuws ingeschakeld"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Technologienieuws uitgeschakeld"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Meerdere categorieën"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Meerdere categorieën ingeschakeld"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Meerdere categorieën uitgeschakeld"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"GSM-/UMTS-netwerkvoorkeuren"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Nog niet geïmplementeerd."</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"GSM-/UMTS-netwerkvoorkeuren"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (automatische modus)"</item>
- <item msgid="8912042051809329533">"Alleen WCDMA"</item>
- <item msgid="8776934131146642662">"Alleen GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (voorkeur voor WCDMA)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Alleen 2G-netwerken"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Energiespaarstand"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Systeem selecteren"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"De CDMA-roamingmodus wijzigen"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Systeem selecteren"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Alleen thuis"</item>
- <item msgid="1205664026446156265">"Automatisch"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMA-roamingmodus"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"De CDMA-roamingmodus wijzigen"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMA-roamingmodus"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Alleen thuisnetwerken"</item>
- <item msgid="8174642753290624634">"Partnernetwerken"</item>
- <item msgid="2241951431403168661">"Elk netwerk"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"CDMA-netwerkvoorkeuren"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Nog niet geïmplementeerd."</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"CDMA-netwerkvoorkeuren"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Alleen CDMA"</item>
- <item msgid="2683555124647197574">"Alleen EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"TEST CDMA-abonnement"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Schakelen tussen RUIM/SIM en NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"abonnement"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Vaste nummers"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"FDN-lijst"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"FDN-activering"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Vaste nummers zijn ingeschakeld"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Vaste nummers zijn uitgeschakeld"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"FDN inschakelen"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"FDN uitschakelen"</string>
- <string name="change_pin2" msgid="2153563695382176676">"PIN2-code wijzigen"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"FDN uitschakelen"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"FDN inschakelen"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Vaste nummers beheren"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"PIN-code voor FDN-toegang wijzigen"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Lijst met telefoonnummers beheren"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Spraakprivacy"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Geavanceerde privacymodus inschakelen"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTY-modus"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"TTY-modus inschakelen"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTY-modus"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"TTY-modus instellen"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Automatisch opnieuw proberen"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Modus voor automatisch opnieuw proberen inschakelen"</string>
- <string name="menu_add" msgid="1882023737425114762">"Contact toevoegen"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Contact bewerken"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Contact verwijderen"</string>
- <string name="get_pin2" msgid="1198225482542827652">"PIN2-code invoeren"</string>
- <string name="name" msgid="7329028332786872378">"Naam"</string>
- <string name="number" msgid="7905950798349903858">"Nummer"</string>
- <string name="save" msgid="4094274636321939086">"Opslaan"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Vast nummer toevoegen"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Vast nummer toevoegen..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Vast nummer toegevoegd."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Vast nummer bewerken"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Vast nummer bijwerken..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Vast nummer bijgewerkt."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Vast nummer verwijderen"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Vast nummer verwijderen..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Vast nummer verwijderd."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN niet bijgewerkt: u heeft een onjuiste PIN-code ingevoerd."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN niet bijgewerkt: nummer mag niet langer zijn dan 20 cijfers."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Lezen vanaf SIM-kaart..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Geen contacten op uw SIM-kaart."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Contacten selecteren om te importeren"</string>
- <string name="enable_pin" msgid="5422767284133234860">"SIM PIN-code in-/uitschakelen"</string>
- <string name="change_pin" msgid="9174186126330785343">"SIM PIN-code wijzigen"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"SIM PIN-code:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Oude PIN-code"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Nieuwe PIN-code"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Nieuwe PIN-code bevestigen"</string>
- <string name="badPin" msgid="4154316827946559447">"De oude PIN-code die u heeft ingevoerd, is onjuist. Probeer het opnieuw."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"De PIN-codes die u heeft ingevoerd, komen niet overeen. Probeer het opnieuw."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Voer een PIN-code van 4 tot 8 cijfers in."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"SIM PIN-code uitschakelen"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"SIM PIN-code inschakelen"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Een ogenblik geduld..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"SIM PIN-code ingeschakeld"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"SIM PIN-code uitgeschakeld"</string>
- <string name="pin_failed" msgid="6597695909685242127">"De PIN-code die u heeft ingevoerd, is onjuist"</string>
- <string name="pin_changed" msgid="9000716792724195093">"SIM PIN-code gewijzigd"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Wachtwoord onjuist, SIM-kaart is vergrendeld! PUK2-code vereist."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Oude PIN2-code"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Nieuwe PIN2-code"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Nieuwe PIN2-code bevestigen"</string>
- <string name="badPuk2" msgid="4072035207011308856">"De PUK2-code die u heeft ingevoerd, is onjuist. Probeer het opnieuw."</string>
- <string name="badPin2" msgid="515218795152422178">"De oude PIN2-code die u heeft ingevoerd, is onjuist. Probeer het opnieuw."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"De PIN2-codes die u heeft ingevoerd, komen niet overeen. Probeer het opnieuw."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Voer een PIN2-code van 4 tot 8 cijfers in."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Voer een PUK2-code van 8 cijfers in."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2-code gewijzigd"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"PUK2-code invoeren"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Wachtwoord onjuist, wijzig PIN2-code en probeer het opnieuw!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Wachtwoord onjuist, SIM-kaart is vergrendeld! PUK2-code vereist."</string>
- <string name="doneButton" msgid="2859593360997984240">"Gereed"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Telefonische vergadering <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Terug naar oproep"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Doorgaan zonder SIM-kaart"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Geen SIM-kaart gevonden. Plaats een SIM-kaart in de telefoon."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Negeren"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Ontgrendelen"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"PIN-code verifiëren..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Voicemailnummer"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Kiezen"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Opnieuw proberen"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Huidige oproep"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Telefonische vergadering"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Inkomende oproep"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"CDMA-oproep in wacht"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Oproep beëindigd"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"In de wacht"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Ophangen"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Actieve oproep"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Gemiste oproep"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Gemiste oproepen"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> gemiste oproepen"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Gemiste oproep van <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Huidige oproep (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"In de wacht"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Nieuwe voicemail"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nieuwe voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> bellen"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Voicemailnummer onbekend"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Geen service"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Geselecteerd netwerk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) niet beschikbaar"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Als u wilt bellen, moet u eerst de Vliegmodus uitschakelen."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Niet geregistreerd op netwerk."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Mobiel netwerk niet beschikbaar."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Oproep niet verzonden, geen geldig nummer ingevoerd."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Oproep niet verzonden."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI-reeks starten..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Functiecodereeks starten…"</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Niet-ondersteunde service."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Kan niet overschakelen tussen oproepen."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Kan oproep niet scheiden."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Kan oproep niet doorschakelen."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Telefonische vergaderingen niet mogelijk."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Kan oproep niet weigeren."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Kan oproepen niet vrijgeven."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Noodoproep"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Radio aanzetten..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Buiten servicegebied, nieuwe poging..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Oproep niet verzonden, <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is geen alarmnummer!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Oproep niet verzonden, kies een alarmnummer!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Toetsen gebruiken om te bellen"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Toetsenblok voor toetsgeluid"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Toetsenblok"</string>
- <string name="touchLockText" msgid="566824588267376287">"Tik twee keer"\n"om te ontgrendelen"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Tik tweemaal"\n"om te beantwoorden"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Tik tweemaal"\n"om te weigeren"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"In de wacht"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Uit de wacht halen"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Beëindigen"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Toetsenblok"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Verbergen"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Luidspreker"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Dempen"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Oproep toevoegen"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Oproepen samenvoegen"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Wisselen"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gesprekken beheren"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Beheren"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importeren"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Alles importeren"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"SIM-contacten importeren"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importeren uit contacten"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Gehoorapparaten"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Compatibiliteit voor gehoorapparaat inschakelen"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY uit"</item>
- <item msgid="3971695875449640648">"TTY vol"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERI-tekst"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMF-tonen"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"De lengte van DTMF-tonen instellen"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normaal"</item>
- <item msgid="2883365539347850535">"Lang"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Netwerkbericht"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Uw telefoon activeren"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"U moet een speciale oproep uitvoeren om uw telefoonservice te activeren. "\n\n"Nadat u op \'Activeren\' heeft gedrukt, luistert u naar de instructies om uw telefoon te activeren."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Raak \'Activeren\' aan om een speciale oproep te plaatsen waarmee uw telefoon wordt geactiveerd op het mobiele netwerk van uw provider, zodat u kunt bellen en verbinding kunt maken met mobiele gegevensnetwerken."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Activering overslaan?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Als u de activering overslaat, kunt u niet bellen of verbinding maken met mobiele gegevensnetwerken (u kunt wel verbinding maken met Wi-Fi-netwerken). Tot u de telefoon activeert, wordt u gevraagd deze te activeren telkens wanneer u de telefoon inschakelt."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Overslaan"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Activeren"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Activeren"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"De telefoon is geactiveerd."</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Probleem met activeren"</string>
- <string name="ota_listen" msgid="162923839877584937">"Volg de gesproken instructies tot u hoort dat de activering is voltooid."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Toetsenblok"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Luidspreker"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Wacht even totdat uw telefoon is geprogrammeerd."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programmeren mislukt"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Uw telefoon is nu geactiveerd. Het kan maximaal vijftien minuten duren voordat de service actief is."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Uw telefoon is niet geactiveerd. "\n"Zoek een plek waar u betere dekking heeft (in de buurt van een raam of buiten). "\n\n"Probeer het opnieuw of bel de klantenservice voor meer opties."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"VEEL SPC-FOUTEN"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Terug"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Opnieuw proberen"</string>
- <string name="ota_next" msgid="3904945374358235910">"Volgende"</string>
- <string name="ota_back" msgid="2190038043403850052">"Terug"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Modus voor noodoproepen ingeschakeld"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Modus voor noodoproepen"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Gegevensverbinding uitgeschakeld"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Er is al <xliff:g id="COUNT">%s</xliff:g> minuut geen dataverbinding"</item>
- <item quantity="other" msgid="3122217344579273583">"Er is al <xliff:g id="COUNT">%s</xliff:g> minuten geen dataverbinding"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"De telefoon staat <xliff:g id="COUNT">%s</xliff:g> minuut in de modus voor noodoproepen. In deze modus kunt u geen toepassingen gebruiken die een dataverbinding vereisen. Wilt u de modus verlaten?"</item>
- <item quantity="other" msgid="3231879566243957821">"De telefoon staat <xliff:g id="COUNT">%s</xliff:g> minuten in de modus voor noodoproepen. In deze modus kunt u geen toepassingen gebruiken die een dataverbinding vereisen. Wilt u de modus verlaten?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"De geselecteerde actie is niet beschikbaar in de modus voor noodoproepen. De telefoon staat <xliff:g id="COUNT">%s</xliff:g> minuut in deze modus. Wilt u de modus verlaten?"</item>
- <item quantity="other" msgid="3489076611710869904">"De geselecteerde actie is niet beschikbaar in de modus voor noodoproepen. De telefoon staat <xliff:g id="COUNT">%s</xliff:g> minuten in deze modus. Wilt u de modus verlaten?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"De geselecteerde actie is niet beschikbaar tijdens noodoproepen"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Modus voor noodoproepen verlaten"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Ja"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Nee"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Negeren"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Instellingen voor voicemail"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;niet ingesteld&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Service voor voicemail"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Instellingen voor <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Andere instellingen voor bellen"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Bellen"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Bellen via ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Sleep naar rechts om op te nemen"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Sleep naar links om de belsoftware uit te schakelen"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Sleep naar links om te weigeren"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Sleep naar rechts om op te nemen en"\n"actieve oproep in de wacht te zetten"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Sleep naar rechts om op te nemen en"\n"actieve oproep te beëindigen"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Sleep naar rechts om op te nemen en"\n"oproep in de wacht te beëindigen"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Beantw."</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Weigeren"</string>
-</resources>
diff --git a/phone/res/values-pl/strings.xml b/phone/res/values-pl/strings.xml
deleted file mode 100644
index 2f8dcc8..0000000
--- a/phone/res/values-pl/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Kontakty"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Ulubione"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Telefon"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Numery alarmowe"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Dziennik połączeń"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Ustalone numery"</string>
- <string name="unknown" msgid="6878797917991465859">"Nieznany"</string>
- <string name="private_num" msgid="6713286113000232309">"Numer prywatny"</string>
- <string name="payphone" msgid="1931775086311769314">"Płatny telefon"</string>
- <string name="onHold" msgid="9035493194749959955">"Oczekujące"</string>
- <string name="ongoing" msgid="8300874342848721367">"Bieżące połączenie"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Linia jest zajęta"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Sieć zajęta"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Brak sygnału"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Przekroczono limit ACM"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Sieci bezprzewodowe są wyłączone"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Brak lub błąd karty SIM"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Obszar nieobsługiwany"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Połączenia są ograniczone do listy ustalonych numerów."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Nie można wykonywać połączeń wychodzących, gdy włączona jest blokada dzwonienia."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Wszystkie połączenia są zablokowane przez funkcję kontroli dostępu."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Połączenia alarmowe są zablokowane przez funkcję kontroli dostępu."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Zwykłe połączenia są zablokowane przez funkcję kontroli dostępu."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: telefon zablokowany do momentu ponownego uruchomienia."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: połączenie porzucone."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: połączenie przechwycone."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: zmiana kolejności."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: odrzucenie opcji usługi."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: kolejność ponawiania próby."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: niepowodzenie dostępu."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: zajęte."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Możliwe jest wykonywanie tylko połączeń alarmowych."</string>
- <string name="confCall" msgid="1904840547188336828">"Poł. konferencyjne"</string>
- <string name="call_lost" msgid="317670617901479594">"Połączenie zostało zerwane."</string>
- <string name="retry" msgid="8462986804300767852">"Ponów próbę"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Połączenie zostało zerwane"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"Kod MMI został rozpoczęty"</string>
- <string name="ussdRunning" msgid="485588686340541690">"Uruchomiony kod USSD..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"Kod MMI został anulowany"</string>
- <string name="cancel" msgid="5044513931633602634">"Anuluj"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Głośnik"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Wycisz"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Wstrzymaj"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Zakończ"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Przełącz"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Scal"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Dodaj poł."</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Zarządzanie rozmową konferencyjną"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Pokaż panel wybierania numeru"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Ukryj panel wybierania numeru"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Zawieś bieżące poł."\n"i odpowiedz"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Zakończ bieżące poł."\n"i odpowiedz"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Naciśnij Menu, aby zobaczyć opcje połączenia."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Naciśnij Menu, aby wyświetlić opcje połączenia • Użyj klawiatury, aby wybrać numer"</string>
- <string name="menu_answer" msgid="116686205042231098">"Odbierz"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignoruj"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Wysłać następujące dzwonki?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Wysyłanie sygnałów"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Wyślij"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Tak"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Nie"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Zastąp symbol wieloznaczny"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Brakuje numeru poczty głosowej"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Na karcie SIM nie ma zapisanego numeru poczty głosowej."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Dodaj numer"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Ładowanie..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Wprowadź kod PIN, aby odblokować kartę SIM."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"Karta SIM jest odblokowana"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Nowy kod PIN do karty SIM"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Aby potwierdzić, wpisz ponownie nowy kod PIN do karty SIM"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Wprowadzone kody PIN do karty SIM nie są identyczne. Spróbuj ponownie."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Wprowadź kod PUK, aby odblokować kartę SIM"</string>
- <string name="badPuk" msgid="3213017898690275965">"Błędny kod PUK!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Dalej"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"Karta SIM została odblokowana. Odblokowywanie telefonu..."</string>
- <string name="label_ndp" msgid="780479633159517250">"Kod PIN do karty SIM odblokowujący sieć"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Odblokuj"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Zamknij"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Żądanie odblokowania sieci..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Żądanie odblokowania sieci zakończyło się niepowodzeniem."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Sieć została pomyślnie odblokowana."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"Numer MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Ustawienia połączenia GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Ustawienia połączenia CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Punkty dostępowe"</string>
- <string name="settings_label" msgid="3876743539816984008">"Ustawienia sieci"</string>
- <string name="voicemail" msgid="8693759337917898954">"Poczta głosowa"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"Poczta głosowa:"</string>
- <string name="networks" msgid="8873030692174541976">"Operatorzy sieci"</string>
- <string name="call_settings" msgid="6112441768261754562">"Ustawienia połączeń"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Ustawienia dodatkowe"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Dodatkowe ustawienia: tylko połączenia GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Dodatkowe ustawienia połączenia CDMA"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Dodatkowe ustawienia tylko połączenia CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Ustawienia usługi sieciowej"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"ID rozmówcy"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Ukrycie numeru podczas rozmów wychodzących"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Numer wyświetlany w połączeniach wychodzących"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Użyj domyślnych ustawień operatora, aby wyświetlać mój numer w połączeniach wychodzących"</string>
- <string name="labelCW" msgid="6120513814915920200">"Połączenia oczekujące"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Podczas połączenia powiadamiaj mnie o połączeniach przychodzących"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Podczas połączenia powiadamiaj mnie o połączeniach przychodzących"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Ustawienia przekierowania połączeń"</string>
- <string name="labelCF" msgid="2574386948026924737">"Przekierowania połączeń"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Przekieruj wszystkie"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Zawsze używaj tego numeru"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Przekierowanie wszystkich rozmów"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Przekierowanie wszystkich rozmów do {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Numer jest niedostępny"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Wyłączone"</string>
- <string name="labelCFB" msgid="218938523102207587">"Przekieruj, gdy zajęty"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Numer, gdy zajęty"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Przekierowanie do {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Wyłączone"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Twój operator nie umożliwia wyłączenia przekazywania połączeń, gdy numer jest zajęty."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Przekieruj, gdy nieodebrane"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Numer, gdy nieodebrane"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Przekierowanie do {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Wyłączone"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Twój operator nie umożliwia wyłączenia przekazywania połączeń, gdy numer nie odpowiada."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Przekieruj, gdy nieosiągalny"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Numer, gdy nieosiągalny."</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Przekierowanie do {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Wyłączone"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Twój operator nie umożliwia wyłączenia przekazywania połączeń, gdy numer jest nieosiągalny."</string>
- <string name="updating_title" msgid="6146755386174019046">"Ustawienia połączeń"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Błąd w ustawieniach połączenia"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Czytanie ustawień..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"Aktualizowanie ustawień..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Cofanie ustawień…"</string>
- <string name="response_error" msgid="6674110501330139405">"Nieoczekiwana odpowiedź z sieci."</string>
- <string name="exception_error" msgid="7027667130619518211">"Błąd sieci lub karty SIM."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Przed wyświetleniem tych ustawień należy włączyć sieci bezprzewodowe."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Włącz"</string>
- <string name="disable" msgid="7274240979164762320">"Wyłącz"</string>
- <string name="change_num" msgid="239476305819844391">"Aktualizuj"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Domyślna wartość dla sieci"</item>
- <item msgid="7876195870037833661">"Ukryj numer"</item>
- <item msgid="1108394741608734023">"Pokaż numer"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Zapisz numer poczty głosowej"</string>
- <string name="vm_changed" msgid="380744030726254139">"Numer poczty głosowej został zmieniony."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Zmiana numeru poczty głosowej nie powiodła się."\n"Jeśli problem będzie występował nadal, skontaktuj się z operatorem."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Zmiana numeru przekazywania nie powiodła się."\n"Jeśli problem będzie występował nadal, skontaktuj się z operatorem."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Nie udało się pobrać i zapisać bieżących ustawień numeru przekazywania."\n"Czy mimo to chcesz przełączyć na nowego dostawcę?"</string>
- <string name="no_change" msgid="3186040086622435212">"Nie dokonano żadnych zmian."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Wybierz usługę poczty głosowej"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Mój operator"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Ustawienia sieci komórkowej"</string>
- <string name="label_available" msgid="1181658289009300430">"Dostępne sieci"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Wyszukiwanie..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Nie znaleziono sieci."</string>
- <string name="search_networks" msgid="1601136049300882441">"Wyszukaj sieci"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Podczas wyszukiwania sieci wystąpił błąd."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Rejestrowanie w <xliff:g id="NETWORK">%s</xliff:g>..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"Karta SIM nie pozwala na połączenia z tą siecią."</string>
- <string name="connect_later" msgid="500090982903469816">"Nie można nawiązać połączenia z tą siecią. Spróbuj ponownie później."</string>
- <string name="registration_done" msgid="495135664535876612">"Zarejestrowano w sieci."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Wybierz operatora sieci"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Wyszukaj wszystkie dostępne sieci"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Wybierz automatycznie"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Wybierz automatycznie preferowaną sieć"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Automatyczna rejestracja..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Tryb sieci"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Zmień tryb działania sieci"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Preferowany tryb sieci"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Globalne"</item>
- <item msgid="3273348576277144124">"Tylko EvDo"</item>
- <item msgid="454610224530856274">"CDMA bez EvDo"</item>
- <item msgid="8928247118825616081">"Automatyczny CDMA/EvDo"</item>
- <item msgid="8595462903294812666">"Automatyczny GSM/WCDMA"</item>
- <item msgid="5189164180446264504">"Tylko WCDMA"</item>
- <item msgid="5714714953966979187">"Tylko GSM"</item>
- <item msgid="4775796025725908913">"Preferowany GSM/WCDMA"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Włącz przesył danych"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Włącz przesył danych przez sieć komórkową"</string>
- <string name="roaming" msgid="8871412572928323707">"Dane w roamingu"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Połącz z usługami przesyłu danych podczas roamingu"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Połącz z usługami przesyłu danych podczas roamingu"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Utracono łączność danych, ponieważ pozostawiono wyłączony roaming danych w sieci macierzystej."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Czy pozwolić na przesył danych w roamingu? Operator może naliczać wysokie opłaty roamingowe!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Opcje GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Opcje CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Użycie danych"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Zasady operatora dot. danych"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Ilość użytych danych w bieżącym okresie"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Okres użycia danych"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Zasada prędkości przesyłu danych"</string>
- <string name="throttle_help" msgid="243651091785169900">"Więcej informacji"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) z <xliff:g id="USED_2">%3$s</xliff:g> (wartość maksymalna w okresie)"\n"Następny okres za: <xliff:g id="USED_3">%4$d</xliff:g> dni (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) z <xliff:g id="USED_2">%3$s</xliff:g> (wartość maksymalna w okresie)"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Przekroczono limit: <xliff:g id="USED_0">%1$s</xliff:g>"\n"Szybkość transmisji zmniejszona do <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"Minęło <xliff:g id="USED_0">%1$d</xliff:g>٪ cyklu"\n"Następny okres za: <xliff:g id="USED_1">%2$d</xliff:g> dni (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Zmniejsz transfer do <xliff:g id="USED">%1$d</xliff:g> Kb/s jeśli przekroczę limit użycia danych"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Więcej informacji na temat zasad dotyczących użycia danych w sieci komórkowej tego operatora"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Wiadomość SMS transmisji komórkowej"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Wiadomość SMS transmisji komórkowej"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Wiadomość SMS transmisji komórkowej"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Wiadomość SMS transmisji komórkowej włączona"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Wiadomość SMS transmisji komórkowej wyłączona"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Ustawienia wiadomości SMS transmisji komórkowej"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Transmisja alarmowa"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Transmisja alarmowa włączona"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Transmisja alarmowa wyłączona"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Administracja"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Administracja włączona"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Administracja wyłączona"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Konserwacja"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Konserwacja włączona"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Konserwacja wyłączona"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Wiadomości ogólne"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Wiadomości biznesowe i finansowe"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Wiadomości sportowe"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Wiadomości rozrywkowe"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Lokalne"</string>
- <string name="local_enable" msgid="6370463247609136359">"Wiadomości lokalne włączone"</string>
- <string name="local_disable" msgid="4405691986943795798">"Wiadomości lokalne wyłączone"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regionalne"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Wiadomości regionalne włączone"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Wiadomości regionalne wyłączone"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Krajowe"</string>
- <string name="national_enable" msgid="1172443648912246952">"Wiadomości krajowe włączone"</string>
- <string name="national_disable" msgid="326018148178601166">"Wiadomości krajowe wyłączone"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Międzynarodowe"</string>
- <string name="international_enable" msgid="5855356769925044927">"Wiadomości międzynarodowe włączone"</string>
- <string name="international_disable" msgid="2850648591041088931">"Wiadomości międzynarodowe wyłączone"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Język"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Wybierz język wiadomości"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Angielski"</item>
- <item msgid="1151988412809572526">"francuski"</item>
- <item msgid="577840534704312665">"hiszpański"</item>
- <item msgid="8385712091143148180">"japoński"</item>
- <item msgid="1858401628368130638">"koreański"</item>
- <item msgid="1933212028684529632">"chiński"</item>
- <item msgid="1908428006803639064">"hebrajski"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Języki"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Lokalna prognoza pogody"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Lokalna prognoza pogody włączona"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Lokalna prognoza pogody wyłączona"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Raporty o natężeniu ruchu"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Raporty o natężeniu ruchu włączone"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Raporty o natężeniu ruchu wyłączone"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Rozkład lotów z lokalnego lotniska"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Rozkład lotów z lokalnego lotniska włączony"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Rozkład lotów z lokalnego lotniska wyłączony"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restauracje"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restauracje włączone"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restauracje wyłączone"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Kwatery"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Kwatery włączone"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Kwatery wyłączone"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Katalog sprzedaży detalicznej"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Katalog sprzedaży detalicznej włączony"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Katalog sprzedaży detalicznej wyłączony"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Reklamy"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Reklamy włączone"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Reklamy wyłączone"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Notowania giełdowe"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Notowania giełdowe włączone"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Notowania giełdowe wyłączone"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Oferty pracy"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Oferty pracy włączone"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Oferty pracy wyłączone"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Placówki medyczne, zakłady opieki zdrowotnej i szpitale"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Placówki medyczne, zakłady opieki zdrowotnej i szpitale włączone"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Placówki medyczne, zakłady opieki zdrowotnej i szpitale wyłączone"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Wiadomości technologiczne"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Wiadomości technologiczne włączone"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Wiadomości technologiczne wyłączone"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Obsługa wielu kategorii"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Obsługa wielu kategorii włączona"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Obsługa wielu kategorii wyłączona"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Ustawienia sieci GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Funkcja jeszcze niezaimplementowana."</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Ustawienia sieci GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (tryb automatyczny)"</item>
- <item msgid="8912042051809329533">"Tylko WCDMA"</item>
- <item msgid="8776934131146642662">"Tylko GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (preferowany WCDMA)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Używaj tylko sieci 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Oszczędza baterię"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Wybór systemu"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Zmień tryb roamingu CDMA"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Wybór systemu"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Tylko główne"</item>
- <item msgid="1205664026446156265">"Automatyczny"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Tryb roamingu CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Zmień tryb roamingu CDMA"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"Tryb roamingu CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Tylko sieci domowe"</item>
- <item msgid="8174642753290624634">"Sieci stowarzyszone"</item>
- <item msgid="2241951431403168661">"Dowolna sieć"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Ustawienia sieci CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Funkcja jeszcze niezaimplementowana."</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Ustawienia sieci CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Tylko CDMA"</item>
- <item msgid="2683555124647197574">"Tylko EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"TEST subskrypcji CDMA"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Zmiana między RUIM/SIM i NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"subskrypcja"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Ustalone numery"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Ustalone numery"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Aktywacja usługi ustalonych numerów"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Włączono tryb ustalonych numerów"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Wyłączono tryb ustalonych numerów"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Włącz ustalone numery"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Wyłącz usługę ustalonych numerów"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Zmień PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Wyłącz usługę ustalonych numerów"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Włącz ustalone numery"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Zarządzanie ustalonymi numerami"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Zmień kod PIN pozwalający na zarządzanie ustalonymi numerami"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Zarządzanie listą numerów telefonów"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Prywatność połączeń głosowych"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Włącz rozszerzony tryb prywatności"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Tryb TTY"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Włącz tryb TTY"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Tryb TTY"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Ustaw tryb TTY"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Automatyczne ponawianie próby"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Włącz tryb automatycznego ponawiania próby"</string>
- <string name="menu_add" msgid="1882023737425114762">"Dodaj kontakt"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Edytuj kontakt"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Usuń kontakt"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Wprowadź PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Nazwa"</string>
- <string name="number" msgid="7905950798349903858">"Numer"</string>
- <string name="save" msgid="4094274636321939086">"Zapisz"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Dodaj ustalony numer"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Trwa dodawanie ustalonego numeru…"</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Dodano ustalony numer."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Edytuj ustalony numer"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Trwa aktualizowanie ustalonego numeru…"</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Zaktualizowano ustalony numer."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Usuń ustalony numer"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Trwa usuwanie ustalonego numeru…"</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Usunięto ustalony numer."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"Nie zaktualizowano usługi FDN: wprowadzono nieprawidłowy kod PIN."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"Nie zaktualizowano usługi FDN: numer nie może przekraczać 20 cyfr."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Czytanie z karty SIM..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Brak kontaktów na karcie SIM"</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Wybierz kontakty do importowania"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Włącz/wyłącz kod PIN do karty SIM"</string>
- <string name="change_pin" msgid="9174186126330785343">"Zmień PIN do karty SIM"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"Kod PIN do karty SIM:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Stary kod PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Nowy kod PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Potwierdź nowy kod PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"Wprowadzony stary kod PIN jest nieprawidłowy. Spróbuj ponownie."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Wprowadzone kody PIN nie są identyczne. Spróbuj ponownie."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Wpisz kod PIN o długości od 4 do 8 cyfr."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Wyłącz PIN do karty SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Włącz kod PIN do karty SIM"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Proszę czekać..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"Kod PIN do karty SIM jest włączony"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"PIN do karty SIM jest wyłączony"</string>
- <string name="pin_failed" msgid="6597695909685242127">"Wprowadzony kod PIN był nieprawidłowy"</string>
- <string name="pin_changed" msgid="9000716792724195093">"Kod PIN do karty SIM został pomyślnie zmieniony"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Błędne hasło, karta SIM jest zablokowana! Wymagany kod PUK2."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Stary kod PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Nowy PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Potwierdź nowy kod PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"Wprowadzony kod PUK2 jest nieprawidłowy. Spróbuj ponownie."</string>
- <string name="badPin2" msgid="515218795152422178">"Wprowadzony stary kod PIN2 jest niepoprawny. Spróbuj ponownie."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Wprowadzone kody PIN2 nie są identyczne. Spróbuj ponownie."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Wprowadź kod PIN2, który ma od 4 do 8 cyfr."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Wprowadź 8-cyfrowy kod PUK2."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"Kod PIN2 został pomyślnie zmieniony"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Wprowadź kod PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Błędne hasło, zmień kod PIN2 i spróbuj ponownie!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Błędne hasło, karta SIM jest zablokowana! Wymagany kod PUK2."</string>
- <string name="doneButton" msgid="2859593360997984240">"Gotowe"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Poł. konferencyjne <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Powrót do połączenia"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Kontynuuj bez karty SIM"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Nie znaleziono karty SIM. Należy włożyć kartę SIM do telefonu."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Zamknij"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Odblokuj"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Uwierzytelnianie kodu PIN..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Numer poczty głosowej"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Wybieranie"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Ponawianie próby"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Bieżące połączenie"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Poł. konferencyjne"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Połączenie"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Oczekujące połączenie CDMA"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Połączenie zakończone"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Oczekujące"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Trwa rozłączanie"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Trwa połączenie"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Nieodebrane połączenie"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Połączenia nieodebrane"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> nieodebranych połączeń"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Nieodebrane połączenie z <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Bieżące połączenie (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Oczekujące"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Nowa poczta głosowa"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nowa poczta głosowa (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Zadzwoń do <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nieznany numer poczty głosowej"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Brak usługi"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Wybrana sieć (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) jest niedostępna"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Aby rozpocząć połączenie, wyłącz najpierw tryb samolotowy"</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Nie zarejestrowano w sieci"</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Sieć komórkowa jest niedostępna."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Połączenie niezrealizowane, nie wprowadzono poprawnego numeru."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Połączenie nie zostało zrealizowane."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Rozpoczynanie sekwencji MMI..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Trwa rozpoczynanie sekwencji kodu funkcji…"</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Nieobsługiwana usługa."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Nie można przełączyć rozmów."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Nie można rozdzielić połączenia."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Nie można przekazać połączenia."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Nie można prowadzić rozmów konferencyjnych."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Nie można odrzucić połączenia."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Nie można zakończyć połączenia (połączeń)."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Połączenie alarmowe"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Trwa włączanie sieci bezprzewodowych..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Obszar nieobsługiwany, ponowna próba..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Połączenie niezrealizowane, <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nie jest numerem alarmowym!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Połączenie niezrealizowane, należy wybrać numer alarmowy!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Aby zadzwonić, użyj klawiatury."</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Dotknij klawiatury"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Panel numeryczny"</string>
- <string name="touchLockText" msgid="566824588267376287">"Dotknij dwukrotnie,"\n" aby odblokować"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Dotknij dwukrotnie,"\n"aby odebrać"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Dotknij dwukrotnie,"\n"aby odrzucić"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Wstrzymaj"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Wznów"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Zakończ"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Panel numeryczny"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Ukryj"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Głośnik"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Wycisz"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Dodaj połączenie"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Scal połączenia"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Przełącz"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Zarządzaj połączeniami"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Zarządzaj"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importuj"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importuj wszystko"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importowanie kontaktów z karty SIM"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importuj z Kontaktów"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Aparaty słuchowe"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Włącz funkcje zgodności z aparatem słuchowym"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY wyłączony"</item>
- <item msgid="3971695875449640648">"TTY pełny"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Tekst ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Sygnały DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Ustaw długość sygnałów DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normalne"</item>
- <item msgid="2883365539347850535">"Długie"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Komunikat sieciowy"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Aktywuj telefon"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Aby aktywować usługę telekomunikacyjną, należy wykonać połączenie specjalne. "\n\n"Po naciśnięciu przycisku „Aktywuj” posłuchaj dostępnych instrukcji, aby aktywować telefon."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Dotknij opcji „Aktywuj”, aby wykonać specjalne połączenie aktywujące telefon w sieci komórkowej operatora. To umożliwi wykonywanie połączeń i łączenie się z komórkowymi sieciami transmisji danych."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Pominąć aktywację?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Jeśli pominiesz aktywację, nie będzie można wykonywać połączeń ani łączyć się z komórkowymi sieciami transmisji danych (łączenie się z sieciami Wi-Fi będzie jednak możliwe). Do momentu dokonania aktywacji odpowiedni monit będzie wyświetlany po każdym włączeniu telefonu."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Pomiń"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Aktywuj"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Aktywuj"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Telefon został aktywowany."</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problem z aktywacją"</string>
- <string name="ota_listen" msgid="162923839877584937">"Postępuj zgodnie z instrukcjami głosowymi, aż usłyszysz informację, że aktywacja została ukończona."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Klawiatura"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Głośnik"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Czekaj, aż programowanie telefonu zostanie zakończone."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programowanie nie powiodło się"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Telefon został aktywowany. Uruchomienie usługi może potrwać do 15 minut."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Telefon nie został aktywowany. "\n"Być może należy przejść do miejsca, w którym sygnał sieci jest silniejszy (w pobliżu okna lub na zewnątrz budynku). "\n\n"Spróbuj ponownie lub zadzwoń do działu obsługi klienta, aby uzyskać więcej informacji."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"NADMIERNA LICZBA NIEPOWODZEŃ SPC"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Wstecz"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Spróbuj ponownie"</string>
- <string name="ota_next" msgid="3904945374358235910">"Dalej"</string>
- <string name="ota_back" msgid="2190038043403850052">"Wstecz"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Włączono tryb alarmowego połączenia zwrotnego"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Tryb alarmowego połączenia zwrotnego"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Połączenie transmisji danych jest wyłączone"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Brak połączenia transmisji danych przez <xliff:g id="COUNT">%s</xliff:g> min"</item>
- <item quantity="other" msgid="3122217344579273583">"Brak połączenia transmisji danych przez <xliff:g id="COUNT">%s</xliff:g> min"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Telefon będzie w trybie alarmowego połączenia zwrotnego przez <xliff:g id="COUNT">%s</xliff:g> min. W tym trybie nie można używać aplikacji korzystających z połączenia transmisji danych. Czy chcesz teraz zakończyć?"</item>
- <item quantity="other" msgid="3231879566243957821">"Telefon będzie w trybie alarmowego połączenia zwrotnego przez <xliff:g id="COUNT">%s</xliff:g> min. W tym trybie nie można używać aplikacji korzystających z połączenia transmisji danych. Czy chcesz teraz zakończyć?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"Wybrana akcja jest niedostępna w trybie alarmowego połączenia zwrotnego. Telefon będzie w tym trybie przez <xliff:g id="COUNT">%s</xliff:g> min. Czy chcesz teraz zakończyć?"</item>
- <item quantity="other" msgid="3489076611710869904">"Wybrana akcja jest niedostępna w trybie alarmowego połączenia zwrotnego. Telefon będzie w tym trybie przez <xliff:g id="COUNT">%s</xliff:g> min. Czy chcesz teraz zakończyć?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"Wybrana akcja jest niedostępna przy nawiązanym połączeniu alarmowym"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Kończenie trybu alarmowego połączenia zwrotnego"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Tak"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Nie"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Zamknij"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Ustawienia poczty głosowej"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;nie ustawiono&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Usługa poczty głosowej"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Ustawienia dla <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Inne ustawienia połączenia"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Wybierz numer"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Połączenie za pośrednictwem operatora ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Przeciągnij w prawo, aby odebrać"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Przeciągnij w lewo, aby wyciszyć dzwonek"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Przeciągnij w lewo, aby odrzucić"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Przeciągnij w prawo, aby odebrać"\n"i zawiesić aktywne połączenie"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Przeciągnij w prawo, aby odebrać"\n"i zakończyć aktywne połączenie"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Przeciągnij w prawo, aby odebrać"\n"i zakończyć zawieszone połączenie"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Odbierz"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Odrzuć"</string>
-</resources>
diff --git a/phone/res/values-pt-rPT/strings.xml b/phone/res/values-pt-rPT/strings.xml
deleted file mode 100644
index b872d48..0000000
--- a/phone/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Contactos"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoritos"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Marcador"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Marcador de emergência"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefone"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Registo de chamadas"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Lista de números de marcação fixa (FDN)"</string>
- <string name="unknown" msgid="6878797917991465859">"Desconhecido"</string>
- <string name="private_num" msgid="6713286113000232309">"Número particular"</string>
- <string name="payphone" msgid="1931775086311769314">"Telefone público"</string>
- <string name="onHold" msgid="9035493194749959955">"Em espera"</string>
- <string name="ongoing" msgid="8300874342848721367">"Chamada actual"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Linha ocupada"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Rede ocupada"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Sem sinal"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Limite de ACM excedido"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Rádio desactivado"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Sem cartão SIM ou erro do cartão"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Fora da área do serviço"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"As chamadas efectuadas são restringidas por FDN."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Não é possível efectuar chamadas com o barramento de chamadas activado."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Todas as chamadas são restringidas por controlo de acesso."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"As chamadas de emergência são restringidas por controlo de acesso."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"As chamadas normais são restringidas por controlo de acesso."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: telefone bloqueado até ao ciclo de energia."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: a chamada caiu."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: chamada interceptada."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: reordenar."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: Rejeitar Opção de Serviço."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: pedido de nova tentativa."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: falha no acesso."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: impedido."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Apenas podem ser efectuadas chamadas de Emergência"</string>
- <string name="confCall" msgid="1904840547188336828">"Chamada de conferência"</string>
- <string name="call_lost" msgid="317670617901479594">"A chamada perdeu-se."</string>
- <string name="retry" msgid="8462986804300767852">"Tentar novamente"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Chamada perdida"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"Código de MMI iniciado"</string>
- <string name="ussdRunning" msgid="485588686340541690">"A executar código USSD..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"Código de MMI cancelado"</string>
- <string name="cancel" msgid="5044513931633602634">"Cancelar"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Altifalante"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Desactivar som"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Suspender"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Terminar chamada"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Alternar entre chamadas"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Intercalar chamadas"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Adicionar chamada"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Gerir chamada de conferência"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Mostrar o teclado de marcação"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Ocultar teclado de marcação"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Suspender chamada actual "\n"&amp; atender"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Terminar a chamada actual"\n"&amp; atender"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Prima Menu para as opções de chamada."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Prima Menu para opções de chamada • Utilize o teclado para a marcação"</string>
- <string name="menu_answer" msgid="116686205042231098">"Resposta"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorar"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Enviar os seguintes tons?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"A enviar tons"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Enviar"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Sim"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Não"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Substituir o carácter universal por"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Número do correio de voz em falta"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Não existe um número de correio de voz armazenado no cartão SIM."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Adicionar número"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"A carregar..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Introduza o código PIN para desbloquear o cartão SIM."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM desbloqueado"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Novo código PIN do cartão SIM"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Introduza o novo código PIN do cartão SIM novamente para confirmar"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Os PINs do cartão SIM introduzidos não coincidem. Tente novamente."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Introduza o código PUK para desbloquear o cartão SIM"</string>
- <string name="badPuk" msgid="3213017898690275965">"Código PUK incorrecto!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Continuar"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"O cartão SIM foi desbloqueado. O telefone está a ser desbloqueado..."</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN para desbloqueio de rede do cartão SIM"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Desbloquear"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Ignorar"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"A pedir desbloqueio de rede..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"O pedido de desbloqueio de rede falhou."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Desbloqueio de rede bem sucedido."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Definições de chamadas GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Definições de chamada CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Nomes dos pontos de acesso"</string>
- <string name="settings_label" msgid="3876743539816984008">"Definições de rede"</string>
- <string name="voicemail" msgid="8693759337917898954">"Correio de voz"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"Correio de voz:"</string>
- <string name="networks" msgid="8873030692174541976">"Operadores de rede"</string>
- <string name="call_settings" msgid="6112441768261754562">"Definições de chamada"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Definições adicionais"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Definições adicionais de chamadas apenas GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Definições adicionais de chamadas CDMA"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Definições adicionais de chamadas apenas CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Definições do serviço de rede"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"ID do autor da chamada"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Ocultar o número em chamadas efectuadas"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Número apresentado em chamadas efectuadas"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Utilizar as predefinições do operador para apresentar o meu número nas chamadas efectuadas"</string>
- <string name="labelCW" msgid="6120513814915920200">"Chamada em espera"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Notificar-me de chamadas a receber durante uma chamada"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Notificar-me de chamadas a receber durante uma chamada"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Definições do reencaminhamento de chamadas"</string>
- <string name="labelCF" msgid="2574386948026924737">"Reencaminhamento de chamadas"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Reencaminhar sempre"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Utilizar sempre este número"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"A reencaminhar todas as chamadas"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"A reencaminhar todas as chamadas para \\\\{0\\\\}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"O número está indisponível"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Desactivado"</string>
- <string name="labelCFB" msgid="218938523102207587">"Reencaminhar quando ocupado"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Número no caso de estar ocupado"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"A redireccionar para \\\\{0\\\\}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Desactivado"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"O seu operador não suporta a desactivação do reencaminhamento de chamadas quando o telefone está ocupado."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Reencaminhar quando não atende"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Número no caso de não atender"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"A reencaminhar para \\\\{0\\\\}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Desactivado"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"O seu operador não suporta a desactivação do reencaminhamento de chamadas quando o telefone não atende."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Reencaminhar quando está inacessível"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Número no caso de estar inacessível"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"A reencaminhar para \\\\{0\\\\}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Desactivado"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"O seu operador não suporta a desactivação do reencaminhamento de chamadas quando o telefone não está acessível."</string>
- <string name="updating_title" msgid="6146755386174019046">"Definições de chamadas"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Erro nas definições de chamada"</string>
- <string name="reading_settings" msgid="1920291699287055284">"A ler as definições..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"A actualizar as definições..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"A reverter as definições…"</string>
- <string name="response_error" msgid="6674110501330139405">"Resposta inesperada da rede."</string>
- <string name="exception_error" msgid="7027667130619518211">"Erro do cartão SIM ou da rede."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Active o rádio antes de visualizar estas definições."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Activar"</string>
- <string name="disable" msgid="7274240979164762320">"Desactivar"</string>
- <string name="change_num" msgid="239476305819844391">"Actualizar"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Predefinição da rede"</item>
- <item msgid="7876195870037833661">"Ocultar número"</item>
- <item msgid="1108394741608734023">"Mostrar número"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Guardar o número do correio de voz"</string>
- <string name="vm_changed" msgid="380744030726254139">"O número do correio de voz foi alterado."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"A alteração do número de correio de voz falhou."\n"Contacte o seu operador se este problema persistir."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"A alteração do número de reencaminhamento falhou."\n"Contacte o seu operador se este problema persistir."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Falha ao obter e guardar as definições do número de encaminhamento actual."\n"Pretende mudar para o novo fornecedor mesmo assim?"</string>
- <string name="no_change" msgid="3186040086622435212">"Não foram efectuadas alterações."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Escolha o serviço de correio de voz"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"O meu operador"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Definições da rede móvel"</string>
- <string name="label_available" msgid="1181658289009300430">"Redes disponíveis"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"A pesquisar..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Nenhuma rede encontrada."</string>
- <string name="search_networks" msgid="1601136049300882441">"Procurar redes"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Erro ao procurar redes."</string>
- <string name="register_on_network" msgid="9055203954040805084">"A registar em <xliff:g id="NETWORK">%s</xliff:g>..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"O cartão SIM não permite uma ligação a esta rede."</string>
- <string name="connect_later" msgid="500090982903469816">"Não foi possível ligar a esta rede neste momento. Tente novamente mais tarde."</string>
- <string name="registration_done" msgid="495135664535876612">"Registado na rede."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Seleccione um operador de rede"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Procurar todas as redes disponíveis"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Seleccionar automaticamente"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Seleccionar rede preferida automaticamente"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Registo automático..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Modo de rede"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Alterar o modo de funcionamento em rede"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Modo de rede preferido"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Global"</item>
- <item msgid="3273348576277144124">"Apenas EvDo"</item>
- <item msgid="454610224530856274">"CDMA sem EvDo"</item>
- <item msgid="8928247118825616081">"CDMA / EvDo automático"</item>
- <item msgid="8595462903294812666">"GSM / WCDMA automático"</item>
- <item msgid="5189164180446264504">"Apenas WCDMA"</item>
- <item msgid="5714714953966979187">"Apenas GSM"</item>
- <item msgid="4775796025725908913">"GSM / WCDMA preferido"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Dados activados"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Activar acesso a dados através de rede móvel"</string>
- <string name="roaming" msgid="8871412572928323707">"Roaming de dados"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Ligar a serviços de dados em roaming"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Ligar a serviços de dados em roaming"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"A ligação de dados foi perdida porque saiu do alcance da sua rede e o roaming de dados estava desactivado."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Permitir roaming de dados? Os encargos de roaming podem ser significativos!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Opções GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Opções CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Utilização de dados"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Política de dados do operador"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Dados utilizados no período actual"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Período de utilização de dados"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Política de classificação de dados"</string>
- <string name="throttle_help" msgid="243651091785169900">"Saiba mais"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) do <xliff:g id="USED_2">%3$s</xliff:g> período máximo"\n"O período seguinte tem início dentro de <xliff:g id="USED_3">%4$d</xliff:g> dias (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) do <xliff:g id="USED_2">%3$s</xliff:g> período máximo"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"<xliff:g id="USED_0">%1$s</xliff:g> máximo excedido"\n"Velocidade de transmissão de dados reduzida para <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g>٪ do ciclo decorrido"\n"O período seguinte tem início dentro de <xliff:g id="USED_1">%2$d</xliff:g> dias (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Velocidade de transmissão de dados reduzida para <xliff:g id="USED">%1$d</xliff:g> Kb/s se o limite de utilização de dados for excedido"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Mais informações sobre a política de utilização de dados da rede móvel do seu operador."</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Transmissão Celular SMS"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Transmissão Celular SMS"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Transmissão Celular SMS"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Definições da Transmissão Celular SMS activada"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Transmissão Celular SMS desactivada"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Definições da Transmissão Celular SMS"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Difusão de Emergência"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Difusão de Emergência activada"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Difusão de Emergência desactivada"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Administrativo"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Modo Administrativo activado"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Modo administrativo desactivado"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Manutenção"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Manutenção activada"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Manutenção desactivada"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Notícias Gerais"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Notícias de Negócios e Finanças"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Notícias Desportivas"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Notícias de Entretenimento"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Local"</string>
- <string name="local_enable" msgid="6370463247609136359">"Notícias locais activadas"</string>
- <string name="local_disable" msgid="4405691986943795798">"Notícias locais desactivadas"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regional"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Notícias regionais activadas"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Notícias regionais desactivadas"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Nacional"</string>
- <string name="national_enable" msgid="1172443648912246952">"Notícias nacionais activadas"</string>
- <string name="national_disable" msgid="326018148178601166">"Notícias nacionais desactivadas"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Internacional"</string>
- <string name="international_enable" msgid="5855356769925044927">"Notícias internacionais activadas"</string>
- <string name="international_disable" msgid="2850648591041088931">"Notícias internacionais desactivadas"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Idioma"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Seleccionar o idioma das notícias"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Inglês"</item>
- <item msgid="1151988412809572526">"Francês"</item>
- <item msgid="577840534704312665">"Espanhol"</item>
- <item msgid="8385712091143148180">"Japonês"</item>
- <item msgid="1858401628368130638">"Coreano"</item>
- <item msgid="1933212028684529632">"Chinês"</item>
- <item msgid="1908428006803639064">"Hebraico"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Idiomas"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Informação Meteorológica Local"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Informação Meteorológica Local activada"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Informação meteorológica local desactivada"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Relatórios de Tráfego de Área"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Relatórios de Tráfego de Área activados"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Relatórios de Tráfego de Área desactivados"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Horários de Voos do Aeroporto Local"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Horários de Voos do Aeroporto Local activados"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Horários de Voos do Aeroporto Local desactivados"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restaurantes"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restaurantes activados"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restaurantes desactivados"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Alojamentos"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Alojamento activado"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Alojamento desactivado"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Lista de Retalho"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Lista de Retalho activada"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Lista de Retalho desactivada"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Anúncios"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Anúncios activados"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Anúncios desactivados"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Cotações de Acções"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Cotações de acções activadas"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Cotações de Acções desactivadas"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Oportunidades de Emprego"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Oportunidades de Emprego activadas"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Oportunidades de Emprego desactivadas"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Clínica, Saúde e Hospital"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Clínica, Saúde e Hospital activado"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Clínica, Saúde e Hospital desactivado"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Notícias de Tecnologia"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Notícias de Tecnologia activadas"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Notícias de Tecnologia desactivadas"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Categoria múltipla"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Categoria múltipla activada"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Modo de categorias múltiplas desactivado"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Preferências de Rede GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Ainda não implementado!"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Preferências de rede GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (modo automático)"</item>
- <item msgid="8912042051809329533">"Apenas WCDMA"</item>
- <item msgid="8776934131146642662">"Apenas GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (WCDMA preferido)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Usar apenas redes 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Economiza bateria"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Seleccionar sistema"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Alterar o modo de roaming cdma"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Seleccionar sistema"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Apenas casa"</item>
- <item msgid="1205664026446156265">"Automático"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Modo de Roaming CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Alterar o modo de roaming cdma"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"Modo de roaming CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Apenas Redes Domésticas"</item>
- <item msgid="8174642753290624634">"Redes Associadas"</item>
- <item msgid="2241951431403168661">"Qualquer Rede"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Preferência de Rede CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Ainda não implementado!"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Preferências de rede CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Apenas CDMA"</item>
- <item msgid="2683555124647197574">"Apenas EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"TESTE da Subscrição CDMA"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Alternar entre RUIM/SIM e NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"subscrição"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Números de marcação fixa (FDN)"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Lista de números de marcação fixa (FDN)"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Activação de FDN"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Os números de marcação fixa estão activados"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Os números de marcação fixa estão desactivados"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Activar FDN"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Desactivar FDN"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Alterar PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Desactivar FDN"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Activar FDN"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Gerir os números de marcação fixa"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Alterar o PIN de acesso aos números de marcação fixa"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Gerir a lista telefónica"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Privacidade de Voz"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Activar modo de privacidade optimizado"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Modo TTY"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Activar modo TTY"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Modo TTY"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Definir modo TTY"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Nova tentativa automática"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Activar modo de Nova tentativa Automática"</string>
- <string name="menu_add" msgid="1882023737425114762">"Adicionar contacto"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Editar contacto"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Eliminar contacto"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Introduza o PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Nome"</string>
- <string name="number" msgid="7905950798349903858">"Número"</string>
- <string name="save" msgid="4094274636321939086">"Guardar"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Adicionar números autorizados"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"A adicionar números autorizados..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Números autorizados adicionados."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Editar números autorizados"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"A actualizar números autorizados..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Números autorizados actualizados."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Eliminar números autorizados"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"A eliminar números autorizados..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Números autorizados eliminados."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"Números autorizados não actualizados: o PIN introduzido está incorrecto."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"Números autorizados não actualizados: o número não pode ultrapassar os 20 dígitos."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"A ler a partir do cartão SIM..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Sem contactos no cartão SIM."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Seleccione os contactos a importar"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Activar/desactivar o PIN do cartão SIM"</string>
- <string name="change_pin" msgid="9174186126330785343">"Alterar o PIN do cartão SIM"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"PIN do SIM:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"PIN antigo"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Novo PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Confirme o novo PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"O PIN antigo introduzido não está correcto. Tente novamente."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Os PINs introduzidos não coincidem. Tente novamente."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Introduza um PIN com 4 a 8 números."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Desactivar o PIN do SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Activar o PIN do cartão SIM"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Queira aguardar..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"PIN do cartão SIM activado"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"PIN do cartão SIM desactivado"</string>
- <string name="pin_failed" msgid="6597695909685242127">"O PIN introduzido não estava correcto"</string>
- <string name="pin_changed" msgid="9000716792724195093">"PIN do cartão SIM alterado com sucesso"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Palavra-passe incorrecta, o cartão SIM está bloqueado! É necessário o PUK2."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"PIN2 antigo"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Novo PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Confirme o novo PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"O PUK2 introduzido não está correcto. Tente novamente."</string>
- <string name="badPin2" msgid="515218795152422178">"O PIN2 antigo introduzido não está correcto. Tente novamente."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"O PIN2 introduzido não coincide. Tente novamente."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Introduza um PIN2 com 4 a 8 números."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Introduza um PUK2 com 8 números."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2 alterado com sucesso"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Introduza o código PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Palavra-passe incorrecta. Altere o PIN2 e tente novamente!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Palavra-passe incorrecta, o SIM está bloqueado! É necessário o PUK2."</string>
- <string name="doneButton" msgid="2859593360997984240">"Concluído"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Chamada de conferência <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Voltar à chamada"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Continuar sem o cartão SIM"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Cartão SIM não encontrado. Insira um cartão SIM no telefone."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Ignorar"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Desbloquear"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"A autenticar o PIN..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Número do correio de voz"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"A marcar"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Tentar novamente"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Chamada actual"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Chamada de conferência"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Chamada recebida"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Chamada Cdma em espera"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Chamada terminada"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Em espera"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"A desligar"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"A chamar"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chamada não atendida"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Chamadas não atendidas"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas não atendidas"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Chamada não atendida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Chamada actual (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Em espera"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Novo correio de voz"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Novo correio de voz (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Marcar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número do correio de voz desconhecido"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Nenhum serviço"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Rede seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) indisponível"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Para efectuar uma chamada, desactive primeiro o modo para Avião."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Sem registo na rede."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Rede móvel não disponível."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"A chamada não foi efectuada. Não foi introduzido um número válido."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Chamada não efectuada."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"A iniciar sequência de MMI..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"A iniciar a sequência do código da funcionalidade"</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Serviço não suportado"</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Não é possível alternar entre chamadas"</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Não foi possível separar a chamada."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Não é possível transferir a chamada."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Não é possível efectuar chamadas de conferência."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Não é possível rejeitar a chamada."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Não é possível efectuar chamada(s)."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Chamada de emergência"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"A ligar o rádio..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Fora da área do serviço, a tentar novamente..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"A chamada não foi efectuada, <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="5048645338094088229">"Chamada não efectuada. Marque um número de emergência!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilizar o teclado para marcar"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Teclado numérico por tons"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Teclado de marcação"</string>
- <string name="touchLockText" msgid="566824588267376287">"Toque duas vezes em "\n"para desbloquear"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Toque duas vezes"\n"para atender"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Toque duas vezes"\n"para recusar"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Suspender"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Retomar"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Terminar"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclado de marcação"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Ocultar"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Altifalante"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Desactivar som"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Adicionar chamada"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Intercalar chamadas"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Trocar"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gerir chamadas"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Gerir"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importar"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importar todos"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"A importar contactos do cartão SIM"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importar a partir dos contactos"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Aparelhos auxiliares de audição"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Activar compatibilidade com aparelho auxiliar de audição"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY desactivado"</item>
- <item msgid="3971695875449640648">"TTY total"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Texto ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Tons DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Definir o tamanho dos toques DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normal"</item>
- <item msgid="2883365539347850535">"Longo"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Mensagem de Rede"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Activar o seu telefone"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"É necessário efectuar uma chamada especial para activar o seu serviço telefónico. "\n\n"Depois de premir “Activar”, ouça as instruções fornecidas para activar o telefone."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Toque em \"Activar\" para fazer uma chamada especial que activa o seu telefone na rede móvel da sua operadora, para que possa fazer chamadas e estabelecer ligação a redes móveis de dados."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Ignorar activação?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Se ignorar a activação, não poderá fazer chamadas nem estabelecer ligação a redes móveis de dados (apesar de poder estabelecer ligação a redes Wi-Fi). Enquanto não activar o telefone, ser-lhe-á solicitada activação sempre que ligar o telefone."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Ignorar"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Activar"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Activar"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"O telefone está activado!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problema com a activação"</string>
- <string name="ota_listen" msgid="162923839877584937">"Siga as instruções de voz até ser informado de que a activação está concluída."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Teclado"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Altifalante"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Aguarde enquanto o seu telefone está a ser programado."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programação sem sucesso"</string>
- <string name="ota_successful" msgid="1880780692887077407">"O seu telefone já está activado. O início do serviço pode demorar até 15 minutos."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"O seu telefone não foi activado. "\n"Pode ser necessário procurar uma zona com melhor cobertura (junto a uma janela ou no exterior). "\n\n"Tente novamente ou ligue para o serviço de apoio ao cliente para obter mais opções."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"FALHAS NO EXCESS SPC"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Anterior"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Tente novamente"</string>
- <string name="ota_next" msgid="3904945374358235910">"Seguinte"</string>
- <string name="ota_back" msgid="2190038043403850052">"Anterior"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Entrou em Modo de Chamada de Retorno de Emergência"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Modo de Chamada de Retorno de Emergência"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Ligação de dados desactivada"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Sem ligação de dados durante <xliff:g id="COUNT">%s</xliff:g> minuto"</item>
- <item quantity="other" msgid="3122217344579273583">"Sem ligação de dados durante <xliff:g id="COUNT">%s</xliff:g> minutos"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"O telefone ficará no modo de chamada de retorno de emergência durante <xliff:g id="COUNT">%s</xliff:g> minuto. Enquanto estiver neste modo, não é possível utilizar aplicações que utilizem uma ligação de dados. Pretende sair agora?"</item>
- <item quantity="other" msgid="3231879566243957821">"O telefone ficará no modo de chamada de retorno de emergência durante <xliff:g id="COUNT">%s</xliff:g> minutos. Enquanto estiver neste modo, não é possível utilizar aplicações que utilizem uma ligação de dados. Pretende sair agora?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"A acção seleccionada não está disponível no modo de chamada de retorno de emergência. O telefone permanecerá neste modo durante <xliff:g id="COUNT">%s</xliff:g> minuto. Pretende sair agora?"</item>
- <item quantity="other" msgid="3489076611710869904">"A acção seleccionada não está disponível no modo de chamada de retorno de emergência. O telefone permanecerá neste modo durante <xliff:g id="COUNT">%s</xliff:g> minutos. Pretende sair agora?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"A acção seleccionada não está disponível durante uma chamada de emergência"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Sair do Modo de Chamada de Retorno de Emergência"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Sim"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Não"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Ignorar"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Definições de correio de voz"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;não definido&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Serviço de correio de voz"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Definições para <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Outras definições de chamada"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Marcar"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"A ligar através de ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Arraste para a direita para atender"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Arraste para a esquerda para silenciar a campainha"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Arraste para a esquerda para recusar"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Arraste para a direita para atender e"\n"colocar a chamada activa em espera"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Arraste para a direita para atender e"\n"terminar a chamada activa"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Arraste para a direita para atender e"\n"terminar a chamada em espera"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Atender"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Recusar"</string>
-</resources>
diff --git a/phone/res/values-pt/strings.xml b/phone/res/values-pt/strings.xml
deleted file mode 100644
index cc0bad0..0000000
--- a/phone/res/values-pt/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Contatos"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoritos"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Discador"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Discador de emergência"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefone"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Registro de chamadas"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Lista FDN"</string>
- <string name="unknown" msgid="6878797917991465859">"Desconhecido"</string>
- <string name="private_num" msgid="6713286113000232309">"Número privado"</string>
- <string name="payphone" msgid="1931775086311769314">"Orelhão"</string>
- <string name="onHold" msgid="9035493194749959955">"Em espera"</string>
- <string name="ongoing" msgid="8300874342848721367">"Chamada atual"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Linha ocupada"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Rede ocupada"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Sem sinal"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Limite de ACM excedido"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Rádio desativado"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Sem SIM, ou erro de SIM"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Área fora de serviço"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"As chamadas enviadas são restringidas pelo FDN."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Você não pode fazer chamadas enquanto o bloqueio de chamadas estiver ativado."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Todas as chamada são restringidas pelo controle de acesso."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"As chamadas de emergência são restringidas pelo controle de acesso."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"As chamadas normais são restringidas pelo controle de acesso."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: Telefone bloqueado até a conclusão do ciclo de energia."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: Caiu a chamada."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: Chamada interceptada."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: reordenar."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: Rejeição de opção de serviço."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: ordem de repetição."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: Falha de acesso."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: Ocupado."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Somente as chamadas de emergência são permitidas."</string>
- <string name="confCall" msgid="1904840547188336828">"Conferência telefônica"</string>
- <string name="call_lost" msgid="317670617901479594">"A chamada foi perdida."</string>
- <string name="retry" msgid="8462986804300767852">"Tentar novamente"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Chamada perdida"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"Código MMI iniciado"</string>
- <string name="ussdRunning" msgid="485588686340541690">"Código USSD em execução…"</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"Código MMI cancelado"</string>
- <string name="cancel" msgid="5044513931633602634">"Cancelar"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Alto-falante"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Desativar som"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Em espera"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Finalizar chamada"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Trocar chamadas"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Mesclar chamadas"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Adicionar chamada"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Gerenciar conferência telefônica"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Mostrar teclado"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Ocultar teclado"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Colocar chamada atual em espera"\n"e responder"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Encerrar chamada atual"\n"e responder"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Pressione Menu para opções de chamada."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Pressione Menu para as opções de chamada • Use o teclado para discar"</string>
- <string name="menu_answer" msgid="116686205042231098">"Atender"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorar"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Enviar os toques a seguir?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Enviando tons"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Enviar"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Sim"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Não"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Substitua o caractere curinga por"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Número correio de voz ausente"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Não há um número correio de voz armazenado no cartão SIM."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Adicionar número"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Carregando..."</string>
- <string name="enterPin" msgid="4753300834213388397">"Digite o código PIN para desbloquear o cartão SIM."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM desbloqueado"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Novo código PIN do SIM"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Digite novamente o novo código PIN do SIM para confirmar"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Os PINs do SIM digitados não correspondem. Tente novamente."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Digite o código PUK para desbloquear o cartão SIM."</string>
- <string name="badPuk" msgid="3213017898690275965">"Código PUK incorreto!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Continuar"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"O seu cartão SIM foi desbloqueado. O seu telefone está desbloqueando…"</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN de desbloqueio da rede SIM"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Desbloquear"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Dispensar"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Solicitando o desbloqueio de rede…"</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Falha na solicitação de desbloqueio de rede."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Desbloqueio de rede bem-sucedido."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Configurações de chamada GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Configurações de chamada CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Nomes ponto de acesso"</string>
- <string name="settings_label" msgid="3876743539816984008">"Configurações de rede"</string>
- <string name="voicemail" msgid="8693759337917898954">"Correio de voz"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
- <string name="networks" msgid="8873030692174541976">"Operadores de rede"</string>
- <string name="call_settings" msgid="6112441768261754562">"Configurações de chamadas"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Configurações adicionais"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Configurações adicionais somente de chamada GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Configurações de chamada CDMA adicionais"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Configurações adicionais somente de chamada CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Configurações do serviço de rede"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"ID da chamada"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Número oculto nas chamadas enviadas"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Número exibido nas chamadas enviadas"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Usar configurações padrão da operadora para exibir meu número em chamadas efetuadas"</string>
- <string name="labelCW" msgid="6120513814915920200">"Chamada em espera"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Durante uma chamada, me avise sobre chamadas recebidas"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Durante uma chamada, me avise sobre chamadas recebidas"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Configurações de encaminhamento de chamada"</string>
- <string name="labelCF" msgid="2574386948026924737">"Encaminhamento"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Sempre encaminhar"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Sempre usar este número"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Encaminhando todas as chamadas"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Encaminhando todas as chamadas para {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Número indisponível"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Desativado"</string>
- <string name="labelCFB" msgid="218938523102207587">"Enc. quando ocupado"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Número quando ocupado"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Encaminhado para {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Desativado"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"A sua operadora não suporta a desativação do encaminhamento de chamada quando o seu telefone estiver ocupado."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Enc. se não atendido"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Número quando não atendido"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Encaminhado para {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Desativado"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"A sua operadora não suporta a desativação do encaminhamento de chamada quando o seu telefone não responder."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Enc. quando não acessível"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Número quando não acessível"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Encaminhado para {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Desativado"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"A sua operadora não suporta a desativação do encaminhamento de chamada quando o seu telefone não estiver acessível."</string>
- <string name="updating_title" msgid="6146755386174019046">"Configurações de chamadas"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Erro de configuração da chamada"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Lendo as configurações…"</string>
- <string name="updating_settings" msgid="8171225533884883252">"Atualizando configurações…"</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Revertendo configurações…"</string>
- <string name="response_error" msgid="6674110501330139405">"Resposta inesperada da rede."</string>
- <string name="exception_error" msgid="7027667130619518211">"Erro de rede ou do cartão SIM."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Ative o rádio antes de ver essas configurações."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Ativar"</string>
- <string name="disable" msgid="7274240979164762320">"Desativar"</string>
- <string name="change_num" msgid="239476305819844391">"Atualizar"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Padrão de rede"</item>
- <item msgid="7876195870037833661">"Ocultar número"</item>
- <item msgid="1108394741608734023">"Mostrar número"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Salvar número correio de voz"</string>
- <string name="vm_changed" msgid="380744030726254139">"Número correio de voz alterado."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Falha na alteração do número correio de voz."\n"Entre em contato com a sua operadora se este problema continuar."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Falha na alteração do número de encaminhamento."\n"Entre em contato com a sua operadora se este problema continuar."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Falha ao recuperar e salvar as configurações atuais de números de encaminhamento."\n"Deseja mudar para a nova operadora mesmo assim?"</string>
- <string name="no_change" msgid="3186040086622435212">"Nenhuma alteração foi feita."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Escolha o serviço de correio de voz"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Minha operadora"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Configurações de rede para celular"</string>
- <string name="label_available" msgid="1181658289009300430">"Redes disponíveis"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Pesquisando..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Nenhuma rede encontrada."</string>
- <string name="search_networks" msgid="1601136049300882441">"Pesquisar redes"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Erro ao pesquisar redes."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Registrando na <xliff:g id="NETWORK">%s</xliff:g>…"</string>
- <string name="not_allowed" msgid="3540496123717833833">"O seu cartão SIM não permite uma conexão com esta rede."</string>
- <string name="connect_later" msgid="500090982903469816">"Não é possível conectar a esta rede no momento. Tente novamente mais tarde."</string>
- <string name="registration_done" msgid="495135664535876612">"Registrado na rede."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Selecione um operador de rede"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Pesquisar todas as redes disponíveis"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Selecionar automaticamente"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Selecionar automaticamente a rede preferida"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Registro automático..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Modo de rede"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Alterar o modo de operação de rede"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Modo de rede de preferência"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Global"</item>
- <item msgid="3273348576277144124">"Somente EvDo"</item>
- <item msgid="454610224530856274">"CDMA sem EvDo"</item>
- <item msgid="8928247118825616081">"CDMA/EvDo automático"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA automático"</item>
- <item msgid="5189164180446264504">"Somente WCDMA"</item>
- <item msgid="5714714953966979187">"Somente GSM"</item>
- <item msgid="4775796025725908913">"GSM/WCDMA de preferência"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Dados ativados"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Ativar acesso a dados pela rede móvel"</string>
- <string name="roaming" msgid="8871412572928323707">"Roaming de dados"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Conectar aos serviços de dados quando estiver em roaming"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Conectar aos serviços de dados quando estiver em roaming"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Você perdeu a conectividade de dados porque deixou o roaming de dados da sua rede doméstica desativado."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Permitir roaming de dados? Isso pode causar cobranças significativas de roaming!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Opções GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Opções CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Uso de dados"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Política de dados da operadora"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Uso de dados no período atual"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Período de uso de dados"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Política de taxa de dados"</string>
- <string name="throttle_help" msgid="243651091785169900">"Saiba mais"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) de <xliff:g id="USED_2">%3$s</xliff:g> do período máximo"\n"Próximo perído começa em <xliff:g id="USED_3">%4$d</xliff:g> dias (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) de <xliff:g id="USED_2">%3$s</xliff:g> do período máximo"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Máximo de <xliff:g id="USED_0">%1$s</xliff:g> excedido"\n"Taxa de dados reduzida para <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g>٪ do ciclo expirou"\n"O próximo período começa em <xliff:g id="USED_1">%2$d</xliff:g> dias (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Taxa de dados reduzida para <xliff:g id="USED">%1$d</xliff:g> Kb/s se o limite de uso de dados for excedido"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Mais informações sobre a política de uso de dados da rede móvel da sua operadora"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"SMS de difusão celular"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"SMS de difusão celular"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"SMS de difusão celular"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"SMS de difusão celular ativado"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"SMS de difusão celular desativado"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Configurações de SMS de difusão celular"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Difusão de emergência"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Difusão de emergência ativada"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Difusão de emergência desativada"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Administrativo"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Administrativo ativado"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Administrativo desativado"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Manutenção"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Manutenção ativada"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Manutenção desativada"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Notícias gerais"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Notícias de negócios e finanças"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Notícias de esporte"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Notícias de entretenimento"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Local"</string>
- <string name="local_enable" msgid="6370463247609136359">"Notícias locais ativadas"</string>
- <string name="local_disable" msgid="4405691986943795798">"Notícias locais desativadas"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regional"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Notícias regionais ativadas"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Notícias regionais desativadas"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Nacional"</string>
- <string name="national_enable" msgid="1172443648912246952">"Notícias nacionais ativadas"</string>
- <string name="national_disable" msgid="326018148178601166">"Notícias nacionais desativadas"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Internacional"</string>
- <string name="international_enable" msgid="5855356769925044927">"Notícias internacionais ativadas"</string>
- <string name="international_disable" msgid="2850648591041088931">"Notícias internacionais desativadas"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Idioma"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Selecione o idioma das notícias"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Inglês"</item>
- <item msgid="1151988412809572526">"Francês"</item>
- <item msgid="577840534704312665">"Espanhol"</item>
- <item msgid="8385712091143148180">"Japonês"</item>
- <item msgid="1858401628368130638">"Coreano"</item>
- <item msgid="1933212028684529632">"Chinês"</item>
- <item msgid="1908428006803639064">"Hebraico"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Idiomas"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Clima local"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Clima local ativado"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Clima local desativado"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Relatórios de trânsito da área"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Relatórios de trânsito da área ativados"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Relatórios de trânsito da área desativados"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Programação de voos do aeroporto local"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Programação de voos do aeroporto local ativada"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Programação de voos do aeroporto local desativada"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restaurantes"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restaurantes ativados"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restaurantes desativados"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Alojamentos"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Alojamentos ativados"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Alojamentos desativados"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Diretório de varejo"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Diretório de varejo ativado"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Diretório de varejo desativado"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Anúncios"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Anúncios ativados"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Anúncios desativados"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Cotação de ações"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Cotação de ações ativada"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Cotação de ações desativada"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Oportunidades de emprego"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Oportunidades de emprego ativadas"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Oportunidades de emprego desativadas"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Serviços médicos, de saúde e hospitalares"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Serviços médicos, de saúde e hospitalares ativados"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Serviços médicos, de saúde e hospitalares desativados"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Notícias de tecnologia"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Notícias de tecnologia ativadas"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Notícias de tecnologia desativadas"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Várias categorias"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Várias categorias ativadas"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Várias categorias desativadas"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Preferências de rede GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Ainda não implementado."</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Preferências de rede GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (modo automático)"</item>
- <item msgid="8912042051809329533">"Somente WCDMA"</item>
- <item msgid="8776934131146642662">"Somente GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (WCDMA de preferência)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Usar apenas redes 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Economiza bateria"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Seleção de sistema"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Alterar o modo de roaming CDMA"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Selecionar sistema"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Somente doméstica"</item>
- <item msgid="1205664026446156265">"Automático"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Modo de roaming CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Alterar o modo de roaming CDMA"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"Modo de roaming CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Somente redes domésticas"</item>
- <item msgid="8174642753290624634">"Redes afiliadas"</item>
- <item msgid="2241951431403168661">"Qualquer rede"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Preferências de rede CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Ainda não implementado."</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Preferências de rede CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Somente CDMA"</item>
- <item msgid="2683555124647197574">"Somente EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"Inscrição CDMA de TESTE"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Alterar entre RUIM/SIM e NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"inscrição"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Chamadas fixas"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Lista FDN"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Ativação do FDN"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Os números de chamadas fixas estão ativados"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Os números de chamadas fixas estão desativados"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Ativar FDN"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Desativar FDN"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Alterar PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Desativar FDN"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Ativar FDN"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Gerenciar números de chamadas fixas"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Alterar PIN para acesso FDN"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Gerenciar lista de números telefônicos"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Privacidade de voz"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Ativar modo de privacidade aprimorado"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Modo TTY"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Ativar modo TTY"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Modo TTY"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Definir modo TTY"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Repetir automaticamente"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Ativar modo Repetir automaticamente"</string>
- <string name="menu_add" msgid="1882023737425114762">"Adicionar contato"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Editar contato"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Excluir contato"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Inserir PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Nome"</string>
- <string name="number" msgid="7905950798349903858">"Número"</string>
- <string name="save" msgid="4094274636321939086">"Salvar"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Adicionar número de chamadas fixas"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Adicionando número de chamadas fixas…"</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Número de chamadas fixas adicionado."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Editar o número de chamadas fixas"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Atualizando o número de chamadas fixas…"</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Número de chamadas fixas atualizado."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Excluir número de chamadas fixas"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Excluindo número de chamadas fixas…"</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Número de chamadas fixas excluído."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN não atualizado: você digitou um PIN incorreto."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN não atualizado: o número não pode exceder 20 dígitos."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Lendo a partir do cartão SIM…"</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Não há contatos no seu cartão SIM."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Selecione os contatos a serem importados"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Ativar/desativar PIN do SIM"</string>
- <string name="change_pin" msgid="9174186126330785343">"Alterar PIN do SIM"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"PIN do SIM:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"PIN antigo"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Novo PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Confirmar novo PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"O PIN antigo digitado não está correto. Tente novamente."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Os PINs digitados não correspondem. Tente novamente."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Digite um PIN com 4 a 8 números."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Desativar PIN do SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Ativar PIN do SIM"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Aguarde..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"PIN do SIM ativado"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"PIN do SIM desativado"</string>
- <string name="pin_failed" msgid="6597695909685242127">"O PIN digitado estava incorreto"</string>
- <string name="pin_changed" msgid="9000716792724195093">"PIN do SIM alterado com êxito"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Senha incorreta. SIM bloqueado! PUK2 solicitado."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"PIN2 antigo"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Novo PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Confirmar novo PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"O PUK2 digitado não está correto. Tente novamente."</string>
- <string name="badPin2" msgid="515218795152422178">"O PIN2 antigo digitado não está correto. Tente novamente."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Os PIN2s digitados não correspondem. Tente novamente."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Digite um PIN2 com 4 a 8 números."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Digite um PUK2 com 8 números."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2 alterado com êxito"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Digitar o código PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Senha incorreta. Altere o PIN2 e tente novamente!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Senha incorreta. SIM bloqueado! PUK2 solicitado."</string>
- <string name="doneButton" msgid="2859593360997984240">"Concluído"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Conferência telefônica <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Voltar à chamada"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Continuar sem o cartão SIM"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Nenhum cartão SIM encontrado. Insira um cartão SIM no telefone."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Dispensar"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Desbloquear"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Autenticando o PIN…"</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Número correio de voz"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Discando"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Tentando novamente"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Chamada atual"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Conferência telefônica"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Recebendo chamada"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Aguardando chamada CDMA"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Chamada encerrada"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Em espera"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Desligando"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Em chamada"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chamada perdida"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Chamadas perdidas"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas perdidas"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Chamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Chamada atual (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Em espera"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Novo correio de voz"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Novo correio de voz (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Discar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número correio de voz desconhecido"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Sem serviço"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"A rede selecionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) não está disponível"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Para fazer uma chamada, primeiro desative o modo avião."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Não registrado na rede."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Rede móvel não disponível."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Chamada não completada, o número inserido é inválido."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Chamada não completada."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Iniciando sequência MMI…"</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Iniciando sequência do código de recursos..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Serviço não suportado."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Não é possível alternar chamadas."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Não é possível separar a chamada."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Não é possível transferir a chamada."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Não é possível realizar conferências telefônicas."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Não é possível rejeitar a chamada."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Não é possível liberar a(s) chamada(s)."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Chamada de emergência"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Ativando o rádio…"</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Área fora de serviço, tentando novamente..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Chamada não completada. <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="5048645338094088229">"Chamada não completada. Disque um número de emergência."</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Use o teclado para discar"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Teclado multifrequencial"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Teclado"</string>
- <string name="touchLockText" msgid="566824588267376287">"Toque duas vezes"\n"para desbloquear"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Toque duas vezes"\n"para responder"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Toque duas vezes"\n"para recusar"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Em espera"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Desativar modo de espera"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Finalizar"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclado"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Ocultar"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Alto-falante"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Desativar som"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Adicionar chamada"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Mesclar chamadas"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Trocar"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gerenciar chamadas"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Gerenciar"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importar"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importar tudo"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importando contatos do SIM"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importar dos contatos"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Aparelhos auditivos"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Ativar compatibilidade com aparelhos auditivos"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY desativado"</item>
- <item msgid="3971695875449640648">"TTY completo"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Texto ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Tons DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Definir duração dos tons DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normal"</item>
- <item msgid="2883365539347850535">"Longo"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Mensagem de rede"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Ativar o seu telefone"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Uma chamada especial precisa ser feita para ativar o serviço do seu telefone. "\n\n"Depois de pressionar “Ativar”, ouça as instruções fornecidas para ativar o seu telefone."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Toque em “Ativar” para fazer uma chamada especial que ativa o seu telefone na rede celular da sua operadora, para que você possa fazer chamadas e se conectar a redes móveis de dados."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Ignorar ativação?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Se você ignorar a ativação, não poderá fazer chamadas ou se conectar a redes móveis de dados (embora possa se conectar a redes Wi-Fi). Até que o seu telefone seja ativado, você receberá solicitações de ativação sempre que o ligar."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Ignorar"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Ativar"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Ativar"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"O telefone está ativado!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problema com a ativação"</string>
- <string name="ota_listen" msgid="162923839877584937">"Siga as instruções faladas até ouvir que a ativação está concluída."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Teclado"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Alto-falante"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Aguarde enquanto o seu telefone está sendo programado."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Falha de programação"</string>
- <string name="ota_successful" msgid="1880780692887077407">"O seu telefone está ativado. Pode demorar até 15 minutos para o serviço ser iniciado."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"O seu telefone não foi ativado. "\n"Talvez seja necessário encontrar uma área com uma cobertura melhor (próximo de uma janela ou no lado de fora). "\n\n"Tente novamente ou ligue para o serviço de atendimento ao cliente para obter mais opções."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"FALHAS EM EXCESSO DE SPC"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Voltar"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Tentar novamente"</string>
- <string name="ota_next" msgid="3904945374358235910">"Próxima"</string>
- <string name="ota_back" msgid="2190038043403850052">"Voltar"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Modo de retorno de chamada de emergência acessado"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Modo de retorno de chamada de emergência"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Conexão de dados desativada"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Nenhuma conexão de dados durante <xliff:g id="COUNT">%s</xliff:g> minuto"</item>
- <item quantity="other" msgid="3122217344579273583">"Nenhuma conexão de dados durante <xliff:g id="COUNT">%s</xliff:g> minutos"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"O telefone ficará no modo de retorno de chamada de emergência durante <xliff:g id="COUNT">%s</xliff:g> minuto. Enquanto estiver nesse modo, nenhum aplicativo que use uma conexão de dados poderá ser usado. Deseja sair?"</item>
- <item quantity="other" msgid="3231879566243957821">"O telefone ficará no modo de retorno de chamada de emergência durante <xliff:g id="COUNT">%s</xliff:g> minutos. Enquanto estiver nesse modo, nenhum aplicativo que use uma conexão de dados poderá ser usado. Deseja sair?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"A ação selecionada não está disponível no modo de retorno de chamada de emergência. O telefone ficará nesse modo durante <xliff:g id="COUNT">%s</xliff:g> minuto. Deseja sair?"</item>
- <item quantity="other" msgid="3489076611710869904">"A ação selecionada não está disponível no modo de retorno de chamada de emergência. O telefone ficará nesse modo durante <xliff:g id="COUNT">%s</xliff:g> minutos. Deseja sair?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"A ação selecionada não está disponível durante uma chamada de emergência"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Saindo do modo de retorno de chamada de emergência"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Sim"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Não"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Descartar"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Conf. do correio de voz"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;não definido&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Serviço de correio de voz"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Configurações para <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Outras configurações de chamada"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Discar"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Chamando por meio de ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Arraste para a direita para atender"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Arraste para a esquerda para silenciar a campainha"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Arraste para a esquerda para recusar"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Arraste para a direita para atender e"\n"colocar a chamada ativa em espera"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Arraste para a direita para atender e"\n"finalizar a chamada ativa"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Arraste para a direita para atender e"\n"encerrar a chamada em espera"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Atender"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Recusar"</string>
-</resources>
diff --git a/phone/res/values-ru/strings.xml b/phone/res/values-ru/strings.xml
deleted file mode 100644
index 018ab5a..0000000
--- a/phone/res/values-ru/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Контакты"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Избранное"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Телефон"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Номера экстренных вызовов"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Телефон"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Список вызовов"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"Разрешенные номера"</string>
- <string name="unknown" msgid="6878797917991465859">"Неизвестный абонент"</string>
- <string name="private_num" msgid="6713286113000232309">"Скрытый номер"</string>
- <string name="payphone" msgid="1931775086311769314">"Телефон-автомат"</string>
- <string name="onHold" msgid="9035493194749959955">"Ждет ответа"</string>
- <string name="ongoing" msgid="8300874342848721367">"Активный вызов"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Линия занята"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Сеть занята"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Нет сигнала"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"Превышен лимит ACM"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Радио выключено"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"SIM-карта не установлена или ошибка SIM-карты"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Вне зоны действия сети"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Вы можете позвонить только на телефоны из списка разрешенных номеров."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Если включена функция запрета вызовов, невозможно осуществлять исходящие вызовы."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Все вызовы запрещены настройками доступа."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Экстренные вызовы запрещены настройками доступа."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Обычные вызовы запрещены настройками доступа."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: телефон заблокирован до следующего включения."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: вызов сброшен."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: вызов перехвачен."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: возобновить."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: не принят параметр службы."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: порядок дозвона."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: ошибка доступа."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: зарезервировано."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Возможны только экстренные вызовы"</string>
- <string name="confCall" msgid="1904840547188336828">"Конференц-вызов"</string>
- <string name="call_lost" msgid="317670617901479594">"Вызов был утрачен."</string>
- <string name="retry" msgid="8462986804300767852">"Повторить попытку"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Вызов утрачен"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"Код MMI запущен"</string>
- <string name="ussdRunning" msgid="485588686340541690">"Выполняется запрос USSD…"</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"Код MMI отменен"</string>
- <string name="cancel" msgid="5044513931633602634">"Отмена"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Динамик"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Микрофон выкл."</string>
- <string name="menu_hold" msgid="6970441130344786273">"Удержание"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Завершить вызов"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Другой вызов"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Объединить вызовы"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Добавить вызов"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Управление конференц-связью"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Показать кнопки"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Скрыть кнопки"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Поставить текущий вызов на удержание"\n"и ответить"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Завершить текущий вызов "\n"и ответить"</string>
- <string name="ok" msgid="3811371167865772377">"ОК"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Нажмите кнопку \"Меню\", чтобы просмотреть варианты действий."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Нажмите кнопку \"Меню\", чтобы увидеть варианты действий. • Используйте клавиатуру для набора номера"</string>
- <string name="menu_answer" msgid="116686205042231098">"Ответить"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Игнорировать"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Отправить следующие тоны?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Отправка тональных сигналов"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Позвонить"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Да"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Нет"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Заменить универсальный символ на"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Не указан номер голосовой почты"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"На SIM-карте нет ни одного номера голосовой почты."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Добавить номер"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Идет загрузка…"</string>
- <string name="enterPin" msgid="4753300834213388397">"Чтобы разблокировать SIM-карту, введите PIN."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM-карта разблокирована"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Новый PIN SIM-карты"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Для подтверждения введите новый PIN SIM-карты"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Введенные коды PIN SIM-карты не совпадают. Повторите попытку."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Введите код PUK, чтобы разблокировать SIM-карту"</string>
- <string name="badPuk" msgid="3213017898690275965">"Неверный код PUK"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Продолжить"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"SIM-карта разблокирована. Осуществляется разблокировка телефона..."</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN для разблокировки сети SIM-карты"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Разблокировать"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Закрыть"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Запрос разблокировки сети..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Запрос на разблокировку сети не выполнен."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Разблокировка сети успешно завершена."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Настройки вызовов GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Настройки вызовов CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Точки доступа (APN)"</string>
- <string name="settings_label" msgid="3876743539816984008">"Настройки сети"</string>
- <string name="voicemail" msgid="8693759337917898954">"Голосовая почта"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"ГП:"</string>
- <string name="networks" msgid="8873030692174541976">"Операторы связи"</string>
- <string name="call_settings" msgid="6112441768261754562">"Вызовы"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Дополнительные настройки"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Дополнительные настройки только для вызовов GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Дополнительные настройки вызовов CDMA"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Дополнительные настройки только для вызовов CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Настройки сетевой службы"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"АОН"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Скрывать номер при исходящих вызовах"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Номер, отображающийся при исходящих вызовах"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"При исходящих вызовах использовать для отображения моего номера настройки, предоставляемые оператором по умолчанию"</string>
- <string name="labelCW" msgid="6120513814915920200">"Параллельный вызов"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Извещать меня о входящих вызовах во время разговора"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Извещать меня о входящих вызовах во время разговора"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Настройки переадресации вызова"</string>
- <string name="labelCF" msgid="2574386948026924737">"Переадресация вызова"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Всегда"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Всегда использовать этот номер"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Переадресация всех вызовов"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Переадресация всех вызовов на номер \\\\{0\\\\}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Номер не указан"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Отключено"</string>
- <string name="labelCFB" msgid="218938523102207587">"Если аб. занят"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Номер, использующийся, когда линия занята"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Переадресация на номер \\\\{0\\\\}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Отключено"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Ваш оператор не поддерживает отключение переадресации звонков, если телефон занят."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Если аб. не отвечает"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Номер для переадресации при отсутствии ответа"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Переадресация на номер \\\\{0\\\\}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Отключено"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Ваш оператор не поддерживает отключение переадресации звонков, если нет ответа."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Если аб. недоступен"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Номер для переадресации, если абонент недоступен"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Переадресация на номер \\\\{0\\\\}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Отключено"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Ваш оператор не поддерживает отключение переадресации звонков, если телефон находится вне зоны доступа."</string>
- <string name="updating_title" msgid="6146755386174019046">"Настройки вызовов"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Ошибка настройки вызовов"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Чтение настроек…"</string>
- <string name="updating_settings" msgid="8171225533884883252">"Обновление настроек…"</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Возврат к предыдущим настройкам…"</string>
- <string name="response_error" msgid="6674110501330139405">"Неожиданный отклик сети."</string>
- <string name="exception_error" msgid="7027667130619518211">"Ошибка сети или SIM-карты."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Чтобы увидеть эти настройки, нужно включить радио."</string>
- <string name="close_dialog" msgid="2365884406356986917">"ОК"</string>
- <string name="enable" msgid="1059008390636773574">"Включить"</string>
- <string name="disable" msgid="7274240979164762320">"Отключить"</string>
- <string name="change_num" msgid="239476305819844391">"Обновить"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Настройки сети по умолчанию"</item>
- <item msgid="7876195870037833661">"Скрыть номер"</item>
- <item msgid="1108394741608734023">"Показывать номер"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Сохранить номер голосовой почты"</string>
- <string name="vm_changed" msgid="380744030726254139">"Номер голосовой почты изменен."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Не удалось изменить номер голосовой почты."\n"Если проблема не будет решена, свяжитесь со своим оператором."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Не удалось изменить номер переадресации вызовов."\n"Если проблема не будет решена, свяжитесь со своим оператором."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Не удалось извлечь и сохранить текущие настройки переадресации."\n"Все равно сменить провайдера?"</string>
- <string name="no_change" msgid="3186040086622435212">"Номер не изменен."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Выберите службу голосовой почты"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Мой оператор"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Настройки сотовой сети"</string>
- <string name="label_available" msgid="1181658289009300430">"Доступные сети"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Поиск…"</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Сети не найдены."</string>
- <string name="search_networks" msgid="1601136049300882441">"Поиск сетей"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Ошибка поиска сетей."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Регистрация в сети <xliff:g id="NETWORK">%s</xliff:g>…"</string>
- <string name="not_allowed" msgid="3540496123717833833">"Установленная SIM-карта не может подключиться к этой сети."</string>
- <string name="connect_later" msgid="500090982903469816">"Не удается подключиться к этой сети. Повторите попытку позже."</string>
- <string name="registration_done" msgid="495135664535876612">"Регистрация в сети завершена."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Выберите оператора связи"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Поиск всех доступных сетей"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Выбирать автоматически"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Автоматически выбирать предпочтительную сеть"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Автоматическая регистрация..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Режим сети"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Изменить режим работы сети"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Режим предпочтительной сети"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"По всему миру"</item>
- <item msgid="3273348576277144124">"Только EvDo"</item>
- <item msgid="454610224530856274">"CDMA без EvDo"</item>
- <item msgid="8928247118825616081">"CDMA / EvDo (автоматический режим)"</item>
- <item msgid="8595462903294812666">"GSM / WCDMA (автоматический режим)"</item>
- <item msgid="5189164180446264504">"Только WCDMA"</item>
- <item msgid="5714714953966979187">"Только GSM"</item>
- <item msgid="4775796025725908913">"GSM / WCDMA (предпочтительная сеть)"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Передача данных"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Разрешить передачу данных по сети мобильной связи"</string>
- <string name="roaming" msgid="8871412572928323707">"Интернет-роуминг"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Подключаться к службам передачи данных в роуминге"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Подключаться к службам передачи данных в роуминге"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Передача данных прекращена, потому что телефон находится за пределами домашней сети, а интернет-роуминг выключен."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Разрешить интернет-роуминг? Возможны высокие расходы за использование роуминга."</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Параметры GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"Параметры CDMA"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Передача данных"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Политика передачи данных оператора связи"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Передача данных в текущем периоде"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Время передачи данных"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Скорость передачи данных"</string>
- <string name="throttle_help" msgid="243651091785169900">"Подробнее"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) из <xliff:g id="USED_2">%3$s</xliff:g> (максимум)"\n"Следующий период начнется в течение <xliff:g id="USED_3">%4$d</xliff:g> дн. (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪) из <xliff:g id="USED_2">%3$s</xliff:g> (максимум)"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Превышен лимит в <xliff:g id="USED_0">%1$s</xliff:g>."\n"Скорость передачи данных снижена до <xliff:g id="USED_1">%2$d</xliff:g> кбит/с."</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"Пройдено <xliff:g id="USED_0">%1$d</xliff:g>% цикла."\n"Следующий период начнется в течение <xliff:g id="USED_1">%2$d</xliff:g> дн. (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Превышение лимита снижает скорость передачи данных до <xliff:g id="USED">%1$d</xliff:g> кбит/с"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Подробнее о политике передачи данных вашего оператора мобильной связи..."</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Широковещательные SMS-службы"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Широковещательные SMS-службы"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Широковещательные SMS-службы"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Широковещательные SMS-службы включены"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Широковещательные SMS-службы отключены"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Настройки широковещательных SMS-служб"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Оповещения о чрезвычайных ситуациях"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Оповещения о чрезвычайных ситуациях включены"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Оповещения о чрезвычайных ситуациях отключены"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Административные функции"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Административные функции включены"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Административные функции отключены"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Поддержка"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Поддержка включена"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Поддержка отключена"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Основные новости"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Финансовые и деловые новости"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Новости спорта"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Калейдоскоп"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Местные"</string>
- <string name="local_enable" msgid="6370463247609136359">"Местные новости включены"</string>
- <string name="local_disable" msgid="4405691986943795798">"Местные новости отключены"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Региональные"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Региональные новости включены"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Региональные новости отключены"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Национальные"</string>
- <string name="national_enable" msgid="1172443648912246952">"Национальные новости включены"</string>
- <string name="national_disable" msgid="326018148178601166">"Национальные новости отключены"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Международные"</string>
- <string name="international_enable" msgid="5855356769925044927">"Международные новости включены"</string>
- <string name="international_disable" msgid="2850648591041088931">"Международные новости отключены"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Язык"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Выбрать язык для новостей"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Английский"</item>
- <item msgid="1151988412809572526">"Французский"</item>
- <item msgid="577840534704312665">"Испанский"</item>
- <item msgid="8385712091143148180">"Японский"</item>
- <item msgid="1858401628368130638">"Корейский"</item>
- <item msgid="1933212028684529632">"Китайский"</item>
- <item msgid="1908428006803639064">"Иврит"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Языки"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Местный прогноз погоды"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Местный прогноз погоды включен"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Местный прогноз погоды отключен"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Информация о пробках"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Информация о пробках включена"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Информация о пробках отключена"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Расписание рейсов местного аэропорта"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Расписание рейсов местного аэропорта включено"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Расписание рейсов местного аэропорта отключено"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Рестораны"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Рестораны включены"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Рестораны отключены"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Аренда жилья"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Аренда жилья включена"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Аренда жилья отключена"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Торговый каталог"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Торговый каталог включен"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Торговый каталог отключен"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Реклама"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Реклама включена"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Реклама отключена"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Котировки ценных бумаг"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Котировки ценных бумаг включены"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Котировки ценных бумаг отключены"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Вакансии"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Вакансии включены"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Вакансии отключены"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Медицинские учреждения и больницы"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Медицинские учреждения и больницы включены"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Медицинские учреждения и больницы отключены"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Новости технологий"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Новости технологий включены"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Новости технологий отключены"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Подборка из нескольких категорий"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Подборка из нескольких категорий включена"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Подборка из нескольких категорий отключена"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Параметры сети GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Еще не реализовано!"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Настройки сети GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (автоматический режим)"</item>
- <item msgid="8912042051809329533">"Только WCDMA"</item>
- <item msgid="8776934131146642662">"Только GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (предпочтительно WCDMA)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Только сети 2G"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Экономия заряда аккумулятора"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Выбор системы"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Изменить режим роуминга CDMA"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Выбор системы"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Только домашняя"</item>
- <item msgid="1205664026446156265">"Автоматически"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"Режим роуминга CDMA"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Изменить режим роуминга CDMA"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"Режим роуминга CDMA"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Только домашние сети"</item>
- <item msgid="8174642753290624634">"Аффилированные сети"</item>
- <item msgid="2241951431403168661">"Любая сеть"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Параметры сети CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Еще не реализовано!"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Настройки сети CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Только CDMA"</item>
- <item msgid="2683555124647197574">"Только EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"ТЕСТОВАЯ подписка CDMA"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Переключение между RUIM/SIM и NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"подписка"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Разрешенные номера"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"Разрешенные номера"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"Активация разреш. номеров"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Разрешенные номера включены"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Разрешенные номера отключены"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Вкл. разреш. номера"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Откл. разреш. номера"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Изменить PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Откл. разреш. номера"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Вкл. разреш. номера"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Управление списком разрешенных номеров"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Изменить PIN для доступа к списку разрешенных номеров"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Управление списком разрешенных номеров"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Конфиденциальность разговоров"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Включить усиленный режим конфиденциальности"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"Режим телетайпа"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Включить режим телетайпа"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"Режим телетайпа"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Установить режим телетайпа"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Автодозвон"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Включить режим автодозвона"</string>
- <string name="menu_add" msgid="1882023737425114762">"Добавить контакт"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Изменить контакт"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Удалить контакт"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Введите PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Имя"</string>
- <string name="number" msgid="7905950798349903858">"Номер"</string>
- <string name="save" msgid="4094274636321939086">"Сохранить"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Добавить номер ограниченного набора"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Выполняется добавление номера ограниченного набора..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Номер ограниченного набора добавлен."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Изменить номер ограниченного набора"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Выполняется обновление номера ограниченного набора..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Номер ограниченного набора обновлен."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Удалить номер ограниченного набора"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Выполняется удаление номера ограниченного набора…"</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Номер ограниченного набора удален."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"Номер ограниченного набора не обновлен: вы ввели неверный PIN-код."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"Номер ограниченного набора не обновлен: он не должен содержать больше 20 цифр."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Считывание с SIM-карты…"</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"На SIM-карте нет контактов."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Выберите контакты для импорта"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Включить/отключить запрос PIN SIM-карты"</string>
- <string name="change_pin" msgid="9174186126330785343">"Изменить PIN SIM-карты"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"PIN SIM-карты:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Прежний PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Новый PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Подтвердите новый PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"Введен неверный прежний PIN. Повторите попытку."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Введенные коды PIN не совпадают. Повторите попытку."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Введите PIN, содержащий от 4 до 8 цифр."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Отключить запрос PIN SIM-карты"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Включить запрос PIN SIM-карты"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Подождите..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"Запрос PIN SIM-карты включен"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"Запрос PIN SIM-карты отключен"</string>
- <string name="pin_failed" msgid="6597695909685242127">"Введен неверный PIN"</string>
- <string name="pin_changed" msgid="9000716792724195093">"PIN SIM-карты успешно изменен"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Неверный пароль, SIM-карта заблокирована! Введите код PUK2."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Прежний PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Новый PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Подтвердите новый PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"Введен неверный код PUK2. Повторите попытку."</string>
- <string name="badPin2" msgid="515218795152422178">"Введен неверный прежний код PIN2. Повторите попытку."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Введенные коды PIN2 не совпадают. Повторите попытку."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Введите PIN2, содержащий от 4 до 8 цифр."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Введите 8-значный код PUK2."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2 успешно изменен"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Введите код PUK2"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Неверный пароль. Измените код PIN2 и повторите попытку."</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Неверный пароль, SIM-карта заблокирована! Введите код PUK2."</string>
- <string name="doneButton" msgid="2859593360997984240">"Готово"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Конференц-вызов: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Вернуться к вызову"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Продолжить без SIM-карты"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"SIM-карта отсутствует. Установите SIM-карту в телефон."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Закрыть"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Разблокировать"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Проверка PIN…"</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Номер голосовой почты"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Набор номера"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Повторная попытка"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Активный вызов"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Конференц-вызов"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Входящий вызов"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Ожидание вызова CDMA"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Вызов завершен"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Ждет ответа"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Завершение разговора"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Поступающий вызов"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Пропущенный вызов"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Пропущенные вызовы"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"Пропущенных вызовов: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Пропущенные вызовы от абонента <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Активный вызов (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"На удержании"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Новое сообщение голосовой почты"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Новое сообщение голосовой почты (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Набор <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Номер голосовой почты неизвестен"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Сеть не найдена"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Выбранная сеть (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) недоступна."</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Перед тем как звонить, отключите режим полета."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Нет регистрации в сети."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Мобильная сеть недоступна."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Вызов не осуществляется, действительный номер телефона не указан."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Вызов не осуществляется."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Запуск последовательности MMI..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Запуск последовательности кодов функций..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Услуга не поддерживается."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Не удается переключить вызовы."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Не удалось разделить вызов."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Не удалось перевести вызов."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Не удается создать конференц-вызов."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Невозможно отклонить вызов."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Не удается разъединить абонентов."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Экстренный вызов"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Включение радио…"</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Вне зоны действия сети, повторное подключение..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Вызов не осуществляется, <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не является номером экстренного вызова!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Вызов не осуществлен, наберите номер экстренного вызова!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Используйте клавиатуру для набора номера"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Тональная клавиатура"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Кнопки"</string>
- <string name="touchLockText" msgid="566824588267376287">"Нажмите дважды"\n"для разблокировки"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Нажмите дважды,"\n"чтобы ответить."</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Нажмите дважды,"\n"чтобы отклонить."</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Удерживать"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Снять удержание"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Завершить"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Кнопки"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Скрыть"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Динамик"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Откл. звук"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Добавить вызов"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Объединить вызовы"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Перевод звонка"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Управление вызовами"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Управлять"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Импортировать"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Импортировать все"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Импорт контактов с SIM-карты"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Импортировать из контактов"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Слуховые аппараты"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Включить слуховой аппарат"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"Телетайп выключен"</item>
- <item msgid="3971695875449640648">"Полнофункциональный телетайп"</item>
- <item msgid="1937509904407445684">"Телетайп с возможностью слышать собеседника"</item>
- <item msgid="5644925873488772224">"Телетайп с возможностью передачи голоса"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"Текст ERI"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"Тональные сигналы DTMF"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Настроить длительность тональных сигналов DTMF"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Обычные"</item>
- <item msgid="2883365539347850535">"Длинные"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Сообщение сети"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Активировать телефон"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Необходим специальный звонок для активации службы телефона. "\n\n"После нажатия кнопки \"Активировать\" прослушайте инструкции по активации телефона."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Нажмите “Активировать”, чтобы позвонить на специальный номер для активации телефона в сети оператора мобильной связи. После этого вы сможете совершать вызовы и подключаться к мобильным сетям передачи данных."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Пропустить активацию?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Если вы пропустите активацию, вы не сможете совершать вызовы и подключаться к мобильным сетям передачи данных (хотя вы сможете подключаться к сетям Wi-Fi). Пока вы не активируете свой телефон, запрос активации будет отображаться при каждом его включении."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Пропустить"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Активировать"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Активировать"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Телефон активирован!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Неполадки при активации"</string>
- <string name="ota_listen" msgid="162923839877584937">"Следуйте голосовым инструкциям, пока вам не сообщат, что активация завершена."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Клавиатура"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Динамик"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Дождитесь завершения программирования телефона."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Сбой при программировании"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Ваш телефон активирован. Включение службы может занять до 15 минут."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Телефон не был активирован. "\n"Возможно, вам следует найти зону с более высоким уровнем сигнала (у окна или на улице). "\n\n"Повторите попытку или свяжитесь со службой поддержки."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"ПРЕВЫШЕНИЕ ЧИСЛА ОШИБОК SPC"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Назад"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Повторите попытку"</string>
- <string name="ota_next" msgid="3904945374358235910">"Далее"</string>
- <string name="ota_back" msgid="2190038043403850052">"Назад"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"ДиалогВыходаРАЭВ"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Телефон переведен в режим экстренных обратных вызовов"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Режим экстренных обратных вызовов"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Передача данных отключена"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Подключение для передачи данных отсутствует <xliff:g id="COUNT">%s</xliff:g> мин."</item>
- <item quantity="other" msgid="3122217344579273583">"Подключение для передачи данных отсутствует <xliff:g id="COUNT">%s</xliff:g> мин."</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Телефон перейдет в режим экстренных обратных вызовов на <xliff:g id="COUNT">%s</xliff:g> мин. В этом режиме невозможно использовать приложения, задействующие передачу данных. Выйти из режима?"</item>
- <item quantity="other" msgid="3231879566243957821">"Телефон перейдет в режим экстренных обратных вызовов на <xliff:g id="COUNT">%s</xliff:g> мин. В этом режиме невозможно использовать приложения, задействующие передачу данных. Выйти из режима?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"Выбранное действие недоступно в режиме экстренных обратных вызовов. Телефон будет оставаться в этом режиме еще <xliff:g id="COUNT">%s</xliff:g> мин. Выйти из режима?"</item>
- <item quantity="other" msgid="3489076611710869904">"Выбранное действие недоступно в режиме экстренных обратных вызовов. Телефон будет оставаться в этом режиме еще <xliff:g id="COUNT">%s</xliff:g> мин. Выйти из режима?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"Выбранное действие невозможно в режиме экстренной связи"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Выход из режима экстренных обратных вызовов"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Да"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Нет"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Закрыть"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Настройки голосовой почты"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;не задано&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Служба голосовой почты"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Настройки (<xliff:g id="PROVIDER_NAME">%s</xliff:g>)"</string>
- <string name="other_settings" msgid="3672912580359716394">"Другие настройки вызовов"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Набор номера"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Звонок через ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Перетащите вкладку вправо, чтобы ответить"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Перетащите вкладку влево, чтобы отключить звонок"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Перетащите вкладку влево, чтобы отклонить вызов"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Перетащите вкладку вправо, чтобы ответить,"\n"удерживая активный вызов"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Перетащите вкладку вправо, чтобы ответить,"\n"завершив активный вызов"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Перетащите вкладку вправо, чтобы ответить,"\n"завершив удерживаемый вызов"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Ответить"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Отклонить"</string>
-</resources>
diff --git a/phone/res/values-sv/strings.xml b/phone/res/values-sv/strings.xml
deleted file mode 100644
index eaaae77..0000000
--- a/phone/res/values-sv/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Kontakter"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Favoriter"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Samtal"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Nödsamtal"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Logg"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"FDN-lista"</string>
- <string name="unknown" msgid="6878797917991465859">"Okänd"</string>
- <string name="private_num" msgid="6713286113000232309">"Privat nummer"</string>
- <string name="payphone" msgid="1931775086311769314">"Telefonautomat"</string>
- <string name="onHold" msgid="9035493194749959955">"Parkerat"</string>
- <string name="ongoing" msgid="8300874342848721367">"Pågående samtal"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Linjen är upptagen"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Nätverket är upptaget"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Ingen signal"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"ACM-gränsen har överskridits"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Radio av"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"Inget SIM-kort eller SIM-kortsfel"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Fungerar inte i detta område"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Utgående samtal begränsas av FDN."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Du kan inte ringa utgående samtal när samtalsspärren är aktiverad."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Alla samtal begränsas av åtkomstkontroll."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Nödsamtal begränsas av åtkomstkontroll."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Vanliga samtal begränsas av åtkomstkontroll."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: Telefonen är låst till kall omstart."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: Samtalet gick förlorat."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: Samtalet hänvisades."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: Beställ igen."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: Tillval av tjänst avvisat."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: Beställ igen."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: Åtkomstfel."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: Flyttat."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Det går bara att ringa nödsamtal."</string>
- <string name="confCall" msgid="1904840547188336828">"Konferenssamtal"</string>
- <string name="call_lost" msgid="317670617901479594">"Samtal har försvunnit."</string>
- <string name="retry" msgid="8462986804300767852">"Försök igen"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Samtalet försvann"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMI-kod körs"</string>
- <string name="ussdRunning" msgid="485588686340541690">"USSD-kod körs…"</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMI-koden har annullerats"</string>
- <string name="cancel" msgid="5044513931633602634">"Avbryt"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Högtalare"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Ljud av"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Parkera"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Avsl. samt."</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Byt samtal"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Koppla ihop samtal"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Lägg till"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Hantera konferenssamtal"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Visa knappsats"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Dölj knappsatsen"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Parkera pågående samtal "\n" och svara"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Avsluta pågående samtal"\n" och svara"</string>
- <string name="ok" msgid="3811371167865772377">"OK"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Tryck på Menu om du vill visa samtalsalternativ."</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Tryck på Menu om du vill visa samtalsalternativ • Använd tangentbordet om du vill ringa"</string>
- <string name="menu_answer" msgid="116686205042231098">"Svar"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Ignorera"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Skicka följande toner?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Skickar signaler"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Skicka"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Nej"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Ersätt jokertecknet med"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Nummer till röstbrevlåda saknas"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"Det finns inget nummer till röstbrevlådan sparat på SIM-kortet."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Lägg till nummer"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Läser in…"</string>
- <string name="enterPin" msgid="4753300834213388397">"Ange PIN-kod för att låsa upp SIM-kortet."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM-kortet är upplåst"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Ny PIN-kod för SIM-kort"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Bekräfta genom att ange SIM-kortets nya PIN-kod igen"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"PIN-koderna som du angav för SIM-kortet matchar inte. Försök igen."</string>
- <string name="enterPuk" msgid="6144749655582862324">"Ange PUK-kod för att låsa upp SIM-kortet"</string>
- <string name="badPuk" msgid="3213017898690275965">"Felaktig PUK-kod!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Fortsätt"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"SIM-kortets spärr har tagits bort. Låser upp telefonen…"</string>
- <string name="label_ndp" msgid="780479633159517250">"PIN-kod för upplåsning av SIM-nätverk"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Lås upp"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Ta bort permanent"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Försöker låsa upp nätverket…"</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Det gick inte att låsa upp nätverket."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Nätverket upplåst"</string>
- <string name="imei" msgid="8552502717594321281">"IMEI-kod"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"Samtalsinst. för GSM"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"Samtalsinst. för CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Åtkomstpunktsnamn"</string>
- <string name="settings_label" msgid="3876743539816984008">"Nätverksinställningar"</string>
- <string name="voicemail" msgid="8693759337917898954">"Röstbrevlåda"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"RB:"</string>
- <string name="networks" msgid="8873030692174541976">"Nätverksoperatörer"</string>
- <string name="call_settings" msgid="6112441768261754562">"Samtalsinställningar"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Ytterligare inställningar"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Ytterligare samtalsinställningar för endast GSM"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Övriga CDMA-samtalsinställningar"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Ytterligare samtalsinställningar för endast CDMA"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Inställningar för nätverkstjänst"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"Nummerpresentatör"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Dolt nummer i utgående samtal"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Nummer som visas för utgående samtal"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Använd operatörens standardinställningar när mitt nummer visas för utgående samtal"</string>
- <string name="labelCW" msgid="6120513814915920200">"Samtal väntar"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Meddela mig om inkommande samtal under samtal"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Meddela mig om inkommande samtal under samtal"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Inställningar för Vidarebefordra samtal"</string>
- <string name="labelCF" msgid="2574386948026924737">"Vidarebefordra samtal"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Vidarebefordra alltid"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Använd alltid detta nummer"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Vidarebefordra alla samtal"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Vidarebefordrar alla samtal till \\\\{0\\\\}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Numret är inte tillgängligt"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Inaktiverat"</string>
- <string name="labelCFB" msgid="218938523102207587">"Vidarebefordra vid upptaget"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Nummer vid upptagen"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Vidarebefordrar till \\\\{0\\\\}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Inaktiverat"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Operatören stöder inte inaktivering av vidarebefordran av samtal när telefonen används."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Vidarebefordra vid ej svar"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Nummer vid ej svar"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Vidarebefordrar till \\\\{0\\\\}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Inaktiverat"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Operatören stöder inte inaktivering av vidarebefordran av samtal när ingen svarar i telefonen."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Vidarebefordra när du inte är tillgänglig"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Nummer när du inte är tillgänglig"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Vidarebefordrar till \\\\{0\\\\}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Inaktiverat"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Operatören stöder inte inaktivering av vidarebefordran av samtal när det inte går att nå telefonen."</string>
- <string name="updating_title" msgid="6146755386174019046">"Samtalsinställningar"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Felaktiga samtalsinställningar"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Läser inställningar…"</string>
- <string name="updating_settings" msgid="8171225533884883252">"Uppdaterar inställningar…"</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Återställer inställningarna…"</string>
- <string name="response_error" msgid="6674110501330139405">"Oväntat svar från nätverket."</string>
- <string name="exception_error" msgid="7027667130619518211">"Nätverks- eller SIM-kortsfel."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Sätt på radion innan du visar inställningarna."</string>
- <string name="close_dialog" msgid="2365884406356986917">"OK"</string>
- <string name="enable" msgid="1059008390636773574">"Aktivera"</string>
- <string name="disable" msgid="7274240979164762320">"Inaktivera"</string>
- <string name="change_num" msgid="239476305819844391">"Uppdatera"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Standardinställning för nätverk"</item>
- <item msgid="7876195870037833661">"Dölj nummer"</item>
- <item msgid="1108394741608734023">"Visa nummer"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Spara nummer till röstbrevlåda"</string>
- <string name="vm_changed" msgid="380744030726254139">"Numret till röstbrevlåda har ändrats."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Det gick inte att ändra numret till röstbrevlådan."\n"Kontakta operatören om problemet kvarstår."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Det gick inte att ändra numret för vidarebefordran."\n"Kontakta operatören om problemet kvarstår."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Det gick inte att hämta och spara det aktuella numret för vidarebefordran. "\n"Vill du byta till den nya leverantören i alla fall?"</string>
- <string name="no_change" msgid="3186040086622435212">"Du har inte gjort några ändringar."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Välj tjänst för röstbrevlådan"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Min operatör"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobila nätverksinställningar"</string>
- <string name="label_available" msgid="1181658289009300430">"Tillgängliga nätverk"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Söker…"</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Hittade inga nätverk."</string>
- <string name="search_networks" msgid="1601136049300882441">"Sök efter nätverk"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Ett fel uppstod när vi sökte efter nätverk."</string>
- <string name="register_on_network" msgid="9055203954040805084">"Registrerar på <xliff:g id="NETWORK">%s</xliff:g>…"</string>
- <string name="not_allowed" msgid="3540496123717833833">"Ditt SIM-kort tillåter inte anslutning till detta nätverk."</string>
- <string name="connect_later" msgid="500090982903469816">"Det går inte att ansluta till nätverket för tillfället. Försök igen senare."</string>
- <string name="registration_done" msgid="495135664535876612">"Registrerad på nätverk."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Välj en nätverksoperatör"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Sök efter alla tillgängliga nätverk"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Välj automatiskt"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Välj önskat nätverk automatiskt"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Automatisk registrering..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Nätverksläge"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Ändra nätverksläge"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Föredraget nätverksläge"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Globalt"</item>
- <item msgid="3273348576277144124">"Endast EvDo"</item>
- <item msgid="454610224530856274">"CDMA utan EvDo"</item>
- <item msgid="8928247118825616081">"CDMA / EvDo auto"</item>
- <item msgid="8595462903294812666">"GSM / WCDMA auto"</item>
- <item msgid="5189164180446264504">"Endast WCDMA"</item>
- <item msgid="5714714953966979187">"Endast GSM"</item>
- <item msgid="4775796025725908913">"Föredrar GSM / WCDMA"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Data är aktiverat"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Aktivera dataåtkomst via mobilt nätverk"</string>
- <string name="roaming" msgid="8871412572928323707">"Roaming"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Anslut till datatjänster vid roaming"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Anslut till datatjänster vid roaming"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Du förlorade dataanslutningen eftersom du lämnade ditt hemnätverk utan att aktivera roaming."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Tillåta roaming? Observera att detta kan leda till höga kostnader!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"Alternativ för GSM/UMTS"</string>
- <string name="cdma_options" msgid="4016822858172249884">"CDMA-alternativ"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Dataanvändning"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Operatörens datapolicy"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Använda data under nuvarande period"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Dataanvändningsperiod"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Datahastighetspolicy"</string>
- <string name="throttle_help" msgid="243651091785169900">"Läs mer"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %) av högst <xliff:g id="USED_2">%3$s</xliff:g> för perioden"\n"Nästa period börjar om <xliff:g id="USED_3">%4$d</xliff:g> dagar (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %) av högst <xliff:g id="USED_2">%3$s</xliff:g> för perioden"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"<xliff:g id="USED_0">%1$s</xliff:g> maxvärdet har överskridits"\n"Datahastigheten har sänkts till <xliff:g id="USED_1">%2$d</xliff:g> kbit/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"<xliff:g id="USED_0">%1$d</xliff:g> % av cykeln har gått"\n"Nästa period börjar om <xliff:g id="USED_1">%2$d</xliff:g> dagar (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Datahastigheten sänks till <xliff:g id="USED">%1$d</xliff:g> kbit/s om dataanvändningsgränsen överskrids"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Mer information om operatörens dataanvändningspolicy för mobilnätverket"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Cell Broadcast SMS"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Cell Broadcast SMS"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Cell Broadcast SMS"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Cell Broadcast SMS aktiverat"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Cell Broadcast SMS inaktiverat"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Inställningar för Cell Broadcast SMS"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Nödsändning"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Nödsändning aktiverat"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Nödsändning inaktiverad"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"Administration"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"Administration aktiverat"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"Administration inaktiverad"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Underhåll"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Underhåll aktiverat"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Underhåll inaktiverat"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Allmänna nyheter"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"Ekonominyheter"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Sportnyheter"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Nöjesnyheter"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Lokal"</string>
- <string name="local_enable" msgid="6370463247609136359">"Lokala nyheter aktiverade"</string>
- <string name="local_disable" msgid="4405691986943795798">"Lokala nyheter inaktiverade"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Regionalt"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Regionala nyheter aktiverade"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Regionala nyheter inaktiverade"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Nationellt"</string>
- <string name="national_enable" msgid="1172443648912246952">"Nationella nyheter aktiverade"</string>
- <string name="national_disable" msgid="326018148178601166">"Nationella nyheter har inaktiverats"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Internationellt"</string>
- <string name="international_enable" msgid="5855356769925044927">"Internationella nyheter aktiverade"</string>
- <string name="international_disable" msgid="2850648591041088931">"Internationella nyheter inaktiverade"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Språk"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Välj språk för nyheterna"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"Engelska"</item>
- <item msgid="1151988412809572526">"Franska"</item>
- <item msgid="577840534704312665">"Spanska"</item>
- <item msgid="8385712091143148180">"Japanska"</item>
- <item msgid="1858401628368130638">"Koreanska"</item>
- <item msgid="1933212028684529632">"Kinesiska"</item>
- <item msgid="1908428006803639064">"Hebreiska"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Språk"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Lokala väderprognoser"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Lokala väderprognoser aktiverade"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Lokala väderprognoser inaktiverade"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Trafikrapporter för området"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Trafikrapporter för området aktiverade"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Trafikrapporter för området inaktiverade"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Flygtider för lokal flygplats"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Flygtider för lokal flygplats aktiverade"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Flygtider för lokal flygplats inaktiverade"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restauranger"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restauranger aktiverade"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restauranger inaktiverade"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Logi"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Logi aktiverat"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Logi inaktiverat"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Detaljhandelskatalog"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Detaljhandelskatalog aktiverad"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Detaljhandelskatalog inaktiverad"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Annonsering"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Annonsering aktiverat"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Annonsering inaktiverat"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Aktiekurser"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Aktiekurser aktiverade"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Aktiekurser inaktiverade"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"Jobbannonser"</string>
- <string name="eo_enable" msgid="8623559062015685813">"Jobbannonser aktiverade"</string>
- <string name="eo_disable" msgid="3863812478090907609">"Jobbannonser inaktiverade"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Medicin, hälsa och sjukvård"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Medicin, hälsa och sjukvård aktiverade"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Medicin, hälsa och sjukvård inaktiverade"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Tekniknyheter"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Tekniknyheter aktiverade"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Tekniknyheter inaktiverade"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Multi-kategori"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Multikategori aktiverad"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Multikategori inaktiverad"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"Nätverksinställningar för GSM/UMTS"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Inte implementerad än!"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"Nätverksinställningar för GSM/UMTS"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (autoläge)"</item>
- <item msgid="8912042051809329533">"Endast WCDMA"</item>
- <item msgid="8776934131146642662">"Endast GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (föredrar WCDMA)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Använd endast 2G-nätv."</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Sparar batteri"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Systemval"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Ändra cdma-roamingläge"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Systemval"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Endast hemma"</item>
- <item msgid="1205664026446156265">"Automatiskt"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMA-roamingläge"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Ändra cdma-roamingläge"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMA-roamingläge"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Endast hemnätverk"</item>
- <item msgid="8174642753290624634">"Anslutna nätverk"</item>
- <item msgid="2241951431403168661">"Alla nätverk"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"Nätverksinställningar för CDMA"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Inte implementerad än!"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"Nätverksinställningar för CDMA"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Endast CDMA"</item>
- <item msgid="2683555124647197574">"Endast EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"TEST av CDMA-prenumeration"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"Växla mellan RUIM/SIM och NV"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"prenumeration"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Fasta nummer"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"FDN-lista"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"FDN-aktivering"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Fasta nummer är aktiverade"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Fasta nummer är inaktiverade"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Aktivera FDN"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Inaktivera FDN"</string>
- <string name="change_pin2" msgid="2153563695382176676">"Ändra PIN2-kod"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Inaktivera FDN"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Aktivera FDN"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Hantera fasta nummer"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"Ändra PIN-kod för FDN-åtkomst"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Hantera nummerlistan"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Röstsekretess"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Aktivera avancerat sekretessläge"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTY-läge"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"Aktivera TTY-läge"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTY-läge"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"Ange TTY-läge"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Försök igen automatiskt"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Aktivera läget Försök igen automatiskt"</string>
- <string name="menu_add" msgid="1882023737425114762">"Lägg till kontakt"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Redigera kontakt"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Ta bort kontakt"</string>
- <string name="get_pin2" msgid="1198225482542827652">"Ange PIN2"</string>
- <string name="name" msgid="7329028332786872378">"Namn"</string>
- <string name="number" msgid="7905950798349903858">"Nummer"</string>
- <string name="save" msgid="4094274636321939086">"Spara"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Lägg fast nummer "</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Lägger till fast nummer…"</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Ett fast nummer har lagts till."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Redigera fast nummer"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Uppdaterar det fasta numret…"</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Det fasta numret är uppdaterat."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Ta bort fast nummer"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Tar bort fast nummer…"</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Det fasta numret har tagits bort."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN är inte uppdaterat. Du angav en felaktig PIN-kod."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN är inte uppdaterat. Numret får inte innehålla fler än 20 siffror."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Läser från SIM-kort…"</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Inga kontakter på SIM-kortet."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Välj vilka kontakter som ska importeras"</string>
- <string name="enable_pin" msgid="5422767284133234860">"Aktivera/inaktivera SIM-kortets PIN-kod"</string>
- <string name="change_pin" msgid="9174186126330785343">"Ändra SIM-kortets PIN-kod"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"SIM-kortets PIN-kod:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Gammal PIN-kod"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Ny PIN-kod"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Bekräfta ny PIN-kod"</string>
- <string name="badPin" msgid="4154316827946559447">"Den gamla PIN-koden är felaktig. Försök igen."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"PIN-koderna som du angav matchar inte. Försök igen."</string>
- <string name="invalidPin" msgid="5981171102258684792">"Ange en PIN-kod med 4 till 8 siffror."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Inaktivera SIM-kortets PIN-kod"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Aktivera PIN-kod"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Vänta…"</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"SIM-kortets PIN-kod är aktiverad"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"SIM-kortets PIN-kod är inaktiverad"</string>
- <string name="pin_failed" msgid="6597695909685242127">"PIN-koden du angav är felaktig"</string>
- <string name="pin_changed" msgid="9000716792724195093">"SIM-kortets PIN-kod har ändrats"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Lösenordet är felaktigt och SIM-kortet har spärrats! PUK2 krävs."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Gammal PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Ny PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Bekräfta ny PIN2-kod"</string>
- <string name="badPuk2" msgid="4072035207011308856">"PUK2-koden du angav är felaktig. Försök igen."</string>
- <string name="badPin2" msgid="515218795152422178">"Den gamla PIN2-koden du angav är felaktig. Försök igen."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"PIN2-koderna som du angav matchar inte. Försök igen."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"Ange en PIN2-kod med 4 till 8 siffror."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"Ange en PUK2-kod med 8 siffror."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2 har ändrats"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"Ange PUK2-kod"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Lösenordet är felaktigt. Ange en annan PIN2-kod och försök igen!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Lösenordet är felaktigt och SIM-kortet har spärrats! PUK2 krävs."</string>
- <string name="doneButton" msgid="2859593360997984240">"Färdig"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Konferenssamtal <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Återgå till samtal"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"Fortsätt utan SIM-kort"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"Inget SIM-kort hittades. Sätt i ett SIM-kort i telefonen."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Ta bort permanent"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Lås upp"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"Verifierar PIN-kod…"</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Nummer till röstbrevlåda"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Ringer"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Försöker igen"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Pågående samtal"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Konferenssamtal"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Inkommande samtal"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Cdma-samtal väntar"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Samtal avslutat"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Parkerat"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Lägger på"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"I samtal"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Missat samtal"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Missade samtal"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missade samtal"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Missat samtal från <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Pågående samtal (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Parkerat"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Ny röstbrevlåda"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Ny röstbrevlåda (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Ring <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nummer till röstbrevlåda okänt"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Ingen tjänst"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Det valda nätverket (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) är inte tillgängligt"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Om du vill ringa ett samtal måste du först inaktivera flygplansläge."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Inte registrerat på nätverk."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Inget mobilt nätverk är tillgängligt."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Samtalet har inte skickats. Du måste ange ett giltigt nummer."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Samtalet har inte skickats."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Startar sekvens för MMI-kod…"</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Startar sekvens för funktionskod..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Inget stöd för tjänsten."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Det gick inte att växla mellan samtal."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Det gick inte att koppla isär samtalen."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Det gick inte överföra samtal."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Det gick inte att ringa konferenssamtal."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Det gick inte att avvisa samtal."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Det gick inte att släppa samtal."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Nödsamtal"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Sätter på radion…"</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Fungerar inte i detta område. Försöker igen…"</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Samtalet har inte skickats. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> är inte ett nödsamtalsnummer!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Samtalet har inte skickats. Ring ett nödsamtalsnummer!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Använd tangentbordet om du vill ringa"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Knappsats för tonval"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Knappsats"</string>
- <string name="touchLockText" msgid="566824588267376287">"Dubbelklicka"\n"för att låsa upp"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Dubbelklicka"\n"om du vill svara"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Dubbelklicka"\n"om du vill avvisa"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Parkera"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Ta bort parkering"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Avsluta"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Knappsats"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Dölj"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Högtalare"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Ljud av"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Lägg till samtal"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Koppla ihop samtal"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Växla"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Hantera samtal"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Hantera"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"Importera"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Importera alla"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"Importera SIM-kontakter"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Importera från Kontakter"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"Hörapparater"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Aktivera kompatibilitet med hörapparat"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY av"</item>
- <item msgid="3971695875449640648">"TTY är full"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERI-text"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMF-signaler"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"Ange längd på DTMF-signaler"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normal"</item>
- <item msgid="2883365539347850535">"Lång"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Nätverksmeddelande"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Aktivera telefonen"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Du måste ringa ett särskilt samtal för att aktivera telefontjänsten. "\n\n" Tryck på \"Aktivera\" och lyssna på instruktionerna om hur du aktiverar telefonen."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Tryck på Aktivera för att ringa ett speciellt samtal som aktiverar din telefon i operatörens mobila nätverk, så att du kan ringa och ansluta till mobila datanätverk."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Vill du hoppa över aktiveringen?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Om du hoppar över aktiveringen kan du inte ringa samtal eller ansluta till mobila datanätverk (men du kan ansluta till WiFi-nätverk). Du kommer att påminnas om att aktivera telefonen varje gång du sätter på den, tills du har aktiverat den."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Hoppa över"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Aktivera"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Aktivera"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Telefonen är aktiverad!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Problem med aktivering"</string>
- <string name="ota_listen" msgid="162923839877584937">"Följ de talade instruktionerna tills du här att aktiveringen är slutförd."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Knappsats"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Högtalare"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Vänta medan telefonen programmeras."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Det gick inte att programmera"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Telefonen är nu aktiverad. Det kan ta upp till 15 minuter innan tjänsten startar."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Telefonen har inte aktiverats. "\n"Du kanske måste hitta en plats med bättre täckning (nära ett fönster eller utomhus). "\n\n"Försök igen eller ring kundtjänst om du vill ha fler alternativ."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"FÖR MÅNGA MISSLYCKADE SPC"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Tillbaka"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Försök igen"</string>
- <string name="ota_next" msgid="3904945374358235910">"Nästa"</string>
- <string name="ota_back" msgid="2190038043403850052">"Tillbaka"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Starta läget Återuppringning vid nödsamtal"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Läget Återuppringning vid nödsamtal"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Dataanslutning inaktiverad"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"Inga dataanslutningar på <xliff:g id="COUNT">%s</xliff:g> minut"</item>
- <item quantity="other" msgid="3122217344579273583">"Inga dataanslutningar på <xliff:g id="COUNT">%s</xliff:g> minuter"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Telefonen är i läget Återuppringning vid nödsamtal i <xliff:g id="COUNT">%s</xliff:g> minut. I det här läget kan inga program som använder dataanslutningar användas. Vill du avsluta nu?"</item>
- <item quantity="other" msgid="3231879566243957821">"Telefonen är i läget Återuppringning vid nödsamtal i <xliff:g id="COUNT">%s</xliff:g> minuter. I det här läget kan inga program som använder dataanslutningar användas. Vill du avsluta nu?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"Den valda åtgärden är inte tillgänglig i läget Återuppringning vid nödsamtal. Telefonen kommer att vara i det här läget i <xliff:g id="COUNT">%s</xliff:g> minut. Vill du avsluta nu?"</item>
- <item quantity="other" msgid="3489076611710869904">"Den valda åtgärden är inte tillgänglig i läget Återuppringning vid nödsamtal. Telefonen kommer att vara i det här läget i <xliff:g id="COUNT">%s</xliff:g> minuter. Vill du avsluta nu?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"Den valda åtgärden är inte tillgänglig under nödsamtal"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Avslutar läget Återuppringning vid nödsamtal"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Ja"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Nej"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Ta bort permanent"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Inställningar för röstbrevlådan"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;Har inte angetts&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Tjänst för röstbrevlådan"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"Inställningar för <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
- <string name="other_settings" msgid="3672912580359716394">"Övriga samtalsinställningar"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Ring"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"Ringer via ^1"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"Tryck och dra till höger om du vill svara"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Tryck och dra till vänster för tyst signal"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Tryck och dra till vänster om du vill avvisa"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Tryck och dra till höger om du vill svara och"\n"parkera det aktiva samtalet"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Tryck och dra till höger om du vill svara och"\n"avsluta det aktiva samtalet"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Tryck och dra till höger om du vill svara och"\n"avsluta det parkerade samtalet"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Svara"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Avvisa"</string>
-</resources>
diff --git a/phone/res/values-tr/strings.xml b/phone/res/values-tr/strings.xml
deleted file mode 100644
index 942e241..0000000
--- a/phone/res/values-tr/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"Kişiler"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"Sık Kullanılanlar"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"Çevirici"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"Acil Durum Çeviricisi"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"Çağrı kaydı"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"SAN listesi"</string>
- <string name="unknown" msgid="6878797917991465859">"Bilinmiyor"</string>
- <string name="private_num" msgid="6713286113000232309">"Özel numara"</string>
- <string name="payphone" msgid="1931775086311769314">"Ankesörlü telefon"</string>
- <string name="onHold" msgid="9035493194749959955">"Beklemede"</string>
- <string name="ongoing" msgid="8300874342848721367">"Geçerli çağrı"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"Hat meşgul"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"Ağ meşgul"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"Sinyal yok"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"ACM sınırı aşıldı"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"Radyo kapalı"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"SIM kart yok veya SIM hatası"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"Hizmet alanı dışında"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"Giden çağrılar SAN tarafından kısıtlandı."</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"Çağrı engelleme açıkken giden çağrı yapamazsınız."</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"Tüm çağrılar erişim denetimi tarafından kısıtlandı."</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"Acil durum çağrıları erişim denetimi tarafından kısıtlandı."</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"Normal çağrılar erişim denetimi tarafından kısıtlanmış."</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA: Telefon kapatılıp açılana kadar kilitlendi."</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA: Çağrı kesildi."</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA: Çağrı yakalandı."</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA: yeniden sırala."</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA: Hizmet Seçeneği Reddi."</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA: tekrar deneme sırası."</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA: Erişim hatası."</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA: Değiştirildi."</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"Yalnızca acil çağrı yapılabilir."</string>
- <string name="confCall" msgid="1904840547188336828">"Konferans görüşmesi"</string>
- <string name="call_lost" msgid="317670617901479594">"Çağrı istemeden sonlandırıldı."</string>
- <string name="retry" msgid="8462986804300767852">"Tekrar Dene"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"Çağrı İstemeden Sonlandırıldı"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMI kodu başlatıldı"</string>
- <string name="ussdRunning" msgid="485588686340541690">"USSD kodu çalışıyor…"</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMI kodu iptal edildi"</string>
- <string name="cancel" msgid="5044513931633602634">"İptal"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"Hoparlör"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"Bluetooth"</string>
- <string name="menu_mute" msgid="4399723633363773145">"Sesi Kapat"</string>
- <string name="menu_hold" msgid="6970441130344786273">"Beklet"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"Çağrıyı sonlandır"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"Çağrılar arasında geçiş yap"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"Çağrıları birleştir"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"Çağrı ekle"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"Konferans görüşmesini yönet"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"Tuş takımını göster"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"Tuş takımını gizle"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"Geçerli çağrıyı beklet"\n"ve yanıtla"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"Geçerli çağrıyı sonlandır"\n"ve yanıtla"</string>
- <string name="ok" msgid="3811371167865772377">"Tamam"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"Çağrı seçenekleri için Menü\'ye basın"</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"Çağrı seçenekleri için Menü\'ye basın • Çevirmek için klavyeyi kullanın"</string>
- <string name="menu_answer" msgid="116686205042231098">"Yanıtla"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"Yoksay"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"Şu zil sesleri gönderilsin mi?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"Zil Sesleri Gönderiliyor"\n</string>
- <string name="send_button" msgid="4106860097497818751">"Gönder"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"Evet"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"Hayır"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"Joker karakteri şununla değiştir:"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"Eksik sesli mesaj numarası"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM kartta depolanan sesli mesaj numarası yok."</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"Numara ekle"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"Yükleniyor..."</string>
- <string name="enterPin" msgid="4753300834213388397">"SIM kart kilidini açmak için PIN kodunu yazın."</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM kilidi açıldı"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"Yeni SIM PIN kodu"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"Doğrulamak için yeni SIM PIN kodunu tekrar girin"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"Yazdığınız SIM PIN kodları eşleşmiyor. Lütfen tekrar deneyin."</string>
- <string name="enterPuk" msgid="6144749655582862324">"SIM kart kilidini açmak için PUK kodunu yazın"</string>
- <string name="badPuk" msgid="3213017898690275965">"Hatalı PUK kodu!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"Devam"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"SIM kartınızın engellemesi kaldırıldı. Telefonunuzun kilidi açılıyor..."</string>
- <string name="label_ndp" msgid="780479633159517250">"SIM ağı kilit açma PIN kodu"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"Kilit Aç"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"Kapat"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"Ağ kilidini açma isteği yapılıyor..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"Ağ kilidi açma isteği başarısız."</string>
- <string name="unlock_success" msgid="6770085622238180152">"Ağ kilidi açılamadı."</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"GSM çağrı ayarları"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"CDMA çağrı ayarları"</string>
- <string name="apn_settings" msgid="9043423184895642077">"Erişim Noktası Adları"</string>
- <string name="settings_label" msgid="3876743539816984008">"Ağ ayarları"</string>
- <string name="voicemail" msgid="8693759337917898954">"Sesli mesaj"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
- <string name="networks" msgid="8873030692174541976">"Ağ operatörleri"</string>
- <string name="call_settings" msgid="6112441768261754562">"Çağrı ayarları"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"Ek ayarlar"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"Yalnızca GSM çağrısı ek ayarları"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"Ek CDMA çağrı ayarları"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"Yalnızca CDMA çağrısı ek ayarları"</string>
- <string name="labelNwService" msgid="4699970172021870983">"Ağ hizmeti ayarları"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"Arayan Kimliği"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"Giden çağrılarda numara gizli"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"Giden çağrılarda numara görüntüleniyor"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"Giden çağrılarda numaramı görüntülemek için varsayılan operatör ayarlarını kullan"</string>
- <string name="labelCW" msgid="6120513814915920200">"Çağrı bekletme"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"Bir çağrı sırasında, gelen çağrıları bana bildir"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"Bir çağrı sırasında, gelen çağrıları bana bildir"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"Çağrı yönlendirme ayarları"</string>
- <string name="labelCF" msgid="2574386948026924737">"Çağrı yönlendirme"</string>
- <string name="labelCFU" msgid="8147177368148660600">"Her zaman yönlendir"</string>
- <string name="messageCFU" msgid="3560082430662923687">"Daima bu numarayı kullan"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Tüm çağrılar yönlendiriliyor"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"Tüm çağrılar şuraya yönlendiriliyor: {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"Numara kullanılamıyor"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"Devre dışı"</string>
- <string name="labelCFB" msgid="218938523102207587">"Meşgul olduğunda yönlendir"</string>
- <string name="messageCFB" msgid="3711089705936187129">"Meşgulken kullanılacak numara"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"Şuna yönlendiriliyor: {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"Devre dışı"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"Operatörünüz, telefonunuz meşgul olduğunda çağrı yönlendirmenin devre dışı bırakılmasını desteklemiyor."</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"Yanıtlanmadığında yönlendir"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"Yanıtlanmadığında kullanılacak numara"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"Şuna yönlendiriliyor: {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"Devre dışı"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"Operatörünüz, telefonunuz yanıt vermediğinde çağrı yönlendirmenin devre dışı bırakılmasını desteklemiyor."</string>
- <string name="labelCFNRc" msgid="47183615370850000">"Ulaşılamadığında yönlendir"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"Ulaşılamadığında kullanılacak numara"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"Şuna yönlendiriliyor: {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"Devre dışı"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"Operatörünüz, telefonunuza ulaşılamadığında çağrı yönlendirmenin devre dışı bırakılmasını desteklemiyor."</string>
- <string name="updating_title" msgid="6146755386174019046">"Çağrı ayarları"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"Çağrı ayarları hatası"</string>
- <string name="reading_settings" msgid="1920291699287055284">"Ayarlar okunuyor..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"Ayarlar güncelleniyor..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"Ayarlar geri alınıyor..."</string>
- <string name="response_error" msgid="6674110501330139405">"Ağdan beklenmeyen yanıt."</string>
- <string name="exception_error" msgid="7027667130619518211">"Ağ veya SIM kart hatası."</string>
- <string name="radio_off_error" msgid="6717116288405111269">"Bu ayarları görüntülemeden önce lütfen radyoyu açın."</string>
- <string name="close_dialog" msgid="2365884406356986917">"Tamam"</string>
- <string name="enable" msgid="1059008390636773574">"Etkinleştir"</string>
- <string name="disable" msgid="7274240979164762320">"Devre Dışı Bırak"</string>
- <string name="change_num" msgid="239476305819844391">"Güncelle"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"Ağ varsayılanı"</item>
- <item msgid="7876195870037833661">"Numarayı gizle"</item>
- <item msgid="1108394741608734023">"Numarayı göster"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"Sesli mesaj numarasını kaydet"</string>
- <string name="vm_changed" msgid="380744030726254139">"Sesli mesaj numarası değiştirildi."</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"Sesli mesaj numarası değiştirilemedi."\n"Sorun devam ederse lütfen operatörünüze başvurun."</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"Yönlendirme numarası değiştirilemedi."\n"Bu sorun devam ederse lütfen operatörünüze başvurun."</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"Geçerli yönlendirme numarası ayarları alınamadı ve kaydedilemedi."\n"Yine de yeni sağlayıcıya geçiş yapmak istiyor musunuz?"</string>
- <string name="no_change" msgid="3186040086622435212">"Hiçbir değişiklik yapılmadı."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Sesli mesaj hizmetini seç"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"Operatörüm"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"Mobil ağ ayarları"</string>
- <string name="label_available" msgid="1181658289009300430">"Kullanılabilir ağlar"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"Aranıyor..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"Hiçbir ağ bulunamadı."</string>
- <string name="search_networks" msgid="1601136049300882441">"Ağları ara"</string>
- <string name="network_query_error" msgid="6828516148953325006">"Ağlar aranırken hata oluştu."</string>
- <string name="register_on_network" msgid="9055203954040805084">"<xliff:g id="NETWORK">%s</xliff:g> ağına kaydediliyor..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"SIM kartınız bu ağa bağlanmaya izin vermiyor."</string>
- <string name="connect_later" msgid="500090982903469816">"Şu anda bu ağa bağlanılamıyor. Lütfen daha sonra tekrar deneyin."</string>
- <string name="registration_done" msgid="495135664535876612">"Ağa kaydedildi."</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"Bir ağ operatörü seçin"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"Kullanılabilen tüm ağları ara"</string>
- <string name="select_automatically" msgid="8615980695510888796">"Otomatik olarak seç"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"Tercih edilen ağı otomatik olarak seç"</string>
- <string name="register_automatically" msgid="6272031189219101172">"Otomatik kayıt..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"Ağ Modu"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"Ağın çalışma modunu değiştir"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"Tercih edilen ağ modu"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"Küresel"</item>
- <item msgid="3273348576277144124">"Yalnızca EvDo"</item>
- <item msgid="454610224530856274">"EvDo olmadan CDMA"</item>
- <item msgid="8928247118825616081">"CDMA / EvDo otomatik"</item>
- <item msgid="8595462903294812666">"Otomatik GSM / WCDMA"</item>
- <item msgid="5189164180446264504">"Yalnızca WCDMA"</item>
- <item msgid="5714714953966979187">"Yalnızca GSM"</item>
- <item msgid="4775796025725908913">"Tercih edilen GSM / WCDMA"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"Veri etkin"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Mobil ağ üzerinden veri erişimini etkinleştir"</string>
- <string name="roaming" msgid="8871412572928323707">"Veri dolaşımı"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"Dolaşırken veri hizmetlerine bağlan"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"Dolaşırken veri hizmetlerine bağlan"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"Veri dolaşımı kapalıyken ana ağınızdan ayrıldığınız için veri bağlantısını kaybettiniz."</string>
- <string name="roaming_warning" msgid="7820963598559553967">"Veri dolaşımına izin verilsin mi? Kayda değer dolaşım ücretleri ödeyebilirsiniz!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS Seçenekleri"</string>
- <string name="cdma_options" msgid="4016822858172249884">"CDMA Seçenekleri"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"Veri kullanımı"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"Operatörün veri politikası"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"Geçerli dönemde kullanılan veri"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"Veri kullanım dönemi"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"Veri hızı politikası"</string>
- <string name="throttle_help" msgid="243651091785169900">"Daha fazla bilgi edinin"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (٪<xliff:g id="USED_1">%2$d</xliff:g>) / <xliff:g id="USED_2">%3$s</xliff:g> dönem maksimumu"\n"Bir sonraki dönem <xliff:g id="USED_3">%4$d</xliff:g> gün sonra başlıyor (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"Maksimum dönem <xliff:g id="USED_0">%1$s</xliff:g> (٪<xliff:g id="USED_1">%2$d</xliff:g>) / <xliff:g id="USED_2">%3$s</xliff:g>"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"Maksimum değer <xliff:g id="USED_0">%1$s</xliff:g> aşıldı"\n"Veri hızı <xliff:g id="USED_1">%2$d</xliff:g> Kb/s\'ye düşürüldü"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"Dönemin tamamlanan bölümü:٪ <xliff:g id="USED_0">%1$d</xliff:g>"\n"Bir sonraki dönem <xliff:g id="USED_1">%2$d</xliff:g> gün sonra başlıyor (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"Veri kullanım sınırı aşılırsa veri hızı <xliff:g id="USED">%1$d</xliff:g> Kb/s\'ye düşürülür"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"Operatörünüzün mobil ağ üzerinden veri kullanımı politikası hakkında daha fazla bilgi edinin"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"Hücre Yayını SMS\'si"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"Hücre Yayını SMS\'i"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Hücre Yayını SMS\'i"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Hücre Yayını SMS\'si etkinleştirildi"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Hücre Yayını SMS\'si devre dışı bırakıldı"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Hücre Yayını SMS ayarları"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Acil Durum Yayını"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"Acil Durum Yayını etkinleştirildi"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Acil Durum Yayını devre dışı bırakıldı"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"İdari"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"İdari seçeneği etkinleştirildi"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"İdari seçeneği devre dışı bırakıldı"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"Bakım"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"Bakım etkinleştirildi"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Bakım devre dışı bırakıldı"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"Genel Haberler"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"İşletme ve Finans Haberleri"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"Spor Haberleri"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"Eğlence Haberleri"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"Yerel"</string>
- <string name="local_enable" msgid="6370463247609136359">"Yerel haberler etkinleştirildi"</string>
- <string name="local_disable" msgid="4405691986943795798">"Yerel haberler devre dışı bırakıldı"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"Bölgesel"</string>
- <string name="regional_enable" msgid="4434680415437834759">"Bölgesel haberler etkinleştirildi"</string>
- <string name="regional_disable" msgid="5359325527213850077">"Bölgesel haberler devre dışı bırakıldı"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"Ulusal"</string>
- <string name="national_enable" msgid="1172443648912246952">"Ulusal haberler etkinleştirildi"</string>
- <string name="national_disable" msgid="326018148178601166">"Ulusal haberler devre dışı bırakıldı"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"Uluslararası"</string>
- <string name="international_enable" msgid="5855356769925044927">"Uluslararası haberler etkinleştirildi"</string>
- <string name="international_disable" msgid="2850648591041088931">"Uluslararası haberler devre dışı bırakıldı"</string>
- <string name="list_language_title" msgid="2841683501919760043">"Dil"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"Haber dilini seçin"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"İngilizce"</item>
- <item msgid="1151988412809572526">"Fransızca"</item>
- <item msgid="577840534704312665">"İspanyolca"</item>
- <item msgid="8385712091143148180">"Japonca"</item>
- <item msgid="1858401628368130638">"Korece"</item>
- <item msgid="1933212028684529632">"Çince"</item>
- <item msgid="1908428006803639064">"İbranice"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"Diller"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"Yerel Hava Durumu"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"Yerel Hava Durumu etkinleştirildi"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Yerel Hava Durumu devre dışı bırakıldı"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"Bölge Trafik Raporları"</string>
- <string name="atr_enable" msgid="5541757457789181799">"Bölge Trafik Raporları etkinleştirildi"</string>
- <string name="atr_disable" msgid="7085558154727596455">"Bölge Trafik Raporları devre dışı bırakıldı"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"Yerel Havaalanı Uçuş Tarifeleri"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"Yerel Havaalanı Uçuş Tarifeleri etkinleştirildi"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"Yerel Havaalanı Uçuş Tarifeleri devre dışı bırakıldı"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"Restoranlar"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"Restoranlar etkinleştirildi"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"Restoranlar devre dışı bırakıldı"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"Konaklamalar"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"Konaklama etkinleştirildi"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"Konaklama devre dışı bırakıldı"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"Perakende Dizini"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"Perakende Dizini etkinleştirildi"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Perakende Dizini devre dışı bırakıldı"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"Reklamlar"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"Reklamlar etkinleştirildi"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"Reklamlar devre dışı bırakıldı"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"Hisse Senetleri"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"Hisse Senetleri etkinleştirildi"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"Hisse Senetleri devre dışı bırakıldı"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"İş İmkanları"</string>
- <string name="eo_enable" msgid="8623559062015685813">"İş İmkanları etkinleştirildi"</string>
- <string name="eo_disable" msgid="3863812478090907609">"İş İmkanları devre dışı bırakıldı"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"Tıp, Sağlık ve Hastane"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"Tıp, Sağlık ve Hastane seçenekleri etkinleştirildi"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"Tıp, Sağlık ve Hastane seçeneği devre dışı bırakıldı"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"Teknoloji Haberleri"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"Teknoloji Haberleri etkinleştirildi"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"Teknoloji Haberleri devre dışı bırakıldı"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"Çoklu kategori"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"Çoklu kategori etkinleştirildi"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"Çoklu kategori devre dışı bırakıldı"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"GSM/UMTS Ağ Tercihleri"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"Henüz uygulanmadı!"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"GSM/UMTS ağ tercihleri"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (otomatik mod)"</item>
- <item msgid="8912042051809329533">"Yalnızca WCDMA"</item>
- <item msgid="8776934131146642662">"Yalnızca GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (WCDMA tercihli)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"Yalnızca 2G ağlarını kullan"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"Pil tasarrufu sağlar"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"Sistem seç"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"Cdma dolaşım modunu değiştir"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"Sistem seçin"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"Yalnızca ev"</item>
- <item msgid="1205664026446156265">"Otomatik"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMA Dolaşım Modu"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"Cdma dolaşım modunu değiştir"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMA dolaşım modu"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"Yalnızca Ana Ağlar"</item>
- <item msgid="8174642753290624634">"Bağlı Ağlar"</item>
- <item msgid="2241951431403168661">"Tüm Ağlar"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"CDMA Ağ Tercihleri"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"Henüz uygulanmadı!"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"CDMA ağ tercihleri"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"Yalnızca CDMA"</item>
- <item msgid="2683555124647197574">"Yalnızca EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"CDMA Abonelik TESTİ"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"RUIM/SIM ve NV arasında değiştir"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"abonelik"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"Sabit Arama Numaraları"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"SAN listesi"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"SAN etkinleştirme"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"Sabit Arama Numaraları etkin"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"Sabit Arama Numaraları devre dışı"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"SAN\'yi etkinleştir"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"SAN\'yi devre dışı bırak"</string>
- <string name="change_pin2" msgid="2153563695382176676">"PIN2 kodunu değiştir"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"SAN\'yi devre dışı bırak"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"SAN\'yi etkinleştir"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"Sabit Arama Numaralarını Yönet"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"SAN erişimi için PIN kodunu değiştir"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"Telefon numarası listesini yönet"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"Ses Gizliliği"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Gelişmiş gizlilik modunu etkinleştir"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTY modu"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"TTY modunu etkinleştir"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTY modu"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"TTY modunu ayarla"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"Otomatik Yeniden Deneme"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"Otomatik Yeniden Deneme modunu etkinleştir"</string>
- <string name="menu_add" msgid="1882023737425114762">"Kişi ekle"</string>
- <string name="menu_edit" msgid="7143003705504672374">"Kişiyi düzenle"</string>
- <string name="menu_delete" msgid="3977150783449642851">"Kişiyi sil"</string>
- <string name="get_pin2" msgid="1198225482542827652">"PIN2 kodunu girin"</string>
- <string name="name" msgid="7329028332786872378">"Ad"</string>
- <string name="number" msgid="7905950798349903858">"Numara"</string>
- <string name="save" msgid="4094274636321939086">"Kaydet"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"Sabit arama numarası ekle"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"Sabit arama numarası ekleniyor..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"Sabit arama numarası eklendi."</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"Sabit arama numarasını düzenle"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"Sabit arama numarası güncelleniyor..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"Sabit arama numarası güncellendi."</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"Sabit arama numarasını sil"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"Sabit arama numarası siliniyor..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"Sabit arama numarası silindi."</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN güncellenmedi: yanlış PIN girdiniz."</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN güncellenmedi: sayı 20 basamağı aşamaz."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"SIM karttan okunuyor..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"SIM kartınızda hiçbir kişi yok."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"İçe aktarılacak kişileri seçin"</string>
- <string name="enable_pin" msgid="5422767284133234860">"SIM PIN Kodunu Etkinleştir/Devre Dışı Bırak"</string>
- <string name="change_pin" msgid="9174186126330785343">"SIM PIN Kodunu Değiştir"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"SIM PIN kodu:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"Eski PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"Yeni PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"Yeni PIN kodunu doğrula"</string>
- <string name="badPin" msgid="4154316827946559447">"Yazdığınız eski PIN doğru değil. Lütfen tekrar deneyin."</string>
- <string name="mismatchPin" msgid="5974597541268042785">"Girdiğiniz PIN kodları eşleşmiyor. Lütfen tekrar deneyin."</string>
- <string name="invalidPin" msgid="5981171102258684792">"4 ila 8 haneli bir PIN yazın."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"SIM PIN kodunu devre dışı bırak"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"SIM PIN Kodunu Etkinleştir"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"Lütfen bekleyin..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"SIM PIN kodu etkin"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"SIM PIN kodu devre dışı"</string>
- <string name="pin_failed" msgid="6597695909685242127">"Yazdığınız PIN hatalı"</string>
- <string name="pin_changed" msgid="9000716792724195093">"SIM PIN kodu başarıyla değiştirildi"</string>
- <string name="puk_requested" msgid="3898394204193202803">"Şifre hatalı, SIM kilitlendi! PUK2 isteniyor."</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Eski PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"Yeni PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"Yeni PIN2 kodunu doğrula"</string>
- <string name="badPuk2" msgid="4072035207011308856">"Yazdığınız PUK2 doğru değil. Lütfen tekrar deneyin."</string>
- <string name="badPin2" msgid="515218795152422178">"Yazdığınız eski PIN2 doğru değil. Lütfen tekrar deneyin."</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"Girdiğiniz PIN2 kodları eşleşmiyor. Lütfen tekrar deneyin."</string>
- <string name="invalidPin2" msgid="8237110107480395938">"4 ila 8 haneli bir PIN2 kodu yazın."</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"8 haneli bir PUK2 yazın."</string>
- <string name="pin2_changed" msgid="2670422162555916562">"PIN2 başarıyla değiştirildi"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"PUK2 kodunu yazın"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"Şifre hatalı, lütfen PIN2 kodunu değiştirin ve tekrar deneyin!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"Şifre hatalı, SIM kilitlendi! PUK2 isteniyor."</string>
- <string name="doneButton" msgid="2859593360997984240">"Bitti"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"Konferans görüşmesi <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"Çağrıya dön"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"SIM kart olmadan devam et"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"SIM kart bulunamadı. Lütfen telefona bir SIM kart takın."</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"Kapat"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"Kilit Aç"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"PIN kimlik denetimi yapılıyor..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Sesli mesaj numarası"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"Çevriliyor"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"Tekrar deniyor"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"Geçerli çağrı"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"Konferans görüşmesi"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"Gelen çağrı"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"Cdma çağrısı beklemede"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"Çağrı sonlandırıldı"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"Beklemede"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"Sonlandırılıyor"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"Çağrı halinde"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"Cevapsız çağrı"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Cevapsız çağrılar"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> cevapsız çağrı"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"Cevapsız çağrı: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"Geçerli çağrı (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"Beklemede"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Yeni sesli mesaj"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Yeni sesli mesaj (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Çevir: <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Sesli mesaj numarası bilinmiyor"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"Hizmet yok"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"Seçili ağ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) kullanılamıyor"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"Bir çağrı yapmak için öncelikle Uçak modunu kapatın."</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ağda kayıtlı değil."</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"Mobil ağ kullanılamıyor."</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"Çağrı gönderilmedi. Geçerli numara girilmedi."</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"Çağrı gönderilmedi."</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI dizisi başlatılıyor..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"Özellik kodu dizisi başlatılıyor..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"Desteklenmeyen hizmet."</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"Çağrılar arasında geçiş yapılamıyor."</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"Çağrı ayrılamıyor."</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"Çağrı aktarılamıyor."</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"Çağrılar konferans görüşmesi olarak birleştirilemiyor."</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"Çağrı reddedilemiyor."</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"Çağrılar serbest bırakılamıyor."</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Acil durum çağrısı"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Radyo açılıyor..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"Hizmet alanı dışında, tekrar deneniyor..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"Çağrı gönderilmedi. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> bir acil durum numarası değil!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"Çağrı gönderilmedi. Lütfen bir acil durum numarası çevirin!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Çevirmek için klavyeyi kullan"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"Telefon tuş takımı"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"Tuş takımı"</string>
- <string name="touchLockText" msgid="566824588267376287">"Kilit açmak için"\n"iki kez hafifçe vurun"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"Yanıtlamak için"\n"iki kez hafifçe vurun"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"Reddetmek için"\n"iki kez hafifçe vurun"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"Beklet"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"Devam Et"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"Sonlandır"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Tuş takımı"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"Gizle"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"Hoparlör"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"Sesi Kapat"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"Bluetooth"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"Çağrı ekle"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Çağrıları birleştir"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Değiştir"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"Aramaları yönet"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"Yönet"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"İçe aktar"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"Tümünü içe aktar"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"SIM kişileri içe aktarılıyor"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"Kişilerden içe aktar"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"İşitme cihazları"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"İşitme cihazı uyumluluğunu aç"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY Kapalı"</item>
- <item msgid="3971695875449640648">"TTY Tam"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERI metni"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMF Zil Sesleri"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"DTMF seslerinin uzunluğunu ayarla"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"Normal"</item>
- <item msgid="2883365539347850535">"Uzun"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"Ağ İletisi"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Telefonunuzu aktive edin"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"Telefon hizmetinizin aktive edilmesi için özel bir çağrı yapılması gerekiyor. "\n\n"“Aktive Et”e bastıktan sonra, telefonunuzun aktive edilmesi için sağlanan talimatları dinleyin."</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"Telefonunuzu operatörünüzün mobil ağında etkinleştirecek, böylece arama yapabilmenizi ve mobil veri ağlarına bağlanabilmenizi sağlayacak özel bir arama yapmak için \"Etkinleştir\"e dokunun."</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Etkinleştirme atlansın mı?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Etkinleştirmeyi atlarsanız, arama yapamaz veya mobil veri ağlarına bağlanamazsınız (yine de Kablosuz ağlara bağlanabilirsiniz). Telefonunuzu etkinleştirinceye kadar, telefonu her açışınızda ürünü etkinleştirip etkinleştirmeyeceğiniz sorulur."</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Atla"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"Etkinleştir"</string>
- <string name="ota_activate" msgid="1368528132525626264">"Etkinleştir"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"Telefon aktive edildi!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"Aktivasyon sorunu"</string>
- <string name="ota_listen" msgid="162923839877584937">"Etkinleştirmenin tamamlandığını duyuncaya kadar söylenen talimatları izleyin."</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"Tuş takımı"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"Hoparlör"</string>
- <string name="ota_progress" msgid="4644512049143969504">"Telefonunuz programlanırken lütfen bekleyin."</string>
- <string name="ota_failure" msgid="8600027551822478181">"Programlama Başarısız"</string>
- <string name="ota_successful" msgid="1880780692887077407">"Telefonunuz şimdi aktive edildi. Hizmetin başlaması 15 dakika sürebilir."</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"Telefonunuz aktive edilmedi. "\n"Daha iyi çeken bir yer (pencere kenarı veya dış mekan) bulmanız gerekebilir. "\n\n"Tekrar deneyin veya daha fazla seçenek için müşteri hizmetlerini arayın."</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"AŞIRI SPC HATASI"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"Geri"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"Tekrar dene"</string>
- <string name="ota_next" msgid="3904945374358235910">"İleri"</string>
- <string name="ota_back" msgid="2190038043403850052">"Geri"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"Acil Geri Arama Moduna Girildi"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Acil Geri Arama Modu"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Veri bağlantısı devre dışı bırakıldı"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"<xliff:g id="COUNT">%s</xliff:g> dakika boyunca veri bağlantısı yok"</item>
- <item quantity="other" msgid="3122217344579273583">"<xliff:g id="COUNT">%s</xliff:g> dakika boyunca veri bağlantısı yok"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"Telefonunuz <xliff:g id="COUNT">%s</xliff:g> dakika boyunca acil durumda geri arama modunda olacaktır. Bu moddayken veri bağlantısı kullanan hiçbir uygulama kullanılamaz. Şimdi çıkmak istiyor musunuz?"</item>
- <item quantity="other" msgid="3231879566243957821">"Telefonunuz <xliff:g id="COUNT">%s</xliff:g> dakika boyunca acil durumda geri arama modunda olacaktır. Bu moddayken veri bağlantısı kullanan hiçbir uygulama kullanılamaz. Şimdi çıkmak istiyor musunuz?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"Seçilen işlem, acil durumda geri arama modundayken kullanılamıyor. Telefon <xliff:g id="COUNT">%s</xliff:g> dakika boyunca bu modda kalacak. Şimdi çıkmak istiyor musunuz?"</item>
- <item quantity="other" msgid="3489076611710869904">"Seçilen işlem, acil durumda geri arama modundayken kullanılamıyor. Telefon <xliff:g id="COUNT">%s</xliff:g> dakika boyunca bu modda kalacak. Şimdi çıkmak istiyor musunuz?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"Seçili işlem, acil durum çağrısında kullanılamaz"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"Acil Geri Arama Modundan Çıkılıyor"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"Evet"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"Hayır"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"Kapat"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"Sesli mesaj ayarları"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;ayarlanmadı&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"Sesli mesaj hizmeti"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> için ayarlar"</string>
- <string name="other_settings" msgid="3672912580359716394">"Diğer çağrı ayarları"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"Çevir"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"^1"\n<b>"^2"</b>" aracılığıyla aranıyor"</string>
- <string name="slide_to_answer" msgid="255903188611244476">"Yanıtlamak için sağa sürükleyin"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"Zil programını susturmak için sola sürükleyin"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"Reddetmek için sola sürükleyin"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"Yanıtlamak ve"\n"etkin çağrıyı beklemeye almak için sağa sürükleyin"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"Yanıtlamak ve"\n"etkin çağrıyı sonlandırmak için sağa sürükleyin"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"Yanıtlamak ve"\n"beklemedeki çağrıyı sonlandırmak için sağa sürükleyin"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"Yanıtla"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"Reddet"</string>
-</resources>
diff --git a/phone/res/values-zh-rCN/strings.xml b/phone/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 1e476bb..0000000
--- a/phone/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"联系人"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"收藏"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"拨号器"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"紧急拨号器"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"电话"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"通话记录"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"固定拨号列表"</string>
- <string name="unknown" msgid="6878797917991465859">"未知"</string>
- <string name="private_num" msgid="6713286113000232309">"私人号码"</string>
- <string name="payphone" msgid="1931775086311769314">"公用电话"</string>
- <string name="onHold" msgid="9035493194749959955">"保持"</string>
- <string name="ongoing" msgid="8300874342848721367">"当前通话"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"线路忙"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"网络忙"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"无信号"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"超出 ACM 限制"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"已关闭天线"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"无 SIM 或 SIM 错误"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"不在服务区"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"外拨电话受固定拨号限制。"</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"通话限制启用时,无法拨出电话。"</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"所有通话都受访问控制限制。"</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"急救或报警电话受访问控制限制。"</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"正常通话受访问控制限制。"</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"手机在重启之前处于锁定状态。"</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA:通话已取消。"</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA:通话中断。"</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA:重新排序。"</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA:服务选项拒绝。"</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA:重拨顺序。"</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA:无法接入。"</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA:优先抢占。"</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"只能拨打紧急呼救电话。"</string>
- <string name="confCall" msgid="1904840547188336828">"电话会议"</string>
- <string name="call_lost" msgid="317670617901479594">"通话已中断。"</string>
- <string name="retry" msgid="8462986804300767852">"重拨"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"通话中断"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMI 码已启动"</string>
- <string name="ussdRunning" msgid="485588686340541690">"正在运行 USSD 代码..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMI 码已取消"</string>
- <string name="cancel" msgid="5044513931633602634">"取消"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"免提"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"蓝牙"</string>
- <string name="menu_mute" msgid="4399723633363773145">"静音"</string>
- <string name="menu_hold" msgid="6970441130344786273">"保持"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"结束通话"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"交换通话"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"合并通话"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"添加通话"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"管理电话会议"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"显示拨号键盘"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"隐藏拨号键盘"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"保持当前通话"\n"并接听"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"结束当前通话"\n"并接听"</string>
- <string name="ok" msgid="3811371167865772377">"确定"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"按 MENU 可以选择通话选项。"</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"按 MENU 可以选择通话选项 • 使用键盘拨号"</string>
- <string name="menu_answer" msgid="116686205042231098">"接听"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"忽略"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"发送以下音频?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"正在发送双音频"\n</string>
- <string name="send_button" msgid="4106860097497818751">"发送"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"是"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"否"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"将通配符替换为"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"缺少语音信箱号码"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM 卡上未存储语音信箱号码。"</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"添加号码"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"正在载入..."</string>
- <string name="enterPin" msgid="4753300834213388397">"输入 PIN 码以解锁 SIM 卡。"</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM 已解锁"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"新 SIM 卡 PIN 码"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"再次输入新 SIM 卡 PIN 码予以确认"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"您输入的 SIM 卡 PIN 不匹配,请重试。"</string>
- <string name="enterPuk" msgid="6144749655582862324">"输入 PUK 码以解锁 SIM 卡"</string>
- <string name="badPuk" msgid="3213017898690275965">"PUK 码不正确!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"继续"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"您的 SIM 卡已解锁。正在解锁您的手机..."</string>
- <string name="label_ndp" msgid="780479633159517250">"SIM 网络解锁 PIN"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"解锁"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"关闭"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"正在请求网络解锁..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"网络解锁请求失败。"</string>
- <string name="unlock_success" msgid="6770085622238180152">"网络解锁成功。"</string>
- <string name="imei" msgid="8552502717594321281">"移动通信国际识别码"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"GSM 通话设置"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"CDMA 通话设置"</string>
- <string name="apn_settings" msgid="9043423184895642077">"接入点名称"</string>
- <string name="settings_label" msgid="3876743539816984008">"网络设置"</string>
- <string name="voicemail" msgid="8693759337917898954">"语音信箱"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"语音信箱:"</string>
- <string name="networks" msgid="8873030692174541976">"网络运营商"</string>
- <string name="call_settings" msgid="6112441768261754562">"通话设置"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"其他设置"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"其他仅适用于 GSM 通话的设置"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"其他 CDMA 通话设置"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"仅适用于 CDMA 的其他通话设置"</string>
- <string name="labelNwService" msgid="4699970172021870983">"网络服务设置"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"本机号码"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"外拨电话时隐藏本机号码"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"外拨电话时显示本机号码"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"外拨电话时按照运营商的默认设置来显示本机号码"</string>
- <string name="labelCW" msgid="6120513814915920200">"来电等待"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"在通话期间,通知我有其他来电"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"在通话期间,通知我有其他来电"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"来电转接设置"</string>
- <string name="labelCF" msgid="2574386948026924737">"来电转接"</string>
- <string name="labelCFU" msgid="8147177368148660600">"始终转接"</string>
- <string name="messageCFU" msgid="3560082430662923687">"始终使用此号码"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"转接所有来电"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"将所有来电转接至 {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"未提供电话号码"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"已停用"</string>
- <string name="labelCFB" msgid="218938523102207587">"占线时转接"</string>
- <string name="messageCFB" msgid="3711089705936187129">"占线时的转接号码"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"转接至 {0}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"已停用"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"您的运营商不支持在手机占线时停用呼叫转接功能。"</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"无人接听时转接"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"无人接听时的转接号码"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"转接至 {0}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"已停用"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"您的运营商不支持在手机无人接听时停用呼叫转接功能。"</string>
- <string name="labelCFNRc" msgid="47183615370850000">"无法接通时转接"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"无法接通时的转接号码"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"转接至 {0}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"已停用"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"您的运营商不支持在手机无法接通时停用呼叫转接功能。"</string>
- <string name="updating_title" msgid="6146755386174019046">"通话设置"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"通话设置出错"</string>
- <string name="reading_settings" msgid="1920291699287055284">"正在读取设置..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"正在更新设置..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"正在恢复设置..."</string>
- <string name="response_error" msgid="6674110501330139405">"网络响应异常。"</string>
- <string name="exception_error" msgid="7027667130619518211">"网络或 SIM 卡出错。"</string>
- <string name="radio_off_error" msgid="6717116288405111269">"请先开启无线通信,然后再查看这些设置。"</string>
- <string name="close_dialog" msgid="2365884406356986917">"确定"</string>
- <string name="enable" msgid="1059008390636773574">"启用"</string>
- <string name="disable" msgid="7274240979164762320">"禁用"</string>
- <string name="change_num" msgid="239476305819844391">"更新"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"网络默认设置"</item>
- <item msgid="7876195870037833661">"隐藏号码"</item>
- <item msgid="1108394741608734023">"显示号码"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"保存语音信箱号码"</string>
- <string name="vm_changed" msgid="380744030726254139">"语音信箱号码已更改。"</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"语音信箱号码更改失败。"\n"如果问题依然存在,请与您的运营商联系。"</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"转接号码更改失败。"\n"如果问题依然存在,请与您的运营商联系。"</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"检索和保存当前转接号码设置失败。"\n"您仍然想要切换到新的服务提供商吗?"</string>
- <string name="no_change" msgid="3186040086622435212">"未做任何更改。"</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"选择语音信箱服务"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"我的运营商"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"移动网络设置"</string>
- <string name="label_available" msgid="1181658289009300430">"可用网络"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"正在搜索..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"未找到网络。"</string>
- <string name="search_networks" msgid="1601136049300882441">"搜索网络"</string>
- <string name="network_query_error" msgid="6828516148953325006">"搜索网络时出错。"</string>
- <string name="register_on_network" msgid="9055203954040805084">"正在<xliff:g id="NETWORK">%s</xliff:g>上注册..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"您的 SIM 卡不允许连接到此网络。"</string>
- <string name="connect_later" msgid="500090982903469816">"目前无法连接到此网络。请稍后重试。"</string>
- <string name="registration_done" msgid="495135664535876612">"已在网络上注册。"</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"选择一个网络运营商"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"搜索所有可用网络"</string>
- <string name="select_automatically" msgid="8615980695510888796">"自动选择"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"自动选择首选网络"</string>
- <string name="register_automatically" msgid="6272031189219101172">"自动注册..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"网络模式"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"更改网络运行方式"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"首选网络模式"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"全球"</item>
- <item msgid="3273348576277144124">"仅 EvDo"</item>
- <item msgid="454610224530856274">"CDMA,无 EvDo 功能"</item>
- <item msgid="8928247118825616081">"CDMA/EvDo 自动选择"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA 自动选择"</item>
- <item msgid="5189164180446264504">"仅 WCDMA"</item>
- <item msgid="5714714953966979187">"仅 GSM"</item>
- <item msgid="4775796025725908913">"首选 GSM/WCDMA"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"已启用数据"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"启用移动网络的数据访问功能"</string>
- <string name="roaming" msgid="8871412572928323707">"数据漫游"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"漫游时连接到数据服务"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"漫游时连接到数据服务"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"数据连接已断,因为您已离开本地网络并已关闭数据漫游。"</string>
- <string name="roaming_warning" msgid="7820963598559553967">"是否允许数据漫游?这可能产生大量漫游费!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS 选项"</string>
- <string name="cdma_options" msgid="4016822858172249884">"CDMA 选项"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"数据使用情况"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"运营商流量政策"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"当前时段使用的数据"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"数据使用时段"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"数据传输速率政策"</string>
- <string name="throttle_help" msgid="243651091785169900">"了解详情"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"时段上限为 <xliff:g id="USED_2">%3$s</xliff:g>,当前值为 <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪)"\n"下一个时段从 <xliff:g id="USED_3">%4$d</xliff:g> 天后 (<xliff:g id="USED_4">%5$s</xliff:g>) 开始"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"时段上限为 <xliff:g id="USED_2">%3$s</xliff:g>,当前值为 <xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g>٪)"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"已超过<xliff:g id="USED_0">%1$s</xliff:g>速率上限"\n"数据传输速率已降至 <xliff:g id="USED_1">%2$d</xliff:g> Kb/s。"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"此周期已过去 <xliff:g id="USED_0">%1$d</xliff:g>٪"\n"下一个时段将从 <xliff:g id="USED_1">%2$d</xliff:g> 天后 (<xliff:g id="USED_2">%3$s</xliff:g>) 开始"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"如果超过了流量上限,则数据传输速率会降至 <xliff:g id="USED">%1$d</xliff:g> Kb/s"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"有关您运营商的移动网络数据使用政策的详情"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"小区广播短信"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"小区广播短信"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"小区广播短信"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"已启用小区广播短信"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"已停用小区广播短信"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"小区广播短信设置"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"紧急广播"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"已启用紧急广播"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"已停用紧急广播"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"管理"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"已启用管理"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"已停用管理"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"维护"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"已启用维护"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"已停用维护"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"普通资讯"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"商务和财经资讯"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"体育资讯"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"娱乐资讯"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"本地"</string>
- <string name="local_enable" msgid="6370463247609136359">"已启用本地资讯"</string>
- <string name="local_disable" msgid="4405691986943795798">"已停用本地资讯"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"地方性"</string>
- <string name="regional_enable" msgid="4434680415437834759">"已启用地方资讯"</string>
- <string name="regional_disable" msgid="5359325527213850077">"已停用地方资讯"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"国内"</string>
- <string name="national_enable" msgid="1172443648912246952">"已启用国内资讯"</string>
- <string name="national_disable" msgid="326018148178601166">"已停用国内资讯"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"国际"</string>
- <string name="international_enable" msgid="5855356769925044927">"已启用国际资讯"</string>
- <string name="international_disable" msgid="2850648591041088931">"已停用国际资讯"</string>
- <string name="list_language_title" msgid="2841683501919760043">"语言"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"选择资讯语言"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"英语"</item>
- <item msgid="1151988412809572526">"法语"</item>
- <item msgid="577840534704312665">"西班牙语"</item>
- <item msgid="8385712091143148180">"日语"</item>
- <item msgid="1858401628368130638">"韩语"</item>
- <item msgid="1933212028684529632">"中文"</item>
- <item msgid="1908428006803639064">"希伯来语"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"语言"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"本地天气"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"已启用本地天气预报"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"已停用本地天气预报"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"区域路况报告"</string>
- <string name="atr_enable" msgid="5541757457789181799">"已启用区域路况报导"</string>
- <string name="atr_disable" msgid="7085558154727596455">"已停用区域路况报导"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"本地机场航班时刻表"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"已启用本地机场航班时刻表"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"已停用本地机场航班时刻表"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"餐馆"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"已启用餐馆信息"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"已停用餐馆信息"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"房屋租赁信息"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"已启用房屋租赁信息"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"已停用房屋租赁信息"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"零售目录"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"已启用零售店名录"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"已停用零售店名录"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"广告"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"已启用广告"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"已停用广告"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"股票报价"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"已启用股票报价"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"已停用股票价格"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"招聘信息"</string>
- <string name="eo_enable" msgid="8623559062015685813">"已启用招聘信息"</string>
- <string name="eo_disable" msgid="3863812478090907609">"已停用招聘信息"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"医疗、保健和医院"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"已启用医疗、保健和医院信息"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"已停用医疗、保健和医院信息"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"技术资讯"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"已启用技术资讯"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"已停用技术资讯"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"多类别"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"已启用多类别"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"已停用多类别"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"GSM/UMTS 网络偏好设置"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"尚未实现!"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"GSM/UMTS 网络偏好设置"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA(自动模式)"</item>
- <item msgid="8912042051809329533">"仅 WCDMA"</item>
- <item msgid="8776934131146642662">"仅 GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA(首选 WCDMA)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"仅使用 2G 网络"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"省电"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"系统选择"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"更改 CDMA 漫游模式"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"系统选择"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"仅本网"</item>
- <item msgid="1205664026446156265">"自动"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMA 漫游模式"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"更改 CDMA 漫游模式"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMA 漫游模式"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"仅本地网络"</item>
- <item msgid="8174642753290624634">"附属网络"</item>
- <item msgid="2241951431403168661">"任何网络"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"CDMA 网络偏好设置"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"尚未实现!"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"CDMA 网络偏好设置"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"仅 CDMA"</item>
- <item msgid="2683555124647197574">"仅 EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"CDMA 订阅测试"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"在 RUIM/SIM 和 NV 之间进行切换"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"订阅"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"固定拨号"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"固定拨号列表"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"激活固定拨号"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"已启用固定拨号"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"已停用固定拨号"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"启用固定拨号"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"禁用固定拨号"</string>
- <string name="change_pin2" msgid="2153563695382176676">"更改 PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"禁用固定拨号"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"启用固定拨号"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"管理固定拨号"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"更改为访问固定拨号设置的 PIN"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"管理手机号码列表"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"语音隐私权"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"启用增强型隐秘模式"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTY 模式"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"启用 TTY 模式"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTY 模式"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"设置 TTY 模式"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"自动重拨"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"启用自动重拨模式"</string>
- <string name="menu_add" msgid="1882023737425114762">"添加联系人"</string>
- <string name="menu_edit" msgid="7143003705504672374">"编辑联系人"</string>
- <string name="menu_delete" msgid="3977150783449642851">"删除联系人"</string>
- <string name="get_pin2" msgid="1198225482542827652">"输入 PIN2"</string>
- <string name="name" msgid="7329028332786872378">"名称"</string>
- <string name="number" msgid="7905950798349903858">"号码"</string>
- <string name="save" msgid="4094274636321939086">"保存"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"添加固定拨号联系人"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"正在添加固定拨号联系人..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"已添加固定拨号联系人。"</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"编辑固定拨号联系人"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"正在更新固定拨号联系人..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"已更新固定拨号联系人。"</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"删除固定拨号联系人"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"正在删除固定拨号联系人..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"已删除固定拨号联系人。"</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN 未更新:您输入的 PIN 有误。"</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN 未更新:号码不得超过 20 位。"</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"正在从 SIM 卡读取..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"SIM 卡上无联系人。"</string>
- <string name="simContacts_title" msgid="1861472842524839921">"选择要导入的联系人"</string>
- <string name="enable_pin" msgid="5422767284133234860">"启用/禁用 SIM 卡 PIN"</string>
- <string name="change_pin" msgid="9174186126330785343">"更改 SIM 卡 PIN"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"SIM 卡 PIN:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"旧 PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"新 PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"确认新 PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"您输入的旧 PIN 不正确,请重试。"</string>
- <string name="mismatchPin" msgid="5974597541268042785">"您输入的 PIN 不匹配,请重试。"</string>
- <string name="invalidPin" msgid="5981171102258684792">"输入 4 到 8 位数字的 PIN。"</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"停用 SIM 卡 PIN"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"启用 SIM 卡 PIN"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"请稍候..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"已启用 SIM 卡 PIN"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"已停用 SIM 卡 PIN"</string>
- <string name="pin_failed" msgid="6597695909685242127">"您输入的 PIN 不正确"</string>
- <string name="pin_changed" msgid="9000716792724195093">"已成功更改 SIM 卡 PIN"</string>
- <string name="puk_requested" msgid="3898394204193202803">"密码不正确,SIM 已锁定!需要 PUK2。"</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"旧 PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"新 PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"确认新 PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"您输入的 PUK2 不正确,请重试。"</string>
- <string name="badPin2" msgid="515218795152422178">"您输入的旧 PIN2 不正确,请重试。"</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"您输入的 PIN2 不匹配,请重试。"</string>
- <string name="invalidPin2" msgid="8237110107480395938">"输入 4 到 8 位数字的 PIN2。"</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"输入 8 位数字的 PUK2。"</string>
- <string name="pin2_changed" msgid="2670422162555916562">"已成功更改 PIN2"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"输入 PUK2 码"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"密码不正确,请更改 PIN2 并重试!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"密码不正确,SIM 已锁定!需要 PUK2。"</string>
- <string name="doneButton" msgid="2859593360997984240">"完成"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"电话会议<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"返回通话"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"无 SIM 卡时继续"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"未找到 SIM 卡。请将 SIM 卡插入手机中。"</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"关闭"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"解锁"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"正在验证 PIN..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"语音信箱号码"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"正在拨号"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"正在重拨"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"当前通话"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"电话会议"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"来电"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"CDMA 来电等待"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"通话结束"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"保持"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"正在挂断"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"正在通话"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"未接电话"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"未接电话"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 个未接电话"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"来自<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>的未接电话"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"当前通话 (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"保持"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"新语音邮件"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"新语音邮件 (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"拨打 <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"语音信箱号码未知"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"无服务"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"所选网络(<xliff:g id="OPERATOR_NAME">%s</xliff:g>)不可用"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"要进行呼叫,请先关闭飞行模式。"</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"尚未注册网络。"</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"无法访问移动网络"</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"拨号未送出,因为输入的号码无效。"</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"拨号未送出。"</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"正在启动 MMI 序列..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"正在启动功能代码序列..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"不支持此服务。"</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"无法切换通话。"</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"无法分离通话。"</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"无法转移呼叫。"</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"无法进行电话会议。"</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"无法拒绝呼叫。"</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"无法挂断。"</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"紧急呼救"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"正在打开天线..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"不在服务区,正在重试..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"电话未拨出,因为 <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> 不是紧急呼救号码!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"电话未拨出,请拨打紧急呼救电话!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"使用键盘拨号"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"按键式键盘"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"拨号键盘"</string>
- <string name="touchLockText" msgid="566824588267376287">"轻击两下"\n"解锁"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"点按两次"\n"可接听"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"点按两次"\n"可拒绝"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"等待"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"恢复"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"挂断"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"拨号键盘"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"隐藏"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"免提"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"静音"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"蓝牙"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"添加通话"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"合并通话"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"交换"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"管理通话"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"管理"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"导入"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"全部导入"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"正在导入 SIM 联系人"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"从联系人导入"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"助听器"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"启用助听器兼容模式"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY 已停用"</item>
- <item msgid="3971695875449640648">"TTY 已满"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERI 文字"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMF 音"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"设置 DTMF 音长度"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"正常"</item>
- <item msgid="2883365539347850535">"长"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"网络讯息"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"激活您的手机"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"需要拨打特别号码才能激活您的手机服务。"\n\n"在按下“激活”后,按照语音提示激活您的手机。"</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"触摸“激活”将拨出特殊呼叫,在运营商的移动网络中激活您的手机,这样您就可拨打电话和连接移动数据网络了。"</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"略过激活步骤?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"如果您略过激活步骤,就无法拨打电话或连接到移动数据网络(不过您可以连接到 Wi-Fi 网络)。如果您不激活手机,每次开机时都会收到激活提示。"</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"略过"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"激活"</string>
- <string name="ota_activate" msgid="1368528132525626264">"激活"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"手机已激活!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"激活时遇到问题"</string>
- <string name="ota_listen" msgid="162923839877584937">"按照语音提示操作,直至提示手机已激活。"</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"键盘"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"免提"</string>
- <string name="ota_progress" msgid="4644512049143969504">"正在向您的手机中写入程序,请耐心等待。"</string>
- <string name="ota_failure" msgid="8600027551822478181">"编程失败"</string>
- <string name="ota_successful" msgid="1880780692887077407">"您的手机已激活。最多 15 分钟即可开始使用服务。"</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"您的手机尚未激活。"\n"您可能需要找一个手机信号更好的位置(窗户附近或室外)。"\n\n"再试一次,或呼叫客户服务中心寻求更多解决方法。"</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"SPC 故障太多"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"上一步"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"重试"</string>
- <string name="ota_next" msgid="3904945374358235910">"下一步"</string>
- <string name="ota_back" msgid="2190038043403850052">"上一步"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"已进入紧急回拨模式"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"紧急回拨模式"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"数据连接已停用"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"持续 <xliff:g id="COUNT">%s</xliff:g> 分钟没有数据连接"</item>
- <item quantity="other" msgid="3122217344579273583">"持续 <xliff:g id="COUNT">%s</xliff:g> 分钟没有数据连接"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"手机将持续 <xliff:g id="COUNT">%s</xliff:g> 分钟处于紧急回拨模式。在此模式下,无法使用正在进行数据连接的应用程序。要立即退出吗?"</item>
- <item quantity="other" msgid="3231879566243957821">"手机将持续 <xliff:g id="COUNT">%s</xliff:g> 分钟处于紧急回拨模式。在此模式下,无法使用正在进行数据连接的应用程序。要立即退出吗?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"无法在紧急回拨模式下执行所选操作。手机会在此模式下持续 <xliff:g id="COUNT">%s</xliff:g> 分钟。要立即退出吗?"</item>
- <item quantity="other" msgid="3489076611710869904">"无法在紧急回拨模式下执行所选操作。手机会在此模式下持续 <xliff:g id="COUNT">%s</xliff:g> 分钟。要立即退出吗?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"紧急呼救时您所选的操作无法执行"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"正在退出紧急回拨模式"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"是"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"否"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"关闭"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"语音信箱设置"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;未设置&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"语音信箱服务"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>的设置"</string>
- <string name="other_settings" msgid="3672912580359716394">"其他通话设置"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"拨打"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"通过 ^1"\n<b>"^2"</b>" 呼叫"</string>
- <string name="slide_to_answer" msgid="255903188611244476">"向右拖动以接听"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"向左拖动以使振铃器静音"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"向左拖动以拒绝"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"向右拖动以接听并"\n"保持当前通话"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"向右拖动以接听并"\n"结束当前通话"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"向右拖动以接听并"\n"结束保持的通话"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"接听"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"拒绝"</string>
-</resources>
diff --git a/phone/res/values-zh-rTW/strings.xml b/phone/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 1a48a7e..0000000
--- a/phone/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="contactsIconLabel" msgid="9129800048701196916">"聯絡人"</string>
- <string name="contactsFavoritesLabel" msgid="5360050972935451505">"我的最愛"</string>
- <string name="dialerIconLabel" msgid="1761864493312440268">"撥號"</string>
- <string name="emergencyDialerIconLabel" msgid="7812140032168171053">"緊急撥號"</string>
- <string name="phoneIconLabel" msgid="2331230813161304895">"電話"</string>
- <string name="recentCallsIconLabel" msgid="8717350893637245164">"通話記錄"</string>
- <string name="fdnListLabel" msgid="8630418672279521003">"固定撥號清單"</string>
- <string name="unknown" msgid="6878797917991465859">"不明"</string>
- <string name="private_num" msgid="6713286113000232309">"私人號碼"</string>
- <string name="payphone" msgid="1931775086311769314">"公共電話"</string>
- <string name="onHold" msgid="9035493194749959955">"通話保留"</string>
- <string name="ongoing" msgid="8300874342848721367">"目前通話"</string>
- <string name="callFailed_userBusy" msgid="8851106999809294904">"線路忙碌中"</string>
- <string name="callFailed_congestion" msgid="8737761615702718375">"網路忙碌"</string>
- <string name="callFailed_noSignal" msgid="1889803273616031933">"沒有訊號"</string>
- <string name="callFailed_limitExceeded" msgid="4958065157970101491">"已達 ACM 限制"</string>
- <string name="callFailed_powerOff" msgid="2766035859391549713">"無線通訊關閉"</string>
- <string name="callFailed_simError" msgid="5652345589458834655">"沒有 SIM 或 SIM 錯誤"</string>
- <string name="callFailed_outOfService" msgid="4825791466557236225">"超出服務範圍"</string>
- <string name="callFailed_fdn_only" msgid="2850204579765430641">"撥出受固定撥號限制。"</string>
- <string name="callFailed_cb_enabled" msgid="3057131228725500761">"通話限制啟用時,無法撥出電話。"</string>
- <string name="callFailed_dsac_restricted" msgid="2180223622768522345">"所有通話都受存取控制限制。"</string>
- <string name="callFailed_dsac_restricted_emergency" msgid="4353654268813314466">"緊急通話受存取控制限制。"</string>
- <string name="callFailed_dsac_restricted_normal" msgid="2680774510252408620">"正常通話受存取控制限制。"</string>
- <string name="callFailed_cdma_lockedUntilPowerCycle" msgid="775483211928061084">"CDMA:重新開機前鎖定手機。"</string>
- <string name="callFailed_cdma_drop" msgid="6030084920001082496">"CDMA:撥號中斷。"</string>
- <string name="callFailed_cdma_intercept" msgid="8402269373120277330">"CDMA:通話遭攔截。"</string>
- <string name="callFailed_cdma_reorder" msgid="5605791471418711552">"CDMA:重新排序。"</string>
- <string name="callFailed_cdma_SO_reject" msgid="8969174256492763555">"CDMA:拒絕服務選項。"</string>
- <string name="callFailed_cdma_retryOrder" msgid="5848488692485148804">"CDMA:重試命令。"</string>
- <string name="callFailed_cdma_accessFailure" msgid="2844306027616452215">"CDMA:無法開啟。"</string>
- <string name="callFailed_cdma_preempted" msgid="1097095321180029879">"CDMA:已預先佔用。"</string>
- <string name="callFailed_cdma_notEmergency" msgid="2347377816822720761">"僅能撥打緊急電話。"</string>
- <string name="confCall" msgid="1904840547188336828">"多方通話"</string>
- <string name="call_lost" msgid="317670617901479594">"電話已斷線。"</string>
- <string name="retry" msgid="8462986804300767852">"重試"</string>
- <string name="call_lost_title" msgid="6696949678847938515">"斷線"</string>
- <string name="mmiStarted" msgid="6347869857061147003">"MMI 碼開始執行"</string>
- <string name="ussdRunning" msgid="485588686340541690">"USSD 碼執行中..."</string>
- <string name="mmiCancelled" msgid="2771923949751842276">"MMI 碼已取消"</string>
- <string name="cancel" msgid="5044513931633602634">"取消"</string>
- <string name="menu_speaker" msgid="6069700688651964705">"喇叭"</string>
- <string name="menu_bluetooth" msgid="8842523654717305695">"藍牙"</string>
- <string name="menu_mute" msgid="4399723633363773145">"靜音"</string>
- <string name="menu_hold" msgid="6970441130344786273">"保留"</string>
- <string name="menu_endCall" msgid="2142958047156634241">"結束通話"</string>
- <string name="menu_swapCalls" msgid="1548647524816600795">"切換通話"</string>
- <string name="menu_mergeCalls" msgid="6414754941392181303">"合併通話"</string>
- <string name="menu_addCall" msgid="7829255032442131930">"新增通話"</string>
- <string name="menu_manageConference" msgid="3770984362002266733">"管理多方通話"</string>
- <string name="menu_showDialpad" msgid="5198200217528406980">"顯示撥號面板"</string>
- <string name="menu_hideDialpad" msgid="2733813546746296771">"隱藏撥號面板"</string>
- <string name="menu_answerAndHold" msgid="8830891495953688905">"保留目前通話"\n"並接聽"</string>
- <string name="menu_answerAndEnd" msgid="2071708281281611854">"結束目前通話"\n"並接聽"</string>
- <string name="ok" msgid="3811371167865772377">"確定"</string>
- <string name="menuButtonHint" msgid="4853215496220101699">"按下 [Menu] 開啟通話選項。"</string>
- <string name="menuButtonKeyboardDialHint" msgid="2869270434715312458">"按一下 [Menu] 開啟通話選項•使用鍵盤撥號"</string>
- <string name="menu_answer" msgid="116686205042231098">"接聽"</string>
- <string name="menu_ignore" msgid="2112030835852537344">"忽略"</string>
- <string name="wait_prompt_str" msgid="7601815427707856238">"傳送此鈴聲?"\n</string>
- <string name="pause_prompt_str" msgid="341477243019906241">"正在傳送信號音"\n</string>
- <string name="send_button" msgid="4106860097497818751">"傳送"</string>
- <string name="pause_prompt_yes" msgid="3564467212025151797">"是"</string>
- <string name="pause_prompt_no" msgid="6686238803236884877">"否"</string>
- <string name="wild_prompt_str" msgid="1585989144582892543">"取代萬用字元為"</string>
- <string name="no_vm_number" msgid="4164780423805688336">"遺失語音信箱號碼"</string>
- <string name="no_vm_number_msg" msgid="1300729501030053828">"SIM 卡中未儲存語音信箱號碼。"</string>
- <string name="add_vm_number_str" msgid="4676479471644687453">"新增號碼"</string>
- <string name="dialer_emptyListWorking" msgid="6022498519770859790">"載入中..."</string>
- <string name="enterPin" msgid="4753300834213388397">"輸入 PIN 碼以解鎖 SIM 卡。"</string>
- <string name="pinUnlocked" msgid="3260617001055506794">"SIM 已解鎖"</string>
- <string name="enterNewPin" msgid="5311243769004752401">"新增 SIM PIN 碼"</string>
- <string name="verifyNewPin" msgid="2593629913010458867">"再次輸入新的 SIM PIN 碼以確認"</string>
- <string name="verifyFailed" msgid="3875778795754857903">"您輸入的 SIM PIN 不符合。請再試一次。"</string>
- <string name="enterPuk" msgid="6144749655582862324">"輸入 PUK 碼以解鎖 SIM 卡"</string>
- <string name="badPuk" msgid="3213017898690275965">"錯誤的 PUK 碼!"</string>
- <string name="buttonTxtContinue" msgid="863271214384739936">"繼續"</string>
- <string name="puk_unlocked" msgid="2284912838477558454">"您的 SIM 卡已解鎖。正在解鎖手機中..."</string>
- <string name="label_ndp" msgid="780479633159517250">"SIM 網路解鎖 PIN"</string>
- <string name="sim_ndp_unlock_text" msgid="683628237760543009">"解除鎖定"</string>
- <string name="sim_ndp_dismiss_text" msgid="1604823375752456947">"關閉"</string>
- <string name="requesting_unlock" msgid="6412629401033249351">"要求解鎖網路中..."</string>
- <string name="unlock_failed" msgid="6490531697031504225">"網路解鎖失敗。"</string>
- <string name="unlock_success" msgid="6770085622238180152">"網路解鎖成功。"</string>
- <string name="imei" msgid="8552502717594321281">"IMEI"</string>
- <string name="meid" msgid="66004808679046045">"MEID"</string>
- <string name="labelGSMMore" msgid="5930842194056092106">"GSM 通話設定"</string>
- <string name="labelCDMAMore" msgid="1630676740428229339">"CDMA 通話設定"</string>
- <string name="apn_settings" msgid="9043423184895642077">"存取點名稱 (APN)"</string>
- <string name="settings_label" msgid="3876743539816984008">"網路設定"</string>
- <string name="voicemail" msgid="8693759337917898954">"語音信箱"</string>
- <string name="voicemail_abbreviated" msgid="2215592488517217448">"語音信箱:"</string>
- <string name="networks" msgid="8873030692174541976">"電信業者"</string>
- <string name="call_settings" msgid="6112441768261754562">"通話設定"</string>
- <string name="additional_gsm_call_settings" msgid="1391795981938800617">"其他設定"</string>
- <string name="sum_gsm_call_settings" msgid="4076647190996778012">"其他 GSM 僅限通話設定"</string>
- <string name="additional_cdma_call_settings" msgid="8628958775721886909">"其他 CDMA 通話設定"</string>
- <string name="sum_cdma_call_settings" msgid="284753265979035549">"其他 CDMA 僅限通話設定"</string>
- <string name="labelNwService" msgid="4699970172021870983">"網路服務設定"</string>
- <string name="labelCallerId" msgid="3888899447379069198">"本機號碼"</string>
- <string name="sum_hide_caller_id" msgid="1071407020290873782">"隱藏本機號碼"</string>
- <string name="sum_show_caller_id" msgid="6768534125447290401">"撥出電話時顯示本機號碼"</string>
- <string name="sum_default_caller_id" msgid="1954518825510901365">"使用預設值,在撥出電話時顯示本機號碼"</string>
- <string name="labelCW" msgid="6120513814915920200">"來電待接"</string>
- <string name="sum_cw_enabled" msgid="8083061901633671397">"通話時如有來電請通知我"</string>
- <string name="sum_cw_disabled" msgid="3648693907300104575">"通話時如有來電請通知我"</string>
- <string name="call_forwarding_settings" msgid="3378927671091537173">"來電轉接設定"</string>
- <string name="labelCF" msgid="2574386948026924737">"來電轉接"</string>
- <string name="labelCFU" msgid="8147177368148660600">"永遠轉接"</string>
- <string name="messageCFU" msgid="3560082430662923687">"永遠使用此號碼"</string>
- <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"轉接所有來電"</string>
- <string name="sum_cfu_enabled" msgid="956178654350554451">"轉接所有來電到 {0}"</string>
- <string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"號碼無法使用"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"停用"</string>
- <string name="labelCFB" msgid="218938523102207587">"忙線時轉接"</string>
- <string name="messageCFB" msgid="3711089705936187129">"忙線時轉接號碼"</string>
- <string name="sum_cfb_enabled" msgid="2501948432392255856">"轉接到 \\\\{0\\\\}"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"停用"</string>
- <string name="disable_cfb_forbidden" msgid="4524424437001441832">"您的電信業者不支援於手機通話中停用轉接功能。"</string>
- <string name="labelCFNRy" msgid="3646316323834351390">"未接聽時轉接"</string>
- <string name="messageCFNRy" msgid="672317899884380374">"未接聽時的轉接號碼"</string>
- <string name="sum_cfnry_enabled" msgid="3473526018876802076">"轉接到 \\\\{0\\\\}"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"停用"</string>
- <string name="disable_cfnry_forbidden" msgid="7041605706777677935">"您的電信業者不支援於手機未接聽時停用轉接功能。"</string>
- <string name="labelCFNRc" msgid="47183615370850000">"未能接通時轉接"</string>
- <string name="messageCFNRc" msgid="6380695421020295119">"無法接通時的轉接號碼"</string>
- <string name="sum_cfnrc_enabled" msgid="3528648673654636587">"轉接到 \\\\{0\\\\}"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"停用"</string>
- <string name="disable_cfnrc_forbidden" msgid="1093527570652781997">"您的電信業者不支援於手機無收訊時停用轉接功能。"</string>
- <string name="updating_title" msgid="6146755386174019046">"通話設定"</string>
- <string name="error_updating_title" msgid="7970259216988931777">"通話設定錯誤"</string>
- <string name="reading_settings" msgid="1920291699287055284">"讀取設定中..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"更新設定中..."</string>
- <string name="reverting_settings" msgid="4752151682666912828">"正在還原設定..."</string>
- <string name="response_error" msgid="6674110501330139405">"網路傳回非預期回應。"</string>
- <string name="exception_error" msgid="7027667130619518211">"網路或 SIM 卡錯誤。"</string>
- <string name="radio_off_error" msgid="6717116288405111269">"檢視設定前,請先開啟無線通訊。"</string>
- <string name="close_dialog" msgid="2365884406356986917">"確定"</string>
- <string name="enable" msgid="1059008390636773574">"啟用"</string>
- <string name="disable" msgid="7274240979164762320">"停用"</string>
- <string name="change_num" msgid="239476305819844391">"更新"</string>
- <string-array name="clir_display_values">
- <item msgid="5560134294467334594">"網路預設值"</item>
- <item msgid="7876195870037833661">"隱藏號碼"</item>
- <item msgid="1108394741608734023">"顯示號碼"</item>
- </string-array>
- <string name="vm_save_number" msgid="4579969432544566719">"儲存語音信箱號碼"</string>
- <string name="vm_changed" msgid="380744030726254139">"語音信箱號碼已變更。"</string>
- <string name="vm_change_failed" msgid="6912718596496220653">"語音信箱號碼變更失敗。"\n"如果問題持續發生,請與您的行動通訊業者聯絡。"</string>
- <string name="fw_change_failed" msgid="4437005899675054038">"轉接號碼變更失敗。"\n"如果問題持續發生,請與您的行動通訊業者聯絡。"</string>
- <string name="fw_get_in_vm_failed" msgid="6776365552098929353">"無法擷取與儲存目前的轉接號碼設定。"\n"您仍要轉換至新的供應商嗎?"</string>
- <string name="no_change" msgid="3186040086622435212">"未變更設定。"</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"選擇語音信箱服務"</string>
- <string name="voicemail_default" msgid="5902099213882352338">"我的服務業者"</string>
- <string name="mobile_networks" msgid="5540397602919106177">"行動網路設定"</string>
- <string name="label_available" msgid="1181658289009300430">"可用網路"</string>
- <string name="load_networks_progress" msgid="5230707536168902952">"搜尋中..."</string>
- <string name="empty_networks_list" msgid="4249426905018815316">"找不到網路。"</string>
- <string name="search_networks" msgid="1601136049300882441">"搜尋網路"</string>
- <string name="network_query_error" msgid="6828516148953325006">"搜尋網路時發生錯誤。"</string>
- <string name="register_on_network" msgid="9055203954040805084">"正在註冊 <xliff:g id="NETWORK">%s</xliff:g>..."</string>
- <string name="not_allowed" msgid="3540496123717833833">"您的 SIM 卡不允許連接此網路。"</string>
- <string name="connect_later" msgid="500090982903469816">"目前無法連線到這個網路,請稍候再試。"</string>
- <string name="registration_done" msgid="495135664535876612">"註冊網路成功。"</string>
- <string name="sum_carrier_select" msgid="6526225502314751575">"選取電信業者"</string>
- <string name="sum_search_networks" msgid="2921092249873272715">"搜尋所有可用網路"</string>
- <string name="select_automatically" msgid="8615980695510888796">"自動選取"</string>
- <string name="sum_select_automatically" msgid="8460954604521755275">"自動選取喜好網路"</string>
- <string name="register_automatically" msgid="6272031189219101172">"自動註冊..."</string>
- <string name="preferred_network_mode_title" msgid="8873246565334559308">"網路模式"</string>
- <string name="preferred_network_mode_summary" msgid="1434820673166126609">"變更網路操作模式"</string>
- <string name="preferred_network_mode_dialogtitle" msgid="8176355237105593793">"優先網路模式"</string>
- <string-array name="preferred_network_mode_choices">
- <item msgid="2987674222882365152">"全球"</item>
- <item msgid="3273348576277144124">"僅限 EvDo"</item>
- <item msgid="454610224530856274">"CDMA (不具 EvDo)"</item>
- <item msgid="8928247118825616081">"CDMA/EvDo 自動切換"</item>
- <item msgid="8595462903294812666">"GSM/WCDMA 自動切換"</item>
- <item msgid="5189164180446264504">"僅限 WCDMA"</item>
- <item msgid="5714714953966979187">"僅限 GSM"</item>
- <item msgid="4775796025725908913">"GSM/WCDMA 優先"</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item msgid="7164534877603905916">"7"</item>
- <item msgid="2520921432080278213">"6"</item>
- <item msgid="4978887990900575049">"5"</item>
- <item msgid="6891436459357445885">"4"</item>
- <item msgid="339825043192186272">"3"</item>
- <item msgid="3062641619893382241">"2"</item>
- <item msgid="2494009747968041784">"1"</item>
- <item msgid="2568449734331711605">"0"</item>
- </string-array>
- <string name="data_enabled" msgid="5972538663568715366">"已啟用資料"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"啟用 Google 行動服務網路的資料存取"</string>
- <string name="roaming" msgid="8871412572928323707">"資料漫遊"</string>
- <string name="roaming_enable" msgid="7331106985174381987">"漫遊時連線到資料傳輸服務"</string>
- <string name="roaming_disable" msgid="1843417228755568110">"漫遊時連線到資料傳輸服務"</string>
- <string name="roaming_reenable_message" msgid="6973894869473170666">"由於您不在主要網路蓋涵範圍,而且已關閉資料傳輸漫遊服務,資料連線已中斷。"</string>
- <string name="roaming_warning" msgid="7820963598559553967">"要允許資料漫遊嗎?您可能會需要支付龐大漫遊費用!"</string>
- <string name="gsm_umts_options" msgid="6538311689850981686">"GSM/UMTS 選項"</string>
- <string name="cdma_options" msgid="4016822858172249884">"CDMA 選項"</string>
- <string name="throttle_data_usage" msgid="3715677828160555808">"資料用量"</string>
- <string name="throttle_settings_title" msgid="2761975408383706589">"行動業者資料傳輸政策"</string>
- <string name="throttle_current_usage" msgid="8762280193043815361">"目前週期已使用的資料量"</string>
- <string name="throttle_time_frame" msgid="1915198770363734685">"資料使用量週期"</string>
- <string name="throttle_rate" msgid="4710388992676803508">"資料傳輸速率政策"</string>
- <string name="throttle_help" msgid="243651091785169900">"瞭解更多資訊"</string>
- <string name="throttle_status_subtext" msgid="1657318943142085170">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %),週期上限為 <xliff:g id="USED_2">%3$s</xliff:g>"\n"下一週期會在 <xliff:g id="USED_3">%4$d</xliff:g> 天內開始 (<xliff:g id="USED_4">%5$s</xliff:g>)"</string>
- <string name="throttle_data_usage_subtext" msgid="6029276011123694701">"<xliff:g id="USED_0">%1$s</xliff:g> (<xliff:g id="USED_1">%2$d</xliff:g> %),週期上限為 <xliff:g id="USED_2">%3$s</xliff:g>"</string>
- <string name="throttle_data_rate_reduced_subtext" msgid="7492763592720107737">"已達 <xliff:g id="USED_0">%1$s</xliff:g> 上限"\n"資料速率降低至 <xliff:g id="USED_1">%2$d</xliff:g> Kb/s"</string>
- <string name="throttle_time_frame_subtext" msgid="7732763021560399960">"已經過 <xliff:g id="USED_0">%1$d</xliff:g> % 的循環週期"\n"下一週期會在 <xliff:g id="USED_1">%2$d</xliff:g> 天內開始 (<xliff:g id="USED_2">%3$s</xliff:g>)"</string>
- <string name="throttle_rate_subtext" msgid="2149102656120726855">"若已達資料用量上限,資料傳輸速率會降低至 <xliff:g id="USED">%1$d</xliff:g> Kb/秒"</string>
- <string name="throttle_help_subtext" msgid="5217706521499010816">"更多有關行動業者行動網路資料使用政策的資訊"</string>
- <string name="cdma_cell_broadcast_sms" msgid="7898475142527341808">"區域廣播簡訊"</string>
- <string name="cell_broadcast_sms" msgid="5584192824053625842">"區域廣播簡訊"</string>
- <string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"區域廣播簡訊"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"已啟用區域廣播簡訊"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"已停用區域廣播簡訊"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"區域廣播簡訊設定"</string>
- <string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"緊急廣播"</string>
- <string name="emergency_broadcast_enable" msgid="2645980025414010211">"已啟用緊急廣播"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"已停用緊急廣播"</string>
- <string name="enable_disable_administrative" msgid="6501582322182059412">"管理資訊"</string>
- <string name="administrative_enable" msgid="1750086122962032235">"已啟用管理資訊"</string>
- <string name="administrative_disable" msgid="8433273857248698539">"已停用管理資訊"</string>
- <string name="enable_disable_maintenance" msgid="1819693083025106678">"維護資訊"</string>
- <string name="maintenance_enable" msgid="8566636458770971189">"啟用維護資訊"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"已停用維護資訊"</string>
- <string name="general_news_settings" msgid="4968779723948432978">"一般新聞"</string>
- <string name="bf_news_settings" msgid="3935593091894685267">"財經新聞"</string>
- <string name="sports_news_settings" msgid="7649399631270052835">"運動新聞"</string>
- <string name="entertainment_news_settings" msgid="5051153952959405035">"娛樂新聞"</string>
- <string name="enable_disable_local" msgid="7890281063123416120">"當地"</string>
- <string name="local_enable" msgid="6370463247609136359">"已啟用當地新聞"</string>
- <string name="local_disable" msgid="4405691986943795798">"已停用當地新聞"</string>
- <string name="enable_disable_regional" msgid="4905652414535565872">"區域"</string>
- <string name="regional_enable" msgid="4434680415437834759">"已啟用地區新聞"</string>
- <string name="regional_disable" msgid="5359325527213850077">"已停用地區新聞"</string>
- <string name="enable_disable_national" msgid="236278090206880734">"國內"</string>
- <string name="national_enable" msgid="1172443648912246952">"已啟用國內新聞"</string>
- <string name="national_disable" msgid="326018148178601166">"已停用國內新聞"</string>
- <string name="enable_disable_international" msgid="7535348799604565592">"國際"</string>
- <string name="international_enable" msgid="5855356769925044927">"已啟用國際新聞"</string>
- <string name="international_disable" msgid="2850648591041088931">"已停用國際新聞"</string>
- <string name="list_language_title" msgid="2841683501919760043">"語言"</string>
- <string name="list_language_summary" msgid="8109546531071241601">"選取新聞語言"</string>
- <string-array name="list_language_entries">
- <item msgid="6137851079727305485">"英文"</item>
- <item msgid="1151988412809572526">"法文"</item>
- <item msgid="577840534704312665">"西班牙文"</item>
- <item msgid="8385712091143148180">"日文"</item>
- <item msgid="1858401628368130638">"韓文"</item>
- <item msgid="1933212028684529632">"中文"</item>
- <item msgid="1908428006803639064">"希伯來文"</item>
- </string-array>
- <string-array name="list_language_values">
- <item msgid="1804908636436467150">"1"</item>
- <item msgid="289708030346890334">"2"</item>
- <item msgid="1121469729692402684">"3"</item>
- <item msgid="2614093115912897722">"4"</item>
- <item msgid="2411164639857960614">"5"</item>
- <item msgid="5884448729274543324">"6"</item>
- <item msgid="5511864807618312598">"7"</item>
- </string-array>
- <string name="list_language_dtitle" msgid="5442908726538951934">"語言"</string>
- <string name="enable_disable_local_weather" msgid="986967454867219114">"當地天氣預報"</string>
- <string name="local_weather_enable" msgid="6199315114382448922">"已啟用當地天氣預報"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"已停用當地天氣預報"</string>
- <string name="enable_disable_atr" msgid="8339572391278872343">"區域路況報告"</string>
- <string name="atr_enable" msgid="5541757457789181799">"已啟用區域路況報告"</string>
- <string name="atr_disable" msgid="7085558154727596455">"已停用區域路況報告"</string>
- <string name="enable_disable_lafs" msgid="668189073721277199">"當地機場航班時刻表"</string>
- <string name="lafs_enable" msgid="2791978667205137052">"已啟用當地機場航班時刻表"</string>
- <string name="lafs_disable" msgid="2391212397725495350">"已停用當地機場航班時刻表"</string>
- <string name="enable_disable_restaurants" msgid="6240381945336814024">"餐廳資訊"</string>
- <string name="restaurants_enable" msgid="5137657479469118847">"已啟用餐廳資訊"</string>
- <string name="restaurants_disable" msgid="3678480270938424092">"已停用餐廳資訊"</string>
- <string name="enable_disable_lodgings" msgid="1822029172658551202">"住宿資訊"</string>
- <string name="lodgings_enable" msgid="3230042508992850322">"已啟用住宿資訊"</string>
- <string name="lodgings_disable" msgid="3387879742320682391">"已停用住宿資訊"</string>
- <string name="enable_disable_retail_directory" msgid="1357809784475660303">"零售目錄"</string>
- <string name="retail_directory_enable" msgid="3280626290436111496">"已啟用零售目錄"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"已停用零售目錄"</string>
- <string name="enable_disable_advertisements" msgid="5999495926176182128">"廣告資訊"</string>
- <string name="advertisements_enable" msgid="2050305021264683786">"已啟用廣告"</string>
- <string name="advertisements_disable" msgid="8350985908788707935">"停用廣告資訊"</string>
- <string name="enable_disable_stock_quotes" msgid="6397810445293533603">"股票報價"</string>
- <string name="stock_quotes_enable" msgid="4384802470887170543">"已啟用股票報價"</string>
- <string name="stock_quotes_disable" msgid="4781450084565594998">"已停用股票報價"</string>
- <string name="enable_disable_eo" msgid="4863043263443942494">"就業資訊"</string>
- <string name="eo_enable" msgid="8623559062015685813">"已啟用就業資訊"</string>
- <string name="eo_disable" msgid="3863812478090907609">"已停用就業資訊"</string>
- <string name="enable_disable_mhh" msgid="5698783743098373681">"醫療、保健及醫院"</string>
- <string name="mhh_enable" msgid="3949276822735205799">"啟用醫療、保健及醫院資訊"</string>
- <string name="mhh_disable" msgid="4834280270664925123">"已停用醫療、保健及醫院資訊"</string>
- <string name="enable_disable_technology_news" msgid="3517184627114999149">"科技新聞"</string>
- <string name="technology_news_enable" msgid="7995209394210455181">"已啟用科技新聞"</string>
- <string name="technology_news_disable" msgid="5483490380561851946">"停用科技新聞"</string>
- <string name="enable_disable_multi_category" msgid="626771003122899280">"多類別資訊"</string>
- <string name="multi_category_enable" msgid="1179299804641721768">"已啟用多類別資訊"</string>
- <string name="multi_category_disable" msgid="880104702904139505">"已停用多類別資訊"</string>
- <string name="gsm_umts_network_preferences_title" msgid="4834419333547382436">"GSM/UMTS 網路偏好設定"</string>
- <string name="gsm_umts_network_preferneces_summary" msgid="1905018644156819521">"尚未建置!"</string>
- <string name="gsm_umts_network_preferences_dialogtitle" msgid="6356332580813229898">"GSM/UMTS 網路偏好設定"</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item msgid="935612021902787683">"GSM/WCDMA (自動模式)"</item>
- <item msgid="8912042051809329533">"僅限 WCDMA"</item>
- <item msgid="8776934131146642662">"僅限 GSM"</item>
- <item msgid="4684679567848300935">"GSM/WCDA (WCDMA 優先)"</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item msgid="117293148930527265">"0"</item>
- <item msgid="2264578612775462302">"1"</item>
- <item msgid="1268081943590316978">"2"</item>
- <item msgid="4469871047641902607">"3"</item>
- </string-array>
- <string name="prefer_2g" msgid="8442550937280449639">"只使用 2G 網路"</string>
- <string name="prefer_2g_summary" msgid="1976491403210690759">"節省電力"</string>
- <string name="cdma_system_select_title" msgid="5757657769327732833">"選取系統"</string>
- <string name="cdma_system_select_summary" msgid="2528661990595284707">"變更 CDMA 漫遊模式"</string>
- <string name="cdma_system_select_dialogtitle" msgid="6083355415165359075">"選取系統"</string>
- <string-array name="cdma_system_select_choices">
- <item msgid="176474317493999285">"僅限住家電話"</item>
- <item msgid="1205664026446156265">"自動"</item>
- </string-array>
- <string name="cdma_roaming_mode_title" msgid="6366737033053855198">"CDMA 漫遊模式"</string>
- <string name="cdma_roaming_mode_summary" msgid="8604713111805562261">"變更 CDMA 漫遊模式"</string>
- <string name="cdma_roaming_mode_dialogtitle" msgid="1802896889172094947">"CDMA 漫遊模式"</string>
- <string-array name="cdma_roaming_mode_choices">
- <item msgid="6024072766548865002">"僅限家用網路"</item>
- <item msgid="8174642753290624634">"聯盟網路"</item>
- <item msgid="2241951431403168661">"任何網路"</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item msgid="2549203161367380954">"0"</item>
- <item msgid="6007798728227141997">"1"</item>
- <item msgid="4039511109802141047">"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title" msgid="41193174429510391">"CDMA 網路偏好設定"</string>
- <string name="cdma_network_preferneces_summary" msgid="3524451924935793338">"尚未建置!"</string>
- <string name="cdma_network_preferences_dialogtitle" msgid="4548860809290455653">"CDMA 網路偏好設定"</string>
- <string-array name="cdma_network_preferences_choices">
- <item msgid="3711054371631487248">"CDMA/EvDo"</item>
- <item msgid="6143696847467859795">"僅限 CDMA"</item>
- <item msgid="2683555124647197574">"僅限 EvDo"</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item msgid="5584048199290030331">"0"</item>
- <item msgid="5741268642513143762">"1"</item>
- <item msgid="419525200910932450">"2"</item>
- </string-array>
- <string name="subscription_title" msgid="5813493350326486">"CDMA 訂閱測試"</string>
- <string name="subscription_summary" msgid="8435941016743418124">"在 RUIM/SIM 和 NV 之間切換"</string>
- <string name="subscription_dialogtitle" msgid="531571450448009255">"訂閱"</string>
- <string-array name="subscription_choices">
- <item msgid="6540107472553796600">"RUIM/SIM"</item>
- <item msgid="1433427108940308332">"NV"</item>
- </string-array>
- <string-array name="subscription_values">
- <item msgid="4377788417250295786">"0"</item>
- <item msgid="1193066664940329729">"1"</item>
- </string-array>
- <string name="fdn" msgid="7878832555095183202">"固定撥號"</string>
- <string name="manage_fdn_list" msgid="8777755791892122369">"固定撥號清單"</string>
- <string name="fdn_activation" msgid="2156479741307463576">"啟用固定撥號"</string>
- <string name="fdn_enabled" msgid="5238109009915521240">"已啟用 [固定撥號]"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"已停用固定撥號"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"啟用固定撥號"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"停用固定撥號"</string>
- <string name="change_pin2" msgid="2153563695382176676">"更改 PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"停用固定撥號"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"啟用固定撥號"</string>
- <string name="sum_fdn" msgid="1959399454900272878">"管理固定撥號"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"變更固定撥號功能存取密碼"</string>
- <string name="sum_fdn_manage_list" msgid="8431088265332628316">"管理電話號碼清單"</string>
- <string name="voice_privacy" msgid="7803023024169078619">"語音加密保護"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"已啟用加強型隱私保護模式"</string>
- <string name="tty_mode_title" msgid="3171521903490559138">"TTY 模式"</string>
- <string name="tty_mode_summary" msgid="5057244302665817977">"啟用 TTY 模式"</string>
- <string name="tty_mode_option_title" msgid="9033098925144434669">"TTY 模式"</string>
- <string name="tty_mode_option_summary" msgid="1073835131534808732">"設定 TTY 模式"</string>
- <string name="auto_retry_mode_title" msgid="1478311108889330757">"自動重試"</string>
- <string name="auto_retry_mode_summary" msgid="4921028586041909574">"啟用「自動重試」模式"</string>
- <string name="menu_add" msgid="1882023737425114762">"新增聯絡人"</string>
- <string name="menu_edit" msgid="7143003705504672374">"編輯聯絡人"</string>
- <string name="menu_delete" msgid="3977150783449642851">"刪除聯絡人"</string>
- <string name="get_pin2" msgid="1198225482542827652">"輸入 PIN2"</string>
- <string name="name" msgid="7329028332786872378">"名稱"</string>
- <string name="number" msgid="7905950798349903858">"號碼"</string>
- <string name="save" msgid="4094274636321939086">"儲存"</string>
- <string name="add_fdn_contact" msgid="2481915899633353976">"新增固定撥號"</string>
- <string name="adding_fdn_contact" msgid="7627379633721940991">"正在新增固定撥號..."</string>
- <string name="fdn_contact_added" msgid="7458335758501736665">"已新增固定撥號。"</string>
- <string name="edit_fdn_contact" msgid="7976936035587081480">"編輯固定撥號"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"正在更新固定撥號..."</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"固定撥號已更新。"</string>
- <string name="delete_fdn_contact" msgid="6668958073074151717">"刪除固定撥號"</string>
- <string name="deleting_fdn_contact" msgid="5669163206349319969">"正在刪除固定撥號..."</string>
- <string name="fdn_contact_deleted" msgid="7154162327112259569">"已刪除固定撥號。"</string>
- <string name="pin2_invalid" msgid="7176360264228076810">"FDN 未更新:您輸入的 PIN 碼不正確。"</string>
- <string name="fdn_invalid_number" msgid="9193130794297997290">"FDN 未更新:號碼不能超過 20 碼。"</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"從 SIM 卡讀取中..."</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"您的 SIM 卡上沒有聯絡人。"</string>
- <string name="simContacts_title" msgid="1861472842524839921">"選取要匯入的聯絡人"</string>
- <string name="enable_pin" msgid="5422767284133234860">"啟用/停用 SIM PIN"</string>
- <string name="change_pin" msgid="9174186126330785343">"變更 SIM PIN"</string>
- <string name="enter_pin_text" msgid="8532615714751931951">"SIM PIN:"</string>
- <string name="oldPinLabel" msgid="5287773661246368314">"舊的 PIN"</string>
- <string name="newPinLabel" msgid="207488227285336897">"新的 PIN"</string>
- <string name="confirmPinLabel" msgid="257597715098070206">"確認新的 PIN"</string>
- <string name="badPin" msgid="4154316827946559447">"您輸入的舊 PIN 不正確。請再試一次。"</string>
- <string name="mismatchPin" msgid="5974597541268042785">"您輸入的 PIN 不符合。請再試一次。"</string>
- <string name="invalidPin" msgid="5981171102258684792">"輸入 4 至 8 個數字的 PIN。"</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"停用 SIM PIN"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"啟用 SIM PIN"</string>
- <string name="enable_in_progress" msgid="3695303775100109650">"請稍候..."</string>
- <string name="enable_pin_ok" msgid="8077439615296694284">"SIM PIN 已啟用"</string>
- <string name="disable_pin_ok" msgid="8552428316206928913">"SIM PIN 已停用"</string>
- <string name="pin_failed" msgid="6597695909685242127">"您輸入的 PIN 不正確"</string>
- <string name="pin_changed" msgid="9000716792724195093">"成功變更 SIM PIN"</string>
- <string name="puk_requested" msgid="3898394204193202803">"密碼錯誤,SIM 已鎖定!需要 PUK2 解鎖。"</string>
- <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"舊的 PIN2"</string>
- <string name="newPin2Label" msgid="4573956902204349054">"新的 PIN2"</string>
- <string name="confirmPin2Label" msgid="8100319484454787708">"確認新的 PIN2"</string>
- <string name="badPuk2" msgid="4072035207011308856">"您輸入的 PUK2 不正確。請再試一次。"</string>
- <string name="badPin2" msgid="515218795152422178">"您輸入的舊 PIN2 不正確。請再試一次。"</string>
- <string name="mismatchPin2" msgid="4177060915600342718">"您輸入的 PIN2 不符。請再試一次。"</string>
- <string name="invalidPin2" msgid="8237110107480395938">"輸入 4 至 8 個數字的 PIN2。"</string>
- <string name="invalidPuk2" msgid="1290977391033057871">"輸入 8 個數字的 PUK2。"</string>
- <string name="pin2_changed" msgid="2670422162555916562">"成功變更 PIN2"</string>
- <string name="label_puk2_code" msgid="302845876240219560">"輸入 PUK2 碼"</string>
- <string name="fdn_enable_puk2_requested" msgid="2608836967081385948">"密碼錯誤,請更改 PIN2 並再試一次!"</string>
- <string name="puk2_requested" msgid="5863580927788820813">"密碼錯誤,SIM 已鎖定!需要 PUK2 解鎖。"</string>
- <string name="doneButton" msgid="2859593360997984240">"完成"</string>
- <string name="caller_manage_header" msgid="3231519674734638786">"多方通話<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
- <string name="caller_manage_manage_done_text" msgid="8093934725536733856">"返回通話"</string>
- <string name="sim_missing_continueView_text" msgid="4199689081742026077">"不插入 SIM 卡,繼續操作"</string>
- <string name="sim_missing_msg_text" msgid="6803619600564142188">"找不到 SIM 卡。請將 SIM 卡插入手機。"</string>
- <string name="sim_unlock_dismiss_text" msgid="8292343981739813597">"關閉"</string>
- <string name="sim_unlock_unlock_text" msgid="6328406783399256930">"解除鎖定"</string>
- <string name="sim_unlock_status_text" msgid="1919609683384607179">"正在驗證 PIN..."</string>
- <string name="voicemail_settings_number_label" msgid="8524164258691887790">"語音信箱號碼"</string>
- <string name="card_title_dialing" msgid="5769417478498348054">"撥號中"</string>
- <string name="card_title_redialing" msgid="4831412164303596395">"重試中"</string>
- <string name="card_title_in_progress" msgid="8603765629781648862">"目前通話"</string>
- <string name="card_title_conf_call" msgid="1162980346189744501">"多方通話"</string>
- <string name="card_title_incoming_call" msgid="7364539451234646909">"來電"</string>
- <string name="card_title_cdma_call_waiting" msgid="4532445524811272644">"CDMA 通話插播中"</string>
- <string name="card_title_call_ended" msgid="5544730338889702298">"通話結束"</string>
- <string name="card_title_on_hold" msgid="821463117892339942">"通話保留"</string>
- <string name="card_title_hanging_up" msgid="3999101620995182450">"掛斷電話"</string>
- <string name="card_title_in_call" msgid="6346543933068225205">"通話中"</string>
- <string name="notification_missedCallTitle" msgid="7554385905572364535">"未接來電"</string>
- <string name="notification_missedCallsTitle" msgid="1361677948941502522">"未接來電"</string>
- <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 通未接來電"</string>
- <string name="notification_missedCallTicker" msgid="504686252427747209">"來自 <xliff:g id="MISSED_CALL_FROM">%s</xliff:g> 的未接來電"</string>
- <string name="notification_ongoing_call_format" msgid="227216462548540316">"目前通話 (<xliff:g id="DURATION">%s</xliff:g>)"</string>
- <string name="notification_on_hold" msgid="3480694969511790465">"通話保留"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"新留言"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"新留言 (<xliff:g id="COUNT">%d</xliff:g>)"</string>
- <string name="notification_voicemail_text_format" msgid="4447323569453981685">"撥打 <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
- <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"無語音信箱號碼"</string>
- <string name="notification_network_selection_title" msgid="4224455487793492772">"沒有服務"</string>
- <string name="notification_network_selection_text" msgid="2607085729661923269">"您所選取的網路 (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) 無法使用"</string>
- <string name="incall_error_power_off" msgid="6550191216405193368">"撥號前,請先關閉飛航模式。"</string>
- <string name="incall_error_emergency_only" msgid="4678640422710818317">"尚未註冊網路。"</string>
- <string name="incall_error_out_of_service" msgid="8587993036435080418">"無法使用 Google 行動服務網路。"</string>
- <string name="incall_error_no_phone_number_supplied" msgid="4197432103471807739">"撥號未送出,未輸入正確號碼。"</string>
- <string name="incall_error_call_failed" msgid="4313552620858880999">"撥號未送出。"</string>
- <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"開始 MMI 序列..."</string>
- <string name="incall_status_dialed_fc" msgid="1632879988662225263">"正在啟動功能碼序列..."</string>
- <string name="incall_error_supp_service_unknown" msgid="2991054870745666038">"不支援的服務。"</string>
- <string name="incall_error_supp_service_switch" msgid="3503552565745872241">"無法切換通話。"</string>
- <string name="incall_error_supp_service_separate" msgid="914362338192301746">"無法分隔來電。"</string>
- <string name="incall_error_supp_service_transfer" msgid="2509871374644921632">"無法轉接來電。"</string>
- <string name="incall_error_supp_service_conference" msgid="2505727299596357312">"無法進行多方通話。"</string>
- <string name="incall_error_supp_service_reject" msgid="7055164130563826216">"無法拒絕來電。"</string>
- <string name="incall_error_supp_service_hangup" msgid="7417583238334762737">"無法釋出通話。"</string>
- <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"緊急電話"</string>
- <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"開啟無線通訊中..."</string>
- <string name="emergency_enable_radio_dialog_retry" msgid="3724423402363063736">"超出服務範圍,重試中..."</string>
- <string name="dial_emergency_error" msgid="8362624131726575194">"撥號未送出,<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> 不是緊急電話號碼!"</string>
- <string name="dial_emergency_empty_error" msgid="5048645338094088229">"撥號未送出,請撥打緊急電話號碼!"</string>
- <string name="dialerKeyboardHintText" msgid="9192914825413747792">"使用鍵盤撥號"</string>
- <string name="dtmfDialpadHintText" msgid="2153335217920679451">"觸控音按鍵"</string>
- <string name="dtmfDialpadHandleLabel" msgid="6077872154488117962">"撥號鍵盤"</string>
- <string name="touchLockText" msgid="566824588267376287">"點兩下"\n"即可解鎖"</string>
- <string name="onscreenAnswerText" msgid="3000799558804019765">"輕按兩下"\n"接聽"</string>
- <string name="onscreenRejectText" msgid="1456649473993020449">"輕按兩下"\n"拒絕"</string>
- <string name="onscreenHoldText" msgid="2285258239691145872">"保留"</string>
- <string name="onscreenUnholdText" msgid="5033582269005230794">"取消保留"</string>
- <string name="onscreenEndCallText" msgid="4403855834875398585">"結束"</string>
- <string name="onscreenShowDialpadText" msgid="8561805492659639893">"撥號鍵盤"</string>
- <string name="onscreenHideDialpadText" msgid="2572388822571686252">"隱藏"</string>
- <string name="onscreenSpeakerText" msgid="9013795366801657948">"喇叭"</string>
- <string name="onscreenMuteText" msgid="5011369181754261374">"靜音"</string>
- <string name="onscreenBluetoothText" msgid="2479639597725504499">"藍牙"</string>
- <string name="onscreenAddCallText" msgid="5140385634712287403">"新增通話"</string>
- <string name="onscreenMergeCallsText" msgid="6640195098064538950">"合併通話"</string>
- <string name="onscreenSwapCallsText" msgid="1602990689244030047">"切換"</string>
- <string name="onscreenManageCallsText" msgid="5473231160123254154">"管理通話"</string>
- <string name="onscreenManageConferenceText" msgid="6952581578445378981">"管理"</string>
- <string name="importSimEntry" msgid="6614358325359736031">"匯入"</string>
- <string name="importAllSimEntries" msgid="1503181169636198673">"全部匯入"</string>
- <string name="importingSimContacts" msgid="7374056215462575769">"匯入 SIM 聯絡人"</string>
- <string name="importToFDNfromContacts" msgid="2130620207013368580">"從聯絡人匯入"</string>
- <string name="hac_mode_title" msgid="8740268574688743289">"助聽器"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"開啟助聽器相容功能"</string>
- <string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"關閉 TTY"</item>
- <item msgid="3971695875449640648">"TTY 全能"</item>
- <item msgid="1937509904407445684">"TTY HCO"</item>
- <item msgid="5644925873488772224">"TTY VCO"</item>
- </string-array>
- <string name="eri_text_label" msgid="4326942349915331461">"ERI 文字"</string>
- <string name="dtmf_tones_title" msgid="3866923093113274152">"DTMF 信號音"</string>
- <string name="dtmf_tones_summary" msgid="3351820372864020331">"設定 DTMF 信號音長度"</string>
- <string-array name="dtmf_tone_entries">
- <item msgid="899650777817315681">"適中"</item>
- <item msgid="2883365539347850535">"長音"</item>
- </string-array>
- <string name="network_message" msgid="5673682885938122239">"網路訊息"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"啟用您的手機"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"如要啟用手機服務,您必須撥打一通特殊電話。"\n\n"按下 [啟用] 後,請聽取手機啟用說明。"</string>
- <string name="ota_touch_activate_new" msgid="4508197891732183852">"輕觸 [啟用] 可撥打一通特殊電話,以便在通訊業者的行動網路上啟用您的手機,讓您可以打電話並連線至行動資料網路。"</string>
- <string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"是否略過啟用?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"如果您不啟用手機,就無法打電話或連線至行動服務資料網路 (透過這個資料網路,可連線至 Wi-Fi 網路)。每次一開機,系統就會詢問您是否要啟用手機,直到您啟用為止。"</string>
- <string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"略過"</string>
- <string name="ota_skip_activation_dialog_continue_label" msgid="4343765820509664362">"啟用"</string>
- <string name="ota_activate" msgid="1368528132525626264">"啟用"</string>
- <string name="ota_title_activate_success" msgid="3344632328991980578">"手機已啟用!"</string>
- <string name="ota_title_problem_with_activation" msgid="7095824491970084367">"啟用失敗"</string>
- <string name="ota_listen" msgid="162923839877584937">"依照語音指示進行,直到您聽到啟用完成為止。"</string>
- <string name="ota_dialpad" msgid="3530900997110658409">"小鍵盤"</string>
- <string name="ota_speaker" msgid="6904589278542719647">"喇叭"</string>
- <string name="ota_progress" msgid="4644512049143969504">"手機正在進行程式化設定,請稍候。"</string>
- <string name="ota_failure" msgid="8600027551822478181">"程式化失敗"</string>
- <string name="ota_successful" msgid="1880780692887077407">"您的手機已啟用;系統最多可能需要 15 分鐘,才會開始提供服務。"</string>
- <string name="ota_unsuccessful" msgid="623361244652068739">"您的手機尚未啟用。"\n"建議您移到收訊較佳的地方 (例如窗邊或戶外)。"\n\n"請再試一次,或向客戶服務中心洽詢其他啟用方式。"</string>
- <string name="ota_spc_failure" msgid="3909983542575030796">"過度調整 SPC 錯誤"</string>
- <string name="ota_call_end" msgid="4537279738134612388">"返回"</string>
- <string name="ota_try_again" msgid="7685477206465902290">"再試一次"</string>
- <string name="ota_next" msgid="3904945374358235910">"下一頁"</string>
- <string name="ota_back" msgid="2190038043403850052">"返回"</string>
- <string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
- <string name="phone_entered_ecm_text" msgid="6266424252578731203">"已進入緊急回撥模式"</string>
- <string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"緊急回撥模式"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"資料連線已停用"</string>
- <plurals name="phone_in_ecm_notification_time">
- <item quantity="one" msgid="4866221796252472622">"接下來的 <xliff:g id="COUNT">%s</xliff:g> 分鐘內沒有資料連線"</item>
- <item quantity="other" msgid="3122217344579273583">"接下來將出現 <xliff:g id="COUNT">%s</xliff:g> 分鐘的資料斷線狀態"</item>
- </plurals>
- <plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="2181569650640386253">"手機在接下來的 <xliff:g id="COUNT">%s</xliff:g> 分鐘內都將處於緊急回撥模式。在此模式中,所有使用資料連線的應用程式皆無法運作。您要立即退出嗎?"</item>
- <item quantity="other" msgid="3231879566243957821">"手機在接下來的 <xliff:g id="COUNT">%s</xliff:g> 分鐘內都將處於緊急回撥模式。在此模式中,所有使用資料連線的應用程式皆無法運作。您要立即退出嗎?"</item>
- </plurals>
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <item quantity="one" msgid="8939225905428421722">"緊急回撥模式不支援您要執行的功能。接下來將出現 <xliff:g id="COUNT">%s</xliff:g> 分鐘的資料斷線狀態,您要立即退出嗎?"</item>
- <item quantity="other" msgid="3489076611710869904">"緊急回撥模式不支援您要執行的功能。接下來將出現 <xliff:g id="COUNT">%s</xliff:g> 分鐘的資料斷線狀態,您要立即退出嗎?"</item>
- </plurals>
- <string name="alert_dialog_in_ecm_call" msgid="2334477874583086142">"您所選取的動作無法在撥打緊急電話時執行"</string>
- <string name="progress_dialog_exiting_ecm" msgid="8751952246695857820">"正在退出緊急回撥模式"</string>
- <string name="alert_dialog_yes" msgid="6674268047820703974">"是"</string>
- <string name="alert_dialog_no" msgid="1476091437797628703">"否"</string>
- <string name="alert_dialog_dismiss" msgid="2491494287075907171">"關閉"</string>
- <string name="voicemail_settings" msgid="2288633492587133022">"語音信箱設定"</string>
- <string name="voicemail_number_not_set" msgid="1604580506447265808">"&lt;未設定&gt;"</string>
- <string name="voicemail_provider" msgid="6299679757491942924">"語音信箱服務"</string>
- <string name="voicemail_settings_for" msgid="9018656268027893088">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>的設定"</string>
- <string name="other_settings" msgid="3672912580359716394">"其他通話設定"</string>
- <string name="dial_button_label" msgid="5551611636419190229">"撥號"</string>
- <string name="calling_via_template" msgid="7374498518104190489">"正在透過 ^1 去電"\n<b>"^2"</b></string>
- <string name="slide_to_answer" msgid="255903188611244476">"向右拖曳以接聽來電"</string>
- <string name="slide_to_silence" msgid="2224982696981131553">"向左拖曳以關閉鈴聲"</string>
- <string name="slide_to_decline" msgid="7342094219435077069">"向左拖曳以拒絕通話"</string>
- <string name="slide_to_answer_and_hold" msgid="9212596323067601245">"向右拖曳以接聽來電並保留"\n"目前的通話"</string>
- <string name="slide_to_answer_and_end_active" msgid="6473719408670133380">"向右拖曳以接聽來電並結束"\n"目前的通話"</string>
- <string name="slide_to_answer_and_end_onhold" msgid="638748048960663506">"向右拖曳以接聽來電並結束"\n"目前保留的通話"</string>
- <string name="slide_to_answer_hint" msgid="4901042355463593903">"接聽"</string>
- <string name="slide_to_decline_hint" msgid="4484576372463030324">"拒絕"</string>
-</resources>
diff --git a/phone/res/values/attrs.xml b/phone/res/values/attrs.xml
deleted file mode 100644
index 7eec223..0000000
--- a/phone/res/values/attrs.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2006 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <declare-styleable name="EditPhoneNumberPreference">
- <!-- The enable button text. -->
- <attr name="enableButtonText" format="string" />
- <!-- The disable button text. -->
- <attr name="disableButtonText" format="string" />
- <!-- The change / update button text. -->
- <attr name="changeNumButtonText" format="string" />
- <!-- The confirm button mode. -->
- <attr name="confirmMode">
- <!-- Traditional single action "ok" button. -->
- <enum name="confirm" value="0" />
- <!-- Two state "enable/disable" button. -->
- <enum name="activation" value="1" />
- </attr>
- </declare-styleable>
-
- <declare-styleable name="CallForwardEditPreference">
- <attr name="serviceClass">
- <!-- voice -->
- <enum name="voice" value="1" />
- <!-- data -->
- <enum name="data" value="2" />
- </attr>
- <attr name="reason">
- <!-- unconditional -->
- <enum name="unconditional" value="0" />
- <!-- busy -->
- <enum name="busy" value="1" />
- <!-- no_reply -->
- <enum name="no_reply" value="2" />
- <!-- not_reachable -->
- <enum name="not_reachable" value="3" />
- </attr>
- </declare-styleable>
-</resources>
diff --git a/phone/res/values/colors.xml b/phone/res/values/colors.xml
deleted file mode 100644
index 8c66f3a..0000000
--- a/phone/res/values/colors.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <!-- Dialer -->
- <color name="dialer_matchHighlight">#EECF6A</color>
-
- <!-- In-call UI -->
- <color name="incall_textConnected">#99CE3F</color> <!-- green -->
- <color name="incall_textConnectedBluetooth">#54C1FF</color> <!-- blue -->
- <color name="incall_textEnded">#FF6072</color> <!-- red -->
- <color name="incall_textOnHold">#FF9524</color> <!-- orange -->
- <color name="incall_endButtonLabel">#FF6072</color> <!-- red -->
-
- <!-- DTMF Dialer -->
- <color name="dtmf_dialer_background">#333333</color> <!-- green -->
- <color name="dtmf_dialer_display_text">#FFFFFF</color> <!-- white -->
-</resources>
diff --git a/phone/res/values/config.xml b/phone/res/values/config.xml
deleted file mode 100644
index 0b821c4..0000000
--- a/phone/res/values/config.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?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.
--->
-
-<!-- Phone app resources that may need to be customized
- for different hardware or product builds. -->
-<resources>
- <!-- Flag indicating whether the Phone app should ignore
- EVENT_SIM_NETWORK_LOCKED events from the Sim. If true, this will
- prevent the IccNetworkDepersonalizationPanel from being shown,
- and effectively disable the "Sim network lock" feature. -->
- <bool name="ignore_sim_network_locked_events">false</bool>
-
- <!-- Flag indicating whether the Phone app should provide
- a "Dismiss" button on the SIM network unlock screen.
- The default value is true.
- If set to false, there will be *no way* to dismiss the SIM
- network unlock screen if you don't enter the correct unlock code.
- (One important consequence: there will be no way to make an
- Emergency Call if your SIM is network-locked and you don't know
- the PIN.) -->
- <bool name="sim_network_unlock_allow_dismiss">true</bool>
-
- <!-- If true, enable the onscreen touch UI for incoming calls.
- This feature is necessary for devices with no hard SEND/END keys,
- and optional on all other devices. -->
- <bool name="allow_incoming_call_touch_ui">true</bool>
-
- <!-- If true, enable the onscreen touch UI for regular "ongoing call"
- states of the in-call UI.
- In general, the touch UI is used for regular calls only on
- devices with a proximity sensor. (On other devices, we can't
- have touchable UI onscreen during a call because of the risk of
- false cheek touches.)
- TODO: maybe this can be determined algorithmically based on
- specific properties of the device, perhaps by detecting the
- presence of a proximity sensor and/or hard SEND/END keys. (If
- so, we wouldn't need this flag at all.) -->
- <bool name="allow_in_call_touch_ui">true</bool>
-
- <!-- OTA configuration values, used when provisioning CDMA devices.
- Following defaults values of zero means OTA UI is completely disabled.
- These OTA UI can be enabled by setting config value to one in the product
- specific overlay file -->
-
- <!-- Determine whether we want to display the OTA activation screen, which
- gives the user option to activate or cancel -->
- <integer name="OtaShowActivationScreen">1</integer>
- <!-- Determine whether we should show the "listen for instructions" screen after
- successfully placing the OTA call -->
- <integer name="OtaShowListeningScreen">0</integer>
- <!-- The number of times we should show the activation screen/allow the provisioning
- to fail before just showing an unsuccessful dialog -->
- <integer name="OtaShowActivateFailTimes">0</integer>
- <!-- Determine whether or not we should play the success/failure tone -->
- <integer name="OtaPlaySuccessFailureTone">0</integer>
-
- <!-- Flag indicating if the phone is a world phone -->
- <bool name="world_phone">false</bool>
-
- <!-- If true, enable vibration (haptic feedback) for key presses
- in the EmergencyDialer activity. The pattern is set on a
- per-platform basis using config_virtualKeyVibePattern. To be
- consistent with the regular Dialer, this value should agree
- with the corresponding values from config.xml under
- apps/Contacts. -->
- <bool name="config_enable_dialer_key_vibration">true</bool>
-
- <!-- Flag indicating if the tty is enabled -->
- <bool name="tty_enabled">false</bool>
-
- <!-- Flag indicating if hac is enabled -->
- <bool name="hac_enabled">false</bool>
-
- <!-- Flag indicating if dtmf tone type is enabled -->
- <bool name="dtmf_type_enabled">false</bool>
-
- <!-- Flag indicating if auto retry is enabled -->
- <bool name="auto_retry_enabled">false</bool>
-
- <!-- Determine whether we want to play local DTMF tones in a call, or
- just let the radio/BP handle playing of the tones. -->
- <bool name="allow_local_dtmf_tones">true</bool>
-
- <!-- While an incoming call is ringing, this flag specifies whether
- the BACK key should reject the current call (just like the
- ENDCALL button does.)
- This was originally the default behavior for all platforms, but
- it's a bad idea on devices where the BACK key is a capacitive
- button (since it's too easy to press the key accidentally as you
- pull the phone out of your pocket.) So devices that *don't* want
- this behavior should set this flag to false via the resource
- overlay. -->
- <bool name="allow_back_key_to_reject_incoming_call">true</bool>
-
- <!-- If true, show an onscreen "Dial" button in the dialer.
- In practice this is used on all platforms even the ones with hard SEND/END
- keys, but for maximum flexibility it's controlled by a flag here
- (which can be overridden on a per-product basis.) -->
- <bool name="config_show_onscreen_dial_button">true</bool>
-
- <!-- Determine whether calls to mute the microphone in PhoneUtils
- are routed through the android.media.AudioManager class (true) or through
- the com.android.internal.telephony.Phone interface (false). -->
- <bool name="send_mic_mute_to_AudioManager">false</bool>
-
- <!-- Determines if device implements a noise suppression device for in call audio-->
- <bool name="has_in_call_noise_suppression">false</bool>
-
-</resources>
diff --git a/phone/res/values/dimens.xml b/phone/res/values/dimens.xml
deleted file mode 100644
index 74fb68d..0000000
--- a/phone/res/values/dimens.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <!-- Dimensions for OTA Call Card -->
- <dimen name="otabase_layout_marginTop">30dip</dimen>
- <dimen name="otabase_minHeight">270dip</dimen>
- <dimen name="otaactivate_layout_marginTop">10dip</dimen>
- <dimen name="otalistenprogress_layout_marginTop">5dip</dimen>
- <dimen name="otasuccessfail_layout_marginTop">10dip</dimen>
-</resources>
diff --git a/phone/res/values/ids.xml b/phone/res/values/ids.xml
deleted file mode 100755
index cc305c3..0000000
--- a/phone/res/values/ids.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <!-- Views created dynamically in InCallMenu.java -->
- <item type="id" name="menuManageConference" />
- <item type="id" name="menuShowDialpad" />
- <item type="id" name="menuEndCall" />
- <item type="id" name="menuAddCall" />
- <item type="id" name="menuSwapCalls" />
- <item type="id" name="menuMergeCalls" />
- <item type="id" name="menuBluetooth" />
- <item type="id" name="menuSpeaker" />
- <item type="id" name="menuMute" />
- <item type="id" name="menuHold" />
- <item type="id" name="menuAnswerAndHold" />
- <item type="id" name="menuAnswerAndEnd" />
- <item type="id" name="menuAnswer" />
- <item type="id" name="menuIgnore" />
-
- <!-- IDs used with events from some in-call touch UI elements;
- we treat these as "button clicks" even though the UI elements
- themselves may not actually be buttons. -->
- <item type="id" name="answerButton" />
- <item type="id" name="rejectButton" />
-</resources>
diff --git a/phone/res/values/strings.xml b/phone/res/values/strings.xml
deleted file mode 100755
index f6d4839..0000000
--- a/phone/res/values/strings.xml
+++ /dev/null
@@ -1,1192 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <!-- Launcher labels -->
- <!-- Tab title -->
- <string name="contactsIconLabel">Contacts2</string>
- <!-- Tab title -->
- <string name="contactsFavoritesLabel">Favorites2</string>
- <!-- Tab title -->
- <string name="dialerIconLabel">Dialer2</string>
- <!-- Screen title for Emergency Dialer UI -->
- <string name="emergencyDialerIconLabel">Emergency Dialer2</string>
- <!-- Application name on Home screen -->
- <string name="phoneIconLabel">Phone2</string>
- <!-- Tab title -->
- <string name="recentCallsIconLabel">Call log2</string>
- <!-- Title of FDN list screen -->
- <string name="fdnListLabel">FDN list2</string>
-
- <!-- Call status -->
- <!-- 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">Pay phone</string>
- <!-- In-call screen: status label for a call that's on hold -->
- <string name="onHold">On hold</string>
- <!-- In-call screen: status label for the current active call -->
- <string name="ongoing">Current call</string>
- <!-- Possible error messages with outgoing calls -->
- <!-- In-call screen: call failure reason (busy) -->
- <string name="callFailed_userBusy">Line busy</string>
- <!-- In-call screen: call failure reason (network congestion) -->
- <string name="callFailed_congestion">Network busy</string>
- <!-- In-call screen: call failure reason (no signal) -->
- <string name="callFailed_noSignal">No signal</string>
- <!-- In-call screen: call failure reason (GSM ACM limit exceeded) -->
- <string name="callFailed_limitExceeded">ACM limit exceeded</string>
- <!-- In-call screen: call failure reason (radio is off) -->
- <string name="callFailed_powerOff">Radio off</string>
- <!-- In-call screen: call failure reason (SIM error) -->
- <string name="callFailed_simError">No SIM, or SIM error</string>
- <!-- In-call screen: call failure reason (out of service) -->
- <string name="callFailed_outOfService">Out of service area</string>
- <!-- In-call screen: call failure reason (call denied because of current FDN setting) -->
- <string name="callFailed_fdn_only">Outgoing calls are restricted by FDN.</string>
- <!-- In-call screen: call failure reason (call denied because call barring is on) -->
- <string name="callFailed_cb_enabled">You cannot make outgoing calls while call barring is on.</string>
- <!-- In-call screen: call failure reason (call denied because domain specific access control is on) -->
- <string name="callFailed_dsac_restricted">All calls are restricted by access control.</string>
- <!-- In-call screen: call failure reason (Emergency call denied because domain specific access control is on)-->
- <string name="callFailed_dsac_restricted_emergency">Emergency calls are restricted by access control.</string>
- <!-- In-call screen: call failure reason (Normal call denied because domain specific access control is on)-->
- <string name="callFailed_dsac_restricted_normal">Normal calls are restricted by access control.</string>
- <!-- In-call screen: call failure reason (Phone is locked until next power cycle)-->
- <string name="callFailed_cdma_lockedUntilPowerCycle">CDMA: Phone locked until power cycle.</string>
- <!-- In-call screen: call failure reason (CDMA: call dropped)-->
- <string name="callFailed_cdma_drop">CDMA: Call dropped.</string>
- <!-- In-call screen: call failure reason (CDMA: call intercepted)-->
- <string name="callFailed_cdma_intercept">CDMA: Call intercepted.</string>
- <!-- In-call screen: call failure reason (CDMA reorder)-->
- <string name="callFailed_cdma_reorder">CDMA: reorder.</string>
- <!-- In-call screen: call failure reason (CDMA: Service Option Reject)-->
- <string name="callFailed_cdma_SO_reject">CDMA: Service Option Reject.</string>
- <!-- In-call screen: call failure reason (CDMA: retry order)-->
- <string name="callFailed_cdma_retryOrder">CDMA: retry order.</string>
- <!-- In-call screen: call failure reason (CDMA: Access failure)-->
- <string name="callFailed_cdma_accessFailure">CDMA: Access failure.</string>
- <!-- In-call screen: call failure reason (CDMA: Preempted)-->
- <string name="callFailed_cdma_preempted">CDMA: Preempted.</string>
- <!-- In-call screen: call failure reason (Only Emergency calls are possible)-->
- <string name="callFailed_cdma_notEmergency">Only Emergency calls are possible.</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 has been lost.</string>
- <!-- In-call screen: auto retry -->
- <string name="retry">Retry</string>
- <!-- In-call screen: call lost title of dialog -->
- <string name="call_lost_title">Call Lost</string>
-
- <!-- MMI strings -->
- <!-- Dialog label when an MMI code starts running -->
- <string name="mmiStarted">MMI code started</string>
- <!-- Dialog label when a USSD code starts running -->
- <string name="ussdRunning">USSD code running\u2026</string>
- <!-- Dialog label when an MMI code is canceled -->
- <string name="mmiCancelled">MMI code canceled</string>
- <!-- Label for "cancel" button on the MMI dialog -->
- <string name="cancel">Cancel</string>
-
- <!-- In-call menu item labels -->
- <!-- Regular in-call menu items: -->
- <!-- In-call menu: Label for "speakerphone" menu item -->
- <string name="menu_speaker">Speaker</string>
- <!-- In-call menu: Label for "bluetooth" menu item -->
- <string name="menu_bluetooth">Bluetooth</string>
- <!-- In-call menu: Label for "mute" menu item -->
- <string name="menu_mute">Mute</string>
- <!-- In-call menu: Label for "hold" menu item -->
- <string name="menu_hold">Hold</string>
- <!-- In-call menu: Label for "end call" menu item -->
- <string name="menu_endCall">End call</string>
- <!-- In-call menu: Label for "swap calls" menu item -->
- <string name="menu_swapCalls">Swap calls</string>
- <!-- In-call menu: Label for "merge calls" menu item -->
- <string name="menu_mergeCalls">Merge calls</string>
- <!-- In-call menu: Label for "add call" menu item -->
- <string name="menu_addCall">Add call</string>
- <!-- In-call menu: Label for "manage conference call" menu item -->
- <string name="menu_manageConference">Manage conference call</string>
- <!-- In-call menu: Label for "show dialpad" menu item -->
- <string name="menu_showDialpad">Show dialpad</string>
- <!-- In-call menu: Label for "hide dialpad" menu item -->
- <string name="menu_hideDialpad">Hide dialpad</string>
- <!-- Incoming call menu items: -->
- <!-- Incoming call menu: Label for "Hold and answer" menu item -->
- <string name="menu_answerAndHold">Hold current call\n&amp; answer</string>
- <!-- Incoming call menu: Label for "End and answer" menu item -->
- <string name="menu_answerAndEnd">End current call\n&amp; answer</string>
- <!-- Other misc labels for the in-call UI -->
- <!-- Positive button label ("OK") used in several dialogs in the phone UI -->
- <string name="ok">OK</string>
- <!-- In-call screen, message just under call window when keyboard is closed -->
- <string name="menuButtonHint">Press Menu for call options.</string>
- <!-- In-call screen, message just under call window when keyboard is revealed -->
- <string name="menuButtonKeyboardDialHint">"Press Menu for call options \u2022 Use keyboard to dial"</string>
- <!-- Incoming call menu: Label for "Answer" menu item -->
- <string name="menu_answer">Answer</string>
- <!-- Incoming call menu: Label for "Ignore" menu item -->
- <string name="menu_ignore">Ignore</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 the wild character with</string>
-
- <!-- missing voicemail number -->
- <!-- Title of the "Missing voicemail number" dialog -->
- <string name="no_vm_number">Missing voicemail number</string>
- <!-- Body text of the "Missing voicemail number" dialog -->
- <string name="no_vm_number_msg">No voicemail number is stored on the SIM card.</string>
- <!-- Button label on the "Missing voicemail number" dialog -->
- <string name="add_vm_number_str">Add number</string>
-
- <!-- Placeholder text displayed while loading a list of phone numbers
- into the dialer UI -->
- <string name="dialer_emptyListWorking">Loading\u2026</string>
-
- <!-- SIM PIN strings -->
- <!-- Instructional text on SIM PIN unlock panel -->
- <string name="enterPin">Type PIN code to unlock SIM card.</string>
- <!-- Success message displayed on SIM PIN unlock panel -->
- <string name="pinUnlocked">SIM unlocked</string>
- <!-- Label for PIN entry widget on SIM PIN unlock panel -->
- <string name="enterNewPin">New SIM PIN code</string>
- <!-- Label for PIN entry widget on SIM PIN unlock panel -->
- <string name="verifyNewPin">Type new SIM PIN code again to confirm</string>
- <!-- Error message displayed on SIM PIN unlock panel -->
- <string name="verifyFailed">The SIM PINs you typed do not match. Please try again.</string>
- <!-- Instructional text on SIM PIN unlock panel -->
- <string name="enterPuk">Type PUK code to unlock SIM card</string>
- <!-- Error message displayed on SIM PIN unlock panel -->
- <string name="badPuk">Incorrect PUK code!</string>
- <!-- Button label on SIM PIN unlock panel -->
- <string name="buttonTxtContinue">Continue</string>
- <!-- Status message displayed on SIM PIN unlock panel -->
- <string name="puk_unlocked">Your SIM card has been unblocked. Your phone is unlocking\u2026</string>
- <!-- network depersonalization -->
- <!-- Label text for PIN entry widget on SIM Network Depersonalization panel -->
- <string name="label_ndp">SIM network unlock PIN</string>
- <!-- Button label on SIM Network Depersonalization panel -->
- <string name="sim_ndp_unlock_text">Unlock</string>
- <!-- Button label on SIM Network Depersonalization panel -->
- <string name="sim_ndp_dismiss_text">Dismiss</string>
- <!-- Status message displayed on SIM Network Depersonalization panel -->
- <string name="requesting_unlock">Requesting network unlock\u2026</string>
- <!-- Error message displayed on SIM Network Depersonalization panel -->
- <string name="unlock_failed">Network unlock request unsuccessful.</string>
- <!-- Success message displayed on SIM Network Depersonalization panel -->
- <string name="unlock_success">Network unlock successful.</string>
-
- <!-- Title for the dialog used to display the user's IMEI number -->
- <string name="imei">IMEI</string>
-
- <!-- Title for the dialog used to display the user's MEID number on CDMA network -->
- <string name="meid">MEID</string>
-
- <!-- settings strings -->
-
- <!-- GSM Call settings screen, setting option name -->
- <string name="labelGSMMore">GSM call settings</string>
- <!-- CDM Call settings screen, setting option name -->
- <string name="labelCDMAMore">CDMA call settings</string>
- <!-- Mobile network settings screen, setting option name -->
- <string name="apn_settings">Access Point Names</string>
- <!-- Label for the "Network settings" screen in the Settings UI -->
- <string name="settings_label">Network settings</string>
- <!-- Call settings screen, setting option name -->
- <string name="voicemail">Voicemail</string>
- <!-- Call forwarding dialog box, voicemail number prefix -->
- <string name="voicemail_abbreviated">VM:</string>
- <!-- Mobile network settings screen, setting option name -->
- <string name="networks">Network operators</string>
- <!-- Call settings screen title -->
- <string name="call_settings">Call settings</string>
- <!-- GSM Call settings screen, setting option name -->
- <string name="additional_gsm_call_settings">Additional settings</string>
- <!-- GSM-only Call settings screen, setting option name-->
- <string name="sum_gsm_call_settings">Additional GSM only call settings</string>
- <!-- CDMA Call settings screen, setting option name -->
- <string name="additional_cdma_call_settings">Additional CDMA call settings</string>
- <!-- CDMA-only Call settings screen, setting option name-->
- <string name="sum_cdma_call_settings">Additional CDMA only call settings</string>
- <!-- Call setting screen, nework service setting name -->
- <string name="labelNwService">Network service settings</string>
- <!-- Call settings screen, setting option name -->
- <string name="labelCallerId">Caller ID</string>
- <!-- Additional call settings screen, setting summary text when Caller ID is hidden -->
- <string name="sum_hide_caller_id">Number hidden in outgoing calls</string>
- <!-- Additional call settings screen, setting summary text when Caller ID is shown -->
- <string name="sum_show_caller_id">Number displayed in outgoing calls</string>
- <!-- Additional call settings screen, setting summary text for default Caller ID value -->
- <string name="sum_default_caller_id">Use default operator settings to display my number in outgoing calls</string>
- <!-- Additional call settings screen, setting check box name -->
- <string name="labelCW">Call waiting</string>
- <!-- Additional call settings screen, setting summary text when call waiting check box is selected -->
- <string name="sum_cw_enabled">During a call, notify me of incoming calls</string>
- <!-- Additional call settings screen, setting summary text when call waiting check box is clear -->
- <string name="sum_cw_disabled">During a call, notify me of incoming calls</string>
- <!-- Call forwarding settings screen, section heading -->
- <string name="call_forwarding_settings">Call forwarding settings</string>
- <!-- Call settings screen, setting option name -->
- <string name="labelCF">Call forwarding</string>
-
- <!-- Call forwarding settings screen, setting option name -->
- <string name="labelCFU">Always forward</string>
- <!-- Call forwarding dialog box, text field label -->
- <string name="messageCFU">Always use this number</string>
- <!-- Call forwarding settings screen, setting summary text when forwarding all calls -->
- <string name="sum_cfu_enabled_indicator">Forwarding all calls</string>
- <!-- Call forwarding settings screen, setting summary text the Always forward is set -->
- <string name="sum_cfu_enabled">Forwarding all calls to {0}</string>
- <!-- Call forwarding settings screen, Always forward is enabled but the number is unavailable -->
- <string name="sum_cfu_enabled_no_number">Number is unavailable</string>
- <!-- Call forwarding settings screen, setting summary text when Always forward is disabled -->
- <string name="sum_cfu_disabled">Disabled</string>
-
- <!-- Call forwarding settings screen, setting option name -->
- <string name="labelCFB">Forward when busy</string>
- <!-- Call forwarding dialog box, text field label -->
- <string name="messageCFB">Number when busy</string>
- <!-- Call forwarding settings screen, setting summary text when forwarding to specific number when busy -->
- <string name="sum_cfb_enabled">Forwarding to {0}</string>
- <!-- Call forwarding settings screen, setting summary text when forwarding when busy is disabled -->
- <string name="sum_cfb_disabled">Disabled</string>
- <!-- Error message displayed after failing to disable forwarding calls when the phone is busy -->
- <string name="disable_cfb_forbidden">Your carrier does not support disabling call-forwarding when your phone is busy.</string>
-
- <!-- Call forwarding settings screen, setting option name -->
- <string name="labelCFNRy">Forward when unanswered</string>
- <!-- Call forwarding dialog box, text field label -->
- <string name="messageCFNRy">Number when unanswered</string>
- <!-- Call forwarding settings screen, setting summary text when forwarding to a specific number when unanswered -->
- <string name="sum_cfnry_enabled">Forwarding to {0}</string>
- <!-- Call forwarding settings screen, setting summary text when Forward when unanswered is disabled -->
- <string name="sum_cfnry_disabled">Disabled</string>
- <!-- Error message displayed after failing to disable forwarding calls when the phone does not answer -->
- <string name="disable_cfnry_forbidden">Your carrier does not support disabling call-forwarding when your phone doesn\'t answer.</string>
-
- <!-- Call forwarding settings screen, setting option name -->
- <string name="labelCFNRc">Forward when unreachable</string>
- <!-- Call forwarding dialog box, text field label -->
- <string name="messageCFNRc">Number when unreachable</string>
- <!-- Call forwarding settings screen, setting summary text when forwarding to a specific number when unreachable-->
- <string name="sum_cfnrc_enabled">Forwarding to {0}</string>
- <!-- Call forwarding settings screen, setting summary text when Forward when unreachable is disabled -->
- <string name="sum_cfnrc_disabled">Disabled</string>
- <!-- Error message displayed after failing to disable forwarding calls when the phone is unreachable -->
- <string name="disable_cfnrc_forbidden">Your carrier does not support disabling call-forwarding when your phone is unreachable.</string>
-
- <!-- Title of the progress dialog displayed while updating Call settings -->
- <string name="updating_title">Call settings</string>
- <!-- Title of the alert dialog displayed if an error occurs while updating Call settings -->
- <string name="error_updating_title">Call settings error</string>
- <!-- Toast in Call settings dialog while settings are being read -->
- <string name="reading_settings">Reading settings\u2026</string>
- <!-- Toast in Call settings dialog while settings are being saved -->
- <string name="updating_settings">Updating settings\u2026</string>
- <!-- Toast in Call settings dialog while settings are being reverted -->
- <string name="reverting_settings">Reverting settings\u2026</string>
- <!-- Status message displayed in the "Call settings error" dialog -->
- <string name="response_error">Unexpected response from network.</string>
- <!-- Status message displayed in the "Call settings error" dialog -->
- <string name="exception_error">Network or SIM card error.</string>
- <!-- Status message displayed in the "Call settings error" dialog -->
- <string name="radio_off_error">Please turn on the radio before viewing these settings.</string>
- <!-- Button label used to dismiss the "Call settings error" dialog -->
- <string name="close_dialog">OK</string>
- <!-- Button label used in several settings-related dialogs -->
- <string name="enable">Enable</string>
- <!-- Button label used in several settings-related dialogs -->
- <string name="disable">Disable</string>
- <!-- Button label which indicates the user wants to update a stored
- phone number; used in several settings-related dialogs -->
- <string name="change_num">Update</string>
- <!-- Phone settings: Caller ID preference values -->
- <string-array name="clir_display_values">
- <!-- Phone settings "Caller ID" preference option: use the default value -->
- <item>Network default</item>
- <!-- Phone settings "Caller ID" preference option: hide outgoing Caller ID info -->
- <item>Hide number</item>
- <!-- Phone settings "Caller ID" preference option: show outgoing Caller ID info -->
- <item>Show number</item>
- </string-array>
- <!-- Phone settings: Internal keys used for Caller ID preference values. DO NOT TRANSLATE. -->
- <string-array name="clir_values">
- <!-- Phone settings: Internal key used for Caller ID preference values. DO NOT TRANSLATE. -->
- <item><xliff:g>DEFAULT</xliff:g></item>
- <!-- Phone settings: Internal key used for Caller ID preference values. DO NOT TRANSLATE. -->
- <item><xliff:g>HIDE</xliff:g></item>
- <!-- Phone settings: Internal key used for Caller ID preference values. DO NOT TRANSLATE. -->
- <item><xliff:g>SHOW</xliff:g></item>
- </string-array>
-
- <!-- voicemail setting strings -->
- <!-- Call settings screen, Label used in "Save voicemail number" dialog -->
- <string name="vm_save_number">Save voicemail number</string>
- <!-- Call settings screen, Set voicemail number dialog text -->
- <string name="vm_changed">Voicemail number changed.</string>
- <!-- Call settings screen, Set voicemail number dialog text -->
- <string name="vm_change_failed">Voicemail number change unsuccessful.\nPlease contact your carrier if this problem persists.</string>
- <!-- Call settings screen, displayed when vm provider supplied forwarding number change fails-->
- <string name="fw_change_failed">Forwarding number change unsuccessful.\nPlease contact your carrier if this problem persists.</string>
- <!-- Call settings screen, displayed when forwarding number read fails-->
- <string name="fw_get_in_vm_failed">Failed to retrieve and save current forwarding number settings.\nDo you want to switch to the new provider anyway?</string>
- <!-- Call settings screen, Set voicemail number dialog text -->
- <string name="no_change">No changes were made.</string>
- <!-- Call settings screen, "Voicemail" provider setting summary text when no provider is selected -->
- <string name="sum_voicemail_choose_provider">Choose voicemail service</string>
- <!-- Call settings screen, "Voicemail" screen, default option - My Carrier -->
- <string name="voicemail_default">My carrier</string>
-
- <!-- networks setting strings -->
- <!-- Mobile network settings screen title -->
- <string name="mobile_networks">Mobile network settings</string>
- <!-- Available networks screen title/heading -->
- <string name="label_available">Available networks</string>
- <!-- Mobile network settings screen, toast when searching for available networks -->
- <string name="load_networks_progress">Searching\u2026</string>
- <!-- Available networks screen, text when no networks are found -->
- <string name="empty_networks_list">No networks found.</string>
- <!-- Available networks screen, setting option name -->
- <string name="search_networks">Search networks</string>
- <!-- Available networks screen, toast when an error is encountered when searching for networks -->
- <string name="network_query_error">Error while searching for networks.</string>
- <!-- Available networks screen, toast when registering on a specific network -->
- <string name="register_on_network">Registering on <xliff:g id="network">%s</xliff:g>\u2026</string>
- <!-- Available networks screen, toast when SIM card isn't allowed on a network -->
- <string name="not_allowed">Your SIM card does not allow a connection to this network.</string>
- <!-- Available networks screen, toast when unable to connect to a network temporarily -->
- <string name="connect_later">Unable to connect to this network at this time. Please try again later.</string>
- <!-- Available networks screen, toast when registered on a specific network -->
- <string name="registration_done">Registered on network.</string>
- <!-- Mobile network settings screen setting option summary text -->
- <string name="sum_carrier_select">Select a network operator</string>
- <!-- Available networks screen, setting summary text -->
- <string name="sum_search_networks">Search for all available networks</string>
- <!-- Available networks screen, setting option name -->
- <string name="select_automatically">Select automatically</string>
- <!-- Available networks screen, setting summary text -->
- <string name="sum_select_automatically">Automatically select preferred network</string>
- <string name="register_automatically">Automatic registration...</string>
- <string name="preferred_network_mode_title">Network Mode</string>
- <string name="preferred_network_mode_summary">Change the network operating mode</string>
- <string name="preferred_network_mode_dialogtitle">Preferred network mode</string>
- <string-array name="preferred_network_mode_choices">
- <item>Global</item>
- <item>EvDo only</item>
- <item>CDMA w/o EvDo</item>
- <item>CDMA / EvDo auto</item>
- <item>GSM / WCDMA auto</item>
- <item>WCDMA only</item>
- <item>GSM only</item>
- <item>GSM / WCDMA preferred</item>
- </string-array>
- <string-array name="preferred_network_mode_values">
- <item>"7"</item>
- <item>"6"</item>
- <item>"5"</item>
- <item>"4"</item>
- <item>"3"</item>
- <item>"2"</item>
- <item>"1"</item>
- <item>"0"</item>
- </string-array>
- <!-- Mobile network settings screen, data enabling checkbox name -->
- <string name="data_enabled">Data enabled</string>
- <!-- Mobile network settings screen, setting summary text when check box is not selected (explains what selecting it would do) -->
- <string name="data_enable_summary">Enable data access over Mobile network</string>
- <!-- Mobile network settings screen, setting check box name -->
- <string name="roaming">Data roaming</string>
- <!-- Mobile network settings screen, setting summary text when check box is selected -->
- <string name="roaming_enable">Connect to data services when roaming</string>
- <!-- Mobile network settings screen, setting summary text when check box is clear -->
- <string name="roaming_disable">Connect to data services when roaming</string>
- <!-- Mobile network settings UI: notification message shown when you
- lose data connectivity because you're roaming and you have the
- "data roaming" feature turned off. -->
- <string name="roaming_reenable_message">You have lost data connectivity because you left your home network with data roaming turned off.</string>
- <!-- Mobile network settings screen, dialog message when user selects the Data roaming check box -->
- <string name="roaming_warning">Allow data roaming? You may incur significant roaming charges!</string>
- <string name="gsm_umts_options">GSM/UMTS Options</string>
- <string name="cdma_options">CDMA Options</string>
-
- <!-- Screen option on the mobile network settings to go into data usage settings -->
- <string name="throttle_data_usage">Data usage</string>
- <!-- Title for the data usage settings screen -->
- <string name="throttle_settings_title">Carrier data policy</string>
- <!-- Data usage settings screen option for checking the current usage -->
- <string name="throttle_current_usage">Data used in current period</string>
- <!-- Data usage settings screen option for time frame-->
- <string name="throttle_time_frame">Data use period</string>
- <!-- Data usage settings screen option for throttling rate-->
- <string name="throttle_rate">Data rate policy</string>
- <!-- Data usage settings screen option for accessing the carrier website-->
- <string name="throttle_help">Learn more</string>
-
- <string name="throttle_status_subtext"><xliff:g id="used">%1$s</xliff:g> (<xliff:g id="used">%2$d</xliff:g>\u066A) of <xliff:g id="used">%3$s</xliff:g> period maximum\nNext period starts in <xliff:g id="used">%4$d</xliff:g> days (<xliff:g id="used">%5$s</xliff:g>)</string>
-
- <string name="throttle_data_usage_subtext"><xliff:g id="used">%1$s</xliff:g> (<xliff:g id="used">%2$d</xliff:g>\u066A) of <xliff:g id="used">%3$s</xliff:g> period maximum</string>
-
- <string name="throttle_data_rate_reduced_subtext"><xliff:g id="used">%1$s</xliff:g> maximum exceeded\nData rate reduced to <xliff:g id="used">%2$d</xliff:g> Kb/s</string>
-
- <string name="throttle_time_frame_subtext"><xliff:g id="used">%1$d</xliff:g>\u066A of cycle elapsed\nNext period starts in <xliff:g id="used">%2$d</xliff:g> days (<xliff:g id="used">%3$s</xliff:g>)</string>
-
- <string name="throttle_rate_subtext">Data rate reduced to <xliff:g id="used">%1$d</xliff:g> Kb/s if data use limit is exceeded</string>
-
- <string name="throttle_help_subtext">More information about your carrier\'s mobile network data use policy</string>
-
- <!-- Cell broadcast SMS strings -->
- <string name="cdma_cell_broadcast_sms">Cell Broadcast SMS</string>
-
- <string name="cell_broadcast_sms">Cell Broadcast SMS</string>
-
- <string name="enable_disable_cell_bc_sms">Cell Broadcast SMS</string>
- <string name="cell_bc_sms_enable">Cell Broadcast SMS enabled</string>
- <string name="cell_bc_sms_disable">Cell Broadcast SMS disabled</string>
-
- <string name="cb_sms_settings">Cell Broadcast SMS settings</string>
-
- <string name="enable_disable_emergency_broadcast">Emergency Broadcast</string>
- <string name="emergency_broadcast_enable">Emergency Broadcast enabled</string>
- <string name="emergency_broadcast_disable">Emergency Broadcast disabled</string>
-
- <string name="enable_disable_administrative">Administrative</string>
- <string name="administrative_enable">Administrative enabled</string>
- <string name="administrative_disable">Administrative disabled</string>
-
- <string name="enable_disable_maintenance">Maintenance</string>
- <string name="maintenance_enable">Maintenance enabled</string>
- <string name="maintenance_disable">Maintenance disabled</string>
-
- <string name="general_news_settings">General News</string>
- <string name="bf_news_settings">Business and Financial News</string>
- <string name="sports_news_settings">Sports News</string>
- <string name="entertainment_news_settings">Entertainment News</string>
-
- <string name="enable_disable_local">Local</string>
- <string name="local_enable">Local news enabled</string>
- <string name="local_disable">Local news disabled</string>
-
- <string name="enable_disable_regional">Regional</string>
- <string name="regional_enable">Regional news enabled</string>
- <string name="regional_disable">Regional news disabled</string>
-
- <string name="enable_disable_national">National</string>
- <string name="national_enable">National news enabled</string>
- <string name="national_disable">National news disabled</string>
-
- <string name="enable_disable_international">International</string>
- <string name="international_enable">International news enabled</string>
- <string name="international_disable">International news disabled</string>
-
- <string name="list_language_title">Language</string>
- <string name="list_language_summary">Select the news language</string>
- <string-array name="list_language_entries">
- <item>English</item>
- <item>French</item>
- <item>Spanish</item>
- <item>Japanese</item>
- <item>Korean</item>
- <item>Chinese</item>
- <item>Hebrew</item>
- </string-array>
- <string-array name="list_language_values">
- <item>"1"</item>
- <item>"2"</item>
- <item>"3"</item>
- <item>"4"</item>
- <item>"5"</item>
- <item>"6"</item>
- <item>"7"</item>
- </string-array>
- <string name="list_language_dtitle">Languages</string>
-
- <string name="enable_disable_local_weather">Local Weather</string>
- <string name="local_weather_enable">Local Weather enabled</string>
- <string name="local_weather_disable">Local Weather disabled</string>
-
- <string name="enable_disable_atr">Area Traffic Reports</string>
- <string name="atr_enable">Area Traffic Reports enabled</string>
- <string name="atr_disable">Area Traffic Reports disabled</string>
-
- <string name="enable_disable_lafs">Local Airport Flight Schedules</string>
- <string name="lafs_enable">Local Airport Flight Schedules enabled</string>
- <string name="lafs_disable">Local Airport Flight Schedules disabled</string>
-
- <string name="enable_disable_restaurants">Restaurants</string>
- <string name="restaurants_enable">Restaurants enabled</string>
- <string name="restaurants_disable">Restaurants disabled</string>
-
- <string name="enable_disable_lodgings">Lodgings</string>
- <string name="lodgings_enable">Lodgings enabled</string>
- <string name="lodgings_disable">Lodgings disabled</string>
-
- <string name="enable_disable_retail_directory">Retail Directory</string>
- <string name="retail_directory_enable">Retail Directory enabled</string>
- <string name="retail_directory_disable">Retail Directory disabled</string>
-
- <string name="enable_disable_advertisements">Advertisements</string>
- <string name="advertisements_enable">Advertisements enabled</string>
- <string name="advertisements_disable">Advertisements disabled</string>
-
- <string name="enable_disable_stock_quotes">Stock Quotes</string>
- <string name="stock_quotes_enable">Stock Quotes enabled</string>
- <string name="stock_quotes_disable">Stock Quotes disabled</string>
-
- <string name="enable_disable_eo">Employment Opportunities</string>
- <string name="eo_enable">Employment Opportunities enabled</string>
- <string name="eo_disable">Employment Opportunities disabled</string>
-
- <string name="enable_disable_mhh">Medical, Health and Hospital</string>
- <string name="mhh_enable">Medical, Health and Hospital enabled</string>
- <string name="mhh_disable">Medical, Health and Hospital disabled</string>
-
- <string name="enable_disable_technology_news">Technology News</string>
- <string name="technology_news_enable">Technology News enabled</string>
- <string name="technology_news_disable">Technology News disabled</string>
-
- <string name="enable_disable_multi_category">Multi-category</string>
- <string name="multi_category_enable">Multi-category enabled</string>
- <string name="multi_category_disable">Multi-category disabled</string>
-
- <!-- GSM/UMTS Options strings -->
- <string name="gsm_umts_network_preferences_title">GSM/UMTS Network Preferences</string>
- <string name="gsm_umts_network_preferneces_summary">Not implemented yet! </string>
- <string name="gsm_umts_network_preferences_dialogtitle">GSM/UMTS network preferences</string>
- <string-array name="gsm_umts_network_preferences_choices">
- <item>GSM/WCDMA (auto mode)</item>
- <item>WCDMA only</item>
- <item>GSM only</item>
- <item>GSM/WCDA (WCDMA preferred)</item>
- </string-array>
- <string-array name="gsm_umts_network_preferences_values">
- <item>"0"</item>
- <item>"1"</item>
- <item>"2"</item>
- <item>"3"</item>
- </string-array>
-
- <!-- Mobile network settings screen, setting option name -->
- <string name="prefer_2g">Use only 2G networks</string>
- <!-- Mobile network settings screen, setting summary text -->
- <string name="prefer_2g_summary">Saves battery</string>
-
- <!-- CDMA System select strings -->
- <!-- Mobile network settings screen, setting option name -->
- <string name="cdma_system_select_title">System select</string>
- <!-- Mobile network settings screen, setting summary text -->
- <string name="cdma_system_select_summary">Change the cdma roaming mode</string>
- <!-- System select settings screen title -->
- <string name="cdma_system_select_dialogtitle">System select</string>
- <string-array name="cdma_system_select_choices">
- <!-- System select dialog screen, setting option name -->
- <item>Home only</item>
- <!-- Remove the following option "Affiliated Networks" from the option list -->
- <!-- <item>Affiliated Networks</item> -->
- <!-- System select dialog screen, setting option name -->
- <item>Automatic</item>
- </string-array>
- <string-array name="cdma_system_select_values" translatable="false">
- <!-- Do not translate. -->
- <item>"0"</item>
- <!-- Remove the following value "1" which corresponds to "Affiliated Networks" above -->
- <!-- <item>"1"</item> -->
- <!-- Do not translate. -->
- <item>"2"</item>
- </string-array>
-
- <!-- CDMA Options strings -->
- <string name="cdma_roaming_mode_title">CDMA Roaming Mode</string>
- <string name="cdma_roaming_mode_summary">Change the cdma roaming mode</string>
- <string name="cdma_roaming_mode_dialogtitle">CDMA roaming mode</string>
- <string-array name="cdma_roaming_mode_choices">
- <item>Home Networks only</item>
- <item>Affiliated Networks</item>
- <item>Any Network</item>
- </string-array>
- <string-array name="cdma_roaming_mode_values">
- <item>"0"</item>
- <item>"1"</item>
- <item>"2"</item>
- </string-array>
- <string name="cdma_network_preferences_title">CDMA Network Preferences</string>
- <string name="cdma_network_preferneces_summary">Not implemented yet! </string>
- <string name="cdma_network_preferences_dialogtitle">CDMA network preferences</string>
- <string-array name="cdma_network_preferences_choices">
- <item>CDMA/EvDo</item>
- <item>CDMA only</item>
- <item>EvDo only</item>
- </string-array>
- <string-array name="cdma_network_preferences_values">
- <item>"0"</item>
- <item>"1"</item>
- <item>"2"</item>
- </string-array>
- <string name="subscription_title">CDMA Subscription TEST</string>
- <string name="subscription_summary">Change between RUIM/SIM and NV</string>
- <string name="subscription_dialogtitle">subscription</string>
- <string-array name="subscription_choices">
- <item>RUIM/SIM</item>
- <item>NV</item>
- </string-array>
- <string-array name="subscription_values">
- <item>"0"</item>
- <item>"1"</item>
- </string-array>
-
- <!-- FDN settings strings -->
- <!-- Call settings screen, setting option name -->
- <string name="fdn">Fixed Dialing Numbers</string>
- <!-- Call settings screen, button label that takes you to
- the Fixed Dialing Number management screen -->
- <string name="manage_fdn_list">FDN list</string>
- <!-- Call settings screen, preference item label -->
- <string name="fdn_activation">FDN activation</string>
- <!-- Call settings setting option name when FDN is enabled -->
- <string name="fdn_enabled">Fixed Dialing Numbers are enabled</string>
- <!-- Call settings setting option name when FDN is disabled-->
- <string name="fdn_disabled">Fixed Dialing Numbers are disabled</string>
- <!-- Call settings screen, setting option name -->
- <string name="enable_fdn">Enable FDN</string>
- <!-- Call settings screen, setting option name -->
- <string name="disable_fdn">Disable FDN</string>
- <!-- Call settings screen, setting option name -->
- <string name="change_pin2">Change PIN2</string>
- <!-- Call settings screen, setting option name when FDN is enabled -->
- <string name="enable_fdn_ok">Disable FDN</string>
- <!-- Call settings screen, setting option name when FDN is disabled -->
- <string name="disable_fdn_ok">Enable FDN</string>
- <!-- Call settings screen, setting summary text -->
- <string name="sum_fdn">Manage Fixed Dialing Numbers</string>
- <!-- Call settings, FDN screen, setting option name -->
- <string name="sum_fdn_change_pin">Change PIN for FDN access</string>
- <!-- Call settings, FDN screen, setting option name -->
- <string name="sum_fdn_manage_list">Manage phone number list</string>
- <string name="voice_privacy">Voice Privacy</string>
- <string name="voice_privacy_summary">Enable enhanced privacy mode</string>
- <string name="tty_mode_title">TTY mode</string>
- <string name="tty_mode_summary">Enable TTY mode</string>
- <string name="tty_mode_option_title">TTY mode</string>
- <string name="tty_mode_option_summary">Set TTY mode</string>
- <string name="auto_retry_mode_title">Auto Retry</string>
- <string name="auto_retry_mode_summary">Enable Auto Retry mode</string>
-
- <!-- FDN list screen: menu item label -->
- <string name="menu_add">Add contact</string>
- <!-- FDN list screen: menu item label -->
- <string name="menu_edit">Edit contact</string>
- <!-- FDN list screen: menu item label -->
- <string name="menu_delete">Delete contact</string>
-
- <!-- FDN related strings -->
- <!-- Label for PIN2 entry screen -->
- <string name="get_pin2">Enter PIN2</string>
- <!-- "Edit FDN Contact" screen: Label for the "name" text field -->
- <string name="name">Name</string>
- <!-- "Edit FDN Contact" screen: Label for the "number" text field -->
- <string name="number">Number</string>
- <!-- "Edit FDN Contact" screen: Button label for "save" action -->
- <string name="save">Save</string>
- <!-- Title of "Edit FDN Contact" screen for a new contact -->
- <string name="add_fdn_contact">Add fixed dialing number</string>
- <!-- "Edit FDN Contact" screen: status message displayed in a popup (toast) -->
- <string name="adding_fdn_contact">Adding fixed dialing number\u2026</string>
- <!-- "Edit FDN Contact" screen: status message displayed in a popup (toast) -->
- <string name="fdn_contact_added">Fixed dialing number added.</string>
- <!-- Title of "Edit FDN Contact" screen when editing an already-existing contact -->
- <string name="edit_fdn_contact">Edit fixed dialing number</string>
- <!-- "Edit FDN Contact" screen: status message displayed in a popup (toast) -->
- <string name="updating_fdn_contact">Updating fixed dialing number\u2026</string>
- <!-- "Edit FDN Contact" screen: status message displayed in a popup (toast) -->
- <string name="fdn_contact_updated">Fixed dialing number updated.</string>
- <!-- Title of "Delete FDN Contact" screen -->
- <string name="delete_fdn_contact">Delete fixed dialing number</string>
- <!-- "Delete FDN Contact" screen: status message displayed in a popup (toast) -->
- <string name="deleting_fdn_contact">Deleting fixed dialing number\u2026</string>
- <!-- "Delete FDN Contact" screen: status message displayed in a popup (toast) -->
- <string name="fdn_contact_deleted">Fixed dialing number deleted.</string>
- <!-- FDN settings: error message displayed in a popup (toast) -->
- <string name="pin2_invalid">FDN not updated: you entered an incorrect PIN.</string>
- <!-- FDN settings: error message displayed in a popup (toast) -->
- <string name="fdn_invalid_number">FDN not updated: number cannot exceed 20 digits.</string>
-
- <!-- ADN related strings -->
- <!-- Placeholder text displayed while loading the list of SIM contacts -->
- <string name="simContacts_emptyLoading">Reading from SIM card\u2026</string>
- <!-- Call settings, string that appears on FDN contact list when there are no contacts on the SIM. -->
- <string name="simContacts_empty">No contacts on your SIM card.</string>
- <!-- Call settings: title of the dialog that lets you select contacts from the SIM. -->
- <string name="simContacts_title">Select contacts to import</string>
-
- <!-- SIM PIN strings -->
- <!-- Title of "Enable/disable SIM PIN" screen -->
- <string name="enable_pin">Enable/disable SIM PIN</string>
- <!-- Title of "Change SIM PIN" screen -->
- <string name="change_pin">Change SIM PIN</string>
- <!-- SIM PIN screen: label for PIN entry widget -->
- <string name="enter_pin_text">SIM PIN:</string>
- <!-- SIM PIN screen: label for PIN entry widget -->
- <string name="oldPinLabel">Old PIN</string>
- <!-- SIM PIN screen: label for PIN entry widget -->
- <string name="newPinLabel">New PIN</string>
- <!-- SIM PIN screen: label for PIN entry widget -->
- <string name="confirmPinLabel">Confirm new PIN</string>
- <!-- SIM PIN screen: error message -->
- <string name="badPin">The old PIN you typed is not correct. Please try again.</string>
- <!-- SIM PIN screen: error message -->
- <string name="mismatchPin">The PINs you entered do not match. Please try again.</string>
- <!-- SIM PIN screen: error message when PIN is too short or too long -->
- <string name="invalidPin">Type a PIN that is 4 to 8 numbers.</string>
- <!-- Title of "Disable SIM PIN" screen -->
- <string name="disable_sim_pin">Disable SIM PIN</string>
- <!-- Title of "Enable SIM PIN" screen -->
- <string name="enable_sim_pin">Enable SIM PIN</string>
- <!-- SIM PIN screen: progress message displayed while enabling -->
- <string name="enable_in_progress">Please wait\u2026</string>
- <!-- SIM PIN screen: status message displayed in a popup (toast) -->
- <string name="enable_pin_ok">SIM PIN enabled</string>
- <!-- SIM PIN screen: status message displayed in a popup (toast) -->
- <string name="disable_pin_ok">SIM PIN disabled</string>
- <!-- SIM PIN screen: error message displayed in a popup (toast) -->
- <string name="pin_failed">The PIN you typed was incorrect</string>
- <!-- SIM PIN screen: status message displayed in a popup (toast) -->
- <string name="pin_changed">SIM PIN changed successfully</string>
- <!-- SIM PIN screen: error message displayed in a dialog -->
- <string name="puk_requested">Password incorrect, SIM is locked! PUK2 requested.</string>
-
- <!-- SIM PIN2 strings -->
- <!-- SIM PIN2 screen: label for PIN entry widget -->
- <string name="enter_pin2_text">PIN2</string>
- <!-- SIM PIN2 screen: label for PIN entry widget -->
- <string name="oldPin2Label">Old PIN2</string>
- <!-- SIM PIN2 screen: label for PIN entry widget -->
- <string name="newPin2Label">New PIN2</string>
- <!-- SIM PIN2 screen: label for PIN entry widget -->
- <string name="confirmPin2Label">Confirm new PIN2</string>
- <!-- SIM PIN2 screen: error message -->
- <string name="badPuk2">The PUK2 you typed is not correct. Please try again. </string>
- <!-- SIM PIN2 screen: error message -->
- <string name="badPin2">The old PIN2 you typed is not correct. Please try again.</string>
- <!-- SIM PIN2 screen: error message -->
- <string name="mismatchPin2">The PIN2s you entered do not match. Please try again.</string>
- <!-- SIM PIN2 screen: error message -->
- <string name="invalidPin2">Type a PIN2 that is 4 to 8 numbers.</string>
- <!-- SIM PIN2 screen: error message -->
- <string name="invalidPuk2">Type a PUK2 that is 8 numbers.</string>
- <!-- SIM PIN2 screen: status message displayed in a popup (toast) -->
- <string name="pin2_changed">PIN2 changed successfully</string>
- <!-- SIM PIN2 screen: label for PUK2 entry widget -->
- <string name="label_puk2_code">Type PUK2 code</string>
- <!-- SIM PIN2 screen: error message displayed in a dialog -->
- <string name="fdn_enable_puk2_requested">Password incorrect, please change PIN2 and retry!</string>
- <!-- SIM PIN2 screen: error message displayed in a dialog -->
- <string name="puk2_requested">Password incorrect, SIM is locked! PUK2 requested.</string>
-
- <!-- SIM PIN screen: button label -->
- <string name="doneButton">Done</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>
- <!-- In-call screen: Button label on "Manage conference" panel -->
- <string name="caller_manage_manage_done_text">Back to call</string>
-
- <!-- Used in FakePhoneActivity test code. DO NOT TRANSLATE. -->
- <string name="fake_phone_activity_phoneNumber_text">(650) 555-1234</string>
- <!-- Used in FakePhoneActivity test code. DO NOT TRANSLATE. -->
- <string name="fake_phone_activity_infoText_text">Incoming phone number</string>
- <!-- Used in FakePhoneActivity test code. DO NOT TRANSLATE. -->
- <string name="fake_phone_activity_placeCall_text">Fake Incoming Call</string>
-
- <!-- Button label on "SIM Missing" screen -->
- <string name="sim_missing_continueView_text">Continue without SIM card</string>
- <!-- Message displayed on "SIM Missing" screen -->
- <string name="sim_missing_msg_text">No SIM card found. Please insert a SIM card into the phone.</string>
-
- <!-- Button label on "SIM Unlock" screen -->
- <string name="sim_unlock_dismiss_text">Dismiss</string>
- <!-- Button label on "SIM Unlock" screen -->
- <string name="sim_unlock_unlock_text">Unlock</string>
- <!-- Progress message displayed on "SIM Unlock" screen -->
- <string name="sim_unlock_status_text">Authenticating PIN\u2026</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 -->
- <string name="card_title_dialing">Dialing</string>
- <!-- In-call screen: status label for a re-dialing call -->
- <string name="card_title_redialing">Retrying</string>
- <!-- In-call screen: status label for a call in progress -->
- <string name="card_title_in_progress">Current call</string>
- <!-- In-call screen: status label for a conference call -->
- <string name="card_title_conf_call">Conference call</string>
- <!-- In-call screen: status label for an incoming call -->
- <string name="card_title_incoming_call">Incoming call</string>
- <!-- In-call screen: status label for an cdma call waiting -->
- <string name="card_title_cdma_call_waiting">Cdma callwaiting </string>
- <!-- In-call screen: status label displayed briefly after a call ends -->
- <string name="card_title_call_ended">Call ended</string>
- <!-- In-call screen: status label for call that's on hold -->
- <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 -->
- <string name="card_title_hanging_up">Hanging up</string>
- <!-- In-call screen: status label for a call that's in CDMA flash mode -->
- <string name="card_title_in_call">In call</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 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, used
- as the format string for a Chronometer widget. -->
- <string name="notification_ongoing_call_format">Current call (<xliff:g id="duration">%s</xliff:g>)</string>
- <!-- The "label" of the in-call Notification for a call that's on hold -->
- <string name="notification_on_hold">On hold</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>
-
- <!-- 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 InCallScreen.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">Mobile network not available.</string>
- <!-- In-call screen: call failure message displayed in an error dialog -->
- <string name="incall_error_no_phone_number_supplied">Call not sent, no valid number entered.</string>
- <!-- In-call screen: call failure message displayed in an error dialog -->
- <string name="incall_error_call_failed">Call not sent.</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: status message displayed in a dialog when starting a feature code -->
- <string name="incall_status_dialed_fc">Starting feature code sequence\u2026</string>
- <!-- In-call screen: message displayed in an error dialog -->
- <string name="incall_error_supp_service_unknown">Unsupported service.</string>
- <!-- In-call screen: message displayed in an error dialog -->
- <string name="incall_error_supp_service_switch">Unable to switch calls.</string>
- <!-- In-call screen: message displayed in an error dialog -->
- <string name="incall_error_supp_service_separate">Unable to separate call.</string>
- <!-- In-call screen: message displayed in an error dialog -->
- <string name="incall_error_supp_service_transfer">Unable to transfer call.</string>
- <!-- In-call screen: message displayed in an error dialog -->
- <string name="incall_error_supp_service_conference">Unable to conference calls.</string>
- <!-- In-call screen: message displayed in an error dialog -->
- <string name="incall_error_supp_service_reject">Unable to reject call.</string>
- <!-- In-call screen: message displayed in an error dialog -->
- <string name="incall_error_supp_service_hangup">Unable to release call(s).</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">Out of service area, retrying\u2026</string>
-
- <!-- Dialer text on Emergency Dialer -->
- <!-- Emergency dialer: message displayed in an error dialog -->
- <string name="dial_emergency_error">Call not sent, <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">Call not sent, please 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>
-
- <!-- Hint text displayed in the "digits" field at the top of the
- in-call DTMF dialpad. (This hint reminds the user that the
- dialpad is there to generate tones, not to add a new call.) -->
- <string name="dtmfDialpadHintText">Touch tone keypad</string>
-
- <!-- Text displayed in the "sliding drawer handle" that you use to
- open the in-call DTMF dialpad. -->
- <string name="dtmfDialpadHandleLabel">Dialpad</string>
-
- <!-- Text displayed on the in-call screen's "touch lock" overlay,
- instructing the user that they need to double-tap to unlock the
- screen. -->
- <string name="touchLockText">Double-tap\nto unlock</string>
-
- <!-- Text for the onscreen "Answer" button, instructing the user that
- they need to double-tap to answer the incoming call. -->
- <string name="onscreenAnswerText">Double-tap\nto answer</string>
- <!-- Text for the onscreen "Decline" button -->
- <string name="onscreenRejectText">Double-tap\nto decline</string>
- <!-- Text for the onscreen "Hold" button -->
- <string name="onscreenHoldText">Hold</string>
- <!-- Text for the onscreen "Hold" button in the "Unhold" state -->
- <string name="onscreenUnholdText">Unhold</string>
- <!-- Text for the onscreen "End call" button -->
- <string name="onscreenEndCallText">End</string>
- <!-- Text for the onscreen "Show Dialpad" button -->
- <string name="onscreenShowDialpadText">Dialpad</string>
- <!-- Text for the onscreen "Hide Dialpad" button -->
- <string name="onscreenHideDialpadText">Hide</string>
- <!-- Text for the onscreen "Speaker" button -->
- <string name="onscreenSpeakerText">Speaker</string>
- <!-- Text for the onscreen "Mute" button -->
- <string name="onscreenMuteText">Mute</string>
- <!-- Text for the onscreen "Bluetooth" button -->
- <string name="onscreenBluetoothText">Bluetooth</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 -->
- <string name="onscreenManageConferenceText">Manage</string>
-
- <!-- Menu item label in SIM Contacts: Import a single contact entry from the SIM card -->
- <string name="importSimEntry">Import</string>
- <!-- Menu item label in SIM Contacts: Import all contact entries from the SIM card -->
- <string name="importAllSimEntries">Import all</string>
- <!-- SIM Contacts: status message displayed while importing card -->
- <string name="importingSimContacts">Importing SIM contacts</string>
- <!-- Import a single contact entry from contacts to the SIM card -->
- <string name="importToFDNfromContacts">Import from contacts</string>
-
- <!-- Hearing aid settings -->
- <string name="hac_mode_title">Hearing aids</string>
- <string name="hac_mode_summary">Turn on hearing aid compatibility</string>
-
- <!-- Service option entries. -->
- <string-array name="tty_mode_entries">
- <item>TTY Off</item>
- <item>TTY Full</item>
- <item>TTY HCO</item>
- <item>TTY VCO</item>
- </string-array>
-
- <!-- Do not translate. -->
- <string-array name="tty_mode_values" translatable="false">
- <!-- Do not translate. -->
- <item>0</item>
- <!-- Do not translate. -->
- <item>1</item>
- <!-- Do not translate. -->
- <item>2</item>
- <!-- Do not translate. -->
- <item>3</item>
- </string-array>
-
- <!-- Label for ERI text widget, shown in list of all gadgets -->
- <string name="eri_text_label">ERI text</string>
-
- <!-- Dtmf tones settings -->
- <!-- Title for the DTMF Tones options displayed in Call Settings -->
- <string name="dtmf_tones_title">DTMF Tones</string>
- <!-- Summary for the DTMF Tones options displayed in Call Settings -->
- <string name="dtmf_tones_summary">Set the length of DTMF tones</string>
- <!-- Options displayed as part of DTMF Tones in Call Settings -->
- <string-array name="dtmf_tone_entries">
- <item>Normal</item>
- <item>Long</item>
- </string-array>
- <!-- Do not translate. -->
- <string-array name="dtmf_tone_values">
- <item>0</item>
- <item>1</item>
- </string-array>
-
- <!-- Title for the dialog used to display CDMA DisplayInfo -->
- <string name="network_message">Network Message</string>
-
- <!-- OTA-specific strings -->
- <!-- Title shown on OTA screen -->
- <string name="ota_title_activate">Activate your phone</string>
- <!-- Message displayed on the OTA activation screen. -->
- <string name="ota_touch_activate">A special call needs to be made to activate your phone service.
- \n\nAfter pressing \u201CActivate\u201D, listen to the instructions provided to activate your phone.</string>
-
- <!-- Message displayed on the OTA activation screen -->
- <string name="ota_touch_activate_new">Touch \u201CActivate\u201D to place a special call that activates your phone on your carrier\'s mobile network, so you can place calls and connect to mobile data networks.</string>
- <!-- Title of skip activation dialog -->
- <string name="ota_skip_activation_dialog_title">Skip activation\?</string>
- <!-- Message displayed in skip activation dialog -->
- <string name="ota_skip_activation_dialog_message">If you skip activation, you can\'t place calls or connect to mobile data networks (though you can connect to Wi-Fi networks). Until you activate your phone, you are asked to activate it each time you turn it on.</string>
- <!-- Label shown on dialog button that allows the user to skip activation -->
- <string name="ota_skip_activation_dialog_skip_label">Skip</string>
- <!-- Label shown on dialog button that continues with activation -->
- <string name="ota_skip_activation_dialog_continue_label">Activate</string>
-
- <!-- Button label within the OTA activation screen -->
- <string name="ota_activate">Activate</string>
- <!-- Title text shown when phone activation is successful -->
- <string name="ota_title_activate_success">Phone is activated!</string>
- <!-- Title text shown on screen where activation fails -->
- <string name="ota_title_problem_with_activation">Problem with activation</string>
- <!-- Message displayed on the OTA listen screen. This message should be short to ensure the dialer fits. -->
- <string name="ota_listen">Follow the spoken instructions until you hear that activation is complete.</string>
-
- <!-- Button label within the OTA listen screen -->
- <string name="ota_dialpad">Keypad</string>
- <!-- Button label within the OTA listen screen -->
- <string name="ota_speaker">Speaker</string>
- <!-- String to be displayed on OTA listen screen once user has selected the
- correct option to begin provisioning -->
- <string name="ota_progress">Please wait while your phone is being programmed.</string>
- <!-- String to display within the OTA Fail Notice dialog -->
- <string name="ota_failure">Programming Unsuccessful</string>
- <!-- String to be displayed on the OTA Fail/Success screen upon successful provisioning -->
- <string name="ota_successful">Your phone is now activated. It may take up to 15 minutes for service to start.</string>
- <!-- String to be displayed on the OTA Fail/Success screen upon unsuccessful provisioning -->
- <string name="ota_unsuccessful">Your phone did not activate.
- \nYou may need to find an area with better coverage (near a window, or outside).
- \n\nTry again or call customer service for more options.</string>
- <!-- String to display within the OTA SPC Fail Notice dialog -->
- <string name="ota_spc_failure">EXCESS SPC FAILURES</string>
- <!-- Button label in OTA listen screen that cancels activation and goes to the previous screen -->
- <string name="ota_call_end">Back</string>
- <!-- Button label shown on OTA error screen to allow the user to try again -->
- <string name="ota_try_again">Try again</string>
- <!-- Button label shown on OTA screens that have a next screen -->
- <string name="ota_next">Next</string>
- <!-- Button label shown on OTA screens to go back to the previous screen -->
- <string name="ota_back">Back</string>
-
- <!-- Emergency Callback Mode (ECM) -->
- <string name="ecm_exit_dialog">EcmExitDialog</string>
- <!-- ECM: Status bar notification message -->
- <string name="phone_entered_ecm_text">Entered Emergency Callback Mode</string>
- <!-- ECM: Notification title -->
- <string name="phone_in_ecm_notification_title">Emergency Callback Mode</string>
- <!-- ECM: Notification body -->
- <string name="phone_in_ecm_call_notification_text">Data connection disabled</string>
- <plurals name="phone_in_ecm_notification_time">
- <!-- number of minutes is one -->
- <item quantity="one">No data connection for <xliff:g id="count">%s</xliff:g> minute</item>
- <!-- number of minutes is not equal to one -->
- <item quantity="other">No data connection for <xliff:g id="count">%s</xliff:g> minutes</item>
- </plurals>
- <!-- ECM: Dialog box message for exiting from the notifications screen -->
- <plurals name="alert_dialog_exit_ecm">
- <!-- number of minutes is one -->
- <item quantity="one">The phone will be in emergency callback mode for <xliff:g id="count">%s</xliff:g> minute. While in this mode no applications using a data connection can be used. Would you like to exit now?</item>
- <!-- number of minutes is not equal to one -->
- <item quantity="other">The phone will be in emergency callback mode for <xliff:g id="count">%s</xliff:g> minutes. While in this mode no applications using a data connection can be used. Would you like to exit now?</item>
- </plurals>
- <!-- ECM: Dialog box message for exiting from any other app -->
- <plurals name="alert_dialog_not_avaialble_in_ecm">
- <!-- number of minutes is one -->
- <item quantity="one">The selected action is not available while in the emergency callback mode. The phone will be in this mode for <xliff:g id="count">%s</xliff:g> minute. Would you like to exit now?</item>
- <!-- number of minutes is not equal to one -->
- <item quantity="other">The selected action is not available while in the emergency callback mode. The phone will be in this mode for <xliff:g id="count">%s</xliff:g> minutes. Would you like to exit now?</item>
- </plurals>
- <!-- ECM: Dialog box message while in emergency call -->
- <string name="alert_dialog_in_ecm_call">The selected action is not available while in an emergency call</string>
- <!-- ECM: Progress text -->
- <string name="progress_dialog_exiting_ecm">Exiting Emergency Callback Mode</string>
- <!-- ECM: ECM exit dialog choice -->
- <string name="alert_dialog_yes">Yes</string>
- <!-- ECM: ECM exit dialog choice -->
- <string name="alert_dialog_no">No</string>
- <!-- ECM: ECM exit dialog choice -->
- <string name="alert_dialog_dismiss">Dismiss</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 name="absent_num">ABSENT NUMBER</string>
-
- <!-- Voicemail dialog title -->
- <string name="voicemail_settings">Voicemail settings</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>
-
- <!-- Voicemail service pref title -->
- <string name="voicemail_provider">Voicemail service</string>
-
- <!-- Prefix on the voicemail settings preference. The full string will be Settings for <provider name> -->
- <string name="voicemail_settings_for">Settings for <xliff:g id="provider_name">%s</xliff:g></string>
-
- <!-- Title displayed above settings coming after voicemail in the call features screen -->
- <string name="other_settings">Other call settings</string>
-
- <!-- Label for onscreen "Dial" button used in the EmergencyDialer -->
- <string name="dial_button_label">Dial</string>
-
- <!-- Title displayed in the overlay when a call is placed using a 3rd party provider.
- ^1 is the localized name of the provider obtained from the package manager.
- ^2 is a phone number.
- E.g: "Calling via Google Voice\n 1-800-666-1234"
- -->
- <string name="calling_via_template">Calling via ^1\n<b>^2</b></string>
-
- <!-- Onscreen hints used for various states of the SlidingTab
- widget used for incoming calls. -->
- <eat-comment />
- <!-- Incoming call hint: drag the tab right to answer -->
- <string name="slide_to_answer">Drag right to answer</string>
- <!-- Incoming call hint: drag the tab left to silence ringer -->
- <string name="slide_to_silence">Drag left to silence ringer</string>
- <!-- Incoming call hint: drag the tab left to decline the incoming call -->
- <string name="slide_to_decline">Drag left to decline</string>
- <!-- Incoming call hint: drag the tab right to answer and hold the active call -->
- <string name="slide_to_answer_and_hold">Drag right to answer and\nhold active call</string>
- <!-- Incoming call hint: drag the tab right to answer and end the active call -->
- <string name="slide_to_answer_and_end_active">Drag right to answer and\nend active call</string>
- <!-- Incoming call hint: drag the tab right to answer and end the call on hold -->
- <string name="slide_to_answer_and_end_onhold">Drag right to answer and\nend call on hold</string>
-
- <!-- Incoming call hint shown on tab (must be kept very short): answer incoming call -->
- <string name="slide_to_answer_hint">Answer</string>
- <!-- Incoming call hint shown on tab (must be kept very short): decline incoming call -->
- <string name="slide_to_decline_hint">Decline</string>
-
-</resources>
diff --git a/phone/res/values/styles.xml b/phone/res/values/styles.xml
deleted file mode 100644
index fdc1766..0000000
--- a/phone/res/values/styles.xml
+++ /dev/null
@@ -1,229 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources>
- <drawable name="separator_red">#FFAE1200</drawable>
- <drawable name="separator_green">#FF008115</drawable>
- <drawable name="grayBg">#FF333333</drawable>
-
- <style name="Incoming">
- <item name="android:windowFrame">@null</item>
- <item name="android:windowBackground">@null</item>
- </style>
-
- <style name="IccPanel">
- <item name="android:windowFrame">@null</item>
- <item name="android:windowBackground">@drawable/grayBg</item>
- </style>
-
- <style name="AlertPanel">
- <item name="android:windowFrame">@null</item>
- <item name="android:windowBackground">@drawable/grayBg</item>
- </style>
-
- <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:paddingRight">4dip</item>
- </style>
-
- <style name="info_layout">
- <item name="android:orientation">vertical</item>
- <item name="android:paddingLeft">10dip</item>
- <item name="android:paddingTop">10dip</item>
- <item name="android:paddingRight">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>
-
- <style name="incall_top_button" parent="android:Widget.Button">
- <item name="android:gravity">center_vertical</item>
- <item name="android:layout_width">0sp</item>
- <item name="android:layout_weight">1</item>
- <item name="android:layout_height">match_parent</item>
- <item name="android:padding">0dip</item>
- <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
- <item name="android:textColor">#000</item>
- </style>
-
- <style name="TextAppearance.DialerLine1" parent="@android:style/TextAppearance.Widget.Button">
- <item name="android:textSize">32sp</item>
- <item name="android:textColor">@color/dialer_button_text</item>
- <item name="android:textStyle">bold</item>
- </style>
-
- <style name="TextAppearance.DialerLine2" parent="@android:style/TextAppearance.Widget.Button">
- <item name="android:textSize">18sp</item>
- <item name="android:textColor">@color/dialer_button_text</item>
- </style>
-
- <style name="TextAppearance.EmergencyDialerLine1" parent="@android:style/TextAppearance.Widget.Button">
- <item name="android:textSize">22sp</item>
- <item name="android:textColor">#ffffff</item>
- </style>
-
- <style name="TextAppearance.EmergencyDialerLine2" parent="@android:style/TextAppearance.Widget.Button">
- <item name="android:textSize">14sp</item>
- <item name="android:textColor">#ffffff</item>
- </style>
-
- <!-- Preference Style for the phone number preferences -->
- <style name="EditPhoneNumberPreference">
- <item name="enableButtonText">@string/enable</item>
- <item name="disableButtonText">@string/disable</item>
- <item name="changeNumButtonText">@string/change_num</item>
- <item name="confirmMode">activation</item>
- </style>
-
- <!-- Preference Style for the emergency callback mode -->
- <!-- This styles is currently not used and just prepared for further usage -->
- <style name="EmergencyCallBack">
- <item name="android:textSize">20sp</item>
- <item name="android:textColor">#ffffff</item>
- <item name="android:windowNoTitle">true</item>
- <item name="android:colorForeground">#fff</item>
- </style>
-
- <!-- Preference Style for the ERI text -->
- <style name="EriWidgetBackground">
- </style>
-
- <style name="TextAppearance.EriWidget">
- <item name="android:textSize">16sp</item>
- <item name="android:textStyle">bold</item>
- <item name="android:textColor">@android:color/black</item>
- </style>
-
- <!-- OTA Call Card styles -->
- <style name="ccOtaButtonBar">
- <!-- TODO: change height to 'wrap_content' when layout bug is fixed -->
- <item name="android:layout_height">60dip</item>
- <item name="android:layout_width">match_parent</item>
- <item name="android:background">@android:drawable/bottom_bar</item>
- </style>
-
- <style name="ccOtaButton">
- <item name="android:layout_width">150dip</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:layout_marginTop">5dip</item>
- <item name="android:layout_marginBottom">5dip</item>
- </style>
-
- <style name="ccOtaNextButton" parent="ccOtaButton">
- <!-- <item name="android:drawableRight">@drawable/ic_btn_next</item>
- <item name="android:drawablePadding">10dip</item>
- -->
- <item name="android:layout_alignParentBottom">true</item>
- <item name="android:layout_alignParentRight">true</item>
- <item name="android:layout_marginRight">4dip</item>
- </style>
-
- <style name="ccOtaSkipButton" parent="ccOtaButton">
- <item name="android:layout_alignParentBottom">true</item>
- <item name="android:layout_alignParentLeft">true</item>
- <item name="android:layout_marginLeft">4dip</item>
- </style>
-
- <style name="ccOtaDialVisible">
- <item name="android:visibility">visible</item>
- </style>
-
- <style name="ccOtaWizardTitle">
- <item name="android:textSize">22sp</item>
- <item name="android:textColor">@color/ota_title_color</item>
- </style>
-
- <style name="ccOtaTextPrimary">
- <item name="android:textColor">?android:attr/textColorPrimary</item>
- <item name="android:textSize">17sp</item>
- </style>
-
- <!-- Regular (non-toggle) buttons in the in-call onscreen touch UI. -->
- <style name="InCallTouchButton">
- <item name="android:gravity">center</item>
- <item name="android:background">@drawable/incall_button</item>
- <item name="android:layout_marginTop">8dip</item>
- <item name="android:layout_marginBottom">8dip</item>
- <item name="android:layout_marginLeft">8dip</item>
- <item name="android:layout_marginRight">8dip</item>
- <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
- <item name="android:textColor">?android:attr/textColorPrimary</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">marquee</item>
- </style>
-
- <!-- Toggle buttons in the in-call onscreen touch UI. -->
- <style name="InCallTouchToggleButton">
- <item name="android:gravity">center</item>
- <item name="android:background">@drawable/incall_toggle_button</item>
- <item name="android:layout_marginTop">8dip</item>
- <item name="android:layout_marginBottom">8dip</item>
- <item name="android:layout_marginLeft">8dip</item>
- <item name="android:layout_marginRight">8dip</item>
- <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
- <item name="android:textColor">?android:attr/textColorPrimary</item>
- <item name="android:singleLine">true</item>
- <item name="android:ellipsize">marquee</item>
- </style>
-
- <!-- Small round ImageButtons at the upper corners of the in-call onscreen touch UI. -->
- <style name="InCallRoundTouchButton">
- <item name="android:gravity">center</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:background">@drawable/incall_round_button</item>
- </style>
-
- <!-- Text label next to the small round ImageButtons at the upper
- corners of the in-call onscreen touch UI. -->
- <style name="InCallRoundButtonLabel">
- <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
- <item name="android:textSize">14sp</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:layout_marginLeft">5dip</item>
- <item name="android:layout_marginRight">5dip</item>
- </style>
-
- <!-- Style for the LinearLayout used to hold the ImageButton and
- TextView for the small round buttons at the upper corners of the
- in-call onscreen touch UI. -->
- <style name="InCallRoundButtonContainer">
- <item name="android:orientation">horizontal</item>
- <item name="android:gravity">center_vertical</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:layout_height">wrap_content</item>
- <item name="android:layout_alignParentTop">true</item>
- <item name="android:layout_marginTop">10dip</item>
- </style>
-
-</resources>
diff --git a/phone/res/xml/call_feature_setting.xml b/phone/res/xml/call_feature_setting.xml
deleted file mode 100644
index 9bb0c9a..0000000
--- a/phone/res/xml/call_feature_setting.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-<?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.
--->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:phone="http://schemas.android.com/apk/res/com.android.phone2"
- android:title="@string/call_settings">
-
- <PreferenceScreen
- android:key="button_fdn_key"
- android:title="@string/fdn"
- android:summary="@string/sum_fdn"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.FdnSetting" />
-
- </PreferenceScreen>
-
- <PreferenceCategory
- android:key="button_voicemail_category_key"
- android:title="@string/voicemail"
- android:persistent="false">
- <ListPreference
- android:key="button_voicemail_provider_key"
- android:title="@string/voicemail_provider"
- android:summary="@string/sum_voicemail_choose_provider"
- android:defaultValue=""
- android:persistent="true"
- />
- <PreferenceScreen android:key="button_voicemail_setting_key"
- android:title="@string/voicemail_settings"
- android:persistent="false">
-
- <!-- Note for all com.android.phone2.EditPhoneNumberPreference objects
-
- The last several attributes are for use with the EditText field
- in the dialog. These attributes are forwarded to that field
- when the edittext is created. The attributes include:
- 1. android:singleLine
- 2. android:autoText
- 3. android:background -->
-
- <com.android.phone2.EditPhoneNumberPreference
- android:key="button_voicemail_key"
- android:title="@string/voicemail_settings_number_label"
- android:persistent="false"
- android:dialogTitle="@string/voicemail"
- phone:confirmMode="confirm"
- android:singleLine="true"
- android:autoText="false" />
- </PreferenceScreen>
- </PreferenceCategory>
-
- <PreferenceCategory android:key="button_misc_category_key"
- android:title="@string/other_settings"
- android:persistent="false" />
-
- <CheckBoxPreference
- android:key="button_auto_retry_key"
- android:title="@string/auto_retry_mode_title"
- android:persistent="false"
- android:summary="@string/auto_retry_mode_summary"/>
-
- <ListPreference
- android:key="button_tty_mode_key"
- android:title="@string/tty_mode_option_title"
- android:summary="@string/tty_mode_option_summary"
- android:persistent="false"
- android:entries="@array/tty_mode_entries"
- android:entryValues="@array/tty_mode_values"/>
-
- <CheckBoxPreference
- android:key="button_hac_key"
- android:title="@string/hac_mode_title"
- android:persistent="true"
- android:summary="@string/hac_mode_summary"/>
-
- <ListPreference
- android:key="button_dtmf_settings"
- android:title="@string/dtmf_tones_title"
- android:summary="@string/dtmf_tones_summary"
- android:entries="@array/dtmf_tone_entries"
- android:entryValues="@array/dtmf_tone_values"/>
-
- <PreferenceScreen
- android:key="button_gsm_more_expand_key"
- android:title="@string/labelGSMMore"
- android:summary="@string/sum_gsm_call_settings"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.GsmUmtsCallOptions"/>
- </PreferenceScreen>
-
- <PreferenceScreen
- android:key="button_cdma_more_expand_key"
- android:title="@string/labelCDMAMore"
- android:summary="@string/sum_cdma_call_settings"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.CdmaCallOptions"/>
- </PreferenceScreen>
-</PreferenceScreen>
diff --git a/phone/res/xml/callforward_options.xml b/phone/res/xml/callforward_options.xml
deleted file mode 100644
index 2e423d9..0000000
--- a/phone/res/xml/callforward_options.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:phone="http://schemas.android.com/apk/res/com.android.phone2"
- android:title="@string/call_forwarding_settings">
-
-
- <!-- Note for all com.android.phone2.EditPreference objects
-
- The last several attributes are for use with the EditText field
- in the dialog. These attributes are forwarded to that field
- when the edittext is created. The attributes include:
- 1. android:singleLine
- 2. android:autoText
- 3. android:background -->
-
- <com.android.phone2.CallForwardEditPreference
- android:key="button_cfu_key"
- android:title="@string/labelCFU"
- android:persistent="false"
- android:summaryOn="@string/sum_cfu_enabled"
- android:summaryOff="@string/sum_cfu_disabled"
- android:dialogTitle="@string/labelCFU"
- android:dialogMessage="@string/messageCFU"
- phone:confirmMode="activation"
- phone:serviceClass="voice"
- phone:reason="unconditional"
- android:singleLine="true"
- android:autoText="false"/>
-
- <!-- See note on com.android.phone2.EditPreference above -->
- <com.android.phone2.CallForwardEditPreference
- android:key="button_cfb_key"
- android:title="@string/labelCFB"
- android:persistent="false"
- android:summaryOn="@string/sum_cfb_enabled"
- android:summaryOff="@string/sum_cfb_disabled"
- android:dialogTitle="@string/labelCFB"
- android:dialogMessage="@string/messageCFB"
- phone:confirmMode="activation"
- phone:serviceClass="voice"
- phone:reason="busy"
- android:dependency="button_cfu_key"
- android:singleLine="true"
- android:autoText="false"/>
-
- <!-- See note on com.android.phone2.EditPreference above -->
- <com.android.phone2.CallForwardEditPreference
- android:key="button_cfnry_key"
- android:title="@string/labelCFNRy"
- android:persistent="false"
- android:summaryOn="@string/sum_cfnry_enabled"
- android:summaryOff="@string/sum_cfnry_disabled"
- android:dialogTitle="@string/labelCFNRy"
- android:dialogMessage="@string/messageCFNRy"
- phone:confirmMode="activation"
- phone:serviceClass="voice"
- phone:reason="no_reply"
- android:dependency="button_cfu_key"
- android:singleLine="true"
- android:autoText="false"/>
-
- <!-- See note on com.android.phone2.EditPreference above -->
- <com.android.phone2.CallForwardEditPreference
- android:key="button_cfnrc_key"
- android:title="@string/labelCFNRc"
- android:persistent="false"
- android:summaryOn="@string/sum_cfnrc_enabled"
- android:summaryOff="@string/sum_cfnrc_disabled"
- android:dialogTitle="@string/labelCFNRc"
- android:dialogMessage="@string/messageCFNRc"
- phone:confirmMode="activation"
- phone:serviceClass="voice"
- phone:reason="not_reachable"
- android:dependency="button_cfu_key"
- android:singleLine="true"
- android:autoText="false"/>
-</PreferenceScreen>
diff --git a/phone/res/xml/carrier_select.xml b/phone/res/xml/carrier_select.xml
deleted file mode 100644
index bc223f1..0000000
--- a/phone/res/xml/carrier_select.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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.
--->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:key="list_networks_key"
- android:title="@string/label_available">
- <Preference
- android:key="button_srch_netwrks_key"
- android:title="@string/search_networks"
- android:summary="@string/sum_search_networks"
- android:persistent="false"/>
- <Preference
- android:key="button_auto_select_key"
- android:title="@string/select_automatically"
- android:summary="@string/sum_select_automatically"
- android:persistent="false"/>
-</PreferenceScreen>
diff --git a/phone/res/xml/cdma_call_options.xml b/phone/res/xml/cdma_call_options.xml
deleted file mode 100644
index ea56a3a..0000000
--- a/phone/res/xml/cdma_call_options.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res/com.android.phone2"
- android:title="@string/additional_cdma_call_settings">
-
- <com.android.phone2.CdmaVoicePrivacyCheckBoxPreference
- android:key="button_voice_privacy_key"
- android:title="@string/voice_privacy"
- android:persistent="false"
- android:summary="@string/voice_privacy_summary"/>
-</PreferenceScreen>
diff --git a/phone/res/xml/cdma_options.xml b/phone/res/xml/cdma_options.xml
deleted file mode 100644
index e2ff8df..0000000
--- a/phone/res/xml/cdma_options.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res/com.android.phone2">
-
- <com.android.phone2.CdmaRoamingListPreference
- android:key="cdma_roaming_mode_key"
- android:title="@string/cdma_system_select_title"
- android:summary="@string/cdma_system_select_summary"
- android:entries="@array/cdma_system_select_choices"
- android:entryValues="@array/cdma_system_select_values"
- android:dialogTitle="@string/cdma_system_select_dialogtitle" />
-</PreferenceScreen>
diff --git a/phone/res/xml/cell_broadcast_sms.xml b/phone/res/xml/cell_broadcast_sms.xml
deleted file mode 100644
index 950565e..0000000
--- a/phone/res/xml/cell_broadcast_sms.xml
+++ /dev/null
@@ -1,317 +0,0 @@
-<?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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res/com.android.phone2">
-
- <PreferenceCategory
- android:title="@string/cell_broadcast_sms">
-
- <CheckBoxPreference
- android:key="button_enable_disable_cell_bc_sms"
- android:title="@string/enable_disable_cell_bc_sms"
- android:persistent="false"
- android:summaryOn="@string/cell_bc_sms_enable"
- android:summaryOff="@string/cell_bc_sms_disable"/>
-
- </PreferenceCategory>
-
- <PreferenceCategory
- android:title="@string/cb_sms_settings">
-
- <ListPreference
- android:key="list_language"
- android:title="@string/list_language_title"
- android:summary="@string/list_language_summary"
- android:entries="@array/list_language_entries"
- android:entryValues="@array/list_language_values"
- android:dialogTitle="@string/list_language_dtitle"/>
-
- <CheckBoxPreference
- android:key="button_emergency_broadcast"
- android:title="@string/enable_disable_emergency_broadcast"
- android:persistent="false"
- android:summaryOn="@string/emergency_broadcast_enable"
- android:summaryOff="@string/emergency_broadcast_disable"/>
-
- <CheckBoxPreference
- android:key="button_administrative"
- android:title="@string/enable_disable_administrative"
- android:persistent="false"
- android:summaryOn="@string/administrative_enable"
- android:summaryOff="@string/administrative_disable"/>
-
- <CheckBoxPreference
- android:key="button_maintenance"
- android:title="@string/enable_disable_maintenance"
- android:persistent="false"
- android:summaryOn="@string/maintenance_enable"
- android:summaryOff="@string/maintenance_disable"/>
-
- <CheckBoxPreference
- android:key="button_local_weather"
- android:title="@string/enable_disable_local_weather"
- android:persistent="false"
- android:summaryOn="@string/local_weather_enable"
- android:summaryOff="@string/local_weather_disable"/>
-
- <CheckBoxPreference
- android:key="button_atr"
- android:title="@string/enable_disable_atr"
- android:persistent="false"
- android:summaryOn="@string/atr_enable"
- android:summaryOff="@string/atr_disable"/>
-
- <CheckBoxPreference
- android:key="button_lafs"
- android:title="@string/enable_disable_lafs"
- android:persistent="false"
- android:summaryOn="@string/lafs_enable"
- android:summaryOff="@string/lafs_disable"/>
-
- <CheckBoxPreference
- android:key="button_restaurants"
- android:title="@string/enable_disable_restaurants"
- android:persistent="false"
- android:summaryOn="@string/restaurants_enable"
- android:summaryOff="@string/restaurants_disable"/>
-
- <CheckBoxPreference
- android:key="button_lodgings"
- android:title="@string/enable_disable_lodgings"
- android:persistent="false"
- android:summaryOn="@string/lodgings_enable"
- android:summaryOff="@string/lodgings_disable"/>
-
- <CheckBoxPreference
- android:key="button_retail_directory"
- android:title="@string/enable_disable_retail_directory"
- android:persistent="false"
- android:summaryOn="@string/retail_directory_enable"
- android:summaryOff="@string/retail_directory_disable"/>
-
- <CheckBoxPreference
- android:key="button_advertisements"
- android:title="@string/enable_disable_advertisements"
- android:persistent="false"
- android:summaryOn="@string/advertisements_enable"
- android:summaryOff="@string/advertisements_disable"/>
-
- <CheckBoxPreference
- android:key="button_stock_quotes"
- android:title="@string/enable_disable_stock_quotes"
- android:persistent="false"
- android:summaryOn="@string/stock_quotes_enable"
- android:summaryOff="@string/stock_quotes_disable"/>
-
- <CheckBoxPreference
- android:key="button_eo"
- android:title="@string/enable_disable_eo"
- android:persistent="false"
- android:summaryOn="@string/eo_enable"
- android:summaryOff="@string/eo_disable"/>
-
- <CheckBoxPreference
- android:key="button_mhh"
- android:title="@string/enable_disable_mhh"
- android:persistent="false"
- android:summaryOn="@string/mhh_enable"
- android:summaryOff="@string/mhh_disable"/>
-
- <CheckBoxPreference
- android:key="button_technology_news"
- android:title="@string/enable_disable_technology_news"
- android:persistent="false"
- android:summaryOn="@string/technology_news_enable"
- android:summaryOff="@string/technology_news_disable"/>
-
- <CheckBoxPreference
- android:key="button_multi_category"
- android:title="@string/enable_disable_multi_category"
- android:persistent="false"
- android:summaryOn="@string/multi_category_enable"
- android:summaryOff="@string/multi_category_disable"/>
-
- </PreferenceCategory>
-
- <PreferenceCategory
- android:title="@string/general_news_settings">
-
- <CheckBoxPreference
- android:key="button_local_general_news"
- android:title="@string/enable_disable_local"
- android:persistent="false"
- android:summaryOn="@string/local_enable"
- android:summaryOff="@string/local_disable"/>
-
- <CheckBoxPreference
- android:key="button_regional_general_news"
- android:title="@string/enable_disable_regional"
- android:persistent="false"
- android:summaryOn="@string/regional_enable"
- android:summaryOff="@string/regional_disable"/>
-
- <CheckBoxPreference
- android:key="button_national_general_news"
- android:title="@string/enable_disable_national"
- android:persistent="false"
- android:summaryOn="@string/national_enable"
- android:summaryOff="@string/national_disable"/>
-
- <CheckBoxPreference
- android:key="button_international_general_news"
- android:title="@string/enable_disable_international"
- android:persistent="false"
- android:summaryOn="@string/international_enable"
- android:summaryOff="@string/international_disable"/>
- <!--
- <ListPreference
- android:key="list_general_news"
- android:title="@string/general_news_title"
- android:summary="@string/general_news_summary"
- android:entries="@array/general_news_entries"
- android:entryValues="@array/general_news_entryvalues"
- android:dialogTitle="@string/general_news_dialogtitle"/> -->
-
- </PreferenceCategory>
-
- <PreferenceCategory
- android:title="@string/bf_news_settings">
-
- <CheckBoxPreference
- android:key="button_local_bf_news"
- android:title="@string/enable_disable_local"
- android:persistent="false"
- android:summaryOn="@string/local_enable"
- android:summaryOff="@string/local_disable"/>
-
- <CheckBoxPreference
- android:key="button_regional_bf_news"
- android:title="@string/enable_disable_regional"
- android:persistent="false"
- android:summaryOn="@string/regional_enable"
- android:summaryOff="@string/regional_disable"/>
-
- <CheckBoxPreference
- android:key="button_national_bf_news"
- android:title="@string/enable_disable_national"
- android:persistent="false"
- android:summaryOn="@string/national_enable"
- android:summaryOff="@string/national_disable"/>
-
- <CheckBoxPreference
- android:key="button_international_bf_news"
- android:title="@string/enable_disable_international"
- android:persistent="false"
- android:summaryOn="@string/international_enable"
- android:summaryOff="@string/international_disable"/>
-
- <!--
- <ListPreference
- android:key="list_bf"
- android:title="@string/bf_news_title"
- android:summary="@string/bf_news_summary"
- android:entries="@array/bf_news_entries"
- android:entryValues="@array/bf_news_entryvalues"
- android:dialogTitle="@string/bf_news_dialogtitle"/> -->
-
- </PreferenceCategory>
-
- <PreferenceCategory
- android:title="@string/sports_news_settings">
-
- <CheckBoxPreference
- android:key="button_local_sports_news"
- android:title="@string/enable_disable_local"
- android:persistent="false"
- android:summaryOn="@string/local_enable"
- android:summaryOff="@string/local_disable"/>
-
- <CheckBoxPreference
- android:key="button_regional_sports_news"
- android:title="@string/enable_disable_regional"
- android:persistent="false"
- android:summaryOn="@string/regional_enable"
- android:summaryOff="@string/regional_disable"/>
-
- <CheckBoxPreference
- android:key="button_national_sports_news"
- android:title="@string/enable_disable_national"
- android:persistent="false"
- android:summaryOn="@string/national_enable"
- android:summaryOff="@string/national_disable"/>
-
- <CheckBoxPreference
- android:key="button_international_sports_news"
- android:title="@string/enable_disable_international"
- android:persistent="false"
- android:summaryOn="@string/international_enable"
- android:summaryOff="@string/international_disable"/>
-
- <!--
- <ListPreference
- android:key="list_sports_news"
- android:title="@string/sports_news_title"
- android:summary="@string/sports_news_summary"
- android:entries="@array/sports_news_entries"
- android:entryValues="@array/sports_news_entryvalues"
- android:dialogTitle="@string/sports_news_dialogtitle"/> -->
-
- </PreferenceCategory>
-
- <PreferenceCategory
- android:title="@string/entertainment_news_settings">
-
- <CheckBoxPreference
- android:key="button_local_entertainment_news"
- android:title="@string/enable_disable_local"
- android:persistent="false"
- android:summaryOn="@string/local_enable"
- android:summaryOff="@string/local_disable"/>
-
- <CheckBoxPreference
- android:key="button_regional_entertainment_news"
- android:title="@string/enable_disable_regional"
- android:persistent="false"
- android:summaryOn="@string/regional_enable"
- android:summaryOff="@string/regional_disable"/>
-
- <CheckBoxPreference
- android:key="button_national_entertainment_news"
- android:title="@string/enable_disable_national"
- android:persistent="false"
- android:summaryOn="@string/national_enable"
- android:summaryOff="@string/national_disable"/>
-
- <CheckBoxPreference
- android:key="button_international_entertainment_news"
- android:title="@string/enable_disable_international"
- android:persistent="false"
- android:summaryOn="@string/international_enable"
- android:summaryOff="@string/international_disable"/>
-
- <!--
- <ListPreference
- android:key="list_entertainment_news"
- android:title="@string/entertainment_news_title"
- android:summary="@string/entertainment_news_summary"
- android:entries="@array/entertainment_news_entries"
- android:entryValues="@array/entertainment_news_entryvalues"
- android:dialogTitle="@string/entertainment_news_dialogtitle"/> -->
-
- </PreferenceCategory>
-
-</PreferenceScreen>
diff --git a/phone/res/xml/data_usage_settings.xml b/phone/res/xml/data_usage_settings.xml
deleted file mode 100644
index 3e86434..0000000
--- a/phone/res/xml/data_usage_settings.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res/com.android.phone2">
-
- <Preference
- android:key="throttle_current_usage"
- style="?android:preferenceInformationStyle"
- android:title="@string/throttle_current_usage"
- android:persistent="false" />
-
- <Preference
- android:key="throttle_time_frame"
- style="?android:preferenceInformationStyle"
- android:title="@string/throttle_time_frame"
- android:persistent="false" />
-
- <Preference
- android:key="throttle_rate"
- style="?android:preferenceInformationStyle"
- android:title="@string/throttle_rate"
- android:persistent="false" />
-
- <Preference
- android:key="throttle_help"
- android:title="@string/throttle_help"
- android:persistent="false" />
-
-</PreferenceScreen>
diff --git a/phone/res/xml/eri_text_appwidget.xml b/phone/res/xml/eri_text_appwidget.xml
deleted file mode 100644
index 82bc2c7..0000000
--- a/phone/res/xml/eri_text_appwidget.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="146dip"
- android:minHeight="72dip"
- android:updatePeriodMillis="0"
- android:initialLayout="@layout/eri_text_layout"
- >
-</appwidget-provider>
diff --git a/phone/res/xml/fdn_setting.xml b/phone/res/xml/fdn_setting.xml
deleted file mode 100644
index 7f580f0..0000000
--- a/phone/res/xml/fdn_setting.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?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.
--->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- Rearranged to use EditPinPreference -->
- <com.android.phone2.EditPinPreference
- android:key="button_fdn_enable_key"
- android:persistent="false"
- android:dialogMessage="@string/enter_pin2_text"
- android:title="@string/fdn_activation"/>
-
- <!-- Rearranged to use EditPinPreference -->
- <com.android.phone2.EditPinPreference
- android:key="button_change_pin2_key"
- android:title="@string/change_pin2"
- android:dialogTitle="@string/change_pin2"
- android:summary="@string/sum_fdn_change_pin"
- android:persistent="false"/>
-
- <PreferenceScreen
- android:key="button_fdn_list_key"
- android:title="@string/manage_fdn_list"
- android:summary="@string/sum_fdn_manage_list"
- android:persistent="false">
-
- <!-- Intent to lauch the FDN list. -->
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.FdnList" />
-
- </PreferenceScreen>
-
-</PreferenceScreen>
diff --git a/phone/res/xml/gsm_umts_additional_options.xml b/phone/res/xml/gsm_umts_additional_options.xml
deleted file mode 100644
index 78451d7..0000000
--- a/phone/res/xml/gsm_umts_additional_options.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:phone="http://schemas.android.com/apk/res/com.android.phone2"
- android:title="@string/additional_gsm_call_settings">
-
- <com.android.phone2.CLIRListPreference
- android:key="button_clir_key"
- android:title="@string/labelCallerId"
- android:persistent="false"
- android:defaultValue="DEFAULT"
- android:entries="@array/clir_display_values"
- android:entryValues="@array/clir_values"
- android:dialogTitle="@string/labelCallerId"/>
-
- <com.android.phone2.CallWaitingCheckBoxPreference
- android:key="button_cw_key"
- android:title="@string/labelCW"
- android:persistent="false"
- android:summaryOn="@string/sum_cw_enabled"
- android:summaryOff="@string/sum_cw_disabled"/>
-</PreferenceScreen>
diff --git a/phone/res/xml/gsm_umts_call_options.xml b/phone/res/xml/gsm_umts_call_options.xml
deleted file mode 100644
index 3d2b30a..0000000
--- a/phone/res/xml/gsm_umts_call_options.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:phone="http://schemas.android.com/apk/res/com.android.phone2"
- android:title="@string/labelGSMMore">
-
- <PreferenceScreen
- android:key="button_cf_expand_key"
- android:title="@string/labelCF"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.GsmUmtsCallForwardOptions"/>
- </PreferenceScreen>
-
- <PreferenceScreen
- android:key="button_more_expand_key"
- android:title="@string/additional_gsm_call_settings"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.GsmUmtsAdditionalCallOptions"/>
- </PreferenceScreen>
-</PreferenceScreen>
diff --git a/phone/res/xml/gsm_umts_options.xml b/phone/res/xml/gsm_umts_options.xml
deleted file mode 100644
index a7114a2..0000000
--- a/phone/res/xml/gsm_umts_options.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:settings="http://schemas.android.com/apk/res/com.android.phone2">
-
- <PreferenceScreen
- android:key="button_apn_key"
- android:title="@string/apn_settings"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.settings"
- android:targetClass="com.android.settings.ApnSettings" />
-
- </PreferenceScreen>
-
- <com.android.phone2.Use2GOnlyCheckBoxPreference
- android:key="button_prefer_2g_key"
- android:title="@string/prefer_2g"
- android:persistent="false"
- android:summary="@string/prefer_2g_summary"/>
-
- <PreferenceScreen
- android:key="button_carrier_sel_key"
- android:title="@string/networks"
- android:summary="@string/sum_carrier_select"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.NetworkSetting" />
-
- </PreferenceScreen>
-
-</PreferenceScreen>
diff --git a/phone/res/xml/network_setting.xml b/phone/res/xml/network_setting.xml
deleted file mode 100644
index 0c579a3..0000000
--- a/phone/res/xml/network_setting.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?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.
--->
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:phone="http://schemas.android.com/apk/res/com.android.phone2"
- android:title="@string/mobile_networks">
-
- <CheckBoxPreference
- android:key="button_data_enabled_key"
- android:title="@string/data_enabled"
- android:persistent="false"
- android:summary="@string/data_enable_summary"/>
-
- <CheckBoxPreference
- android:key="button_roaming_key"
- android:title="@string/roaming"
- android:persistent="false"
- android:summaryOn="@string/roaming_enable"
- android:summaryOff="@string/roaming_disable"/>
-
- <PreferenceScreen
- android:key="button_data_usage_key"
- android:title="@string/throttle_data_usage"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.DataUsage" />
- </PreferenceScreen>
-
- <ListPreference
- android:key="preferred_network_mode_key"
- android:title="@string/preferred_network_mode_title"
- android:summary="@string/preferred_network_mode_summary"
- android:entries="@array/preferred_network_mode_choices"
- android:entryValues="@array/preferred_network_mode_values"
- android:dialogTitle="@string/preferred_network_mode_dialogtitle" />
-
- <PreferenceScreen
- android:key="gsm_umts_options_key"
- android:title="@string/gsm_umts_options"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.GsmUmtsOptions" />
-
- </PreferenceScreen>
-
- <PreferenceScreen
- android:key="cdma_options_key"
- android:title="@string/cdma_options"
- android:persistent="false">
-
- <intent android:action="android.intent.action.MAIN"
- android:targetPackage="com.android.phone2"
- android:targetClass="com.android.phone2.CdmaOptions" />
-
- </PreferenceScreen>
-
-</PreferenceScreen>
diff --git a/phone/src/com/android/phone2/ADNList.java b/phone/src/com/android/phone2/ADNList.java
deleted file mode 100644
index 95f44e1..0000000
--- a/phone/src/com/android/phone2/ADNList.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone2;
-
-import static android.view.Window.PROGRESS_VISIBILITY_OFF;
-import static android.view.Window.PROGRESS_VISIBILITY_ON;
-
-import android.app.ListActivity;
-import android.content.AsyncQueryHandler;
-import android.content.ContentResolver;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.Window;
-import android.widget.CursorAdapter;
-import android.widget.SimpleCursorAdapter;
-import android.widget.TextView;
-
-/**
- * ADN List activity for the Phone app.
- */
-public class ADNList extends ListActivity {
- protected static final String TAG = "ADNList";
- protected static final boolean DBG = false;
-
- private static final String[] COLUMN_NAMES = new String[] {
- "name",
- "number",
- "emails"
- };
-
- protected static final int NAME_COLUMN = 0;
- protected static final int NUMBER_COLUMN = 1;
- protected static final int EMAILS_COLUMN = 2;
-
- private static final int[] VIEW_NAMES = new int[] {
- android.R.id.text1,
- android.R.id.text2
- };
-
- protected static final int QUERY_TOKEN = 0;
- protected static final int INSERT_TOKEN = 1;
- protected static final int UPDATE_TOKEN = 2;
- protected static final int DELETE_TOKEN = 3;
-
-
- protected QueryHandler mQueryHandler;
- protected CursorAdapter mCursorAdapter;
- protected Cursor mCursor = null;
-
- private TextView mEmptyText;
-
- protected int mInitialSelection = -1;
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- setContentView(R.layout.adn_list);
- mEmptyText = (TextView) findViewById(android.R.id.empty);
- mQueryHandler = new QueryHandler(getContentResolver());
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- query();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- if (mCursor != null) {
- mCursor.deactivate();
- }
- }
-
- protected Uri resolveIntent() {
- Intent intent = getIntent();
- if (intent.getData() == null) {
- intent.setData(Uri.parse("content://icc/adn"));
- }
-
- return intent.getData();
- }
-
- private void query() {
- Uri uri = resolveIntent();
- if (DBG) log("query: starting an async query");
- mQueryHandler.startQuery(QUERY_TOKEN, null, uri, COLUMN_NAMES,
- null, null, null);
- displayProgress(true);
- }
-
- private void reQuery() {
- query();
- }
-
- private void setAdapter() {
- // NOTE:
- // As it it written, the positioning code below is NOT working.
- // However, this current non-working state is in compliance with
- // the UI paradigm, so we can't really do much to change it.
-
- // In the future, if we wish to get this "positioning" correct,
- // we'll need to do the following:
- // 1. Change the layout to in the cursor adapter to:
- // android.R.layout.simple_list_item_checked
- // 2. replace the selection / focus code with:
- // getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
- // getListView().setItemChecked(mInitialSelection, true);
-
- // Since the positioning is really only useful for the dialer's
- // SpecialCharSequence case (dialing '2#' to get to the 2nd
- // contact for instance), it doesn't make sense to mess with
- // the usability of the activity just for this case.
-
- // These artifacts include:
- // 1. UI artifacts (checkbox and highlight at the same time)
- // 2. Allowing the user to edit / create new SIM contacts when
- // the user is simply trying to retrieve a number into the d
- // dialer.
-
- if (mCursorAdapter == null) {
- mCursorAdapter = newAdapter();
-
- setListAdapter(mCursorAdapter);
- } else {
- mCursorAdapter.changeCursor(mCursor);
- }
-
- if (mInitialSelection >=0 && mInitialSelection < mCursorAdapter.getCount()) {
- setSelection(mInitialSelection);
- getListView().setFocusableInTouchMode(true);
- boolean gotfocus = getListView().requestFocus();
- }
- }
-
- protected CursorAdapter newAdapter() {
- return new SimpleCursorAdapter(this,
- android.R.layout.simple_list_item_2,
- mCursor, COLUMN_NAMES, VIEW_NAMES);
- }
-
- private void displayProgress(boolean flag) {
- if (DBG) log("displayProgress: " + flag);
- mEmptyText.setText(flag ? R.string.simContacts_emptyLoading: R.string.simContacts_empty);
- getWindow().setFeatureInt(
- Window.FEATURE_INDETERMINATE_PROGRESS,
- flag ? PROGRESS_VISIBILITY_ON : PROGRESS_VISIBILITY_OFF);
- }
-
- private class QueryHandler extends AsyncQueryHandler {
- public QueryHandler(ContentResolver cr) {
- super(cr);
- }
-
- @Override
- protected void onQueryComplete(int token, Object cookie, Cursor c) {
- if (DBG) log("onQueryComplete: cursor.count=" + c.getCount());
- mCursor = c;
- setAdapter();
- displayProgress(false);
- }
-
- @Override
- protected void onInsertComplete(int token, Object cookie,
- Uri uri) {
- if (DBG) log("onInsertComplete: requery");
- reQuery();
- }
-
- @Override
- protected void onUpdateComplete(int token, Object cookie, int result) {
- if (DBG) log("onUpdateComplete: requery");
- reQuery();
- }
-
- @Override
- protected void onDeleteComplete(int token, Object cookie, int result) {
- if (DBG) log("onDeleteComplete: requery");
- reQuery();
- }
- }
-
- protected void log(String msg) {
- Log.d(TAG, "[ADNList] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/AccelerometerListener.java b/phone/src/com/android/phone2/AccelerometerListener.java
deleted file mode 100644
index 7947c0a..0000000
--- a/phone/src/com/android/phone2/AccelerometerListener.java
+++ /dev/null
@@ -1,161 +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.phone2;
-
-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 final 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, OrientationListener listener) {
- mListener = listener;
- mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
- mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
- }
-
- 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;
- 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
- double xy = Math.sqrt(x*x + y*y);
- // compute the vertical angle
- double angle = Math.atan2(xy, z);
- // convert to degrees
- angle = angle * 180.0 / Math.PI;
- int orientation = (angle > VERTICAL_ANGLE ? ORIENTATION_VERTICAL : ORIENTATION_HORIZONTAL);
- if (VDEBUG) Log.d(TAG, "angle: " + angle + " orientation: " + orientation);
- setOrientation(orientation);
- }
-
- SensorEventListener mSensorListener = new SensorEventListener() {
- public void onSensorChanged(SensorEvent event) {
- onSensorEvent(event.values[0], event.values[1], event.values[2]);
- }
-
- public void onAccuracyChanged(Sensor sensor, int accuracy) {
- // ignore
- }
- };
-
- Handler mHandler = new Handler() {
- 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")));
- }
- mListener.orientationChanged(mOrientation);
- }
- break;
- }
- }
- };
-}
diff --git a/phone/src/com/android/phone2/BluetoothAtPhonebook.java b/phone/src/com/android/phone2/BluetoothAtPhonebook.java
deleted file mode 100644
index 6ca9b98..0000000
--- a/phone/src/com/android/phone2/BluetoothAtPhonebook.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*
- * 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.phone2;
-
-import android.bluetooth.AtCommandHandler;
-import android.bluetooth.AtCommandResult;
-import android.bluetooth.AtParser;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.ContactsContract;
-import android.provider.CallLog.Calls;
-import android.provider.ContactsContract.PhoneLookup;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.telephony.PhoneNumberUtils;
-import android.util.Log;
-
-import java.util.HashMap;
-
-/**
- * Helper for managing phonebook presentation over AT commands
- * @hide
- */
-public class BluetoothAtPhonebook {
- private static final String TAG = "BtAtPhonebook";
- private static final boolean DBG = false;
-
- /** The projection to use when querying the call log database in response
- * to AT+CPBR for the MC, RC, and DC phone books (missed, received, and
- * dialed calls respectively)
- */
- private static final String[] CALLS_PROJECTION = new String[] {
- Calls._ID, Calls.NUMBER
- };
-
- /** The projection to use when querying the contacts database in response
- * to AT+CPBR for the ME phonebook (saved phone numbers).
- */
- private static final String[] PHONES_PROJECTION = new String[] {
- Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER, Phone.TYPE
- };
-
- /** Android supports as many phonebook entries as the flash can hold, but
- * BT periphals don't. Limit the number we'll report. */
- private static final int MAX_PHONEBOOK_SIZE = 16384;
-
- private static final String OUTGOING_CALL_WHERE = Calls.TYPE + "=" + Calls.OUTGOING_TYPE;
- private static final String INCOMING_CALL_WHERE = Calls.TYPE + "=" + Calls.INCOMING_TYPE;
- private static final String MISSED_CALL_WHERE = Calls.TYPE + "=" + Calls.MISSED_TYPE;
- private static final String VISIBLE_PHONEBOOK_WHERE = Phone.IN_VISIBLE_GROUP + "=1";
-
- private class PhonebookResult {
- public Cursor cursor; // result set of last query
- public int numberColumn;
- public int typeColumn;
- public int nameColumn;
- };
-
- private final Context mContext;
- private final BluetoothHandsfree mHandsfree;
-
- private String mCurrentPhonebook;
-
- private final HashMap<String, PhonebookResult> mPhonebooks =
- new HashMap<String, PhonebookResult>(4);
-
- public BluetoothAtPhonebook(Context context, BluetoothHandsfree handsfree) {
- mContext = context;
- mHandsfree = handsfree;
- mPhonebooks.put("DC", new PhonebookResult()); // dialled calls
- mPhonebooks.put("RC", new PhonebookResult()); // received calls
- mPhonebooks.put("MC", new PhonebookResult()); // missed calls
- mPhonebooks.put("ME", new PhonebookResult()); // mobile phonebook
-
- mCurrentPhonebook = "ME"; // default to mobile phonebook
- }
-
- /** Returns the last dialled number, or null if no numbers have been called */
- public String getLastDialledNumber() {
- String[] projection = {Calls.NUMBER};
- Cursor cursor = mContext.getContentResolver().query(Calls.CONTENT_URI, projection,
- Calls.TYPE + "=" + Calls.OUTGOING_TYPE, null, Calls.DEFAULT_SORT_ORDER +
- " LIMIT 1");
- if (cursor.getCount() < 1) {
- cursor.close();
- return null;
- }
- cursor.moveToNext();
- int column = cursor.getColumnIndexOrThrow(Calls.NUMBER);
- String number = cursor.getString(column);
- cursor.close();
- return number;
- }
-
- public void register(AtParser parser) {
- // Select Character Set
- // Always send UTF-8, but pretend to support IRA and GSM for compatability
- // TODO: Implement IRA and GSM encoding instead of faking it
- parser.register("+CSCS", new AtCommandHandler() {
- @Override
- public AtCommandResult handleReadCommand() {
- return new AtCommandResult("+CSCS: \"UTF-8\"");
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- if (args.length < 1) {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- if (((String)args[0]).equals("\"GSM\"") || ((String)args[0]).equals("\"IRA\"") ||
- ((String)args[0]).equals("\"UTF-8\"") ||
- ((String)args[0]).equals("\"UTF8\"") ) {
- return new AtCommandResult(AtCommandResult.OK);
- } else {
- return mHandsfree.reportCmeError(BluetoothCmeError.OPERATION_NOT_SUPPORTED);
- }
- }
- @Override
- public AtCommandResult handleTestCommand() {
- return new AtCommandResult( "+CSCS: (\"UTF-8\",\"IRA\",\"GSM\")");
- }
- });
-
- // Select PhoneBook memory Storage
- parser.register("+CPBS", new AtCommandHandler() {
- @Override
- public AtCommandResult handleReadCommand() {
- // Return current size and max size
- if ("SM".equals(mCurrentPhonebook)) {
- return new AtCommandResult("+CPBS: \"SM\",0," + getMaxPhoneBookSize(0));
- }
-
- PhonebookResult pbr = getPhonebookResult(mCurrentPhonebook, true);
- if (pbr == null) {
- return mHandsfree.reportCmeError(BluetoothCmeError.OPERATION_NOT_ALLOWED);
- }
- int size = pbr.cursor.getCount();
- return new AtCommandResult("+CPBS: \"" + mCurrentPhonebook + "\"," +
- size + "," + getMaxPhoneBookSize(size));
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // Select phonebook memory
- if (args.length < 1 || !(args[0] instanceof String)) {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- String pb = ((String)args[0]).trim();
- while (pb.endsWith("\"")) pb = pb.substring(0, pb.length() - 1);
- while (pb.startsWith("\"")) pb = pb.substring(1, pb.length());
- if (getPhonebookResult(pb, false) == null && !"SM".equals(pb)) {
- if (DBG) log("Dont know phonebook: '" + pb + "'");
- return mHandsfree.reportCmeError(BluetoothCmeError.OPERATION_NOT_SUPPORTED);
- }
- mCurrentPhonebook = pb;
- return new AtCommandResult(AtCommandResult.OK);
- }
- @Override
- public AtCommandResult handleTestCommand() {
- return new AtCommandResult("+CPBS: (\"ME\",\"SM\",\"DC\",\"RC\",\"MC\")");
- }
- });
-
- // Read PhoneBook Entries
- parser.register("+CPBR", new AtCommandHandler() {
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // Phone Book Read Request
- // AT+CPBR=<index1>[,<index2>]
-
- // Parse indexes
- int index1;
- int index2;
- if (args.length < 1 || !(args[0] instanceof Integer)) {
- return new AtCommandResult(AtCommandResult.ERROR);
- } else {
- index1 = (Integer)args[0];
- }
-
- if (args.length == 1) {
- index2 = index1;
- } else if (!(args[1] instanceof Integer)) {
- return mHandsfree.reportCmeError(BluetoothCmeError.TEXT_HAS_INVALID_CHARS);
- } else {
- index2 = (Integer)args[1];
- }
-
- // Shortcut SM phonebook
- if ("SM".equals(mCurrentPhonebook)) {
- return new AtCommandResult(AtCommandResult.OK);
- }
-
- // Check phonebook
- PhonebookResult pbr = getPhonebookResult(mCurrentPhonebook, false);
- if (pbr == null) {
- return mHandsfree.reportCmeError(BluetoothCmeError.OPERATION_NOT_ALLOWED);
- }
-
- // More sanity checks
- // Send OK instead of ERROR if these checks fail.
- // When we send error, certain kits like BMW disconnect the
- // Handsfree connection.
- if (pbr.cursor.getCount() == 0 || index1 <= 0 || index2 < index1 ||
- index2 > pbr.cursor.getCount() || index1 > pbr.cursor.getCount()) {
- return new AtCommandResult(AtCommandResult.OK);
- }
-
- // Process
- AtCommandResult result = new AtCommandResult(AtCommandResult.OK);
- int errorDetected = -1; // no error
- pbr.cursor.moveToPosition(index1 - 1);
- for (int index = index1; index <= index2; index++) {
- String number = pbr.cursor.getString(pbr.numberColumn);
- String name = null;
- int type = -1;
- if (pbr.nameColumn == -1) {
- // try caller id lookup
- // TODO: This code is horribly inefficient. I saw it
- // take 7 seconds to process 100 missed calls.
- Cursor c = mContext.getContentResolver().query(
- Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, number),
- new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup.TYPE},
- null, null, null);
- if (c != null) {
- if (c.moveToFirst()) {
- name = c.getString(0);
- type = c.getInt(1);
- }
- c.close();
- }
- if (DBG && name == null) log("Caller ID lookup failed for " + number);
-
- } else {
- name = pbr.cursor.getString(pbr.nameColumn);
- }
- if (name == null) name = "";
- name = name.trim();
- if (name.length() > 28) name = name.substring(0, 28);
-
- if (pbr.typeColumn != -1) {
- type = pbr.cursor.getInt(pbr.typeColumn);
- name = name + "/" + getPhoneType(type);
- }
-
- if (number == null) number = "";
- int regionType = PhoneNumberUtils.toaFromString(number);
-
- number = number.trim();
- number = PhoneNumberUtils.stripSeparators(number);
- if (number.length() > 30) number = number.substring(0, 30);
- if (number.equals("-1")) {
- // unknown numbers are stored as -1 in our database
- number = "";
- name = "unknown";
- }
-
- result.addResponse("+CPBR: " + index + ",\"" + number + "\"," +
- regionType + ",\"" + name + "\"");
- if (!pbr.cursor.moveToNext()) {
- break;
- }
- }
- return result;
- }
- @Override
- public AtCommandResult handleTestCommand() {
- /* Ideally we should return the maximum range of valid index's
- * for the selected phone book, but this causes problems for the
- * Parrot CK3300. So instead send just the range of currently
- * valid index's.
- */
- int size;
- if ("SM".equals(mCurrentPhonebook)) {
- size = 0;
- } else {
- PhonebookResult pbr = getPhonebookResult(mCurrentPhonebook, false);
- if (pbr == null) {
- return mHandsfree.reportCmeError(BluetoothCmeError.OPERATION_NOT_ALLOWED);
- }
- size = pbr.cursor.getCount();
- }
-
- if (size == 0) {
- /* Sending "+CPBR: (1-0)" can confused some carkits, send "1-1"
- * instead */
- size = 1;
- }
- return new AtCommandResult("+CPBR: (1-" + size + "),30,30");
- }
- });
- }
-
- /** Get the most recent result for the given phone book,
- * with the cursor ready to go.
- * If force then re-query that phonebook
- * Returns null if the cursor is not ready
- */
- private synchronized PhonebookResult getPhonebookResult(String pb, boolean force) {
- if (pb == null) {
- return null;
- }
- PhonebookResult pbr = mPhonebooks.get(pb);
- if (pbr == null) {
- pbr = new PhonebookResult();
- }
- if (force || pbr.cursor == null) {
- if (!queryPhonebook(pb, pbr)) {
- return null;
- }
- }
-
- if (pbr.cursor == null) {
- return null;
- }
-
- return pbr;
- }
-
- private synchronized boolean queryPhonebook(String pb, PhonebookResult pbr) {
- String where;
- boolean ancillaryPhonebook = true;
-
- if (pb.equals("ME")) {
- ancillaryPhonebook = false;
- where = VISIBLE_PHONEBOOK_WHERE;
- } else if (pb.equals("DC")) {
- where = OUTGOING_CALL_WHERE;
- } else if (pb.equals("RC")) {
- where = INCOMING_CALL_WHERE;
- } else if (pb.equals("MC")) {
- where = MISSED_CALL_WHERE;
- } else {
- return false;
- }
-
- if (pbr.cursor != null) {
- pbr.cursor.close();
- pbr.cursor = null;
- }
-
- if (ancillaryPhonebook) {
- pbr.cursor = mContext.getContentResolver().query(
- Calls.CONTENT_URI, CALLS_PROJECTION, where, null,
- Calls.DEFAULT_SORT_ORDER + " LIMIT " + MAX_PHONEBOOK_SIZE);
- pbr.numberColumn = pbr.cursor.getColumnIndexOrThrow(Calls.NUMBER);
- pbr.typeColumn = -1;
- pbr.nameColumn = -1;
- } else {
- // Pass in the package name of the Bluetooth PBAB support so that this
- // AT phonebook support uses the same access rights as the PBAB code.
- Uri uri = Phone.CONTENT_URI.buildUpon()
- .appendQueryParameter(ContactsContract.REQUESTING_PACKAGE_PARAM_KEY,
- "com.android.bluetooth")
- .build();
- pbr.cursor = mContext.getContentResolver().query(uri, PHONES_PROJECTION, where, null,
- Phone.NUMBER + " LIMIT " + MAX_PHONEBOOK_SIZE);
- pbr.numberColumn = pbr.cursor.getColumnIndex(Phone.NUMBER);
- pbr.typeColumn = pbr.cursor.getColumnIndex(Phone.TYPE);
- pbr.nameColumn = pbr.cursor.getColumnIndex(Phone.DISPLAY_NAME);
- }
- Log.i(TAG, "Refreshed phonebook " + pb + " with " + pbr.cursor.getCount() + " results");
- return true;
- }
-
- private synchronized int getMaxPhoneBookSize(int currSize) {
- // some car kits ignore the current size and request max phone book
- // size entries. Thus, it takes a long time to transfer all the
- // entries. Use a heuristic to calculate the max phone book size
- // considering future expansion.
- // maxSize = currSize + currSize / 2 rounded up to nearest power of 2
- // If currSize < 100, use 100 as the currSize
-
- int maxSize = (currSize < 100) ? 100 : currSize;
- maxSize += maxSize / 2;
- return roundUpToPowerOfTwo(maxSize);
- }
-
- private int roundUpToPowerOfTwo(int x) {
- x |= x >> 1;
- x |= x >> 2;
- x |= x >> 4;
- x |= x >> 8;
- x |= x >> 16;
- return x + 1;
- }
-
- private static String getPhoneType(int type) {
- switch (type) {
- case Phone.TYPE_HOME:
- return "H";
- case Phone.TYPE_MOBILE:
- return "M";
- case Phone.TYPE_WORK:
- return "W";
- case Phone.TYPE_FAX_HOME:
- case Phone.TYPE_FAX_WORK:
- return "F";
- case Phone.TYPE_OTHER:
- case Phone.TYPE_CUSTOM:
- default:
- return "O";
- }
- }
-
- private static void log(String msg) {
- Log.d(TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/BluetoothCmeError.java b/phone/src/com/android/phone2/BluetoothCmeError.java
deleted file mode 100644
index 01af7bc..0000000
--- a/phone/src/com/android/phone2/BluetoothCmeError.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.phone2;
-
-/* Constants for extended AT error codes specified by the Handsfree profile. */
-public class BluetoothCmeError {
- public static final int AG_FAILURE = 0;
- public static final int NO_CONNECTION_TO_PHONE = 1;
- public static final int OPERATION_NOT_ALLOWED = 3;
- public static final int OPERATION_NOT_SUPPORTED = 4;
- public static final int PIN_REQUIRED = 5;
- public static final int SIM_MISSING = 10;
- public static final int SIM_PIN_REQUIRED = 11;
- public static final int SIM_PUK_REQUIRED = 12;
- public static final int SIM_FAILURE = 13;
- public static final int SIM_BUSY = 14;
- public static final int WRONG_PASSWORD = 16;
- public static final int SIM_PIN2_REQUIRED = 17;
- public static final int SIM_PUK2_REQUIRED = 18;
- public static final int MEMORY_FULL = 20;
- public static final int INVALID_INDEX = 21;
- public static final int MEMORY_FAILURE = 23;
- public static final int TEXT_TOO_LONG = 24;
- public static final int TEXT_HAS_INVALID_CHARS = 25;
- public static final int DIAL_STRING_TOO_LONG = 26;
- public static final int DIAL_STRING_HAS_INVALID_CHARS = 27;
- public static final int NO_SERVICE = 30;
- public static final int ONLY_911_ALLOWED = 32;
-}
diff --git a/phone/src/com/android/phone2/BluetoothHandsfree.java b/phone/src/com/android/phone2/BluetoothHandsfree.java
deleted file mode 100644
index 63ad4f3..0000000
--- a/phone/src/com/android/phone2/BluetoothHandsfree.java
+++ /dev/null
@@ -1,2356 +0,0 @@
-/*
- * 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.phone2;
-
-import android.bluetooth.AtCommandHandler;
-import android.bluetooth.AtCommandResult;
-import android.bluetooth.AtParser;
-import android.bluetooth.BluetoothA2dp;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.HeadsetBase;
-import android.bluetooth.ScoSocket;
-import android.content.ActivityNotFoundException;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.os.SystemProperties;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.ServiceState;
-import android.telephony.SignalStrength;
-import android.util.Log;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.TelephonyIntents;
-
-import java.util.LinkedList;
-
-/**
- * Bluetooth headset manager for the Phone app.
- * @hide
- */
-public class BluetoothHandsfree {
- private static final String TAG = "BT HS/HF";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 1)
- && (SystemProperties.getInt("ro.debuggable", 0) == 1);
- private static final boolean VDBG = (PhoneApp.DBG_LEVEL >= 2); // even more logging
-
- public static final int TYPE_UNKNOWN = 0;
- public static final int TYPE_HEADSET = 1;
- public static final int TYPE_HANDSFREE = 2;
-
- private final Context mContext;
- private final Phone mPhone;
- private final BluetoothA2dp mA2dp;
-
- private BluetoothDevice mA2dpDevice;
- private int mA2dpState;
-
- private ServiceState mServiceState;
- private HeadsetBase mHeadset; // null when not connected
- private int mHeadsetType;
- private boolean mAudioPossible;
- private ScoSocket mIncomingSco;
- private ScoSocket mOutgoingSco;
- private ScoSocket mConnectedSco;
-
- private Call mForegroundCall;
- private Call mBackgroundCall;
- private Call mRingingCall;
-
- private AudioManager mAudioManager;
- private PowerManager mPowerManager;
-
- private boolean mPendingSco; // waiting for a2dp sink to suspend before establishing SCO
- private boolean mA2dpSuspended;
- private boolean mUserWantsAudio;
- private WakeLock mStartCallWakeLock; // held while waiting for the intent to start call
- private WakeLock mStartVoiceRecognitionWakeLock; // held while waiting for voice recognition
-
- // AT command state
- private static final int GSM_MAX_CONNECTIONS = 6; // Max connections allowed by GSM
- private static final int CDMA_MAX_CONNECTIONS = 2; // Max connections allowed by CDMA
-
- private long mBgndEarliestConnectionTime = 0;
- private boolean mClip = false; // Calling Line Information Presentation
- private boolean mIndicatorsEnabled = false;
- private boolean mCmee = false; // Extended Error reporting
- private long[] mClccTimestamps; // Timestamps associated with each clcc index
- private boolean[] mClccUsed; // Is this clcc index in use
- private boolean mWaitingForCallStart;
- private boolean mWaitingForVoiceRecognition;
- // do not connect audio until service connection is established
- // for 3-way supported devices, this is after AT+CHLD
- // for non-3-way supported devices, this is after AT+CMER (see spec)
- private boolean mServiceConnectionEstablished;
-
- private final BluetoothPhoneState mBluetoothPhoneState; // for CIND and CIEV updates
- private final BluetoothAtPhonebook mPhonebook;
- private Phone.State mPhoneState = Phone.State.IDLE;
- CdmaPhoneCallState.PhoneCallState mCdmaThreeWayCallState =
- CdmaPhoneCallState.PhoneCallState.IDLE;
-
- private DebugThread mDebugThread;
- private int mScoGain = Integer.MIN_VALUE;
-
- private static Intent sVoiceCommandIntent;
-
- // Audio parameters
- private static final String HEADSET_NREC = "bt_headset_nrec";
- private static final String HEADSET_NAME = "bt_headset_name";
-
- private int mRemoteBrsf = 0;
- private int mLocalBrsf = 0;
-
- // CDMA specific flag used in context with BT devices having display capabilities
- // to show which Caller is active. This state might not be always true as in CDMA
- // networks if a caller drops off no update is provided to the Phone.
- // This flag is just used as a toggle to provide a update to the BT device to specify
- // which caller is active.
- private boolean mCdmaIsSecondCallActive = false;
-
- /* Constants from Bluetooth Specification Hands-Free profile version 1.5 */
- private static final int BRSF_AG_THREE_WAY_CALLING = 1 << 0;
- private static final int BRSF_AG_EC_NR = 1 << 1;
- private static final int BRSF_AG_VOICE_RECOG = 1 << 2;
- private static final int BRSF_AG_IN_BAND_RING = 1 << 3;
- private static final int BRSF_AG_VOICE_TAG_NUMBE = 1 << 4;
- private static final int BRSF_AG_REJECT_CALL = 1 << 5;
- private static final int BRSF_AG_ENHANCED_CALL_STATUS = 1 << 6;
- private static final int BRSF_AG_ENHANCED_CALL_CONTROL = 1 << 7;
- private static final int BRSF_AG_ENHANCED_ERR_RESULT_CODES = 1 << 8;
-
- private static final int BRSF_HF_EC_NR = 1 << 0;
- private static final int BRSF_HF_CW_THREE_WAY_CALLING = 1 << 1;
- private static final int BRSF_HF_CLIP = 1 << 2;
- private static final int BRSF_HF_VOICE_REG_ACT = 1 << 3;
- private static final int BRSF_HF_REMOTE_VOL_CONTROL = 1 << 4;
- private static final int BRSF_HF_ENHANCED_CALL_STATUS = 1 << 5;
- private static final int BRSF_HF_ENHANCED_CALL_CONTROL = 1 << 6;
-
- public static String typeToString(int type) {
- switch (type) {
- case TYPE_UNKNOWN:
- return "unknown";
- case TYPE_HEADSET:
- return "headset";
- case TYPE_HANDSFREE:
- return "handsfree";
- }
- return null;
- }
-
- public BluetoothHandsfree(Context context, Phone phone) {
- mPhone = phone;
- mContext = context;
- BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
- boolean bluetoothCapable = (adapter != null);
- mHeadset = null; // nothing connected yet
- mA2dp = new BluetoothA2dp(mContext);
- mA2dpState = BluetoothA2dp.STATE_DISCONNECTED;
- mA2dpDevice = null;
- mA2dpSuspended = false;
-
- mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- mStartCallWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
- TAG + ":StartCall");
- mStartCallWakeLock.setReferenceCounted(false);
- mStartVoiceRecognitionWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
- TAG + ":VoiceRecognition");
- mStartVoiceRecognitionWakeLock.setReferenceCounted(false);
-
- mLocalBrsf = BRSF_AG_THREE_WAY_CALLING |
- BRSF_AG_EC_NR |
- BRSF_AG_REJECT_CALL |
- BRSF_AG_ENHANCED_CALL_STATUS;
-
- if (sVoiceCommandIntent == null) {
- sVoiceCommandIntent = new Intent(Intent.ACTION_VOICE_COMMAND);
- sVoiceCommandIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- }
- if (mContext.getPackageManager().resolveActivity(sVoiceCommandIntent, 0) != null &&
- BluetoothHeadset.isBluetoothVoiceDialingEnabled(mContext)) {
- mLocalBrsf |= BRSF_AG_VOICE_RECOG;
- }
-
- if (bluetoothCapable) {
- resetAtState();
- }
-
- mRingingCall = mPhone.getRingingCall();
- mForegroundCall = mPhone.getForegroundCall();
- mBackgroundCall = mPhone.getBackgroundCall();
- mBluetoothPhoneState = new BluetoothPhoneState();
- mUserWantsAudio = true;
- mPhonebook = new BluetoothAtPhonebook(mContext, this);
- mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
- cdmaSetSecondCallState(false);
- }
-
- /* package */ synchronized void onBluetoothEnabled() {
- /* Bluez has a bug where it will always accept and then orphan
- * incoming SCO connections, regardless of whether we have a listening
- * SCO socket. So the best thing to do is always run a listening socket
- * while bluetooth is on so that at least we can diconnect it
- * immediately when we don't want it.
- */
- if (mIncomingSco == null) {
- mIncomingSco = createScoSocket();
- mIncomingSco.accept();
- }
- }
-
- /* package */ synchronized void onBluetoothDisabled() {
- audioOff();
- if (mIncomingSco != null) {
- mIncomingSco.close();
- mIncomingSco = null;
- }
- }
-
- private boolean isHeadsetConnected() {
- if (mHeadset == null) {
- return false;
- }
- return mHeadset.isConnected();
- }
-
- /* package */ void connectHeadset(HeadsetBase headset, int headsetType) {
- mHeadset = headset;
- mHeadsetType = headsetType;
- if (mHeadsetType == TYPE_HEADSET) {
- initializeHeadsetAtParser();
- } else {
- initializeHandsfreeAtParser();
- }
- headset.startEventThread();
- configAudioParameters();
-
- if (inDebug()) {
- startDebug();
- }
-
- if (isIncallAudio()) {
- audioOn();
- }
- }
-
- /* returns true if there is some kind of in-call audio we may wish to route
- * bluetooth to */
- private boolean isIncallAudio() {
- Call.State state = mForegroundCall.getState();
-
- return (state == Call.State.ACTIVE || state == Call.State.ALERTING);
- }
-
- /* package */ synchronized void disconnectHeadset() {
- // Close off the SCO sockets
- audioOff();
- mHeadset = null;
- stopDebug();
- resetAtState();
- }
-
- private void resetAtState() {
- mClip = false;
- mIndicatorsEnabled = false;
- mServiceConnectionEstablished = false;
- mCmee = false;
- mClccTimestamps = new long[GSM_MAX_CONNECTIONS];
- mClccUsed = new boolean[GSM_MAX_CONNECTIONS];
- for (int i = 0; i < GSM_MAX_CONNECTIONS; i++) {
- mClccUsed[i] = false;
- }
- mRemoteBrsf = 0;
- }
-
- private void configAudioParameters() {
- String name = mHeadset.getRemoteDevice().getName();
- if (name == null) {
- name = "<unknown>";
- }
- mAudioManager.setParameters(HEADSET_NAME+"="+name+";"+HEADSET_NREC+"=on");
- }
-
-
- /** Represents the data that we send in a +CIND or +CIEV command to the HF
- */
- private class BluetoothPhoneState {
- // 0: no service
- // 1: service
- private int mService;
-
- // 0: no active call
- // 1: active call (where active means audio is routed - not held call)
- private int mCall;
-
- // 0: not in call setup
- // 1: incoming call setup
- // 2: outgoing call setup
- // 3: remote party being alerted in an outgoing call setup
- private int mCallsetup;
-
- // 0: no calls held
- // 1: held call and active call
- // 2: held call only
- private int mCallheld;
-
- // cellular signal strength of AG: 0-5
- private int mSignal;
-
- // cellular signal strength in CSQ rssi scale
- private int mRssi; // for CSQ
-
- // 0: roaming not active (home)
- // 1: roaming active
- private int mRoam;
-
- // battery charge of AG: 0-5
- private int mBattchg;
-
- // 0: not registered
- // 1: registered, home network
- // 5: registered, roaming
- private int mStat; // for CREG
-
- private String mRingingNumber; // Context for in-progress RING's
- private int mRingingType;
- private boolean mIgnoreRing = false;
- private boolean mStopRing = false;
-
- private static final int SERVICE_STATE_CHANGED = 1;
- private static final int PRECISE_CALL_STATE_CHANGED = 2;
- private static final int RING = 3;
- private static final int PHONE_CDMA_CALL_WAITING = 4;
-
- private Handler mStateChangeHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch(msg.what) {
- case RING:
- AtCommandResult result = ring();
- if (result != null) {
- sendURC(result.toString());
- }
- break;
- case SERVICE_STATE_CHANGED:
- ServiceState state = (ServiceState) ((AsyncResult) msg.obj).result;
- updateServiceState(sendUpdate(), state);
- break;
- case PRECISE_CALL_STATE_CHANGED:
- case PHONE_CDMA_CALL_WAITING:
- Connection connection = null;
- if (((AsyncResult) msg.obj).result instanceof Connection) {
- connection = (Connection) ((AsyncResult) msg.obj).result;
- }
- handlePreciseCallStateChange(sendUpdate(), connection);
- break;
- }
- }
- };
-
- private BluetoothPhoneState() {
- // init members
- updateServiceState(false, mPhone.getServiceState());
- handlePreciseCallStateChange(false, null);
- mBattchg = 5; // There is currently no API to get battery level
- // on demand, so set to 5 and wait for an update
- mSignal = asuToSignal(mPhone.getSignalStrength());
-
- // register for updates
- mPhone.registerForServiceStateChanged(mStateChangeHandler,
- SERVICE_STATE_CHANGED, null);
- mPhone.registerForPreciseCallStateChanged(mStateChangeHandler,
- PRECISE_CALL_STATE_CHANGED, null);
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- mPhone.registerForCallWaiting(mStateChangeHandler,
- PHONE_CDMA_CALL_WAITING, null);
- }
- IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
- filter.addAction(TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED);
- filter.addAction(BluetoothA2dp.ACTION_SINK_STATE_CHANGED);
- mContext.registerReceiver(mStateReceiver, filter);
- }
-
- private void updateBtPhoneStateAfterRadioTechnologyChange() {
- if(VDBG) Log.d(TAG, "updateBtPhoneStateAfterRadioTechnologyChange...");
-
- //Unregister all events from the old obsolete phone
- mPhone.unregisterForServiceStateChanged(mStateChangeHandler);
- mPhone.unregisterForPreciseCallStateChanged(mStateChangeHandler);
- mPhone.unregisterForCallWaiting(mStateChangeHandler);
-
- //Register all events new to the new active phone
- mPhone.registerForServiceStateChanged(mStateChangeHandler,
- SERVICE_STATE_CHANGED, null);
- mPhone.registerForPreciseCallStateChanged(mStateChangeHandler,
- PRECISE_CALL_STATE_CHANGED, null);
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- mPhone.registerForCallWaiting(mStateChangeHandler,
- PHONE_CDMA_CALL_WAITING, null);
- }
- }
-
- private boolean sendUpdate() {
- return isHeadsetConnected() && mHeadsetType == TYPE_HANDSFREE && mIndicatorsEnabled;
- }
-
- private boolean sendClipUpdate() {
- return isHeadsetConnected() && mHeadsetType == TYPE_HANDSFREE && mClip;
- }
-
- private void stopRing() {
- mStopRing = true;
- }
-
- /* convert [0,31] ASU signal strength to the [0,5] expected by
- * bluetooth devices. Scale is similar to status bar policy
- */
- private int gsmAsuToSignal(SignalStrength signalStrength) {
- int asu = signalStrength.getGsmSignalStrength();
- if (asu >= 16) return 5;
- else if (asu >= 8) return 4;
- else if (asu >= 4) return 3;
- else if (asu >= 2) return 2;
- else if (asu >= 1) return 1;
- else return 0;
- }
-
- /**
- * Convert the cdma / evdo db levels to appropriate icon level.
- * The scale is similar to the one used in status bar policy.
- *
- * @param signalStrength
- * @return the icon level
- */
- private int cdmaDbmEcioToSignal(SignalStrength signalStrength) {
- int levelDbm = 0;
- int levelEcio = 0;
- int cdmaIconLevel = 0;
- int evdoIconLevel = 0;
- int cdmaDbm = signalStrength.getCdmaDbm();
- int cdmaEcio = signalStrength.getCdmaEcio();
-
- if (cdmaDbm >= -75) levelDbm = 4;
- else if (cdmaDbm >= -85) levelDbm = 3;
- else if (cdmaDbm >= -95) levelDbm = 2;
- else if (cdmaDbm >= -100) levelDbm = 1;
- else levelDbm = 0;
-
- // Ec/Io are in dB*10
- if (cdmaEcio >= -90) levelEcio = 4;
- else if (cdmaEcio >= -110) levelEcio = 3;
- else if (cdmaEcio >= -130) levelEcio = 2;
- else if (cdmaEcio >= -150) levelEcio = 1;
- else levelEcio = 0;
-
- cdmaIconLevel = (levelDbm < levelEcio) ? levelDbm : levelEcio;
-
- if (mServiceState != null &&
- (mServiceState.getRadioTechnology() == ServiceState.RADIO_TECHNOLOGY_EVDO_0 ||
- mServiceState.getRadioTechnology() == ServiceState.RADIO_TECHNOLOGY_EVDO_A)) {
- int evdoEcio = signalStrength.getEvdoEcio();
- int evdoSnr = signalStrength.getEvdoSnr();
- int levelEvdoEcio = 0;
- int levelEvdoSnr = 0;
-
- // Ec/Io are in dB*10
- if (evdoEcio >= -650) levelEvdoEcio = 4;
- else if (evdoEcio >= -750) levelEvdoEcio = 3;
- else if (evdoEcio >= -900) levelEvdoEcio = 2;
- else if (evdoEcio >= -1050) levelEvdoEcio = 1;
- else levelEvdoEcio = 0;
-
- if (evdoSnr > 7) levelEvdoSnr = 4;
- else if (evdoSnr > 5) levelEvdoSnr = 3;
- else if (evdoSnr > 3) levelEvdoSnr = 2;
- else if (evdoSnr > 1) levelEvdoSnr = 1;
- else levelEvdoSnr = 0;
-
- evdoIconLevel = (levelEvdoEcio < levelEvdoSnr) ? levelEvdoEcio : levelEvdoSnr;
- }
- // TODO(): There is a bug open regarding what should be sent.
- return (cdmaIconLevel > evdoIconLevel) ? cdmaIconLevel : evdoIconLevel;
-
- }
-
-
- private int asuToSignal(SignalStrength signalStrength) {
- if (signalStrength.isGsm()) {
- return gsmAsuToSignal(signalStrength);
- } else {
- return cdmaDbmEcioToSignal(signalStrength);
- }
- }
-
-
- /* convert [0,5] signal strength to a rssi signal strength for CSQ
- * which is [0,31]. Despite the same scale, this is not the same value
- * as ASU.
- */
- private int signalToRssi(int signal) {
- // using C4A suggested values
- switch (signal) {
- case 0: return 0;
- case 1: return 4;
- case 2: return 8;
- case 3: return 13;
- case 4: return 19;
- case 5: return 31;
- }
- return 0;
- }
-
-
- private final BroadcastReceiver mStateReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
- updateBatteryState(intent);
- } else if (intent.getAction().equals(
- TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED)) {
- updateSignalState(intent);
- } else if (intent.getAction().equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED)) {
- int state = intent.getIntExtra(BluetoothA2dp.EXTRA_SINK_STATE,
- BluetoothA2dp.STATE_DISCONNECTED);
- int oldState = intent.getIntExtra(BluetoothA2dp.EXTRA_PREVIOUS_SINK_STATE,
- BluetoothA2dp.STATE_DISCONNECTED);
- BluetoothDevice device =
- intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-
- // We are only concerned about Connected sinks to suspend and resume
- // them. We can safely ignore SINK_STATE_CHANGE for other devices.
- if (mA2dpDevice != null && !device.equals(mA2dpDevice)) return;
-
- synchronized (BluetoothHandsfree.this) {
- mA2dpState = state;
- if (state == BluetoothA2dp.STATE_DISCONNECTED) {
- mA2dpDevice = null;
- } else {
- mA2dpDevice = device;
- }
- if (oldState == BluetoothA2dp.STATE_PLAYING &&
- mA2dpState == BluetoothA2dp.STATE_CONNECTED) {
- if (mA2dpSuspended) {
- if (mPendingSco) {
- mHandler.removeMessages(MESSAGE_CHECK_PENDING_SCO);
- if (DBG) log("A2DP suspended, completing SCO");
- mOutgoingSco = createScoSocket();
- if (!mOutgoingSco.connect(
- mHeadset.getRemoteDevice().getAddress(),
- mHeadset.getRemoteDevice().getName())) {
- mOutgoingSco = null;
- }
- mPendingSco = false;
- }
- }
- }
- }
- }
- }
- };
-
- private synchronized void updateBatteryState(Intent intent) {
- int batteryLevel = intent.getIntExtra("level", -1);
- int scale = intent.getIntExtra("scale", -1);
- if (batteryLevel == -1 || scale == -1) {
- return; // ignore
- }
- batteryLevel = batteryLevel * 5 / scale;
- if (mBattchg != batteryLevel) {
- mBattchg = batteryLevel;
- if (sendUpdate()) {
- sendURC("+CIEV: 7," + mBattchg);
- }
- }
- }
-
- private synchronized void updateSignalState(Intent intent) {
- // NOTE this function is called by the BroadcastReceiver mStateReceiver after intent
- // ACTION_SIGNAL_STRENGTH_CHANGED and by the DebugThread mDebugThread
- SignalStrength signalStrength = SignalStrength.newFromBundle(intent.getExtras());
- int signal;
-
- if (signalStrength != null) {
- signal = asuToSignal(signalStrength);
- mRssi = signalToRssi(signal); // no unsolicited CSQ
- if (signal != mSignal) {
- mSignal = signal;
- if (sendUpdate()) {
- sendURC("+CIEV: 5," + mSignal);
- }
- }
- } else {
- Log.e(TAG, "Signal Strength null");
- }
- }
-
- private synchronized void updateServiceState(boolean sendUpdate, ServiceState state) {
- int service = state.getState() == ServiceState.STATE_IN_SERVICE ? 1 : 0;
- int roam = state.getRoaming() ? 1 : 0;
- int stat;
- AtCommandResult result = new AtCommandResult(AtCommandResult.UNSOLICITED);
- mServiceState = state;
- if (service == 0) {
- stat = 0;
- } else {
- stat = (roam == 1) ? 5 : 1;
- }
-
- if (service != mService) {
- mService = service;
- if (sendUpdate) {
- result.addResponse("+CIEV: 1," + mService);
- }
- }
- if (roam != mRoam) {
- mRoam = roam;
- if (sendUpdate) {
- result.addResponse("+CIEV: 6," + mRoam);
- }
- }
- if (stat != mStat) {
- mStat = stat;
- if (sendUpdate) {
- result.addResponse(toCregString());
- }
- }
-
- sendURC(result.toString());
- }
-
- private synchronized void handlePreciseCallStateChange(boolean sendUpdate,
- Connection connection) {
- int call = 0;
- int callsetup = 0;
- int callheld = 0;
- int prevCallsetup = mCallsetup;
- AtCommandResult result = new AtCommandResult(AtCommandResult.UNSOLICITED);
-
- if (VDBG) log("updatePhoneState()");
-
- // This function will get called when the Precise Call State
- // {@link Call.State} changes. Hence, we might get this update
- // even if the {@link Phone.state} is same as before.
- // Check for the same.
-
- Phone.State newState = mPhone.getState();
- if (newState != mPhoneState) {
- mPhoneState = newState;
- switch (mPhoneState) {
- case IDLE:
- mUserWantsAudio = true; // out of call - reset state
- audioOff();
- break;
- default:
- callStarted();
- }
- }
-
- switch(mForegroundCall.getState()) {
- case ACTIVE:
- call = 1;
- mAudioPossible = true;
- break;
- case DIALING:
- callsetup = 2;
- mAudioPossible = true;
- // We also need to send a Call started indication
- // for cases where the 2nd MO was initiated was
- // from a *BT hands free* and is waiting for a
- // +BLND: OK response
- // There is a special case handling of the same case
- // for CDMA below
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_GSM) {
- callStarted();
- }
- break;
- case ALERTING:
- callsetup = 3;
- // Open the SCO channel for the outgoing call.
- audioOn();
- mAudioPossible = true;
- break;
- default:
- mAudioPossible = false;
- }
-
- switch(mRingingCall.getState()) {
- case INCOMING:
- case WAITING:
- callsetup = 1;
- break;
- }
-
- switch(mBackgroundCall.getState()) {
- case HOLDING:
- if (call == 1) {
- callheld = 1;
- } else {
- call = 1;
- callheld = 2;
- }
- break;
- }
-
- if (mCall != call) {
- if (call == 1) {
- // This means that a call has transitioned from NOT ACTIVE to ACTIVE.
- // Switch on audio.
- audioOn();
- }
- mCall = call;
- if (sendUpdate) {
- result.addResponse("+CIEV: 2," + mCall);
- }
- }
- if (mCallsetup != callsetup) {
- mCallsetup = callsetup;
- if (sendUpdate) {
- // If mCall = 0, send CIEV
- // mCall = 1, mCallsetup = 0, send CIEV
- // mCall = 1, mCallsetup = 1, send CIEV after CCWA,
- // if 3 way supported.
- // mCall = 1, mCallsetup = 2 / 3 -> send CIEV,
- // if 3 way is supported
- if (mCall != 1 || mCallsetup == 0 ||
- mCallsetup != 1 && (mRemoteBrsf & BRSF_HF_CW_THREE_WAY_CALLING) != 0x0) {
- result.addResponse("+CIEV: 3," + mCallsetup);
- }
- }
- }
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- PhoneApp app = PhoneApp.getInstance();
- if (app.cdmaPhoneCallState != null) {
- CdmaPhoneCallState.PhoneCallState currCdmaThreeWayCallState =
- app.cdmaPhoneCallState.getCurrentCallState();
- CdmaPhoneCallState.PhoneCallState prevCdmaThreeWayCallState =
- app.cdmaPhoneCallState.getPreviousCallState();
-
- callheld = getCdmaCallHeldStatus(currCdmaThreeWayCallState,
- prevCdmaThreeWayCallState);
-
- if (mCdmaThreeWayCallState != currCdmaThreeWayCallState) {
- // In CDMA, the network does not provide any feedback
- // to the phone when the 2nd MO call goes through the
- // stages of DIALING > ALERTING -> ACTIVE we fake the
- // sequence
- if ((currCdmaThreeWayCallState ==
- CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE)
- && app.cdmaPhoneCallState.IsThreeWayCallOrigStateDialing()) {
- mAudioPossible = true;
- if (sendUpdate) {
- if ((mRemoteBrsf & BRSF_HF_CW_THREE_WAY_CALLING) != 0x0) {
- result.addResponse("+CIEV: 3,2");
- result.addResponse("+CIEV: 3,3");
- result.addResponse("+CIEV: 3,0");
- }
- }
- // We also need to send a Call started indication
- // for cases where the 2nd MO was initiated was
- // from a *BT hands free* and is waiting for a
- // +BLND: OK response
- callStarted();
- }
-
- // In CDMA, the network does not provide any feedback to
- // the phone when a user merges a 3way call or swaps
- // between two calls we need to send a CIEV response
- // indicating that a call state got changed which should
- // trigger a CLCC update request from the BT client.
- if (currCdmaThreeWayCallState ==
- CdmaPhoneCallState.PhoneCallState.CONF_CALL) {
- mAudioPossible = true;
- if (sendUpdate) {
- if ((mRemoteBrsf & BRSF_HF_CW_THREE_WAY_CALLING) != 0x0) {
- result.addResponse("+CIEV: 2,1");
- result.addResponse("+CIEV: 3,0");
- }
- }
- }
- }
- mCdmaThreeWayCallState = currCdmaThreeWayCallState;
- }
- }
-
- boolean callsSwitched =
- (callheld == 1 && ! (mBackgroundCall.getEarliestConnectTime() ==
- mBgndEarliestConnectionTime));
-
- mBgndEarliestConnectionTime = mBackgroundCall.getEarliestConnectTime();
-
- if (mCallheld != callheld || callsSwitched) {
- mCallheld = callheld;
- if (sendUpdate) {
- result.addResponse("+CIEV: 4," + mCallheld);
- }
- }
-
- if (callsetup == 1 && callsetup != prevCallsetup) {
- // new incoming call
- String number = null;
- int type = 128;
- // find incoming phone number and type
- if (connection == null) {
- connection = mRingingCall.getEarliestConnection();
- if (connection == null) {
- Log.e(TAG, "Could not get a handle on Connection object for new " +
- "incoming call");
- }
- }
- if (connection != null) {
- number = connection.getAddress();
- if (number != null) {
- type = PhoneNumberUtils.toaFromString(number);
- }
- }
- if (number == null) {
- number = "";
- }
- if ((call != 0 || callheld != 0) && sendUpdate) {
- // call waiting
- if ((mRemoteBrsf & BRSF_HF_CW_THREE_WAY_CALLING) != 0x0) {
- result.addResponse("+CCWA: \"" + number + "\"," + type);
- result.addResponse("+CIEV: 3," + callsetup);
- }
- } else {
- // regular new incoming call
- mRingingNumber = number;
- mRingingType = type;
- mIgnoreRing = false;
- mStopRing = false;
-
- if ((mLocalBrsf & BRSF_AG_IN_BAND_RING) != 0x0) {
- audioOn();
- }
- result.addResult(ring());
- }
- }
- sendURC(result.toString());
- }
-
- private int getCdmaCallHeldStatus(CdmaPhoneCallState.PhoneCallState currState,
- CdmaPhoneCallState.PhoneCallState prevState) {
- int callheld;
- // Update the Call held information
- if (currState == CdmaPhoneCallState.PhoneCallState.CONF_CALL) {
- if (prevState == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
- callheld = 0; //0: no calls held, as now *both* the caller are active
- } else {
- callheld = 1; //1: held call and active call, as on answering a
- // Call Waiting, one of the caller *is* put on hold
- }
- } else if (currState == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
- callheld = 1; //1: held call and active call, as on make a 3 Way Call
- // the first caller *is* put on hold
- } else {
- callheld = 0; //0: no calls held as this is a SINGLE_ACTIVE call
- }
- return callheld;
- }
-
-
- private AtCommandResult ring() {
- if (!mIgnoreRing && !mStopRing && mRingingCall.isRinging()) {
- AtCommandResult result = new AtCommandResult(AtCommandResult.UNSOLICITED);
- result.addResponse("RING");
- if (sendClipUpdate()) {
- result.addResponse("+CLIP: \"" + mRingingNumber + "\"," + mRingingType);
- }
-
- Message msg = mStateChangeHandler.obtainMessage(RING);
- mStateChangeHandler.sendMessageDelayed(msg, 3000);
- return result;
- }
- return null;
- }
-
- private synchronized String toCregString() {
- return new String("+CREG: 1," + mStat);
- }
-
- private synchronized AtCommandResult toCindResult() {
- AtCommandResult result = new AtCommandResult(AtCommandResult.OK);
- String status = "+CIND: " + mService + "," + mCall + "," + mCallsetup + "," +
- mCallheld + "," + mSignal + "," + mRoam + "," + mBattchg;
- result.addResponse(status);
- return result;
- }
-
- private synchronized AtCommandResult toCsqResult() {
- AtCommandResult result = new AtCommandResult(AtCommandResult.OK);
- String status = "+CSQ: " + mRssi + ",99";
- result.addResponse(status);
- return result;
- }
-
-
- private synchronized AtCommandResult getCindTestResult() {
- return new AtCommandResult("+CIND: (\"service\",(0-1))," + "(\"call\",(0-1))," +
- "(\"callsetup\",(0-3)),(\"callheld\",(0-2)),(\"signal\",(0-5))," +
- "(\"roam\",(0-1)),(\"battchg\",(0-5))");
- }
-
- private synchronized void ignoreRing() {
- mCallsetup = 0;
- mIgnoreRing = true;
- if (sendUpdate()) {
- sendURC("+CIEV: 3," + mCallsetup);
- }
- }
-
- };
-
- private static final int SCO_ACCEPTED = 1;
- private static final int SCO_CONNECTED = 2;
- private static final int SCO_CLOSED = 3;
- private static final int CHECK_CALL_STARTED = 4;
- private static final int CHECK_VOICE_RECOGNITION_STARTED = 5;
- private static final int MESSAGE_CHECK_PENDING_SCO = 6;
-
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- synchronized (BluetoothHandsfree.this) {
- switch (msg.what) {
- case SCO_ACCEPTED:
- if (msg.arg1 == ScoSocket.STATE_CONNECTED) {
- if (isHeadsetConnected() && (mAudioPossible || allowAudioAnytime()) &&
- mConnectedSco == null) {
- Log.i(TAG, "Routing audio for incoming SCO connection");
- mConnectedSco = (ScoSocket)msg.obj;
- mAudioManager.setBluetoothScoOn(true);
- broadcastAudioStateIntent(BluetoothHeadset.AUDIO_STATE_CONNECTED,
- mHeadset.getRemoteDevice());
- } else {
- Log.i(TAG, "Rejecting incoming SCO connection");
- ((ScoSocket)msg.obj).close();
- }
- } // else error trying to accept, try again
- mIncomingSco = createScoSocket();
- mIncomingSco.accept();
- break;
- case SCO_CONNECTED:
- if (msg.arg1 == ScoSocket.STATE_CONNECTED && isHeadsetConnected() &&
- mConnectedSco == null) {
- if (VDBG) log("Routing audio for outgoing SCO conection");
- mConnectedSco = (ScoSocket)msg.obj;
- mAudioManager.setBluetoothScoOn(true);
- broadcastAudioStateIntent(BluetoothHeadset.AUDIO_STATE_CONNECTED,
- mHeadset.getRemoteDevice());
- } else if (msg.arg1 == ScoSocket.STATE_CONNECTED) {
- if (VDBG) log("Rejecting new connected outgoing SCO socket");
- ((ScoSocket)msg.obj).close();
- mOutgoingSco.close();
- }
- mOutgoingSco = null;
- break;
- case SCO_CLOSED:
- if (mConnectedSco == (ScoSocket)msg.obj) {
- mConnectedSco.close();
- mConnectedSco = null;
- mAudioManager.setBluetoothScoOn(false);
- broadcastAudioStateIntent(BluetoothHeadset.AUDIO_STATE_DISCONNECTED,
- mHeadset.getRemoteDevice());
- } else if (mOutgoingSco == (ScoSocket)msg.obj) {
- mOutgoingSco.close();
- mOutgoingSco = null;
- }
- break;
- case CHECK_CALL_STARTED:
- if (mWaitingForCallStart) {
- mWaitingForCallStart = false;
- Log.e(TAG, "Timeout waiting for call to start");
- sendURC("ERROR");
- if (mStartCallWakeLock.isHeld()) {
- mStartCallWakeLock.release();
- }
- }
- break;
- case CHECK_VOICE_RECOGNITION_STARTED:
- if (mWaitingForVoiceRecognition) {
- mWaitingForVoiceRecognition = false;
- Log.e(TAG, "Timeout waiting for voice recognition to start");
- sendURC("ERROR");
- }
- break;
- case MESSAGE_CHECK_PENDING_SCO:
- if (mPendingSco && isA2dpMultiProfile()) {
- Log.w(TAG, "Timeout suspending A2DP for SCO (mA2dpState = " +
- mA2dpState + "). Starting SCO anyway");
- mOutgoingSco = createScoSocket();
- if (!(isHeadsetConnected() &&
- mOutgoingSco.connect(mHeadset.getRemoteDevice().getAddress(),
- mHeadset.getRemoteDevice().getName()))) {
- mOutgoingSco = null;
- }
- mPendingSco = false;
- }
- break;
- }
- }
- }
- };
-
- private ScoSocket createScoSocket() {
- return new ScoSocket(mPowerManager, mHandler, SCO_ACCEPTED, SCO_CONNECTED, SCO_CLOSED);
- }
-
- private void broadcastAudioStateIntent(int state, BluetoothDevice device) {
- if (VDBG) log("broadcastAudioStateIntent(" + state + ")");
- Intent intent = new Intent(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
- intent.putExtra(BluetoothHeadset.EXTRA_AUDIO_STATE, state);
- intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
- mContext.sendBroadcast(intent, android.Manifest.permission.BLUETOOTH);
- }
-
- void updateBtHandsfreeAfterRadioTechnologyChange() {
- if(VDBG) Log.d(TAG, "updateBtHandsfreeAfterRadioTechnologyChange...");
-
- //Get the Call references from the new active phone again
- mRingingCall = mPhone.getRingingCall();
- mForegroundCall = mPhone.getForegroundCall();
- mBackgroundCall = mPhone.getBackgroundCall();
-
- mBluetoothPhoneState.updateBtPhoneStateAfterRadioTechnologyChange();
- }
-
- /** Request to establish SCO (audio) connection to bluetooth
- * headset/handsfree, if one is connected. Does not block.
- * Returns false if the user has requested audio off, or if there
- * is some other immediate problem that will prevent BT audio.
- */
- /* package */ synchronized boolean audioOn() {
- if (VDBG) log("audioOn()");
- if (!isHeadsetConnected()) {
- if (DBG) log("audioOn(): headset is not connected!");
- return false;
- }
- if (mHeadsetType == TYPE_HANDSFREE && !mServiceConnectionEstablished) {
- if (DBG) log("audioOn(): service connection not yet established!");
- return false;
- }
-
- if (mConnectedSco != null) {
- if (DBG) log("audioOn(): audio is already connected");
- return true;
- }
-
- if (!mUserWantsAudio) {
- if (DBG) log("audioOn(): user requested no audio, ignoring");
- return false;
- }
-
- if (mOutgoingSco != null) {
- if (DBG) log("audioOn(): outgoing SCO already in progress");
- return true;
- }
-
- if (mPendingSco) {
- if (DBG) log("audioOn(): SCO already pending");
- return true;
- }
-
- mA2dpSuspended = false;
- mPendingSco = false;
- if (isA2dpMultiProfile() && mA2dpState == BluetoothA2dp.STATE_PLAYING) {
- if (DBG) log("suspending A2DP stream for SCO");
- mA2dpSuspended = mA2dp.suspendSink(mA2dpDevice);
- if (mA2dpSuspended) {
- mPendingSco = true;
- Message msg = mHandler.obtainMessage(MESSAGE_CHECK_PENDING_SCO);
- mHandler.sendMessageDelayed(msg, 2000);
- } else {
- Log.w(TAG, "Could not suspend A2DP stream for SCO, going ahead with SCO");
- }
- }
-
- if (!mPendingSco) {
- mOutgoingSco = createScoSocket();
- if (!mOutgoingSco.connect(mHeadset.getRemoteDevice().getAddress(),
- mHeadset.getRemoteDevice().getName())) {
- mOutgoingSco = null;
- }
- }
-
- return true;
- }
-
- /** Used to indicate the user requested BT audio on.
- * This will establish SCO (BT audio), even if the user requested it off
- * previously on this call.
- */
- /* package */ synchronized void userWantsAudioOn() {
- mUserWantsAudio = true;
- audioOn();
- }
- /** Used to indicate the user requested BT audio off.
- * This will prevent us from establishing BT audio again during this call
- * if audioOn() is called.
- */
- /* package */ synchronized void userWantsAudioOff() {
- mUserWantsAudio = false;
- audioOff();
- }
-
- /** Request to disconnect SCO (audio) connection to bluetooth
- * headset/handsfree, if one is connected. Does not block.
- */
- /* package */ synchronized void audioOff() {
- if (VDBG) log("audioOff(): mPendingSco: " + mPendingSco +
- ", mConnectedSco: " + mConnectedSco +
- ", mOutgoingSco: " + mOutgoingSco +
- ", mA2dpState: " + mA2dpState +
- ", mA2dpSuspended: " + mA2dpSuspended +
- ", mIncomingSco:" + mIncomingSco);
-
- if (mA2dpSuspended) {
- if (isA2dpMultiProfile()) {
- if (DBG) log("resuming A2DP stream after disconnecting SCO");
- mA2dp.resumeSink(mA2dpDevice);
- }
- mA2dpSuspended = false;
- }
-
- mPendingSco = false;
-
- if (mConnectedSco != null) {
- BluetoothDevice device = null;
- if (mHeadset != null) {
- device = mHeadset.getRemoteDevice();
- }
- mConnectedSco.close();
- mConnectedSco = null;
- mAudioManager.setBluetoothScoOn(false);
- broadcastAudioStateIntent(BluetoothHeadset.AUDIO_STATE_DISCONNECTED, device);
- }
- if (mOutgoingSco != null) {
- mOutgoingSco.close();
- mOutgoingSco = null;
- }
-
- }
-
- /* package */ boolean isAudioOn() {
- return (mConnectedSco != null);
- }
-
- private boolean isA2dpMultiProfile() {
- return mA2dp != null && mHeadset != null && mA2dpDevice != null &&
- mA2dpDevice.equals(mHeadset.getRemoteDevice());
- }
-
- /* package */ void ignoreRing() {
- mBluetoothPhoneState.ignoreRing();
- }
-
- private void sendURC(String urc) {
- if (isHeadsetConnected()) {
- mHeadset.sendURC(urc);
- }
- }
-
- /** helper to redial last dialled number */
- private AtCommandResult redial() {
- String number = mPhonebook.getLastDialledNumber();
- if (number == null) {
- // spec seems to suggest sending ERROR if we dont have a
- // number to redial
- if (VDBG) log("Bluetooth redial requested (+BLDN), but no previous " +
- "outgoing calls found. Ignoring");
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts("tel", number, null));
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
-
- // We do not immediately respond OK, wait until we get a phone state
- // update. If we return OK now and the handsfree immeidately requests
- // our phone state it will say we are not in call yet which confuses
- // some devices
- expectCallStart();
- return new AtCommandResult(AtCommandResult.UNSOLICITED); // send nothing
- }
-
- /** Build the +CLCC result
- * The complexity arises from the fact that we need to maintain the same
- * CLCC index even as a call moves between states. */
- private synchronized AtCommandResult gsmGetClccResult() {
- // Collect all known connections
- Connection[] clccConnections = new Connection[GSM_MAX_CONNECTIONS]; // indexed by CLCC index
- LinkedList<Connection> newConnections = new LinkedList<Connection>();
- LinkedList<Connection> connections = new LinkedList<Connection>();
- if (mRingingCall.getState().isAlive()) {
- connections.addAll(mRingingCall.getConnections());
- }
- if (mForegroundCall.getState().isAlive()) {
- connections.addAll(mForegroundCall.getConnections());
- }
- if (mBackgroundCall.getState().isAlive()) {
- connections.addAll(mBackgroundCall.getConnections());
- }
-
- // Mark connections that we already known about
- boolean clccUsed[] = new boolean[GSM_MAX_CONNECTIONS];
- for (int i = 0; i < GSM_MAX_CONNECTIONS; i++) {
- clccUsed[i] = mClccUsed[i];
- mClccUsed[i] = false;
- }
- for (Connection c : connections) {
- boolean found = false;
- long timestamp = c.getCreateTime();
- for (int i = 0; i < GSM_MAX_CONNECTIONS; i++) {
- if (clccUsed[i] && timestamp == mClccTimestamps[i]) {
- mClccUsed[i] = true;
- found = true;
- clccConnections[i] = c;
- break;
- }
- }
- if (!found) {
- newConnections.add(c);
- }
- }
-
- // Find a CLCC index for new connections
- while (!newConnections.isEmpty()) {
- // Find lowest empty index
- int i = 0;
- while (mClccUsed[i]) i++;
- // Find earliest connection
- long earliestTimestamp = newConnections.get(0).getCreateTime();
- Connection earliestConnection = newConnections.get(0);
- for (int j = 0; j < newConnections.size(); j++) {
- long timestamp = newConnections.get(j).getCreateTime();
- if (timestamp < earliestTimestamp) {
- earliestTimestamp = timestamp;
- earliestConnection = newConnections.get(j);
- }
- }
-
- // update
- mClccUsed[i] = true;
- mClccTimestamps[i] = earliestTimestamp;
- clccConnections[i] = earliestConnection;
- newConnections.remove(earliestConnection);
- }
-
- // Build CLCC
- AtCommandResult result = new AtCommandResult(AtCommandResult.OK);
- for (int i = 0; i < clccConnections.length; i++) {
- if (mClccUsed[i]) {
- String clccEntry = connectionToClccEntry(i, clccConnections[i]);
- if (clccEntry != null) {
- result.addResponse(clccEntry);
- }
- }
- }
-
- return result;
- }
-
- /** Convert a Connection object into a single +CLCC result */
- private String connectionToClccEntry(int index, Connection c) {
- int state;
- switch (c.getState()) {
- case ACTIVE:
- state = 0;
- break;
- case HOLDING:
- state = 1;
- break;
- case DIALING:
- state = 2;
- break;
- case ALERTING:
- state = 3;
- break;
- case INCOMING:
- state = 4;
- break;
- case WAITING:
- state = 5;
- break;
- default:
- return null; // bad state
- }
-
- int mpty = 0;
- Call call = c.getCall();
- if (call != null) {
- mpty = call.isMultiparty() ? 1 : 0;
- }
-
- int direction = c.isIncoming() ? 1 : 0;
-
- String number = c.getAddress();
- int type = -1;
- if (number != null) {
- type = PhoneNumberUtils.toaFromString(number);
- }
-
- String result = "+CLCC: " + (index + 1) + "," + direction + "," + state + ",0," + mpty;
- if (number != null) {
- result += ",\"" + number + "\"," + type;
- }
- return result;
- }
-
- /** Build the +CLCC result for CDMA
- * The complexity arises from the fact that we need to maintain the same
- * CLCC index even as a call moves between states. */
- private synchronized AtCommandResult cdmaGetClccResult() {
- // In CDMA at one time a user can have only two live/active connections
- Connection[] clccConnections = new Connection[CDMA_MAX_CONNECTIONS];// indexed by CLCC index
-
- Call.State ringingCallState = mRingingCall.getState();
- // If the Ringing Call state is INCOMING, that means this is the very first call
- // hence there should not be any Foreground Call
- if (ringingCallState == Call.State.INCOMING) {
- if (VDBG) log("Filling clccConnections[0] for INCOMING state");
- clccConnections[0] = mRingingCall.getLatestConnection();
- } else if (mForegroundCall.getState().isAlive()) {
- // Getting Foreground Call connection based on Call state
- if (mRingingCall.isRinging()) {
- if (VDBG) log("Filling clccConnections[0] & [1] for CALL WAITING state");
- clccConnections[0] = mForegroundCall.getEarliestConnection();
- clccConnections[1] = mRingingCall.getLatestConnection();
- } else {
- if (mForegroundCall.getConnections().size() <= 1) {
- // Single call scenario
- if (VDBG) log("Filling clccConnections[0] with ForgroundCall latest connection");
- clccConnections[0] = mForegroundCall.getLatestConnection();
- } else {
- // Multiple Call scenario. This would be true for both
- // CONF_CALL and THRWAY_ACTIVE state
- if (VDBG) log("Filling clccConnections[0] & [1] with ForgroundCall connections");
- clccConnections[0] = mForegroundCall.getEarliestConnection();
- clccConnections[1] = mForegroundCall.getLatestConnection();
- }
- }
- }
-
- // Update the mCdmaIsSecondCallActive flag based on the Phone call state
- if (PhoneApp.getInstance().cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.SINGLE_ACTIVE) {
- cdmaSetSecondCallState(false);
- } else if (PhoneApp.getInstance().cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
- cdmaSetSecondCallState(true);
- }
-
- // Build CLCC
- AtCommandResult result = new AtCommandResult(AtCommandResult.OK);
- for (int i = 0; (i < clccConnections.length) && (clccConnections[i] != null); i++) {
- String clccEntry = cdmaConnectionToClccEntry(i, clccConnections[i]);
- if (clccEntry != null) {
- result.addResponse(clccEntry);
- }
- }
-
- return result;
- }
-
- /** Convert a Connection object into a single +CLCC result for CDMA phones */
- private String cdmaConnectionToClccEntry(int index, Connection c) {
- int state;
- PhoneApp app = PhoneApp.getInstance();
- CdmaPhoneCallState.PhoneCallState currCdmaCallState =
- app.cdmaPhoneCallState.getCurrentCallState();
- CdmaPhoneCallState.PhoneCallState prevCdmaCallState =
- app.cdmaPhoneCallState.getPreviousCallState();
-
- if ((prevCdmaCallState == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE)
- && (currCdmaCallState == CdmaPhoneCallState.PhoneCallState.CONF_CALL)) {
- // If the current state is reached after merging two calls
- // we set the state of all the connections as ACTIVE
- state = 0;
- } else {
- switch (c.getState()) {
- case ACTIVE:
- // For CDMA since both the connections are set as active by FW after accepting
- // a Call waiting or making a 3 way call, we need to set the state specifically
- // to ACTIVE/HOLDING based on the mCdmaIsSecondCallActive flag. This way the
- // CLCC result will allow BT devices to enable the swap or merge options
- if (index == 0) { // For the 1st active connection
- state = mCdmaIsSecondCallActive ? 1 : 0;
- } else { // for the 2nd active connection
- state = mCdmaIsSecondCallActive ? 0 : 1;
- }
- break;
- case HOLDING:
- state = 1;
- break;
- case DIALING:
- state = 2;
- break;
- case ALERTING:
- state = 3;
- break;
- case INCOMING:
- state = 4;
- break;
- case WAITING:
- state = 5;
- break;
- default:
- return null; // bad state
- }
- }
-
- int mpty = 0;
- if (currCdmaCallState == CdmaPhoneCallState.PhoneCallState.CONF_CALL) {
- mpty = 1;
- } else {
- mpty = 0;
- }
-
- int direction = c.isIncoming() ? 1 : 0;
-
- String number = c.getAddress();
- int type = -1;
- if (number != null) {
- type = PhoneNumberUtils.toaFromString(number);
- }
-
- String result = "+CLCC: " + (index + 1) + "," + direction + "," + state + ",0," + mpty;
- if (number != null) {
- result += ",\"" + number + "\"," + type;
- }
- return result;
- }
-
- /**
- * Register AT Command handlers to implement the Headset profile
- */
- private void initializeHeadsetAtParser() {
- if (VDBG) log("Registering Headset AT commands");
- AtParser parser = mHeadset.getAtParser();
- // Headset's usually only have one button, which is meant to cause the
- // HS to send us AT+CKPD=200 or AT+CKPD.
- parser.register("+CKPD", new AtCommandHandler() {
- private AtCommandResult headsetButtonPress() {
- if (mRingingCall.isRinging()) {
- // Answer the call
- mBluetoothPhoneState.stopRing();
- sendURC("OK");
- PhoneUtils.answerCall(mPhone);
- // If in-band ring tone is supported, SCO connection will already
- // be up and the following call will just return.
- audioOn();
- return new AtCommandResult(AtCommandResult.UNSOLICITED);
- } else if (mForegroundCall.getState().isAlive()) {
- if (!isAudioOn()) {
- // Transfer audio from AG to HS
- audioOn();
- } else {
- if (mHeadset.getDirection() == HeadsetBase.DIRECTION_INCOMING &&
- (System.currentTimeMillis() - mHeadset.getConnectTimestamp()) < 5000) {
- // Headset made a recent ACL connection to us - and
- // made a mandatory AT+CKPD request to connect
- // audio which races with our automatic audio
- // setup. ignore
- } else {
- // Hang up the call
- audioOff();
- PhoneUtils.hangup(mPhone);
- }
- }
- return new AtCommandResult(AtCommandResult.OK);
- } else {
- // No current call - redial last number
- return redial();
- }
- }
- @Override
- public AtCommandResult handleActionCommand() {
- return headsetButtonPress();
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- return headsetButtonPress();
- }
- });
- }
-
- /**
- * Register AT Command handlers to implement the Handsfree profile
- */
- private void initializeHandsfreeAtParser() {
- if (VDBG) log("Registering Handsfree AT commands");
- AtParser parser = mHeadset.getAtParser();
-
- // Answer
- parser.register('A', new AtCommandHandler() {
- @Override
- public AtCommandResult handleBasicCommand(String args) {
- sendURC("OK");
- mBluetoothPhoneState.stopRing();
- PhoneUtils.answerCall(mPhone);
- return new AtCommandResult(AtCommandResult.UNSOLICITED);
- }
- });
- parser.register('D', new AtCommandHandler() {
- @Override
- public AtCommandResult handleBasicCommand(String args) {
- if (args.length() > 0) {
- if (args.charAt(0) == '>') {
- // Yuck - memory dialling requested.
- // Just dial last number for now
- if (args.startsWith(">9999")) { // for PTS test
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- return redial();
- } else {
- // Remove trailing ';'
- if (args.charAt(args.length() - 1) == ';') {
- args = args.substring(0, args.length() - 1);
- }
- Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts("tel", args, null));
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
-
- expectCallStart();
- return new AtCommandResult(AtCommandResult.UNSOLICITED); // send nothing
- }
- }
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- });
-
- // Hang-up command
- parser.register("+CHUP", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- sendURC("OK");
- if (!mForegroundCall.isIdle()) {
- PhoneUtils.hangupActiveCall(mPhone);
- } else if (!mRingingCall.isIdle()) {
- PhoneUtils.hangupRingingCall(mPhone);
- } else if (!mBackgroundCall.isIdle()) {
- PhoneUtils.hangupHoldingCall(mPhone);
- }
- return new AtCommandResult(AtCommandResult.UNSOLICITED);
- }
- });
-
- // Bluetooth Retrieve Supported Features command
- parser.register("+BRSF", new AtCommandHandler() {
- private AtCommandResult sendBRSF() {
- return new AtCommandResult("+BRSF: " + mLocalBrsf);
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // AT+BRSF=<handsfree supported features bitmap>
- // Handsfree is telling us which features it supports. We
- // send the features we support
- if (args.length == 1 && (args[0] instanceof Integer)) {
- mRemoteBrsf = (Integer) args[0];
- } else {
- Log.w(TAG, "HF didn't sent BRSF assuming 0");
- }
- return sendBRSF();
- }
- @Override
- public AtCommandResult handleActionCommand() {
- // This seems to be out of spec, but lets do the nice thing
- return sendBRSF();
- }
- @Override
- public AtCommandResult handleReadCommand() {
- // This seems to be out of spec, but lets do the nice thing
- return sendBRSF();
- }
- });
-
- // Call waiting notification on/off
- parser.register("+CCWA", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- // Seems to be out of spec, but lets return nicely
- return new AtCommandResult(AtCommandResult.OK);
- }
- @Override
- public AtCommandResult handleReadCommand() {
- // Call waiting is always on
- return new AtCommandResult("+CCWA: 1");
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // AT+CCWA=<n>
- // Handsfree is trying to enable/disable call waiting. We
- // cannot disable in the current implementation.
- return new AtCommandResult(AtCommandResult.OK);
- }
- @Override
- public AtCommandResult handleTestCommand() {
- // Request for range of supported CCWA paramters
- return new AtCommandResult("+CCWA: (\"n\",(1))");
- }
- });
-
- // Mobile Equipment Event Reporting enable/disable command
- // Of the full 3GPP syntax paramters (mode, keyp, disp, ind, bfr) we
- // only support paramter ind (disable/enable evert reporting using
- // +CDEV)
- parser.register("+CMER", new AtCommandHandler() {
- @Override
- public AtCommandResult handleReadCommand() {
- return new AtCommandResult(
- "+CMER: 3,0,0," + (mIndicatorsEnabled ? "1" : "0"));
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- if (args.length < 4) {
- // This is a syntax error
- return new AtCommandResult(AtCommandResult.ERROR);
- } else if (args[0].equals(3) && args[1].equals(0) &&
- args[2].equals(0)) {
- boolean valid = false;
- if (args[3].equals(0)) {
- mIndicatorsEnabled = false;
- valid = true;
- } else if (args[3].equals(1)) {
- mIndicatorsEnabled = true;
- valid = true;
- }
- if (valid) {
- if ((mRemoteBrsf & BRSF_HF_CW_THREE_WAY_CALLING) == 0x0) {
- mServiceConnectionEstablished = true;
- sendURC("OK"); // send immediately, then initiate audio
- if (isIncallAudio()) {
- audioOn();
- }
- // only send OK once
- return new AtCommandResult(AtCommandResult.UNSOLICITED);
- } else {
- return new AtCommandResult(AtCommandResult.OK);
- }
- }
- }
- return reportCmeError(BluetoothCmeError.OPERATION_NOT_SUPPORTED);
- }
- @Override
- public AtCommandResult handleTestCommand() {
- return new AtCommandResult("+CMER: (3),(0),(0),(0-1)");
- }
- });
-
- // Mobile Equipment Error Reporting enable/disable
- parser.register("+CMEE", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- // out of spec, assume they want to enable
- mCmee = true;
- return new AtCommandResult(AtCommandResult.OK);
- }
- @Override
- public AtCommandResult handleReadCommand() {
- return new AtCommandResult("+CMEE: " + (mCmee ? "1" : "0"));
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // AT+CMEE=<n>
- if (args.length == 0) {
- // <n> ommitted - default to 0
- mCmee = false;
- return new AtCommandResult(AtCommandResult.OK);
- } else if (!(args[0] instanceof Integer)) {
- // Syntax error
- return new AtCommandResult(AtCommandResult.ERROR);
- } else {
- mCmee = ((Integer)args[0] == 1);
- return new AtCommandResult(AtCommandResult.OK);
- }
- }
- @Override
- public AtCommandResult handleTestCommand() {
- // Probably not required but spec, but no harm done
- return new AtCommandResult("+CMEE: (0-1)");
- }
- });
-
- // Bluetooth Last Dialled Number
- parser.register("+BLDN", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- return redial();
- }
- });
-
- // Indicator Update command
- parser.register("+CIND", new AtCommandHandler() {
- @Override
- public AtCommandResult handleReadCommand() {
- return mBluetoothPhoneState.toCindResult();
- }
- @Override
- public AtCommandResult handleTestCommand() {
- return mBluetoothPhoneState.getCindTestResult();
- }
- });
-
- // Query Signal Quality (legacy)
- parser.register("+CSQ", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- return mBluetoothPhoneState.toCsqResult();
- }
- });
-
- // Query network registration state
- parser.register("+CREG", new AtCommandHandler() {
- @Override
- public AtCommandResult handleReadCommand() {
- return new AtCommandResult(mBluetoothPhoneState.toCregString());
- }
- });
-
- // Send DTMF. I don't know if we are also expected to play the DTMF tone
- // locally, right now we don't
- parser.register("+VTS", new AtCommandHandler() {
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- if (args.length >= 1) {
- char c;
- if (args[0] instanceof Integer) {
- c = ((Integer) args[0]).toString().charAt(0);
- } else {
- c = ((String) args[0]).charAt(0);
- }
- if (isValidDtmf(c)) {
- mPhone.sendDtmf(c);
- return new AtCommandResult(AtCommandResult.OK);
- }
- }
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- private boolean isValidDtmf(char c) {
- switch (c) {
- case '#':
- case '*':
- return true;
- default:
- if (Character.digit(c, 14) != -1) {
- return true; // 0-9 and A-D
- }
- return false;
- }
- }
- });
-
- // List calls
- parser.register("+CLCC", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- return cdmaGetClccResult();
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- return gsmGetClccResult();
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
- });
-
- // Call Hold and Multiparty Handling command
- parser.register("+CHLD", new AtCommandHandler() {
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- int phoneType = mPhone.getPhoneType();
- if (args.length >= 1) {
- if (args[0].equals(0)) {
- boolean result;
- if (mRingingCall.isRinging()) {
- result = PhoneUtils.hangupRingingCall(mPhone);
- } else {
- result = PhoneUtils.hangupHoldingCall(mPhone);
- }
- if (result) {
- return new AtCommandResult(AtCommandResult.OK);
- } else {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- } else if (args[0].equals(1)) {
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- if (mRingingCall.isRinging()) {
- // If there is Call waiting then answer the call and
- // put the first call on hold.
- if (VDBG) log("CHLD:1 Callwaiting Answer call");
- PhoneUtils.answerCall(mPhone);
- PhoneUtils.setMute(mPhone, false);
- // Setting the second callers state flag to TRUE (i.e. active)
- cdmaSetSecondCallState(true);
- } else {
- // If there is no Call waiting then just hangup
- // the active call. In CDMA this mean that the complete
- // call session would be ended
- if (VDBG) log("CHLD:1 Hangup Call");
- PhoneUtils.hangup(mPhone);
- }
- return new AtCommandResult(AtCommandResult.OK);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- // Hangup active call, answer held call
- if (PhoneUtils.answerAndEndActive(mPhone)) {
- return new AtCommandResult(AtCommandResult.OK);
- } else {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- } else if (args[0].equals(2)) {
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // For CDMA, the way we switch to a new incoming call is by
- // calling PhoneUtils.answerCall(). switchAndHoldActive() won't
- // properly update the call state within telephony.
- // If the Phone state is already in CONF_CALL then we simply send
- // a flash cmd by calling switchHoldingAndActive()
- if (mRingingCall.isRinging()) {
- if (VDBG) log("CHLD:2 Callwaiting Answer call");
- PhoneUtils.answerCall(mPhone);
- PhoneUtils.setMute(mPhone, false);
- // Setting the second callers state flag to TRUE (i.e. active)
- cdmaSetSecondCallState(true);
- } else if (PhoneApp.getInstance().cdmaPhoneCallState
- .getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.CONF_CALL) {
- if (VDBG) log("CHLD:2 Swap Calls");
- PhoneUtils.switchHoldingAndActive(mPhone);
- // Toggle the second callers active state flag
- cdmaSwapSecondCallState();
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- PhoneUtils.switchHoldingAndActive(mPhone);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- return new AtCommandResult(AtCommandResult.OK);
- } else if (args[0].equals(3)) {
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // For CDMA, we need to check if the call is in THRWAY_ACTIVE state
- if (PhoneApp.getInstance().cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
- if (VDBG) log("CHLD:3 Merge Calls");
- PhoneUtils.mergeCalls(mPhone);
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- if (mForegroundCall.getState().isAlive() &&
- mBackgroundCall.getState().isAlive()) {
- PhoneUtils.mergeCalls(mPhone);
- }
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- return new AtCommandResult(AtCommandResult.OK);
- }
- }
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- @Override
- public AtCommandResult handleTestCommand() {
- mServiceConnectionEstablished = true;
- sendURC("+CHLD: (0,1,2,3)");
- sendURC("OK"); // send reply first, then connect audio
- if (isIncallAudio()) {
- audioOn();
- }
- // already replied
- return new AtCommandResult(AtCommandResult.UNSOLICITED);
- }
- });
-
- // Get Network operator name
- parser.register("+COPS", new AtCommandHandler() {
- @Override
- public AtCommandResult handleReadCommand() {
- String operatorName = mPhone.getServiceState().getOperatorAlphaLong();
- if (operatorName != null) {
- if (operatorName.length() > 16) {
- operatorName = operatorName.substring(0, 16);
- }
- return new AtCommandResult(
- "+COPS: 0,0,\"" + operatorName + "\"");
- } else {
- return new AtCommandResult(
- "+COPS: 0,0,\"UNKNOWN\",0");
- }
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // Handsfree only supports AT+COPS=3,0
- if (args.length != 2 || !(args[0] instanceof Integer)
- || !(args[1] instanceof Integer)) {
- // syntax error
- return new AtCommandResult(AtCommandResult.ERROR);
- } else if ((Integer)args[0] != 3 || (Integer)args[1] != 0) {
- return reportCmeError(BluetoothCmeError.OPERATION_NOT_SUPPORTED);
- } else {
- return new AtCommandResult(AtCommandResult.OK);
- }
- }
- @Override
- public AtCommandResult handleTestCommand() {
- // Out of spec, but lets be friendly
- return new AtCommandResult("+COPS: (3),(0)");
- }
- });
-
- // Mobile PIN
- // AT+CPIN is not in the handsfree spec (although it is in 3GPP)
- parser.register("+CPIN", new AtCommandHandler() {
- @Override
- public AtCommandResult handleReadCommand() {
- return new AtCommandResult("+CPIN: READY");
- }
- });
-
- // Bluetooth Response and Hold
- // Only supported on PDC (Japan) and CDMA networks.
- parser.register("+BTRH", new AtCommandHandler() {
- @Override
- public AtCommandResult handleReadCommand() {
- // Replying with just OK indicates no response and hold
- // features in use now
- return new AtCommandResult(AtCommandResult.OK);
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // Neeed PDC or CDMA
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- });
-
- // Request International Mobile Subscriber Identity (IMSI)
- // Not in bluetooth handset spec
- parser.register("+CIMI", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- // AT+CIMI
- String imsi = mPhone.getSubscriberId();
- if (imsi == null || imsi.length() == 0) {
- return reportCmeError(BluetoothCmeError.SIM_FAILURE);
- } else {
- return new AtCommandResult(imsi);
- }
- }
- });
-
- // Calling Line Identification Presentation
- parser.register("+CLIP", new AtCommandHandler() {
- @Override
- public AtCommandResult handleReadCommand() {
- // Currently assumes the network is provisioned for CLIP
- return new AtCommandResult("+CLIP: " + (mClip ? "1" : "0") + ",1");
- }
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // AT+CLIP=<n>
- if (args.length >= 1 && (args[0].equals(0) || args[0].equals(1))) {
- mClip = args[0].equals(1);
- return new AtCommandResult(AtCommandResult.OK);
- } else {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- }
- @Override
- public AtCommandResult handleTestCommand() {
- return new AtCommandResult("+CLIP: (0-1)");
- }
- });
-
- // AT+CGSN - Returns the device IMEI number.
- parser.register("+CGSN", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- // Get the IMEI of the device.
- // mPhone will not be NULL at this point.
- return new AtCommandResult("+CGSN: " + mPhone.getDeviceId());
- }
- });
-
- // AT+CGMM - Query Model Information
- parser.register("+CGMM", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- // Return the Model Information.
- String model = SystemProperties.get("ro.product.model");
- if (model != null) {
- return new AtCommandResult("+CGMM: " + model);
- } else {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- }
- });
-
- // AT+CGMI - Query Manufacturer Information
- parser.register("+CGMI", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- // Return the Model Information.
- String manuf = SystemProperties.get("ro.product.manufacturer");
- if (manuf != null) {
- return new AtCommandResult("+CGMI: " + manuf);
- } else {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- }
- });
-
- // Noise Reduction and Echo Cancellation control
- parser.register("+NREC", new AtCommandHandler() {
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- if (args[0].equals(0)) {
- mAudioManager.setParameters(HEADSET_NREC+"=off");
- return new AtCommandResult(AtCommandResult.OK);
- } else if (args[0].equals(1)) {
- mAudioManager.setParameters(HEADSET_NREC+"=on");
- return new AtCommandResult(AtCommandResult.OK);
- }
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- });
-
- // Voice recognition (dialing)
- parser.register("+BVRA", new AtCommandHandler() {
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- if (!BluetoothHeadset.isBluetoothVoiceDialingEnabled(mContext)) {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- if (args.length >= 1 && args[0].equals(1)) {
- synchronized (BluetoothHandsfree.this) {
- if (!mWaitingForVoiceRecognition) {
- try {
- mContext.startActivity(sVoiceCommandIntent);
- } catch (ActivityNotFoundException e) {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- expectVoiceRecognition();
- }
- }
- return new AtCommandResult(AtCommandResult.UNSOLICITED); // send nothing yet
- } else if (args.length >= 1 && args[0].equals(0)) {
- audioOff();
- return new AtCommandResult(AtCommandResult.OK);
- }
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- @Override
- public AtCommandResult handleTestCommand() {
- return new AtCommandResult("+BVRA: (0-1)");
- }
- });
-
- // Retrieve Subscriber Number
- parser.register("+CNUM", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- String number = mPhone.getLine1Number();
- if (number == null) {
- return new AtCommandResult(AtCommandResult.OK);
- }
- return new AtCommandResult("+CNUM: ,\"" + number + "\"," +
- PhoneNumberUtils.toaFromString(number) + ",,4");
- }
- });
-
- // Microphone Gain
- parser.register("+VGM", new AtCommandHandler() {
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // AT+VGM=<gain> in range [0,15]
- // Headset/Handsfree is reporting its current gain setting
- return new AtCommandResult(AtCommandResult.OK);
- }
- });
-
- // Speaker Gain
- parser.register("+VGS", new AtCommandHandler() {
- @Override
- public AtCommandResult handleSetCommand(Object[] args) {
- // AT+VGS=<gain> in range [0,15]
- if (args.length != 1 || !(args[0] instanceof Integer)) {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- mScoGain = (Integer) args[0];
- int flag = mAudioManager.isBluetoothScoOn() ? AudioManager.FLAG_SHOW_UI:0;
-
- mAudioManager.setStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO, mScoGain, flag);
- return new AtCommandResult(AtCommandResult.OK);
- }
- });
-
- // Phone activity status
- parser.register("+CPAS", new AtCommandHandler() {
- @Override
- public AtCommandResult handleActionCommand() {
- int status = 0;
- switch (mPhone.getState()) {
- case IDLE:
- status = 0;
- break;
- case RINGING:
- status = 3;
- break;
- case OFFHOOK:
- status = 4;
- break;
- }
- return new AtCommandResult("+CPAS: " + status);
- }
- });
- mPhonebook.register(parser);
- }
-
- public void sendScoGainUpdate(int gain) {
- if (mScoGain != gain && (mRemoteBrsf & BRSF_HF_REMOTE_VOL_CONTROL) != 0x0) {
- sendURC("+VGS:" + gain);
- mScoGain = gain;
- }
- }
-
- public AtCommandResult reportCmeError(int error) {
- if (mCmee) {
- AtCommandResult result = new AtCommandResult(AtCommandResult.UNSOLICITED);
- result.addResponse("+CME ERROR: " + error);
- return result;
- } else {
- return new AtCommandResult(AtCommandResult.ERROR);
- }
- }
-
- private static final int START_CALL_TIMEOUT = 10000; // ms
-
- private synchronized void expectCallStart() {
- mWaitingForCallStart = true;
- Message msg = Message.obtain(mHandler, CHECK_CALL_STARTED);
- mHandler.sendMessageDelayed(msg, START_CALL_TIMEOUT);
- if (!mStartCallWakeLock.isHeld()) {
- mStartCallWakeLock.acquire(START_CALL_TIMEOUT);
- }
- }
-
- private synchronized void callStarted() {
- if (mWaitingForCallStart) {
- mWaitingForCallStart = false;
- sendURC("OK");
- if (mStartCallWakeLock.isHeld()) {
- mStartCallWakeLock.release();
- }
- }
- }
-
- private static final int START_VOICE_RECOGNITION_TIMEOUT = 5000; // ms
-
- private synchronized void expectVoiceRecognition() {
- mWaitingForVoiceRecognition = true;
- Message msg = Message.obtain(mHandler, CHECK_VOICE_RECOGNITION_STARTED);
- mHandler.sendMessageDelayed(msg, START_VOICE_RECOGNITION_TIMEOUT);
- if (!mStartVoiceRecognitionWakeLock.isHeld()) {
- mStartVoiceRecognitionWakeLock.acquire(START_VOICE_RECOGNITION_TIMEOUT);
- }
- }
-
- /* package */ synchronized boolean startVoiceRecognition() {
- if (mWaitingForVoiceRecognition) {
- // HF initiated
- mWaitingForVoiceRecognition = false;
- sendURC("OK");
- } else {
- // AG initiated
- sendURC("+BVRA: 1");
- }
- boolean ret = audioOn();
- if (mStartVoiceRecognitionWakeLock.isHeld()) {
- mStartVoiceRecognitionWakeLock.release();
- }
- return ret;
- }
-
- /* package */ synchronized boolean stopVoiceRecognition() {
- sendURC("+BVRA: 0");
- audioOff();
- return true;
- }
-
- private boolean inDebug() {
- return DBG && SystemProperties.getBoolean(DebugThread.DEBUG_HANDSFREE, false);
- }
-
- private boolean allowAudioAnytime() {
- return inDebug() && SystemProperties.getBoolean(DebugThread.DEBUG_HANDSFREE_AUDIO_ANYTIME,
- false);
- }
-
- private void startDebug() {
- if (DBG && mDebugThread == null) {
- mDebugThread = new DebugThread();
- mDebugThread.start();
- }
- }
-
- private void stopDebug() {
- if (mDebugThread != null) {
- mDebugThread.interrupt();
- mDebugThread = null;
- }
- }
-
- /** Debug thread to read debug properties - runs when debug.bt.hfp is true
- * at the time a bluetooth handsfree device is connected. Debug properties
- * are polled and mock updates sent every 1 second */
- private class DebugThread extends Thread {
- /** Turns on/off handsfree profile debugging mode */
- private static final String DEBUG_HANDSFREE = "debug.bt.hfp";
-
- /** Mock battery level change - use 0 to 5 */
- private static final String DEBUG_HANDSFREE_BATTERY = "debug.bt.hfp.battery";
-
- /** Mock no cellular service when false */
- private static final String DEBUG_HANDSFREE_SERVICE = "debug.bt.hfp.service";
-
- /** Mock cellular roaming when true */
- private static final String DEBUG_HANDSFREE_ROAM = "debug.bt.hfp.roam";
-
- /** false to true transition will force an audio (SCO) connection to
- * be established. true to false will force audio to be disconnected
- */
- private static final String DEBUG_HANDSFREE_AUDIO = "debug.bt.hfp.audio";
-
- /** true allows incoming SCO connection out of call.
- */
- private static final String DEBUG_HANDSFREE_AUDIO_ANYTIME = "debug.bt.hfp.audio_anytime";
-
- /** Mock signal strength change in ASU - use 0 to 31 */
- private static final String DEBUG_HANDSFREE_SIGNAL = "debug.bt.hfp.signal";
-
- /** Debug AT+CLCC: print +CLCC result */
- private static final String DEBUG_HANDSFREE_CLCC = "debug.bt.hfp.clcc";
-
- /** Debug AT+BSIR - Send In Band Ringtones Unsolicited AT command.
- * debug.bt.unsol.inband = 0 => AT+BSIR = 0 sent by the AG
- * debug.bt.unsol.inband = 1 => AT+BSIR = 0 sent by the AG
- * Other values are ignored.
- */
-
- private static final String DEBUG_UNSOL_INBAND_RINGTONE =
- "debug.bt.unsol.inband";
-
- @Override
- public void run() {
- boolean oldService = true;
- boolean oldRoam = false;
- boolean oldAudio = false;
-
- while (!isInterrupted() && inDebug()) {
- int batteryLevel = SystemProperties.getInt(DEBUG_HANDSFREE_BATTERY, -1);
- if (batteryLevel >= 0 && batteryLevel <= 5) {
- Intent intent = new Intent();
- intent.putExtra("level", batteryLevel);
- intent.putExtra("scale", 5);
- mBluetoothPhoneState.updateBatteryState(intent);
- }
-
- boolean serviceStateChanged = false;
- if (SystemProperties.getBoolean(DEBUG_HANDSFREE_SERVICE, true) != oldService) {
- oldService = !oldService;
- serviceStateChanged = true;
- }
- if (SystemProperties.getBoolean(DEBUG_HANDSFREE_ROAM, false) != oldRoam) {
- oldRoam = !oldRoam;
- serviceStateChanged = true;
- }
- if (serviceStateChanged) {
- Bundle b = new Bundle();
- b.putInt("state", oldService ? 0 : 1);
- b.putBoolean("roaming", oldRoam);
- mBluetoothPhoneState.updateServiceState(true, ServiceState.newFromBundle(b));
- }
-
- if (SystemProperties.getBoolean(DEBUG_HANDSFREE_AUDIO, false) != oldAudio) {
- oldAudio = !oldAudio;
- if (oldAudio) {
- audioOn();
- } else {
- audioOff();
- }
- }
-
- int signalLevel = SystemProperties.getInt(DEBUG_HANDSFREE_SIGNAL, -1);
- if (signalLevel >= 0 && signalLevel <= 31) {
- SignalStrength signalStrength = new SignalStrength(signalLevel, -1, -1, -1,
- -1, -1, -1, true);
- Intent intent = new Intent();
- Bundle data = new Bundle();
- signalStrength.fillInNotifierBundle(data);
- intent.putExtras(data);
- mBluetoothPhoneState.updateSignalState(intent);
- }
-
- if (SystemProperties.getBoolean(DEBUG_HANDSFREE_CLCC, false)) {
- log(gsmGetClccResult().toString());
- }
- try {
- sleep(1000); // 1 second
- } catch (InterruptedException e) {
- break;
- }
-
- int inBandRing =
- SystemProperties.getInt(DEBUG_UNSOL_INBAND_RINGTONE, -1);
- if (inBandRing == 0 || inBandRing == 1) {
- AtCommandResult result =
- new AtCommandResult(AtCommandResult.UNSOLICITED);
- result.addResponse("+BSIR: " + inBandRing);
- sendURC(result.toString());
- }
- }
- }
- }
-
- public void cdmaSwapSecondCallState() {
- if (VDBG) log("cdmaSetSecondCallState: Toggling mCdmaIsSecondCallActive");
- mCdmaIsSecondCallActive = !mCdmaIsSecondCallActive;
- }
-
- public void cdmaSetSecondCallState(boolean state) {
- if (VDBG) log("cdmaSetSecondCallState: Setting mCdmaIsSecondCallActive to " + state);
- mCdmaIsSecondCallActive = state;
- }
-
- private static void log(String msg) {
- Log.d(TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/BluetoothHeadsetService.java b/phone/src/com/android/phone2/BluetoothHeadsetService.java
deleted file mode 100644
index fb00792..0000000
--- a/phone/src/com/android/phone2/BluetoothHeadsetService.java
+++ /dev/null
@@ -1,815 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAudioGateway;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.BluetoothUuid;
-import android.bluetooth.HeadsetBase;
-import android.bluetooth.IBluetoothHeadset;
-import android.os.ParcelUuid;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.media.AudioManager;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.SystemProperties;
-import android.provider.Settings;
-import android.util.Log;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.ListIterator;
-import java.util.Set;
-
-/**
- * Provides Bluetooth Headset and Handsfree profile, as a service in
- * the Phone application.
- * @hide
- */
-public class BluetoothHeadsetService extends Service {
- private static final String TAG = "BT HSHFP";
- private static final boolean DBG = true;
-
- private static final String PREF_NAME = BluetoothHeadsetService.class.getSimpleName();
- private static final String PREF_LAST_HEADSET = "lastHeadsetAddress";
-
- private static final int PHONE_STATE_CHANGED = 1;
-
- private static final String BLUETOOTH_ADMIN_PERM = android.Manifest.permission.BLUETOOTH_ADMIN;
- private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH;
-
- private static boolean sHasStarted = false;
-
- private BluetoothDevice mDeviceSdpQuery;
- private BluetoothAdapter mAdapter;
- private PowerManager mPowerManager;
- private BluetoothAudioGateway mAg;
- private HeadsetBase mHeadset;
- private int mState;
- private int mHeadsetType;
- private BluetoothHandsfree mBtHandsfree;
- private BluetoothDevice mRemoteDevice;
- private LinkedList<BluetoothDevice> mAutoConnectQueue;
- private Call mForegroundCall;
- private Call mRingingCall;
- private Phone mPhone;
-
- private final HeadsetPriority mHeadsetPriority = new HeadsetPriority();
-
- public BluetoothHeadsetService() {
- mState = BluetoothHeadset.STATE_DISCONNECTED;
- mHeadsetType = BluetoothHandsfree.TYPE_UNKNOWN;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- mAdapter = BluetoothAdapter.getDefaultAdapter();
- mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
- mBtHandsfree = PhoneApp.getInstance().getBluetoothHandsfree();
- mAg = new BluetoothAudioGateway(mAdapter);
- mPhone = SipPhoneFactory.getDefaultPhone();
- mRingingCall = mPhone.getRingingCall();
- mForegroundCall = mPhone.getForegroundCall();
- if (mAdapter.isEnabled()) {
- mHeadsetPriority.load();
- }
- IntentFilter filter = new IntentFilter(
- BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
- filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
- filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
- filter.addAction(AudioManager.VOLUME_CHANGED_ACTION);
- filter.addAction(BluetoothDevice.ACTION_UUID);
- registerReceiver(mBluetoothReceiver, filter);
- }
-
- @Override
- public void onStart(Intent intent, int startId) {
- if (mAdapter == null) {
- Log.w(TAG, "Stopping BluetoothHeadsetService: device does not have BT");
- stopSelf();
- } else {
- if (!sHasStarted) {
- if (DBG) log("Starting BluetoothHeadsetService");
- if (mAdapter.isEnabled()) {
- mAg.start(mIncomingConnectionHandler);
- mBtHandsfree.onBluetoothEnabled();
- // BT might have only just started, wait 6 seconds until
- // SDP records are registered before reconnecting headset
- mHandler.sendMessageDelayed(mHandler.obtainMessage(RECONNECT_LAST_HEADSET),
- 6000);
- }
- sHasStarted = true;
- }
- }
- }
-
- private final Handler mIncomingConnectionHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- BluetoothAudioGateway.IncomingConnectionInfo info =
- (BluetoothAudioGateway.IncomingConnectionInfo)msg.obj;
- int type = BluetoothHandsfree.TYPE_UNKNOWN;
- switch(msg.what) {
- case BluetoothAudioGateway.MSG_INCOMING_HEADSET_CONNECTION:
- type = BluetoothHandsfree.TYPE_HEADSET;
- break;
- case BluetoothAudioGateway.MSG_INCOMING_HANDSFREE_CONNECTION:
- type = BluetoothHandsfree.TYPE_HANDSFREE;
- break;
- }
-
- Log.i(TAG, "Incoming rfcomm (" + BluetoothHandsfree.typeToString(type) +
- ") connection from " + info.mRemoteDevice + "on channel " + info.mRfcommChan);
-
- int priority = BluetoothHeadset.PRIORITY_OFF;
- HeadsetBase headset;
- try {
- priority = mBinder.getPriority(info.mRemoteDevice);
- } catch (RemoteException e) {}
- if (priority <= BluetoothHeadset.PRIORITY_OFF) {
- Log.i(TAG, "Rejecting incoming connection because priority = " + priority);
-
- headset = new HeadsetBase(mPowerManager, mAdapter, info.mRemoteDevice,
- info.mSocketFd, info.mRfcommChan, null);
- headset.disconnect();
- return;
- }
- switch (mState) {
- case BluetoothHeadset.STATE_DISCONNECTED:
- // headset connecting us, lets join
- mRemoteDevice = info.mRemoteDevice;
- setState(BluetoothHeadset.STATE_CONNECTING);
- headset = new HeadsetBase(mPowerManager, mAdapter, mRemoteDevice, info.mSocketFd,
- info.mRfcommChan, mConnectedStatusHandler);
- mHeadsetType = type;
-
- mConnectingStatusHandler.obtainMessage(RFCOMM_CONNECTED, headset).sendToTarget();
-
- break;
- case BluetoothHeadset.STATE_CONNECTING:
- if (!info.mRemoteDevice.equals(mRemoteDevice)) {
- // different headset, ignoring
- Log.i(TAG, "Already attempting connect to " + mRemoteDevice +
- ", disconnecting " + info.mRemoteDevice);
-
- headset = new HeadsetBase(mPowerManager, mAdapter, info.mRemoteDevice,
- info.mSocketFd, info.mRfcommChan, null);
- headset.disconnect();
- }
- // If we are here, we are in danger of a race condition
- // incoming rfcomm connection, but we are also attempting an
- // outgoing connection. Lets try and interrupt the outgoing
- // connection.
- Log.i(TAG, "Incoming and outgoing connections to " + info.mRemoteDevice +
- ". Cancel outgoing connection.");
- if (mConnectThread != null) {
- mConnectThread.interrupt();
- mConnectThread = null;
- }
-
- // Now continue with new connection, including calling callback
- mHeadset = new HeadsetBase(mPowerManager, mAdapter, mRemoteDevice,
- info.mSocketFd, info.mRfcommChan, mConnectedStatusHandler);
- mHeadsetType = type;
-
- setState(BluetoothHeadset.STATE_CONNECTED, BluetoothHeadset.RESULT_SUCCESS);
- mBtHandsfree.connectHeadset(mHeadset, mHeadsetType);
-
- if (DBG) log("Successfully used incoming connection");
- break;
- case BluetoothHeadset.STATE_CONNECTED:
- Log.i(TAG, "Already connected to " + mRemoteDevice + ", disconnecting " +
- info.mRemoteDevice);
-
- headset = new HeadsetBase(mPowerManager, mAdapter, info.mRemoteDevice,
- info.mSocketFd, info.mRfcommChan, null);
- headset.disconnect();
- break;
- }
- }
- };
-
- private synchronized void autoConnectHeadset() {
- if (DBG && debugDontReconnect()) {
- return;
- }
- if (mAdapter.isEnabled()) {
- try {
- mBinder.connectHeadset(null);
- } catch (RemoteException e) {}
- }
- }
-
- private final BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- BluetoothDevice device =
- intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-
- if ((mState == BluetoothHeadset.STATE_CONNECTED ||
- mState == BluetoothHeadset.STATE_CONNECTING) &&
- action.equals(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED) &&
- device.equals(mRemoteDevice)) {
- try {
- mBinder.disconnectHeadset();
- } catch (RemoteException e) {}
- } else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
- switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
- BluetoothAdapter.ERROR)) {
- case BluetoothAdapter.STATE_ON:
- mHeadsetPriority.load();
- mHandler.sendMessageDelayed(mHandler.obtainMessage(RECONNECT_LAST_HEADSET), 8000);
- mAg.start(mIncomingConnectionHandler);
- mBtHandsfree.onBluetoothEnabled();
- break;
- case BluetoothAdapter.STATE_TURNING_OFF:
- mBtHandsfree.onBluetoothDisabled();
- mAg.stop();
- setState(BluetoothHeadset.STATE_DISCONNECTED, BluetoothHeadset.RESULT_FAILURE,
- BluetoothHeadset.LOCAL_DISCONNECT);
- break;
- }
- } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
- int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
- BluetoothDevice.ERROR);
- switch(bondState) {
- case BluetoothDevice.BOND_BONDED:
- if (mHeadsetPriority.get(device) == BluetoothHeadset.PRIORITY_UNDEFINED) {
- mHeadsetPriority.set(device, BluetoothHeadset.PRIORITY_ON);
- }
- break;
- case BluetoothDevice.BOND_NONE:
- mHeadsetPriority.set(device, BluetoothHeadset.PRIORITY_UNDEFINED);
- break;
- }
- } else if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) {
- int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1);
- if (streamType == AudioManager.STREAM_BLUETOOTH_SCO) {
- mBtHandsfree.sendScoGainUpdate(intent.getIntExtra(
- AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0));
- }
-
- } else if (action.equals(BluetoothDevice.ACTION_UUID)) {
- if (device.equals(mDeviceSdpQuery)) {
- // We have got SDP records for the device we are interested in.
- getSdpRecordsAndConnect();
- }
- }
- }
- };
-
- private static final int RECONNECT_LAST_HEADSET = 1;
- private static final int CONNECT_HEADSET_DELAYED = 2;
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case RECONNECT_LAST_HEADSET:
- autoConnectHeadset();
- break;
- case CONNECT_HEADSET_DELAYED:
- getSdpRecordsAndConnect();
- break;
- }
- }
- };
-
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
-
- // ------------------------------------------------------------------
- // Bluetooth Headset Connect
- // ------------------------------------------------------------------
- private static final int RFCOMM_CONNECTED = 1;
- private static final int RFCOMM_ERROR = 2;
-
- private long mTimestamp;
-
- /**
- * Thread for RFCOMM connection
- * Messages are sent to mConnectingStatusHandler as connection progresses.
- */
- private RfcommConnectThread mConnectThread;
- private class RfcommConnectThread extends Thread {
- private BluetoothDevice device;
- private int channel;
- private int type;
-
- private static final int EINTERRUPT = -1000;
- private static final int ECONNREFUSED = -111;
-
- public RfcommConnectThread(BluetoothDevice device, int channel, int type) {
- super();
- this.device = device;
- this.channel = channel;
- this.type = type;
- }
-
- private int waitForConnect(HeadsetBase headset) {
- // Try to connect for 20 seconds
- int result = 0;
- for (int i=0; i < 40 && result == 0; i++) {
- // waitForAsyncConnect returns 0 on timeout, 1 on success, < 0 on error.
- result = headset.waitForAsyncConnect(500, mConnectedStatusHandler);
- if (isInterrupted()) {
- headset.disconnect();
- return EINTERRUPT;
- }
- }
- return result;
- }
-
- @Override
- public void run() {
- long timestamp;
-
- timestamp = System.currentTimeMillis();
- HeadsetBase headset = new HeadsetBase(mPowerManager, mAdapter, device, channel);
-
- int result = waitForConnect(headset);
-
- if (result != EINTERRUPT && result != 1) {
- if (result == ECONNREFUSED && mDeviceSdpQuery == null) {
- // The rfcomm channel number might have changed, do SDP
- // query and try to connect again.
- mDeviceSdpQuery = mRemoteDevice;
- device.fetchUuidsWithSdp();
- mConnectThread = null;
- return;
- } else {
- Log.i(TAG, "Trying to connect to rfcomm socket again after 1 sec");
- try {
- sleep(1000); // 1 second
- } catch (InterruptedException e) {}
- }
- result = waitForConnect(headset);
- }
-
- mDeviceSdpQuery = null;
- if (result == EINTERRUPT) return;
-
- if (DBG) log("RFCOMM connection attempt took " +
- (System.currentTimeMillis() - timestamp) + " ms");
- if (isInterrupted()) {
- headset.disconnect();
- return;
- }
- if (result < 0) {
- Log.w(TAG, "headset.waitForAsyncConnect() error: " + result);
- mConnectingStatusHandler.obtainMessage(RFCOMM_ERROR).sendToTarget();
- return;
- } else if (result == 0) {
- mConnectingStatusHandler.obtainMessage(RFCOMM_ERROR).sendToTarget();
- Log.w(TAG, "mHeadset.waitForAsyncConnect() error: " + result + "(timeout)");
- return;
- } else {
- mConnectingStatusHandler.obtainMessage(RFCOMM_CONNECTED, headset).sendToTarget();
- }
- }
- }
-
- /**
- * Receives events from mConnectThread back in the main thread.
- */
- private final Handler mConnectingStatusHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- if (mState != BluetoothHeadset.STATE_CONNECTING) {
- return; // stale events
- }
-
- switch (msg.what) {
- case RFCOMM_ERROR:
- if (DBG) log("Rfcomm error");
- mConnectThread = null;
- setState(BluetoothHeadset.STATE_DISCONNECTED, BluetoothHeadset.RESULT_FAILURE,
- BluetoothHeadset.LOCAL_DISCONNECT);
- break;
- case RFCOMM_CONNECTED:
- if (DBG) log("Rfcomm connected");
- mConnectThread = null;
- mHeadset = (HeadsetBase)msg.obj;
- setState(BluetoothHeadset.STATE_CONNECTED, BluetoothHeadset.RESULT_SUCCESS);
-
- mBtHandsfree.connectHeadset(mHeadset, mHeadsetType);
- break;
- }
- }
- };
-
- /**
- * Receives events from a connected RFCOMM socket back in the main thread.
- */
- private final Handler mConnectedStatusHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case HeadsetBase.RFCOMM_DISCONNECTED:
- setState(BluetoothHeadset.STATE_DISCONNECTED, BluetoothHeadset.RESULT_FAILURE,
- BluetoothHeadset.REMOTE_DISCONNECT);
- break;
- }
- }
- };
-
- private void setState(int state) {
- setState(state, BluetoothHeadset.RESULT_SUCCESS);
- }
-
- private void setState(int state, int result) {
- setState(state, result, -1);
- }
-
- private synchronized void setState(int state, int result, int initiator) {
- if (state != mState) {
- if (DBG) log("Headset state " + mState + " -> " + state + ", result = " + result);
- if (mState == BluetoothHeadset.STATE_CONNECTED) {
- mBtHandsfree.disconnectHeadset();
- }
- Intent intent = new Intent(BluetoothHeadset.ACTION_STATE_CHANGED);
- intent.putExtra(BluetoothHeadset.EXTRA_PREVIOUS_STATE, mState);
- mState = state;
- intent.putExtra(BluetoothHeadset.EXTRA_STATE, mState);
- intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mRemoteDevice);
- // Add Extra EXTRA_DISCONNECT_INITIATOR for DISCONNECTED state
- if (mState == BluetoothHeadset.STATE_DISCONNECTED) {
- if (initiator == -1) {
- log("Headset Disconnected Intent without Disconnect Initiator extra");
- } else {
- intent.putExtra(BluetoothHeadset.EXTRA_DISCONNECT_INITIATOR,
- initiator);
- }
- }
- sendBroadcast(intent, BLUETOOTH_PERM);
- if (mState == BluetoothHeadset.STATE_DISCONNECTED) {
- mHeadset = null;
- mRemoteDevice = null;
- mHeadsetType = BluetoothHandsfree.TYPE_UNKNOWN;
- if (mAutoConnectQueue != null) {
- doNextAutoConnect();
- }
- } else if (mState == BluetoothHeadset.STATE_CONNECTING) {
- // Set the priority to AUTO_CONNECT
- mHeadsetPriority.set(mRemoteDevice, BluetoothHeadset.PRIORITY_AUTO_CONNECT);
- } else if (mState == BluetoothHeadset.STATE_CONNECTED) {
- mAutoConnectQueue = null; // cancel further auto-connection
- mHeadsetPriority.bump(mRemoteDevice);
- }
- }
- }
-
- private void getSdpRecordsAndConnect() {
- ParcelUuid[] uuids = mRemoteDevice.getUuids();
- if (uuids != null) {
- if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.Handsfree)) {
- log("SDP UUID: TYPE_HANDSFREE");
- mHeadsetType = BluetoothHandsfree.TYPE_HANDSFREE;
- int channel = mRemoteDevice.getServiceChannel(BluetoothUuid.Handsfree);
- mConnectThread = new RfcommConnectThread(mRemoteDevice, channel, mHeadsetType);
- mConnectThread.start();
- return;
- } else if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.HSP)) {
- log("SDP UUID: TYPE_HEADSET");
- mHeadsetType = BluetoothHandsfree.TYPE_HEADSET;
- int channel = mRemoteDevice.getServiceChannel(BluetoothUuid.HSP);
- mConnectThread = new RfcommConnectThread(mRemoteDevice, channel, mHeadsetType);
- mConnectThread.start();
- return;
- }
- }
- log("SDP UUID: TYPE_UNKNOWN");
- mHeadsetType = BluetoothHandsfree.TYPE_UNKNOWN;
- setState(BluetoothHeadset.STATE_DISCONNECTED,
- BluetoothHeadset.RESULT_FAILURE, BluetoothHeadset.LOCAL_DISCONNECT);
- return;
- }
-
- private synchronized boolean doNextAutoConnect() {
- if (mAutoConnectQueue == null || mAutoConnectQueue.size() == 0) {
- mAutoConnectQueue = null;
- return false;
- }
- mRemoteDevice = mAutoConnectQueue.removeFirst();
- // Don't auto connect with docks if we are docked with the dock.
- if (isPhoneDocked(mRemoteDevice)) return doNextAutoConnect();
-
- if (DBG) log("pulled " + mRemoteDevice + " off auto-connect queue");
- setState(BluetoothHeadset.STATE_CONNECTING);
- getSdpRecordsAndConnect();
-
- return true;
- }
-
- private boolean isPhoneDocked(BluetoothDevice autoConnectDevice) {
- // This works only because these broadcast intents are "sticky"
- Intent i = registerReceiver(null, new IntentFilter(Intent.ACTION_DOCK_EVENT));
- if (i != null) {
- int state = i.getIntExtra(Intent.EXTRA_DOCK_STATE, Intent.EXTRA_DOCK_STATE_UNDOCKED);
- if (state != Intent.EXTRA_DOCK_STATE_UNDOCKED) {
- BluetoothDevice device = i.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- if (device != null && autoConnectDevice.equals(device)) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * Handlers for incoming service calls
- */
- private final IBluetoothHeadset.Stub mBinder = new IBluetoothHeadset.Stub() {
- public int getState() {
- enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- return mState;
- }
- public BluetoothDevice getCurrentHeadset() {
- enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- if (mState == BluetoothHeadset.STATE_DISCONNECTED) {
- return null;
- }
- return mRemoteDevice;
- }
- public boolean connectHeadset(BluetoothDevice device) {
- enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
- "Need BLUETOOTH_ADMIN permission");
- synchronized (BluetoothHeadsetService.this) {
- if (mState == BluetoothHeadset.STATE_CONNECTED ||
- mState == BluetoothHeadset.STATE_CONNECTING) {
- Log.w(TAG, "connectHeadset(" + device + "): failed: already in state " +
- mState + " with headset " + mRemoteDevice);
- return false;
- }
- if (device == null) {
- mAutoConnectQueue = mHeadsetPriority.getSorted();
- return doNextAutoConnect();
- }
- mRemoteDevice = device;
- setState(BluetoothHeadset.STATE_CONNECTING);
- if (mRemoteDevice.getUuids() == null) {
- // We might not have got the UUID change notification from
- // Bluez yet, if we have just paired. Try after 1.5 secs.
- mHandler.sendMessageDelayed(
- mHandler.obtainMessage(CONNECT_HEADSET_DELAYED), 1500);
- } else {
- getSdpRecordsAndConnect();
- }
- }
- return true;
- }
- public boolean isConnected(BluetoothDevice device) {
- enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- return mState == BluetoothHeadset.STATE_CONNECTED && mRemoteDevice.equals(device);
- }
- public void disconnectHeadset() {
- enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
- "Need BLUETOOTH_ADMIN permission");
- synchronized (BluetoothHeadsetService.this) {
- switch (mState) {
- case BluetoothHeadset.STATE_CONNECTING:
- if (mConnectThread != null) {
- // cancel the connection thread
- mConnectThread.interrupt();
- try {
- mConnectThread.join();
- } catch (InterruptedException e) {
- Log.e(TAG, "Connection cancelled twice?", e);
- }
- mConnectThread = null;
- }
- if (mHeadset != null) {
- mHeadset.disconnect();
- mHeadset = null;
- }
- setState(BluetoothHeadset.STATE_DISCONNECTED,
- BluetoothHeadset.RESULT_CANCELED,
- BluetoothHeadset.LOCAL_DISCONNECT);
- break;
- case BluetoothHeadset.STATE_CONNECTED:
- // Send a dummy battery level message to force headset
- // out of sniff mode so that it will immediately notice
- // the disconnection. We are currently sending it for
- // handsfree only.
- // TODO: Call hci_conn_enter_active_mode() from
- // rfcomm_send_disc() in the kernel instead.
- // See http://b/1716887
- if (mHeadsetType == BluetoothHandsfree.TYPE_HANDSFREE) {
- mHeadset.sendURC("+CIEV: 7,3");
- }
-
- if (mHeadset != null) {
- mHeadset.disconnect();
- mHeadset = null;
- }
- setState(BluetoothHeadset.STATE_DISCONNECTED,
- BluetoothHeadset.RESULT_CANCELED,
- BluetoothHeadset.LOCAL_DISCONNECT);
- break;
- }
- }
- }
- public boolean startVoiceRecognition() {
- enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- synchronized (BluetoothHeadsetService.this) {
- if (mState != BluetoothHeadset.STATE_CONNECTED) {
- return false;
- }
- return mBtHandsfree.startVoiceRecognition();
- }
- }
- public boolean stopVoiceRecognition() {
- enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
- synchronized (BluetoothHeadsetService.this) {
- if (mState != BluetoothHeadset.STATE_CONNECTED) {
- return false;
- }
- return mBtHandsfree.stopVoiceRecognition();
- }
- }
- public boolean setPriority(BluetoothDevice device, int priority) {
- enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
- "Need BLUETOOTH_ADMIN permission");
- if (priority < BluetoothHeadset.PRIORITY_OFF) {
- return false;
- }
- mHeadsetPriority.set(device, priority);
- return true;
- }
- public int getPriority(BluetoothDevice device) {
- enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-
- return mHeadsetPriority.get(device);
- }
- public int getBatteryUsageHint() {
- enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
-
- return HeadsetBase.getAtInputCount();
- }
- };
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- if (DBG) log("Stopping BluetoothHeadsetService");
- unregisterReceiver(mBluetoothReceiver);
- mBtHandsfree.onBluetoothDisabled();
- mAg.stop();
- sHasStarted = false;
- setState(BluetoothHeadset.STATE_DISCONNECTED,
- BluetoothHeadset.RESULT_CANCELED,
- BluetoothHeadset.LOCAL_DISCONNECT);
- mHeadsetType = BluetoothHandsfree.TYPE_UNKNOWN;
- }
-
- private class HeadsetPriority {
- private HashMap<BluetoothDevice, Integer> mPriority =
- new HashMap<BluetoothDevice, Integer>();
-
- public synchronized boolean load() {
- Set<BluetoothDevice> devices = mAdapter.getBondedDevices();
- if (devices == null) {
- return false; // for example, bluetooth is off
- }
- for (BluetoothDevice device : devices) {
- load(device);
- }
- return true;
- }
-
- private synchronized int load(BluetoothDevice device) {
- int priority = Settings.Secure.getInt(getContentResolver(),
- Settings.Secure.getBluetoothHeadsetPriorityKey(device.getAddress()),
- BluetoothHeadset.PRIORITY_UNDEFINED);
- mPriority.put(device, new Integer(priority));
- if (DBG) log("Loaded priority " + device + " = " + priority);
- return priority;
- }
-
- public synchronized int get(BluetoothDevice device) {
- Integer priority = mPriority.get(device);
- if (priority == null) {
- return load(device);
- }
- return priority.intValue();
- }
-
- public synchronized void set(BluetoothDevice device, int priority) {
- int oldPriority = get(device);
- if (oldPriority == priority) {
- return;
- }
- mPriority.put(device, new Integer(priority));
- Settings.Secure.putInt(getContentResolver(),
- Settings.Secure.getBluetoothHeadsetPriorityKey(device.getAddress()),
- priority);
- if (DBG) log("Saved priority " + device + " = " + priority);
- }
-
- /** Mark this headset as highest priority */
- public synchronized void bump(BluetoothDevice device) {
- int oldPriority = get(device);
- int maxPriority = BluetoothHeadset.PRIORITY_AUTO_CONNECT;
-
- // Find max, not including given address
- for (BluetoothDevice d : mPriority.keySet()) {
- if (device.equals(d)) continue;
- int p = mPriority.get(d).intValue();
- if (p > maxPriority) {
- maxPriority = p;
- }
- }
- if (maxPriority >= oldPriority) {
- int p = maxPriority + 1;
- set(device, p);
- if (p >= Integer.MAX_VALUE) {
- rebalance();
- }
- }
- }
-
- /** shifts all non-zero priorities to be monotonically increasing from
- * PRIORITY_AUTO_CONNECT */
- private synchronized void rebalance() {
- LinkedList<BluetoothDevice> sorted = getSorted();
- if (DBG) log("Rebalancing " + sorted.size() + " headset priorities");
-
- ListIterator<BluetoothDevice> li = sorted.listIterator(sorted.size());
- int priority = BluetoothHeadset.PRIORITY_AUTO_CONNECT;
- while (li.hasPrevious()) {
- BluetoothDevice device = li.previous();
- set(device, priority);
- priority++;
- }
- }
-
- /** Get list of headsets sorted by decreasing priority.
- * Headsets with priority less than AUTO_CONNECT are not included */
- public synchronized LinkedList<BluetoothDevice> getSorted() {
- LinkedList<BluetoothDevice> sorted = new LinkedList<BluetoothDevice>();
- HashMap<BluetoothDevice, Integer> toSort =
- new HashMap<BluetoothDevice, Integer>(mPriority);
-
- // add in sorted order. this could be more efficient.
- while (true) {
- BluetoothDevice maxDevice = null;
- int maxPriority = BluetoothHeadset.PRIORITY_AUTO_CONNECT;
- for (BluetoothDevice device : toSort.keySet()) {
- int priority = toSort.get(device).intValue();
- if (priority >= maxPriority) {
- maxDevice = device;
- maxPriority = priority;
- }
- }
- if (maxDevice == null) {
- break;
- }
- sorted.addLast(maxDevice);
- toSort.remove(maxDevice);
- }
- return sorted;
- }
- }
-
- /** If this property is false, then don't auto-reconnect BT headset */
- private static final String DEBUG_AUTO_RECONNECT = "debug.bt.hshfp.auto_reconnect";
-
- private boolean debugDontReconnect() {
- return (!SystemProperties.getBoolean(DEBUG_AUTO_RECONNECT, true));
- }
-
- private static void log(String msg) {
- Log.d(TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/ButtonGridLayout.java b/phone/src/com/android/phone2/ButtonGridLayout.java
deleted file mode 100644
index ef5c10f..0000000
--- a/phone/src/com/android/phone2/ButtonGridLayout.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View.MeasureSpec;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Create a 4x3 grid of dial buttons.
- *
- * It was easier and more efficient to do it this way than use
- * standard layouts. It's perfectly fine (and actually encouraged) to
- * use custom layouts rather than piling up standard layouts.
- *
- * The horizontal and vertical spacings between buttons are controlled
- * by the amount of padding (attributes on the ButtonGridLayout element):
- * - horizontal = left + right padding and
- * - vertical = top + bottom padding.
- *
- * This class assumes that all the buttons have the same size.
- * The buttons will be bottom aligned in their view on layout.
- *
- * Invocation: onMeasure is called first by the framework to know our
- * size. Then onLayout is invoked to layout the buttons.
- */
-// TODO: Blindly layout the buttons w/o checking if we overrun the
-// bottom-right corner.
-
-public class ButtonGridLayout extends ViewGroup {
- static private final String TAG = "ButtonGridLayout";
- static private final int COLUMNS = 3;
- static private final int ROWS = 4;
- static private final int NUM_CHILDREN = ROWS * COLUMNS;
-
- private View[] mButtons = new View[NUM_CHILDREN];
-
- // This what the fields represent (height is similar):
- // PL: mPaddingLeft
- // BW: mButtonWidth
- // PR: mPaddingRight
- //
- // mWidthInc
- // <-------------------->
- // PL BW PR
- // <----><--------><---->
- // --------
- // | |
- // | button |
- // | |
- // --------
- //
- // We assume mPaddingLeft == mPaddingRight == 1/2 padding between
- // buttons.
- //
- // mWidth == COLUMNS x mWidthInc
-
- // Width and height of a button
- private int mButtonWidth;
- private int mButtonHeight;
-
- // Width and height of a button + padding.
- private int mWidthInc;
- private int mHeightInc;
-
- // Height of the dialpad. Used to align it at the bottom of the
- // view.
- private int mWidth;
- private int mHeight;
-
-
- public ButtonGridLayout(Context context) {
- super(context);
- }
-
- public ButtonGridLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public ButtonGridLayout(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- /**
- * Cache the buttons in a member array for faster access. Compute
- * the measurements for the width/height of buttons. The inflate
- * sequence is called right after the constructor and before the
- * measure/layout phase.
- */
- @Override
- protected void onFinishInflate () {
- super.onFinishInflate();
- final View[] buttons = mButtons;
- for (int i = 0; i < NUM_CHILDREN; i++) {
- buttons[i] = getChildAt(i);
- // Measure the button to get initialized.
- buttons[i].measure(MeasureSpec.UNSPECIFIED , MeasureSpec.UNSPECIFIED);
- }
-
- // Cache the measurements.
- final View child = buttons[0];
- mButtonWidth = child.getMeasuredWidth();
- mButtonHeight = child.getMeasuredHeight();
- mWidthInc = mButtonWidth + mPaddingLeft + mPaddingRight;
- mHeightInc = mButtonHeight + mPaddingTop + mPaddingBottom;
- mWidth = COLUMNS * mWidthInc;
- mHeight = ROWS * mHeightInc;
- }
-
- /**
- * Set the background of all the children. Typically a selector to
- * change the background based on some combination of the button's
- * attributes (e.g pressed, enabled...)
- * @param resid Is a resource id to be used for each button's background.
- */
- public void setChildrenBackgroundResource(int resid) {
- final View[] buttons = mButtons;
- for (int i = 0; i < NUM_CHILDREN; i++) {
- buttons[i].setBackgroundResource(resid);
- }
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- final View[] buttons = mButtons;
- final int paddingLeft = mPaddingLeft;
- final int buttonWidth = mButtonWidth;
- final int buttonHeight = mButtonHeight;
- final int widthInc = mWidthInc;
- final int heightInc = mHeightInc;
-
- int i = 0;
- // The last row is bottom aligned.
- int y = (bottom - top) - mHeight + mPaddingTop;
- for (int row = 0; row < ROWS; row++) {
- int x = paddingLeft;
- for (int col = 0; col < COLUMNS; col++) {
- buttons[i].layout(x, y, x + buttonWidth, y + buttonHeight);
- x += widthInc;
- i++;
- }
- y += heightInc;
- }
- }
-
- /**
- * This method is called twice in practice. The first time both
- * with and height are constraint by AT_MOST. The second time, the
- * width is still AT_MOST and the height is EXACTLY. Either way
- * the full width/height should be in mWidth and mHeight and we
- * use 'resolveSize' to do the right thing.
- */
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- final int width = resolveSize(mWidth, widthMeasureSpec);
- final int height = resolveSize(mHeight, heightMeasureSpec);
- setMeasuredDimension(width, height);
- }
-}
diff --git a/phone/src/com/android/phone2/CLIRListPreference.java b/phone/src/com/android/phone2/CLIRListPreference.java
deleted file mode 100644
index d95d891..0000000
--- a/phone/src/com/android/phone2/CLIRListPreference.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package com.android.phone2;
-
-import static com.android.phone2.TimeConsumingPreferenceActivity.EXCEPTION_ERROR;
-import static com.android.phone2.TimeConsumingPreferenceActivity.RESPONSE_ERROR;
-
-import com.android.internal.telephony.CommandsInterface;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-import android.content.Context;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Parcelable;
-import android.preference.ListPreference;
-import android.util.AttributeSet;
-import android.util.Log;
-
-public class CLIRListPreference extends ListPreference {
- private static final String LOG_TAG = "CLIRListPreference";
- private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- private MyHandler mHandler = new MyHandler();
- Phone phone;
- TimeConsumingPreferenceListener tcpListener;
-
- int clirArray[];
-
- public CLIRListPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- phone = SipPhoneFactory.getDefaultPhone();
- }
-
- public CLIRListPreference(Context context) {
- this(context, null);
- }
-
- @Override
- protected void onDialogClosed(boolean positiveResult) {
- super.onDialogClosed(positiveResult);
-
- phone.setOutgoingCallerIdDisplay(findIndexOfValue(getValue()),
- mHandler.obtainMessage(MyHandler.MESSAGE_SET_CLIR));
- if (tcpListener != null) {
- tcpListener.onStarted(this, false);
- }
- }
-
- void init(TimeConsumingPreferenceListener listener, boolean skipReading) {
- tcpListener = listener;
- if (!skipReading) {
- phone.getOutgoingCallerIdDisplay(mHandler.obtainMessage(MyHandler.MESSAGE_GET_CLIR,
- MyHandler.MESSAGE_GET_CLIR, MyHandler.MESSAGE_GET_CLIR));
- if (tcpListener != null) {
- tcpListener.onStarted(this, true);
- }
- }
- }
-
- void handleGetCLIRResult(int tmpClirArray[]) {
- clirArray = tmpClirArray;
- final boolean enabled = tmpClirArray[1] == 1 || tmpClirArray[1] == 3 || tmpClirArray[1] == 4;
- setEnabled(enabled);
-
- // set the value of the preference based upon the clirArgs.
- int value = CommandsInterface.CLIR_DEFAULT;
- switch (tmpClirArray[1]) {
- case 1: // Permanently provisioned
- case 3: // Temporary presentation disallowed
- case 4: // Temporary presentation allowed
- switch (tmpClirArray[0]) {
- case 1: // CLIR invoked
- value = CommandsInterface.CLIR_INVOCATION;
- break;
- case 2: // CLIR suppressed
- value = CommandsInterface.CLIR_SUPPRESSION;
- break;
- case 0: // Network default
- default:
- value = CommandsInterface.CLIR_DEFAULT;
- break;
- }
- break;
- case 0: // Not Provisioned
- case 2: // Unknown (network error, etc)
- default:
- value = CommandsInterface.CLIR_DEFAULT;
- break;
- }
- setValueIndex(value);
-
- // set the string summary to reflect the value
- int summary = R.string.sum_default_caller_id;
- switch (value) {
- case CommandsInterface.CLIR_SUPPRESSION:
- summary = R.string.sum_show_caller_id;
- break;
- case CommandsInterface.CLIR_INVOCATION:
- summary = R.string.sum_hide_caller_id;
- break;
- case CommandsInterface.CLIR_DEFAULT:
- summary = R.string.sum_default_caller_id;
- break;
- }
- setSummary(summary);
- }
-
- private class MyHandler extends Handler {
- private static final int MESSAGE_GET_CLIR = 0;
- private static final int MESSAGE_SET_CLIR = 1;
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_GET_CLIR:
- handleGetCLIRResponse(msg);
- break;
- case MESSAGE_SET_CLIR:
- handleSetCLIRResponse(msg);
- break;
- }
- }
-
- private void handleGetCLIRResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (msg.arg2 == MESSAGE_SET_CLIR) {
- tcpListener.onFinished(CLIRListPreference.this, false);
- } else {
- tcpListener.onFinished(CLIRListPreference.this, true);
- }
- clirArray = null;
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "handleGetCLIRResponse: ar.exception="+ar.exception);
- setEnabled(false);
- tcpListener.onError(CLIRListPreference.this, EXCEPTION_ERROR);
- } else if (ar.userObj instanceof Throwable) {
- tcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR);
- } else {
- int clirArray[] = (int[]) ar.result;
- if (clirArray.length != 2) {
- tcpListener.onError(CLIRListPreference.this, RESPONSE_ERROR);
- } else {
- if (DBG) Log.d(LOG_TAG, "handleGetCLIRResponse: CLIR successfully queried, clirArray[0]="
- + clirArray[0] + ", clirArray[1]=" + clirArray[1]);
- handleGetCLIRResult(clirArray);
- }
- }
- }
-
- private void handleSetCLIRResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: ar.exception="+ar.exception);
- //setEnabled(false);
- }
- if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: re get");
-
- phone.getOutgoingCallerIdDisplay(obtainMessage(MESSAGE_GET_CLIR,
- MESSAGE_SET_CLIR, MESSAGE_SET_CLIR, ar.exception));
- }
- }
-}
diff --git a/phone/src/com/android/phone2/CallCard.java b/phone/src/com/android/phone2/CallCard.java
deleted file mode 100755
index 47d640c..0000000
--- a/phone/src/com/android/phone2/CallCard.java
+++ /dev/null
@@ -1,1478 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.ContentUris;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.pim.ContactsAsyncHelper;
-import android.provider.ContactsContract.Contacts;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.CallerInfo;
-import com.android.internal.telephony.CallerInfoAsyncQuery;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.Phone;
-
-import java.util.List;
-
-
-/**
- * "Call card" UI element: the in-call screen contains a tiled layout of call
- * cards, each representing the state of a current "call" (ie. an active call,
- * a call on hold, or an incoming call.)
- */
-public class CallCard extends FrameLayout
- implements CallTime.OnTickListener, CallerInfoAsyncQuery.OnQueryCompleteListener,
- ContactsAsyncHelper.OnImageLoadCompleteListener, View.OnClickListener {
- private static final String LOG_TAG = "CallCard";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- /**
- * Reference to the InCallScreen activity that owns us. This may be
- * null if we haven't been initialized yet *or* after the InCallScreen
- * activity has been destroyed.
- */
- private InCallScreen mInCallScreen;
-
- // Phone app instance
- private PhoneApp mApplication;
-
- // Top-level subviews of the CallCard
- private ViewGroup mPrimaryCallInfo;
- private ViewGroup mSecondaryCallInfo;
-
- // Title and elapsed-time widgets
- private TextView mUpperTitle;
- private TextView mElapsedTime;
-
- // Text colors, used for various labels / titles
- private int mTextColorDefaultPrimary;
- private int mTextColorDefaultSecondary;
- private int mTextColorConnected;
- private int mTextColorConnectedBluetooth;
- private int mTextColorEnded;
- private int mTextColorOnHold;
-
- // The main block of info about the "primary" or "active" call,
- // including photo / name / phone number / etc.
- private ImageView mPhoto;
- private Button mManageConferencePhotoButton; // Possibly shown in place of mPhoto
- private TextView mName;
- private TextView mPhoneNumber;
- private TextView mLabel;
- private TextView mSocialStatus;
-
- // Info about the "secondary" call, which is the "call on hold" when
- // two lines are in use.
- private TextView mSecondaryCallName;
- private TextView mSecondaryCallStatus;
- private ImageView mSecondaryCallPhoto;
-
- // Menu button hint
- private TextView mMenuButtonHint;
-
- // Onscreen hint for the incoming call RotarySelector widget.
- private int mRotarySelectorHintTextResId;
- private int mRotarySelectorHintColorResId;
-
- private CallTime mCallTime;
-
- // Track the state for the photo.
- private ContactsAsyncHelper.ImageTracker mPhotoTracker;
-
- // Cached DisplayMetrics density.
- private float mDensity;
-
- public CallCard(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- if (DBG) log("CallCard constructor...");
- if (DBG) log("- this = " + this);
- if (DBG) log("- context " + context + ", attrs " + attrs);
-
- // Inflate the contents of this CallCard, and add it (to ourself) as a child.
- LayoutInflater inflater = LayoutInflater.from(context);
- inflater.inflate(
- R.layout.call_card, // resource
- this, // root
- true);
-
- mApplication = PhoneApp.getInstance();
-
- mCallTime = new CallTime(this);
-
- // create a new object to track the state for the photo.
- mPhotoTracker = new ContactsAsyncHelper.ImageTracker();
-
- mDensity = getResources().getDisplayMetrics().density;
- if (DBG) log("- Density: " + mDensity);
- }
-
- void setInCallScreenInstance(InCallScreen inCallScreen) {
- mInCallScreen = inCallScreen;
- }
-
- public void onTickForCallTimeElapsed(long timeElapsed) {
- // While a call is in progress, update the elapsed time shown
- // onscreen.
- updateElapsedTimeWidget(timeElapsed);
- }
-
- /* package */
- void stopTimer() {
- mCallTime.cancelTimer();
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- if (DBG) log("CallCard onFinishInflate(this = " + this + ")...");
-
- mPrimaryCallInfo = (ViewGroup) findViewById(R.id.primaryCallInfo);
- mSecondaryCallInfo = (ViewGroup) findViewById(R.id.secondaryCallInfo);
-
- // "Upper" and "lower" title widgets
- mUpperTitle = (TextView) findViewById(R.id.upperTitle);
- mElapsedTime = (TextView) findViewById(R.id.elapsedTime);
-
- // Text colors
- mTextColorDefaultPrimary = // corresponds to textAppearanceLarge
- getResources().getColor(android.R.color.primary_text_dark);
- mTextColorDefaultSecondary = // corresponds to textAppearanceSmall
- getResources().getColor(android.R.color.secondary_text_dark);
- mTextColorConnected = getResources().getColor(R.color.incall_textConnected);
- mTextColorConnectedBluetooth =
- getResources().getColor(R.color.incall_textConnectedBluetooth);
- mTextColorEnded = getResources().getColor(R.color.incall_textEnded);
- mTextColorOnHold = getResources().getColor(R.color.incall_textOnHold);
-
- // "Caller info" area, including photo / name / phone numbers / etc
- mPhoto = (ImageView) findViewById(R.id.photo);
- mManageConferencePhotoButton = (Button) findViewById(R.id.manageConferencePhotoButton);
- mManageConferencePhotoButton.setOnClickListener(this);
- mName = (TextView) findViewById(R.id.name);
- mPhoneNumber = (TextView) findViewById(R.id.phoneNumber);
- mLabel = (TextView) findViewById(R.id.label);
- mSocialStatus = (TextView) findViewById(R.id.socialStatus);
-
- // "Other call" info area
- mSecondaryCallName = (TextView) findViewById(R.id.secondaryCallName);
- mSecondaryCallStatus = (TextView) findViewById(R.id.secondaryCallStatus);
- mSecondaryCallPhoto = (ImageView) findViewById(R.id.secondaryCallPhoto);
-
- // Menu Button hint
- mMenuButtonHint = (TextView) findViewById(R.id.menuButtonHint);
- }
-
- /**
- * Updates the state of all UI elements on the CallCard, based on the
- * current state of the phone.
- */
- void updateState(Phone phone) {
- if (DBG) log("updateState(" + phone + ")...");
-
- // Update some internal state based on the current state of the phone.
-
- // TODO: clean up this method to just fully update EVERYTHING in
- // the callcard based on the current phone state: set the overall
- // type of the CallCard, load up the main caller info area, and
- // load up and show or hide the "other call" area if necessary.
-
- Phone.State state = phone.getState(); // IDLE, RINGING, or OFFHOOK
- if (state == Phone.State.RINGING) {
- // A phone call is ringing *or* call waiting
- // (ie. another call may also be active as well.)
- updateRingingCall(phone);
- } else if (state == Phone.State.OFFHOOK) {
- // The phone is off hook. At least one call exists that is
- // dialing, active, or holding, and no calls are ringing or waiting.
- updateForegroundCall(phone);
- } else {
- // The phone state is IDLE!
- //
- // The most common reason for this is if a call just
- // ended: the phone will be idle, but we *will* still
- // have a call in the DISCONNECTED state:
- Call fgCall = phone.getForegroundCall();
- Call bgCall = phone.getBackgroundCall();
- if ((fgCall.getState() == Call.State.DISCONNECTED)
- || (bgCall.getState() == Call.State.DISCONNECTED)) {
- // In this case, we want the main CallCard to display
- // the "Call ended" state. The normal "foreground call"
- // code path handles that.
- updateForegroundCall(phone);
- } else {
- // We don't have any DISCONNECTED calls, which means
- // that the phone is *truly* idle.
- //
- // It's very rare to be on the InCallScreen at all in this
- // state, but it can happen in some cases:
- // - A stray onPhoneStateChanged() event came in to the
- // InCallScreen *after* it was dismissed.
- // - We're allowed to be on the InCallScreen because
- // an MMI or USSD is running, but there's no actual "call"
- // to display.
- // - We're displaying an error dialog to the user
- // (explaining why the call failed), so we need to stay on
- // the InCallScreen so that the dialog will be visible.
- //
- // In these cases, put the callcard into a sane but "blank" state:
- updateNoCall(phone);
- }
- }
- }
-
- /**
- * Updates the UI for the state where the phone is in use, but not ringing.
- */
- private void updateForegroundCall(Phone phone) {
- if (DBG) log("updateForegroundCall()...");
-
- Call fgCall = phone.getForegroundCall();
- Call bgCall = phone.getBackgroundCall();
-
- if (fgCall.isIdle() && !fgCall.hasConnections()) {
- if (DBG) log("updateForegroundCall: no active call, show holding call");
- // TODO: make sure this case agrees with the latest UI spec.
-
- // Display the background call in the main info area of the
- // CallCard, since there is no foreground call. Note that
- // displayMainCallStatus() will notice if the call we passed in is on
- // hold, and display the "on hold" indication.
- fgCall = bgCall;
-
- // And be sure to not display anything in the "on hold" box.
- bgCall = null;
- }
-
- displayMainCallStatus(phone, fgCall);
-
- int phoneType = phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- if ((mApplication.cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE)
- && mApplication.cdmaPhoneCallState.IsThreeWayCallOrigStateDialing()) {
- displayOnHoldCallStatus(phone, fgCall);
- } else {
- //This is required so that even if a background call is not present
- // we need to clean up the background call area.
- displayOnHoldCallStatus(phone, bgCall);
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- displayOnHoldCallStatus(phone, bgCall);
- }
- }
-
- /**
- * Updates the UI for the state where an incoming call is ringing (or
- * call waiting), regardless of whether the phone's already offhook.
- */
- private void updateRingingCall(Phone phone) {
- if (DBG) log("updateRingingCall()...");
-
- Call ringingCall = phone.getRingingCall();
- Call fgCall = phone.getForegroundCall();
- Call bgCall = phone.getBackgroundCall();
-
- // Display caller-id info and photo from the incoming call:
- displayMainCallStatus(phone, ringingCall);
-
- // And even in the Call Waiting case, *don't* show any info about
- // the current ongoing call and/or the current call on hold.
- // (Since the caller-id info for the incoming call totally trumps
- // any info about the current call(s) in progress.)
- displayOnHoldCallStatus(phone, null);
- }
-
- /**
- * Updates the UI for the state where the phone is not in use.
- * This is analogous to updateForegroundCall() and updateRingingCall(),
- * but for the (uncommon) case where the phone is
- * totally idle. (See comments in updateState() above.)
- *
- * This puts the callcard into a sane but "blank" state.
- */
- private void updateNoCall(Phone phone) {
- if (DBG) log("updateNoCall()...");
-
- displayMainCallStatus(phone, null);
- displayOnHoldCallStatus(phone, null);
- }
-
- /**
- * Updates the main block of caller info on the CallCard
- * (ie. the stuff in the primaryCallInfo block) based on the specified Call.
- */
- private void displayMainCallStatus(Phone phone, Call call) {
- if (DBG) log("displayMainCallStatus(phone " + phone
- + ", call " + call + ")...");
-
- if (call == null) {
- // There's no call to display, presumably because the phone is idle.
- mPrimaryCallInfo.setVisibility(View.GONE);
- return;
- }
- mPrimaryCallInfo.setVisibility(View.VISIBLE);
-
- Call.State state = call.getState();
- if (DBG) log(" - call.state: " + call.getState());
-
- switch (state) {
- case ACTIVE:
- case DISCONNECTING:
- // update timer field
- if (DBG) log("displayMainCallStatus: start periodicUpdateTimer");
- mCallTime.setActiveCallMode(call);
- mCallTime.reset();
- mCallTime.periodicUpdateTimer();
-
- break;
-
- case HOLDING:
- // update timer field
- mCallTime.cancelTimer();
-
- break;
-
- case DISCONNECTED:
- // Stop getting timer ticks from this call
- mCallTime.cancelTimer();
-
- break;
-
- case DIALING:
- case ALERTING:
- // Stop getting timer ticks from a previous call
- mCallTime.cancelTimer();
-
- break;
-
- case INCOMING:
- case WAITING:
- // Stop getting timer ticks from a previous call
- mCallTime.cancelTimer();
-
- break;
-
- case IDLE:
- // The "main CallCard" should never be trying to display
- // an idle call! In updateState(), if the phone is idle,
- // we call updateNoCall(), which means that we shouldn't
- // have passed a call into this method at all.
- Log.w(LOG_TAG, "displayMainCallStatus: IDLE call in the main call card!");
-
- // (It is possible, though, that we had a valid call which
- // became idle *after* the check in updateState() but
- // before we get here... So continue the best we can,
- // with whatever (stale) info we can get from the
- // passed-in Call object.)
-
- break;
-
- default:
- Log.w(LOG_TAG, "displayMainCallStatus: unexpected call state: " + state);
- break;
- }
-
- updateCardTitleWidgets(phone, call);
-
- if (PhoneUtils.isConferenceCall(call)) {
- // Update onscreen info for a conference call.
- updateDisplayForConference();
- } else {
- // Update onscreen info for a regular call (which presumably
- // has only one connection.)
- Connection conn = null;
- int phoneType = phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- conn = call.getLatestConnection();
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- conn = call.getEarliestConnection();
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
-
- if (conn == null) {
- if (DBG) log("displayMainCallStatus: connection is null, using default values.");
- // if the connection is null, we run through the behaviour
- // we had in the past, which breaks down into trivial steps
- // with the current implementation of getCallerInfo and
- // updateDisplayForPerson.
- CallerInfo info = PhoneUtils.getCallerInfo(getContext(), null /* conn */);
- updateDisplayForPerson(info, Connection.PRESENTATION_ALLOWED, false, call);
- } else {
- if (DBG) log(" - CONN: " + conn + ", state = " + conn.getState());
- int presentation = conn.getNumberPresentation();
-
- // make sure that we only make a new query when the current
- // callerinfo differs from what we've been requested to display.
- boolean runQuery = true;
- Object o = conn.getUserData();
- if (o instanceof PhoneUtils.CallerInfoToken) {
- runQuery = mPhotoTracker.isDifferentImageRequest(
- ((PhoneUtils.CallerInfoToken) o).currentInfo);
- } else {
- runQuery = mPhotoTracker.isDifferentImageRequest(conn);
- }
-
- // Adding a check to see if the update was caused due to a Phone number update
- // or CNAP update. If so then we need to start a new query
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- Object obj = conn.getUserData();
- String updatedNumber = conn.getAddress();
- String updatedCnapName = conn.getCnapName();
- CallerInfo info = null;
- if (obj instanceof PhoneUtils.CallerInfoToken) {
- info = ((PhoneUtils.CallerInfoToken) o).currentInfo;
- } else if (o instanceof CallerInfo) {
- info = (CallerInfo) o;
- }
-
- if (info != null) {
- if (updatedNumber != null && !updatedNumber.equals(info.phoneNumber)) {
- if (DBG) log("- displayMainCallStatus: updatedNumber = "
- + updatedNumber);
- runQuery = true;
- }
- if (updatedCnapName != null && !updatedCnapName.equals(info.cnapName)) {
- if (DBG) log("- displayMainCallStatus: updatedCnapName = "
- + updatedCnapName);
- runQuery = true;
- }
- }
- }
-
- if (runQuery) {
- if (DBG) log("- displayMainCallStatus: starting CallerInfo query...");
- PhoneUtils.CallerInfoToken info =
- PhoneUtils.startGetCallerInfo(getContext(), conn, this, call);
- updateDisplayForPerson(info.currentInfo, presentation, !info.isFinal, call);
- } else {
- // No need to fire off a new query. We do still need
- // to update the display, though (since we might have
- // previously been in the "conference call" state.)
- if (DBG) log("- displayMainCallStatus: using data we already have...");
- if (o instanceof CallerInfo) {
- CallerInfo ci = (CallerInfo) o;
- // Update CNAP information if Phone state change occurred
- ci.cnapName = conn.getCnapName();
- ci.numberPresentation = conn.getNumberPresentation();
- ci.namePresentation = conn.getCnapNamePresentation();
- if (DBG) log("- displayMainCallStatus: CNAP data from Connection: "
- + "CNAP name=" + ci.cnapName
- + ", Number/Name Presentation=" + ci.numberPresentation);
- if (DBG) log(" ==> Got CallerInfo; updating display: ci = " + ci);
- updateDisplayForPerson(ci, presentation, false, call);
- } else if (o instanceof PhoneUtils.CallerInfoToken){
- CallerInfo ci = ((PhoneUtils.CallerInfoToken) o).currentInfo;
- if (DBG) log("- displayMainCallStatus: CNAP data from Connection: "
- + "CNAP name=" + ci.cnapName
- + ", Number/Name Presentation=" + ci.numberPresentation);
- if (DBG) log(" ==> Got CallerInfoToken; updating display: ci = " + ci);
- updateDisplayForPerson(ci, presentation, true, call);
- } else {
- Log.w(LOG_TAG, "displayMainCallStatus: runQuery was false, "
- + "but we didn't have a cached CallerInfo object! o = " + o);
- // TODO: any easy way to recover here (given that
- // the CallCard is probably displaying stale info
- // right now?) Maybe force the CallCard into the
- // "Unknown" state?
- }
- }
- }
- }
-
- // In some states we override the "photo" ImageView to be an
- // indication of the current state, rather than displaying the
- // regular photo as set above.
- updatePhotoForCallState(call);
-
- // One special feature of the "number" text field: For incoming
- // calls, while the user is dragging the RotarySelector widget, we
- // use mPhoneNumber to display a hint like "Rotate to answer".
- if (mRotarySelectorHintTextResId != 0) {
- // Display the hint!
- mPhoneNumber.setText(mRotarySelectorHintTextResId);
- mPhoneNumber.setTextColor(getResources().getColor(mRotarySelectorHintColorResId));
- mPhoneNumber.setVisibility(View.VISIBLE);
- mLabel.setVisibility(View.GONE);
- }
- // If we don't have a hint to display, just don't touch
- // mPhoneNumber and mLabel. (Their text / color / visibility have
- // already been set correctly, by either updateDisplayForPerson()
- // or updateDisplayForConference().)
- }
-
- /**
- * Implemented for CallerInfoAsyncQuery.OnQueryCompleteListener interface.
- * refreshes the CallCard data when it called.
- */
- public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
- if (DBG) log("onQueryComplete: token " + token + ", cookie " + cookie + ", ci " + ci);
-
- if (cookie instanceof Call) {
- // grab the call object and update the display for an individual call,
- // as well as the successive call to update image via call state.
- // If the object is a textview instead, we update it as we need to.
- if (DBG) log("callerinfo query complete, updating ui from displayMainCallStatus()");
- Call call = (Call) cookie;
- Connection conn = null;
- int phoneType = mApplication.phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- conn = call.getLatestConnection();
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- conn = call.getEarliestConnection();
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- PhoneUtils.CallerInfoToken cit =
- PhoneUtils.startGetCallerInfo(getContext(), conn, this, null);
-
- int presentation = Connection.PRESENTATION_ALLOWED;
- if (conn != null) presentation = conn.getNumberPresentation();
- if (DBG) log("- onQueryComplete: presentation=" + presentation
- + ", contactExists=" + ci.contactExists);
-
- // Depending on whether there was a contact match or not, we want to pass in different
- // CallerInfo (for CNAP). Therefore if ci.contactExists then use the ci passed in.
- // Otherwise, regenerate the CIT from the Connection and use the CallerInfo from there.
- if (ci.contactExists) {
- updateDisplayForPerson(ci, Connection.PRESENTATION_ALLOWED, false, call);
- } else {
- updateDisplayForPerson(cit.currentInfo, presentation, false, call);
- }
- updatePhotoForCallState(call);
-
- } else if (cookie instanceof TextView){
- if (DBG) log("callerinfo query complete, updating ui from ongoing or onhold");
- ((TextView) cookie).setText(PhoneUtils.getCompactNameFromCallerInfo(ci, mContext));
- }
- }
-
- /**
- * Implemented for ContactsAsyncHelper.OnImageLoadCompleteListener interface.
- * make sure that the call state is reflected after the image is loaded.
- */
- public void onImageLoadComplete(int token, Object cookie, ImageView iView,
- boolean imagePresent){
- if (cookie != null) {
- updatePhotoForCallState((Call) cookie);
- }
- }
-
- /**
- * Updates the "card title" (and also elapsed time widget) based on
- * the current state of the call.
- */
- // TODO: it's confusing for updateCardTitleWidgets() and
- // getTitleForCallCard() to be separate methods, since they both
- // just list out the exact same "phone state" cases.
- // Let's merge the getTitleForCallCard() logic into here.
- private void updateCardTitleWidgets(Phone phone, Call call) {
- if (DBG) log("updateCardTitleWidgets(call " + call + ")...");
- Call.State state = call.getState();
-
- // TODO: Still need clearer spec on exactly how title *and* status get
- // set in all states. (Then, given that info, refactor the code
- // here to be more clear about exactly which widgets on the card
- // need to be set.)
-
- String cardTitle;
- int phoneType = mApplication.phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- if (!PhoneApp.getInstance().notifier.getIsCdmaRedialCall()) {
- cardTitle = getTitleForCallCard(call); // Normal "foreground" call card
- } else {
- cardTitle = getContext().getString(R.string.card_title_redialing);
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- cardTitle = getTitleForCallCard(call);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- if (DBG) log("updateCardTitleWidgets: " + cardTitle);
-
- // Update the title and elapsed time widgets based on the current call state.
- switch (state) {
- case ACTIVE:
- case DISCONNECTING:
- final boolean bluetoothActive = mApplication.showBluetoothIndication();
- int ongoingCallIcon = bluetoothActive ? R.drawable.ic_incall_ongoing_bluetooth
- : R.drawable.ic_incall_ongoing;
- int connectedTextColor = bluetoothActive
- ? mTextColorConnectedBluetooth : mTextColorConnected;
-
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // Check if the "Dialing" 3Way call needs to be displayed
- // as the Foreground Call state still remains ACTIVE
- if (mApplication.cdmaPhoneCallState.IsThreeWayCallOrigStateDialing()) {
- // Use the "upper title":
- setUpperTitle(cardTitle, mTextColorDefaultPrimary, state);
- } else {
- // Normal "ongoing call" state; don't use any "title" at all.
- clearUpperTitle();
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- // 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.)
- // TODO: consider displaying the "Hanging up" state for
- // CDMA also if the latency there ever gets high enough.
- if (state == Call.State.DISCONNECTING) {
- // Display the brief "Hanging up" indication.
- setUpperTitle(cardTitle, mTextColorDefaultPrimary, state);
- } else { // state == Call.State.ACTIVE
- // Normal "ongoing call" state; don't use any "title" at all.
- clearUpperTitle();
- }
- }
-
- // Use the elapsed time widget to show the current call duration.
- mElapsedTime.setVisibility(View.VISIBLE);
- mElapsedTime.setTextColor(connectedTextColor);
- long duration = CallTime.getCallDuration(call); // msec
- updateElapsedTimeWidget(duration / 1000);
- // Also see onTickForCallTimeElapsed(), which updates this
- // widget once per second while the call is active.
- break;
-
- case DISCONNECTED:
- // Display "Call ended" (or possibly some error indication;
- // see getCallFailedString()) in the upper title, in red.
-
- // TODO: display a "call ended" icon somewhere, like the old
- // R.drawable.ic_incall_end?
-
- setUpperTitle(cardTitle, mTextColorEnded, state);
-
- // In the "Call ended" state, leave the mElapsedTime widget
- // visible, but don't touch it (so we continue to see the elapsed time of
- // the call that just ended.)
- mElapsedTime.setVisibility(View.VISIBLE);
- mElapsedTime.setTextColor(mTextColorEnded);
- break;
-
- case HOLDING:
- // For a single call on hold, display the title "On hold" in
- // orange.
- // (But since the upper title overlaps the label of the
- // Hold/Unhold button, we actually use the elapsedTime widget
- // to display the title in this case.)
-
- // TODO: display an "On hold" icon somewhere, like the old
- // R.drawable.ic_incall_onhold?
-
- clearUpperTitle();
- mElapsedTime.setText(cardTitle);
-
- // While on hold, the elapsed time widget displays an
- // "on hold" indication rather than an amount of time.
- mElapsedTime.setVisibility(View.VISIBLE);
- mElapsedTime.setTextColor(mTextColorOnHold);
- break;
-
- default:
- // All other states (DIALING, INCOMING, etc.) use the "upper title":
- setUpperTitle(cardTitle, mTextColorDefaultPrimary, state);
-
- // ...and we don't show the elapsed time.
- mElapsedTime.setVisibility(View.INVISIBLE);
- break;
- }
- }
-
- /**
- * Updates mElapsedTime based on the specified number of seconds.
- * A timeElapsed value of zero means to not show an elapsed time at all.
- */
- private void updateElapsedTimeWidget(long timeElapsed) {
- // if (DBG) log("updateElapsedTimeWidget: " + timeElapsed);
- if (timeElapsed == 0) {
- mElapsedTime.setText("");
- } else {
- mElapsedTime.setText(DateUtils.formatElapsedTime(timeElapsed));
- }
- }
-
- /**
- * Returns the "card title" displayed at the top of a foreground
- * ("active") CallCard to indicate the current state of this call, like
- * "Dialing" or "In call" or "On hold". A null return value means that
- * there's no title string for this state.
- */
- private String getTitleForCallCard(Call call) {
- String retVal = null;
- Call.State state = call.getState();
- Context context = getContext();
- int resId;
-
- if (DBG) log("- getTitleForCallCard(Call " + call + ")...");
-
- switch (state) {
- case IDLE:
- break;
-
- case ACTIVE:
- // Title is "Call in progress". (Note this appears in the
- // "lower title" area of the CallCard.)
- int phoneType = mApplication.phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- if (mApplication.cdmaPhoneCallState.IsThreeWayCallOrigStateDialing()) {
- retVal = context.getString(R.string.card_title_dialing);
- } else {
- retVal = context.getString(R.string.card_title_in_progress);
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- retVal = context.getString(R.string.card_title_in_progress);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- break;
-
- case HOLDING:
- retVal = context.getString(R.string.card_title_on_hold);
- // TODO: if this is a conference call on hold,
- // maybe have a special title here too?
- break;
-
- case DIALING:
- case ALERTING:
- retVal = context.getString(R.string.card_title_dialing);
- break;
-
- case INCOMING:
- case WAITING:
- retVal = context.getString(R.string.card_title_incoming_call);
- break;
-
- case DISCONNECTING:
- retVal = context.getString(R.string.card_title_hanging_up);
- break;
-
- case DISCONNECTED:
- retVal = getCallFailedString(call);
- break;
- }
-
- if (DBG) log(" ==> result: " + retVal);
- return retVal;
- }
-
- /**
- * Updates the "on hold" box in the "other call" info area
- * (ie. the stuff in the secondaryCallInfo block)
- * based on the specified Call.
- * Or, clear out the "on hold" box if the specified call
- * is null or idle.
- */
- private void displayOnHoldCallStatus(Phone phone, Call call) {
- if (DBG) log("displayOnHoldCallStatus(call =" + call + ")...");
-
- if ((call == null) || (PhoneApp.getInstance().isOtaCallInActiveState())) {
- mSecondaryCallInfo.setVisibility(View.GONE);
- return;
- }
-
- boolean showSecondaryCallInfo = false;
- Call.State state = call.getState();
- switch (state) {
- case HOLDING:
- // Ok, there actually is a background call on hold.
- // Display the "on hold" box.
-
- // Note this case occurs only on GSM devices. (On CDMA,
- // the "call on hold" is actually the 2nd connection of
- // that ACTIVE call; see the ACTIVE case below.)
-
- if (PhoneUtils.isConferenceCall(call)) {
- if (DBG) log("==> conference call.");
- mSecondaryCallName.setText(getContext().getString(R.string.confCall));
- showImage(mSecondaryCallPhoto, R.drawable.picture_conference);
- } else {
- // perform query and update the name temporarily
- // make sure we hand the textview we want updated to the
- // callback function.
- if (DBG) log("==> NOT a conf call; call startGetCallerInfo...");
- PhoneUtils.CallerInfoToken infoToken = PhoneUtils.startGetCallerInfo(
- getContext(), call, this, mSecondaryCallName);
- mSecondaryCallName.setText(
- PhoneUtils.getCompactNameFromCallerInfo(infoToken.currentInfo,
- getContext()));
-
- // Also pull the photo out of the current CallerInfo.
- // (Note we assume we already have a valid photo at
- // this point, since *presumably* the caller-id query
- // was already run at some point *before* this call
- // got put on hold. If there's no cached photo, just
- // fall back to the default "unknown" image.)
- if (infoToken.isFinal) {
- showCachedImage(mSecondaryCallPhoto, infoToken.currentInfo);
- } else {
- showImage(mSecondaryCallPhoto, R.drawable.picture_unknown);
- }
- }
-
- showSecondaryCallInfo = true;
-
- break;
-
- case ACTIVE:
- // CDMA: This is because in CDMA when the user originates the second call,
- // although the Foreground call state is still ACTIVE in reality the network
- // put the first call on hold.
- if (mApplication.phone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- List<Connection> connections = call.getConnections();
- if (connections.size() > 2) {
- // This means that current Mobile Originated call is the not the first 3-Way
- // call the user is making, which in turn tells the PhoneApp that we no
- // longer know which previous caller/party had dropped out before the user
- // made this call.
- mSecondaryCallName.setText(
- getContext().getString(R.string.card_title_in_call));
- showImage(mSecondaryCallPhoto, R.drawable.picture_unknown);
- } else {
- // This means that the current Mobile Originated call IS the first 3-Way
- // and hence we display the first callers/party's info here.
- Connection conn = call.getEarliestConnection();
- PhoneUtils.CallerInfoToken infoToken = PhoneUtils.startGetCallerInfo(
- getContext(), conn, this, mSecondaryCallName);
-
- // Get the compactName to be displayed, but then check that against
- // the number presentation value for the call. If it's not an allowed
- // presentation, then display the appropriate presentation string instead.
- CallerInfo info = infoToken.currentInfo;
-
- String name = PhoneUtils.getCompactNameFromCallerInfo(info, getContext());
- boolean forceGenericPhoto = false;
- if (info != null && info.numberPresentation !=
- Connection.PRESENTATION_ALLOWED) {
- name = getPresentationString(info.numberPresentation);
- forceGenericPhoto = true;
- }
- mSecondaryCallName.setText(name);
-
- // Also pull the photo out of the current CallerInfo.
- // (Note we assume we already have a valid photo at
- // this point, since *presumably* the caller-id query
- // was already run at some point *before* this call
- // got put on hold. If there's no cached photo, just
- // fall back to the default "unknown" image.)
- if (!forceGenericPhoto && infoToken.isFinal) {
- showCachedImage(mSecondaryCallPhoto, info);
- } else {
- showImage(mSecondaryCallPhoto, R.drawable.picture_unknown);
- }
- }
- showSecondaryCallInfo = true;
-
- } else {
- // We shouldn't ever get here at all for non-CDMA devices.
- Log.w(LOG_TAG, "displayOnHoldCallStatus: ACTIVE state on non-CDMA device");
- showSecondaryCallInfo = false;
- }
- break;
-
- default:
- // There's actually no call on hold. (Presumably this call's
- // state is IDLE, since any other state is meaningless for the
- // background call.)
- showSecondaryCallInfo = false;
- break;
- }
-
- if (showSecondaryCallInfo) {
- // Ok, we have something useful to display in the "secondary
- // call" info area.
- mSecondaryCallInfo.setVisibility(View.VISIBLE);
-
- // Watch out: there are some cases where we need to display the
- // secondary call photo but *not* the two lines of text above it.
- // Specifically, that's any state where the CallCard "upper title" is
- // in use, since the title (e.g. "Dialing" or "Call ended") might
- // collide with the secondaryCallStatus and secondaryCallName widgets.
- //
- // We detect this case by simply seeing whether or not there's any text
- // in mUpperTitle. (This is much simpler than detecting all possible
- // telephony states where the "upper title" is used! But note it does
- // rely on the fact that updateCardTitleWidgets() gets called *earlier*
- // than this method, in the CallCard.updateState() sequence...)
- boolean okToShowLabels = TextUtils.isEmpty(mUpperTitle.getText());
- mSecondaryCallName.setVisibility(okToShowLabels ? View.VISIBLE : View.INVISIBLE);
- mSecondaryCallStatus.setVisibility(okToShowLabels ? View.VISIBLE : View.INVISIBLE);
- } else {
- // Hide the entire "secondary call" info area.
- mSecondaryCallInfo.setVisibility(View.GONE);
- }
- }
-
- private String getCallFailedString(Call call) {
- Connection c = call.getEarliestConnection();
- int resID;
-
- if (c == null) {
- if (DBG) log("getCallFailedString: connection is null, using default values.");
- // if this connection is null, just assume that the
- // default case occurs.
- resID = R.string.card_title_call_ended;
- } else {
-
- Connection.DisconnectCause cause = c.getDisconnectCause();
-
- // TODO: The card *title* should probably be "Call ended" in all
- // cases, but if the DisconnectCause was an error condition we should
- // probably also display the specific failure reason somewhere...
-
- switch (cause) {
- case BUSY:
- resID = R.string.callFailed_userBusy;
- break;
-
- case CONGESTION:
- resID = R.string.callFailed_congestion;
- break;
-
- case LOST_SIGNAL:
- case CDMA_DROP:
- resID = R.string.callFailed_noSignal;
- break;
-
- case LIMIT_EXCEEDED:
- resID = R.string.callFailed_limitExceeded;
- break;
-
- case POWER_OFF:
- resID = R.string.callFailed_powerOff;
- break;
-
- case ICC_ERROR:
- resID = R.string.callFailed_simError;
- break;
-
- case OUT_OF_SERVICE:
- resID = R.string.callFailed_outOfService;
- break;
-
- default:
- resID = R.string.card_title_call_ended;
- break;
- }
- }
- return getContext().getString(resID);
- }
-
- /**
- * Updates the name / photo / number / label fields on the CallCard
- * based on the specified CallerInfo.
- *
- * If the current call is a conference call, use
- * updateDisplayForConference() instead.
- */
- private void updateDisplayForPerson(CallerInfo info,
- int presentation,
- boolean isTemporary,
- Call call) {
- if (DBG) log("updateDisplayForPerson(" + info + ")\npresentation:" +
- presentation + " isTemporary:" + isTemporary);
-
- // inform the state machine that we are displaying a photo.
- mPhotoTracker.setPhotoRequest(info);
- mPhotoTracker.setPhotoState(ContactsAsyncHelper.ImageTracker.DISPLAY_IMAGE);
-
- String name;
- String displayNumber = null;
- String label = null;
- Uri personUri = null;
- String socialStatusText = null;
- Drawable socialStatusBadge = null;
-
- if (info != null) {
- // 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.
-
- if (TextUtils.isEmpty(info.name)) {
- if (TextUtils.isEmpty(info.phoneNumber)) {
- name = getPresentationString(presentation);
- } else if (presentation != Connection.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
- name = getPresentationString(presentation);
- } else if (!TextUtils.isEmpty(info.cnapName)) {
- name = info.cnapName;
- info.name = info.cnapName;
- displayNumber = info.phoneNumber;
- } else {
- name = info.phoneNumber;
- }
- } else {
- if (presentation != Connection.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
- name = getPresentationString(presentation);
- } else {
- name = info.name;
- displayNumber = info.phoneNumber;
- label = info.phoneLabel;
- }
- }
- personUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, info.person_id);
- } else {
- name = getPresentationString(presentation);
- }
-
- if (call.isGeneric()) {
- mName.setText(R.string.card_title_in_call);
- } else {
- mName.setText(name);
- }
- mName.setVisibility(View.VISIBLE);
-
- // Update mPhoto
- // if the temporary flag is set, we know we'll be getting another call after
- // the CallerInfo has been correctly updated. So, we can skip the image
- // loading until then.
-
- // If the photoResource is filled in for the CallerInfo, (like with the
- // Emergency Number case), then we can just set the photo image without
- // requesting for an image load. Please refer to CallerInfoAsyncQuery.java
- // for cases where CallerInfo.photoResource may be set. We can also avoid
- // the image load step if the image data is cached.
- if (isTemporary && (info == null || !info.isCachedPhotoCurrent)) {
- mPhoto.setVisibility(View.INVISIBLE);
- } else if (info != null && info.photoResource != 0){
- showImage(mPhoto, info.photoResource);
- } else if (!showCachedImage(mPhoto, info)) {
- // Load the image with a callback to update the image state.
- // Use the default unknown picture while the query is running.
- ContactsAsyncHelper.updateImageViewWithContactPhotoAsync(
- info, 0, this, call, getContext(), mPhoto, personUri, R.drawable.picture_unknown);
- }
- // And no matter what, on all devices, we never see the "manage
- // conference" button in this state.
- mManageConferencePhotoButton.setVisibility(View.INVISIBLE);
-
- if (displayNumber != null && !call.isGeneric()) {
- mPhoneNumber.setText(displayNumber);
- mPhoneNumber.setTextColor(mTextColorDefaultSecondary);
- mPhoneNumber.setVisibility(View.VISIBLE);
- } else {
- mPhoneNumber.setVisibility(View.GONE);
- }
-
- if (label != null && !call.isGeneric()) {
- mLabel.setText(label);
- mLabel.setVisibility(View.VISIBLE);
- } else {
- mLabel.setVisibility(View.GONE);
- }
-
- // "Social status": currently unused.
- // Note socialStatus is *only* visible while an incoming
- // call is ringing, never in any other call state.
- if ((socialStatusText != null) && call.isRinging() && !call.isGeneric()) {
- mSocialStatus.setVisibility(View.VISIBLE);
- mSocialStatus.setText(socialStatusText);
- mSocialStatus.setCompoundDrawablesWithIntrinsicBounds(
- socialStatusBadge, null, null, null);
- mSocialStatus.setCompoundDrawablePadding((int) (mDensity * 6));
- } else {
- mSocialStatus.setVisibility(View.GONE);
- }
- }
-
- private String getPresentationString(int presentation) {
- String name = getContext().getString(R.string.unknown);
- if (presentation == Connection.PRESENTATION_RESTRICTED) {
- name = getContext().getString(R.string.private_num);
- } else if (presentation == Connection.PRESENTATION_PAYPHONE) {
- name = getContext().getString(R.string.payphone);
- }
- return name;
- }
-
- /**
- * Updates the name / photo / number / label fields
- * for the special "conference call" state.
- *
- * If the current call has only a single connection, use
- * updateDisplayForPerson() instead.
- */
- private void updateDisplayForConference() {
- if (DBG) log("updateDisplayForConference()...");
-
- int phoneType = mApplication.phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // This state corresponds to both 3-Way merged call and
- // Call Waiting accepted call.
- // In this case we display the UI in a "generic" state, with
- // the generic "dialing" icon and no caller information,
- // because in this state in CDMA the user does not really know
- // which caller party he is talking to.
- showImage(mPhoto, R.drawable.picture_dialing);
- mName.setText(R.string.card_title_in_call);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- if (mInCallScreen.isTouchUiEnabled()) {
- // Display the "manage conference" button in place of the photo.
- mManageConferencePhotoButton.setVisibility(View.VISIBLE);
- mPhoto.setVisibility(View.INVISIBLE); // Not GONE, since that would break
- // other views in our RelativeLayout.
- } else {
- // Display the "conference call" image in the photo slot,
- // with no other information.
- showImage(mPhoto, R.drawable.picture_conference);
- }
- mName.setText(R.string.card_title_conf_call);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
-
- mName.setVisibility(View.VISIBLE);
-
- // TODO: For a conference call, the "phone number" slot is specced
- // to contain a summary of who's on the call, like "Bill Foldes
- // and Hazel Nutt" or "Bill Foldes and 2 others".
- // But for now, just hide it:
- mPhoneNumber.setVisibility(View.GONE);
- mLabel.setVisibility(View.GONE);
-
- // socialStatus is never visible in this state.
- mSocialStatus.setVisibility(View.GONE);
-
- // TODO: for a GSM conference call, since we do actually know who
- // you're talking to, consider also showing names / numbers /
- // photos of some of the people on the conference here, so you can
- // see that info without having to click "Manage conference". We
- // probably have enough space to show info for 2 people, at least.
- //
- // To do this, our caller would pass us the activeConnections
- // list, and we'd call PhoneUtils.getCallerInfo() separately for
- // each connection.
- }
-
- /**
- * Updates the CallCard "photo" IFF the specified Call is in a state
- * that needs a special photo (like "busy" or "dialing".)
- *
- * If the current call does not require a special image in the "photo"
- * slot onscreen, don't do anything, since presumably the photo image
- * has already been set (to the photo of the person we're talking, or
- * the generic "picture_unknown" image, or the "conference call"
- * image.)
- */
- private void updatePhotoForCallState(Call call) {
- if (DBG) log("updatePhotoForCallState(" + call + ")...");
- int photoImageResource = 0;
-
- // Check for the (relatively few) telephony states that need a
- // special image in the "photo" slot.
- Call.State state = call.getState();
- switch (state) {
- case DISCONNECTED:
- // Display the special "busy" photo for BUSY or CONGESTION.
- // Otherwise (presumably the normal "call ended" state)
- // leave the photo alone.
- Connection c = call.getEarliestConnection();
- // if the connection is null, we assume the default case,
- // otherwise update the image resource normally.
- if (c != null) {
- Connection.DisconnectCause cause = c.getDisconnectCause();
- if ((cause == Connection.DisconnectCause.BUSY)
- || (cause == Connection.DisconnectCause.CONGESTION)) {
- photoImageResource = R.drawable.picture_busy;
- }
- } else if (DBG) {
- log("updatePhotoForCallState: connection is null, ignoring.");
- }
-
- // TODO: add special images for any other DisconnectCauses?
- break;
-
- case ALERTING:
- case DIALING:
- default:
- // Leave the photo alone in all other states.
- // If this call is an individual call, and the image is currently
- // displaying a state, (rather than a photo), we'll need to update
- // the image.
- // This is for the case where we've been displaying the state and
- // now we need to restore the photo. This can happen because we
- // only query the CallerInfo once, and limit the number of times
- // the image is loaded. (So a state image may overwrite the photo
- // and we would otherwise have no way of displaying the photo when
- // the state goes away.)
-
- // if the photoResource field is filled-in in the Connection's
- // caller info, then we can just use that instead of requesting
- // for a photo load.
-
- // look for the photoResource if it is available.
- CallerInfo ci = null;
- {
- Connection conn = null;
- int phoneType = mApplication.phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- conn = call.getLatestConnection();
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- conn = call.getEarliestConnection();
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
-
- if (conn != null) {
- Object o = conn.getUserData();
- if (o instanceof CallerInfo) {
- ci = (CallerInfo) o;
- } else if (o instanceof PhoneUtils.CallerInfoToken) {
- ci = ((PhoneUtils.CallerInfoToken) o).currentInfo;
- }
- }
- }
-
- if (ci != null) {
- photoImageResource = ci.photoResource;
- }
-
- // If no photoResource found, check to see if this is a conference call. If
- // it is not a conference call:
- // 1. Try to show the cached image
- // 2. If the image is not cached, check to see if a load request has been
- // made already.
- // 3. If the load request has not been made [DISPLAY_DEFAULT], start the
- // request and note that it has started by updating photo state with
- // [DISPLAY_IMAGE].
- // Load requests started in (3) use a placeholder image of -1 to hide the
- // image by default. Please refer to CallerInfoAsyncQuery.java for cases
- // where CallerInfo.photoResource may be set.
- if (photoImageResource == 0) {
- if (!PhoneUtils.isConferenceCall(call)) {
- if (!showCachedImage(mPhoto, ci) && (mPhotoTracker.getPhotoState() ==
- ContactsAsyncHelper.ImageTracker.DISPLAY_DEFAULT)) {
- ContactsAsyncHelper.updateImageViewWithContactPhotoAsync(ci,
- getContext(), mPhoto, mPhotoTracker.getPhotoUri(), -1);
- mPhotoTracker.setPhotoState(
- ContactsAsyncHelper.ImageTracker.DISPLAY_IMAGE);
- }
- }
- } else {
- showImage(mPhoto, photoImageResource);
- mPhotoTracker.setPhotoState(ContactsAsyncHelper.ImageTracker.DISPLAY_IMAGE);
- return;
- }
- break;
- }
-
- if (photoImageResource != 0) {
- if (DBG) log("- overrriding photo image: " + photoImageResource);
- showImage(mPhoto, photoImageResource);
- // Track the image state.
- mPhotoTracker.setPhotoState(ContactsAsyncHelper.ImageTracker.DISPLAY_DEFAULT);
- }
- }
-
- /**
- * Try to display the cached image from the callerinfo object.
- *
- * @return true if we were able to find the image in the cache, false otherwise.
- */
- private static final boolean showCachedImage(ImageView view, CallerInfo ci) {
- if ((ci != null) && ci.isCachedPhotoCurrent) {
- if (ci.cachedPhoto != null) {
- showImage(view, ci.cachedPhoto);
- } else {
- showImage(view, R.drawable.picture_unknown);
- }
- return true;
- }
- return false;
- }
-
- /** Helper function to display the resource in the imageview AND ensure its visibility.*/
- private static final void showImage(ImageView view, int resource) {
- view.setImageResource(resource);
- view.setVisibility(View.VISIBLE);
- }
-
- /** Helper function to display the drawable in the imageview AND ensure its visibility.*/
- private static final void showImage(ImageView view, Drawable drawable) {
- view.setImageDrawable(drawable);
- view.setVisibility(View.VISIBLE);
- }
-
- /**
- * Returns the "Menu button hint" TextView (which is manipulated
- * directly by the InCallScreen.)
- * @see InCallScreen.updateMenuButtonHint()
- */
- /* package */ TextView getMenuButtonHint() {
- return mMenuButtonHint;
- }
-
- /**
- * Sets the left and right margins of the specified ViewGroup (whose
- * LayoutParams object which must inherit from
- * ViewGroup.MarginLayoutParams.)
- *
- * TODO: Is there already a convenience method like this somewhere?
- */
- private void setSideMargins(ViewGroup vg, int margin) {
- ViewGroup.MarginLayoutParams lp =
- (ViewGroup.MarginLayoutParams) vg.getLayoutParams();
- // Equivalent to setting android:layout_marginLeft/Right in XML
- lp.leftMargin = margin;
- lp.rightMargin = margin;
- vg.setLayoutParams(lp);
- }
-
- /**
- * Sets the CallCard "upper title". Also, depending on the passed-in
- * Call state, possibly display an icon along with the title.
- */
- private void setUpperTitle(String title, int color, Call.State state) {
- mUpperTitle.setText(title);
- mUpperTitle.setTextColor(color);
-
- int bluetoothIconId = 0;
- if (!TextUtils.isEmpty(title)
- && ((state == Call.State.INCOMING) || (state == Call.State.WAITING))
- && mApplication.showBluetoothIndication()) {
- // Display the special bluetooth icon also, if this is an incoming
- // call and the audio will be routed to bluetooth.
- bluetoothIconId = R.drawable.ic_incoming_call_bluetooth;
- }
-
- mUpperTitle.setCompoundDrawablesWithIntrinsicBounds(bluetoothIconId, 0, 0, 0);
- if (bluetoothIconId != 0) mUpperTitle.setCompoundDrawablePadding((int) (mDensity * 5));
- }
-
- /**
- * Clears the CallCard "upper title", for states (like a normal
- * ongoing call) where we don't use any "title" at all.
- */
- private void clearUpperTitle() {
- setUpperTitle("", 0, Call.State.IDLE); // Use dummy values for "color" and "state"
- }
-
- /**
- * Hides the top-level UI elements of the call card: The "main
- * call card" element representing the current active or ringing call,
- * and also the info areas for "ongoing" or "on hold" calls in some
- * states.
- *
- * This is intended to be used in special states where the normal
- * in-call UI is totally replaced by some other UI, like OTA mode on a
- * CDMA device.
- *
- * To bring back the regular CallCard UI, just re-run the normal
- * updateState() call sequence.
- */
- public void hideCallCardElements() {
- mPrimaryCallInfo.setVisibility(View.GONE);
- mSecondaryCallInfo.setVisibility(View.GONE);
- }
-
- /*
- * Updates the hint (like "Rotate to answer") that we display while
- * the user is dragging the incoming call RotarySelector widget.
- */
- /* package */ void setRotarySelectorHint(int hintTextResId, int hintColorResId) {
- mRotarySelectorHintTextResId = hintTextResId;
- mRotarySelectorHintColorResId = hintColorResId;
- }
-
- // View.OnClickListener implementation
- public void onClick(View view) {
- int id = view.getId();
- if (DBG) log("onClick(View " + view + ", id " + id + ")...");
-
- switch (id) {
- case R.id.manageConferencePhotoButton:
- // A click on anything here gets forwarded
- // straight to the InCallScreen.
- mInCallScreen.handleOnscreenButtonClick(id);
- break;
-
- default:
- Log.w(LOG_TAG, "onClick: unexpected click: View " + view + ", id " + id);
- break;
- }
- }
-
- // Accessibility event support.
- // Since none of the CallCard elements are focusable, we need to manually
- // fill in the AccessibilityEvent here (so that the name / number / etc will
- // get pronounced by a screen reader, for example.)
- @Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
- dispatchPopulateAccessibilityEvent(event, mUpperTitle);
- dispatchPopulateAccessibilityEvent(event, mPhoto);
- dispatchPopulateAccessibilityEvent(event, mManageConferencePhotoButton);
- dispatchPopulateAccessibilityEvent(event, mName);
- dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
- dispatchPopulateAccessibilityEvent(event, mLabel);
- dispatchPopulateAccessibilityEvent(event, mSocialStatus);
- dispatchPopulateAccessibilityEvent(event, mSecondaryCallName);
- dispatchPopulateAccessibilityEvent(event, mSecondaryCallStatus);
- dispatchPopulateAccessibilityEvent(event, mSecondaryCallPhoto);
- return true;
- }
-
- private void dispatchPopulateAccessibilityEvent(AccessibilityEvent event, View view) {
- 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);
- }
- }
-
-
- // Debugging / testing code
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/CallFeaturesSetting.java b/phone/src/com/android/phone2/CallFeaturesSetting.java
deleted file mode 100644
index 6431bad..0000000
--- a/phone/src/com/android/phone2/CallFeaturesSetting.java
+++ /dev/null
@@ -1,1731 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.database.Cursor;
-import android.media.AudioManager;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.preference.CheckBoxPreference;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.provider.Settings;
-import android.provider.ContactsContract.CommonDataKinds;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.WindowManager;
-import android.widget.ListAdapter;
-
-import com.android.internal.telephony.CallForwardInfo;
-import com.android.internal.telephony.CommandsInterface;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import com.android.internal.telephony.cdma.TtyIntent;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-
-public class CallFeaturesSetting extends PreferenceActivity
- implements DialogInterface.OnClickListener,
- Preference.OnPreferenceChangeListener,
- EditPhoneNumberPreference.OnDialogClosedListener,
- EditPhoneNumberPreference.GetDefaultNumberListener{
-
- // intent action to bring up voice mail settings
- public static final String ACTION_ADD_VOICEMAIL =
- "com.android.phone2.CallFeaturesSetting.ADD_VOICEMAIL";
- // intent action sent by this activity to a voice mail provider
- // to trigger its configuration UI
- public static final String ACTION_CONFIGURE_VOICEMAIL =
- "com.android.phone2.CallFeaturesSetting.CONFIGURE_VOICEMAIL";
- // Extra put in the return from VM provider config containing voicemail number to set
- public static final String VM_NUMBER_EXTRA = "com.android.phone2.VoicemailNumber";
- // Extra put in the return from VM provider config containing call forwarding number to set
- public static final String FWD_NUMBER_EXTRA = "com.android.phone2.ForwardingNumber";
- // Extra put in the return from VM provider config containing call forwarding number to set
- public static final String FWD_NUMBER_TIME_EXTRA = "com.android.phone2.ForwardingNumberTime";
- // If the VM provider returns non null value in this extra we will force the user to
- // choose another VM provider
- public static final String SIGNOUT_EXTRA = "com.android.phone2.Signout";
-
- // Used to tell the saving logic to leave forwarding number as is
- public static final CallForwardInfo[] FWD_SETTINGS_DONT_TOUCH = null;
- // Suffix appended to provider key for storing vm number
- public static final String VM_NUMBER_TAG = "#VMNumber";
- // Suffix appended to provider key for storing forwarding settings
- public static final String FWD_SETTINGS_TAG = "#FWDSettings";
- // Suffix appended to forward settings key for storing length of settings array
- public static final String FWD_SETTINGS_LENGTH_TAG = "#Length";
- // Suffix appended to forward settings key for storing an individual setting
- public static final String FWD_SETTING_TAG = "#Setting";
- // Suffixes appended to forward setting key for storing an individual setting properties
- public static final String FWD_SETTING_STATUS = "#Status";
- public static final String FWD_SETTING_REASON = "#Reason";
- public static final String FWD_SETTING_NUMBER = "#Number";
- public static final String FWD_SETTING_TIME = "#Time";
-
- // Key identifying the default vocie mail provider
- public static final String DEFAULT_VM_PROVIDER_KEY = "";
-
- // Extra put into ACTION_ADD_VOICEMAIL call to indicate which provider
- // to remove from the list of providers presented to the user
- public static final String IGNORE_PROVIDER_EXTRA = "com.android.phone2.ProviderToIgnore";
-
- // debug data
- private static final String LOG_TAG = "CallFeaturesSetting";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- // string constants
- private static final String NUM_PROJECTION[] = {CommonDataKinds.Phone.NUMBER};
-
- // String keys for preference lookup
- private static final String BUTTON_VOICEMAIL_KEY = "button_voicemail_key";
- private static final String BUTTON_VOICEMAIL_PROVIDER_KEY = "button_voicemail_provider_key";
- private static final String BUTTON_VOICEMAIL_SETTING_KEY = "button_voicemail_setting_key";
- private static final String BUTTON_FDN_KEY = "button_fdn_key";
-
- private static final String BUTTON_DTMF_KEY = "button_dtmf_settings";
- private static final String BUTTON_RETRY_KEY = "button_auto_retry_key";
- private static final String BUTTON_TTY_KEY = "button_tty_mode_key";
- private static final String BUTTON_HAC_KEY = "button_hac_key";
-
- private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
- private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
-
- private static final String VM_NUMBERS_SHARED_PREFERENCES_NAME = "vm_numbers";
-
- private Intent mContactListIntent;
-
- /** Event for Async voicemail change call */
- private static final int EVENT_VOICEMAIL_CHANGED = 500;
- private static final int EVENT_FORWARDING_CHANGED = 501;
- private static final int EVENT_FORWARDING_GET_COMPLETED = 502;
-
- // preferred TTY mode
- // Phone.TTY_MODE_xxx
- static final int preferredTtyMode = Phone.TTY_MODE_OFF;
-
- // Dtmf tone types
- static final int DTMF_TONE_TYPE_NORMAL = 0;
- static final int DTMF_TONE_TYPE_LONG = 1;
-
- public static final String HAC_KEY = "HACSetting";
- public static final String HAC_VAL_ON = "ON";
- public static final String HAC_VAL_OFF = "OFF";
-
- /** Handle to voicemail pref */
- private static final int VOICEMAIL_PREF_ID = 1;
- private static final int VOICEMAIL_PROVIDER_CFG_ID = 2;
-
- private Phone mPhone;
-
- private AudioManager mAudioManager;
-
- private static final int VM_NOCHANGE_ERROR = 400;
- private static final int VM_RESPONSE_ERROR = 500;
- private static final int FW_SET_RESPONSE_ERROR = 501;
- private static final int FW_GET_RESPONSE_ERROR = 502;
-
-
- // dialog identifiers for voicemail
- private static final int VOICEMAIL_DIALOG_CONFIRM = 600;
- private static final int VOICEMAIL_FWD_SAVING_DIALOG = 601;
- private static final int VOICEMAIL_FWD_READING_DIALOG = 602;
- private static final int VOICEMAIL_REVERTING_DIALOG = 603;
-
- // status message sent back from handlers
- private static final int MSG_OK = 100;
-
- // special statuses for voicemail controls.
- private static final int MSG_VM_EXCEPTION = 400;
- private static final int MSG_FW_SET_EXCEPTION = 401;
- private static final int MSG_FW_GET_EXCEPTION = 402;
- private static final int MSG_VM_OK = 600;
- private static final int MSG_VM_NOCHANGE = 700;
-
- private EditPhoneNumberPreference mSubMenuVoicemailSettings;
-
- private CheckBoxPreference mButtonAutoRetry;
- private CheckBoxPreference mButtonHAC;
- private ListPreference mButtonDTMF;
- private ListPreference mButtonTTY;
- private ListPreference mVoicemailProviders;
- private PreferenceScreen mVoicemailSettings;
-
- private class VoiceMailProvider {
- public VoiceMailProvider(String name, Intent intent) {
- this.name = name;
- this.intent = intent;
- }
- public String name;
- public Intent intent;
- }
-
- /**
- * Forwarding settings we are going to save.
- */
- static final int [] FORWARDING_SETTINGS_REASONS = new int[] {
- CommandsInterface.CF_REASON_UNCONDITIONAL,
- CommandsInterface.CF_REASON_BUSY,
- CommandsInterface.CF_REASON_NO_REPLY,
- CommandsInterface.CF_REASON_NOT_REACHABLE
- };
-
- private class VoiceMailProviderSettings {
- /**
- * Constructs settings object, setting all conditional forwarding to the specified number
- */
- public VoiceMailProviderSettings(String voicemailNumber, String forwardingNumber,
- int timeSeconds) {
- this.voicemailNumber = voicemailNumber;
- if (forwardingNumber == null || forwardingNumber.length() == 0) {
- this.forwardingSettings = FWD_SETTINGS_DONT_TOUCH;
- } else {
- this.forwardingSettings = new CallForwardInfo[FORWARDING_SETTINGS_REASONS.length];
- for (int i = 0; i < this.forwardingSettings.length; i++) {
- CallForwardInfo fi = new CallForwardInfo();
- this.forwardingSettings[i] = fi;
- fi.reason = FORWARDING_SETTINGS_REASONS[i];
- fi.status = (fi.reason == CommandsInterface.CF_REASON_UNCONDITIONAL) ? 0 : 1;
- fi.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
- fi.toa = PhoneNumberUtils.TOA_International;
- fi.number = forwardingNumber;
- fi.timeSeconds = timeSeconds;
- }
- }
- }
-
- public VoiceMailProviderSettings(String voicemailNumber, CallForwardInfo[] infos) {
- this.voicemailNumber = voicemailNumber;
- this.forwardingSettings = infos;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == null) return false;
- if (!(o instanceof VoiceMailProviderSettings)) return false;
- final VoiceMailProviderSettings v = (VoiceMailProviderSettings)o;
-
- return ((this.voicemailNumber == null &&
- v.voicemailNumber == null) ||
- this.voicemailNumber != null &&
- this.voicemailNumber.equals(v.voicemailNumber))
- &&
- forwardingSettingsEqual(this.forwardingSettings,
- v.forwardingSettings);
- }
-
- private boolean forwardingSettingsEqual(CallForwardInfo[] infos1,
- CallForwardInfo[] infos2) {
- if (infos1 == infos2) return true;
- if (infos1 == null || infos2 == null) return false;
- if (infos1.length != infos2.length) return false;
- for (int i = 0; i < infos1.length; i++) {
- CallForwardInfo i1 = infos1[i];
- CallForwardInfo i2 = infos2[i];
- if (i1.status != i2.status ||
- i1.reason != i2.reason ||
- i1.serviceClass != i2.serviceClass ||
- i1.toa != i2.toa ||
- i1.number != i2.number ||
- i1.timeSeconds != i2.timeSeconds) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public String toString() {
- return voicemailNumber + ((forwardingSettings != null ) ? (", " +
- forwardingSettings.toString()) : "");
- }
-
- public String voicemailNumber;
- public CallForwardInfo[] forwardingSettings;
- }
-
- SharedPreferences mPerProviderSavedVMNumbers;
-
- /**
- * Results of reading forwarding settings
- */
- CallForwardInfo[] mForwardingReadResults = null;
-
- /**
- * Result of forwarding number change.
- * Keys are reasons (eg. unconditional forwarding).
- */
- private Map<Integer, AsyncResult> mForwardingChangeResults = null;
-
- /**
- * Expected CF read result types.
- * This set keeps track of the CF types for which we've issued change
- * commands so we can tell when we've received all of the responses.
- */
- private Collection<Integer> mExpectedChangeResultReasons = null;
-
- /**
- * Result of vm number change
- */
- AsyncResult mVoicemailChangeResult = null;
-
- /**
- * Previous VM provider setting so we can return to it in case of failure.
- */
- String mPreviousVMProviderKey = null;
-
- /**
- * Id of the dialog being currently shown.
- */
- int mCurrentDialogId = 0;
-
- /**
- * Flag indicating that we are invoking settings for the voicemail provider programmatically
- * due to vm provider change.
- */
- boolean mVMProviderSettingsForced = false;
-
- /**
- * Flag indicating that we are making changes to vm or fwd numbers
- * due to vm provider change.
- */
- boolean mChangingVMorFwdDueToProviderChange = false;
-
- /**
- * True if we are in the process of vm & fwd number change and vm has already been changed.
- * This is used to decide what to do in case of rollback.
- */
- boolean mVMChangeCompletedSuccesfully = false;
-
- /**
- * True if we had full or partial failure setting forwarding numbers and so need to roll them
- * back.
- */
- boolean mFwdChangesRequireRollback = false;
-
- /**
- * Id of error msg to display to user once we are done reverting the VM provider to the previous
- * one.
- */
- int mVMOrFwdSetError = 0;
-
- /**
- * Data about discovered voice mail settings providers.
- * Is populated by querying which activities can handle ACTION_CONFIGURE_VOICEMAIL.
- * They key in this map is package name + activity name.
- * We always add an entry for the default provider with a key of empty
- * string and intent value of null.
- * @see #initVoiceMailProviders.
- */
- private final Map<String, VoiceMailProvider> mVMProvidersData =
- new HashMap<String, VoiceMailProvider>();
-
- /** string to hold old voicemail number as it is being updated. */
- private String mOldVmNumber;
-
- // New call forwarding settings and vm number we will be setting
- // Need to save these since before we get to saving we need to asynchronously
- // query the existing forwarding settings.
- private CallForwardInfo[] mNewFwdSettings;
- String mNewVMNumber;
-
- private boolean mForeground;
-
- @Override
- public void onPause() {
- super.onPause();
- mForeground = false;
- }
-
- /**
- * We have to pull current settings from the network for all kinds of
- * voicemail providers so we can tell whether we have to update them,
- * so use this bit to keep track of whether we're reading settings for the
- * default provider and should therefore save them out when done.
- */
- private boolean mReadingSettingsForDefaultProvider = false;
-
- /*
- * Click Listeners, handle click based on objects attached to UI.
- */
-
- // Click listener for all toggle events
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- if (preference == mSubMenuVoicemailSettings) {
- return true;
- } else if (preference == mButtonDTMF) {
- return true;
- } else if (preference == mButtonTTY) {
- return true;
- } else if (preference == mButtonAutoRetry) {
- android.provider.Settings.System.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.System.CALL_AUTO_RETRY,
- mButtonAutoRetry.isChecked() ? 1 : 0);
- return true;
- } else if (preference == mButtonHAC) {
- int hac = mButtonHAC.isChecked() ? 1 : 0;
- // Update HAC value in Settings database
- Settings.System.putInt(mPhone.getContext().getContentResolver(),
- Settings.System.HEARING_AID, hac);
-
- // Update HAC Value in AudioManager
- mAudioManager.setParameter(HAC_KEY, hac != 0 ? HAC_VAL_ON : HAC_VAL_OFF);
- return true;
- } else if (preference == mVoicemailSettings && preference.getIntent() != null) {
- if (DBG) log("Invoking cfg intent " + preference.getIntent().getPackage());
- this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
- return true;
- }
- return false;
- }
-
- /**
- * Implemented to support onPreferenceChangeListener to look for preference
- * changes.
- *
- * @param preference is the preference to be changed
- * @param objValue should be the value of the selection, NOT its localized
- * display value.
- */
- public boolean onPreferenceChange(Preference preference, Object objValue) {
- if (preference == mButtonDTMF) {
- int index = mButtonDTMF.findIndexOfValue((String) objValue);
- Settings.System.putInt(mPhone.getContext().getContentResolver(),
- Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, index);
- } else if (preference == mButtonTTY) {
- handleTTYChange(preference, objValue);
- } else if (preference == mVoicemailProviders) {
- final String currentProviderKey = getCurrentVoicemailProviderKey();
- final String newProviderKey = (String)objValue;
- if (DBG) log("VM provider changes to " + newProviderKey + " from " +
- mPreviousVMProviderKey);
- if (mPreviousVMProviderKey.equals(newProviderKey)) {
- if (DBG) log("No change ");
- return true;
- }
- updateVMPreferenceWidgets(newProviderKey);
-
- mPreviousVMProviderKey = currentProviderKey;
-
- final VoiceMailProviderSettings newProviderSettings =
- loadSettingsForVoiceMailProvider(newProviderKey);
-
- // If the user switches to a voice mail provider and we have a
- // numbers stored for it we will automatically change the
- // phone's
- // voice mail and forwarding number to the stored ones.
- // Otherwise we will bring up provider's configuration UI.
-
- if (newProviderSettings == null) {
- // Force the user into a configuration of the chosen provider
- if (DBG) log("Saved preferences not found - invoking config");
- mVMProviderSettingsForced = true;
- simulatePreferenceClick(mVoicemailSettings);
- } else {
- if (DBG) log("Saved preferences found - switching to them");
- // Set this flag so if we get a failure we revert to previous provider
- mChangingVMorFwdDueToProviderChange = true;
- saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
- }
- }
- // always let the preference setting proceed.
- return true;
- }
-
- // Preference click listener invoked on OnDialogClosed for EditPhoneNumberPreference.
- public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
- if (DBG) log("onPreferenceClick: request preference click on dialog close: " +
- buttonClicked);
- if (buttonClicked == DialogInterface.BUTTON_NEGATIVE) {
- return;
- }
- if (preference instanceof EditPhoneNumberPreference) {
- EditPhoneNumberPreference epn = preference;
-
- if (epn == mSubMenuVoicemailSettings) {
- handleVMBtnClickRequest();
- }
- }
- }
-
- /**
- * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
- * This method set the default values for the various
- * EditPhoneNumberPreference dialogs.
- */
- public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
- if (preference == mSubMenuVoicemailSettings) {
- // update the voicemail number field, which takes care of the
- // mSubMenuVoicemailSettings itself, so we should return null.
- if (DBG) log("updating default for voicemail dialog");
- updateVoiceNumberField();
- return null;
- }
-
- String vmDisplay = mPhone.getVoiceMailNumber();
- if (TextUtils.isEmpty(vmDisplay)) {
- // if there is no voicemail number, we just return null to
- // indicate no contribution.
- return null;
- }
-
- // Return the voicemail number prepended with "VM: "
- if (DBG) log("updating default for call forwarding dialogs");
- return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
- }
-
-
- // override the startsubactivity call to make changes in state consistent.
- @Override
- public void startActivityForResult(Intent intent, int requestCode) {
- if (requestCode == -1) {
- // this is an intent requested from the preference framework.
- super.startActivityForResult(intent, requestCode);
- return;
- }
-
- if (DBG) log("startSubActivity: starting requested subactivity");
- super.startActivityForResult(intent, requestCode);
- }
-
- private void switchToPreviousVoicemailProvider() {
- if (DBG) log("switchToPreviousVoicemailProvider " + mPreviousVMProviderKey);
- if (mPreviousVMProviderKey != null) {
- if (mVMChangeCompletedSuccesfully || mFwdChangesRequireRollback) {
- // we have to revert with carrier
- showDialog(VOICEMAIL_REVERTING_DIALOG);
- VoiceMailProviderSettings prevSettings =
- loadSettingsForVoiceMailProvider(mPreviousVMProviderKey);
- if (mVMChangeCompletedSuccesfully) {
- mNewVMNumber = prevSettings.voicemailNumber;
- if (DBG) log("have to revert VM to " + mNewVMNumber);
- mPhone.setVoiceMailNumber(
- mPhone.getVoiceMailAlphaTag().toString(),
- mNewVMNumber,
- Message.obtain(mRevertOptionComplete, EVENT_VOICEMAIL_CHANGED));
- }
- if (mFwdChangesRequireRollback) {
- if (DBG) log("have to revert fwd");
- final CallForwardInfo[] prevFwdSettings =
- prevSettings.forwardingSettings;
- if (prevFwdSettings != null) {
- Map<Integer, AsyncResult> results =
- mForwardingChangeResults;
- resetForwardingChangeState();
- for (int i = 0; i < prevFwdSettings.length; i++) {
- CallForwardInfo fi = prevFwdSettings[i];
- if (DBG) log("Reverting fwd #: " + i + ": " + fi.toString());
- // Only revert the settings for which the update
- // succeeded
- AsyncResult result = results.get(fi.reason);
- if (result != null && result.exception == null) {
- mExpectedChangeResultReasons.add(fi.reason);
- mPhone.setCallForwardingOption(
- (fi.status == 1 ?
- CommandsInterface.CF_ACTION_REGISTRATION :
- CommandsInterface.CF_ACTION_DISABLE),
- fi.reason,
- fi.number,
- fi.timeSeconds,
- mRevertOptionComplete.obtainMessage(
- EVENT_FORWARDING_CHANGED, i, 0));
- }
- }
- }
- }
- } else {
- if (DBG) log("No need to revert");
- onRevertDone();
- }
- }
- }
-
- void onRevertDone() {
- if (DBG) log("Flipping provider key back to " + mPreviousVMProviderKey);
- mVoicemailProviders.setValue(mPreviousVMProviderKey);
- updateVMPreferenceWidgets(mPreviousVMProviderKey);
- updateVoiceNumberField();
- if (mVMOrFwdSetError != 0) {
- showVMDialog(mVMOrFwdSetError);
- mVMOrFwdSetError = 0;
- }
- }
-
- // asynchronous result call after contacts are selected or after we return from
- // a call to the VM settings provider.
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // there are cases where the contact picker may end up sending us more than one
- // request. We want to ignore the request if we're not in the correct state.
- if (requestCode == VOICEMAIL_PROVIDER_CFG_ID) {
- boolean failure = false;
-
- // No matter how the processing of result goes lets clear the flag
- if (DBG) log("mVMProviderSettingsForced: " + mVMProviderSettingsForced);
- final boolean isVMProviderSettingsForced = mVMProviderSettingsForced;
- mVMProviderSettingsForced = false;
-
- String vmNum = null;
- if (resultCode != RESULT_OK) {
- if (DBG) log("onActivityResult: vm provider cfg result not OK.");
- failure = true;
- } else {
- if (data == null) {
- if (DBG) log("onActivityResult: vm provider cfg result has no data");
- failure = true;
- } else {
- if (data.getBooleanExtra(SIGNOUT_EXTRA, false)) {
- if (DBG) log("Provider requested signout");
- if (isVMProviderSettingsForced) {
- if (DBG) log("Going back to previous provider on signout");
- switchToPreviousVoicemailProvider();
- } else {
- final String victim = getCurrentVoicemailProviderKey();
- if (DBG) log("Relaunching activity and ignoring " + victim);
- Intent i = new Intent(ACTION_ADD_VOICEMAIL);
- i.putExtra(IGNORE_PROVIDER_EXTRA, victim);
- i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- this.startActivity(i);
- }
- return;
- }
- vmNum = data.getStringExtra(VM_NUMBER_EXTRA);
- if (vmNum == null || vmNum.length() == 0) {
- if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
- failure = true;
- }
- }
- }
- if (failure) {
- if (DBG) log("Failure in return from voicemail provider");
- if (isVMProviderSettingsForced) {
- switchToPreviousVoicemailProvider();
- } else {
- if (DBG) log("Not switching back the provider since this is not forced config");
- }
- return;
- }
- mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
- final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
-
- // TODO(iliat): It would be nice to load the current network setting for this and
- // send it to the provider when it's config is invoked so it can use this as default
- final int fwdNumTime = data.getIntExtra(FWD_NUMBER_TIME_EXTRA, 20);
-
- if (DBG) log("onActivityResult: vm provider cfg result " +
- (fwdNum != null ? "has" : " does not have") + " forwarding number");
- saveVoiceMailAndForwardingNumber(getCurrentVoicemailProviderKey(),
- new VoiceMailProviderSettings(vmNum, fwdNum, fwdNumTime));
- return;
- }
-
- if (resultCode != RESULT_OK) {
- if (DBG) log("onActivityResult: contact picker result not OK.");
- return;
- }
-
- Cursor cursor = getContentResolver().query(data.getData(),
- NUM_PROJECTION, null, null, null);
- if ((cursor == null) || (!cursor.moveToFirst())) {
- if (DBG) log("onActivityResult: bad contact data, no results found.");
- return;
- }
-
- switch (requestCode) {
- case VOICEMAIL_PREF_ID:
- mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
- break;
- default:
- // TODO: may need exception here.
- }
- }
-
- // Voicemail button logic
- private void handleVMBtnClickRequest() {
- // normally called on the dialog close.
-
- // Since we're stripping the formatting out on the getPhoneNumber()
- // call now, we won't need to do so here anymore.
-
- saveVoiceMailAndForwardingNumber(
- getCurrentVoicemailProviderKey(),
- new VoiceMailProviderSettings(mSubMenuVoicemailSettings.getPhoneNumber(),
- FWD_SETTINGS_DONT_TOUCH));
- }
-
- private void showDialogIfForeground(int id) {
- if (mForeground) {
- showDialog(id);
- }
- }
-
- private void dismissDialogSafely(int id) {
- try {
- dismissDialog(id);
- } catch (IllegalArgumentException e) {
- // This is expected in the case where we were in the background
- // at the time we would normally have shown the dialog, so we didn't
- // show it.
- }
- }
-
- private void saveVoiceMailAndForwardingNumber(String key,
- VoiceMailProviderSettings newSettings) {
- if (DBG) log("saveVoiceMailAndForwardingNumber: " + newSettings.toString());
- mNewVMNumber = newSettings.voicemailNumber;
- // empty vm number == clearing the vm number ?
- if (mNewVMNumber == null) {
- mNewVMNumber = "";
- }
-
- mNewFwdSettings = newSettings.forwardingSettings;
- if (DBG) log("newFwdNumber " +
- String.valueOf((mNewFwdSettings != null ? mNewFwdSettings.length : 0))
- + " settings");
-
- // No fwd settings on CDMA
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- if (DBG) log("ignoring forwarding setting since this is CDMA phone");
- mNewFwdSettings = FWD_SETTINGS_DONT_TOUCH;
- }
-
- //throw a warning if the vm is the same and we do not touch forwarding.
- if (mNewVMNumber.equals(mOldVmNumber) && mNewFwdSettings == FWD_SETTINGS_DONT_TOUCH) {
- showVMDialog(MSG_VM_NOCHANGE);
- return;
- }
-
- maybeSaveSettingsForVoicemailProvider(key, newSettings);
- mVMChangeCompletedSuccesfully = false;
- mFwdChangesRequireRollback = false;
- mVMOrFwdSetError = 0;
- if (!key.equals(mPreviousVMProviderKey)) {
- mReadingSettingsForDefaultProvider =
- mPreviousVMProviderKey.equals(DEFAULT_VM_PROVIDER_KEY);
- if (DBG) log("Reading current forwarding settings");
- mForwardingReadResults = new CallForwardInfo[FORWARDING_SETTINGS_REASONS.length];
- for (int i = 0; i < FORWARDING_SETTINGS_REASONS.length; i++) {
- mForwardingReadResults[i] = null;
- mPhone.getCallForwardingOption(FORWARDING_SETTINGS_REASONS[i],
- mGetOptionComplete.obtainMessage(EVENT_FORWARDING_GET_COMPLETED, i, 0));
- }
- showDialogIfForeground(VOICEMAIL_FWD_READING_DIALOG);
- } else {
- saveVoiceMailAndForwardingNumberStage2();
- }
- }
-
- private final Handler mGetOptionComplete = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- AsyncResult result = (AsyncResult) msg.obj;
- switch (msg.what) {
- case EVENT_FORWARDING_GET_COMPLETED:
- handleForwardingSettingsReadResult(result, msg.arg1);
- break;
- }
- }
- };
-
- void handleForwardingSettingsReadResult(AsyncResult ar, int idx) {
- if (DBG) Log.d(LOG_TAG, "handleForwardingSettingsReadResult: " + idx);
- Throwable error = null;
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "FwdRead: ar.exception=" +
- ar.exception.getMessage());
- error = ar.exception;
- }
- if (ar.userObj instanceof Throwable) {
- if (DBG) Log.d(LOG_TAG, "FwdRead: userObj=" +
- ((Throwable)ar.userObj).getMessage());
- error = (Throwable)ar.userObj;
- }
-
- // We may have already gotten an error and decided to ignore the other results.
- if (mForwardingReadResults == null) {
- if (DBG) Log.d(LOG_TAG, "ignoring fwd reading result: " + idx);
- return;
- }
-
- // In case of error ignore other results, show an error dialog
- if (error != null) {
- if (DBG) Log.d(LOG_TAG, "Error discovered for fwd read : " + idx);
- mForwardingReadResults = null;
- dismissDialogSafely(VOICEMAIL_FWD_READING_DIALOG);
- showVMDialog(MSG_FW_GET_EXCEPTION);
- return;
- }
-
- // Get the forwarding info
- final CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
- CallForwardInfo fi = null;
- for (int i = 0 ; i < cfInfoArray.length; i++) {
- if ((cfInfoArray[i].serviceClass & CommandsInterface.SERVICE_CLASS_VOICE) != 0) {
- fi = cfInfoArray[i];
- break;
- }
- }
- if (fi == null) {
-
- // In case we go nothing it means we need this reason disabled
- // so create a CallForwardInfo for capturing this
- if (DBG) Log.d(LOG_TAG, "Creating default info for " + idx);
- fi = new CallForwardInfo();
- fi.status = 0;
- fi.reason = FORWARDING_SETTINGS_REASONS[idx];
- fi.serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
- } else {
- // if there is not a forwarding number, ensure the entry is set to "not active."
- if (fi.number == null || fi.number.length() == 0) {
- fi.status = 0;
- }
-
- if (DBG) Log.d(LOG_TAG, "Got " + fi.toString() + " for " + idx);
- }
- mForwardingReadResults[idx] = fi;
-
- // Check if we got all the results already
- boolean done = true;
- for (int i = 0; i < mForwardingReadResults.length; i++) {
- if (mForwardingReadResults[i] == null) {
- done = false;
- break;
- }
- }
- if (done) {
- if (DBG) Log.d(LOG_TAG, "Done receiving fwd info");
- dismissDialogSafely(VOICEMAIL_FWD_READING_DIALOG);
- if (mReadingSettingsForDefaultProvider) {
- maybeSaveSettingsForVoicemailProvider(DEFAULT_VM_PROVIDER_KEY,
- new VoiceMailProviderSettings(this.mOldVmNumber,
- mForwardingReadResults));
- mReadingSettingsForDefaultProvider = false;
- }
- saveVoiceMailAndForwardingNumberStage2();
- } else {
- if (DBG) Log.d(LOG_TAG, "Not done receiving fwd info");
- }
- }
-
- private CallForwardInfo infoForReason(CallForwardInfo[] infos, int reason) {
- CallForwardInfo result = null;
- if (null != infos) {
- for (CallForwardInfo info : infos) {
- if (info.reason == reason) {
- result = info;
- break;
- }
- }
- }
- return result;
- }
-
- private boolean isUpdateRequired(CallForwardInfo oldInfo,
- CallForwardInfo newInfo) {
- boolean result = true;
- if (0 == newInfo.status) {
- // If we're disabling a type of forwarding, and it's already
- // disabled for the account, don't make any change
- if (oldInfo != null && oldInfo.status == 0) {
- result = false;
- }
- }
- return result;
- }
-
- private void resetForwardingChangeState() {
- mForwardingChangeResults = new HashMap<Integer, AsyncResult>();
- mExpectedChangeResultReasons = new HashSet<Integer>();
- }
-
- // Called after we are done saving the previous forwarding settings if
- // we needed.
- private void saveVoiceMailAndForwardingNumberStage2() {
- mForwardingChangeResults = null;
- mVoicemailChangeResult = null;
- if (mNewFwdSettings != FWD_SETTINGS_DONT_TOUCH) {
- resetForwardingChangeState();
- for (int i = 0; i < mNewFwdSettings.length; i++) {
- CallForwardInfo fi = mNewFwdSettings[i];
-
- final boolean doUpdate = isUpdateRequired(infoForReason(
- mForwardingReadResults, fi.reason), fi);
-
- if (doUpdate) {
- if (DBG) log("Setting fwd #: " + i + ": " + fi.toString());
- mExpectedChangeResultReasons.add(i);
-
- mPhone.setCallForwardingOption(
- fi.status == 1 ?
- CommandsInterface.CF_ACTION_REGISTRATION :
- CommandsInterface.CF_ACTION_DISABLE,
- fi.reason,
- fi.number,
- fi.timeSeconds,
- mSetOptionComplete.obtainMessage(
- EVENT_FORWARDING_CHANGED, fi.reason, 0));
- }
- }
- showDialogIfForeground(VOICEMAIL_FWD_SAVING_DIALOG);
- } else {
- if (DBG) log("Not touching fwd #");
- setVMNumberWithCarrier();
- }
- }
-
- void setVMNumberWithCarrier() {
- if (DBG) log("save voicemail #: " + mNewVMNumber);
- mPhone.setVoiceMailNumber(
- mPhone.getVoiceMailAlphaTag().toString(),
- mNewVMNumber,
- Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
- }
-
- /**
- * Callback to handle option update completions
- */
- private final Handler mSetOptionComplete = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- AsyncResult result = (AsyncResult) msg.obj;
- boolean done = false;
- switch (msg.what) {
- case EVENT_VOICEMAIL_CHANGED:
- mVoicemailChangeResult = result;
- mVMChangeCompletedSuccesfully = checkVMChangeSuccess() == null;
- if (DBG) log("VM change complete msg, VM change done = " +
- String.valueOf(mVMChangeCompletedSuccesfully));
- done = true;
- break;
- case EVENT_FORWARDING_CHANGED:
- mForwardingChangeResults.put(msg.arg1, result);
- if (result.exception != null) {
- if (DBG) log("Error in setting fwd# " + msg.arg1 + ": " +
- result.exception.getMessage());
- } else {
- if (DBG) log("Success in setting fwd# " + msg.arg1);
- }
- final boolean completed = checkForwardingCompleted();
- if (completed) {
- if (checkFwdChangeSuccess() == null) {
- if (DBG) log("Overall fwd changes completed ok, starting vm change");
- setVMNumberWithCarrier();
- } else {
- if (DBG) log("Overall fwd changes completed, failure");
- mFwdChangesRequireRollback = false;
- Iterator<Map.Entry<Integer,AsyncResult>> it =
- mForwardingChangeResults.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry<Integer,AsyncResult> entry = it.next();
- if (entry.getValue().exception == null) {
- // If at least one succeeded we have to revert
- if (DBG) log("Rollback will be required");
- mFwdChangesRequireRollback =true;
- break;
- }
- }
- done = true;
- }
- }
- break;
- default:
- // TODO: should never reach this, may want to throw exception
- }
- if (done) {
- if (DBG) log("All VM provider related changes done");
- if (mForwardingChangeResults != null) {
- dismissDialogSafely(VOICEMAIL_FWD_SAVING_DIALOG);
- }
- handleSetVMOrFwdMessage();
- }
- }
- };
-
- /**
- * Callback to handle option revert completions
- */
- private final Handler mRevertOptionComplete = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- AsyncResult result = (AsyncResult) msg.obj;
- switch (msg.what) {
- case EVENT_VOICEMAIL_CHANGED:
- mVoicemailChangeResult = result;
- if (DBG) log("VM revert complete msg");
- break;
- case EVENT_FORWARDING_CHANGED:
- mForwardingChangeResults.put(msg.arg1, result);
- if (result.exception != null) {
- if (DBG) log("Error in reverting fwd# " + msg.arg1 + ": " +
- result.exception.getMessage());
- } else {
- if (DBG) log("Success in reverting fwd# " + msg.arg1);
- }
- if (DBG) log("FWD revert complete msg ");
- break;
- default:
- // TODO: should never reach this, may want to throw exception
- }
- final boolean done =
- (!mVMChangeCompletedSuccesfully || mVoicemailChangeResult != null) &&
- (!mFwdChangesRequireRollback || checkForwardingCompleted());
- if (done) {
- if (DBG) log("All VM reverts done");
- dismissDialogSafely(VOICEMAIL_REVERTING_DIALOG);
- onRevertDone();
- }
- }
- };
-
- /**
- * @return true if forwarding change has completed
- */
- private boolean checkForwardingCompleted() {
- boolean result;
- if (mForwardingChangeResults == null) {
- result = true;
- } else {
- // return true iff there is a change result for every reason for
- // which we expected a result
- result = true;
- for (Integer reason : mExpectedChangeResultReasons) {
- if (mForwardingChangeResults.get(reason) == null) {
- result = false;
- break;
- }
- }
- }
- return result;
- }
- /**
- * @return error string or null if successful
- */
- private String checkFwdChangeSuccess() {
- String result = null;
- Iterator<Map.Entry<Integer,AsyncResult>> it =
- mForwardingChangeResults.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry<Integer,AsyncResult> entry = it.next();
- Throwable exception = entry.getValue().exception;
- if (exception != null) {
- result = exception.getMessage();
- if (result == null) {
- result = "";
- }
- break;
- }
- }
- return result;
- }
-
- /**
- * @return error string or null if successful
- */
- private String checkVMChangeSuccess() {
- if (mVoicemailChangeResult.exception != null) {
- final String msg = mVoicemailChangeResult.exception.getMessage();
- if (msg == null) {
- return "";
- }
- return msg;
- }
- return null;
- }
-
- private void handleSetVMOrFwdMessage() {
- if (DBG) {
- log("handleSetVMMessage: set VM request complete");
- }
- boolean success = true;
- boolean fwdFailure = false;
- String exceptionMessage = "";
- if (mForwardingChangeResults != null) {
- exceptionMessage = checkFwdChangeSuccess();
- if (exceptionMessage != null) {
- success = false;
- fwdFailure = true;
- }
- }
- if (success) {
- exceptionMessage = checkVMChangeSuccess();
- if (exceptionMessage != null) {
- success = false;
- }
- }
- if (success) {
- if (DBG) log("change VM success!");
- handleVMAndFwdSetSuccess(MSG_VM_OK);
- updateVoiceNumberField();
- } else {
- if (fwdFailure) {
- log("change FW failed: " + exceptionMessage);
- handleVMOrFwdSetError(MSG_FW_SET_EXCEPTION);
- } else {
- log("change VM failed: " + exceptionMessage);
- handleVMOrFwdSetError(MSG_VM_EXCEPTION);
- }
- }
- }
-
- private void handleVMOrFwdSetError(int msgId) {
- if (mChangingVMorFwdDueToProviderChange) {
- mVMOrFwdSetError = msgId;
- mChangingVMorFwdDueToProviderChange = false;
- switchToPreviousVoicemailProvider();
- return;
- }
- mChangingVMorFwdDueToProviderChange = false;
- showVMDialog(msgId);
- updateVoiceNumberField();
- }
-
- private void handleVMAndFwdSetSuccess(int msgId) {
- mChangingVMorFwdDueToProviderChange = false;
- showVMDialog(msgId);
- }
-
- /*
- * Methods used to sync UI state with that of the network
- */
- // update the voicemail number from what we've recorded on the sim.
- private void updateVoiceNumberField() {
- if (mSubMenuVoicemailSettings == null) {
- return;
- }
-
- mOldVmNumber = mPhone.getVoiceMailNumber();
- if (mOldVmNumber == null) {
- mOldVmNumber = "";
- }
- mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
- final String summary = (mOldVmNumber.length() > 0) ? mOldVmNumber :
- getString(R.string.voicemail_number_not_set);
- mSubMenuVoicemailSettings.setSummary(summary);
- }
-
- /*
- * Helper Methods for Activity class.
- * The initial query commands are split into two pieces now
- * for individual expansion. This combined with the ability
- * to cancel queries allows for a much better user experience,
- * and also ensures that the user only waits to update the
- * data that is relevant.
- */
-
- @Override
- protected void onPrepareDialog(int id, Dialog dialog) {
- super.onPrepareDialog(id, dialog);
- mCurrentDialogId = id;
- }
-
- // dialog creation method, called by showDialog()
- @Override
- protected Dialog onCreateDialog(int id) {
- if ((id == VM_RESPONSE_ERROR) || (id == VM_NOCHANGE_ERROR) ||
- (id == FW_SET_RESPONSE_ERROR) || (id == FW_GET_RESPONSE_ERROR) ||
- (id == VOICEMAIL_DIALOG_CONFIRM)) {
-
- AlertDialog.Builder b = new AlertDialog.Builder(this);
-
- int msgId;
- int titleId = R.string.error_updating_title;
- switch (id) {
- case VOICEMAIL_DIALOG_CONFIRM:
- msgId = R.string.vm_changed;
- titleId = R.string.voicemail;
- // Set Button 2
- b.setNegativeButton(R.string.close_dialog, this);
- break;
- case VM_NOCHANGE_ERROR:
- // even though this is technically an error,
- // keep the title friendly.
- msgId = R.string.no_change;
- titleId = R.string.voicemail;
- // Set Button 2
- b.setNegativeButton(R.string.close_dialog, this);
- break;
- case VM_RESPONSE_ERROR:
- msgId = R.string.vm_change_failed;
- // Set Button 1
- b.setPositiveButton(R.string.close_dialog, this);
- break;
- case FW_SET_RESPONSE_ERROR:
- msgId = R.string.fw_change_failed;
- // Set Button 1
- b.setPositiveButton(R.string.close_dialog, this);
- break;
- case FW_GET_RESPONSE_ERROR:
- msgId = R.string.fw_get_in_vm_failed;
- b.setPositiveButton(R.string.alert_dialog_yes, this);
- b.setNegativeButton(R.string.alert_dialog_no, this);
- break;
- default:
- msgId = R.string.exception_error;
- // Set Button 3, tells the activity that the error is
- // not recoverable on dialog exit.
- b.setNeutralButton(R.string.close_dialog, this);
- break;
- }
-
- b.setTitle(getText(titleId));
- String message = getText(msgId).toString();
- b.setMessage(message);
- b.setCancelable(false);
- AlertDialog dialog = b.create();
-
- // make the dialog more obvious by bluring the background.
- dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
-
- return dialog;
- } else if (id == VOICEMAIL_FWD_SAVING_DIALOG || id == VOICEMAIL_FWD_READING_DIALOG ||
- id == VOICEMAIL_REVERTING_DIALOG) {
- ProgressDialog dialog = new ProgressDialog(this);
- dialog.setTitle(getText(R.string.updating_title));
- dialog.setIndeterminate(true);
- dialog.setCancelable(false);
- dialog.setMessage(getText(
- id == VOICEMAIL_FWD_SAVING_DIALOG ? R.string.updating_settings :
- (id == VOICEMAIL_REVERTING_DIALOG ? R.string.reverting_settings :
- R.string.reading_settings)));
- return dialog;
- }
-
-
- return null;
- }
-
- // This is a method implemented for DialogInterface.OnClickListener.
- // Used with the error dialog to close the app, voicemail dialog to just dismiss.
- // Close button is mapped to BUTTON_POSITIVE for the errors that close the activity,
- // while those that are mapped to BUTTON_NEUTRAL only move the preference focus.
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- switch (which){
- case DialogInterface.BUTTON_NEUTRAL:
- if (DBG) log("Neutral button");
- break;
- case DialogInterface.BUTTON_NEGATIVE:
- if (DBG) log("Negative button");
- if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
- // We failed to get current forwarding settings and the user
- // does not wish to continue.
- switchToPreviousVoicemailProvider();
- }
- break;
- case DialogInterface.BUTTON_POSITIVE:
- if (DBG) log("Positive button");
- if (mCurrentDialogId == FW_GET_RESPONSE_ERROR) {
- // We failed to get current forwarding settings but the user
- // wishes to continue changing settings to the new vm provider
- saveVoiceMailAndForwardingNumberStage2();
- } else {
- finish();
- }
- return;
- default:
- // just let the dialog close and go back to the input
- }
- // In all dialogs, all buttons except BUTTON_POSITIVE lead to the end of user interaction
- // with settings UI. If we were called to explicitly configure voice mail then
- // we finish the settings activity here to come back to whatever the user was doing.
- if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
- finish();
- }
- }
-
- // set the app state with optional status.
- private void showVMDialog(int msgStatus) {
- switch (msgStatus) {
- // It's a bit worrisome to punt in the error cases here when we're
- // not in the foreground; maybe toast instead?
- case MSG_VM_EXCEPTION:
- showDialogIfForeground(VM_RESPONSE_ERROR);
- break;
- case MSG_FW_SET_EXCEPTION:
- showDialogIfForeground(FW_SET_RESPONSE_ERROR);
- break;
- case MSG_FW_GET_EXCEPTION:
- showDialogIfForeground(FW_GET_RESPONSE_ERROR);
- break;
- case MSG_VM_NOCHANGE:
- showDialogIfForeground(VM_NOCHANGE_ERROR);
- break;
- case MSG_VM_OK:
- showDialogIfForeground(VOICEMAIL_DIALOG_CONFIRM);
- break;
- case MSG_OK:
- default:
- // This should never happen.
- }
- }
-
- /*
- * Activity class methods
- */
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- if (DBG) log("Creating activity");
- mPhone = SipPhoneFactory.getDefaultPhone();
-
- addPreferencesFromResource(R.xml.call_feature_setting);
-
- mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
-
- // get buttons
- PreferenceScreen prefSet = getPreferenceScreen();
- mSubMenuVoicemailSettings = (EditPhoneNumberPreference)findPreference(BUTTON_VOICEMAIL_KEY);
- if (mSubMenuVoicemailSettings != null) {
- mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
- mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
- mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
- }
-
- mButtonDTMF = (ListPreference) findPreference(BUTTON_DTMF_KEY);
- mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
- mButtonHAC = (CheckBoxPreference) findPreference(BUTTON_HAC_KEY);
- mButtonTTY = (ListPreference) findPreference(BUTTON_TTY_KEY);
- mVoicemailProviders = (ListPreference) findPreference(BUTTON_VOICEMAIL_PROVIDER_KEY);
- if (mVoicemailProviders != null) {
- mVoicemailProviders.setOnPreferenceChangeListener(this);
- mVoicemailSettings = (PreferenceScreen)findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
-
- initVoiceMailProviders();
- }
-
- if (mButtonDTMF != null) {
- if (getResources().getBoolean(R.bool.dtmf_type_enabled)) {
- mButtonDTMF.setOnPreferenceChangeListener(this);
- } else {
- prefSet.removePreference(mButtonDTMF);
- mButtonDTMF = null;
- }
- }
-
- if (mButtonAutoRetry != null) {
- if (getResources().getBoolean(R.bool.auto_retry_enabled)) {
- mButtonAutoRetry.setOnPreferenceChangeListener(this);
- } else {
- prefSet.removePreference(mButtonAutoRetry);
- mButtonAutoRetry = null;
- }
- }
-
- if (mButtonHAC != null) {
- if (getResources().getBoolean(R.bool.hac_enabled)) {
-
- mButtonHAC.setOnPreferenceChangeListener(this);
- } else {
- prefSet.removePreference(mButtonHAC);
- mButtonHAC = null;
- }
- }
-
- if (mButtonTTY != null) {
- if (getResources().getBoolean(R.bool.tty_enabled)) {
- mButtonTTY.setOnPreferenceChangeListener(this);
- } else {
- prefSet.removePreference(mButtonTTY);
- mButtonTTY = null;
- }
- }
-
- if (!getResources().getBoolean(R.bool.world_phone)) {
- Preference options = prefSet.findPreference(BUTTON_CDMA_OPTIONS);
- if (options != null)
- prefSet.removePreference(options);
- options = prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS);
- if (options != null)
- prefSet.removePreference(options);
-
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- Preference fdnButton = prefSet.findPreference(BUTTON_FDN_KEY);
- if (fdnButton != null)
- prefSet.removePreference(fdnButton);
- addPreferencesFromResource(R.xml.cdma_call_options);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- addPreferencesFromResource(R.xml.gsm_umts_call_options);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
-
- // create intent to bring up contact list
- mContactListIntent = new Intent(Intent.ACTION_GET_CONTENT);
- mContactListIntent.setType(android.provider.Contacts.Phones.CONTENT_ITEM_TYPE);
-
- // check the intent that started this activity and pop up the voicemail
- // dialog if we've been asked to.
- // If we have at least one non default VM provider registered then bring up
- // the selection for the VM provider, otherwise bring up a VM number dialog.
- // We only bring up the dialog the first time we are called (not after orientation change)
- if (icicle == null) {
- if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL) &&
- mVoicemailProviders != null) {
- if (mVMProvidersData.size() > 1) {
- simulatePreferenceClick(mVoicemailProviders);
- } else {
- onPreferenceChange(mVoicemailProviders, DEFAULT_VM_PROVIDER_KEY);
- mVoicemailProviders.setValue(DEFAULT_VM_PROVIDER_KEY);
- }
- }
- }
- updateVoiceNumberField();
- mVMProviderSettingsForced = false;
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mForeground = true;
-
- if (mButtonDTMF != null) {
- int dtmf = Settings.System.getInt(getContentResolver(),
- Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_NORMAL);
- mButtonDTMF.setValueIndex(dtmf);
- }
-
- if (mButtonAutoRetry != null) {
- int autoretry = Settings.System.getInt(getContentResolver(),
- Settings.System.CALL_AUTO_RETRY, 0);
- mButtonAutoRetry.setChecked(autoretry != 0);
- }
-
- if (mButtonHAC != null) {
- int hac = Settings.System.getInt(getContentResolver(), Settings.System.HEARING_AID, 0);
- mButtonHAC.setChecked(hac != 0);
- }
-
- if (mButtonTTY != null) {
- int settingsTtyMode = Settings.Secure.getInt(getContentResolver(),
- Settings.Secure.PREFERRED_TTY_MODE,
- Phone.TTY_MODE_OFF);
- mButtonTTY.setValue(Integer.toString(settingsTtyMode));
- updatePreferredTtyModeSummary(settingsTtyMode);
- }
- }
-
- private void handleTTYChange(Preference preference, Object objValue) {
- int buttonTtyMode;
- buttonTtyMode = Integer.valueOf((String) objValue).intValue();
- int settingsTtyMode = android.provider.Settings.Secure.getInt(
- getContentResolver(),
- android.provider.Settings.Secure.PREFERRED_TTY_MODE, preferredTtyMode);
- if (DBG) log("handleTTYChange: requesting set TTY mode enable (TTY) to" +
- Integer.toString(buttonTtyMode));
-
- if (buttonTtyMode != settingsTtyMode) {
- switch(buttonTtyMode) {
- case Phone.TTY_MODE_OFF:
- case Phone.TTY_MODE_FULL:
- case Phone.TTY_MODE_HCO:
- case Phone.TTY_MODE_VCO:
- android.provider.Settings.Secure.putInt(getContentResolver(),
- android.provider.Settings.Secure.PREFERRED_TTY_MODE, buttonTtyMode);
- break;
- default:
- buttonTtyMode = Phone.TTY_MODE_OFF;
- }
-
- mButtonTTY.setValue(Integer.toString(buttonTtyMode));
- updatePreferredTtyModeSummary(buttonTtyMode);
- Intent ttyModeChanged = new Intent(TtyIntent.TTY_PREFERRED_MODE_CHANGE_ACTION);
- ttyModeChanged.putExtra(TtyIntent.TTY_PREFFERED_MODE, buttonTtyMode);
- sendBroadcast(ttyModeChanged);
- }
- }
-
- private void updatePreferredTtyModeSummary(int TtyMode) {
- String [] txts = getResources().getStringArray(R.array.tty_mode_entries);
- switch(TtyMode) {
- case Phone.TTY_MODE_OFF:
- case Phone.TTY_MODE_HCO:
- case Phone.TTY_MODE_VCO:
- case Phone.TTY_MODE_FULL:
- mButtonTTY.setSummary(txts[TtyMode]);
- break;
- default:
- mButtonTTY.setEnabled(false);
- mButtonTTY.setSummary(txts[Phone.TTY_MODE_OFF]);
- }
- }
-
- private static void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-
- /**
- * Updates the look of the VM preference widgets based on current VM provider settings.
- * Note that the provider name is loaded form the found activity via loadLabel in
- * initVoiceMailProviders in order for it to be localizable.
- */
- private void updateVMPreferenceWidgets(String currentProviderSetting) {
- final String key = currentProviderSetting;
- final VoiceMailProvider provider = mVMProvidersData.get(key);
-
- /* This is the case when we are coming up on a freshly wiped phone and there is no
- persisted value for the list preference mVoicemailProviders.
- In this case we want to show the UI asking the user to select a voicemail provider as
- opposed to silently falling back to default one. */
- if (provider == null) {
- mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
- mVoicemailSettings.setSummary("");
- mVoicemailSettings.setEnabled(false);
- mVoicemailSettings.setIntent(null);
- } else {
- final String providerName = provider.name;
- mVoicemailProviders.setSummary(providerName);
- mVoicemailSettings.setSummary(getApplicationContext().getString(
- R.string.voicemail_settings_for, providerName));
- mVoicemailSettings.setEnabled(true);
- mVoicemailSettings.setIntent(provider.intent);
- }
- }
-
- /**
- * Enumerates existing VM providers and puts their data into the list and populates
- * the preference list objects with their names.
- * In case we are called with ACTION_ADD_VOICEMAIL intent the intent may have
- * an extra string called IGNORE_PROVIDER_EXTRA with "package.activityName" of the provider
- * which should be hidden when we bring up the list of possible VM providers to choose.
- * This allows a provider which is being disabled (e.g. GV user logging out) to force the user
- * to pick some other provider.
- */
- private void initVoiceMailProviders() {
- mPerProviderSavedVMNumbers =
- this.getApplicationContext().getSharedPreferences(
- VM_NUMBERS_SHARED_PREFERENCES_NAME, MODE_PRIVATE);
-
- String providerToIgnore = null;
- if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
- if (DBG) log("ACTION_ADD_VOICEMAIL");
- if (getIntent().hasExtra(IGNORE_PROVIDER_EXTRA)) {
- providerToIgnore = getIntent().getStringExtra(IGNORE_PROVIDER_EXTRA);
- }
- if (DBG) log("providerToIgnore=" + providerToIgnore);
- if (providerToIgnore != null) {
- deleteSettingsForVoicemailProvider(providerToIgnore);
- }
- }
-
- mVMProvidersData.clear();
-
- // Stick the default element which is always there
- final String myCarrier = getString(R.string.voicemail_default);
- mVMProvidersData.put(DEFAULT_VM_PROVIDER_KEY, new VoiceMailProvider(myCarrier, null));
-
- // Enumerate providers
- PackageManager pm = getPackageManager();
- Intent intent = new Intent();
- intent.setAction(ACTION_CONFIGURE_VOICEMAIL);
- List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
- int len = resolveInfos.size() + 1; // +1 for the default choice we will insert.
-
- // Go through the list of discovered providers populating the data map
- // skip the provider we were instructed to ignore if there was one
- for (int i = 0; i < resolveInfos.size(); i++) {
- final ResolveInfo ri= resolveInfos.get(i);
- final ActivityInfo currentActivityInfo = ri.activityInfo;
- final String key = makeKeyForActivity(currentActivityInfo);
- if (DBG) log("Loading " + key);
- if (key.equals(providerToIgnore)) {
- if (DBG) log("Ignoring " + key);
- len--;
- continue;
- }
- final String nameForDisplay = ri.loadLabel(pm).toString();
- Intent providerIntent = new Intent();
- providerIntent.setAction(ACTION_CONFIGURE_VOICEMAIL);
- providerIntent.setClassName(currentActivityInfo.packageName,
- currentActivityInfo.name);
- mVMProvidersData.put(
- key,
- new VoiceMailProvider(nameForDisplay, providerIntent));
-
- }
-
- // Now we know which providers to display - create entries and values array for
- // the list preference
- String [] entries = new String [len];
- String [] values = new String [len];
- entries[0] = myCarrier;
- values[0] = DEFAULT_VM_PROVIDER_KEY;
- int entryIdx = 1;
- for (int i = 0; i < resolveInfos.size(); i++) {
- final String key = makeKeyForActivity(resolveInfos.get(i).activityInfo);
- if (!mVMProvidersData.containsKey(key)) {
- continue;
- }
- entries[entryIdx] = mVMProvidersData.get(key).name;
- values[entryIdx] = key;
- entryIdx++;
- }
-
- mVoicemailProviders.setEntries(entries);
- mVoicemailProviders.setEntryValues(values);
-
- mPreviousVMProviderKey = getCurrentVoicemailProviderKey();
- updateVMPreferenceWidgets(mPreviousVMProviderKey);
- }
-
- private String makeKeyForActivity(ActivityInfo ai) {
- return ai.name;
- }
-
- /**
- * Simulates user clicking on a passed preference.
- * Usually needed when the preference is a dialog preference and we want to invoke
- * a dialog for this preference programmatically.
- * TODO(iliat): figure out if there is a cleaner way to cause preference dlg to come up
- */
- private void simulatePreferenceClick(Preference preference) {
- // Go through settings until we find our setting
- // and then simulate a click on it to bring up the dialog
- final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
- for (int idx = 0; idx < adapter.getCount(); idx++) {
- if (adapter.getItem(idx) == preference) {
- getPreferenceScreen().onItemClick(this.getListView(),
- null, idx, adapter.getItemId(idx));
- break;
- }
- }
- }
-
- /**
- * Saves new VM provider settings associating them with the currently selected
- * provider if settings are different than the ones already stored for this
- * provider.
- * Later on these will be used when the user switches a provider.
- */
- private void maybeSaveSettingsForVoicemailProvider(String key,
- VoiceMailProviderSettings newSettings) {
- if (mVoicemailProviders == null) {
- return;
- }
- final VoiceMailProviderSettings curSettings = loadSettingsForVoiceMailProvider(key);
- if (newSettings.equals(curSettings)) {
- if (DBG) log("Not saving setting for " + key + " since they have not changed");
- return;
- }
- if (DBG) log("Saving settings for " + key + ": " + newSettings.toString());
- Editor editor = mPerProviderSavedVMNumbers.edit();
- editor.putString(key + VM_NUMBER_TAG,newSettings.voicemailNumber);
- String fwdKey = key + FWD_SETTINGS_TAG;
- CallForwardInfo[] s = newSettings.forwardingSettings;
- if (s != FWD_SETTINGS_DONT_TOUCH) {
- editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, s.length);
- for (int i = 0; i < s.length; i++) {
- final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
- final CallForwardInfo fi = s[i];
- editor.putInt(settingKey + FWD_SETTING_STATUS, fi.status);
- editor.putInt(settingKey + FWD_SETTING_REASON, fi.reason);
- editor.putString(settingKey + FWD_SETTING_NUMBER, fi.number);
- editor.putInt(settingKey + FWD_SETTING_TIME, fi.timeSeconds);
- }
- } else {
- editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
- }
- editor.commit();
- }
-
- /**
- * Returns settings previously stored for the currently selected
- * voice mail provider. If none is stored returns null.
- * If the user switches to a voice mail provider and we have settings
- * stored for it we will automatically change the phone's voice mail number
- * and forwarding number to the stored one. Otherwise we will bring up provider's configuration
- * UI.
- */
- private VoiceMailProviderSettings loadSettingsForVoiceMailProvider(String key) {
- final String vmNumberSetting = mPerProviderSavedVMNumbers.getString(key + VM_NUMBER_TAG,
- null);
- if (vmNumberSetting == null) {
- if (DBG) log("Settings for " + key + " not found");
- return null;
- }
-
- CallForwardInfo[] cfi = FWD_SETTINGS_DONT_TOUCH;
- String fwdKey = key + FWD_SETTINGS_TAG;
- final int fwdLen = mPerProviderSavedVMNumbers.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
- if (fwdLen > 0) {
- cfi = new CallForwardInfo[fwdLen];
- for (int i = 0; i < cfi.length; i++) {
- final String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
- cfi[i] = new CallForwardInfo();
- cfi[i].status = mPerProviderSavedVMNumbers.getInt(
- settingKey + FWD_SETTING_STATUS, 0);
- cfi[i].reason = mPerProviderSavedVMNumbers.getInt(
- settingKey + FWD_SETTING_REASON,
- CommandsInterface.CF_REASON_ALL_CONDITIONAL);
- cfi[i].serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
- cfi[i].toa = PhoneNumberUtils.TOA_International;
- cfi[i].number = mPerProviderSavedVMNumbers.getString(
- settingKey + FWD_SETTING_NUMBER, "");
- cfi[i].timeSeconds = mPerProviderSavedVMNumbers.getInt(
- settingKey + FWD_SETTING_TIME, 20);
- }
- }
-
- VoiceMailProviderSettings settings = new VoiceMailProviderSettings(vmNumberSetting, cfi);
- if (DBG) log("Loaded settings for " + key + ": " + settings.toString());
- return settings;
- }
-
- /**
- * Deletes settings for the specified provider.
- */
- private void deleteSettingsForVoicemailProvider(String key) {
- if (DBG) log("Deleting settings for" + key);
- if (mVoicemailProviders == null) {
- return;
- }
- mPerProviderSavedVMNumbers.edit()
- .putString(key + VM_NUMBER_TAG, null)
- .putInt(key + FWD_SETTINGS_TAG + FWD_SETTINGS_LENGTH_TAG, 0)
- .commit();
- }
-
- private String getCurrentVoicemailProviderKey() {
- final String key = mVoicemailProviders.getValue();
- return (key != null) ? key : DEFAULT_VM_PROVIDER_KEY;
- }
-}
diff --git a/phone/src/com/android/phone2/CallForwardEditPreference.java b/phone/src/com/android/phone2/CallForwardEditPreference.java
deleted file mode 100644
index 627fd3b..0000000
--- a/phone/src/com/android/phone2/CallForwardEditPreference.java
+++ /dev/null
@@ -1,249 +0,0 @@
-package com.android.phone2;
-
-import com.android.internal.telephony.CallForwardInfo;
-import com.android.internal.telephony.CommandsInterface;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.res.TypedArray;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-
-import static com.android.phone2.TimeConsumingPreferenceActivity.EXCEPTION_ERROR;
-import static com.android.phone2.TimeConsumingPreferenceActivity.RESPONSE_ERROR;
-
-public class CallForwardEditPreference extends EditPhoneNumberPreference {
- private static final String LOG_TAG = "CallForwardEditPreference";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- private static final String SRC_TAGS[] = {"{0}"};
- private CharSequence mSummaryOnTemplate;
- private int mButtonClicked;
- private int mServiceClass;
- private MyHandler mHandler = new MyHandler();
- int reason;
- Phone phone;
- CallForwardInfo callForwardInfo;
- TimeConsumingPreferenceListener tcpListener;
-
- public CallForwardEditPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- phone = SipPhoneFactory.getDefaultPhone();
- mSummaryOnTemplate = this.getSummaryOn();
-
- TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.CallForwardEditPreference, 0, R.style.EditPhoneNumberPreference);
- mServiceClass = a.getInt(R.styleable.CallForwardEditPreference_serviceClass,
- CommandsInterface.SERVICE_CLASS_VOICE);
- reason = a.getInt(R.styleable.CallForwardEditPreference_reason,
- CommandsInterface.CF_REASON_UNCONDITIONAL);
- a.recycle();
-
- if (DBG) Log.d(LOG_TAG, "mServiceClass=" + mServiceClass + ", reason=" + reason);
- }
-
- public CallForwardEditPreference(Context context) {
- this(context, null);
- }
-
- void init(TimeConsumingPreferenceListener listener, boolean skipReading) {
- tcpListener = listener;
- if (!skipReading) {
- phone.getCallForwardingOption(reason,
- mHandler.obtainMessage(MyHandler.MESSAGE_GET_CF,
- // unused in this case
- CommandsInterface.CF_ACTION_DISABLE,
- MyHandler.MESSAGE_GET_CF, null));
- if (tcpListener != null) {
- tcpListener.onStarted(this, true);
- }
- }
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- super.onClick(dialog, which);
- mButtonClicked = which;
- }
-
- @Override
- protected void onDialogClosed(boolean positiveResult) {
- super.onDialogClosed(positiveResult);
-
- if (DBG) Log.d(LOG_TAG, "mButtonClicked=" + mButtonClicked
- + ", positiveResult=" + positiveResult);
- if (this.mButtonClicked != DialogInterface.BUTTON_NEGATIVE) {
- int action = (isToggled() || (mButtonClicked == DialogInterface.BUTTON_POSITIVE)) ?
- CommandsInterface.CF_ACTION_REGISTRATION :
- CommandsInterface.CF_ACTION_DISABLE;
- int time = (reason != CommandsInterface.CF_REASON_NO_REPLY) ? 0 : 20;
- final String number = getPhoneNumber();
-
- if (DBG) Log.d(LOG_TAG, "callForwardInfo=" + callForwardInfo);
-
- if (action == CommandsInterface.CF_ACTION_REGISTRATION
- && callForwardInfo != null
- && callForwardInfo.status == 1
- && number.equals(callForwardInfo.number)) {
- // no change, do nothing
- if (DBG) Log.d(LOG_TAG, "no change, do nothing");
- } else {
- // set to network
- if (DBG) Log.d(LOG_TAG, "reason=" + reason + ", action=" + action
- + ", number=" + number);
-
- // Display no forwarding number while we're waiting for
- // confirmation
- setSummaryOn("");
-
- // the interface of Phone.setCallForwardingOption has error:
- // should be action, reason...
- phone.setCallForwardingOption(action,
- reason,
- number,
- time,
- mHandler.obtainMessage(MyHandler.MESSAGE_SET_CF,
- action,
- MyHandler.MESSAGE_SET_CF));
-
- if (tcpListener != null) {
- tcpListener.onStarted(this, false);
- }
- }
- }
- }
-
- void handleCallForwardResult(CallForwardInfo cf) {
- callForwardInfo = cf;
- if (DBG) Log.d(LOG_TAG, "handleGetCFResponse done, callForwardInfo=" + callForwardInfo);
-
- setToggled(callForwardInfo.status == 1);
- setPhoneNumber(callForwardInfo.number);
- }
-
- private void updateSummaryText() {
- if (isToggled()) {
- CharSequence summaryOn;
- final String number = getRawPhoneNumber();
- if (number != null && number.length() > 0) {
- String values[] = { number };
- summaryOn = TextUtils.replace(mSummaryOnTemplate, SRC_TAGS, values);
- } else {
- summaryOn = getContext().getString(R.string.sum_cfu_enabled_no_number);
- }
- setSummaryOn(summaryOn);
- }
-
- }
-
- // Message protocol:
- // what: get vs. set
- // arg1: action -- register vs. disable
- // arg2: get vs. set for the preceding request
- private class MyHandler extends Handler {
- private static final int MESSAGE_GET_CF = 0;
- private static final int MESSAGE_SET_CF = 1;
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_GET_CF:
- handleGetCFResponse(msg);
- break;
- case MESSAGE_SET_CF:
- handleSetCFResponse(msg);
- break;
- }
- }
-
- private void handleGetCFResponse(Message msg) {
- if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: done");
-
- if (msg.arg2 == MESSAGE_SET_CF) {
- tcpListener.onFinished(CallForwardEditPreference.this, false);
- } else {
- tcpListener.onFinished(CallForwardEditPreference.this, true);
- }
-
- AsyncResult ar = (AsyncResult) msg.obj;
-
- callForwardInfo = null;
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: ar.exception=" + ar.exception);
- setEnabled(false);
- tcpListener.onError(CallForwardEditPreference.this, EXCEPTION_ERROR);
- } else {
- if (ar.userObj instanceof Throwable) {
- tcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
- }
- CallForwardInfo cfInfoArray[] = (CallForwardInfo[]) ar.result;
- if (cfInfoArray.length == 0) {
- if (DBG) Log.d(LOG_TAG, "handleGetCFResponse: cfInfoArray.length==0");
- setEnabled(false);
- tcpListener.onError(CallForwardEditPreference.this, RESPONSE_ERROR);
- } else {
- for (int i = 0, length = cfInfoArray.length; i < length; i++) {
- if (DBG) Log.d(LOG_TAG, "handleGetCFResponse, cfInfoArray[" + i + "]="
- + cfInfoArray[i]);
- if ((mServiceClass & cfInfoArray[i].serviceClass) != 0) {
- // corresponding class
- CallForwardInfo info = cfInfoArray[i];
- handleCallForwardResult(info);
-
- // Show an alert if we got a success response but
- // with unexpected values.
- // Currently only handle the fail-to-disable case
- // since we haven't observed fail-to-enable.
- if (msg.arg2 == MESSAGE_SET_CF &&
- msg.arg1 == CommandsInterface.CF_ACTION_DISABLE &&
- info.status == 1) {
- CharSequence s;
- switch (reason) {
- case CommandsInterface.CF_REASON_BUSY:
- s = getContext().getText(R.string.disable_cfb_forbidden);
- break;
- case CommandsInterface.CF_REASON_NO_REPLY:
- s = getContext().getText(R.string.disable_cfnry_forbidden);
- break;
- default: // not reachable
- s = getContext().getText(R.string.disable_cfnrc_forbidden);
- }
- AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
- builder.setNeutralButton(R.string.close_dialog, null);
- builder.setTitle(getContext().getText(R.string.error_updating_title));
- builder.setMessage(s);
- builder.setCancelable(true);
- builder.create().show();
- }
- }
- }
- }
- }
-
- // Now whether or not we got a new number, reset our enabled
- // summary text since it may have been replaced by an empty
- // placeholder.
- updateSummaryText();
- }
-
- private void handleSetCFResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "handleSetCFResponse: ar.exception=" + ar.exception);
- // setEnabled(false);
- }
- if (DBG) Log.d(LOG_TAG, "handleSetCFResponse: re get");
- phone.getCallForwardingOption(reason,
- obtainMessage(MESSAGE_GET_CF, msg.arg1, MESSAGE_SET_CF, ar.exception));
- }
- }
-}
diff --git a/phone/src/com/android/phone2/CallLogAsync.java b/phone/src/com/android/phone2/CallLogAsync.java
deleted file mode 100644
index 348a6c7..0000000
--- a/phone/src/com/android/phone2/CallLogAsync.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.phone2;
-import android.content.Context;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Looper;
-import android.provider.CallLog.Calls;
-import android.util.Log;
-import com.android.internal.telephony.CallerInfo;
-
-/**
- * Class to access the call logs database asynchronously since
- * database ops can take a long time depending on the system's load.
- * It uses AsyncTask which has its own thread pool.
- *
- * <pre class="prettyprint">
- * Typical usage:
- * ==============
- *
- * // From an activity...
- * String mLastNumber = "";
- *
- * CallLogAsync log = new CallLogAsync();
- *
- * CallLogAsync.AddCallArgs addCallArgs = new CallLogAsync.AddCallArgs(
- * this, ci, number, presentation, type, timestamp, duration);
- *
- * log.addCall(addCallArgs);
- *
- * CallLogAsync.GetLastOutgoingCallArgs lastCallArgs = new CallLogAsync.GetLastOutgoingCallArgs(
- * this, new CallLogAsync.OnLastOutgoingCallComplete() {
- * public void lastOutgoingCall(String number) { mLastNumber = number; }
- * });
- * log.getLastOutgoingCall(lastCallArgs);
- * </pre>
- *
- */
-
-public class CallLogAsync {
- private static final String TAG = "CallLogAsync";
-
- /**
- * Parameter object to hold the args to add a call in the call log DB.
- */
- public static class AddCallArgs {
- /**
- * @param ci CallerInfo.
- * @param number To be logged.
- * @param presentation Of the number.
- * @param callType The type of call (e.g INCOMING_TYPE). @see
- * android.provider.CallLog for the list of values.
- * @param timestamp Of the call (millisecond since epoch).
- * @param durationInMillis Of the call (millisecond).
- */
- public AddCallArgs(Context context,
- CallerInfo ci,
- String number,
- int presentation,
- int callType,
- long timestamp,
- long durationInMillis) {
- // Note that the context is passed each time. We could
- // have stored it in a member but we've run into a bunch
- // of memory leaks in the past that resulted from storing
- // references to contexts in places that were long lived
- // when the contexts were expected to be short lived. For
- // example, if you initialize this class with an Activity
- // instead of an Application the Activity can't be GCed
- // until this class can, and Activities tend to hold
- // references to large amounts of RAM for things like the
- // bitmaps in their views.
- //
- // Having hit more than a few of those bugs in the past
- // we've grown cautious of storing references to Contexts
- // when it's not very clear that the thing holding the
- // references is tightly tied to the Context, for example
- // Views the Activity is displaying.
-
- this.context = context;
- this.ci = ci;
- this.number = number;
- this.presentation = presentation;
- this.callType = callType;
- this.timestamp = timestamp;
- this.durationInSec = (int)(durationInMillis / 1000);
- }
- // Since the members are accessed directly, we don't use the
- // mXxxx notation.
- public final Context context;
- public final CallerInfo ci;
- public final String number;
- public final int presentation;
- public final int callType;
- public final long timestamp;
- public final int durationInSec;
- }
-
- /**
- * Parameter object to hold the args to get the last outgoing call
- * from the call log DB.
- */
- public static class GetLastOutgoingCallArgs {
- public GetLastOutgoingCallArgs(Context context,
- OnLastOutgoingCallComplete callback) {
- this.context = context;
- this.callback = callback;
- }
- public final Context context;
- public final OnLastOutgoingCallComplete callback;
- }
-
- /**
- * Non blocking version of CallLog.addCall(...)
- */
- public AsyncTask addCall(AddCallArgs args) {
- assertUiThread();
- return new AddCallTask().execute(args);
- }
-
- /** Interface to retrieve the last dialed number asynchronously. */
- public interface OnLastOutgoingCallComplete {
- /** @param number The last dialed number or an empty string if
- * none exists yet. */
- void lastOutgoingCall(String number);
- }
-
- /**
- * CallLog.getLastOutgoingCall(...)
- */
- public AsyncTask getLastOutgoingCall(GetLastOutgoingCallArgs args) {
- assertUiThread();
- return new GetLastOutgoingCallTask(args.callback).execute(args);
- }
-
- /**
- * AsyncTask to save calls in the DB.
- */
- private class AddCallTask extends AsyncTask<AddCallArgs, Void, Uri[]> {
- @Override
- protected Uri[] doInBackground(AddCallArgs... callList) {
- int count = callList.length;
- Uri[] result = new Uri[count];
- for (int i = 0; i < count; i++) {
- AddCallArgs c = callList[i];
-
- // May block.
- result[i] = Calls.addCall(
- c.ci, c.context, c.number, c.presentation,
- c.callType, c.timestamp, c.durationInSec);
- }
- return result;
- }
-
- // Perform a simple sanity check to make sure the call was
- // written in the database. Typically there is only one result
- // per call so it is easy to identify which one failed.
- @Override
- protected void onPostExecute(Uri[] result) {
- for (Uri uri : result) {
- if (uri == null) {
- Log.e(TAG, "Failed to write call to the log.");
- }
- }
- }
- }
-
- /**
- * AsyncTask to get the last outgoing call from the DB.
- */
- private class GetLastOutgoingCallTask extends AsyncTask<GetLastOutgoingCallArgs, Void, String> {
- private final OnLastOutgoingCallComplete mCallback;
- private String mNumber;
- public GetLastOutgoingCallTask(OnLastOutgoingCallComplete callback) {
- mCallback = callback;
- }
-
- // Happens on a background thread. We cannot run the callback
- // here because only the UI thread can modify the view
- // hierarchy (e.g enable/disable the dial button). The
- // callback is ran rom the post execute method.
- @Override
- protected String doInBackground(GetLastOutgoingCallArgs... list) {
- int count = list.length;
- String number = "";
- for (GetLastOutgoingCallArgs args : list) {
- // May block. Select only the last one.
- number = Calls.getLastOutgoingCall(args.context);
- }
- return number; // passed to the onPostExecute method.
- }
-
- // Happens on the UI thread, it is safe to run the callback
- // that may do some work on the views.
- @Override
- protected void onPostExecute(String number) {
- assertUiThread();
- mCallback.lastOutgoingCall(number);
- }
- }
-
- private void assertUiThread() {
- if (!Looper.getMainLooper().equals(Looper.myLooper())) {
- throw new RuntimeException("Not on the UI thread!");
- }
- }
-}
diff --git a/phone/src/com/android/phone2/CallNotifier.java b/phone/src/com/android/phone2/CallNotifier.java
deleted file mode 100755
index 46676ab..0000000
--- a/phone/src/com/android/phone2/CallNotifier.java
+++ /dev/null
@@ -1,1918 +0,0 @@
-/*
- * 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.phone2;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.CallerInfo;
-import com.android.internal.telephony.CallerInfoAsyncQuery;
-import com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
-import com.android.internal.telephony.cdma.SignalToneUtil;
-import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaDisplayInfoRec;
-import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaSignalInfoRec;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneBase;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.media.ToneGenerator;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.os.Vibrator;
-import android.provider.CallLog;
-import android.provider.CallLog.Calls;
-import android.provider.Settings;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.PhoneStateListener;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.EventLog;
-import android.util.Log;
-
-
-/**
- * Phone app module that listens for phone state changes and various other
- * events from the telephony layer, and triggers any resulting UI behavior
- * (like starting the Ringer and Incoming Call UI, playing in-call tones,
- * updating notifications, writing call log entries, etc.)
- */
-public class CallNotifier extends Handler
- implements CallerInfoAsyncQuery.OnQueryCompleteListener {
- private static final String LOG_TAG = "CallNotifier";
- private static final boolean DBG = true;
- //(PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
- private static final boolean VDBG = true; //(PhoneApp.DBG_LEVEL >= 2);
-
- // Maximum time we allow the CallerInfo query to run,
- // before giving up and falling back to the default ringtone.
- private static final int RINGTONE_QUERY_WAIT_TIME = 500; // msec
-
- // Timers related to CDMA Call Waiting
- // 1) For displaying Caller Info
- // 2) For disabling "Add Call" menu option once User selects Ignore or CW Timeout occures
- private static final int CALLWAITING_CALLERINFO_DISPLAY_TIME = 20000; // msec
- private static final int CALLWAITING_ADDCALL_DISABLE_TIME = 30000; // msec
-
- // Time to display the DisplayInfo Record sent by CDMA network
- private static final int DISPLAYINFO_NOTIFICATION_TIME = 2000; // msec
-
- // Boolean to keep track of whether or not a CDMA Call Waiting call timed out.
- //
- // This is CDMA-specific, because with CDMA we *don't* get explicit
- // notification from the telephony layer that a call-waiting call has
- // stopped ringing. Instead, when a call-waiting call first comes in we
- // start a 20-second timer (see CALLWAITING_CALLERINFO_DISPLAY_DONE), and
- // if the timer expires we clean up the call and treat it as a missed call.
- //
- // If this field is true, that means that the current Call Waiting call
- // "timed out" and should be logged in Call Log as a missed call. If it's
- // false when we reach onCdmaCallWaitingReject(), we can assume the user
- // explicitly rejected this call-waiting call.
- //
- // This field is reset to false any time a call-waiting call first comes
- // in, and after cleaning up a missed call-waiting call. It's only ever
- // set to true when the CALLWAITING_CALLERINFO_DISPLAY_DONE timer fires.
- //
- // TODO: do we really need a member variable for this? Don't we always
- // know at the moment we call onCdmaCallWaitingReject() whether this is an
- // explicit rejection or not?
- // (Specifically: when we call onCdmaCallWaitingReject() from
- // PhoneUtils.hangupRingingCall() that means the user deliberately rejected
- // the call, and if we call onCdmaCallWaitingReject() because of a
- // CALLWAITING_CALLERINFO_DISPLAY_DONE event that means that it timed
- // out...)
- private boolean mCallWaitingTimeOut = false;
-
- // values used to track the query state
- private static final int CALLERINFO_QUERY_READY = 0;
- private static final int CALLERINFO_QUERYING = -1;
-
- // the state of the CallerInfo Query.
- private int mCallerInfoQueryState;
-
- // object used to synchronize access to mCallerInfoQueryState
- private Object mCallerInfoQueryStateGuard = new Object();
-
- // Event used to indicate a query timeout.
- private static final int RINGER_CUSTOM_RINGTONE_QUERY_TIMEOUT = 100;
-
- // Events from the Phone object:
- private static final int PHONE_STATE_CHANGED = 1;
- private static final int PHONE_NEW_RINGING_CONNECTION = 2;
- private static final int PHONE_DISCONNECT = 3;
- private static final int PHONE_UNKNOWN_CONNECTION_APPEARED = 4;
- private static final int PHONE_INCOMING_RING = 5;
- private static final int PHONE_STATE_DISPLAYINFO = 6;
- private static final int PHONE_STATE_SIGNALINFO = 7;
- private static final int PHONE_CDMA_CALL_WAITING = 8;
- private static final int PHONE_ENHANCED_VP_ON = 9;
- private static final int PHONE_ENHANCED_VP_OFF = 10;
- private static final int PHONE_RINGBACK_TONE = 11;
- private static final int PHONE_RESEND_MUTE = 12;
-
- // Events generated internally:
- private static final int PHONE_MWI_CHANGED = 21;
- private static final int PHONE_BATTERY_LOW = 22;
- private static final int CALLWAITING_CALLERINFO_DISPLAY_DONE = 23;
- private static final int CALLWAITING_ADDCALL_DISABLE_TIMEOUT = 24;
- private static final int DISPLAYINFO_NOTIFICATION_DONE = 25;
- private static final int EVENT_OTA_PROVISION_CHANGE = 26;
- private static final int CDMA_CALL_WAITING_REJECT = 27;
-
- // Emergency call related defines:
- private static final int EMERGENCY_TONE_OFF = 0;
- private static final int EMERGENCY_TONE_ALERT = 1;
- private static final int EMERGENCY_TONE_VIBRATE = 2;
-
- private PhoneApp mApplication;
- private Phone mPhone;
- private Ringer mRinger;
- private BluetoothHandsfree mBluetoothHandsfree;
- private CallLogAsync mCallLog;
- private boolean mSilentRingerRequested;
-
- // ToneGenerator instance for playing SignalInfo tones
- private ToneGenerator mSignalInfoToneGenerator;
-
- // The tone volume relative to other sounds in the stream SignalInfo
- private static final int TONE_RELATIVE_VOLUME_SIGNALINFO = 80;
-
- private Call.State mPreviousCdmaCallState;
- private boolean mCdmaVoicePrivacyState = false;
- private boolean mIsCdmaRedialCall = false;
-
- // Emergency call tone and vibrate:
- private int mIsEmergencyToneOn;
- private int mCurrentEmergencyToneState = EMERGENCY_TONE_OFF;
- private EmergencyTonePlayerVibrator mEmergencyTonePlayerVibrator;
-
- // Ringback tone player
- private InCallTonePlayer mInCallRingbackTonePlayer;
-
- // Call waiting tone player
- private InCallTonePlayer mCallWaitingTonePlayer;
-
- // Cached AudioManager
- private AudioManager mAudioManager;
-
- public CallNotifier(PhoneApp app, Phone phone, Ringer ringer,
- BluetoothHandsfree btMgr, CallLogAsync callLog) {
- mApplication = app;
- mPhone = phone;
- mCallLog = callLog;
-
- mAudioManager = (AudioManager) mPhone.getContext().getSystemService(Context.AUDIO_SERVICE);
-
- mPhone.registerForNewRingingConnection(this, PHONE_NEW_RINGING_CONNECTION, null);
- mPhone.registerForPreciseCallStateChanged(this, PHONE_STATE_CHANGED, null);
- mPhone.registerForDisconnect(this, PHONE_DISCONNECT, null);
- mPhone.registerForUnknownConnection(this, PHONE_UNKNOWN_CONNECTION_APPEARED, null);
- mPhone.registerForIncomingRing(this, PHONE_INCOMING_RING, null);
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- mPhone.registerForCdmaOtaStatusChange(this, EVENT_OTA_PROVISION_CHANGE, null);
-
- if (DBG) log("Registering for Call Waiting, Signal and Display Info.");
- mPhone.registerForCallWaiting(this, PHONE_CDMA_CALL_WAITING, null);
- mPhone.registerForDisplayInfo(this, PHONE_STATE_DISPLAYINFO, null);
- mPhone.registerForSignalInfo(this, PHONE_STATE_SIGNALINFO, null);
- mPhone.registerForInCallVoicePrivacyOn(this, PHONE_ENHANCED_VP_ON, null);
- mPhone.registerForInCallVoicePrivacyOff(this, PHONE_ENHANCED_VP_OFF, null);
-
- // Instantiate the ToneGenerator for SignalInfo and CallWaiting
- // TODO: We probably don't need the mSignalInfoToneGenerator instance
- // around forever. Need to change it so as to create a ToneGenerator instance only
- // when a tone is being played and releases it after its done playing.
- try {
- mSignalInfoToneGenerator = new ToneGenerator(AudioManager.STREAM_VOICE_CALL,
- TONE_RELATIVE_VOLUME_SIGNALINFO);
- } catch (RuntimeException e) {
- Log.w(LOG_TAG, "CallNotifier: Exception caught while creating " +
- "mSignalInfoToneGenerator: " + e);
- mSignalInfoToneGenerator = null;
- }
- }
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_GSM) {
- mPhone.registerForRingbackTone(this, PHONE_RINGBACK_TONE, null);
- mPhone.registerForResendIncallMute(this, PHONE_RESEND_MUTE, null);
- }
-
- mRinger = ringer;
- mBluetoothHandsfree = btMgr;
-
- TelephonyManager telephonyManager = (TelephonyManager)app.getSystemService(
- Context.TELEPHONY_SERVICE);
- telephonyManager.listen(mPhoneStateListener,
- PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
- | PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case PHONE_NEW_RINGING_CONNECTION:
- if (DBG) log("RINGING... (new)");
- onNewRingingConnection((AsyncResult) msg.obj);
- mSilentRingerRequested = false;
- break;
-
- case PHONE_INCOMING_RING:
- // repeat the ring when requested by the RIL, and when the user has NOT
- // specifically requested silence.
- if (msg.obj != null && ((AsyncResult) msg.obj).result != null) {
- PhoneBase pb = (PhoneBase)((AsyncResult)msg.obj).result;
-
- if ((pb.getState() == Phone.State.RINGING)
- && (mSilentRingerRequested == false)) {
- if (DBG) log("RINGING... (PHONE_INCOMING_RING event)");
- mRinger.ring();
- } else {
- if (DBG) log("RING before NEW_RING, skipping");
- }
- }
- break;
-
- case PHONE_STATE_CHANGED:
- onPhoneStateChanged((AsyncResult) msg.obj);
- break;
-
- case PHONE_DISCONNECT:
- if (DBG) log("DISCONNECT");
- onDisconnect((AsyncResult) msg.obj);
- break;
-
- case PHONE_UNKNOWN_CONNECTION_APPEARED:
- onUnknownConnectionAppeared((AsyncResult) msg.obj);
- break;
-
- case RINGER_CUSTOM_RINGTONE_QUERY_TIMEOUT:
- // CallerInfo query is taking too long! But we can't wait
- // any more, so start ringing NOW even if it means we won't
- // use the correct custom ringtone.
- Log.w(LOG_TAG, "CallerInfo query took too long; manually starting ringer");
-
- // In this case we call onCustomRingQueryComplete(), just
- // like if the query had completed normally. (But we're
- // going to get the default ringtone, since we never got
- // the chance to call Ringer.setCustomRingtoneUri()).
- onCustomRingQueryComplete();
- break;
-
- case PHONE_MWI_CHANGED:
- onMwiChanged(mPhone.getMessageWaitingIndicator());
- break;
-
- case PHONE_BATTERY_LOW:
- onBatteryLow();
- break;
-
- case PHONE_CDMA_CALL_WAITING:
- if (DBG) log("Received PHONE_CDMA_CALL_WAITING event");
- onCdmaCallWaiting((AsyncResult) msg.obj);
- break;
-
- case CDMA_CALL_WAITING_REJECT:
- Log.i(LOG_TAG, "Received CDMA_CALL_WAITING_REJECT event");
- onCdmaCallWaitingReject();
- break;
-
- case CALLWAITING_CALLERINFO_DISPLAY_DONE:
- Log.i(LOG_TAG, "Received CALLWAITING_CALLERINFO_DISPLAY_DONE event");
- mCallWaitingTimeOut = true;
- onCdmaCallWaitingReject();
- break;
-
- case CALLWAITING_ADDCALL_DISABLE_TIMEOUT:
- if (DBG) log("Received CALLWAITING_ADDCALL_DISABLE_TIMEOUT event ...");
- // Set the mAddCallMenuStateAfterCW state to true
- mApplication.cdmaPhoneCallState.setAddCallMenuStateAfterCallWaiting(true);
- mApplication.updateInCallScreenTouchUi();
- break;
-
- case PHONE_STATE_DISPLAYINFO:
- if (DBG) log("Received PHONE_STATE_DISPLAYINFO event");
- onDisplayInfo((AsyncResult) msg.obj);
- break;
-
- case PHONE_STATE_SIGNALINFO:
- if (DBG) log("Received PHONE_STATE_SIGNALINFO event");
- onSignalInfo((AsyncResult) msg.obj);
- break;
-
- case DISPLAYINFO_NOTIFICATION_DONE:
- if (DBG) log("Received Display Info notification done event ...");
- CdmaDisplayInfo.dismissDisplayInfoRecord();
- break;
-
- case EVENT_OTA_PROVISION_CHANGE:
- mApplication.handleOtaEvents(msg);
- break;
-
- case PHONE_ENHANCED_VP_ON:
- if (DBG) log("PHONE_ENHANCED_VP_ON...");
- if (!mCdmaVoicePrivacyState) {
- int toneToPlay = InCallTonePlayer.TONE_VOICE_PRIVACY;
- new InCallTonePlayer(toneToPlay).start();
- mCdmaVoicePrivacyState = true;
- // Update the VP icon:
- NotificationMgr.getDefault().updateInCallNotification();
- }
- break;
-
- case PHONE_ENHANCED_VP_OFF:
- if (DBG) log("PHONE_ENHANCED_VP_OFF...");
- if (mCdmaVoicePrivacyState) {
- int toneToPlay = InCallTonePlayer.TONE_VOICE_PRIVACY;
- new InCallTonePlayer(toneToPlay).start();
- mCdmaVoicePrivacyState = false;
- // Update the VP icon:
- NotificationMgr.getDefault().updateInCallNotification();
- }
- break;
-
- case PHONE_RINGBACK_TONE:
- onRingbackTone((AsyncResult) msg.obj);
- break;
-
- case PHONE_RESEND_MUTE:
- onResendMute();
- break;
-
- default:
- // super.handleMessage(msg);
- }
- }
-
- PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
- @Override
- public void onMessageWaitingIndicatorChanged(boolean mwi) {
- onMwiChanged(mwi);
- }
-
- @Override
- public void onCallForwardingIndicatorChanged(boolean cfi) {
- onCfiChanged(cfi);
- }
- };
-
- private void onNewRingingConnection(AsyncResult r) {
- Connection c = (Connection) r.result;
- if (DBG) log("onNewRingingConnection(): " + c);
-
- // Incoming calls are totally ignored if the device isn't provisioned yet
- boolean provisioned = Settings.Secure.getInt(mPhone.getContext().getContentResolver(),
- Settings.Secure.DEVICE_PROVISIONED, 0) != 0;
- if (!provisioned && !PhoneUtils.isPhoneInEcm(mPhone)) {
- Log.i(LOG_TAG, "CallNotifier: rejecting incoming call: not provisioned / ECM");
- // Send the caller straight to voicemail, just like
- // "rejecting" an incoming call.
- PhoneUtils.hangupRingingCall(mPhone);
- return;
- }
-
- // Incoming calls are totally ignored if OTA call is active
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- boolean activateState = (mApplication.cdmaOtaScreenState.otaScreenState
- == OtaUtils.CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION);
- boolean dialogState = (mApplication.cdmaOtaScreenState.otaScreenState
- == OtaUtils.CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG);
- boolean spcState = mApplication.cdmaOtaProvisionData.inOtaSpcState;
-
- if (spcState) {
- Log.i(LOG_TAG, "CallNotifier: rejecting incoming call: OTA call is active");
- PhoneUtils.hangupRingingCall(mPhone);
- return;
- } else if (activateState || dialogState) {
- if (dialogState) mApplication.dismissOtaDialogs();
- mApplication.clearOtaState();
- mApplication.clearInCallScreenMode();
- }
- }
-
- if (c != null && c.isRinging()) {
- // Stop any signalInfo tone being played on receiving a Call
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- stopSignalInfoTone();
- }
-
- Call.State state = c.getState();
- // State will be either INCOMING or WAITING.
- if (VDBG) log("- connection is ringing! state = " + state);
- // if (DBG) PhoneUtils.dumpCallState(mPhone);
-
- // No need to do any service state checks here (like for
- // "emergency mode"), since in those states the SIM won't let
- // us get incoming connections in the first place.
-
- // TODO: Consider sending out a serialized broadcast Intent here
- // (maybe "ACTION_NEW_INCOMING_CALL"), *before* starting the
- // ringer and going to the in-call UI. The intent should contain
- // the caller-id info for the current connection, and say whether
- // it would be a "call waiting" call or a regular ringing call.
- // If anybody consumed the broadcast, we'd bail out without
- // ringing or bringing up the in-call UI.
- //
- // This would give 3rd party apps a chance to listen for (and
- // intercept) new ringing connections. An app could reject the
- // incoming call by consuming the broadcast and doing nothing, or
- // it could "pick up" the call (without any action by the user!)
- // by firing off an ACTION_ANSWER intent.
- //
- // We'd need to protect this with a new "intercept incoming calls"
- // system permission.
-
- // Obtain a partial wake lock to make sure the CPU doesn't go to
- // sleep before we finish bringing up the InCallScreen.
- // (This will be upgraded soon to a full wake lock; see
- // PhoneUtils.showIncomingCallUi().)
- if (VDBG) log("Holding wake lock on new incoming connection.");
- mApplication.requestWakeState(PhoneApp.WakeState.PARTIAL);
-
- // - don't ring for call waiting connections
- // - do this before showing the incoming call panel
- if (state == Call.State.INCOMING) {
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_RINGING);
- startIncomingCallQuery(c);
- } else {
- if (VDBG) log("- starting call waiting tone...");
- if (mCallWaitingTonePlayer == null) {
- mCallWaitingTonePlayer = new InCallTonePlayer(InCallTonePlayer.TONE_CALL_WAITING);
- mCallWaitingTonePlayer.start();
- }
- // in this case, just fall through like before, and call
- // PhoneUtils.showIncomingCallUi
- PhoneUtils.showIncomingCallUi();
- }
- }
-
- if (VDBG) log("- onNewRingingConnection() done.");
- }
-
- /**
- * Helper method to manage the start of incoming call queries
- */
- private void startIncomingCallQuery(Connection c) {
- // TODO: cache the custom ringer object so that subsequent
- // calls will not need to do this query work. We can keep
- // the MRU ringtones in memory. We'll still need to hit
- // the database to get the callerinfo to act as a key,
- // but at least we can save the time required for the
- // Media player setup. The only issue with this is that
- // we may need to keep an eye on the resources the Media
- // player uses to keep these ringtones around.
-
- // make sure we're in a state where we can be ready to
- // query a ringtone uri.
- boolean shouldStartQuery = false;
- synchronized (mCallerInfoQueryStateGuard) {
- if (mCallerInfoQueryState == CALLERINFO_QUERY_READY) {
- mCallerInfoQueryState = CALLERINFO_QUERYING;
- shouldStartQuery = true;
- }
- }
- if (shouldStartQuery) {
- // create a custom ringer using the default ringer first
- mRinger.setCustomRingtoneUri(Settings.System.DEFAULT_RINGTONE_URI);
-
- // query the callerinfo to try to get the ringer.
- PhoneUtils.CallerInfoToken cit = PhoneUtils.startGetCallerInfo(
- mPhone.getContext(), c, this, this);
-
- // if this has already been queried then just ring, otherwise
- // we wait for the alloted time before ringing.
- if (cit.isFinal) {
- if (VDBG) log("- CallerInfo already up to date, using available data");
- onQueryComplete(0, this, cit.currentInfo);
- } else {
- if (VDBG) log("- Starting query, posting timeout message.");
- sendEmptyMessageDelayed(RINGER_CUSTOM_RINGTONE_QUERY_TIMEOUT,
- RINGTONE_QUERY_WAIT_TIME);
- }
- // calls to PhoneUtils.showIncomingCallUi will come after the
- // queries are complete (or timeout).
- } else {
- // This should never happen; its the case where an incoming call
- // arrives at the same time that the query is still being run,
- // and before the timeout window has closed.
- EventLog.writeEvent(EventLogTags.PHONE_UI_MULTIPLE_QUERY);
-
- // In this case, just log the request and ring.
- if (VDBG) log("RINGING... (request to ring arrived while query is running)");
- mRinger.ring();
-
- // in this case, just fall through like before, and call
- // PhoneUtils.showIncomingCallUi
- PhoneUtils.showIncomingCallUi();
- }
- }
-
- /**
- * Performs the final steps of the onNewRingingConnection sequence:
- * starts the ringer, and launches the InCallScreen to show the
- * "incoming call" UI.
- *
- * Normally, this is called when the CallerInfo query completes (see
- * onQueryComplete()). In this case, onQueryComplete() has already
- * configured the Ringer object to use the custom ringtone (if there
- * is one) for this caller. So we just tell the Ringer to start, and
- * proceed to the InCallScreen.
- *
- * But this method can *also* be called if the
- * RINGTONE_QUERY_WAIT_TIME timeout expires, which means that the
- * CallerInfo query is taking too long. In that case, we log a
- * warning but otherwise we behave the same as in the normal case.
- * (We still tell the Ringer to start, but it's going to use the
- * default ringtone.)
- */
- private void onCustomRingQueryComplete() {
- boolean isQueryExecutionTimeExpired = false;
- synchronized (mCallerInfoQueryStateGuard) {
- if (mCallerInfoQueryState == CALLERINFO_QUERYING) {
- mCallerInfoQueryState = CALLERINFO_QUERY_READY;
- isQueryExecutionTimeExpired = true;
- }
- }
- if (isQueryExecutionTimeExpired) {
- // There may be a problem with the query here, since the
- // default ringtone is playing instead of the custom one.
- Log.w(LOG_TAG, "CallerInfo query took too long; falling back to default ringtone");
- EventLog.writeEvent(EventLogTags.PHONE_UI_RINGER_QUERY_ELAPSED);
- }
-
- // Make sure we still have an incoming call!
- //
- // (It's possible for the incoming call to have been disconnected
- // while we were running the query. In that case we better not
- // start the ringer here, since there won't be any future
- // DISCONNECT event to stop it!)
- //
- // Note we don't have to worry about the incoming call going away
- // *after* this check but before we call mRinger.ring() below,
- // since in that case we *will* still get a DISCONNECT message sent
- // to our handler. (And we will correctly stop the ringer when we
- // process that event.)
- if (mPhone.getState() != Phone.State.RINGING) {
- Log.i(LOG_TAG, "onCustomRingQueryComplete: No incoming call! Bailing out...");
- // Don't start the ringer *or* bring up the "incoming call" UI.
- // Just bail out.
- return;
- }
-
- // Ring, either with the queried ringtone or default one.
- if (VDBG) log("RINGING... (onCustomRingQueryComplete)");
- mRinger.ring();
-
- // ...and show the InCallScreen.
- PhoneUtils.showIncomingCallUi();
- }
-
- private void onUnknownConnectionAppeared(AsyncResult r) {
- Phone.State state = mPhone.getState();
-
- if (state == Phone.State.OFFHOOK) {
- // basically do onPhoneStateChanged + displayCallScreen
- onPhoneStateChanged(r);
- PhoneUtils.showIncomingCallUi();
- }
- }
-
- private void onPhoneStateChanged(AsyncResult r) {
- Phone.State state = mPhone.getState();
- if (VDBG) log("onPhoneStateChanged: state = " + state);
-
- // Turn status bar notifications on or off depending upon the state
- // of the phone. Notification Alerts (audible or vibrating) should
- // be on if and only if the phone is IDLE.
- NotificationMgr.getDefault().getStatusBarMgr()
- .enableNotificationAlerts(state == Phone.State.IDLE);
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- if ((mPhone.getForegroundCall().getState() == Call.State.ACTIVE)
- && ((mPreviousCdmaCallState == Call.State.DIALING)
- || (mPreviousCdmaCallState == Call.State.ALERTING))) {
- if (mIsCdmaRedialCall) {
- int toneToPlay = InCallTonePlayer.TONE_REDIAL;
- new InCallTonePlayer(toneToPlay).start();
- }
- // Stop any signal info tone when call moves to ACTIVE state
- stopSignalInfoTone();
- }
- mPreviousCdmaCallState = mPhone.getForegroundCall().getState();
- }
-
- // Have the PhoneApp recompute its mShowBluetoothIndication
- // flag based on the (new) telephony state.
- // There's no need to force a UI update since we update the
- // in-call notification ourselves (below), and the InCallScreen
- // listens for phone state changes itself.
- mApplication.updateBluetoothIndication(false);
-
- // Update the proximity sensor mode (on devices that have a
- // proximity sensor).
- mApplication.updatePhoneState(state);
-
- if (state == Phone.State.OFFHOOK) {
- // stop call waiting tone if needed when answering
- if (mCallWaitingTonePlayer != null) {
- mCallWaitingTonePlayer.stopTone();
- mCallWaitingTonePlayer = null;
- }
-
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_OFFHOOK);
- if (VDBG) log("onPhoneStateChanged: OFF HOOK");
- // If Audio Mode is not In Call, then set the Audio Mode. This
- // changes is needed because for one of the carrier specific test case,
- // call is originated from the lower layer without using the UI, and
- // since calling does not go through DIALING state, it skips the steps
- // of setting the Audio Mode
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- if (mAudioManager.getMode() != AudioManager.MODE_IN_CALL) {
- PhoneUtils.setAudioMode(mPhone.getContext(), AudioManager.MODE_IN_CALL);
- }
- }
-
- // if the call screen is showing, let it handle the event,
- // otherwise handle it here.
- if (!mApplication.isShowingCallScreen()) {
- mApplication.setScreenTimeout(PhoneApp.ScreenTimeoutDuration.DEFAULT);
- mApplication.requestWakeState(PhoneApp.WakeState.SLEEP);
- }
-
- // Since we're now in-call, the Ringer should definitely *not*
- // be ringing any more. (This is just a sanity-check; we
- // already stopped the ringer explicitly back in
- // PhoneUtils.answerCall(), before the call to phone.acceptCall().)
- // TODO: Confirm that this call really *is* unnecessary, and if so,
- // remove it!
- if (DBG) log("stopRing()... (OFFHOOK state)");
- mRinger.stopRing();
-
- // put a icon in the status bar
- NotificationMgr.getDefault().updateInCallNotification();
- }
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- Connection c = mPhone.getForegroundCall().getLatestConnection();
- if ((c != null) && (PhoneNumberUtils.isEmergencyNumber(c.getAddress()))) {
- if (VDBG) log("onPhoneStateChanged: it is an emergency call.");
- Call.State callState = mPhone.getForegroundCall().getState();
- if (mEmergencyTonePlayerVibrator == null) {
- mEmergencyTonePlayerVibrator = new EmergencyTonePlayerVibrator();
- }
-
- if (callState == Call.State.DIALING || callState == Call.State.ALERTING) {
- mIsEmergencyToneOn = Settings.System.getInt(
- mPhone.getContext().getContentResolver(),
- Settings.System.EMERGENCY_TONE, EMERGENCY_TONE_OFF);
- if (mIsEmergencyToneOn != EMERGENCY_TONE_OFF &&
- mCurrentEmergencyToneState == EMERGENCY_TONE_OFF) {
- if (mEmergencyTonePlayerVibrator != null) {
- mEmergencyTonePlayerVibrator.start();
- }
- }
- } else if (callState == Call.State.ACTIVE) {
- if (mCurrentEmergencyToneState != EMERGENCY_TONE_OFF) {
- if (mEmergencyTonePlayerVibrator != null) {
- mEmergencyTonePlayerVibrator.stop();
- }
- }
- }
- }
- }
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_GSM) {
- Call.State callState = mPhone.getForegroundCall().getState();
- if (!callState.isDialing()) {
- // If call get activated or disconnected before the ringback
- // tone stops, we have to stop it to prevent disturbing.
- if (mInCallRingbackTonePlayer != null) {
- mInCallRingbackTonePlayer.stopTone();
- mInCallRingbackTonePlayer = null;
- }
- }
- }
- }
-
- void updateCallNotifierRegistrationsAfterRadioTechnologyChange() {
- if (DBG) Log.d(LOG_TAG, "updateCallNotifierRegistrationsAfterRadioTechnologyChange...");
- // Unregister all events from the old obsolete phone
- mPhone.unregisterForNewRingingConnection(this);
- mPhone.unregisterForPreciseCallStateChanged(this);
- mPhone.unregisterForDisconnect(this);
- mPhone.unregisterForUnknownConnection(this);
- mPhone.unregisterForIncomingRing(this);
- mPhone.unregisterForCallWaiting(this);
- mPhone.unregisterForDisplayInfo(this);
- mPhone.unregisterForSignalInfo(this);
- mPhone.unregisterForCdmaOtaStatusChange(this);
- mPhone.unregisterForRingbackTone(this);
- mPhone.unregisterForResendIncallMute(this);
-
- // Release the ToneGenerator used for playing SignalInfo and CallWaiting
- if (mSignalInfoToneGenerator != null) {
- mSignalInfoToneGenerator.release();
- }
-
- // Clear ringback tone player
- mInCallRingbackTonePlayer = null;
-
- // Clear call waiting tone player
- mCallWaitingTonePlayer = null;
-
- mPhone.unregisterForInCallVoicePrivacyOn(this);
- mPhone.unregisterForInCallVoicePrivacyOff(this);
-
- // Register all events new to the new active phone
- mPhone.registerForNewRingingConnection(this, PHONE_NEW_RINGING_CONNECTION, null);
- mPhone.registerForPreciseCallStateChanged(this, PHONE_STATE_CHANGED, null);
- mPhone.registerForDisconnect(this, PHONE_DISCONNECT, null);
- mPhone.registerForUnknownConnection(this, PHONE_UNKNOWN_CONNECTION_APPEARED, null);
- mPhone.registerForIncomingRing(this, PHONE_INCOMING_RING, null);
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- if (DBG) log("Registering for Call Waiting, Signal and Display Info.");
- mPhone.registerForCallWaiting(this, PHONE_CDMA_CALL_WAITING, null);
- mPhone.registerForDisplayInfo(this, PHONE_STATE_DISPLAYINFO, null);
- mPhone.registerForSignalInfo(this, PHONE_STATE_SIGNALINFO, null);
- mPhone.registerForCdmaOtaStatusChange(this, EVENT_OTA_PROVISION_CHANGE, null);
-
- // Instantiate the ToneGenerator for SignalInfo
- try {
- mSignalInfoToneGenerator = new ToneGenerator(AudioManager.STREAM_VOICE_CALL,
- TONE_RELATIVE_VOLUME_SIGNALINFO);
- } catch (RuntimeException e) {
- Log.w(LOG_TAG, "CallNotifier: Exception caught while creating " +
- "mSignalInfoToneGenerator: " + e);
- mSignalInfoToneGenerator = null;
- }
-
- mPhone.registerForInCallVoicePrivacyOn(this, PHONE_ENHANCED_VP_ON, null);
- mPhone.registerForInCallVoicePrivacyOff(this, PHONE_ENHANCED_VP_OFF, null);
- }
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_GSM) {
- mPhone.registerForRingbackTone(this, PHONE_RINGBACK_TONE, null);
- mPhone.registerForResendIncallMute(this, PHONE_RESEND_MUTE, null);
- }
- }
-
- /**
- * Implemented for CallerInfoAsyncQuery.OnQueryCompleteListener interface.
- * refreshes the CallCard data when it called. If called with this
- * class itself, it is assumed that we have been waiting for the ringtone
- * and direct to voicemail settings to update.
- */
- public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
- if (cookie instanceof Long) {
- if (VDBG) log("CallerInfo query complete, posting missed call notification");
-
- NotificationMgr.getDefault().notifyMissedCall(ci.name, ci.phoneNumber,
- ci.phoneLabel, ((Long) cookie).longValue());
- } else if (cookie instanceof CallNotifier) {
- if (VDBG) log("CallerInfo query complete, updating data");
-
- // get rid of the timeout messages
- removeMessages(RINGER_CUSTOM_RINGTONE_QUERY_TIMEOUT);
-
- boolean isQueryExecutionTimeOK = false;
- synchronized (mCallerInfoQueryStateGuard) {
- if (mCallerInfoQueryState == CALLERINFO_QUERYING) {
- mCallerInfoQueryState = CALLERINFO_QUERY_READY;
- isQueryExecutionTimeOK = true;
- }
- }
- //if we're in the right state
- if (isQueryExecutionTimeOK) {
-
- // send directly to voicemail.
- if (ci.shouldSendToVoicemail) {
- if (DBG) log("send to voicemail flag detected. hanging up.");
- PhoneUtils.hangupRingingCall(mPhone);
- return;
- }
-
- // set the ringtone uri to prepare for the ring.
- if (ci.contactRingtoneUri != null) {
- if (DBG) log("custom ringtone found, setting up ringer.");
- Ringer r = ((CallNotifier) cookie).mRinger;
- r.setCustomRingtoneUri(ci.contactRingtoneUri);
- }
- // ring, and other post-ring actions.
- onCustomRingQueryComplete();
- }
- }
- }
-
- private void onDisconnect(AsyncResult r) {
- if (VDBG) log("onDisconnect()... phone state: " + mPhone.getState());
-
- mCdmaVoicePrivacyState = false;
- int autoretrySetting = 0;
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- autoretrySetting = android.provider.Settings.System.getInt(mPhone.getContext().
- getContentResolver(),android.provider.Settings.System.CALL_AUTO_RETRY, 0);
- }
-
- if (mPhone.getState() == Phone.State.IDLE) {
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_IDLE);
- }
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- // Stop any signalInfo tone being played when a call gets ended
- stopSignalInfoTone();
-
- // Resetting the CdmaPhoneCallState members
- mApplication.cdmaPhoneCallState.resetCdmaPhoneCallState();
-
- // Remove Call waiting timers
- removeMessages(CALLWAITING_CALLERINFO_DISPLAY_DONE);
- removeMessages(CALLWAITING_ADDCALL_DISABLE_TIMEOUT);
- }
-
- Connection c = (Connection) r.result;
- if (DBG && c != null) {
- log("- onDisconnect: cause = " + c.getDisconnectCause()
- + ", incoming = " + c.isIncoming()
- + ", date = " + c.getCreateTime());
- }
-
- // Stop the ringer if it was ringing (for an incoming call that
- // either disconnected by itself, or was rejected by the user.)
- //
- // TODO: We technically *shouldn't* stop the ringer if the
- // foreground or background call disconnects while an incoming call
- // is still ringing, but that's a really rare corner case.
- // It's safest to just unconditionally stop the ringer here.
-
- // CDMA: For Call collision cases i.e. when the user makes an out going call
- // and at the same time receives an Incoming Call, the Incoming Call is given
- // higher preference. At this time framework sends a disconnect for the Out going
- // call connection hence we should *not* be stopping the ringer being played for
- // the Incoming Call
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- if (mPhone.getRingingCall().getState() == Call.State.INCOMING) {
- // Also we need to take off the "In Call" icon from the Notification
- // area as the Out going Call never got connected
- if (DBG) log("cancelCallInProgressNotification()... (onDisconnect)");
- NotificationMgr.getDefault().cancelCallInProgressNotification();
- } else {
- if (DBG) log("stopRing()... (onDisconnect)");
- mRinger.stopRing();
- }
- } else { // GSM
- if (DBG) log("stopRing()... (onDisconnect)");
- mRinger.stopRing();
- }
-
- // stop call waiting tone if needed when disconnecting
- if (mCallWaitingTonePlayer != null) {
- mCallWaitingTonePlayer.stopTone();
- mCallWaitingTonePlayer = null;
- }
-
- // Check for the various tones we might need to play (thru the
- // earpiece) after a call disconnects.
- int toneToPlay = InCallTonePlayer.TONE_NONE;
-
- // The "Busy" or "Congestion" tone is the highest priority:
- if (c != null) {
- Connection.DisconnectCause cause = c.getDisconnectCause();
- if (cause == Connection.DisconnectCause.BUSY) {
- if (DBG) log("- need to play BUSY tone!");
- toneToPlay = InCallTonePlayer.TONE_BUSY;
- } else if (cause == Connection.DisconnectCause.CONGESTION) {
- if (DBG) log("- need to play CONGESTION tone!");
- toneToPlay = InCallTonePlayer.TONE_CONGESTION;
- } else if (((cause == Connection.DisconnectCause.NORMAL)
- || (cause == Connection.DisconnectCause.LOCAL))
- && (mApplication.isOtaCallInActiveState())) {
- if (DBG) log("- need to play OTA_CALL_END tone!");
- toneToPlay = InCallTonePlayer.TONE_OTA_CALL_END;
- } else if (cause == Connection.DisconnectCause.CDMA_REORDER) {
- if (DBG) log("- need to play CDMA_REORDER tone!");
- toneToPlay = InCallTonePlayer.TONE_REORDER;
- } else if (cause == Connection.DisconnectCause.CDMA_INTERCEPT) {
- if (DBG) log("- need to play CDMA_INTERCEPT tone!");
- toneToPlay = InCallTonePlayer.TONE_INTERCEPT;
- } else if (cause == Connection.DisconnectCause.CDMA_DROP) {
- if (DBG) log("- need to play CDMA_DROP tone!");
- toneToPlay = InCallTonePlayer.TONE_CDMA_DROP;
- } else if (cause == Connection.DisconnectCause.OUT_OF_SERVICE) {
- if (DBG) log("- need to play OUT OF SERVICE tone!");
- toneToPlay = InCallTonePlayer.TONE_OUT_OF_SERVICE;
- } else if (cause == Connection.DisconnectCause.ERROR_UNSPECIFIED) {
- if (DBG) log("- DisconnectCause is ERROR_UNSPECIFIED: play TONE_CALL_ENDED!");
- toneToPlay = InCallTonePlayer.TONE_CALL_ENDED;
- }
- }
-
- // If we don't need to play BUSY or CONGESTION, then play the
- // "call ended" tone if this was a "regular disconnect" (i.e. a
- // normal call where one end or the other hung up) *and* this
- // disconnect event caused the phone to become idle. (In other
- // words, we *don't* play the sound if one call hangs up but
- // there's still an active call on the other line.)
- // TODO: We may eventually want to disable this via a preference.
- if ((toneToPlay == InCallTonePlayer.TONE_NONE)
- && (mPhone.getState() == Phone.State.IDLE)
- && (c != null)) {
- Connection.DisconnectCause cause = c.getDisconnectCause();
- if ((cause == Connection.DisconnectCause.NORMAL) // remote hangup
- || (cause == Connection.DisconnectCause.LOCAL)) { // local hangup
- if (VDBG) log("- need to play CALL_ENDED tone!");
- toneToPlay = InCallTonePlayer.TONE_CALL_ENDED;
- mIsCdmaRedialCall = false;
- }
- }
-
- if (mPhone.getState() == Phone.State.IDLE) {
- // Don't reset the audio mode or bluetooth/speakerphone state
- // if we still need to let the user hear a tone through the earpiece.
- if (toneToPlay == InCallTonePlayer.TONE_NONE) {
- resetAudioStateAfterDisconnect();
- }
-
- NotificationMgr.getDefault().cancelCallInProgressNotification();
-
- // If the InCallScreen is *not* in the foreground, forcibly
- // dismiss it to make sure it won't still be in the activity
- // history. (But if it *is* in the foreground, don't mess
- // with it; it needs to be visible, displaying the "Call
- // ended" state.)
- if (!mApplication.isShowingCallScreen()) {
- if (VDBG) log("onDisconnect: force InCallScreen to finish()");
- mApplication.dismissCallScreen();
- }
- }
-
- if (c != null) {
- final String number = c.getAddress();
- final long date = c.getCreateTime();
- final long duration = c.getDurationMillis();
- final Connection.DisconnectCause cause = c.getDisconnectCause();
-
- // Set the "type" to be displayed in the call log (see constants in CallLog.Calls)
- final int callLogType;
- if (c.isIncoming()) {
- callLogType = (cause == Connection.DisconnectCause.INCOMING_MISSED ?
- Calls.MISSED_TYPE : Calls.INCOMING_TYPE);
- } else {
- callLogType = Calls.OUTGOING_TYPE;
- }
- if (VDBG) log("- callLogType: " + callLogType + ", UserData: " + c.getUserData());
-
-
- {
- final CallerInfo ci = getCallerInfoFromConnection(c); // May be null.
- final String logNumber = getLogNumber(c, ci);
-
- if (DBG) log("- onDisconnect(): logNumber set to: " + logNumber);
-
- // TODO: In getLogNumber we use the presentation from
- // the connection for the CNAP. Should we use the one
- // below instead? (comes from caller info)
-
- // For international calls, 011 needs to be logged as +
- final int presentation = getPresentation(c, ci);
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- if ((PhoneNumberUtils.isEmergencyNumber(number))
- && (mCurrentEmergencyToneState != EMERGENCY_TONE_OFF)) {
- if (mEmergencyTonePlayerVibrator != null) {
- mEmergencyTonePlayerVibrator.stop();
- }
- }
- }
-
- // To prevent accidental redial of emergency numbers
- // (carrier requirement) the quickest solution is to
- // not log the emergency number. We gate on CDMA
- // (ugly) when we actually mean carrier X.
- // TODO: Clean this up and come up with a unified strategy.
- final boolean shouldNotlogEmergencyNumber =
- (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA);
-
- // Don't call isOtaSpNumber on GSM phones.
- final boolean isOtaNumber = (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA)
- && mPhone.isOtaSpNumber(number);
- final boolean isEmergencyNumber = PhoneNumberUtils.isEmergencyNumber(number);
-
- // Don't put OTA or CDMA Emergency calls into call log
- if (!(isOtaNumber || isEmergencyNumber && shouldNotlogEmergencyNumber)) {
- CallLogAsync.AddCallArgs args =
- new CallLogAsync.AddCallArgs(
- mPhone.getContext(), ci, logNumber, presentation,
- callLogType, date, duration);
-
- mCallLog.addCall(args);
- }
- }
-
- if (callLogType == Calls.MISSED_TYPE) {
- // Show the "Missed call" notification.
- // (Note we *don't* do this if this was an incoming call that
- // the user deliberately rejected.)
- showMissedCallNotification(c, date);
- }
-
- // Possibly play a "post-disconnect tone" thru the earpiece.
- // We do this here, rather than from the InCallScreen
- // activity, since we need to do this even if you're not in
- // the Phone UI at the moment the connection ends.
- if (toneToPlay != InCallTonePlayer.TONE_NONE) {
- if (VDBG) log("- starting post-disconnect tone (" + toneToPlay + ")...");
- new InCallTonePlayer(toneToPlay).start();
-
- // TODO: alternatively, we could start an InCallTonePlayer
- // here with an "unlimited" tone length,
- // and manually stop it later when this connection truly goes
- // away. (The real connection over the network was closed as soon
- // as we got the BUSY message. But our telephony layer keeps the
- // connection open for a few extra seconds so we can show the
- // "busy" indication to the user. We could stop the busy tone
- // when *that* connection's "disconnect" event comes in.)
- }
-
- if (mPhone.getState() == Phone.State.IDLE) {
- // Release screen wake locks if the in-call screen is not
- // showing. Otherwise, let the in-call screen handle this because
- // it needs to show the call ended screen for a couple of
- // seconds.
- if (!mApplication.isShowingCallScreen()) {
- if (VDBG) log("- NOT showing in-call screen; releasing wake locks!");
- mApplication.setScreenTimeout(PhoneApp.ScreenTimeoutDuration.DEFAULT);
- mApplication.requestWakeState(PhoneApp.WakeState.SLEEP);
- } else {
- if (VDBG) log("- still showing in-call screen; not releasing wake locks.");
- }
- } else {
- if (VDBG) log("- phone still in use; not releasing wake locks.");
- }
-
- if (((mPreviousCdmaCallState == Call.State.DIALING)
- || (mPreviousCdmaCallState == Call.State.ALERTING))
- && (!PhoneNumberUtils.isEmergencyNumber(number))
- && (cause != Connection.DisconnectCause.INCOMING_MISSED )
- && (cause != Connection.DisconnectCause.NORMAL)
- && (cause != Connection.DisconnectCause.LOCAL)
- && (cause != Connection.DisconnectCause.INCOMING_REJECTED)) {
- if (!mIsCdmaRedialCall) {
- if (autoretrySetting == InCallScreen.AUTO_RETRY_ON) {
- // TODO: (Moto): The contact reference data may need to be stored and use
- // here when redialing a call. For now, pass in NULL as the URI parameter.
- PhoneUtils.placeCall(mPhone, number, null);
- mIsCdmaRedialCall = true;
- } else {
- mIsCdmaRedialCall = false;
- }
- } else {
- mIsCdmaRedialCall = false;
- }
- }
- }
- }
-
- /**
- * Resets the audio mode and speaker state when a call ends.
- */
- private void resetAudioStateAfterDisconnect() {
- if (VDBG) log("resetAudioStateAfterDisconnect()...");
-
- if (mBluetoothHandsfree != null) {
- mBluetoothHandsfree.audioOff();
- }
-
- // call turnOnSpeaker() with state=false and store=true even if speaker
- // is already off to reset user requested speaker state.
- PhoneUtils.turnOnSpeaker(mPhone.getContext(), false, true);
-
- PhoneUtils.setAudioMode(mPhone.getContext(), AudioManager.MODE_NORMAL);
- }
-
- private void onMwiChanged(boolean visible) {
- if (VDBG) log("onMwiChanged(): " + visible);
- NotificationMgr.getDefault().updateMwi(visible);
- }
-
- /**
- * Posts a delayed PHONE_MWI_CHANGED event, to schedule a "retry" for a
- * failed NotificationMgr.updateMwi() call.
- */
- /* package */ void sendMwiChangedDelayed(long delayMillis) {
- Message message = Message.obtain(this, PHONE_MWI_CHANGED);
- sendMessageDelayed(message, delayMillis);
- }
-
- private void onCfiChanged(boolean visible) {
- if (VDBG) log("onCfiChanged(): " + visible);
- NotificationMgr.getDefault().updateCfi(visible);
- }
-
- /**
- * Indicates whether or not this ringer is ringing.
- */
- boolean isRinging() {
- return mRinger.isRinging();
- }
-
- /**
- * Stops the current ring, and tells the notifier that future
- * ring requests should be ignored.
- */
- void silenceRinger() {
- mSilentRingerRequested = true;
- if (DBG) log("stopRing()... (silenceRinger)");
- mRinger.stopRing();
- }
-
- /**
- * Posts a PHONE_BATTERY_LOW event, causing us to play a warning
- * tone if the user is in-call.
- */
- /* package */ void sendBatteryLow() {
- Message message = Message.obtain(this, PHONE_BATTERY_LOW);
- sendMessage(message);
- }
-
- private void onBatteryLow() {
- if (DBG) log("onBatteryLow()...");
-
- // A "low battery" warning tone is now played by
- // StatusBarPolicy.updateBattery().
- }
-
-
- /**
- * Helper class to play tones through the earpiece (or speaker / BT)
- * during a call, using the ToneGenerator.
- *
- * To use, just instantiate a new InCallTonePlayer
- * (passing in the TONE_* constant for the tone you want)
- * and start() it.
- *
- * When we're done playing the tone, if the phone is idle at that
- * point, we'll reset the audio routing and speaker state.
- * (That means that for tones that get played *after* a call
- * disconnects, like "busy" or "congestion" or "call ended", you
- * should NOT call resetAudioStateAfterDisconnect() yourself.
- * Instead, just start the InCallTonePlayer, which will automatically
- * defer the resetAudioStateAfterDisconnect() call until the tone
- * finishes playing.)
- */
- private class InCallTonePlayer extends Thread {
- private int mToneId;
- private int mState;
- // The possible tones we can play.
- public static final int TONE_NONE = 0;
- public static final int TONE_CALL_WAITING = 1;
- public static final int TONE_BUSY = 2;
- public static final int TONE_CONGESTION = 3;
- public static final int TONE_BATTERY_LOW = 4;
- public static final int TONE_CALL_ENDED = 5;
- public static final int TONE_VOICE_PRIVACY = 6;
- public static final int TONE_REORDER = 7;
- public static final int TONE_INTERCEPT = 8;
- public static final int TONE_CDMA_DROP = 9;
- public static final int TONE_OUT_OF_SERVICE = 10;
- public static final int TONE_REDIAL = 11;
- public static final int TONE_OTA_CALL_END = 12;
- public static final int TONE_RING_BACK = 13;
-
- // The tone volume relative to other sounds in the stream
- private static final int TONE_RELATIVE_VOLUME_HIPRI = 80;
- private static final int TONE_RELATIVE_VOLUME_LOPRI = 50;
-
- // Buffer time (in msec) to add on to tone timeout value.
- // Needed mainly when the timeout value for a tone is the
- // exact duration of the tone itself.
- private static final int TONE_TIMEOUT_BUFFER = 20;
-
- // The tone state
- private static final int TONE_OFF = 0;
- private static final int TONE_ON = 1;
- private static final int TONE_STOPPED = 2;
-
- InCallTonePlayer(int toneId) {
- super();
- mToneId = toneId;
- mState = TONE_OFF;
- }
-
- @Override
- public void run() {
- if (VDBG) log("InCallTonePlayer.run(toneId = " + mToneId + ")...");
-
- int toneType = 0; // passed to ToneGenerator.startTone()
- int toneVolume; // passed to the ToneGenerator constructor
- int toneLengthMillis;
-
- switch (mToneId) {
- case TONE_CALL_WAITING:
- toneType = ToneGenerator.TONE_SUP_CALL_WAITING;
- toneVolume = TONE_RELATIVE_VOLUME_HIPRI;
- // Call waiting tone is stopped by stopTone() method
- toneLengthMillis = Integer.MAX_VALUE - TONE_TIMEOUT_BUFFER;
- break;
- case TONE_BUSY:
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- toneType = ToneGenerator.TONE_CDMA_NETWORK_BUSY_ONE_SHOT;
- toneVolume = TONE_RELATIVE_VOLUME_LOPRI;
- toneLengthMillis = 1000;
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- toneType = ToneGenerator.TONE_SUP_BUSY;
- toneVolume = TONE_RELATIVE_VOLUME_HIPRI;
- toneLengthMillis = 4000;
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- break;
- case TONE_CONGESTION:
- toneType = ToneGenerator.TONE_SUP_CONGESTION;
- toneVolume = TONE_RELATIVE_VOLUME_HIPRI;
- toneLengthMillis = 4000;
- break;
- case TONE_BATTERY_LOW:
- // For now, use ToneGenerator.TONE_PROP_ACK (two quick
- // beeps). TODO: is there some other ToneGenerator
- // tone that would be more appropriate here? Or
- // should we consider adding a new custom tone?
- toneType = ToneGenerator.TONE_PROP_ACK;
- toneVolume = TONE_RELATIVE_VOLUME_HIPRI;
- toneLengthMillis = 1000;
- break;
- case TONE_CALL_ENDED:
- toneType = ToneGenerator.TONE_PROP_PROMPT;
- toneVolume = TONE_RELATIVE_VOLUME_HIPRI;
- toneLengthMillis = 200;
- break;
- case TONE_OTA_CALL_END:
- if (mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone ==
- OtaUtils.OTA_PLAY_SUCCESS_FAILURE_TONE_ON) {
- toneType = ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD;
- toneVolume = TONE_RELATIVE_VOLUME_HIPRI;
- toneLengthMillis = 750;
- } else {
- toneType = ToneGenerator.TONE_PROP_PROMPT;
- toneVolume = TONE_RELATIVE_VOLUME_HIPRI;
- toneLengthMillis = 200;
- }
- break;
- case TONE_VOICE_PRIVACY:
- toneType = ToneGenerator.TONE_CDMA_ALERT_NETWORK_LITE;
- toneVolume = TONE_RELATIVE_VOLUME_HIPRI;
- toneLengthMillis = 5000;
- break;
- case TONE_REORDER:
- toneType = ToneGenerator.TONE_CDMA_ABBR_REORDER;
- toneVolume = TONE_RELATIVE_VOLUME_LOPRI;
- toneLengthMillis = 4000;
- break;
- case TONE_INTERCEPT:
- toneType = ToneGenerator.TONE_CDMA_ABBR_INTERCEPT;
- toneVolume = TONE_RELATIVE_VOLUME_LOPRI;
- toneLengthMillis = 500;
- break;
- case TONE_CDMA_DROP:
- case TONE_OUT_OF_SERVICE:
- toneType = ToneGenerator.TONE_CDMA_CALLDROP_LITE;
- toneVolume = TONE_RELATIVE_VOLUME_LOPRI;
- toneLengthMillis = 375;
- break;
- case TONE_REDIAL:
- toneType = ToneGenerator.TONE_CDMA_ALERT_AUTOREDIAL_LITE;
- toneVolume = TONE_RELATIVE_VOLUME_LOPRI;
- toneLengthMillis = 5000;
- break;
- case TONE_RING_BACK:
- toneType = ToneGenerator.TONE_SUP_RINGTONE;
- toneVolume = TONE_RELATIVE_VOLUME_HIPRI;
- // Call ring back tone is stopped by stopTone() method
- toneLengthMillis = Integer.MAX_VALUE - TONE_TIMEOUT_BUFFER;
- break;
- default:
- throw new IllegalArgumentException("Bad toneId: " + mToneId);
- }
-
- // If the mToneGenerator creation fails, just continue without it. It is
- // a local audio signal, and is not as important.
- ToneGenerator toneGenerator;
- try {
- int stream;
- if (mBluetoothHandsfree != null) {
- stream = mBluetoothHandsfree.isAudioOn() ? AudioManager.STREAM_BLUETOOTH_SCO:
- AudioManager.STREAM_VOICE_CALL;
- } else {
- stream = AudioManager.STREAM_VOICE_CALL;
- }
- toneGenerator = new ToneGenerator(stream, toneVolume);
- // if (DBG) log("- created toneGenerator: " + toneGenerator);
- } catch (RuntimeException e) {
- Log.w(LOG_TAG,
- "InCallTonePlayer: Exception caught while creating ToneGenerator: " + e);
- toneGenerator = null;
- }
-
- // Using the ToneGenerator (with the CALL_WAITING / BUSY /
- // CONGESTION tones at least), the ToneGenerator itself knows
- // the right pattern of tones to play; we do NOT need to
- // manually start/stop each individual tone, or manually
- // insert the correct delay between tones. (We just start it
- // and let it run for however long we want the tone pattern to
- // continue.)
- //
- // TODO: When we stop the ToneGenerator in the middle of a
- // "tone pattern", it sounds bad if we cut if off while the
- // tone is actually playing. Consider adding API to the
- // ToneGenerator to say "stop at the next silent part of the
- // pattern", or simply "play the pattern N times and then
- // stop."
- boolean needToStopTone = true;
- boolean okToPlayTone = false;
-
- if (toneGenerator != null) {
- int phoneType = mPhone.getPhoneType();
- int ringerMode = mAudioManager.getRingerMode();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- if (toneType == ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD) {
- if ((ringerMode != AudioManager.RINGER_MODE_SILENT) &&
- (ringerMode != AudioManager.RINGER_MODE_VIBRATE)) {
- if (DBG) log("- InCallTonePlayer: start playing call tone=" + toneType);
- okToPlayTone = true;
- needToStopTone = false;
- }
- } else if ((toneType == ToneGenerator.TONE_CDMA_NETWORK_BUSY_ONE_SHOT) ||
- (toneType == ToneGenerator.TONE_CDMA_ABBR_REORDER) ||
- (toneType == ToneGenerator.TONE_CDMA_ABBR_INTERCEPT) ||
- (toneType == ToneGenerator.TONE_CDMA_CALLDROP_LITE)) {
- if (ringerMode != AudioManager.RINGER_MODE_SILENT) {
- if (DBG) log("InCallTonePlayer:playing call fail tone:" + toneType);
- okToPlayTone = true;
- needToStopTone = false;
- }
- } else if ((toneType == ToneGenerator.TONE_CDMA_ALERT_AUTOREDIAL_LITE) ||
- (toneType == ToneGenerator.TONE_CDMA_ALERT_NETWORK_LITE)) {
- if ((ringerMode != AudioManager.RINGER_MODE_SILENT) &&
- (ringerMode != AudioManager.RINGER_MODE_VIBRATE)) {
- if (DBG) log("InCallTonePlayer:playing tone for toneType=" + toneType);
- okToPlayTone = true;
- needToStopTone = false;
- }
- } else { // For the rest of the tones, always OK to play.
- okToPlayTone = true;
- }
- } else { // Not "CDMA"
- okToPlayTone = true;
- }
-
- synchronized (this) {
- if (okToPlayTone && mState != TONE_STOPPED) {
- mState = TONE_ON;
- toneGenerator.startTone(toneType);
- try {
- wait(toneLengthMillis + TONE_TIMEOUT_BUFFER);
- } catch (InterruptedException e) {
- Log.w(LOG_TAG,
- "InCallTonePlayer stopped: " + e);
- }
- if (needToStopTone) {
- toneGenerator.stopTone();
- }
- }
- // if (DBG) log("- InCallTonePlayer: done playing.");
- toneGenerator.release();
- mState = TONE_OFF;
- }
- }
-
- // Finally, do the same cleanup we otherwise would have done
- // in onDisconnect().
- //
- // (But watch out: do NOT do this if the phone is in use,
- // since some of our tones get played *during* a call (like
- // CALL_WAITING and BATTERY_LOW) and we definitely *don't*
- // want to reset the audio mode / speaker / bluetooth after
- // playing those!
- // This call is really here for use with tones that get played
- // *after* a call disconnects, like "busy" or "congestion" or
- // "call ended", where the phone has already become idle but
- // we need to defer the resetAudioStateAfterDisconnect() call
- // till the tone finishes playing.)
- if (mPhone.getState() == Phone.State.IDLE) {
- resetAudioStateAfterDisconnect();
- }
- }
-
- public void stopTone() {
- synchronized (this) {
- if (mState == TONE_ON) {
- notify();
- }
- mState = TONE_STOPPED;
- }
- }
- }
-
- /**
- * Displays a notification when the phone receives a DisplayInfo record.
- */
- private void onDisplayInfo(AsyncResult r) {
- // Extract the DisplayInfo String from the message
- CdmaDisplayInfoRec displayInfoRec = (CdmaDisplayInfoRec)(r.result);
-
- if (displayInfoRec != null) {
- String displayInfo = displayInfoRec.alpha;
- if (DBG) log("onDisplayInfo: displayInfo=" + displayInfo);
- CdmaDisplayInfo.displayInfoRecord(mApplication, displayInfo);
-
- // start a 2 second timer
- sendEmptyMessageDelayed(DISPLAYINFO_NOTIFICATION_DONE,
- DISPLAYINFO_NOTIFICATION_TIME);
- }
- }
-
- /**
- * Helper class to play SignalInfo tones using the ToneGenerator.
- *
- * To use, just instantiate a new SignalInfoTonePlayer
- * (passing in the ToneID constant for the tone you want)
- * and start() it.
- */
- private class SignalInfoTonePlayer extends Thread {
- private int mToneId;
-
- SignalInfoTonePlayer(int toneId) {
- super();
- mToneId = toneId;
- }
-
- @Override
- public void run() {
- if (DBG) log("SignalInfoTonePlayer.run(toneId = " + mToneId + ")...");
-
- if (mSignalInfoToneGenerator != null) {
- //First stop any ongoing SignalInfo tone
- mSignalInfoToneGenerator.stopTone();
-
- //Start playing the new tone if its a valid tone
- mSignalInfoToneGenerator.startTone(mToneId);
- }
- }
- }
-
- /**
- * Plays a tone when the phone receives a SignalInfo record.
- */
- private void onSignalInfo(AsyncResult r) {
- if (mPhone.getRingingCall().getState() == Call.State.INCOMING) {
- // Do not start any new SignalInfo tone when Call state is INCOMING
- // and stop any previous SignalInfo tone which is being played
- stopSignalInfoTone();
- } else {
- // Extract the SignalInfo String from the message
- CdmaSignalInfoRec signalInfoRec = (CdmaSignalInfoRec)(r.result);
- // Only proceed if a Signal info is present.
- if (signalInfoRec != null) {
- boolean isPresent = signalInfoRec.isPresent;
- if (DBG) log("onSignalInfo: isPresent=" + isPresent);
- if (isPresent) {// if tone is valid
- int uSignalType = signalInfoRec.signalType;
- int uAlertPitch = signalInfoRec.alertPitch;
- int uSignal = signalInfoRec.signal;
-
- if (DBG) log("onSignalInfo: uSignalType=" + uSignalType + ", uAlertPitch=" +
- uAlertPitch + ", uSignal=" + uSignal);
- //Map the Signal to a ToneGenerator ToneID only if Signal info is present
- int toneID = SignalToneUtil.getAudioToneFromSignalInfo
- (uSignalType, uAlertPitch, uSignal);
-
- //Create the SignalInfo tone player and pass the ToneID
- new SignalInfoTonePlayer(toneID).start();
- }
- }
- }
- }
-
- /**
- * Stops a SignalInfo tone in the following condition
- * 1 - On receiving a New Ringing Call
- * 2 - On disconnecting a call
- * 3 - On answering a Call Waiting Call
- */
- /* package */ void stopSignalInfoTone() {
- if (DBG) log("stopSignalInfoTone: Stopping SignalInfo tone player");
- new SignalInfoTonePlayer(ToneGenerator.TONE_CDMA_SIGNAL_OFF).start();
- }
-
- /**
- * Plays a Call waiting tone if it is present in the second incoming call.
- */
- private void onCdmaCallWaiting(AsyncResult r) {
- // Remove any previous Call waiting timers in the queue
- removeMessages(CALLWAITING_CALLERINFO_DISPLAY_DONE);
- removeMessages(CALLWAITING_ADDCALL_DISABLE_TIMEOUT);
-
- // Set the Phone Call State to SINGLE_ACTIVE as there is only one connection
- // else we would not have received Call waiting
- mApplication.cdmaPhoneCallState.setCurrentCallState(
- CdmaPhoneCallState.PhoneCallState.SINGLE_ACTIVE);
-
- // Start the InCallScreen Activity if its not on foreground
- if (!mApplication.isShowingCallScreen()) {
- PhoneUtils.showIncomingCallUi();
- }
-
- // Start timer for CW display
- mCallWaitingTimeOut = false;
- sendEmptyMessageDelayed(CALLWAITING_CALLERINFO_DISPLAY_DONE,
- CALLWAITING_CALLERINFO_DISPLAY_TIME);
-
- // Set the mAddCallMenuStateAfterCW state to false
- mApplication.cdmaPhoneCallState.setAddCallMenuStateAfterCallWaiting(false);
-
- // Start the timer for disabling "Add Call" menu option
- sendEmptyMessageDelayed(CALLWAITING_ADDCALL_DISABLE_TIMEOUT,
- CALLWAITING_ADDCALL_DISABLE_TIME);
-
- // Extract the Call waiting information
- CdmaCallWaitingNotification infoCW = (CdmaCallWaitingNotification) r.result;
- int isPresent = infoCW.isPresent;
- if (DBG) log("onCdmaCallWaiting: isPresent=" + isPresent);
- if (isPresent == 1 ) {//'1' if tone is valid
- int uSignalType = infoCW.signalType;
- int uAlertPitch = infoCW.alertPitch;
- int uSignal = infoCW.signal;
- if (DBG) log("onCdmaCallWaiting: uSignalType=" + uSignalType + ", uAlertPitch="
- + uAlertPitch + ", uSignal=" + uSignal);
- //Map the Signal to a ToneGenerator ToneID only if Signal info is present
- int toneID =
- SignalToneUtil.getAudioToneFromSignalInfo(uSignalType, uAlertPitch, uSignal);
-
- //Create the SignalInfo tone player and pass the ToneID
- new SignalInfoTonePlayer(toneID).start();
- }
- }
-
- /**
- * Posts a event causing us to clean up after rejecting (or timing-out) a
- * CDMA call-waiting call.
- *
- * This method is safe to call from any thread.
- * @see onCdmaCallWaitingReject()
- */
- /* package */ void sendCdmaCallWaitingReject() {
- sendEmptyMessage(CDMA_CALL_WAITING_REJECT);
- }
-
- /**
- * Performs Call logging based on Timeout or Ignore Call Waiting Call for CDMA,
- * and finally calls Hangup on the Call Waiting connection.
- *
- * This method should be called only from the UI thread.
- * @see sendCdmaCallWaitingReject()
- */
- private void onCdmaCallWaitingReject() {
- final Call ringingCall = mPhone.getRingingCall();
-
- // Call waiting timeout scenario
- if (ringingCall.getState() == Call.State.WAITING) {
- // Code for perform Call logging and missed call notification
- Connection c = ringingCall.getLatestConnection();
-
- if (c != null) {
- String number = c.getAddress();
- int presentation = c.getNumberPresentation();
- final long date = c.getCreateTime();
- final long duration = c.getDurationMillis();
- final int callLogType = mCallWaitingTimeOut ?
- Calls.MISSED_TYPE : Calls.INCOMING_TYPE;
-
- // get the callerinfo object and then log the call with it.
- Object o = c.getUserData();
- final CallerInfo ci;
- if ((o == null) || (o instanceof CallerInfo)) {
- ci = (CallerInfo) o;
- } else {
- ci = ((PhoneUtils.CallerInfoToken) o).currentInfo;
- }
-
- // Do final CNAP modifications of logNumber prior to logging [mimicking
- // onDisconnect()]
- final String logNumber = PhoneUtils.modifyForSpecialCnapCases(
- mPhone.getContext(), ci, number, presentation);
- final int newPresentation = (ci != null) ? ci.numberPresentation : presentation;
- if (DBG) log("- onCdmaCallWaitingReject(): logNumber set to: " + logNumber
- + ", newPresentation value is: " + newPresentation);
-
- CallLogAsync.AddCallArgs args =
- new CallLogAsync.AddCallArgs(
- mPhone.getContext(), ci, logNumber, presentation,
- callLogType, date, duration);
-
- mCallLog.addCall(args);
-
- if (callLogType == Calls.MISSED_TYPE) {
- // Add missed call notification
- showMissedCallNotification(c, date);
- } else {
- // Remove Call waiting 20 second display timer in the queue
- removeMessages(CALLWAITING_CALLERINFO_DISPLAY_DONE);
- }
-
- // Hangup the RingingCall connection for CW
- PhoneUtils.hangup(c);
- }
-
- //Reset the mCallWaitingTimeOut boolean
- mCallWaitingTimeOut = false;
- }
- }
-
- /**
- * Return the private variable mPreviousCdmaCallState.
- */
- /* package */ Call.State getPreviousCdmaCallState() {
- return mPreviousCdmaCallState;
- }
-
- /**
- * Return the private variable mCdmaVoicePrivacyState.
- */
- /* package */ boolean getCdmaVoicePrivacyState() {
- return mCdmaVoicePrivacyState;
- }
-
- /**
- * Return the private variable mIsCdmaRedialCall.
- */
- /* package */ boolean getIsCdmaRedialCall() {
- return mIsCdmaRedialCall;
- }
-
- /**
- * Helper function used to show a missed call notification.
- */
- private void showMissedCallNotification(Connection c, final long date) {
- PhoneUtils.CallerInfoToken info =
- PhoneUtils.startGetCallerInfo(mApplication, c, this, Long.valueOf(date));
- if (info != null) {
- // at this point, we've requested to start a query, but it makes no
- // sense to log this missed call until the query comes back.
- if (VDBG) log("showMissedCallNotification: Querying for CallerInfo on missed call...");
- if (info.isFinal) {
- // it seems that the query we have actually is up to date.
- // send the notification then.
- CallerInfo ci = info.currentInfo;
-
- // Check number presentation value; if we have a non-allowed presentation,
- // then display an appropriate presentation string instead as the missed
- // call.
- String name = ci.name;
- String number = ci.phoneNumber;
- if (ci.numberPresentation == Connection.PRESENTATION_RESTRICTED) {
- name = mPhone.getContext().getString(R.string.private_num);
- } else if (ci.numberPresentation != Connection.PRESENTATION_ALLOWED) {
- name = mPhone.getContext().getString(R.string.unknown);
- } else {
- number = PhoneUtils.modifyForSpecialCnapCases(mPhone.getContext(),
- ci, number, ci.numberPresentation);
- }
- NotificationMgr.getDefault().notifyMissedCall(name, number,
- ci.phoneLabel, date);
- }
- } else {
- // getCallerInfo() can return null in rare cases, like if we weren't
- // able to get a valid phone number out of the specified Connection.
- Log.w(LOG_TAG, "showMissedCallNotification: got null CallerInfo for Connection " + c);
- }
- }
-
- /**
- * Inner class to handle emergency call tone and vibrator
- */
- private class EmergencyTonePlayerVibrator {
- private final int EMG_VIBRATE_LENGTH = 1000; // ms.
- private final int EMG_VIBRATE_PAUSE = 1000; // ms.
- private final long[] mVibratePattern =
- new long[] { EMG_VIBRATE_LENGTH, EMG_VIBRATE_PAUSE };
-
- private ToneGenerator mToneGenerator;
- private Vibrator mEmgVibrator;
-
- /**
- * constructor
- */
- public EmergencyTonePlayerVibrator() {
- }
-
- /**
- * Start the emergency tone or vibrator.
- */
- private void start() {
- if (VDBG) log("call startEmergencyToneOrVibrate.");
- int ringerMode = mAudioManager.getRingerMode();
-
- if ((mIsEmergencyToneOn == EMERGENCY_TONE_ALERT) &&
- (ringerMode == AudioManager.RINGER_MODE_NORMAL)) {
- if (VDBG) log("Play Emergency Tone.");
- mToneGenerator = new ToneGenerator (AudioManager.STREAM_VOICE_CALL,
- InCallTonePlayer.TONE_RELATIVE_VOLUME_HIPRI);
- if (mToneGenerator != null) {
- mToneGenerator.startTone(ToneGenerator.TONE_CDMA_EMERGENCY_RINGBACK);
- mCurrentEmergencyToneState = EMERGENCY_TONE_ALERT;
- }
- } else if (mIsEmergencyToneOn == EMERGENCY_TONE_VIBRATE) {
- if (VDBG) log("Play Emergency Vibrate.");
- mEmgVibrator = new Vibrator();
- if (mEmgVibrator != null) {
- mEmgVibrator.vibrate(mVibratePattern, 0);
- mCurrentEmergencyToneState = EMERGENCY_TONE_VIBRATE;
- }
- }
- }
-
- /**
- * If the emergency tone is active, stop the tone or vibrator accordingly.
- */
- private void stop() {
- if (VDBG) log("call stopEmergencyToneOrVibrate.");
-
- if ((mCurrentEmergencyToneState == EMERGENCY_TONE_ALERT)
- && (mToneGenerator != null)) {
- mToneGenerator.stopTone();
- mToneGenerator.release();
- } else if ((mCurrentEmergencyToneState == EMERGENCY_TONE_VIBRATE)
- && (mEmgVibrator != null)) {
- mEmgVibrator.cancel();
- }
- mCurrentEmergencyToneState = EMERGENCY_TONE_OFF;
- }
- }
-
- private void onRingbackTone(AsyncResult r) {
- boolean playTone = (Boolean)(r.result);
-
- if (playTone == true) {
- // Only play when foreground call is in DIALING or ALERTING.
- // to prevent a late coming playtone after ALERTING.
- // Don't play ringback tone if it is in play, otherwise it will cut
- // the current tone and replay it
- if (mPhone.getForegroundCall().getState().isDialing() &&
- mInCallRingbackTonePlayer == null) {
- mInCallRingbackTonePlayer = new InCallTonePlayer(InCallTonePlayer.TONE_RING_BACK);
- mInCallRingbackTonePlayer.start();
- }
- } else {
- if (mInCallRingbackTonePlayer != null) {
- mInCallRingbackTonePlayer.stopTone();
- mInCallRingbackTonePlayer = null;
- }
- }
- }
-
- /**
- * Toggle mute and unmute requests while keeping the same mute state
- */
- private void onResendMute() {
- boolean muteState = PhoneUtils.getMute(mPhone);
- PhoneUtils.setMuteInternal(mPhone, !muteState);
- PhoneUtils.setMuteInternal(mPhone, muteState);
- }
-
- /**
- * Retrieve the phone number from the caller info or the connection.
- *
- * For incoming call the number is in the Connection object. For
- * outgoing call we use the CallerInfo phoneNumber field if
- * present. All the processing should have been done already (CDMA vs GSM numbers).
- *
- * If CallerInfo is missing the phone number, get it from the connection.
- * Apply the Call Name Presentation (CNAP) transform in the connection on the number.
- *
- * @param conn The phone connection.
- * @param info The CallerInfo. Maybe null.
- * @return the phone number.
- */
- private String getLogNumber(Connection conn, CallerInfo callerInfo) {
- String number = null;
-
- if (conn.isIncoming()) {
- number = conn.getAddress();
- } else {
- // For emergency and voicemail calls,
- // CallerInfo.phoneNumber does *not* contain a valid phone
- // number. Instead it contains an I18N'd string such as
- // "Emergency Number" or "Voice Mail" so we get the number
- // from the connection.
- if (null == callerInfo || TextUtils.isEmpty(callerInfo.phoneNumber) ||
- callerInfo.isEmergencyNumber() || callerInfo.isVoiceMailNumber()) {
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- // In cdma getAddress() is not always equals to getOrigDialString().
- number = conn.getOrigDialString();
- } else {
- number = conn.getAddress();
- }
- } else {
- number = callerInfo.phoneNumber;
- }
- }
-
- if (null == number) {
- return null;
- } else {
- int presentation = conn.getNumberPresentation();
-
- // Do final CNAP modifications.
- number = PhoneUtils.modifyForSpecialCnapCases(mPhone.getContext(), callerInfo,
- number, presentation);
-
- // TODO: SIP: integrate this to PhoneApp later
- if (!isUri(number)) {
- number = PhoneNumberUtils.stripSeparators(number);
- } else {
- // See which one is in the contact: entire URL or username only.
- // Use that one to create the call log.
- Context context = mPhone.getContext();
- CallerInfo info = CallerInfo.getCallerInfo(context, number);
- if ((info == null) || (info.name == null)) {
- int index = number.indexOf("@");
- if (index > 0) {
- String number2 = number.substring(0, index);
- info = CallerInfo.getCallerInfo(context, number2);
- if ((info != null) && (info.name != null)) {
- number = number2;
- }
- }
- }
- }
- if (VDBG) log("getLogNumber: " + number);
- return number;
- }
- }
-
- private static boolean isUri(String number) {
- // TODO: SIP: fix this after moving isUri() to PhoneNumberUtils
- return OutgoingCallBroadcaster.isUri(number);
- }
-
- /**
- * Get the caller info.
- *
- * @param conn The phone connection.
- * @return The CallerInfo associated with the connection. Maybe null.
- */
- private CallerInfo getCallerInfoFromConnection(Connection conn) {
- CallerInfo ci = null;
- Object o = conn.getUserData();
-
- if ((o == null) || (o instanceof CallerInfo)) {
- ci = (CallerInfo) o;
- } else {
- ci = ((PhoneUtils.CallerInfoToken) o).currentInfo;
- }
- return ci;
- }
-
- /**
- * Get the presentation from the callerinfo if not null otherwise,
- * get it from the connection.
- *
- * @param conn The phone connection.
- * @param info The CallerInfo. Maybe null.
- * @return The presentation to use in the logs.
- */
- private int getPresentation(Connection conn, CallerInfo callerInfo) {
- int presentation;
-
- if (null == callerInfo) {
- presentation = conn.getNumberPresentation();
- } else {
- presentation = callerInfo.numberPresentation;
- if (DBG) log("- getPresentation(): ignoring connection's presentation: " +
- conn.getNumberPresentation());
- }
- if (DBG) log("- getPresentation: presentation: " + presentation);
- return presentation;
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/CallTime.java b/phone/src/com/android/phone2/CallTime.java
deleted file mode 100644
index 7798332..0000000
--- a/phone/src/com/android/phone2/CallTime.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.os.Debug;
-import android.os.Handler;
-import android.os.SystemClock;
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.Connection;
-import android.util.Log;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * Helper class used to keep track of various "elapsed time" indications
- * in the Phone app, and also to start and stop tracing / profiling.
- */
-public class CallTime extends Handler {
- private static final String LOG_TAG = "PHONE/CallTime";
- private static final boolean DBG = false;
- /* package */ static final boolean PROFILE = true;
-
- private static final int PROFILE_STATE_NONE = 0;
- private static final int PROFILE_STATE_READY = 1;
- private static final int PROFILE_STATE_RUNNING = 2;
-
- private static int sProfileState = PROFILE_STATE_NONE;
-
- private Call mCall;
- private long mLastReportedTime;
- private boolean mTimerRunning;
- private long mInterval;
- private PeriodicTimerCallback mTimerCallback;
- private OnTickListener mListener;
-
- interface OnTickListener {
- void onTickForCallTimeElapsed(long timeElapsed);
- }
-
- public CallTime(OnTickListener listener) {
- mListener = listener;
- mTimerCallback = new PeriodicTimerCallback();
- }
-
- /**
- * Sets the call timer to "active call" mode, where the timer will
- * periodically update the UI to show how long the specified call
- * has been active.
- *
- * After calling this you should also call reset() and
- * periodicUpdateTimer() to get the timer started.
- */
- /* package */ void setActiveCallMode(Call call) {
- if (DBG) log("setActiveCallMode(" + call + ")...");
- mCall = call;
-
- // How frequently should we update the UI?
- mInterval = 1000; // once per second
- }
-
- /* package */ void reset() {
- if (DBG) log("reset()...");
- mLastReportedTime = SystemClock.uptimeMillis() - mInterval;
- }
-
- /* package */ void periodicUpdateTimer() {
- if (!mTimerRunning) {
- mTimerRunning = true;
-
- long now = SystemClock.uptimeMillis();
- long nextReport = mLastReportedTime + mInterval;
-
- while (now >= nextReport) {
- nextReport += mInterval;
- }
-
- if (DBG) log("periodicUpdateTimer() @ " + nextReport);
- postAtTime(mTimerCallback, nextReport);
- mLastReportedTime = nextReport;
-
- if (mCall != null) {
- Call.State state = mCall.getState();
-
- if (state == Call.State.ACTIVE) {
- updateElapsedTime(mCall);
- }
- }
-
- if (PROFILE && isTraceReady()) {
- startTrace();
- }
- } else {
- if (DBG) log("periodicUpdateTimer: timer already running, bail");
- }
- }
-
- /* package */ void cancelTimer() {
- if (DBG) log("cancelTimer()...");
- removeCallbacks(mTimerCallback);
- mTimerRunning = false;
- }
-
- private void updateElapsedTime(Call call) {
- if (mListener != null) {
- long duration = getCallDuration(call);
- mListener.onTickForCallTimeElapsed(duration / 1000);
- }
- }
-
- /**
- * Returns a "call duration" value for the specified Call, in msec,
- * suitable for display in the UI.
- */
- /* package */ static long getCallDuration(Call call) {
- long duration = 0;
- List connections = call.getConnections();
- int count = connections.size();
- Connection c;
-
- if (count == 1) {
- c = (Connection) connections.get(0);
- //duration = (state == Call.State.ACTIVE
- // ? c.getDurationMillis() : c.getHoldDurationMillis());
- duration = c.getDurationMillis();
- } else {
- for (int i = 0; i < count; i++) {
- c = (Connection) connections.get(i);
- //long t = (state == Call.State.ACTIVE
- // ? c.getDurationMillis() : c.getHoldDurationMillis());
- long t = c.getDurationMillis();
- if (t > duration) {
- duration = t;
- }
- }
- }
-
- if (DBG) log("updateElapsedTime, count=" + count + ", duration=" + duration);
- return duration;
- }
-
- private static void log(String msg) {
- Log.d(LOG_TAG, "[CallTime] " + msg);
- }
-
- private class PeriodicTimerCallback implements Runnable {
- PeriodicTimerCallback() {
-
- }
-
- public void run() {
- if (PROFILE && isTraceRunning()) {
- stopTrace();
- }
-
- mTimerRunning = false;
- periodicUpdateTimer();
- }
- }
-
- static void setTraceReady() {
- if (sProfileState == PROFILE_STATE_NONE) {
- sProfileState = PROFILE_STATE_READY;
- log("trace ready...");
- } else {
- log("current trace state = " + sProfileState);
- }
- }
-
- boolean isTraceReady() {
- return sProfileState == PROFILE_STATE_READY;
- }
-
- boolean isTraceRunning() {
- return sProfileState == PROFILE_STATE_RUNNING;
- }
-
- void startTrace() {
- if (PROFILE & sProfileState == PROFILE_STATE_READY) {
- // For now, we move away from temp directory in favor of
- // the application's data directory to store the trace
- // information (/data/data/com.android.phone2).
- File file = PhoneApp.getInstance().getDir ("phoneTrace", Context.MODE_PRIVATE);
- if (file.exists() == false) {
- file.mkdirs();
- }
- String baseName = file.getPath() + File.separator + "callstate";
- String dataFile = baseName + ".data";
- String keyFile = baseName + ".key";
-
- file = new File(dataFile);
- if (file.exists() == true) {
- file.delete();
- }
-
- file = new File(keyFile);
- if (file.exists() == true) {
- file.delete();
- }
-
- sProfileState = PROFILE_STATE_RUNNING;
- log("startTrace");
- Debug.startMethodTracing(baseName, 8 * 1024 * 1024);
- }
- }
-
- void stopTrace() {
- if (PROFILE) {
- if (sProfileState == PROFILE_STATE_RUNNING) {
- sProfileState = PROFILE_STATE_NONE;
- log("stopTrace");
- Debug.stopMethodTracing();
- }
- }
- }
-}
diff --git a/phone/src/com/android/phone2/CallWaitingCheckBoxPreference.java b/phone/src/com/android/phone2/CallWaitingCheckBoxPreference.java
deleted file mode 100644
index e404ae0..0000000
--- a/phone/src/com/android/phone2/CallWaitingCheckBoxPreference.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package com.android.phone2;
-
-import static com.android.phone2.TimeConsumingPreferenceActivity.EXCEPTION_ERROR;
-import static com.android.phone2.TimeConsumingPreferenceActivity.RESPONSE_ERROR;
-import android.content.Context;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.preference.CheckBoxPreference;
-import android.util.AttributeSet;
-import android.util.Log;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-public class CallWaitingCheckBoxPreference extends CheckBoxPreference {
- private static final String LOG_TAG = "CallWaitingCheckBoxPreference";
- private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- private final MyHandler mHandler = new MyHandler();
- Phone phone;
- TimeConsumingPreferenceListener tcpListener;
-
- public CallWaitingCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- phone = SipPhoneFactory.getDefaultPhone();
- }
-
- public CallWaitingCheckBoxPreference(Context context, AttributeSet attrs) {
- this(context, attrs, com.android.internal.R.attr.checkBoxPreferenceStyle);
- }
-
- public CallWaitingCheckBoxPreference(Context context) {
- this(context, null);
- }
-
- void init(TimeConsumingPreferenceListener listener, boolean skipReading) {
- tcpListener = listener;
-
- if (!skipReading) {
- phone.getCallWaiting(mHandler.obtainMessage(MyHandler.MESSAGE_GET_CALL_WAITING,
- MyHandler.MESSAGE_GET_CALL_WAITING, MyHandler.MESSAGE_GET_CALL_WAITING));
- if (tcpListener != null) {
- tcpListener.onStarted(this, true);
- }
- }
- }
-
- @Override
- protected void onClick() {
- super.onClick();
-
- phone.setCallWaiting(isChecked(),
- mHandler.obtainMessage(MyHandler.MESSAGE_SET_CALL_WAITING));
- if (tcpListener != null) {
- tcpListener.onStarted(this, false);
- }
- }
-
- private class MyHandler extends Handler {
- private static final int MESSAGE_GET_CALL_WAITING = 0;
- private static final int MESSAGE_SET_CALL_WAITING = 1;
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_GET_CALL_WAITING:
- handleGetCallWaitingResponse(msg);
- break;
- case MESSAGE_SET_CALL_WAITING:
- handleSetCallWaitingResponse(msg);
- break;
- }
- }
-
- private void handleGetCallWaitingResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (tcpListener != null) {
- if (msg.arg2 == MESSAGE_SET_CALL_WAITING) {
- tcpListener.onFinished(CallWaitingCheckBoxPreference.this, false);
- } else {
- tcpListener.onFinished(CallWaitingCheckBoxPreference.this, true);
- }
- }
-
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "handleGetCallWaitingResponse: ar.exception=" + ar.exception);
- setEnabled(false);
- if (tcpListener != null) tcpListener.onError(CallWaitingCheckBoxPreference.this, EXCEPTION_ERROR);
- } else if (ar.userObj instanceof Throwable) {
- if (tcpListener != null) tcpListener.onError(CallWaitingCheckBoxPreference.this, RESPONSE_ERROR);
- } else {
- if (DBG) Log.d(LOG_TAG, "handleGetCallWaitingResponse: CW state successfully queried.");
- setChecked(((int[]) ar.result)[0] == 1);
- }
- }
-
- private void handleSetCallWaitingResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: ar.exception=" + ar.exception);
- //setEnabled(false);
- }
- if (DBG) Log.d(LOG_TAG, "handleSetCallWaitingResponse: re get");
-
- phone.getCallWaiting(obtainMessage(MESSAGE_GET_CALL_WAITING,
- MESSAGE_SET_CALL_WAITING, MESSAGE_SET_CALL_WAITING, ar.exception));
- }
- }
-}
diff --git a/phone/src/com/android/phone2/CarrierLogo.java b/phone/src/com/android/phone2/CarrierLogo.java
deleted file mode 100644
index cd95c6b..0000000
--- a/phone/src/com/android/phone2/CarrierLogo.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.phone2;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Utility class to look up carrier logo resource IDs.
- */
-public class CarrierLogo {
- /** This class is never instantiated. */
- private CarrierLogo() {
- }
-
- private static Map<String, Integer> sLogoMap = null;
-
- private static Map<String, Integer> getLogoMap() {
- if (sLogoMap == null) {
- sLogoMap = new HashMap<String, Integer>();
-
- // TODO: Load up sLogoMap with known carriers, like:
- // sLogoMap.put("CarrierName",
- // Integer.valueOf(R.drawable.mobile_logo_carriername));
-
- // TODO: ideally, read the mapping from a config file
- // rather than manually creating it here.
- }
-
- return sLogoMap;
- }
-
- public static int getLogo(String name) {
- Integer res = getLogoMap().get(name);
- if (res != null) {
- return res.intValue();
- }
-
- return -1;
- }
-}
diff --git a/phone/src/com/android/phone2/CdmaCallOptions.java b/phone/src/com/android/phone2/CdmaCallOptions.java
deleted file mode 100644
index 1f29ce1..0000000
--- a/phone/src/com/android/phone2/CdmaCallOptions.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.android.phone2;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-import android.content.DialogInterface;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.preference.CheckBoxPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.util.Log;
-
-public class CdmaCallOptions extends PreferenceActivity {
- private static final String LOG_TAG = "CdmaCallOptions";
- private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- private static final String BUTTON_VP_KEY = "button_voice_privacy_key";
- private CheckBoxPreference mButtonVoicePrivacy;
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.cdma_call_options);
-
- mButtonVoicePrivacy = (CheckBoxPreference) findPreference(BUTTON_VP_KEY);
- if (SipPhoneFactory.getDefaultPhone().getPhoneType() != Phone.PHONE_TYPE_CDMA) {
- //disable the entire screen
- getPreferenceScreen().setEnabled(false);
- }
- }
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- if (preference.getKey().equals(BUTTON_VP_KEY)) {
- return true;
- }
- return false;
- }
-
-}
diff --git a/phone/src/com/android/phone2/CdmaDisplayInfo.java b/phone/src/com/android/phone2/CdmaDisplayInfo.java
deleted file mode 100755
index 0d72c14..0000000
--- a/phone/src/com/android/phone2/CdmaDisplayInfo.java
+++ /dev/null
@@ -1,86 +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.phone2;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.os.SystemProperties;
-import android.util.Log;
-import android.view.WindowManager;
-
-/**
- * Helper class for displaying the DisplayInfo sent by CDMA network.
- */
-public class CdmaDisplayInfo {
- private static final String LOG_TAG = "CdmaDisplayInfo";
- private static final boolean DBG = (SystemProperties.getInt("ro.debuggable", 0) == 1);
-
- /** CDMA DisplayInfo dialog */
- private static AlertDialog sDisplayInfoDialog = null;
-
- /**
- * Handle the DisplayInfo record and display the alert dialog with
- * the network message.
- *
- * @param context context to get strings.
- * @param infoMsg Text message from Network.
- */
- public static void displayInfoRecord(Context context, String infoMsg) {
-
- if (DBG) log("displayInfoRecord: infoMsg=" + infoMsg);
-
- if (sDisplayInfoDialog != null) {
- sDisplayInfoDialog.dismiss();
- }
-
- // displaying system alert dialog on the screen instead of
- // using another activity to display the message. This
- // places the message at the forefront of the UI.
- sDisplayInfoDialog = new AlertDialog.Builder(context)
- .setIcon(android.R.drawable.ic_dialog_info)
- .setTitle(context.getText(R.string.network_message))
- .setMessage(infoMsg)
- .setCancelable(true)
- .create();
-
- sDisplayInfoDialog.getWindow().setType(
- WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
- sDisplayInfoDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-
- sDisplayInfoDialog.show();
- PhoneApp.getInstance().wakeUpScreen();
-
- }
-
- /**
- * Dismiss the DisplayInfo record
- */
- public static void dismissDisplayInfoRecord() {
-
- if (DBG) log("Dissmissing Display Info Record...");
-
- if (sDisplayInfoDialog != null) {
- sDisplayInfoDialog.dismiss();
- sDisplayInfoDialog = null;
- }
- }
-
- private static void log(String msg) {
- Log.d(LOG_TAG, "[CdmaDisplayInfo] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/CdmaOptions.java b/phone/src/com/android/phone2/CdmaOptions.java
deleted file mode 100644
index 8145345..0000000
--- a/phone/src/com/android/phone2/CdmaOptions.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.phone2;
-
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-/**
- * List of Phone-specific settings screens.
- */
-public class CdmaOptions extends PreferenceActivity {
-
- private CdmaRoamingListPreference mButtonCdmaRoam;
-
- private static final String BUTTON_CDMA_ROAMING_KEY = "cdma_roaming_mode_key";
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.cdma_options);
-
- PreferenceScreen prefSet = getPreferenceScreen();
- mButtonCdmaRoam =
- (CdmaRoamingListPreference) prefSet.findPreference(BUTTON_CDMA_ROAMING_KEY);
- if (SipPhoneFactory.getDefaultPhone().getPhoneType() != Phone.PHONE_TYPE_CDMA) {
- mButtonCdmaRoam.setEnabled(false);
- }
- }
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- if (preference.getKey().equals(BUTTON_CDMA_ROAMING_KEY)) {
- return true;
- }
- return false;
- }
-}
diff --git a/phone/src/com/android/phone2/CdmaPhoneCallState.java b/phone/src/com/android/phone2/CdmaPhoneCallState.java
deleted file mode 100755
index 3bff7bf..0000000
--- a/phone/src/com/android/phone2/CdmaPhoneCallState.java
+++ /dev/null
@@ -1,155 +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.phone2;
-
-/**
- * Class to internally keep track of Call states to maintain
- * information for Call Waiting and 3Way for CDMA instance of Phone App.
- *
- * Explanation for PhoneApp's Call states and why it is required:
- * IDLE - When no call is going on. This is just required as default state to reset the PhoneApp
- * call state to when the complete call gets disconnected
- * SINGLE_ACTIVE - When only single call is active.
- * In normal case(on a single call) this state would be similar for FW's state of ACTIVE
- * call or phone state of OFFHOOK, but in more complex conditions e.g. when phone is already
- * in a CONF_CALL state and user rejects a CW, which basically tells the PhoneApp that the
- * Call is back to a single call, the FW's state still would remain ACTIVE or OFFHOOK and
- * isGeneric would still be true. At this condition PhoneApp does need to enable the
- * "Add Call" menu item and disable the "Swap" and "Merge" options
- * THRWAY_ACTIVE - When user initiate an outgoing call when already on a call.
- * fgCall can have more than one connections from various scenarios (accepting the CW or
- * making a 3way call) but once we are in this state and one of the parties drops off,
- * when the user originates another call we need to remember this state to update the menu
- * items accordingly. FW currently does not differentiate this condition hence PhoneApp
- * needs to maintain it.
- * CONF_CALL - When the user merges two calls or on accepting the Call waiting call.
- * This is required cause even though a call might be generic but that does not mean it is
- * in conference. We can take the same example mention in the SINGLE_ACTIVE state.
- *
- * TODO: Eventually this state information should be maintained by Telephony FW.
- */
- public class CdmaPhoneCallState {
-
- /**
- * Allowable values for the PhoneCallState.
- * IDLE - When no call is going on.
- * SINGLE_ACTIVE - When only single call is active
- * THRWAY_ACTIVE - When user initiate an outgoing call when already on a call
- * CONF_CALL - When the user merges two calls or on accepting the Call waiting call
- */
- public enum PhoneCallState {
- IDLE,
- SINGLE_ACTIVE,
- THRWAY_ACTIVE,
- CONF_CALL
- }
-
- // For storing current and previous PhoneCallState's
- private PhoneCallState mPreviousCallState;
- private PhoneCallState mCurrentCallState;
-
- // Boolean to track 3Way display state
- private boolean mThreeWayCallOrigStateDialing;
-
- // Flag to indicate if the "Add Call" menu item in an InCallScreen is OK
- // to be displayed after a Call Waiting call was ignored or timed out
- private boolean mAddCallMenuStateAfterCW;
-
- /**
- * Initialize PhoneCallState related members - constructor
- */
- public void CdmaPhoneCallStateInit() {
- mCurrentCallState = PhoneCallState.IDLE;
- mPreviousCallState = PhoneCallState.IDLE;
- mThreeWayCallOrigStateDialing = false;
- mAddCallMenuStateAfterCW = true;
- }
-
- /**
- * Returns the current call state
- */
- public PhoneCallState getCurrentCallState() {
- return mCurrentCallState;
- }
-
- /**
- * Set current and previous PhoneCallState's
- */
- public void setCurrentCallState(PhoneCallState newState) {
- mPreviousCallState = mCurrentCallState;
- mCurrentCallState = newState;
-
- //Reset the 3Way display boolean
- mThreeWayCallOrigStateDialing = false;
-
- //Set mAddCallMenuStateAfterCW to true
- //if the current state is being set to SINGLE_ACTIVE
- //and previous state was IDLE as we could reach the SINGLE_ACTIVE
- //from CW ignore too. For all other cases let the timer or
- //specific calls to setAddCallMenuStateAfterCallWaiting set
- //mAddCallMenuStateAfterCW.
- if ((mCurrentCallState == PhoneCallState.SINGLE_ACTIVE)
- && (mPreviousCallState == PhoneCallState.IDLE)) {
- mAddCallMenuStateAfterCW = true;
- }
- }
-
- /**
- * Return 3Way display information
- */
- public boolean IsThreeWayCallOrigStateDialing() {
- return mThreeWayCallOrigStateDialing;
- }
-
- /**
- * Set 3Way display information
- */
- public void setThreeWayCallOrigState(boolean newState) {
- mThreeWayCallOrigStateDialing = newState;
- }
-
- /**
- * Return information for enabling/disabling "Add Call" menu item
- */
- public boolean getAddCallMenuStateAfterCallWaiting() {
- return mAddCallMenuStateAfterCW;
- }
-
- /**
- * Set mAddCallMenuStateAfterCW to enabling/disabling "Add Call" menu item
- */
- public void setAddCallMenuStateAfterCallWaiting(boolean newState) {
- mAddCallMenuStateAfterCW = newState;
- }
-
- /**
- * Return previous PhoneCallState's
- */
- public PhoneCallState getPreviousCallState() {
- return mPreviousCallState;
- }
-
- /**
- * Reset all PhoneCallState
- */
- public void resetCdmaPhoneCallState() {
- mCurrentCallState = PhoneCallState.IDLE;
- mPreviousCallState = PhoneCallState.IDLE;
- mThreeWayCallOrigStateDialing = false;
- mAddCallMenuStateAfterCW = true;
- }
- }
diff --git a/phone/src/com/android/phone2/CdmaRoamingListPreference.java b/phone/src/com/android/phone2/CdmaRoamingListPreference.java
deleted file mode 100644
index 48a795c..0000000
--- a/phone/src/com/android/phone2/CdmaRoamingListPreference.java
+++ /dev/null
@@ -1,172 +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.phone2;
-
-import android.content.Context;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.SystemProperties;
-import android.os.Handler;
-import android.os.Message;
-import android.preference.ListPreference;
-import android.provider.Settings.Secure;
-import android.util.AttributeSet;
-import android.util.Log;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import com.android.internal.telephony.TelephonyProperties;
-
-public class CdmaRoamingListPreference extends ListPreference {
-
- private static final String LOG_TAG = "CdmaRoamingListPreference";
- private static final boolean DBG = true;
-
- private Phone mPhone;
- private MyHandler mHandler = new MyHandler();;
-
- public CdmaRoamingListPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- mPhone = SipPhoneFactory.getDefaultPhone();
- mHandler = new MyHandler();
- mPhone.queryCdmaRoamingPreference(
- mHandler.obtainMessage(MyHandler.MESSAGE_GET_ROAMING_PREFERENCE));
- }
-
- public CdmaRoamingListPreference(Context context) {
- this(context, null);
- }
-
- @Override
- protected void showDialog(Bundle state) {
- if (Boolean.parseBoolean(
- SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
- // In ECM mode do not show selection options
- } else {
- super.showDialog(state);
- }
- }
-
- @Override
- protected void onDialogClosed(boolean positiveResult) {
- super.onDialogClosed(positiveResult);
-
- if (positiveResult && (getValue() != null)) {
- int buttonCdmaRoamingMode = Integer.valueOf(getValue()).intValue();
- int settingsCdmaRoamingMode =
- Secure.getInt(mPhone.getContext().getContentResolver(),
- Secure.CDMA_ROAMING_MODE, Phone.CDMA_RM_HOME);
- if (buttonCdmaRoamingMode != settingsCdmaRoamingMode) {
- int statusCdmaRoamingMode;
- switch(buttonCdmaRoamingMode) {
- case Phone.CDMA_RM_ANY:
- statusCdmaRoamingMode = Phone.CDMA_RM_ANY;
- break;
- case Phone.CDMA_RM_HOME:
- default:
- statusCdmaRoamingMode = Phone.CDMA_RM_HOME;
- }
- //Set the Settings.Secure network mode
- Secure.putInt(mPhone.getContext().getContentResolver(),
- Secure.CDMA_ROAMING_MODE,
- buttonCdmaRoamingMode );
- //Set the roaming preference mode
- mPhone.setCdmaRoamingPreference(statusCdmaRoamingMode, mHandler
- .obtainMessage(MyHandler.MESSAGE_SET_ROAMING_PREFERENCE));
- }
- } else {
- Log.d(LOG_TAG, String.format("onDialogClosed: positiveResult=%b value=%s -- do nothing",
- positiveResult, getValue()));
- }
- }
-
- private class MyHandler extends Handler {
-
- private static final int MESSAGE_GET_ROAMING_PREFERENCE = 0;
- private static final int MESSAGE_SET_ROAMING_PREFERENCE = 1;
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_GET_ROAMING_PREFERENCE:
- handleQueryCdmaRoamingPreference(msg);
- break;
-
- case MESSAGE_SET_ROAMING_PREFERENCE:
- handleSetCdmaRoamingPreference(msg);
- break;
- }
- }
-
- private void handleQueryCdmaRoamingPreference(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception == null) {
- int statusCdmaRoamingMode = ((int[])ar.result)[0];
- int settingsRoamingMode = Secure.getInt(
- mPhone.getContext().getContentResolver(),
- Secure.CDMA_ROAMING_MODE, Phone.CDMA_RM_HOME);
- //check that statusCdmaRoamingMode is from an accepted value
- if (statusCdmaRoamingMode == Phone.CDMA_RM_HOME ||
- statusCdmaRoamingMode == Phone.CDMA_RM_ANY ) {
- //check changes in statusCdmaRoamingMode and updates settingsRoamingMode
- if (statusCdmaRoamingMode != settingsRoamingMode) {
- settingsRoamingMode = statusCdmaRoamingMode;
- //changes the Settings.Secure accordingly to statusCdmaRoamingMode
- Secure.putInt(
- mPhone.getContext().getContentResolver(),
- Secure.CDMA_ROAMING_MODE,
- settingsRoamingMode );
- }
- //changes the mButtonPreferredNetworkMode accordingly to modemNetworkMode
- setValue(Integer.toString(statusCdmaRoamingMode));
- }
- else {
- if(DBG) Log.i(LOG_TAG, "reset cdma roaming mode to default" );
- resetCdmaRoamingModeToDefault();
- }
- }
- }
-
- private void handleSetCdmaRoamingPreference(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if ((ar.exception == null) && (getValue() != null)) {
- int cdmaRoamingMode = Integer.valueOf(getValue()).intValue();
- Secure.putInt(mPhone.getContext().getContentResolver(),
- Secure.CDMA_ROAMING_MODE,
- cdmaRoamingMode );
- } else {
- mPhone.queryCdmaRoamingPreference(obtainMessage(MESSAGE_GET_ROAMING_PREFERENCE));
- }
- }
-
- private void resetCdmaRoamingModeToDefault() {
- //set the mButtonCdmaRoam
- setValue(Integer.toString(Phone.CDMA_RM_HOME));
- //set the Settings.System
- Secure.putInt(mPhone.getContext().getContentResolver(),
- Secure.CDMA_ROAMING_MODE,
- Phone.CDMA_RM_HOME );
- //Set the Status
- mPhone.setCdmaRoamingPreference(Phone.CDMA_RM_HOME,
- obtainMessage(MyHandler.MESSAGE_SET_ROAMING_PREFERENCE));
- }
- }
-
-}
diff --git a/phone/src/com/android/phone2/CdmaVoicePrivacyCheckBoxPreference.java b/phone/src/com/android/phone2/CdmaVoicePrivacyCheckBoxPreference.java
deleted file mode 100644
index 51328f7..0000000
--- a/phone/src/com/android/phone2/CdmaVoicePrivacyCheckBoxPreference.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.android.phone2;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import android.content.Context;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.preference.CheckBoxPreference;
-import android.util.AttributeSet;
-import android.util.Log;
-
-public class CdmaVoicePrivacyCheckBoxPreference extends CheckBoxPreference {
- private static final String LOG_TAG = "CdmaVoicePrivacyCheckBoxPreference";
- private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- Phone phone;
- private MyHandler mHandler = new MyHandler();
-
- public CdmaVoicePrivacyCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- phone = SipPhoneFactory.getDefaultPhone();
- phone.getEnhancedVoicePrivacy(mHandler.obtainMessage(MyHandler.MESSAGE_GET_VP));
- }
-
- public CdmaVoicePrivacyCheckBoxPreference(Context context, AttributeSet attrs) {
- this(context, attrs, com.android.internal.R.attr.checkBoxPreferenceStyle);
- }
-
- public CdmaVoicePrivacyCheckBoxPreference(Context context) {
- this(context, null);
- }
-
-
- @Override
- protected void onClick() {
- super.onClick();
-
- phone.enableEnhancedVoicePrivacy(isChecked(),
- mHandler.obtainMessage(MyHandler.MESSAGE_SET_VP));
- }
-
-
-
- private class MyHandler extends Handler {
- private static final int MESSAGE_GET_VP = 0;
- private static final int MESSAGE_SET_VP = 1;
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_GET_VP:
- handleGetVPResponse(msg);
- break;
- case MESSAGE_SET_VP:
- handleSetVPResponse(msg);
- break;
- }
- }
-
- private void handleGetVPResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "handleGetVPResponse: ar.exception=" + ar.exception);
- setEnabled(false);
- } else {
- if (DBG) Log.d(LOG_TAG, "handleGetVPResponse: VP state successfully queried.");
- final int enable = ((int[]) ar.result)[0];
- setChecked(enable != 0);
-
- android.provider.Settings.Secure.putInt(getContext().getContentResolver(),
- android.provider.Settings.Secure.ENHANCED_VOICE_PRIVACY_ENABLED, enable);
- }
- }
-
- private void handleSetVPResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "handleSetVPResponse: ar.exception=" + ar.exception);
- }
- if (DBG) Log.d(LOG_TAG, "handleSetVPResponse: re get");
-
- phone.getEnhancedVoicePrivacy(obtainMessage(MESSAGE_GET_VP));
- }
- }
-}
diff --git a/phone/src/com/android/phone2/CellBroadcastSms.java b/phone/src/com/android/phone2/CellBroadcastSms.java
deleted file mode 100644
index 0f52058..0000000
--- a/phone/src/com/android/phone2/CellBroadcastSms.java
+++ /dev/null
@@ -1,670 +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.phone2;
-
-import android.os.Bundle;
-import android.preference.CheckBoxPreference;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceScreen;
-import android.preference.PreferenceActivity;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import com.android.internal.telephony.RILConstants;
-
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.util.Log;
-
-
-/**
- * List of Phone-specific settings screens.
- */
-public class CellBroadcastSms extends PreferenceActivity
- implements Preference.OnPreferenceChangeListener{
- // debug data
- private static final String LOG_TAG = "CellBroadcastSms";
- private static final boolean DBG = true;
-
- //String keys for preference lookup
- private static final String BUTTON_ENABLE_DISABLE_BC_SMS_KEY =
- "button_enable_disable_cell_bc_sms";
- private static final String LIST_LANGUAGE_KEY =
- "list_language";
- private static final String BUTTON_EMERGENCY_BROADCAST_KEY =
- "button_emergency_broadcast";
- private static final String BUTTON_ADMINISTRATIVE_KEY =
- "button_administrative";
- private static final String BUTTON_MAINTENANCE_KEY =
- "button_maintenance";
- private static final String BUTTON_LOCAL_WEATHER_KEY =
- "button_local_weather";
- private static final String BUTTON_ATR_KEY =
- "button_atr";
- private static final String BUTTON_LAFS_KEY =
- "button_lafs";
- private static final String BUTTON_RESTAURANTS_KEY =
- "button_restaurants";
- private static final String BUTTON_LODGINGS_KEY =
- "button_lodgings";
- private static final String BUTTON_RETAIL_DIRECTORY_KEY =
- "button_retail_directory";
- private static final String BUTTON_ADVERTISEMENTS_KEY =
- "button_advertisements";
- private static final String BUTTON_STOCK_QUOTES_KEY =
- "button_stock_quotes";
- private static final String BUTTON_EO_KEY =
- "button_eo";
- private static final String BUTTON_MHH_KEY =
- "button_mhh";
- private static final String BUTTON_TECHNOLOGY_NEWS_KEY =
- "button_technology_news";
- private static final String BUTTON_MULTI_CATEGORY_KEY =
- "button_multi_category";
-
- private static final String BUTTON_LOCAL_GENERAL_NEWS_KEY =
- "button_local_general_news";
- private static final String BUTTON_REGIONAL_GENERAL_NEWS_KEY =
- "button_regional_general_news";
- private static final String BUTTON_NATIONAL_GENERAL_NEWS_KEY =
- "button_national_general_news";
- private static final String BUTTON_INTERNATIONAL_GENERAL_NEWS_KEY =
- "button_international_general_news";
-
- private static final String BUTTON_LOCAL_BF_NEWS_KEY =
- "button_local_bf_news";
- private static final String BUTTON_REGIONAL_BF_NEWS_KEY =
- "button_regional_bf_news";
- private static final String BUTTON_NATIONAL_BF_NEWS_KEY =
- "button_national_bf_news";
- private static final String BUTTON_INTERNATIONAL_BF_NEWS_KEY =
- "button_international_bf_news";
-
- private static final String BUTTON_LOCAL_SPORTS_NEWS_KEY =
- "button_local_sports_news";
- private static final String BUTTON_REGIONAL_SPORTS_NEWS_KEY =
- "button_regional_sports_news";
- private static final String BUTTON_NATIONAL_SPORTS_NEWS_KEY =
- "button_national_sports_news";
- private static final String BUTTON_INTERNATIONAL_SPORTS_NEWS_KEY =
- "button_international_sports_news";
-
- private static final String BUTTON_LOCAL_ENTERTAINMENT_NEWS_KEY =
- "button_local_entertainment_news";
- private static final String BUTTON_REGIONAL_ENTERTAINMENT_NEWS_KEY =
- "button_regional_entertainment_news";
- private static final String BUTTON_NATIONAL_ENTERTAINMENT_NEWS_KEY =
- "button_national_entertainment_news";
- private static final String BUTTON_INTERNATIONAL_ENTERTAINMENT_NEWS_KEY =
- "button_international_entertainment_news";
-
- //Class constants
- //These values are related to the C structs. See the comments in method
- //setCbSmsConfig for more information.
- private static final int NO_OF_SERVICE_CATEGORIES = 31;
- private static final int NO_OF_INTS_STRUCT_1 = 3;
- private static final int MAX_LENGTH_RESULT = NO_OF_SERVICE_CATEGORIES * NO_OF_INTS_STRUCT_1 + 1;
- //Handler keys
- private static final int MESSAGE_ACTIVATE_CB_SMS = 1;
- private static final int MESSAGE_GET_CB_SMS_CONFIG = 2;
- private static final int MESSAGE_SET_CB_SMS_CONFIG = 3;
-
- //UI objects
- private CheckBoxPreference mButtonBcSms;
-
- private ListPreference mListLanguage;
-
- private CheckBoxPreference mButtonEmergencyBroadcast;
- private CheckBoxPreference mButtonAdministrative;
- private CheckBoxPreference mButtonMaintenance;
- private CheckBoxPreference mButtonLocalWeather;
- private CheckBoxPreference mButtonAtr;
- private CheckBoxPreference mButtonLafs;
- private CheckBoxPreference mButtonRestaurants;
- private CheckBoxPreference mButtonLodgings;
- private CheckBoxPreference mButtonRetailDirectory;
- private CheckBoxPreference mButtonAdvertisements;
- private CheckBoxPreference mButtonStockQuotes;
- private CheckBoxPreference mButtonEo;
- private CheckBoxPreference mButtonMhh;
- private CheckBoxPreference mButtonTechnologyNews;
- private CheckBoxPreference mButtonMultiCategory;
-
- private CheckBoxPreference mButtonLocal1;
- private CheckBoxPreference mButtonRegional1;
- private CheckBoxPreference mButtonNational1;
- private CheckBoxPreference mButtonInternational1;
-
- private CheckBoxPreference mButtonLocal2;
- private CheckBoxPreference mButtonRegional2;
- private CheckBoxPreference mButtonNational2;
- private CheckBoxPreference mButtonInternational2;
-
- private CheckBoxPreference mButtonLocal3;
- private CheckBoxPreference mButtonRegional3;
- private CheckBoxPreference mButtonNational3;
- private CheckBoxPreference mButtonInternational3;
-
- private CheckBoxPreference mButtonLocal4;
- private CheckBoxPreference mButtonRegional4;
- private CheckBoxPreference mButtonNational4;
- private CheckBoxPreference mButtonInternational4;
-
-
- //Member variables
- private Phone mPhone;
- private MyHandler mHandler;
-
- /**
- * Invoked on each preference click in this hierarchy, overrides
- * PreferenceActivity's implementation. Used to make sure we track the
- * preference click events.
- */
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
- Preference preference) {
- if (preference == mButtonBcSms) {
- if (DBG) Log.d(LOG_TAG, "onPreferenceTreeClick: preference == mButtonBcSms.");
- if(mButtonBcSms.isChecked()) {
- mPhone.activateCellBroadcastSms(RILConstants.CDMA_CELL_BROADCAST_SMS_ENABLED,
- Message.obtain(mHandler, MESSAGE_ACTIVATE_CB_SMS));
- android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.CDMA_CELL_BROADCAST_SMS,
- RILConstants.CDMA_CELL_BROADCAST_SMS_ENABLED);
- enableDisableAllCbConfigButtons(true);
- } else {
- mPhone.activateCellBroadcastSms(RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED,
- Message.obtain(mHandler, MESSAGE_ACTIVATE_CB_SMS));
- android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.CDMA_CELL_BROADCAST_SMS,
- RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
- enableDisableAllCbConfigButtons(false);
- }
- } else if (preference == mListLanguage) {
- //Do nothing here, because this click will be handled in onPreferenceChange
- } else if (preference == mButtonEmergencyBroadcast) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonEmergencyBroadcast.isChecked(), 1);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(
- mButtonEmergencyBroadcast.isChecked(), 1);
- } else if (preference == mButtonAdministrative) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonAdministrative.isChecked(), 2);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonAdministrative.isChecked(), 2);
- } else if (preference == mButtonMaintenance) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonMaintenance.isChecked(), 3);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonMaintenance.isChecked(), 3);
- } else if (preference == mButtonLocalWeather) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonLocalWeather.isChecked(), 20);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocalWeather.isChecked(), 20);
- } else if (preference == mButtonAtr) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonAtr.isChecked(), 21);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonAtr.isChecked(), 21);
- } else if (preference == mButtonLafs) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLafs.isChecked(), 22);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLafs.isChecked(), 22);
- } else if (preference == mButtonRestaurants) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonRestaurants.isChecked(), 23);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRestaurants.isChecked(), 23);
- } else if (preference == mButtonLodgings) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLodgings.isChecked(), 24);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLodgings.isChecked(), 24);
- } else if (preference == mButtonRetailDirectory) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonRetailDirectory.isChecked(), 25);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRetailDirectory.isChecked(), 25);
- } else if (preference == mButtonAdvertisements) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonAdvertisements.isChecked(), 26);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonAdvertisements.isChecked(), 26);
- } else if (preference == mButtonStockQuotes) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonStockQuotes.isChecked(), 27);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonStockQuotes.isChecked(), 27);
- } else if (preference == mButtonEo) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonEo.isChecked(), 28);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonEo.isChecked(), 28);
- } else if (preference == mButtonMhh) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonMhh.isChecked(), 29);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonMhh.isChecked(), 29);
- } else if (preference == mButtonTechnologyNews) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonTechnologyNews.isChecked(), 30);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonTechnologyNews.isChecked(), 30);
- } else if (preference == mButtonMultiCategory) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonMultiCategory.isChecked(), 31);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonMultiCategory.isChecked(), 31);
- } else if (preference == mButtonLocal1) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal1.isChecked(), 4);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal1.isChecked(), 4);
- } else if (preference == mButtonRegional1) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonRegional1.isChecked(), 5);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional1.isChecked(), 5);
- } else if (preference == mButtonNational1) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonNational1.isChecked(), 6);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational1.isChecked(), 6);
- } else if (preference == mButtonInternational1) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonInternational1.isChecked(), 7);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational1.isChecked(), 7);
- } else if (preference == mButtonLocal2) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal2.isChecked(), 8);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal2.isChecked(), 8);
- } else if (preference == mButtonRegional2) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonRegional2.isChecked(), 9);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional2.isChecked(), 9);
- } else if (preference == mButtonNational2) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonNational2.isChecked(), 10);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational2.isChecked(), 10);
- } else if (preference == mButtonInternational2) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonInternational2.isChecked(), 11);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational2.isChecked(), 11);
- } else if (preference == mButtonLocal3) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal3.isChecked(), 12);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal3.isChecked(), 12);
- } else if (preference == mButtonRegional3) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonRegional3.isChecked(), 13);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional3.isChecked(), 13);
- } else if (preference == mButtonNational3) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonNational3.isChecked(), 14);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational3.isChecked(), 14);
- } else if (preference == mButtonInternational3) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonInternational3.isChecked(), 15);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational3.isChecked(), 15);
- } else if (preference == mButtonLocal4) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(mButtonLocal4.isChecked(), 16);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonLocal4.isChecked(), 16);
- } else if (preference == mButtonRegional4) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonRegional4.isChecked(), 17);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonRegional4.isChecked(), 17);
- } else if (preference == mButtonNational4) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonNational4.isChecked(), 18);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonNational4.isChecked(), 18);
- } else if (preference == mButtonInternational4) {
- CellBroadcastSmsConfig.setConfigDataCompleteBSelected(
- mButtonInternational4.isChecked(), 19);
- CellBroadcastSmsConfig.setCbSmsBSelectedValue(mButtonInternational4.isChecked(), 19);
- } else {
- preferenceScreen.setEnabled(false);
- return false;
- }
-
- return true;
- }
-
- public boolean onPreferenceChange(Preference preference, Object objValue) {
- if (preference == mListLanguage) {
- // set the new language to the array which will be transmitted later
- CellBroadcastSmsConfig.setConfigDataCompleteLanguage(
- mListLanguage.findIndexOfValue((String) objValue) + 1);
- }
-
- // always let the preference setting proceed.
- return true;
- }
-
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.cell_broadcast_sms);
-
- mPhone = SipPhoneFactory.getDefaultPhone();
- mHandler = new MyHandler();
-
- PreferenceScreen prefSet = getPreferenceScreen();
-
- mButtonBcSms = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_ENABLE_DISABLE_BC_SMS_KEY);
- mListLanguage = (ListPreference) prefSet.findPreference(
- LIST_LANGUAGE_KEY);
- // set the listener for the language list preference
- mListLanguage.setOnPreferenceChangeListener(this);
- mButtonEmergencyBroadcast = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_EMERGENCY_BROADCAST_KEY);
- mButtonAdministrative = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_ADMINISTRATIVE_KEY);
- mButtonMaintenance = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_MAINTENANCE_KEY);
- mButtonLocalWeather = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_LOCAL_WEATHER_KEY);
- mButtonAtr = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_ATR_KEY);
- mButtonLafs = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_LAFS_KEY);
- mButtonRestaurants = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_RESTAURANTS_KEY);
- mButtonLodgings = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_LODGINGS_KEY);
- mButtonRetailDirectory = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_RETAIL_DIRECTORY_KEY);
- mButtonAdvertisements = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_ADVERTISEMENTS_KEY);
- mButtonStockQuotes = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_STOCK_QUOTES_KEY);
- mButtonEo = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_EO_KEY);
- mButtonMhh = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_MHH_KEY);
- mButtonTechnologyNews = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_TECHNOLOGY_NEWS_KEY);
- mButtonMultiCategory = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_MULTI_CATEGORY_KEY);
-
- mButtonLocal1 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_LOCAL_GENERAL_NEWS_KEY);
- mButtonRegional1 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_REGIONAL_GENERAL_NEWS_KEY);
- mButtonNational1 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_NATIONAL_GENERAL_NEWS_KEY);
- mButtonInternational1 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_INTERNATIONAL_GENERAL_NEWS_KEY);
-
- mButtonLocal2 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_LOCAL_BF_NEWS_KEY);
- mButtonRegional2 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_REGIONAL_BF_NEWS_KEY);
- mButtonNational2 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_NATIONAL_BF_NEWS_KEY);
- mButtonInternational2 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_INTERNATIONAL_BF_NEWS_KEY);
-
- mButtonLocal3 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_LOCAL_SPORTS_NEWS_KEY);
- mButtonRegional3 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_REGIONAL_SPORTS_NEWS_KEY);
- mButtonNational3 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_NATIONAL_SPORTS_NEWS_KEY);
- mButtonInternational3 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_INTERNATIONAL_SPORTS_NEWS_KEY);
-
- mButtonLocal4 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_LOCAL_ENTERTAINMENT_NEWS_KEY);
- mButtonRegional4 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_REGIONAL_ENTERTAINMENT_NEWS_KEY);
- mButtonNational4 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_NATIONAL_ENTERTAINMENT_NEWS_KEY);
- mButtonInternational4 = (CheckBoxPreference) prefSet.findPreference(
- BUTTON_INTERNATIONAL_ENTERTAINMENT_NEWS_KEY);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- getPreferenceScreen().setEnabled(true);
-
- int settingCbSms = android.provider.Settings.Secure.getInt(
- mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.CDMA_CELL_BROADCAST_SMS,
- RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
- mButtonBcSms.setChecked(settingCbSms == RILConstants.CDMA_CELL_BROADCAST_SMS_ENABLED);
-
- if(mButtonBcSms.isChecked()) {
- enableDisableAllCbConfigButtons(true);
- } else {
- enableDisableAllCbConfigButtons(false);
- }
-
- mPhone.getCellBroadcastSmsConfig(Message.obtain(mHandler, MESSAGE_GET_CB_SMS_CONFIG));
- }
-
- @Override
- protected void onPause() {
- super.onPause();
-
- CellBroadcastSmsConfig.setCbSmsNoOfStructs(NO_OF_SERVICE_CATEGORIES);
-
- mPhone.setCellBroadcastSmsConfig(CellBroadcastSmsConfig.getCbSmsAllValues(),
- Message.obtain(mHandler, MESSAGE_SET_CB_SMS_CONFIG));
- }
-
- private void enableDisableAllCbConfigButtons(boolean enable) {
- mButtonEmergencyBroadcast.setEnabled(enable);
- mListLanguage.setEnabled(enable);
- mButtonAdministrative.setEnabled(enable);
- mButtonMaintenance.setEnabled(enable);
- mButtonLocalWeather.setEnabled(enable);
- mButtonAtr.setEnabled(enable);
- mButtonLafs.setEnabled(enable);
- mButtonRestaurants.setEnabled(enable);
- mButtonLodgings.setEnabled(enable);
- mButtonRetailDirectory.setEnabled(enable);
- mButtonAdvertisements.setEnabled(enable);
- mButtonStockQuotes.setEnabled(enable);
- mButtonEo.setEnabled(enable);
- mButtonMhh.setEnabled(enable);
- mButtonTechnologyNews.setEnabled(enable);
- mButtonMultiCategory.setEnabled(enable);
-
- mButtonLocal1.setEnabled(enable);
- mButtonRegional1.setEnabled(enable);
- mButtonNational1.setEnabled(enable);
- mButtonInternational1.setEnabled(enable);
-
- mButtonLocal2.setEnabled(enable);
- mButtonRegional2.setEnabled(enable);
- mButtonNational2.setEnabled(enable);
- mButtonInternational2.setEnabled(enable);
-
- mButtonLocal3.setEnabled(enable);
- mButtonRegional3.setEnabled(enable);
- mButtonNational3.setEnabled(enable);
- mButtonInternational3.setEnabled(enable);
-
- mButtonLocal4.setEnabled(enable);
- mButtonRegional4.setEnabled(enable);
- mButtonNational4.setEnabled(enable);
- mButtonInternational4.setEnabled(enable);
- }
-
- private void setAllCbConfigButtons(int[] configArray) {
- //These buttons are in a well defined sequence. If you want to change it,
- //be sure to map the buttons to their corresponding slot in the configArray !
- mButtonEmergencyBroadcast.setChecked(configArray[1] != 0);
- //subtract 1, because the values are handled in an array which starts with 0 and not with 1
- mListLanguage.setValueIndex(CellBroadcastSmsConfig.getConfigDataLanguage() - 1);
- mButtonAdministrative.setChecked(configArray[2] != 0);
- mButtonMaintenance.setChecked(configArray[3] != 0);
- mButtonLocalWeather.setChecked(configArray[20] != 0);
- mButtonAtr.setChecked(configArray[21] != 0);
- mButtonLafs.setChecked(configArray[22] != 0);
- mButtonRestaurants.setChecked(configArray[23] != 0);
- mButtonLodgings.setChecked(configArray[24] != 0);
- mButtonRetailDirectory.setChecked(configArray[25] != 0);
- mButtonAdvertisements.setChecked(configArray[26] != 0);
- mButtonStockQuotes.setChecked(configArray[27] != 0);
- mButtonEo.setChecked(configArray[28] != 0);
- mButtonMhh.setChecked(configArray[29] != 0);
- mButtonTechnologyNews.setChecked(configArray[30] != 0);
- mButtonMultiCategory.setChecked(configArray[31] != 0);
-
- mButtonLocal1.setChecked(configArray[4] != 0);
- mButtonRegional1.setChecked(configArray[5] != 0);
- mButtonNational1.setChecked(configArray[6] != 0);
- mButtonInternational1.setChecked(configArray[7] != 0);
-
- mButtonLocal2.setChecked(configArray[8] != 0);
- mButtonRegional2.setChecked(configArray[9] != 0);
- mButtonNational2.setChecked(configArray[10] != 0);
- mButtonInternational2.setChecked(configArray[11] != 0);
-
- mButtonLocal3.setChecked(configArray[12] != 0);
- mButtonRegional3.setChecked(configArray[13] != 0);
- mButtonNational3.setChecked(configArray[14] != 0);
- mButtonInternational3.setChecked(configArray[15] != 0);
-
- mButtonLocal4.setChecked(configArray[16] != 0);
- mButtonRegional4.setChecked(configArray[17] != 0);
- mButtonNational4.setChecked(configArray[18] != 0);
- mButtonInternational4.setChecked(configArray[19] != 0);
- }
-
- private class MyHandler extends Handler {
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_ACTIVATE_CB_SMS:
- //Only a log message here, because the received response is always null
- if (DBG) Log.d(LOG_TAG, "Cell Broadcast SMS enabled/disabled.");
- break;
- case MESSAGE_GET_CB_SMS_CONFIG:
- int result[] = (int[])((AsyncResult)msg.obj).result;
-
- // check if the actual service categoties table size on the NV is '0'
- if (result[0] == 0) {
- result[0] = NO_OF_SERVICE_CATEGORIES;
-
- mButtonBcSms.setChecked(false);
- mPhone.activateCellBroadcastSms(RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED,
- Message.obtain(mHandler, MESSAGE_ACTIVATE_CB_SMS));
- android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.CDMA_CELL_BROADCAST_SMS,
- RILConstants.CDMA_CELL_BROADCAST_SMS_DISABLED);
- enableDisableAllCbConfigButtons(false);
- }
-
- CellBroadcastSmsConfig.setCbSmsConfig(result);
- setAllCbConfigButtons(CellBroadcastSmsConfig.getCbSmsBselectedValues());
-
- break;
- case MESSAGE_SET_CB_SMS_CONFIG:
- //Only a log message here, because the received response is always null
- if (DBG) Log.d(LOG_TAG, "Set Cell Broadcast SMS values.");
- break;
- default:
- Log.e(LOG_TAG, "Error! Unhandled message in CellBroadcastSms.java. Message: "
- + msg.what);
- break;
- }
- }
- }
-
- private static final class CellBroadcastSmsConfig {
-
- //The values in this array are stored in a particular order. This order
- //is calculated in the setCbSmsConfig method of this class.
- //For more information see comments below...
- //NO_OF_SERVICE_CATEGORIES +1 is used, because we will leave the first array entry 0
- private static int mBSelected[] = new int[NO_OF_SERVICE_CATEGORIES + 1];
- private static int mConfigDataComplete[] = new int[MAX_LENGTH_RESULT];
-
- private static void setCbSmsConfig(int[] configData) {
- if(configData == null) {
- Log.e(LOG_TAG, "Error! No cell broadcast service categories returned.");
- return;
- }
-
- if(configData[0] > MAX_LENGTH_RESULT) {
- Log.e(LOG_TAG, "Error! Wrong number of service categories returned from RIL");
- return;
- }
-
- //The required config values for broadcast SMS are stored in a C struct:
- //
- // typedef struct {
- // int size;
- // RIL_CDMA_BcServiceInfo *entries;
- // } RIL_CDMA_BcSMSConfig;
- //
- // typedef struct {
- // int uServiceCategory;
- // int uLanguage;
- // unsigned char bSelected;
- // } RIL_CDMA_BcServiceInfo;
- //
- // This means, that we have to ignore the first value and check every
- // 3rd value starting with the 2nd of all. This value indicates, where we
- // will store the appropriate bSelected value, which is 2 values behind it.
- for(int i = 1; i < configData.length; i += NO_OF_INTS_STRUCT_1) {
- mBSelected[configData[i]] = configData[i +2];
- }
-
- //Store all values in an extra array
- mConfigDataComplete = configData;
- }
-
- private static void setCbSmsBSelectedValue(boolean value, int pos) {
- if(pos < mBSelected.length) {
- mBSelected[pos] = (value == true ? 1 : 0);
- } else {
- Log.e(LOG_TAG,"Error! Invalid value position.");
- }
- }
-
- private static int[] getCbSmsBselectedValues() {
- return(mBSelected);
- }
-
- // TODO: Change the return value to a RIL_BroadcastSMSConfig
- private static int[] getCbSmsAllValues() {
- return(mConfigDataComplete);
- }
-
- private static void setCbSmsNoOfStructs(int value) {
- //Sets the size parameter, which contains the number of structs
- //that will be transmitted
- mConfigDataComplete[0] = value;
- }
-
- private static void setConfigDataCompleteBSelected(boolean value, int serviceCategory) {
- //Sets the bSelected value for a specific serviceCategory
- for(int i = 1; i < mConfigDataComplete.length; i += NO_OF_INTS_STRUCT_1) {
- if(mConfigDataComplete[i] == serviceCategory) {
- mConfigDataComplete[i + 2] = value == true ? 1 : 0;
- break;
- }
- }
- }
-
- private static void setConfigDataCompleteLanguage(int language) {
- //It is only possible to set the same language for all entries
- for(int i = 2; i < mConfigDataComplete.length; i += NO_OF_INTS_STRUCT_1) {
- mConfigDataComplete[i] = language;
- }
- }
-
- private static int getConfigDataLanguage() {
- int language = mConfigDataComplete[2];
- //2 is the language value of the first entry
- //It is only possible to set the same language for all entries
- if (language < 1 || language > 7) {
- Log.e(LOG_TAG, "Error! Wrong language returned from RIL...defaulting to 1, english");
- return 1;
- }
- else {
- return language;
- }
- }
- }
-}
diff --git a/phone/src/com/android/phone2/ChangeIccPinScreen.java b/phone/src/com/android/phone2/ChangeIccPinScreen.java
deleted file mode 100644
index f9d3488..0000000
--- a/phone/src/com/android/phone2/ChangeIccPinScreen.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.text.method.DigitsKeyListener;
-import android.util.Log;
-import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-/**
- * "Change ICC PIN" UI for the Phone app.
- */
-public class ChangeIccPinScreen extends Activity {
- private static final String LOG_TAG = PhoneApp.LOG_TAG;
- private static final boolean DBG = false;
-
- private static final int EVENT_PIN_CHANGED = 100;
-
- private enum EntryState {
- ES_PIN,
- ES_PUK
- }
-
- private EntryState mState;
-
- private static final int NO_ERROR = 0;
- private static final int PIN_MISMATCH = 1;
- private static final int PIN_INVALID_LENGTH = 2;
-
- private static final int MIN_PIN_LENGTH = 4;
- private static final int MAX_PIN_LENGTH = 8;
-
- private Phone mPhone;
- private boolean mChangePin2;
- private TextView mBadPinError;
- private TextView mMismatchError;
- private EditText mOldPin;
- private EditText mNewPin1;
- private EditText mNewPin2;
- private EditText mPUKCode;
- private Button mButton;
- private Button mPUKSubmit;
- private ScrollView mScrollView;
-
- private LinearLayout mIccPUKPanel;
-
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case EVENT_PIN_CHANGED:
- AsyncResult ar = (AsyncResult) msg.obj;
- handleResult(ar);
- break;
- }
-
- return;
- }
- };
-
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- mPhone = SipPhoneFactory.getDefaultPhone();
-
- resolveIntent();
-
- setContentView(R.layout.change_sim_pin_screen);
-
- mOldPin = (EditText) findViewById(R.id.old_pin);
- mOldPin.setKeyListener(DigitsKeyListener.getInstance());
- mOldPin.setMovementMethod(null);
- mOldPin.setOnClickListener(mClicked);
-
- mNewPin1 = (EditText) findViewById(R.id.new_pin1);
- mNewPin1.setKeyListener(DigitsKeyListener.getInstance());
- mNewPin1.setMovementMethod(null);
- mNewPin1.setOnClickListener(mClicked);
-
- mNewPin2 = (EditText) findViewById(R.id.new_pin2);
- mNewPin2.setKeyListener(DigitsKeyListener.getInstance());
- mNewPin2.setMovementMethod(null);
- mNewPin2.setOnClickListener(mClicked);
-
- mBadPinError = (TextView) findViewById(R.id.bad_pin);
- mMismatchError = (TextView) findViewById(R.id.mismatch);
-
- mButton = (Button) findViewById(R.id.button);
- mButton.setOnClickListener(mClicked);
-
- mScrollView = (ScrollView) findViewById(R.id.scroll);
-
- mPUKCode = (EditText) findViewById(R.id.puk_code);
- mPUKCode.setKeyListener(DigitsKeyListener.getInstance());
- mPUKCode.setMovementMethod(null);
- mPUKCode.setOnClickListener(mClicked);
-
- mPUKSubmit = (Button) findViewById(R.id.puk_submit);
- mPUKSubmit.setOnClickListener(mClicked);
-
- mIccPUKPanel = (LinearLayout) findViewById(R.id.puk_panel);
-
- int id = mChangePin2 ? R.string.change_pin2 : R.string.change_pin;
- setTitle(getResources().getText(id));
-
- mState = EntryState.ES_PIN;
- }
-
- private void resolveIntent() {
- Intent intent = getIntent();
- mChangePin2 = intent.getBooleanExtra("pin2", mChangePin2);
- }
-
- private void reset() {
- mScrollView.scrollTo(0, 0);
- mBadPinError.setVisibility(View.GONE);
- mMismatchError.setVisibility(View.GONE);
- }
-
- private int validateNewPin(String p1, String p2) {
- if (p1 == null) {
- return PIN_INVALID_LENGTH;
- }
-
- if (!p1.equals(p2)) {
- return PIN_MISMATCH;
- }
-
- int len1 = p1.length();
-
- if (len1 < MIN_PIN_LENGTH || len1 > MAX_PIN_LENGTH) {
- return PIN_INVALID_LENGTH;
- }
-
- return NO_ERROR;
- }
-
- private View.OnClickListener mClicked = new View.OnClickListener() {
- public void onClick(View v) {
- if (v == mOldPin) {
- mNewPin1.requestFocus();
- } else if (v == mNewPin1) {
- mNewPin2.requestFocus();
- } else if (v == mNewPin2) {
- mButton.requestFocus();
- } else if (v == mButton) {
- IccCard iccCardInterface = mPhone.getIccCard();
- if (iccCardInterface != null) {
- String oldPin = mOldPin.getText().toString();
- String newPin1 = mNewPin1.getText().toString();
- String newPin2 = mNewPin2.getText().toString();
-
- int error = validateNewPin(newPin1, newPin2);
-
- switch (error) {
- case PIN_INVALID_LENGTH:
- case PIN_MISMATCH:
- mNewPin1.getText().clear();
- mNewPin2.getText().clear();
- mMismatchError.setVisibility(View.VISIBLE);
-
- Resources r = getResources();
- CharSequence text;
-
- if (error == PIN_MISMATCH) {
- text = r.getString(R.string.mismatchPin);
- } else {
- text = r.getString(R.string.invalidPin);
- }
-
- mMismatchError.setText(text);
- break;
-
- default:
- Message callBack = Message.obtain(mHandler,
- EVENT_PIN_CHANGED);
-
- if (DBG) log("change pin attempt: old=" + oldPin +
- ", newPin=" + newPin1);
-
- reset();
-
- if (mChangePin2) {
- iccCardInterface.changeIccFdnPassword(oldPin,
- newPin1, callBack);
- } else {
- iccCardInterface.changeIccLockPassword(oldPin,
- newPin1, callBack);
- }
-
- // TODO: show progress panel
- }
- }
- } else if (v == mPUKCode) {
- mPUKSubmit.requestFocus();
- } else if (v == mPUKSubmit) {
- mPhone.getIccCard().supplyPuk2(mPUKCode.getText().toString(),
- mNewPin1.getText().toString(),
- Message.obtain(mHandler, EVENT_PIN_CHANGED));
- }
- }
- };
-
- private void handleResult(AsyncResult ar) {
- if (ar.exception == null) {
- if (DBG) log("handleResult: success!");
-
- if (mState == EntryState.ES_PUK) {
- mScrollView.setVisibility(View.VISIBLE);
- mIccPUKPanel.setVisibility(View.GONE);
- }
- // TODO: show success feedback
- showConfirmation();
-
- mHandler.postDelayed(new Runnable() {
- public void run() {
- finish();
- }
- }, 3000);
-
- } else if (ar.exception instanceof CommandException
- /* && ((CommandException)ar.exception).getCommandError() ==
- CommandException.Error.PASSWORD_INCORRECT */ ) {
- if (mState == EntryState.ES_PIN) {
- if (DBG) log("handleResult: pin failed!");
- mOldPin.getText().clear();
- mBadPinError.setVisibility(View.VISIBLE);
- CommandException ce = (CommandException) ar.exception;
- if (ce.getCommandError() == CommandException.Error.SIM_PUK2) {
- if (DBG) log("handleResult: puk requested!");
- mState = EntryState.ES_PUK;
- displayPUKAlert();
- mScrollView.setVisibility(View.GONE);
- mIccPUKPanel.setVisibility(View.VISIBLE);
- mPUKCode.requestFocus();
- }
- } else if (mState == EntryState.ES_PUK) {
- //should really check to see if the error is CommandException.PASSWORD_INCORRECT...
- if (DBG) log("handleResult: puk2 failed!");
- displayPUKAlert();
- mPUKCode.getText().clear();
- mPUKCode.requestFocus();
- }
- }
- }
-
- private AlertDialog mPUKAlert;
- private void displayPUKAlert () {
- if (mPUKAlert == null) {
- mPUKAlert = new AlertDialog.Builder(this)
- .setMessage (R.string.puk_requested)
- .setCancelable(false)
- .show();
- } else {
- mPUKAlert.show();
- }
- //TODO: The 3 second delay here is somewhat arbitrary, reflecting the values
- //used elsewhere for similar code. This should get revisited with the framework
- //crew to see if there is some standard we should adhere to.
- mHandler.postDelayed(new Runnable() {
- public void run() {
- mPUKAlert.dismiss();
- }
- }, 3000);
- }
-
- private void showConfirmation() {
- int id = mChangePin2 ? R.string.pin2_changed : R.string.pin_changed;
- Toast.makeText(this, id, Toast.LENGTH_SHORT).show();
- }
-
- private void log(String msg) {
- String prefix = mChangePin2 ? "[ChgPin2]" : "[ChgPin]";
- Log.d(LOG_TAG, prefix + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/DTMFTwelveKeyDialer.java b/phone/src/com/android/phone2/DTMFTwelveKeyDialer.java
deleted file mode 100755
index da2313b..0000000
--- a/phone/src/com/android/phone2/DTMFTwelveKeyDialer.java
+++ /dev/null
@@ -1,1078 +0,0 @@
-/*
- * 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.phone2;
-
-import android.media.AudioManager;
-import android.media.ToneGenerator;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemProperties;
-import android.provider.Settings;
-import android.telephony.PhoneNumberUtils;
-import android.text.Editable;
-import android.text.Spannable;
-import android.text.method.DialerKeyListener;
-import android.text.method.MovementMethod;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.EditText;
-import android.widget.SlidingDrawer;
-import android.widget.TextView;
-
-import com.android.internal.telephony.Phone;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Queue;
-
-
-/**
- * Dialer class that encapsulates the DTMF twelve key behaviour.
- * This model backs up the UI behaviour in DTMFTwelveKeyDialerView.java.
- */
-public class DTMFTwelveKeyDialer implements
- SlidingDrawer.OnDrawerOpenListener,
- SlidingDrawer.OnDrawerCloseListener,
- View.OnTouchListener,
- View.OnKeyListener {
- private static final String LOG_TAG = "DTMFTwelveKeyDialer";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- // events
- private static final int PHONE_DISCONNECT = 100;
- private static final int DTMF_SEND_CNF = 101;
-
- private Phone mPhone;
- private ToneGenerator mToneGenerator;
- private Object mToneGeneratorLock = new Object();
-
- // indicate if we want to enable the DTMF tone playback.
- private boolean mDTMFToneEnabled;
-
- // DTMF tone type
- private int mDTMFToneType;
-
- // indicate if the confirmation from TelephonyFW is pending.
- private boolean mDTMFBurstCnfPending = false;
-
- // Queue to queue the short dtmf characters.
- private Queue<Character> mDTMFQueue = new LinkedList<Character>();
-
- // Short Dtmf tone duration
- private static final int DTMF_DURATION_MS = 120;
-
-
- /** Hash Map to map a character to a tone*/
- private static final HashMap<Character, Integer> mToneMap =
- new HashMap<Character, Integer>();
- /** Hash Map to map a view id to a character*/
- private static final HashMap<Integer, Character> mDisplayMap =
- new HashMap<Integer, Character>();
- /** Set up the static maps*/
- static {
- // Map the key characters to tones
- mToneMap.put('1', ToneGenerator.TONE_DTMF_1);
- mToneMap.put('2', ToneGenerator.TONE_DTMF_2);
- mToneMap.put('3', ToneGenerator.TONE_DTMF_3);
- mToneMap.put('4', ToneGenerator.TONE_DTMF_4);
- mToneMap.put('5', ToneGenerator.TONE_DTMF_5);
- mToneMap.put('6', ToneGenerator.TONE_DTMF_6);
- mToneMap.put('7', ToneGenerator.TONE_DTMF_7);
- mToneMap.put('8', ToneGenerator.TONE_DTMF_8);
- mToneMap.put('9', ToneGenerator.TONE_DTMF_9);
- mToneMap.put('0', ToneGenerator.TONE_DTMF_0);
- mToneMap.put('#', ToneGenerator.TONE_DTMF_P);
- mToneMap.put('*', ToneGenerator.TONE_DTMF_S);
-
- // 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, '*');
- }
-
- // EditText field used to display the DTMF digits sent so far.
- // Note this is null in some modes (like during the CDMA OTA call,
- // where there's no onscreen "digits" display.)
- private EditText mDialpadDigits;
-
- // InCallScreen reference.
- private InCallScreen mInCallScreen;
-
- // The SlidingDrawer containing mDialerView, or null if the current UI
- // doesn't use a SlidingDrawer.
- private SlidingDrawer mDialerDrawer;
-
- // The DTMFTwelveKeyDialerView we use to display the dialpad.
- private DTMFTwelveKeyDialerView mDialerView;
-
- // KeyListener used with the "dialpad digits" EditText widget.
- private DTMFKeyListener mDialerKeyListener;
-
- /**
- * Create an input method just so that the textview can display the cursor.
- * There is no selecting / positioning on the dialer field, only number input.
- */
- private static class DTMFDisplayMovementMethod implements MovementMethod {
-
- /**Return false since we are NOT consuming the input.*/
- public boolean onKeyDown(TextView widget, Spannable buffer, int keyCode, KeyEvent event) {
- return false;
- }
-
- /**Return false since we are NOT consuming the input.*/
- public boolean onKeyUp(TextView widget, Spannable buffer, int keyCode, KeyEvent event) {
- return false;
- }
-
- /**Return false since we are NOT consuming the input.*/
- public boolean onKeyOther(TextView view, Spannable text, KeyEvent event) {
- return false;
- }
-
- /**Return false since we are NOT consuming the input.*/
- public boolean onTrackballEvent(TextView widget, Spannable buffer, MotionEvent event) {
- return false;
- }
-
- /**Return false since we are NOT consuming the input.*/
- public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
- return false;
- }
-
- public void initialize(TextView widget, Spannable text) {
- }
-
- public void onTakeFocus(TextView view, Spannable text, int dir) {
- }
-
- /**Disallow arbitrary selection.*/
- public boolean canSelectArbitrarily() {
- return false;
- }
- }
-
- /**
- * 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) {
- if (DBG) log("DTMFKeyListener reading '" + c + "' from input.");
- processDtmf(c);
- } else if (DBG) {
- log("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) {
- if (DBG) log("Stopping the tone for '" + c + "'");
- stopTone();
- return true;
- }
-
- return false;
- }
-
- /**
- * Handle individual keydown events when we DO NOT have an Editable handy.
- */
- public boolean onKeyDown(KeyEvent event) {
- char c = lookup(event);
- if (DBG) log("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)) {
- if (DBG) log("DTMFKeyListener reading '" + c + "' from input.");
- processDtmf(c);
- return true;
- } else if (DBG) {
- log("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);
- if (DBG) log("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)) {
- if (DBG) log("Stopping the tone for '" + c + "'");
- stopTone();
- return true;
- }
-
- return false;
- }
-
- /**
- * Find the Dialer Key mapped to this event.
- *
- * @return The char value of the input event, otherwise
- * 0 if no matching character was found.
- */
- private char lookup(KeyEvent event) {
- // This code is similar to {@link DialerKeyListener#lookup(KeyEvent, Spannable) lookup}
- int meta = event.getMetaState();
- int number = event.getNumber();
-
- if (!((meta & (KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON)) == 0) || (number == 0)) {
- int match = event.getMatch(getAcceptedChars(), meta);
- number = (match != 0) ? match : number;
- }
-
- return (char) number;
- }
-
- /**
- * Check to see if the keyEvent is dialable.
- */
- boolean isKeyEventAcceptable (KeyEvent event) {
- return (ok(getAcceptedChars(), lookup(event)));
- }
-
- /**
- * Overrides the characters used in {@link DialerKeyListener#CHARACTERS}
- * These are the valid dtmf characters.
- */
- public final char[] DTMF_CHARACTERS = new char[] {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '#', '*'
- };
- }
-
- /**
- * Our own handler to take care of the messages from the phone state changes
- */
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- // disconnect action
- // make sure to close the dialer on ALL disconnect actions.
- case PHONE_DISCONNECT:
- if (DBG) log("disconnect message recieved, shutting down.");
- // unregister since we are closing.
- mPhone.unregisterForDisconnect(this);
- closeDialer(false);
- break;
- case DTMF_SEND_CNF:
- if (DBG) log("dtmf confirmation received from FW.");
- // handle burst dtmf confirmation
- handleBurstDtmfConfirmation();
- break;
- }
- }
- };
-
-
- /**
- * DTMFTwelveKeyDialer constructor.
- *
- * @param parent the InCallScreen instance that owns us.
- * @param dialerView the DTMFTwelveKeyDialerView we should use to display the dialpad.
- * @param dialerDrawer the SlidingDrawer widget that contains dialerView, or
- * null if this device doesn't use a SlidingDrawer
- * as a container for the dialpad.
- */
- public DTMFTwelveKeyDialer(InCallScreen parent,
- DTMFTwelveKeyDialerView dialerView,
- SlidingDrawer dialerDrawer) {
- if (DBG) log("DTMFTwelveKeyDialer constructor... this = " + this);
-
- mInCallScreen = parent;
- mPhone = PhoneApp.getInstance().phone;
-
- // The passed-in DTMFTwelveKeyDialerView *should* always be
- // non-null, now that the in-call UI uses only portrait mode.
- if (dialerView == null) {
- Log.e(LOG_TAG, "DTMFTwelveKeyDialer: null dialerView!", new IllegalStateException());
- // ...continue as best we can, although things will
- // be pretty broken without the mDialerView UI elements!
- }
- mDialerView = dialerView;
- if (DBG) log("- Got passed-in mDialerView: " + mDialerView);
-
- mDialerDrawer = dialerDrawer;
- if (DBG) log("- Got passed-in mDialerDrawer: " + mDialerDrawer);
-
- if (mDialerView != null) {
- mDialerView.setDialer(this);
-
- // In the normal in-call DTMF dialpad, mDialpadDigits is an
- // EditText used to display the digits the user has typed so
- // far. But some other modes (like the OTA call) have no
- // "digits" display at all, in which case mDialpadDigits will
- // be null.
- mDialpadDigits = (EditText) mDialerView.findViewById(R.id.dtmfDialerField);
- if (mDialpadDigits != null) {
- mDialerKeyListener = new DTMFKeyListener();
- mDialpadDigits.setKeyListener(mDialerKeyListener);
-
- // remove the long-press context menus that support
- // the edit (copy / paste / select) functions.
- mDialpadDigits.setLongClickable(false);
-
- // TODO: may also want this at some point:
- // mDialpadDigits.setMovementMethod(new DTMFDisplayMovementMethod());
- }
-
- // Hook up touch / key listeners for the buttons in the onscreen
- // keypad.
- setupKeypad(mDialerView);
- }
-
- if (mDialerDrawer != null) {
- mDialerDrawer.setOnDrawerOpenListener(this);
- mDialerDrawer.setOnDrawerCloseListener(this);
- }
-
- }
-
- /**
- * Null out our reference to the InCallScreen activity.
- * This indicates that the InCallScreen activity has been destroyed.
- * At the same time, get rid of listeners since we're not going to
- * be valid anymore.
- */
- /* package */ void clearInCallScreenReference() {
- if (DBG) log("clearInCallScreenReference()...");
- mInCallScreen = null;
- mDialerKeyListener = null;
- if (mDialerDrawer != null) {
- mDialerDrawer.setOnDrawerOpenListener(null);
- mDialerDrawer.setOnDrawerCloseListener(null);
- }
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- mHandler.removeMessages(DTMF_SEND_CNF);
- synchronized (mDTMFQueue) {
- mDTMFBurstCnfPending = false;
- mDTMFQueue.clear();
- }
- }
- closeDialer(false);
- }
-
- /**
- * Dialer code that runs when the dialer is brought up.
- * This includes layout changes, etc, and just prepares the dialer model for use.
- */
- private void onDialerOpen() {
- if (DBG) log("onDialerOpen()...");
-
- // Any time the dialer is open, listen for "disconnect" events (so
- // we can close ourself.)
- mPhone.registerForDisconnect(mHandler, PHONE_DISCONNECT, null);
-
- // On some devices the screen timeout is set to a special value
- // while the dialpad is up.
- PhoneApp.getInstance().updateWakeState();
-
- // Give the InCallScreen a chance to do any necessary UI updates.
- mInCallScreen.onDialerOpen();
- }
-
- /**
- * Allocates some resources we keep around during a "dialer session".
- *
- * (Currently, a "dialer session" just means any situation where we
- * might need to play local DTMF tones, which means that we need to
- * keep a ToneGenerator instance around. A ToneGenerator instance
- * keeps an AudioTrack resource busy in AudioFlinger, so we don't want
- * to keep it around forever.)
- *
- * Call {@link stopDialerSession} to release the dialer session
- * resources.
- */
- public void startDialerSession() {
- if (DBG) log("startDialerSession()... this = " + this);
-
- // see if we need to play local tones.
- if (mPhone.getContext().getResources().getBoolean(R.bool.allow_local_dtmf_tones)) {
- mDTMFToneEnabled = Settings.System.getInt(mInCallScreen.getContentResolver(),
- Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1;
- } else {
- mDTMFToneEnabled = false;
- }
- if (DBG) log("- startDialerSession: mDTMFToneEnabled = " + mDTMFToneEnabled);
-
- // create the tone generator
- // if the mToneGenerator creation fails, just continue without it. It is
- // a local audio signal, and is not as important as the dtmf tone itself.
- if (mDTMFToneEnabled) {
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator == null) {
- try {
- mToneGenerator = new ToneGenerator(AudioManager.STREAM_DTMF, 80);
- } catch (RuntimeException e) {
- if (DBG) log("Exception caught while creating local tone generator: " + e);
- mToneGenerator = null;
- }
- }
- }
- }
- }
-
- /**
- * Dialer code that runs when the dialer is closed.
- * This releases resources acquired when we start the dialer.
- */
- private void onDialerClose() {
- if (DBG) log("onDialerClose()...");
-
- // reset back to a short delay for the poke lock.
- PhoneApp app = PhoneApp.getInstance();
- app.updateWakeState();
-
- mPhone.unregisterForDisconnect(mHandler);
-
- // Give the InCallScreen a chance to do any necessary UI updates.
- if (mInCallScreen != null) {
- mInCallScreen.onDialerClose();
- }
- }
-
- /**
- * Releases resources we keep around during a "dialer session"
- * (see {@link startDialerSession}).
- *
- * It's safe to call this even without a corresponding
- * startDialerSession call.
- */
- public void stopDialerSession() {
- // release the tone generator.
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator != null) {
- mToneGenerator.release();
- mToneGenerator = null;
- }
- }
- }
-
- /**
- * Called externally (from InCallScreen) to play a DTMF Tone.
- */
- public boolean onDialerKeyDown(KeyEvent event) {
- if (DBG) log("Notifying dtmf key down.");
- return mDialerKeyListener.onKeyDown(event);
- }
-
- /**
- * Called externally (from InCallScreen) to cancel the last DTMF Tone played.
- */
- public boolean onDialerKeyUp(KeyEvent event) {
- if (DBG) log("Notifying dtmf key up.");
- return mDialerKeyListener.onKeyUp(event);
- }
-
- /**
- * setup the keys on the dialer activity, using the keymaps.
- */
- private void setupKeypad(DTMFTwelveKeyDialerView dialerView) {
- // for each view id listed in the displaymap
- View button;
- for (int viewId : mDisplayMap.keySet()) {
- // locate the view
- button = dialerView.findViewById(viewId);
- // Setup the listeners for the buttons
- button.setOnTouchListener(this);
- button.setClickable(true);
- button.setOnKeyListener(this);
- }
- }
-
- /**
- * catch the back and call buttons to return to the in call activity.
- */
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- // if (DBG) log("onKeyDown: keyCode " + keyCode);
- switch (keyCode) {
- // finish for these events
- case KeyEvent.KEYCODE_BACK:
- case KeyEvent.KEYCODE_CALL:
- if (DBG) log("exit requested");
- closeDialer(true); // do the "closing" animation
- return true;
- }
- return mInCallScreen.onKeyDown(keyCode, event);
- }
-
- /**
- * catch the back and call buttons to return to the in call activity.
- */
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- // if (DBG) log("onKeyUp: keyCode " + keyCode);
- return mInCallScreen.onKeyUp(keyCode, event);
- }
-
- /**
- * Implemented for the TouchListener, process the touch events.
- */
- public boolean onTouch(View v, MotionEvent event) {
- 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
- processDtmf(mDisplayMap.get(viewId));
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- // stop the tone on ANY other event, except for MOVE.
- stopTone();
- break;
- }
- // do not return true [handled] here, since we want the
- // press / click animation to be handled by the framework.
- }
- return false;
- }
-
- /**
- * Implements View.OnKeyListener for the DTMF buttons. Enables dialing with trackball/dpad.
- */
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- // if (DBG) log("onKey: keyCode " + keyCode + ", view " + v);
-
- if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
- int viewId = v.getId();
- if (mDisplayMap.containsKey(viewId)) {
- switch (event.getAction()) {
- case KeyEvent.ACTION_DOWN:
- if (event.getRepeatCount() == 0) {
- processDtmf(mDisplayMap.get(viewId));
- }
- break;
- case KeyEvent.ACTION_UP:
- stopTone();
- break;
- }
- // do not return true [handled] here, since we want the
- // press / click animation to be handled by the framework.
- }
- }
- return false;
- }
-
- /**
- * @return true if the dialer is currently visible onscreen.
- */
- // TODO: clean up naming inconsistency of "opened" vs. "visible".
- // This should be called isVisible(), and open/closeDialer() should
- // be "show" and "hide".
- public boolean isOpened() {
- if (mDialerDrawer != null) {
- // If we're using a SlidingDrawer, report whether or not the
- // drawer is open.
- return mDialerDrawer.isOpened();
- } else {
- // Otherwise, return whether or not the dialer view is visible.
- return mDialerView.getVisibility() == View.VISIBLE;
- }
- }
-
- /**
- * @return true if we're using the style of dialpad that's contained
- * within a SlidingDrawer.
- */
- public boolean usingSlidingDrawer() {
- return (mDialerDrawer != null);
- }
-
- /**
- * Forces the dialer into the "open" state.
- * Does nothing if the dialer is already open.
- *
- * @param animate if true, open the dialer with an animation.
- */
- public void openDialer(boolean animate) {
- if (DBG) log("openDialer()...");
-
- if (!isOpened()) {
- if (mDialerDrawer != null) {
- // If we're using a SlidingDrawer, open the drawer.
- if (animate) {
- mDialerDrawer.animateToggle();
- } else {
- mDialerDrawer.toggle();
- }
- } else {
- // If we're not using a SlidingDrawer, just make
- // the dialer view visible.
- // TODO: add a fade-in animation if "animate" is true?
- mDialerView.setVisibility(View.VISIBLE);
-
- // And since we're not using a SlidingDrawer, we won't get an
- // onDrawerOpened() event, so we have to to manually trigger
- // an onDialerOpen() call.
- onDialerOpen();
- }
- }
- }
-
- /**
- * Forces the dialer into the "closed" state.
- * Does nothing if the dialer is already closed.
- *
- * @param animate if true, close the dialer with an animation.
- */
- public void closeDialer(boolean animate) {
- if (DBG) log("closeDialer()...");
-
- if (isOpened()) {
- if (mDialerDrawer != null) {
- // If we're using a SlidingDrawer, close the drawer.
- if (animate) {
- mDialerDrawer.animateToggle();
- } else {
- mDialerDrawer.toggle();
- }
- } else {
- // If we're not using a SlidingDrawer, just hide
- // the dialer view.
- // TODO: add a fade-out animation if "animate" is true?
- mDialerView.setVisibility(View.GONE);
-
- // And since we're not using a SlidingDrawer, we won't get an
- // onDrawerClosed() event, so we have to to manually trigger
- // an onDialerClose() call.
- onDialerClose();
- }
- }
- }
-
- /**
- * Sets the visibility of the dialpad's onscreen "handle".
- * This has no effect on platforms that don't use
- * a SlidingDrawer as a container for the dialpad.
- */
- public void setHandleVisible(boolean visible) {
- if (mDialerDrawer != null) {
- mDialerDrawer.setVisibility(visible ? View.VISIBLE : View.GONE);
- }
- }
-
- /**
- * Implemented for the SlidingDrawer open listener, prepare the dialer.
- */
- public void onDrawerOpened() {
- onDialerOpen();
- }
-
- /**
- * Implemented for the SlidingDrawer close listener, release the dialer.
- */
- public void onDrawerClosed() {
- onDialerClose();
- }
-
- /**
- * 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.
- */
- private final void processDtmf(char c) {
- // if it is a valid key, then update the display and send the dtmf tone.
- if (PhoneNumberUtils.is12Key(c)) {
- if (DBG) log("updating display and sending dtmf tone for '" + c + "'");
-
- // Append this key to the "digits" widget.
- if (mDialpadDigits != 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.)
- mDialpadDigits.getText().append(c);
- }
-
- // Play the tone if it exists.
- if (mToneMap.containsKey(c)) {
- // begin tone playback.
- startTone(c);
- }
- } else if (DBG) {
- log("ignoring dtmf request for '" + c + "'");
- }
-
- // Any DTMF keypress counts as explicit "user activity".
- PhoneApp.getInstance().pokeUserActivity();
- }
-
- /**
- * Clears out the display of "DTMF digits typed so far" that's kept in
- * mDialpadDigits.
- *
- * The InCallScreen is responsible for calling this method any time a
- * new call becomes active (or, more simply, any time a call ends).
- * This is how we make sure that the "history" of DTMF digits you type
- * doesn't persist from one call to the next.
- *
- * TODO: it might be more elegent if the dialpad itself could remember
- * the call that we're associated with, and clear the digits if the
- * "current call" has changed since last time. (This would require
- * some unique identifier that's different for each call. We can't
- * just use the foreground Call object, since that's a singleton that
- * lasts the whole life of the phone process. Instead, maybe look at
- * the Connection object that comes back from getEarliestConnection()?
- * Or getEarliestConnectTime()?)
- *
- * Or to be even fancier, we could keep a mapping of *multiple*
- * "active calls" to DTMF strings. That way you could have two lines
- * in use and swap calls multiple times, and we'd still remember the
- * digits for each call. (But that's such an obscure use case that
- * it's probably not worth the extra complexity.)
- */
- public void clearDigits() {
- if (DBG) log("clearDigits()...");
-
- if (mDialpadDigits != null) {
- mDialpadDigits.setText("");
- }
- }
-
- /**
- * Starts playing a DTMF tone. Also begins the local tone playback,
- * if enabled.
- * The access of this function is package rather than private
- * since this is being referred from InCallScreen.
- * InCallScreen calls this function to utilize the DTMF ToneGenerator properties
- * defined here.
- * @param tone a tone code from {@link ToneGenerator}
- */
- /* package */ void startDtmfTone(char tone) {
- if (DBG) log("startDtmfTone()...");
- mPhone.startDtmf(tone);
-
- // if local tone playback is enabled, start it.
- if (mDTMFToneEnabled) {
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator == null) {
- if (DBG) log("startDtmfTone: mToneGenerator == null, tone: " + tone);
- } else {
- if (DBG) log("starting local tone " + tone);
- mToneGenerator.startTone(mToneMap.get(tone));
- }
- }
- }
- }
-
- /**
- * Stops playing the current DTMF tone.
- *
- * The ToneStopper class (similar to that in {@link TwelveKeyDialer#mToneStopper})
- * has been removed in favor of synchronous start / stop calls since tone duration
- * is now a function of the input.
- * The acess of this function is package rather than private
- * since this is being referred from InCallScreen.
- * InCallScreen calls this function to utilize the DTMF ToneGenerator properties
- * defined here.
- */
- /* package */ void stopDtmfTone() {
- if (DBG) log("stopDtmfTone()...");
- mPhone.stopDtmf();
-
- // if local tone playback is enabled, stop it.
- if (DBG) log("trying to stop local tone...");
- if (mDTMFToneEnabled) {
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator == null) {
- if (DBG) log("stopDtmfTone: mToneGenerator == null");
- } else {
- if (DBG) log("stopping local tone.");
- mToneGenerator.stopTone();
- }
- }
- }
- }
-
- /**
- * Check to see if the keyEvent is dialable.
- */
- boolean isKeyEventAcceptable (KeyEvent event) {
- return (mDialerKeyListener != null && mDialerKeyListener.isKeyEventAcceptable(event));
- }
-
- /**
- * static logging method
- */
- private static void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-
- /**
- * Plays the local tone based the phone type.
- */
- private void startTone(char c) {
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- startDtmfTone(c);
- } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
- startToneCdma(c);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
-
- /**
- * Stops the local tone based on the phone type.
- */
- private void stopTone() {
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- stopDtmfTone();
- } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // Cdma case we do stopTone only for Long DTMF Setting
- if (mDTMFToneType == CallFeaturesSetting.DTMF_TONE_TYPE_LONG) {
- stopToneCdma();
- }
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
-
- /**
- * Plays tone when the DTMF setting is normal(Short).
- */
- void startToneCdma(char tone) {
- if (DBG) log("startToneCdma('" + tone + "')...");
-
- // Read the settings as it may be changed by the user during the call
- mDTMFToneType = Settings.System.getInt(mInCallScreen.getContentResolver(),
- Settings.System.DTMF_TONE_TYPE_WHEN_DIALING,
- CallFeaturesSetting.DTMF_TONE_TYPE_NORMAL);
- // For Short DTMF we need to play the local tone for fixed duration
- if (mDTMFToneType == CallFeaturesSetting.DTMF_TONE_TYPE_NORMAL) {
- sendShortDtmfToNetwork (tone);
- } else {
- // Pass as a char to be sent to network
- Log.i(LOG_TAG, "send long dtmf for " + tone);
- mPhone.startDtmf(tone);
- }
-
- startLocalToneCdma(tone);
- }
-
- /**
- * Plays local tone for CDMA.
- */
- void startLocalToneCdma(char tone) {
- if (DBG) log("startLocalToneCdma('" + tone + "')..."
- + " mDTMFToneEnabled = " + mDTMFToneEnabled + " this = " + this);
-
- // if local tone playback is enabled, start it.
- if (mDTMFToneEnabled) {
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator == null) {
- if (DBG) log("startToneCdma: mToneGenerator == null, tone: " + tone);
- } else {
- if (DBG) log("starting local tone " + tone);
-
- // Start the new tone.
- int toneDuration = -1;
- if (mDTMFToneType == CallFeaturesSetting.DTMF_TONE_TYPE_NORMAL) {
- toneDuration = DTMF_DURATION_MS;
- }
- mToneGenerator.startTone(mToneMap.get(tone), toneDuration);
- }
- }
- }
- }
-
- /**
- * Sends the dtmf character over the network for short DTMF settings
- * When the characters are entered in quick succession,
- * the characters are queued before sending over the network.
- */
- private void sendShortDtmfToNetwork(char dtmfDigit) {
- synchronized (mDTMFQueue) {
- if (mDTMFBurstCnfPending == true) {
- // Insert the dtmf char to the queue
- mDTMFQueue.add(new Character(dtmfDigit));
- } else {
- String dtmfStr = Character.toString(dtmfDigit);
- Log.i(LOG_TAG, "dtmfsent = " + dtmfStr);
- mPhone.sendBurstDtmf(dtmfStr, 0, 0, mHandler.obtainMessage(DTMF_SEND_CNF));
- // Set flag to indicate wait for Telephony confirmation.
- mDTMFBurstCnfPending = true;
- }
- }
- }
-
- /**
- * Stops the dtmf from being sent over the network for Long DTMF case
- * and stops local DTMF key feedback tone.
- */
- private void stopToneCdma() {
- if (DBG) log("stopping remote tone.");
-
- mPhone.stopDtmf();
- stopLocalToneCdma();
- }
-
- /**
- * Stops the local dtmf tone.
- */
- void stopLocalToneCdma() {
- // if local tone playback is enabled, stop it.
- if (DBG) log("trying to stop local tone...");
- if (mDTMFToneEnabled) {
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator == null) {
- if (DBG) log("stopLocalToneCdma: mToneGenerator == null");
- } else {
- if (DBG) log("stopping local tone.");
- mToneGenerator.stopTone();
- }
- }
- }
- }
-
- /**
- * Handles Burst Dtmf Confirmation from the Framework.
- */
- void handleBurstDtmfConfirmation() {
- Character dtmfChar = null;
- synchronized (mDTMFQueue) {
- mDTMFBurstCnfPending = false;
- if (!mDTMFQueue.isEmpty()) {
- dtmfChar = mDTMFQueue.remove();
- Log.i(LOG_TAG, "The dtmf character removed from queue" + dtmfChar);
- }
- }
- if (dtmfChar != null) {
- sendShortDtmfToNetwork(dtmfChar);
- }
- }
-}
diff --git a/phone/src/com/android/phone2/DTMFTwelveKeyDialerView.java b/phone/src/com/android/phone2/DTMFTwelveKeyDialerView.java
deleted file mode 100644
index 4f8954c..0000000
--- a/phone/src/com/android/phone2/DTMFTwelveKeyDialerView.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.FocusFinder;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-
-import java.util.ArrayList;
-
-/**
- * DTMFTwelveKeyDialerView is the view logic that the DTMFDialer uses.
- * This is really a thin wrapper around Linear Layout that intercepts
- * some user interactions to provide the correct UI behaviour for the
- * dialer.
- */
-class DTMFTwelveKeyDialerView extends LinearLayout {
-
- private static final String LOG_TAG = "PHONE/DTMFTwelveKeyDialerView";
- private static final boolean DBG = false;
-
- private DTMFTwelveKeyDialer mDialer;
- private ButtonGridLayout mButtonGrid;
-
- public DTMFTwelveKeyDialerView (Context context) {
- super(context);
- }
-
- public DTMFTwelveKeyDialerView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- void setDialer (DTMFTwelveKeyDialer dialer) {
- mDialer = dialer;
- mButtonGrid = (ButtonGridLayout)findViewById(R.id.dialpad);
- }
-
- /**
- * Normally we ignore everything except for the BACK and CALL keys.
- * For those, we pass them to the model (and then the InCallScreen).
- */
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (DBG) log("dispatchKeyEvent(" + event + ")...");
-
- int keyCode = event.getKeyCode();
- if (mDialer != null) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_BACK:
- case KeyEvent.KEYCODE_CALL:
- return event.isDown() ? mDialer.onKeyDown(keyCode, event) :
- mDialer.onKeyUp(keyCode, event);
- }
- }
-
- if (DBG) log("==> dispatchKeyEvent: forwarding event to the DTMFDialer");
- return super.dispatchKeyEvent(event);
- }
-
- /**
- * Set the background of all the dialpad keys. Typically a selector to
- * change the background based on some combination of the
- * attributes.
- * @param resid Is a resource id to be used for each button's background.
- */
- public void setKeysBackgroundResource(int resid) {
- mButtonGrid.setChildrenBackgroundResource(resid);
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-
-}
diff --git a/phone/src/com/android/phone2/DataUsage.java b/phone/src/com/android/phone2/DataUsage.java
deleted file mode 100644
index 542991a..0000000
--- a/phone/src/com/android/phone2/DataUsage.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.phone2;
-
-import com.android.phone2.R;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.net.Uri;
-import android.net.ThrottleManager;
-import android.util.Log;
-
-
-/**
- * Lists the data usage and throttle settings
- */
-public class DataUsage extends PreferenceActivity {
-
- private Preference mCurrentUsagePref;
- private Preference mTimeFramePref;
- private Preference mThrottleRatePref;
- private Preference mHelpPref;
- private String mHelpUri;
-
- private DataUsageListener mDataUsageListener;
- private ThrottleManager mThrottleManager;
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- mThrottleManager = (ThrottleManager) getSystemService(Context.THROTTLE_SERVICE);
-
- addPreferencesFromResource(R.xml.data_usage_settings);
-
- mCurrentUsagePref = findPreference("throttle_current_usage");
- mTimeFramePref = findPreference("throttle_time_frame");
- mThrottleRatePref = findPreference("throttle_rate");
- mHelpPref = findPreference("throttle_help");
-
- mHelpUri = mThrottleManager.getHelpUri();
- if (mHelpUri == null ) {
- getPreferenceScreen().removePreference(mHelpPref);
- } else {
- mHelpPref.setSummary(getString(R.string.throttle_help_subtext));
- }
-
- mDataUsageListener = new DataUsageListener(this, mCurrentUsagePref,
- mTimeFramePref, mThrottleRatePref);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mDataUsageListener.resume();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mDataUsageListener.pause();
- }
-
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-
- if (preference == mHelpPref) {
- try {
- Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(mHelpUri));
- startActivity(myIntent);
- } catch (Exception e) {
- ;
- }
- }
-
- return true;
- }
-}
diff --git a/phone/src/com/android/phone2/DataUsageListener.java b/phone/src/com/android/phone2/DataUsageListener.java
deleted file mode 100644
index f289ae2..0000000
--- a/phone/src/com/android/phone2/DataUsageListener.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.phone2;
-
-import com.android.phone2.R;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.net.Uri;
-import android.net.ThrottleManager;
-import android.util.Log;
-
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.text.DateFormat;
-
-/**
- * Listener for broadcasts from ThrottleManager
- */
-public class DataUsageListener {
-
- private ThrottleManager mThrottleManager;
- private Preference mCurrentUsagePref = null;
- private Preference mTimeFramePref = null;
- private Preference mThrottleRatePref = null;
- private Preference mSummaryPref = null;
- private PreferenceScreen mPrefScreen = null;
- private boolean mSummaryPrefEnabled = false;
-
- private final Context mContext;
- private IntentFilter mFilter;
- private BroadcastReceiver mReceiver;
-
- private int mPolicyThrottleValue; //in kbps
- private long mPolicyThreshold;
- private int mCurrentThrottleRate;
- private long mDataUsed;
- private Calendar mStart;
- private Calendar mEnd;
-
- public DataUsageListener(Context context, Preference summary, PreferenceScreen prefScreen) {
- mContext = context;
- mSummaryPref = summary;
- mPrefScreen = prefScreen;
- mSummaryPrefEnabled = true;
- initialize();
- }
-
- public DataUsageListener(Context context, Preference currentUsage,
- Preference timeFrame, Preference throttleRate) {
- mContext = context;
- mCurrentUsagePref = currentUsage;
- mTimeFramePref = timeFrame;
- mThrottleRatePref = throttleRate;
- initialize();
- }
-
- private void initialize() {
-
- mThrottleManager = (ThrottleManager) mContext.getSystemService(Context.THROTTLE_SERVICE);
-
- mStart = GregorianCalendar.getInstance();
- mEnd = GregorianCalendar.getInstance();
-
- mFilter = new IntentFilter();
- mFilter.addAction(ThrottleManager.THROTTLE_POLL_ACTION);
- mFilter.addAction(ThrottleManager.THROTTLE_ACTION);
- mFilter.addAction(ThrottleManager.POLICY_CHANGED_ACTION);
-
- mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (ThrottleManager.THROTTLE_POLL_ACTION.equals(action)) {
- updateUsageStats(intent.getLongExtra(ThrottleManager.EXTRA_CYCLE_READ, 0),
- intent.getLongExtra(ThrottleManager.EXTRA_CYCLE_WRITE, 0),
- intent.getLongExtra(ThrottleManager.EXTRA_CYCLE_START, 0),
- intent.getLongExtra(ThrottleManager.EXTRA_CYCLE_END, 0));
- } else if (ThrottleManager.POLICY_CHANGED_ACTION.equals(action)) {
- updatePolicy();
- } else if (ThrottleManager.THROTTLE_ACTION.equals(action)) {
- updateThrottleRate(intent.getIntExtra(ThrottleManager.EXTRA_THROTTLE_LEVEL, -1));
- }
- }
- };
- }
-
- void resume() {
- mContext.registerReceiver(mReceiver, mFilter);
- updatePolicy();
- }
-
- void pause() {
- mContext.unregisterReceiver(mReceiver);
- }
-
- private void updatePolicy() {
- /* Fetch values for default interface */
- mPolicyThrottleValue = mThrottleManager.getCliffLevel(null, 1);
- mPolicyThreshold = mThrottleManager.getCliffThreshold(null, 1);
-
- if (mSummaryPref != null) { /* Settings preference */
- /**
- * Remove data usage preference in settings
- * if policy change disables throttling
- */
- if (mPolicyThreshold == 0) {
- if (mSummaryPrefEnabled) {
- mPrefScreen.removePreference(mSummaryPref);
- mSummaryPrefEnabled = false;
- }
- } else {
- if (!mSummaryPrefEnabled) {
- mSummaryPrefEnabled = true;
- mPrefScreen.addPreference(mSummaryPref);
- }
- }
- }
- updateUI();
- }
-
- private void updateThrottleRate(int throttleRate) {
- mCurrentThrottleRate = throttleRate;
- updateUI();
- }
-
- private void updateUsageStats(long readByteCount, long writeByteCount,
- long startTime, long endTime) {
- mDataUsed = readByteCount + writeByteCount;
- mStart.setTimeInMillis(startTime);
- mEnd.setTimeInMillis(endTime);
- updateUI();
- }
-
- private void updateUI() {
- if (mPolicyThreshold == 0)
- return;
- int dataUsedPercent = (int) ((mDataUsed * 100) / mPolicyThreshold);
-
- long cycleTime = mEnd.getTimeInMillis() - mStart.getTimeInMillis();
- long currentTime = GregorianCalendar.getInstance().getTimeInMillis()
- - mStart.getTimeInMillis();
-
- int cycleThroughPercent = (cycleTime == 0) ? 0 : (int) ((currentTime * 100) / cycleTime);
-
- Calendar cal = Calendar.getInstance();
- cal.setTimeInMillis(cycleTime - currentTime);
- int daysLeft = cal.get(Calendar.DAY_OF_YEAR);
- //cal.get() returns 365 for less than a day
- if (daysLeft >= 365) daysLeft = 0;
-
- if (mCurrentUsagePref != null) {
- /* Update the UI based on whether we are in a throttled state */
- if (mCurrentThrottleRate > 0) {
- mCurrentUsagePref.setSummary(mContext.getString(
- R.string.throttle_data_rate_reduced_subtext,
- toReadable(mPolicyThreshold),
- mCurrentThrottleRate));
- } else {
- mCurrentUsagePref.setSummary(mContext.getString(
- R.string.throttle_data_usage_subtext,
- toReadable(mDataUsed), dataUsedPercent, toReadable(mPolicyThreshold)));
- }
- }
- if (mTimeFramePref != null) {
- mTimeFramePref.setSummary(mContext.getString(R.string.throttle_time_frame_subtext,
- cycleThroughPercent, daysLeft,
- DateFormat.getDateInstance(DateFormat.SHORT).format(mEnd.getTime())));
- }
- if (mThrottleRatePref != null) {
- mThrottleRatePref.setSummary(mContext.getString(R.string.throttle_rate_subtext,
- mPolicyThrottleValue));
- }
- if (mSummaryPref != null && mSummaryPrefEnabled) {
-
- /* Update the UI based on whether we are in a throttled state */
- if (mCurrentThrottleRate > 0) {
- mSummaryPref.setSummary(mContext.getString(
- R.string.throttle_data_rate_reduced_subtext,
- toReadable(mPolicyThreshold),
- mCurrentThrottleRate));
- } else {
- mSummaryPref.setSummary(mContext.getString(R.string.throttle_status_subtext,
- toReadable(mDataUsed),
- dataUsedPercent,
- toReadable(mPolicyThreshold),
- daysLeft,
- DateFormat.getDateInstance(DateFormat.SHORT).format(mEnd.getTime())));
- }
- }
- }
-
- private String toReadable (long data) {
- long KB = 1024;
- long MB = 1024 * KB;
- long GB = 1024 * MB;
- long TB = 1024 * GB;
- String ret;
-
- if (data < KB) {
- ret = data + " bytes";
- } else if (data < MB) {
- ret = (data / KB) + " KB";
- } else if (data < GB) {
- ret = (data / MB) + " MB";
- } else if (data < TB) {
- ret = (data / GB) + " GB";
- } else {
- ret = (data / TB) + " TB";
- }
- return ret;
- }
-}
diff --git a/phone/src/com/android/phone2/DeleteFdnContactScreen.java b/phone/src/com/android/phone2/DeleteFdnContactScreen.java
deleted file mode 100644
index b8eb8dc..0000000
--- a/phone/src/com/android/phone2/DeleteFdnContactScreen.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.content.AsyncQueryHandler;
-import android.content.ContentResolver;
-import android.content.Intent;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.Window;
-import android.widget.Toast;
-
-import static android.view.Window.PROGRESS_VISIBILITY_OFF;
-import static android.view.Window.PROGRESS_VISIBILITY_ON;
-
-/**
- * Activity to let the user delete an FDN contact.
- */
-public class DeleteFdnContactScreen extends Activity {
- private static final String LOG_TAG = PhoneApp.LOG_TAG;
- private static final boolean DBG = false;
-
- private static final String INTENT_EXTRA_NAME = "name";
- private static final String INTENT_EXTRA_NUMBER = "number";
-
- private static final int PIN2_REQUEST_CODE = 100;
-
- private String mName;
- private String mNumber;
- private String mPin2;
-
- protected QueryHandler mQueryHandler;
-
- private Handler mHandler = new Handler();
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- resolveIntent();
-
- authenticatePin2();
-
- getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- setContentView(R.layout.delete_fdn_contact_screen);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode,
- Intent intent) {
- if (DBG) log("onActivityResult");
-
- switch (requestCode) {
- case PIN2_REQUEST_CODE:
- Bundle extras = (intent != null) ? intent.getExtras() : null;
- if (extras != null) {
- mPin2 = extras.getString("pin2");
- showStatus(getResources().getText(
- R.string.deleting_fdn_contact));
- deleteContact();
- } else {
- // if they cancelled, then we just cancel too.
- if (DBG) log("onActivityResult: CANCELLED");
- displayProgress(false);
- finish();
- }
- break;
- }
- }
-
- private void resolveIntent() {
- Intent intent = getIntent();
-
- mName = intent.getStringExtra(INTENT_EXTRA_NAME);
- mNumber = intent.getStringExtra(INTENT_EXTRA_NUMBER);
-
- if (TextUtils.isEmpty(mName)) {
- finish();
- }
- }
-
- private void deleteContact() {
- StringBuilder buf = new StringBuilder();
- buf.append("tag='");
- buf.append(mName);
- buf.append("' AND number='");
- buf.append(mNumber);
- buf.append("' AND pin2='");
- buf.append(mPin2);
- buf.append("'");
-
- Uri uri = Uri.parse("content://icc/fdn");
-
- mQueryHandler = new QueryHandler(getContentResolver());
- mQueryHandler.startDelete(0, null, uri, buf.toString(), null);
- displayProgress(true);
- }
-
- private void authenticatePin2() {
- Intent intent = new Intent();
- intent.setClass(this, GetPin2Screen.class);
- startActivityForResult(intent, PIN2_REQUEST_CODE);
- }
-
- private void displayProgress(boolean flag) {
- getWindow().setFeatureInt(
- Window.FEATURE_INDETERMINATE_PROGRESS,
- flag ? PROGRESS_VISIBILITY_ON : PROGRESS_VISIBILITY_OFF);
- }
-
- // Replace the status field with a toast to make things appear similar
- // to the rest of the settings. Removed the useless status field.
- private void showStatus(CharSequence statusMsg) {
- if (statusMsg != null) {
- Toast.makeText(this, statusMsg, Toast.LENGTH_SHORT)
- .show();
- }
- }
-
- private void handleResult(boolean success) {
- if (success) {
- if (DBG) log("handleResult: success!");
- showStatus(getResources().getText(R.string.fdn_contact_deleted));
- } else {
- if (DBG) log("handleResult: failed!");
- showStatus(getResources().getText(R.string.pin2_invalid));
- }
-
- mHandler.postDelayed(new Runnable() {
- public void run() {
- finish();
- }
- }, 2000);
-
- }
-
- private class QueryHandler extends AsyncQueryHandler {
- public QueryHandler(ContentResolver cr) {
- super(cr);
- }
-
- @Override
- protected void onQueryComplete(int token, Object cookie, Cursor c) {
- }
-
- 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) {
- if (DBG) log("onDeleteComplete");
- displayProgress(false);
- handleResult(result > 0);
- }
-
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, "[DeleteFdnContact] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/EditFdnContactScreen.java b/phone/src/com/android/phone2/EditFdnContactScreen.java
deleted file mode 100644
index 6dcf596..0000000
--- a/phone/src/com/android/phone2/EditFdnContactScreen.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- * 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.phone2;
-
-import static android.view.Window.PROGRESS_VISIBILITY_OFF;
-import static android.view.Window.PROGRESS_VISIBILITY_ON;
-
-import android.app.Activity;
-import android.content.AsyncQueryHandler;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.provider.Contacts.PeopleColumns;
-import android.provider.Contacts.PhonesColumns;
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.TextUtils;
-import android.text.method.DialerKeyListener;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.Window;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import android.widget.Toast;
-
-/**
- * Activity to let the user add or edit an FDN contact.
- */
-public class EditFdnContactScreen extends Activity {
- private static final String LOG_TAG = PhoneApp.LOG_TAG;
- private static final boolean DBG = false;
-
- // Menu item codes
- private static final int MENU_IMPORT = 1;
- private static final int MENU_DELETE = 2;
-
- private static final String INTENT_EXTRA_NAME = "name";
- private static final String INTENT_EXTRA_NUMBER = "number";
-
- private static final int PIN2_REQUEST_CODE = 100;
-
- private String mName;
- private String mNumber;
- private String mPin2;
- private boolean mAddContact;
- private QueryHandler mQueryHandler;
-
- private EditText mNameField;
- private EditText mNumberField;
- private LinearLayout mPinFieldContainer;
- private Button mButton;
-
- private Handler mHandler = new Handler();
-
- /**
- * Constants used in importing from contacts
- */
- /** request code when invoking subactivity */
- private static final int CONTACTS_PICKER_CODE = 200;
- /** projection for phone number query */
- private static final String NUM_PROJECTION[] = {PeopleColumns.DISPLAY_NAME,
- PhonesColumns.NUMBER};
- /** static intent to invoke phone number picker */
- private static final Intent CONTACT_IMPORT_INTENT;
- static {
- CONTACT_IMPORT_INTENT = new Intent(Intent.ACTION_GET_CONTENT);
- CONTACT_IMPORT_INTENT.setType(android.provider.Contacts.Phones.CONTENT_ITEM_TYPE);
- }
- /** flag to track saving state */
- private boolean mDataBusy;
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- resolveIntent();
-
- getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
- setContentView(R.layout.edit_fdn_contact_screen);
- setupView();
- setTitle(mAddContact ?
- R.string.add_fdn_contact : R.string.edit_fdn_contact);
-
- mDataBusy = false;
- }
-
- /**
- * We now want to bring up the pin request screen AFTER the
- * contact information is displayed, to help with user
- * experience.
- *
- * Also, process the results from the contact picker.
- */
- @Override
- protected void onActivityResult(int requestCode, int resultCode,
- Intent intent) {
- if (DBG) log("onActivityResult request:" + requestCode + " result:" + resultCode);
-
- switch (requestCode) {
- case PIN2_REQUEST_CODE:
- Bundle extras = (intent != null) ? intent.getExtras() : null;
- if (extras != null) {
- mPin2 = extras.getString("pin2");
- if (mAddContact) {
- addContact();
- } else {
- updateContact();
- }
- } else if (resultCode != RESULT_OK) {
- // if they cancelled, then we just cancel too.
- if (DBG) log("onActivityResult: cancelled.");
- finish();
- }
- break;
-
- // look for the data associated with this number, and update
- // the display with it.
- case CONTACTS_PICKER_CODE:
- if (resultCode != RESULT_OK) {
- if (DBG) log("onActivityResult: cancelled.");
- return;
- }
- Cursor cursor = getContentResolver().query(intent.getData(),
- NUM_PROJECTION, null, null, null);
- if ((cursor == null) || (!cursor.moveToFirst())) {
- Log.w(LOG_TAG,"onActivityResult: bad contact data, no results found.");
- return;
- }
- mNameField.setText(cursor.getString(0));
- mNumberField.setText(cursor.getString(1));
- break;
- }
- }
-
- /**
- * Overridden to display the import and delete commands.
- */
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
-
- Resources r = getResources();
-
- // Added the icons to the context menu
- menu.add(0, MENU_IMPORT, 0, r.getString(R.string.importToFDNfromContacts))
- .setIcon(R.drawable.ic_menu_contact);
- menu.add(0, MENU_DELETE, 0, r.getString(R.string.menu_delete))
- .setIcon(android.R.drawable.ic_menu_delete);
- return true;
- }
-
- /**
- * Allow the menu to be opened ONLY if we're not busy.
- */
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- boolean result = super.onPrepareOptionsMenu(menu);
- return mDataBusy ? false : result;
- }
-
- /**
- * Overridden to allow for handling of delete and import.
- */
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case MENU_IMPORT:
- startActivityForResult(CONTACT_IMPORT_INTENT, CONTACTS_PICKER_CODE);
- return true;
-
- case MENU_DELETE:
- deleteSelected();
- return true;
- }
-
- return super.onOptionsItemSelected(item);
- }
-
- private void resolveIntent() {
- Intent intent = getIntent();
-
- mName = intent.getStringExtra(INTENT_EXTRA_NAME);
- mNumber = intent.getStringExtra(INTENT_EXTRA_NUMBER);
-
- if (TextUtils.isEmpty(mName) && TextUtils.isEmpty(mNumber)) {
- mAddContact = true;
- }
- }
-
- /**
- * We have multiple layouts, one to indicate that the user needs to
- * open the keyboard to enter information (if the keybord is hidden).
- * So, we need to make sure that the layout here matches that in the
- * layout file.
- */
- private void setupView() {
- mNameField = (EditText) findViewById(R.id.fdn_name);
- if (mNameField != null) {
- mNameField.setOnFocusChangeListener(mOnFocusChangeHandler);
- mNameField.setOnClickListener(mClicked);
- }
-
- mNumberField = (EditText) findViewById(R.id.fdn_number);
- if (mNumberField != null) {
- mNumberField.setKeyListener(DialerKeyListener.getInstance());
- mNumberField.setOnFocusChangeListener(mOnFocusChangeHandler);
- mNumberField.setOnClickListener(mClicked);
- }
-
- if (!mAddContact) {
- if (mNameField != null) {
- mNameField.setText(mName);
- }
- if (mNumberField != null) {
- mNumberField.setText(mNumber);
- }
- }
-
- mButton = (Button) findViewById(R.id.button);
- if (mButton != null) {
- mButton.setOnClickListener(mClicked);
- }
-
- mPinFieldContainer = (LinearLayout) findViewById(R.id.pinc);
-
- }
-
- private String getNameFromTextField() {
- return mNameField.getText().toString();
- }
-
- private String getNumberFromTextField() {
- return mNumberField.getText().toString();
- }
-
- private Uri getContentURI() {
- return Uri.parse("content://icc/fdn");
- }
-
- /**
- * @param number is voice mail number
- * @return true if number length is less than 20-digit limit
- */
- private boolean isValidNumber(String number) {
- return (number.length() <= 20);
- }
-
-
- private void addContact() {
- if (DBG) log("addContact");
-
- if (!isValidNumber(getNumberFromTextField())) {
- handleResult(false, true);
- return;
- }
-
- Uri uri = getContentURI();
-
- ContentValues bundle = new ContentValues(3);
- bundle.put("tag", getNameFromTextField());
- bundle.put("number", getNumberFromTextField());
- bundle.put("pin2", mPin2);
-
-
- mQueryHandler = new QueryHandler(getContentResolver());
- mQueryHandler.startInsert(0, null, uri, bundle);
- displayProgress(true);
- showStatus(getResources().getText(R.string.adding_fdn_contact));
- }
-
- private void updateContact() {
- if (DBG) log("updateContact");
-
- if (!isValidNumber(getNumberFromTextField())) {
- handleResult(false, true);
- return;
- }
- Uri uri = getContentURI();
-
- ContentValues bundle = new ContentValues();
- bundle.put("tag", mName);
- bundle.put("number", mNumber);
- bundle.put("newTag", getNameFromTextField());
- bundle.put("newNumber", getNumberFromTextField());
- bundle.put("pin2", mPin2);
-
- mQueryHandler = new QueryHandler(getContentResolver());
- mQueryHandler.startUpdate(0, null, uri, bundle, null, null);
- displayProgress(true);
- showStatus(getResources().getText(R.string.updating_fdn_contact));
- }
-
- /**
- * Handle the delete command, based upon the state of the Activity.
- */
- private void deleteSelected() {
- // delete ONLY if this is NOT a new contact.
- if (!mAddContact) {
- Intent intent = new Intent();
- intent.setClass(this, DeleteFdnContactScreen.class);
- intent.putExtra(INTENT_EXTRA_NAME, mName);
- intent.putExtra(INTENT_EXTRA_NUMBER, mNumber);
- startActivity(intent);
- }
- finish();
- }
-
- private void authenticatePin2() {
- Intent intent = new Intent();
- intent.setClass(this, GetPin2Screen.class);
- startActivityForResult(intent, PIN2_REQUEST_CODE);
- }
-
- private void displayProgress(boolean flag) {
- // indicate we are busy.
- mDataBusy = flag;
- getWindow().setFeatureInt(
- Window.FEATURE_INDETERMINATE_PROGRESS,
- mDataBusy ? PROGRESS_VISIBILITY_ON : PROGRESS_VISIBILITY_OFF);
- // make sure we don't allow calls to save when we're
- // not ready for them.
- mButton.setClickable(!mDataBusy);
- }
-
- /**
- * Removed the status field, with preference to displaying a toast
- * to match the rest of settings UI.
- */
- private void showStatus(CharSequence statusMsg) {
- if (statusMsg != null) {
- Toast.makeText(this, statusMsg, Toast.LENGTH_SHORT)
- .show();
- }
- }
-
- private void handleResult(boolean success, boolean invalidNumber) {
- if (success) {
- if (DBG) log("handleResult: success!");
- showStatus(getResources().getText(mAddContact ?
- R.string.fdn_contact_added : R.string.fdn_contact_updated));
- } else {
- if (DBG) log("handleResult: failed!");
- if (invalidNumber)
- showStatus(getResources().getText(R.string.fdn_invalid_number));
- else
- showStatus(getResources().getText(R.string.pin2_invalid));
- }
-
- mHandler.postDelayed(new Runnable() {
- public void run() {
- finish();
- }
- }, 2000);
-
- }
-
- private View.OnClickListener mClicked = new View.OnClickListener() {
- public void onClick(View v) {
- if (mPinFieldContainer.getVisibility() != View.VISIBLE) {
- return;
- }
-
- if (v == mNameField) {
- mNumberField.requestFocus();
- } else if (v == mNumberField) {
- mButton.requestFocus();
- } else if (v == mButton) {
- // Authenticate the pin AFTER the contact information
- // is entered, and if we're not busy.
- if (!mDataBusy) {
- authenticatePin2();
- }
- }
- }
- };
-
- View.OnFocusChangeListener mOnFocusChangeHandler =
- new View.OnFocusChangeListener() {
- public void onFocusChange(View v, boolean hasFocus) {
- if (hasFocus) {
- TextView textView = (TextView) v;
- Selection.selectAll((Spannable) textView.getText());
- }
- }
- };
-
- private class QueryHandler extends AsyncQueryHandler {
- public QueryHandler(ContentResolver cr) {
- super(cr);
- }
-
- @Override
- protected void onQueryComplete(int token, Object cookie, Cursor c) {
- }
-
- @Override
- protected void onInsertComplete(int token, Object cookie,
- Uri uri) {
- if (DBG) log("onInsertComplete");
- displayProgress(false);
- handleResult(uri != null, false);
- }
-
- @Override
- protected void onUpdateComplete(int token, Object cookie, int result) {
- if (DBG) log("onUpdateComplete");
- displayProgress(false);
- handleResult(result > 0, false);
- }
-
- @Override
- protected void onDeleteComplete(int token, Object cookie, int result) {
- }
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, "[EditFdnContact] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/EditPhoneNumberPreference.java b/phone/src/com/android/phone2/EditPhoneNumberPreference.java
deleted file mode 100644
index 56d32a2..0000000
--- a/phone/src/com/android/phone2/EditPhoneNumberPreference.java
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.res.TypedArray;
-import android.preference.EditTextPreference;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.text.method.ArrowKeyMovementMethod;
-import android.text.method.DialerKeyListener;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.TextView;
-
-public class EditPhoneNumberPreference extends EditTextPreference {
-
- //allowed modes for this preference.
- /** simple confirmation (OK / CANCEL) */
- private static final int CM_CONFIRM = 0;
- /** toggle [(ENABLE / CANCEL) or (DISABLE / CANCEL)], use isToggled() to see requested state.*/
- private static final int CM_ACTIVATION = 1;
-
- private int mConfirmationMode;
-
- //String constants used in storing the value of the preference
- // The preference is backed by a string that holds the encoded value, which reads:
- // <VALUE_ON | VALUE_OFF><VALUE_SEPARATOR><mPhoneNumber>
- // for example, an enabled preference with a number of 6502345678 would read:
- // "1:6502345678"
- private static final String VALUE_SEPARATOR = ":";
- private static final String VALUE_OFF = "0";
- private static final String VALUE_ON = "1";
-
- //UI layout
- private ImageButton mContactPickButton;
-
- //Listeners
- /** Called when focus is changed between fields */
- private View.OnFocusChangeListener mDialogFocusChangeListener;
- /** Called when the Dialog is closed. */
- private OnDialogClosedListener mDialogOnClosedListener;
- /**
- * Used to indicate that we are going to request for a
- * default number. for the dialog.
- */
- private GetDefaultNumberListener mGetDefaultNumberListener;
-
- //Activity values
- private Activity mParentActivity;
- private Intent mContactListIntent;
- /** Arbitrary activity-assigned preference id value */
- private int mPrefId;
-
- //similar to toggle preference
- private CharSequence mEnableText;
- private CharSequence mDisableText;
- private CharSequence mChangeNumberText;
- private CharSequence mSummaryOn;
- private CharSequence mSummaryOff;
-
- // button that was clicked on dialog close.
- private int mButtonClicked;
-
- //relevant (parsed) value of the mText
- private String mPhoneNumber;
- private boolean mChecked;
-
-
- /**
- * Interface for the dialog closed listener, related to
- * DialogPreference.onDialogClosed(), except we also pass in a buttonClicked
- * value indicating which of the three possible buttons were pressed.
- */
- interface OnDialogClosedListener {
- void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked);
- }
-
- /**
- * Interface for the default number setting listener. Handles requests for
- * the default display number for the dialog.
- */
- interface GetDefaultNumberListener {
- /**
- * Notify that we are looking for a default display value.
- * @return null if there is no contribution from this interface,
- * indicating that the orignal value of mPhoneNumber should be
- * displayed unchanged.
- */
- String onGetDefaultNumber(EditPhoneNumberPreference preference);
- }
-
- /*
- * Constructors
- */
- public EditPhoneNumberPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- setDialogLayoutResource(R.layout.pref_dialog_editphonenumber);
-
- //create intent to bring up contact list
- mContactListIntent = new Intent(Intent.ACTION_GET_CONTENT);
- mContactListIntent.setType(Phone.CONTENT_ITEM_TYPE);
-
- //get the edit phone number default settings
- TypedArray a = context.obtainStyledAttributes(attrs,
- R.styleable.EditPhoneNumberPreference, 0, R.style.EditPhoneNumberPreference);
- mEnableText = a.getString(R.styleable.EditPhoneNumberPreference_enableButtonText);
- mDisableText = a.getString(R.styleable.EditPhoneNumberPreference_disableButtonText);
- mChangeNumberText = a.getString(R.styleable.EditPhoneNumberPreference_changeNumButtonText);
- mConfirmationMode = a.getInt(R.styleable.EditPhoneNumberPreference_confirmMode, 0);
- a.recycle();
-
- //get the summary settings, use CheckBoxPreference as the standard.
- a = context.obtainStyledAttributes(attrs, android.R.styleable.CheckBoxPreference, 0, 0);
- mSummaryOn = a.getString(android.R.styleable.CheckBoxPreference_summaryOn);
- mSummaryOff = a.getString(android.R.styleable.CheckBoxPreference_summaryOff);
- a.recycle();
- }
-
- public EditPhoneNumberPreference(Context context) {
- this(context, null);
- }
-
-
- /*
- * Methods called on UI bindings
- */
- @Override
- //called when we're binding the view to the preference.
- protected void onBindView(View view) {
- super.onBindView(view);
-
- // Sync the summary view
- TextView summaryView = (TextView) view.findViewById(android.R.id.summary);
- if (summaryView != null) {
- CharSequence sum;
- int vis;
-
- //set summary depending upon mode
- if (mConfirmationMode == CM_ACTIVATION) {
- if (mChecked) {
- sum = (mSummaryOn == null) ? getSummary() : mSummaryOn;
- } else {
- sum = (mSummaryOff == null) ? getSummary() : mSummaryOff;
- }
- } else {
- sum = getSummary();
- }
-
- if (sum != null) {
- summaryView.setText(sum);
- vis = View.VISIBLE;
- } else {
- vis = View.GONE;
- }
-
- if (vis != summaryView.getVisibility()) {
- summaryView.setVisibility(vis);
- }
- }
- }
-
- //called when we're binding the dialog to the preference's view.
- @Override
- protected void onBindDialogView(View view) {
- // default the button clicked to be the cancel button.
- mButtonClicked = DialogInterface.BUTTON2;
-
- super.onBindDialogView(view);
-
- //get the edittext component within the number field
- EditText editText = getEditText();
- //get the contact pick button within the number field
- mContactPickButton = (ImageButton) view.findViewById(R.id.select_contact);
-
- //setup number entry
- if (editText != null) {
- // see if there is a means to get a default number,
- // and set it accordingly.
- if (mGetDefaultNumberListener != null) {
- String defaultNumber = mGetDefaultNumberListener.onGetDefaultNumber(this);
- if (defaultNumber != null) {
- mPhoneNumber = defaultNumber;
- }
- }
- editText.setText(mPhoneNumber);
- editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
- editText.setKeyListener(DialerKeyListener.getInstance());
- editText.setOnFocusChangeListener(mDialogFocusChangeListener);
- }
-
- //set contact picker
- if (mContactPickButton != null) {
- mContactPickButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- if (mParentActivity != null) {
- mParentActivity.startActivityForResult(mContactListIntent, mPrefId);
- }
- }
- });
- }
- }
-
- /**
- * Overriding EditTextPreference's onAddEditTextToDialogView.
- *
- * This method attaches the EditText to the container specific to this
- * preference's dialog layout.
- */
- @Override
- protected void onAddEditTextToDialogView(View dialogView, EditText editText) {
-
- // look for the container object
- ViewGroup container = (ViewGroup) dialogView
- .findViewById(R.id.edit_container);
-
- // add the edittext to the container.
- if (container != null) {
- container.addView(editText, ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
- }
- }
-
- //control the appearance of the dialog depending upon the mode.
- @Override
- protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
- // modified so that we just worry about the buttons being
- // displayed, since there is no need to hide the edittext
- // field anymore.
- if (mConfirmationMode == CM_ACTIVATION) {
- if (mChecked) {
- builder.setPositiveButton(mChangeNumberText, this);
- builder.setNeutralButton(mDisableText, this);
- } else {
- builder.setPositiveButton(null, null);
- builder.setNeutralButton(mEnableText, this);
- }
- }
- // set the call icon on the title.
- builder.setIcon(R.drawable.ic_dialog_call);
- }
-
-
- /*
- * Listeners and other state setting methods
- */
- //set the on focus change listener to be assigned to the Dialog's edittext field.
- public void setDialogOnFocusChangeListener(View.OnFocusChangeListener l) {
- mDialogFocusChangeListener = l;
- }
-
- //set the listener to be called wht the dialog is closed.
- public void setDialogOnClosedListener(OnDialogClosedListener l) {
- mDialogOnClosedListener = l;
- }
-
- //set the link back to the parent activity, so that we may run the contact picker.
- public void setParentActivity(Activity parent, int identifier) {
- mParentActivity = parent;
- mPrefId = identifier;
- mGetDefaultNumberListener = null;
- }
-
- //set the link back to the parent activity, so that we may run the contact picker.
- //also set the default number listener.
- public void setParentActivity(Activity parent, int identifier, GetDefaultNumberListener l) {
- mParentActivity = parent;
- mPrefId = identifier;
- mGetDefaultNumberListener = l;
- }
-
- /*
- * Notification handlers
- */
- //Notify the preference that the pick activity is complete.
- public void onPickActivityResult(String pickedValue) {
- EditText editText = getEditText();
- if (editText != null) {
- editText.setText(pickedValue);
- }
- }
-
- //called when the dialog is clicked.
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // The neutral button (button3) is always the toggle.
- if ((mConfirmationMode == CM_ACTIVATION) && (which == DialogInterface.BUTTON3)) {
- //flip the toggle if we are in the correct mode.
- setToggled(!isToggled());
- }
- // record the button that was clicked.
- mButtonClicked = which;
- super.onClick(dialog, which);
- }
-
- @Override
- //When the dialog is closed, perform the relevant actions, including setting
- // phone numbers and calling the close action listener.
- protected void onDialogClosed(boolean positiveResult) {
- // A positive result is technically either button1 or button3.
- if ((mButtonClicked == DialogInterface.BUTTON1) ||
- (mButtonClicked == DialogInterface.BUTTON3)){
- setPhoneNumber(getEditText().getText().toString());
- super.onDialogClosed(positiveResult);
- setText(getStringValue());
- } else {
- super.onDialogClosed(positiveResult);
- }
-
- // send the clicked button over to the listener.
- if (mDialogOnClosedListener != null) {
- mDialogOnClosedListener.onDialogClosed(this, mButtonClicked);
- }
- }
-
-
- /*
- * Toggle handling code.
- */
- //return the toggle value.
- public boolean isToggled() {
- return mChecked;
- }
-
- //set the toggle value.
- // return the current preference to allow for chaining preferences.
- public EditPhoneNumberPreference setToggled(boolean checked) {
- mChecked = checked;
- setText(getStringValue());
- notifyChanged();
-
- return this;
- }
-
-
- /**
- * Phone number handling code
- */
- public String getPhoneNumber() {
- // return the phone number, after it has been stripped of all
- // irrelevant text.
- return PhoneNumberUtils.stripSeparators(mPhoneNumber);
- }
-
- /** The phone number including any formatting characters */
- protected String getRawPhoneNumber() {
- return mPhoneNumber;
- }
-
- //set the phone number value.
- // return the current preference to allow for chaining preferences.
- public EditPhoneNumberPreference setPhoneNumber(String number) {
- mPhoneNumber = number;
- setText(getStringValue());
- notifyChanged();
-
- return this;
- }
-
-
- /*
- * Other code relevant to preference framework
- */
- //when setting default / initial values, make sure we're setting things correctly.
- @Override
- protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
- setValueFromString(restoreValue ? getPersistedString(getStringValue())
- : (String) defaultValue);
- }
-
- /**
- * Decides how to disable dependents.
- */
- @Override
- public boolean shouldDisableDependents() {
- // There is really only one case we care about, but for consistency
- // we fill out the dependency tree for all of the cases. If this
- // is in activation mode (CF), we look for the encoded toggle value
- // in the string. If this in confirm mode (VM), then we just
- // examine the number field.
- // Note: The toggle value is stored in the string in an encoded
- // manner (refer to setValueFromString and getStringValue below).
- boolean shouldDisable = false;
- if ((mConfirmationMode == CM_ACTIVATION) && (mEncodedText != null)) {
- String[] inValues = mEncodedText.split(":", 2);
- shouldDisable = inValues[0].equals(VALUE_ON);
- } else {
- shouldDisable = (TextUtils.isEmpty(mPhoneNumber) && (mConfirmationMode == CM_CONFIRM));
- }
- return shouldDisable;
- }
-
- /**
- * Override persistString so that we can get a hold of the EditTextPreference's
- * text field.
- */
- private String mEncodedText = null;
- @Override
- protected boolean persistString(String value) {
- mEncodedText = value;
- return super.persistString(value);
- }
-
-
- /*
- * Summary On handling code
- */
- //set the Summary for the on state (relevant only in CM_ACTIVATION mode)
- public EditPhoneNumberPreference setSummaryOn(CharSequence summary) {
- mSummaryOn = summary;
- if (isToggled()) {
- notifyChanged();
- }
- return this;
- }
-
- //set the Summary for the on state, given a string resource id
- // (relevant only in CM_ACTIVATION mode)
- public EditPhoneNumberPreference setSummaryOn(int summaryResId) {
- return setSummaryOn(getContext().getString(summaryResId));
- }
-
- //get the summary string for the on state
- public CharSequence getSummaryOn() {
- return mSummaryOn;
- }
-
-
- /*
- * Summary Off handling code
- */
- //set the Summary for the off state (relevant only in CM_ACTIVATION mode)
- public EditPhoneNumberPreference setSummaryOff(CharSequence summary) {
- mSummaryOff = summary;
- if (!isToggled()) {
- notifyChanged();
- }
- return this;
- }
-
- //set the Summary for the off state, given a string resource id
- // (relevant only in CM_ACTIVATION mode)
- public EditPhoneNumberPreference setSummaryOff(int summaryResId) {
- return setSummaryOff(getContext().getString(summaryResId));
- }
-
- //get the summary string for the off state
- public CharSequence getSummaryOff() {
- return mSummaryOff;
- }
-
-
- /*
- * Methods to get and set from encoded strings.
- */
- //set the values given an encoded string.
- protected void setValueFromString(String value) {
- String[] inValues = value.split(":", 2);
- setToggled(inValues[0].equals(VALUE_ON));
- setPhoneNumber(inValues[1]);
- }
-
- //retrieve the state of this preference in the form of an encoded string
- protected String getStringValue() {
- return ((isToggled() ? VALUE_ON : VALUE_OFF) + VALUE_SEPARATOR + getPhoneNumber());
- }
-
- /**
- * Externally visible method to bring up the dialog.
- *
- * Generally used when we are navigating the user to this preference.
- */
- public void showPhoneNumberDialog() {
- showDialog(null);
- }
-}
diff --git a/phone/src/com/android/phone2/EditPinPreference.java b/phone/src/com/android/phone2/EditPinPreference.java
deleted file mode 100644
index 0a4e996..0000000
--- a/phone/src/com/android/phone2/EditPinPreference.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.preference.EditTextPreference;
-import android.text.method.DigitsKeyListener;
-import android.text.method.PasswordTransformationMethod;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.EditText;
-
-import java.util.Map;
-
-/**
- * Class similar to the com.android.settings.EditPinPreference
- * class, with a couple of modifications, including a different layout
- * for the dialog.
- */
-public class EditPinPreference extends EditTextPreference {
-
- private boolean shouldHideButtons;
-
- interface OnPinEnteredListener {
- void onPinEntered(EditPinPreference preference, boolean positiveResult);
- }
-
- private OnPinEnteredListener mPinListener;
-
- public void setOnPinEnteredListener(OnPinEnteredListener listener) {
- mPinListener = listener;
- }
-
- public EditPinPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public EditPinPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- /**
- * Overridden to setup the correct dialog layout, as well as setting up
- * other properties for the pin / puk entry field.
- */
- @Override
- protected View onCreateDialogView() {
- // set the dialog layout
- setDialogLayoutResource(R.layout.pref_dialog_editpin);
-
- View dialog = super.onCreateDialogView();
-
- // set the transformation method and the key listener to ensure
- // correct input and presentation of the pin / puk.
- final EditText textfield = getEditText();
- textfield.setTransformationMethod(PasswordTransformationMethod.getInstance());
- textfield.setKeyListener(DigitsKeyListener.getInstance());
-
- return dialog;
- }
-
- @Override
- protected void onBindDialogView(View view) {
- super.onBindDialogView(view);
-
- // If the layout does not contain an edittext, hide the buttons.
- shouldHideButtons = (view.findViewById(android.R.id.edit) == null);
- }
-
- @Override
- protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
- super.onPrepareDialogBuilder(builder);
-
- // hide the buttons if we need to.
- if (shouldHideButtons) {
- builder.setPositiveButton(null, this);
- builder.setNegativeButton(null, this);
- }
- }
-
- @Override
- protected void onDialogClosed(boolean positiveResult) {
- super.onDialogClosed(positiveResult);
- if (mPinListener != null) {
- mPinListener.onPinEntered(this, positiveResult);
- }
- }
-
- /**
- * Externally visible method to bring up the dialog to
- * for multi-step / multi-dialog requests (like changing
- * the SIM pin).
- */
- public void showPinDialog() {
- showDialog(null);
- }
-}
diff --git a/phone/src/com/android/phone2/EmergencyCallHandler.java b/phone/src/com/android/phone2/EmergencyCallHandler.java
deleted file mode 100644
index 447812d..0000000
--- a/phone/src/com/android/phone2/EmergencyCallHandler.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.app.Application;
-import android.app.ProgressDialog;
-import android.content.Intent;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.provider.Settings;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import android.telephony.ServiceState;
-import android.view.WindowManager;
-
-/**
- * Helper class used by the InCallScreen to handle certain special
- * cases when making an emergency call.
- *
- * Specifically, if the user tries to dial an emergency number but the
- * radio is off, e.g. if the device is in airplane mode, this class is
- * responsible for turning the radio back on and retrying the call.
- *
- * This class is initially launched using the same intent originally
- * passed to the InCallScreen (presumably an ACTION_CALL_EMERGENCY intent)
- * but with this class explicitly set as the className/component. Later,
- * we retry the emergency call by firing off that same intent, with the
- * component cleared, and using an integer extra called
- * EMERGENCY_CALL_RETRY_KEY to convey information about the current state.
- */
-public class EmergencyCallHandler extends Activity {
- /** the key used to get the count from our Intent's extra(s) */
- public static final String EMERGENCY_CALL_RETRY_KEY = "emergency_call_retry_count";
-
- /** count indicating an initial attempt at the call should be made. */
- public static final int INITIAL_ATTEMPT = -1;
-
- /** number of times to retry the call and the time spent in between attempts*/
- public static final int NUMBER_OF_RETRIES = 6;
- public static final int TIME_BETWEEN_RETRIES_MS = 5000;
-
- // constant events
- private static final int EVENT_SERVICE_STATE_CHANGED = 100;
- private static final int EVENT_TIMEOUT_EMERGENCY_CALL = 200;
-
- /**
- * Package holding information needed for the callback.
- */
- private static class EmergencyCallInfo {
- public Phone phone;
- public Intent intent;
- public ProgressDialog dialog;
- public Application app;
- }
-
- /**
- * static handler class, used to handle the two relevent events.
- */
- private static EmergencyCallEventHandler sHandler;
- private static class EmergencyCallEventHandler extends Handler {
- public void handleMessage(Message msg) {
- switch(msg.what) {
- case EVENT_SERVICE_STATE_CHANGED: {
- // make the initial call attempt after the radio is turned on.
- ServiceState state = (ServiceState) ((AsyncResult) msg.obj).result;
- if (state.getState() != ServiceState.STATE_POWER_OFF) {
- EmergencyCallInfo eci =
- (EmergencyCallInfo) ((AsyncResult) msg.obj).userObj;
- // deregister for the service state change events.
- eci.phone.unregisterForServiceStateChanged(this);
- eci.app.startActivity(eci.intent);
- eci.dialog.dismiss();
- }
- }
- break;
-
- case EVENT_TIMEOUT_EMERGENCY_CALL: {
- // repeated call after the timeout period.
- EmergencyCallInfo eci = (EmergencyCallInfo) msg.obj;
- eci.app.startActivity(eci.intent);
- eci.dialog.dismiss();
- }
- break;
- }
- }
- }
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- // setup the phone and get the retry count embedded in the intent.
- Phone phone = SipPhoneFactory.getDefaultPhone();
- int retryCount = getIntent().getIntExtra(EMERGENCY_CALL_RETRY_KEY, INITIAL_ATTEMPT);
-
- // create a new message object.
- EmergencyCallInfo eci = new EmergencyCallInfo();
- eci.phone = phone;
- eci.app = getApplication();
- eci.dialog = constructDialog(retryCount);
-
- // The Intent we're going to fire off to retry the call is the
- // same one that got us here (except that we *don't* explicitly
- // specify this class as the component!)
- eci.intent = getIntent().setComponent(null);
- // And we'll be firing this Intent from the PhoneApp's context
- // (see the startActivity() calls above) so the
- // FLAG_ACTIVITY_NEW_TASK flag is required.
- eci.intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
- // create the handler.
- if (sHandler == null) {
- sHandler = new EmergencyCallEventHandler();
- }
-
- // If this is the initial attempt, we need to register for a radio state
- // change and turn the radio on. Otherwise, this is just a retry, and
- // we simply wait the alloted time before sending the request to try
- // the call again.
-
- // Note: The radio logic ITSELF will try its best to put the emergency
- // call through once the radio is turned on. The retry we have here
- // is in case it fails; the current constants we have include making
- // 6 attempts, with a 5 second delay between each.
- if (retryCount == INITIAL_ATTEMPT) {
- // place the number of pending retries in the intent.
- eci.intent.putExtra(EMERGENCY_CALL_RETRY_KEY, NUMBER_OF_RETRIES);
-
- // turn the radio on and listen for it to complete.
- phone.registerForServiceStateChanged(sHandler,
- EVENT_SERVICE_STATE_CHANGED, eci);
-
- // If airplane mode is on, we turn it off the same way that the
- // Settings activity turns it off.
- if (Settings.System.getInt(getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON, 0) > 0) {
- // Change the system setting
- Settings.System.putInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0);
-
- // Post the intent
- Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- intent.putExtra("state", false);
- sendBroadcast(intent);
-
- // Otherwise, for some strange reason the radio is just off, so
- // we just turn it back on.
- } else {
- phone.setRadioPower(true);
- }
-
- } else {
- // decrement and store the number of retries.
- eci.intent.putExtra(EMERGENCY_CALL_RETRY_KEY, (retryCount - 1));
-
- // get the message and attach the data, then wait the alloted
- // time and send.
- Message m = sHandler.obtainMessage(EVENT_TIMEOUT_EMERGENCY_CALL);
- m.obj = eci;
- sHandler.sendMessageDelayed(m, TIME_BETWEEN_RETRIES_MS);
- }
- finish();
- }
-
- /**
- * create the dialog and hand it back to caller.
- */
- private ProgressDialog constructDialog(int retryCount) {
- // figure out the message to display.
- int msgId = (retryCount == INITIAL_ATTEMPT) ?
- R.string.emergency_enable_radio_dialog_message :
- R.string.emergency_enable_radio_dialog_retry;
-
- // create a system dialog that will persist outside this activity.
- ProgressDialog pd = new ProgressDialog(getApplication());
- pd.setTitle(getText(R.string.emergency_enable_radio_dialog_title));
- pd.setMessage(getText(msgId));
- pd.setIndeterminate(true);
- pd.setCancelable(false);
- pd.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
- pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
-
- // show the dialog
- pd.show();
-
- return pd;
- }
-}
diff --git a/phone/src/com/android/phone2/EmergencyCallbackModeExitDialog.java b/phone/src/com/android/phone2/EmergencyCallbackModeExitDialog.java
deleted file mode 100644
index 281ddff..0000000
--- a/phone/src/com/android/phone2/EmergencyCallbackModeExitDialog.java
+++ /dev/null
@@ -1,348 +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.phone2;
-
-import android.app.Activity;
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.app.AlertDialog;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.content.res.Resources;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.CountDownTimer;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.SystemProperties;
-import android.util.Log;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.telephony.TelephonyProperties;
-
-/**
- * Displays dialog that enables users to exit Emergency Callback Mode
- *
- * @see EmergencyCallbackModeService
- */
-public class EmergencyCallbackModeExitDialog extends Activity implements OnDismissListener {
-
- /** Intent to trigger the Emergency Callback Mode exit dialog */
- static final String ACTION_SHOW_ECM_EXIT_DIALOG =
- "com.android.phone2.action.ACTION_SHOW_ECM_EXIT_DIALOG";
- /** Used to get the users choice from the return Intent's extra */
- public static final String EXTRA_EXIT_ECM_RESULT = "exit_ecm_result";
-
- public static final int EXIT_ECM_BLOCK_OTHERS = 1;
- public static final int EXIT_ECM_DIALOG = 2;
- public static final int EXIT_ECM_PROGRESS_DIALOG = 3;
- public static final int EXIT_ECM_IN_EMERGENCY_CALL_DIALOG = 4;
-
- AlertDialog mAlertDialog = null;
- ProgressDialog mProgressDialog = null;
- CountDownTimer mTimer = null;
- EmergencyCallbackModeService mService = null;
- Handler mHandler = null;
- int mDialogType = 0;
- long mEcmTimeout = 0;
- private boolean mInEmergencyCall = false;
- private static final int ECM_TIMER_RESET = 1;
- private Phone mPhone = null;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Check if phone is in Emergency Callback Mode. If not, exit.
- if (!Boolean.parseBoolean(
- SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
- finish();
- }
-
- mHandler = new Handler();
-
- // Start thread that will wait for the connection completion so that it can get
- // timeout value from the service
- Thread waitForConnectionCompleteThread = new Thread(null, mTask,
- "EcmExitDialogWaitThread");
- waitForConnectionCompleteThread.start();
-
- // Register ECM timer reset notfication
- mPhone = SipPhoneFactory.getDefaultPhone();
- mPhone.registerForEcmTimerReset(mTimerResetHandler, ECM_TIMER_RESET, null);
-
- // Register receiver for intent closing the dialog
- IntentFilter filter = new IntentFilter();
- filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
- registerReceiver(mEcmExitReceiver, filter);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- unregisterReceiver(mEcmExitReceiver);
- // Unregister ECM timer reset notification
- mPhone.unregisterForEcmTimerReset(mHandler);
- }
-
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- mDialogType = savedInstanceState.getInt("DIALOG_TYPE");
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putInt("DIALOG_TYPE", mDialogType);
- }
-
- /**
- * Waits until bind to the service completes
- */
- private Runnable mTask = new Runnable() {
- public void run() {
- Looper.prepare();
-
- // Bind to the remote service
- bindService(new Intent(EmergencyCallbackModeExitDialog.this,
- EmergencyCallbackModeService.class), mConnection, Context.BIND_AUTO_CREATE);
-
- // Wait for bind to finish
- synchronized (EmergencyCallbackModeExitDialog.this) {
- try {
- if (mService == null) {
- EmergencyCallbackModeExitDialog.this.wait();
- }
- } catch (InterruptedException e) {
- Log.d("ECM", "EmergencyCallbackModeExitDialog InterruptedException: "
- + e.getMessage());
- e.printStackTrace();
- }
- }
-
- // Get timeout value and call state from the service
- if (mService != null) {
- mEcmTimeout = mService.getEmergencyCallbackModeTimeout();
- mInEmergencyCall = mService.getEmergencyCallbackModeCallState();
- }
-
- // Unbind from remote service
- unbindService(mConnection);
-
- // Show dialog
- mHandler.post(new Runnable() {
- public void run() {
- showEmergencyCallbackModeExitDialog();
- }
- });
- }
- };
-
- /**
- * Shows Emergency Callback Mode dialog and starts countdown timer
- */
- private void showEmergencyCallbackModeExitDialog() {
-
- if(mInEmergencyCall) {
- mDialogType = EXIT_ECM_IN_EMERGENCY_CALL_DIALOG;
- showDialog(EXIT_ECM_IN_EMERGENCY_CALL_DIALOG);
- } else {
- if (getIntent().getAction().equals(
- TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS)) {
- mDialogType = EXIT_ECM_BLOCK_OTHERS;
- showDialog(EXIT_ECM_BLOCK_OTHERS);
- } else if (getIntent().getAction().equals(ACTION_SHOW_ECM_EXIT_DIALOG)) {
- mDialogType = EXIT_ECM_DIALOG;
- showDialog(EXIT_ECM_DIALOG);
- }
-
- mTimer = new CountDownTimer(mEcmTimeout, 1000) {
- @Override
- public void onTick(long millisUntilFinished) {
- CharSequence text = getDialogText(millisUntilFinished);
- mAlertDialog.setMessage(text);
- }
-
- @Override
- public void onFinish() {
- //Do nothing
- }
- }.start();
- }
- }
-
- /**
- * Creates dialog that enables users to exit Emergency Callback Mode
- */
- @Override
- protected Dialog onCreateDialog(int id) {
- switch (id) {
- case EXIT_ECM_BLOCK_OTHERS:
- case EXIT_ECM_DIALOG:
- CharSequence text = getDialogText(mEcmTimeout);
- mAlertDialog = new AlertDialog.Builder(EmergencyCallbackModeExitDialog.this)
- .setIcon(R.drawable.picture_emergency32x32)
- .setTitle(R.string.phone_in_ecm_notification_title)
- .setMessage(text)
- .setPositiveButton(R.string.alert_dialog_yes,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,int whichButton) {
- // User clicked Yes. Exit Emergency Callback Mode.
- mPhone.exitEmergencyCallbackMode();
-
- // Show progress dialog
- showDialog(EXIT_ECM_PROGRESS_DIALOG);
- mTimer.cancel();
- }
- })
- .setNegativeButton(R.string.alert_dialog_no,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- // User clicked No
- setResult(RESULT_OK, (new Intent()).putExtra(
- EXTRA_EXIT_ECM_RESULT, false));
- finish();
- }
- }).create();
- mAlertDialog.setOnDismissListener(this);
- return mAlertDialog;
-
- case EXIT_ECM_IN_EMERGENCY_CALL_DIALOG:
- mAlertDialog = new AlertDialog.Builder(EmergencyCallbackModeExitDialog.this)
- .setIcon(R.drawable.picture_emergency32x32)
- .setTitle(R.string.phone_in_ecm_notification_title)
- .setMessage(R.string.alert_dialog_in_ecm_call)
- .setNeutralButton(R.string.alert_dialog_dismiss,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- // User clicked Dismiss
- setResult(RESULT_OK, (new Intent()).putExtra(
- EXTRA_EXIT_ECM_RESULT, false));
- finish();
- }
- }).create();
- mAlertDialog.setOnDismissListener(this);
- return mAlertDialog;
-
- case EXIT_ECM_PROGRESS_DIALOG:
- mProgressDialog = new ProgressDialog(EmergencyCallbackModeExitDialog.this);
- mProgressDialog.setMessage(getText(R.string.progress_dialog_exiting_ecm));
- mProgressDialog.setIndeterminate(true);
- mProgressDialog.setCancelable(false);
- return mProgressDialog;
-
- default:
- return null;
- }
- }
-
- /**
- * Returns dialog box text with updated timeout value
- */
- private CharSequence getDialogText(long millisUntilFinished) {
- // Format time
- int minutes = (int)(millisUntilFinished / 60000);
- String time = String.format("%d:%02d", minutes,
- (millisUntilFinished % 60000) / 1000);
-
- switch (mDialogType) {
- case EXIT_ECM_BLOCK_OTHERS:
- return String.format(getResources().getQuantityText(
- R.plurals.alert_dialog_not_avaialble_in_ecm, minutes).toString(), time);
- case EXIT_ECM_DIALOG:
- return String.format(getResources().getQuantityText(R.plurals.alert_dialog_exit_ecm,
- minutes).toString(), time);
- }
- return null;
- }
-
- /**
- * Closes activity when dialog is dismissed
- */
- public void onDismiss(DialogInterface dialog) {
- EmergencyCallbackModeExitDialog.this.setResult(RESULT_OK, (new Intent())
- .putExtra(EXTRA_EXIT_ECM_RESULT, false));
- finish();
- }
-
- /**
- * Listens for Emergency Callback Mode state change intents
- */
- private BroadcastReceiver mEcmExitReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- // Received exit Emergency Callback Mode notification close all dialogs
- if (intent.getAction().equals(
- TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED)) {
- if (intent.getBooleanExtra("phoneinECMState", false) == false) {
- if (mAlertDialog != null)
- mAlertDialog.dismiss();
- if (mProgressDialog != null)
- mProgressDialog.dismiss();
- EmergencyCallbackModeExitDialog.this.setResult(RESULT_OK, (new Intent())
- .putExtra(EXTRA_EXIT_ECM_RESULT, true));
- finish();
- }
- }
- }
- };
-
- /**
- * Class for interacting with the interface of the service
- */
- private ServiceConnection mConnection = new ServiceConnection() {
- public void onServiceConnected(ComponentName className, IBinder service) {
- mService = ((EmergencyCallbackModeService.LocalBinder)service).getService();
- // Notify thread that connection is ready
- synchronized (EmergencyCallbackModeExitDialog.this) {
- EmergencyCallbackModeExitDialog.this.notify();
- }
- }
-
- public void onServiceDisconnected(ComponentName className) {
- mService = null;
- }
- };
-
- /**
- * Class for receiving framework timer reset notifications
- */
- private Handler mTimerResetHandler = new Handler () {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case ECM_TIMER_RESET:
- if(!((Boolean)((AsyncResult) msg.obj).result).booleanValue()) {
- EmergencyCallbackModeExitDialog.this.setResult(RESULT_OK, (new Intent())
- .putExtra(EXTRA_EXIT_ECM_RESULT, false));
- finish();
- }
- break;
- }
- }
- };
-}
diff --git a/phone/src/com/android/phone2/EmergencyCallbackModeService.java b/phone/src/com/android/phone2/EmergencyCallbackModeService.java
deleted file mode 100644
index 5f1739b..0000000
--- a/phone/src/com/android/phone2/EmergencyCallbackModeService.java
+++ /dev/null
@@ -1,241 +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.phone2;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.Service;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.os.AsyncResult;
-import android.os.Binder;
-import android.os.CountDownTimer;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.SystemProperties;
-import android.util.Log;
-
-import com.android.internal.telephony.cdma.CDMAPhone;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.telephony.TelephonyProperties;
-
-/**
- * Application service that inserts/removes Emergency Callback Mode notification and
- * updates Emergency Callback Mode countdown clock in the notification
- *
- * @see EmergencyCallbackModeExitDialog
- */
-public class EmergencyCallbackModeService extends Service {
-
- // Default Emergency Callback Mode timeout value
- private static final int DEFAULT_ECM_EXIT_TIMER_VALUE = 300000;
- private static final String LOG_TAG = "EmergencyCallbackModeService";
-
- private NotificationManager mNotificationManager = null;
- private CountDownTimer mTimer = null;
- private long mTimeLeft = 0;
- private Phone mPhone = null;
- private boolean mInEmergencyCall = false;
-
- private static final int ECM_TIMER_RESET = 1;
-
- private Handler mHandler = new Handler () {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case ECM_TIMER_RESET:
- resetEcmTimer((AsyncResult) msg.obj);
- break;
- }
- }
- };
-
- @Override
- public void onCreate() {
- // Check if it is CDMA phone
- if (SipPhoneFactory.getDefaultPhone().getPhoneType() != Phone.PHONE_TYPE_CDMA) {
- Log.e(LOG_TAG, "Error! Emergency Callback Mode not supported for " +
- SipPhoneFactory.getDefaultPhone().getPhoneName() + " phones");
- stopSelf();
- }
-
- // Register receiver for intents
- IntentFilter filter = new IntentFilter();
- filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
- filter.addAction(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS);
- registerReceiver(mEcmReceiver, filter);
-
- mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
-
- // Register ECM timer reset notfication
- mPhone = SipPhoneFactory.getDefaultPhone();
- mPhone.registerForEcmTimerReset(mHandler, ECM_TIMER_RESET, null);
-
- startTimerNotification();
- }
-
- @Override
- public void onDestroy() {
- // Unregister receiver
- unregisterReceiver(mEcmReceiver);
- // Unregister ECM timer reset notification
- mPhone.unregisterForEcmTimerReset(mHandler);
-
- // Cancel the notification and timer
- mNotificationManager.cancel(R.string.phone_in_ecm_notification_title);
- mTimer.cancel();
- }
-
- /**
- * Listens for Emergency Callback Mode intents
- */
- private BroadcastReceiver mEcmReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- // Stop the service when phone exits Emergency Callback Mode
- if (intent.getAction().equals(
- TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED)) {
- if (intent.getBooleanExtra("phoneinECMState", false) == false) {
- stopSelf();
- }
- }
- // Show dialog box
- else if (intent.getAction().equals(
- TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS)) {
- context.startActivity(
- new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
- }
- }
- };
-
- /**
- * Start timer notification for Emergency Callback Mode
- */
- private void startTimerNotification() {
- // Get Emergency Callback Mode timeout value
- long ecmTimeout = SystemProperties.getLong(
- TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
-
- // Show the notification
- showNotification(ecmTimeout);
-
- // Start countdown timer for the notification updates
- mTimer = new CountDownTimer(ecmTimeout, 1000) {
-
- @Override
- public void onTick(long millisUntilFinished) {
- mTimeLeft = millisUntilFinished;
- EmergencyCallbackModeService.this.showNotification(millisUntilFinished);
- }
-
- @Override
- public void onFinish() {
- //Do nothing
- }
-
- }.start();
- }
-
- /**
- * Shows notification for Emergency Callback Mode
- */
- private void showNotification(long millisUntilFinished) {
-
- // Set the icon and text
- Notification notification = new Notification(
- R.drawable.picture_emergency25x25,
- getText(R.string.phone_entered_ecm_text), 0);
-
- // PendingIntent to launch Emergency Callback Mode Exit activity if the user selects
- // this notification
- PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
- new Intent(EmergencyCallbackModeExitDialog.ACTION_SHOW_ECM_EXIT_DIALOG), 0);
-
- // Format notification string
- String text = null;
- if(mInEmergencyCall) {
- text = getText(R.string.phone_in_ecm_call_notification_text).toString();
- } else {
- int minutes = (int)(millisUntilFinished / 60000);
- String time = String.format("%d:%02d", minutes, (millisUntilFinished % 60000) / 1000);
- text = String.format(getResources().getQuantityText(
- R.plurals.phone_in_ecm_notification_time, minutes).toString(), time);
- }
- // Set the info in the notification
- notification.setLatestEventInfo(this, getText(R.string.phone_in_ecm_notification_title),
- text, contentIntent);
-
- notification.flags = Notification.FLAG_ONGOING_EVENT;
-
- // Show notification
- mNotificationManager.notify(R.string.phone_in_ecm_notification_title, notification);
- }
-
- /**
- * Handle ECM_TIMER_RESET notification
- */
- private void resetEcmTimer(AsyncResult r) {
- boolean isTimerCanceled = ((Boolean)r.result).booleanValue();
-
- if (isTimerCanceled) {
- mInEmergencyCall = true;
- mTimer.cancel();
- showNotification(0);
- } else {
- mInEmergencyCall = false;
- startTimerNotification();
- }
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
-
- // This is the object that receives interactions from clients.
- private final IBinder mBinder = new LocalBinder();
-
- /**
- * Class for clients to access
- */
- public class LocalBinder extends Binder {
- EmergencyCallbackModeService getService() {
- return EmergencyCallbackModeService.this;
- }
- }
-
- /**
- * Returns Emergency Callback Mode timeout value
- */
- public long getEmergencyCallbackModeTimeout() {
- return mTimeLeft;
- }
-
- /**
- * Returns Emergency Callback Mode call state
- */
- public boolean getEmergencyCallbackModeCallState() {
- return mInEmergencyCall;
- }
-}
diff --git a/phone/src/com/android/phone2/EmergencyDialer.java b/phone/src/com/android/phone2/EmergencyDialer.java
deleted file mode 100644
index dd44799..0000000
--- a/phone/src/com/android/phone2/EmergencyDialer.java
+++ /dev/null
@@ -1,604 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.media.ToneGenerator;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.provider.Settings;
-import android.telephony.PhoneNumberUtils;
-import android.text.Editable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.method.DialerKeyListener;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.EditText;
-
-/**
- * EmergencyDialer is a special dialer that is used ONLY for dialing emergency calls.
- *
- * It's a simplified version of the regular dialer (i.e. the TwelveKeyDialer
- * activity from apps/Contacts) that:
- * 1. Allows ONLY emergency calls to be dialed
- * 2. Disallows voicemail functionality
- * 3. Uses the FLAG_SHOW_WHEN_LOCKED window manager flag to allow this
- * activity to stay in front of the keyguard.
- *
- * TODO: Even though this is an ultra-simplified version of the normal
- * dialer, there's still lots of code duplication between this class and
- * the TwelveKeyDialer class from apps/Contacts. Could the common code be
- * moved into a shared base class that would live in the framework?
- * Or could we figure out some way to move *this* class into apps/Contacts
- * also?
- */
-public class EmergencyDialer extends Activity
- implements View.OnClickListener, View.OnLongClickListener,
- View.OnKeyListener, TextWatcher {
- // Keys used with onSaveInstanceState().
- private static final String LAST_NUMBER = "lastNumber";
-
- // Intent action for this activity.
- public static final String ACTION_DIAL = "com.android.phone2.EmergencyDialer.DIAL";
-
- // Debug constants.
- private static final boolean DBG = false;
- private static final String LOG_TAG = "EmergencyDialer";
-
- /** The length of DTMF tones in milliseconds */
- private static final int TONE_LENGTH_MS = 150;
-
- /** The DTMF tone volume relative to other sounds in the stream */
- private static final int TONE_RELATIVE_VOLUME = 80;
-
- /** Stream type used to play the DTMF tones off call, and mapped to the volume control keys */
- private static final int DIAL_TONE_STREAM_TYPE = AudioManager.STREAM_MUSIC;
-
- private static final int BAD_EMERGENCY_NUMBER_DIALOG = 0;
-
- EditText mDigits;
- // If mVoicemailDialAndDeleteRow is null, mDialButton and mDelete are also null.
- private View mVoicemailDialAndDeleteRow;
- private View mDialButton;
- private View mDelete;
-
- private ToneGenerator mToneGenerator;
- private Object mToneGeneratorLock = new Object();
-
- // new UI background assets
- private Drawable mDigitsBackground;
- private Drawable mDigitsEmptyBackground;
-
- // determines if we want to playback local DTMF tones.
- private boolean mDTMFToneEnabled;
-
- // Haptic feedback (vibration) for dialer key presses.
- private HapticFeedback mHaptic = new HapticFeedback();
-
- // close activity when screen turns off
- private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
- finish();
- }
- }
- };
-
- private String mLastNumber; // last number we tried to dial. Used to restore error dialog.
-
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- // Do nothing
- }
-
- public void onTextChanged(CharSequence input, int start, int before, int changeCount) {
- // Do nothing
- }
-
-
- public void afterTextChanged(Editable input) {
- // Check for special sequences, in particular the "**04" or "**05"
- // sequences that allow you to enter PIN or PUK-related codes.
- //
- // But note we *don't* allow most other special sequences here,
- // like "secret codes" (*#*#<code>#*#*) or IMEI display ("*#06#"),
- // since those shouldn't be available if the device is locked.
- //
- // So we call SpecialCharSequenceMgr.handleCharsForLockedDevice()
- // here, not the regular handleChars() method.
- if (SpecialCharSequenceMgr.handleCharsForLockedDevice(this, input.toString(), this)) {
- // A special sequence was entered, clear the digits
- mDigits.getText().clear();
- }
-
- final boolean notEmpty = mDigits.length() != 0;
- if (notEmpty) {
- mDigits.setBackgroundDrawable(mDigitsBackground);
- } else {
- mDigits.setBackgroundDrawable(mDigitsEmptyBackground);
- }
-
- updateDialAndDeleteButtonStateEnabledAttr();
- }
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- // set this flag so this activity will stay in front of the keyguard
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
-
- // Set the content view
- setContentView(R.layout.emergency_dialer);
-
- // Load up the resources for the text field and delete button
- Resources r = getResources();
- mDigitsBackground = r.getDrawable(R.drawable.btn_dial_textfield_active);
- mDigitsEmptyBackground = r.getDrawable(R.drawable.btn_dial_textfield);
-
- mDigits = (EditText) findViewById(R.id.digits);
- mDigits.setKeyListener(DialerKeyListener.getInstance());
- mDigits.setOnClickListener(this);
- mDigits.setOnKeyListener(this);
- mDigits.setLongClickable(false);
- maybeAddNumberFormatting();
-
- // Check for the presence of the keypad
- View view = findViewById(R.id.one);
- if (view != null) {
- setupKeypad();
- }
-
- mVoicemailDialAndDeleteRow = findViewById(R.id.voicemailAndDialAndDelete);
-
- // Check whether we should show the onscreen "Dial" button and co.
- if (r.getBoolean(R.bool.config_show_onscreen_dial_button)) {
-
- // The voicemail button is not active. Even if we marked
- // it as disabled in the layout, we have to manually clear
- // that state as well (b/2134374)
- // TODO: Check with UI designer if we should not show that button at all. (b/2134854)
- mVoicemailDialAndDeleteRow.findViewById(R.id.voicemailButton).setEnabled(false);
-
- mDialButton = mVoicemailDialAndDeleteRow.findViewById(R.id.dialButton);
- mDialButton.setOnClickListener(this);
-
- mDelete = mVoicemailDialAndDeleteRow.findViewById(R.id.deleteButton);
- mDelete.setOnClickListener(this);
- mDelete.setOnLongClickListener(this);
- } else {
- mVoicemailDialAndDeleteRow.setVisibility(View.GONE); // It's VISIBLE by default
- mVoicemailDialAndDeleteRow = null;
- }
-
-
- if (icicle != null) {
- super.onRestoreInstanceState(icicle);
- }
-
- // if the mToneGenerator creation fails, just continue without it. It is
- // a local audio signal, and is not as important as the dtmf tone itself.
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator == null) {
- try {
- // we want the user to be able to control the volume of the dial tones
- // outside of a call, so we use the stream type that is also mapped to the
- // volume control keys for this activity
- mToneGenerator = new ToneGenerator(DIAL_TONE_STREAM_TYPE, TONE_RELATIVE_VOLUME);
- setVolumeControlStream(DIAL_TONE_STREAM_TYPE);
- } catch (RuntimeException e) {
- Log.w(LOG_TAG, "Exception caught while creating local tone generator: " + e);
- mToneGenerator = null;
- }
- }
- }
-
- final IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
- registerReceiver(mBroadcastReceiver, intentFilter);
-
- try {
- mHaptic.init(this, r.getBoolean(R.bool.config_enable_dialer_key_vibration));
- } catch (Resources.NotFoundException nfe) {
- Log.e(LOG_TAG, "Vibrate control bool missing.", nfe);
- }
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator != null) {
- mToneGenerator.release();
- mToneGenerator = null;
- }
- }
- unregisterReceiver(mBroadcastReceiver);
- }
-
- @Override
- protected void onRestoreInstanceState(Bundle icicle) {
- mLastNumber = icicle.getString(LAST_NUMBER);
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putString(LAST_NUMBER, mLastNumber);
- }
-
- /**
- * Explicitly turn off number formatting, since it gets in the way of the emergency
- * number detector
- */
- protected void maybeAddNumberFormatting() {
- // Do nothing.
- }
-
- @Override
- protected void onPostCreate(Bundle savedInstanceState) {
- super.onPostCreate(savedInstanceState);
-
- // This can't be done in onCreate(), since the auto-restoring of the digits
- // will play DTMF tones for all the old digits if it is when onRestoreSavedInstanceState()
- // is called. This method will be called every time the activity is created, and
- // will always happen after onRestoreSavedInstanceState().
- mDigits.addTextChangedListener(this);
- }
-
- private void setupKeypad() {
- // Setup the listeners for the buttons
- findViewById(R.id.one).setOnClickListener(this);
- findViewById(R.id.two).setOnClickListener(this);
- findViewById(R.id.three).setOnClickListener(this);
- findViewById(R.id.four).setOnClickListener(this);
- findViewById(R.id.five).setOnClickListener(this);
- findViewById(R.id.six).setOnClickListener(this);
- findViewById(R.id.seven).setOnClickListener(this);
- findViewById(R.id.eight).setOnClickListener(this);
- findViewById(R.id.nine).setOnClickListener(this);
- findViewById(R.id.star).setOnClickListener(this);
-
- View view = findViewById(R.id.zero);
- view.setOnClickListener(this);
- view.setOnLongClickListener(this);
-
- findViewById(R.id.pound).setOnClickListener(this);
- }
-
- /**
- * handle key events
- */
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_CALL: {
- if (TextUtils.isEmpty(mDigits.getText().toString())) {
- // if we are adding a call from the InCallScreen and the phone
- // number entered is empty, we just close the dialer to expose
- // the InCallScreen under it.
- finish();
- } else {
- // otherwise, we place the call.
- placeCall();
- }
- return true;
- }
- }
- return super.onKeyDown(keyCode, event);
- }
-
- private void keyPressed(int keyCode) {
- mHaptic.vibrate();
- KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
- mDigits.onKeyDown(keyCode, event);
- }
-
- public boolean onKey(View view, int keyCode, KeyEvent event) {
- switch (view.getId()) {
- case R.id.digits:
- if (keyCode == KeyEvent.KEYCODE_ENTER) {
- placeCall();
- return true;
- }
- break;
- }
- return false;
- }
-
- public void onClick(View view) {
- switch (view.getId()) {
- case R.id.one: {
- playTone(ToneGenerator.TONE_DTMF_1);
- keyPressed(KeyEvent.KEYCODE_1);
- return;
- }
- case R.id.two: {
- playTone(ToneGenerator.TONE_DTMF_2);
- keyPressed(KeyEvent.KEYCODE_2);
- return;
- }
- case R.id.three: {
- playTone(ToneGenerator.TONE_DTMF_3);
- keyPressed(KeyEvent.KEYCODE_3);
- return;
- }
- case R.id.four: {
- playTone(ToneGenerator.TONE_DTMF_4);
- keyPressed(KeyEvent.KEYCODE_4);
- return;
- }
- case R.id.five: {
- playTone(ToneGenerator.TONE_DTMF_5);
- keyPressed(KeyEvent.KEYCODE_5);
- return;
- }
- case R.id.six: {
- playTone(ToneGenerator.TONE_DTMF_6);
- keyPressed(KeyEvent.KEYCODE_6);
- return;
- }
- case R.id.seven: {
- playTone(ToneGenerator.TONE_DTMF_7);
- keyPressed(KeyEvent.KEYCODE_7);
- return;
- }
- case R.id.eight: {
- playTone(ToneGenerator.TONE_DTMF_8);
- keyPressed(KeyEvent.KEYCODE_8);
- return;
- }
- case R.id.nine: {
- playTone(ToneGenerator.TONE_DTMF_9);
- keyPressed(KeyEvent.KEYCODE_9);
- return;
- }
- case R.id.zero: {
- playTone(ToneGenerator.TONE_DTMF_0);
- keyPressed(KeyEvent.KEYCODE_0);
- return;
- }
- case R.id.pound: {
- playTone(ToneGenerator.TONE_DTMF_P);
- keyPressed(KeyEvent.KEYCODE_POUND);
- return;
- }
- case R.id.star: {
- playTone(ToneGenerator.TONE_DTMF_S);
- keyPressed(KeyEvent.KEYCODE_STAR);
- return;
- }
- case R.id.deleteButton: {
- keyPressed(KeyEvent.KEYCODE_DEL);
- return;
- }
- case R.id.dialButton: {
- mHaptic.vibrate(); // Vibrate here too, just like we do for the regular keys
- placeCall();
- return;
- }
- case R.id.digits: {
- if (mDigits.length() != 0) {
- mDigits.setCursorVisible(true);
- }
- return;
- }
- }
- }
-
- /**
- * called for long touch events
- */
- public boolean onLongClick(View view) {
- int id = view.getId();
- switch (id) {
- case R.id.deleteButton: {
- mDigits.getText().clear();
- // TODO: The framework forgets to clear the pressed
- // status of disabled button. Until this is fixed,
- // clear manually the pressed status. b/2133127
- mDelete.setPressed(false);
- return true;
- }
- case R.id.zero: {
- keyPressed(KeyEvent.KEYCODE_PLUS);
- return true;
- }
- }
- return false;
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- // retrieve the DTMF tone play back setting.
- mDTMFToneEnabled = Settings.System.getInt(getContentResolver(),
- Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1;
-
- // Retrieve the haptic feedback setting.
- mHaptic.checkSystemSetting();
-
- // if the mToneGenerator creation fails, just continue without it. It is
- // a local audio signal, and is not as important as the dtmf tone itself.
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator == null) {
- try {
- mToneGenerator = new ToneGenerator(AudioManager.STREAM_DTMF,
- TONE_RELATIVE_VOLUME);
- } catch (RuntimeException e) {
- Log.w(LOG_TAG, "Exception caught while creating local tone generator: " + e);
- mToneGenerator = null;
- }
- }
- }
-
- // Disable the status bar and set the poke lock timeout to medium.
- // There is no need to do anything with the wake lock.
- if (DBG) Log.d(LOG_TAG, "disabling status bar, set to long timeout");
- PhoneApp app = (PhoneApp) getApplication();
- app.disableStatusBar();
- app.setScreenTimeout(PhoneApp.ScreenTimeoutDuration.MEDIUM);
-
- updateDialAndDeleteButtonStateEnabledAttr();
- }
-
- @Override
- public void onPause() {
- // Reenable the status bar and set the poke lock timeout to default.
- // There is no need to do anything with the wake lock.
- if (DBG) Log.d(LOG_TAG, "reenabling status bar and closing the dialer");
- PhoneApp app = (PhoneApp) getApplication();
- app.reenableStatusBar();
- app.setScreenTimeout(PhoneApp.ScreenTimeoutDuration.DEFAULT);
-
- super.onPause();
-
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator != null) {
- mToneGenerator.release();
- mToneGenerator = null;
- }
- }
- }
-
- /**
- * place the call, but check to make sure it is a viable number.
- */
- void placeCall() {
- mLastNumber = mDigits.getText().toString();
- if (PhoneNumberUtils.isEmergencyNumber(mLastNumber)) {
- if (DBG) Log.d(LOG_TAG, "placing call to " + mLastNumber);
-
- // place the call if it is a valid number
- if (mLastNumber == null || !TextUtils.isGraphic(mLastNumber)) {
- // There is no number entered.
- playTone(ToneGenerator.TONE_PROP_NACK);
- return;
- }
- Intent intent = new Intent(Intent.ACTION_CALL_EMERGENCY);
- intent.setData(Uri.fromParts("tel", mLastNumber, null));
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
- finish();
- } else {
- if (DBG) Log.d(LOG_TAG, "rejecting bad requested number " + mLastNumber);
-
- // erase the number and throw up an alert dialog.
- mDigits.getText().delete(0, mDigits.getText().length());
- showDialog(BAD_EMERGENCY_NUMBER_DIALOG);
- }
- }
-
-
- /**
- * Plays the specified tone for TONE_LENGTH_MS milliseconds.
- *
- * The tone is played locally, using the audio stream for phone calls.
- * Tones are played only if the "Audible touch tones" user preference
- * is checked, and are NOT played if the device is in silent mode.
- *
- * @param tone a tone code from {@link ToneGenerator}
- */
- void playTone(int tone) {
- // if local tone playback is disabled, just return.
- if (!mDTMFToneEnabled) {
- return;
- }
-
- // Also do nothing if the phone is in silent mode.
- // We need to re-check the ringer mode for *every* playTone()
- // call, rather than keeping a local flag that's updated in
- // onResume(), since it's possible to toggle silent mode without
- // leaving the current activity (via the ENDCALL-longpress menu.)
- AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
- int ringerMode = audioManager.getRingerMode();
- if ((ringerMode == AudioManager.RINGER_MODE_SILENT)
- || (ringerMode == AudioManager.RINGER_MODE_VIBRATE)) {
- return;
- }
-
- synchronized (mToneGeneratorLock) {
- if (mToneGenerator == null) {
- Log.w(LOG_TAG, "playTone: mToneGenerator == null, tone: " + tone);
- return;
- }
-
- // Start the new tone (will stop any playing tone)
- mToneGenerator.startTone(tone, TONE_LENGTH_MS);
- }
- }
-
- private CharSequence createErrorMessage(String number) {
- if (!TextUtils.isEmpty(number)) {
- return getString(R.string.dial_emergency_error, mLastNumber);
- } else {
- return getText(R.string.dial_emergency_empty_error).toString();
- }
- }
-
- @Override
- protected Dialog onCreateDialog(int id) {
- AlertDialog dialog = null;
- if (id == BAD_EMERGENCY_NUMBER_DIALOG) {
- // construct dialog
- dialog = new AlertDialog.Builder(this)
- .setTitle(getText(R.string.emergency_enable_radio_dialog_title))
- .setMessage(createErrorMessage(mLastNumber))
- .setPositiveButton(R.string.ok, null)
- .setCancelable(true).create();
-
- // blur stuff behind the dialog
- dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
- }
- return dialog;
- }
-
- @Override
- protected void onPrepareDialog(int id, Dialog dialog) {
- super.onPrepareDialog(id, dialog);
- if (id == BAD_EMERGENCY_NUMBER_DIALOG) {
- AlertDialog alert = (AlertDialog) dialog;
- alert.setMessage(createErrorMessage(mLastNumber));
- }
- }
-
- /**
- * Update the enabledness of the "Dial" and "Backspace" buttons if applicable.
- */
- private void updateDialAndDeleteButtonStateEnabledAttr() {
- if (null != mVoicemailDialAndDeleteRow) {
- final boolean notEmpty = mDigits.length() != 0;
-
- mDialButton.setEnabled(notEmpty);
- mDelete.setEnabled(notEmpty);
- }
- }
-}
diff --git a/phone/src/com/android/phone2/EnableFdnScreen.java b/phone/src/com/android/phone2/EnableFdnScreen.java
deleted file mode 100644
index b41ff70..0000000
--- a/phone/src/com/android/phone2/EnableFdnScreen.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.text.TextUtils;
-import android.text.method.DigitsKeyListener;
-import android.util.Log;
-import android.view.View;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-/**
- * UI to enable/disable FDN.
- */
-public class EnableFdnScreen extends Activity {
- private static final String LOG_TAG = PhoneApp.LOG_TAG;
- private static final boolean DBG = false;
-
- private static final int ENABLE_FDN_COMPLETE = 100;
-
- private LinearLayout mPinFieldContainer;
- private EditText mPin2Field;
- private TextView mStatusField;
- private boolean mEnable;
- private Phone mPhone;
-
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case ENABLE_FDN_COMPLETE:
- AsyncResult ar = (AsyncResult) msg.obj;
- handleResult(ar);
- break;
- }
-
- return;
- }
- };
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- setContentView(R.layout.enable_fdn_screen);
- setupView();
-
- mPhone = SipPhoneFactory.getDefaultPhone();
- mEnable = !mPhone.getIccCard().getIccFdnEnabled();
-
- int id = mEnable ? R.string.enable_fdn : R.string.disable_fdn;
- setTitle(getResources().getText(id));
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mPhone = SipPhoneFactory.getDefaultPhone();
- }
-
- private void setupView() {
- mPin2Field = (EditText) findViewById(R.id.pin);
- mPin2Field.setKeyListener(DigitsKeyListener.getInstance());
- mPin2Field.setMovementMethod(null);
- mPin2Field.setOnClickListener(mClicked);
-
- mPinFieldContainer = (LinearLayout) findViewById(R.id.pinc);
- mStatusField = (TextView) findViewById(R.id.status);
- }
-
- private void showStatus(CharSequence statusMsg) {
- if (statusMsg != null) {
- mStatusField.setText(statusMsg);
- mStatusField.setVisibility(View.VISIBLE);
- mPinFieldContainer.setVisibility(View.GONE);
- } else {
- mPinFieldContainer.setVisibility(View.VISIBLE);
- mStatusField.setVisibility(View.GONE);
- }
- }
-
- private String getPin2() {
- return mPin2Field.getText().toString();
- }
-
- private void enableFdn() {
- Message callback = Message.obtain(mHandler, ENABLE_FDN_COMPLETE);
- mPhone.getIccCard().setIccFdnEnabled(mEnable, getPin2(), callback);
- if (DBG) log("enableFdn: please wait...");
- }
-
- private void handleResult(AsyncResult ar) {
- if (ar.exception == null) {
- if (DBG) log("handleResult: success!");
- showStatus(getResources().getText(mEnable ?
- R.string.enable_fdn_ok : R.string.disable_fdn_ok));
- } else if (ar.exception instanceof CommandException
- /* && ((CommandException)ar.exception).getCommandError() ==
- CommandException.Error.GENERIC_FAILURE */ ) {
- if (DBG) log("handleResult: failed!");
- showStatus(getResources().getText(
- R.string.pin_failed));
- }
-
- mHandler.postDelayed(new Runnable() {
- public void run() {
- finish();
- }
- }, 3000);
- }
-
- private View.OnClickListener mClicked = new View.OnClickListener() {
- public void onClick(View v) {
- if (TextUtils.isEmpty(mPin2Field.getText())) {
- return;
- }
-
- showStatus(getResources().getText(
- R.string.enable_in_progress));
-
- enableFdn();
- }
- };
-
- private void log(String msg) {
- Log.d(LOG_TAG, "[EnableSimPin] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/EnableIccPinScreen.java b/phone/src/com/android/phone2/EnableIccPinScreen.java
deleted file mode 100644
index dc52f2a..0000000
--- a/phone/src/com/android/phone2/EnableIccPinScreen.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.text.TextUtils;
-import android.text.method.DigitsKeyListener;
-import android.util.Log;
-import android.view.View;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-/**
- * UI to enable/disable the ICC PIN.
- */
-public class EnableIccPinScreen extends Activity {
- private static final String LOG_TAG = PhoneApp.LOG_TAG;
-
- private static final int ENABLE_ICC_PIN_COMPLETE = 100;
- private static final boolean DBG = false;
-
- private LinearLayout mPinFieldContainer;
- private EditText mPinField;
- private TextView mStatusField;
- private boolean mEnable;
- private Phone mPhone;
-
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case ENABLE_ICC_PIN_COMPLETE:
- AsyncResult ar = (AsyncResult) msg.obj;
- handleResult(ar);
- break;
- }
-
- return;
- }
- };
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- setContentView(R.layout.enable_sim_pin_screen);
- setupView();
-
- mPhone = SipPhoneFactory.getDefaultPhone();
- mEnable = !mPhone.getIccCard().getIccLockEnabled();
-
- int id = mEnable ? R.string.enable_sim_pin : R.string.disable_sim_pin;
- setTitle(getResources().getText(id));
- }
-
- private void setupView() {
- mPinField = (EditText) findViewById(R.id.pin);
- mPinField.setKeyListener(DigitsKeyListener.getInstance());
- mPinField.setMovementMethod(null);
- mPinField.setOnClickListener(mClicked);
-
- mPinFieldContainer = (LinearLayout) findViewById(R.id.pinc);
- mStatusField = (TextView) findViewById(R.id.status);
- }
-
- private void showStatus(CharSequence statusMsg) {
- if (statusMsg != null) {
- mStatusField.setText(statusMsg);
- mStatusField.setVisibility(View.VISIBLE);
- mPinFieldContainer.setVisibility(View.GONE);
- } else {
- mPinFieldContainer.setVisibility(View.VISIBLE);
- mStatusField.setVisibility(View.GONE);
- }
- }
-
- private String getPin() {
- return mPinField.getText().toString();
- }
-
- private void enableIccPin() {
- Message callback = Message.obtain(mHandler, ENABLE_ICC_PIN_COMPLETE);
- if (DBG) log("enableIccPin:");
- mPhone.getIccCard().setIccLockEnabled(mEnable, getPin(), callback);
- if (DBG) log("enableIccPin: please wait...");
- }
-
- private void handleResult(AsyncResult ar) {
- if (ar.exception == null) {
- if (DBG) log("handleResult: success!");
- showStatus(getResources().getText(
- mEnable ? R.string.enable_pin_ok : R.string.disable_pin_ok));
- } else if (ar.exception instanceof CommandException
- /* && ((CommandException)ar.exception).getCommandError() ==
- CommandException.Error.GENERIC_FAILURE */ ) {
- if (DBG) log("handleResult: failed!");
- showStatus(getResources().getText(
- R.string.pin_failed));
- }
-
- mHandler.postDelayed(new Runnable() {
- public void run() {
- finish();
- }
- }, 3000);
- }
-
- private View.OnClickListener mClicked = new View.OnClickListener() {
- public void onClick(View v) {
- if (TextUtils.isEmpty(mPinField.getText())) {
- return;
- }
-
- showStatus(getResources().getText(
- R.string.enable_in_progress));
-
- enableIccPin();
- }
- };
-
- private void log(String msg) {
- Log.d(LOG_TAG, "[EnableIccPin] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/EventLogTags.logtags b/phone/src/com/android/phone2/EventLogTags.logtags
deleted file mode 100644
index f9db208..0000000
--- a/phone/src/com/android/phone2/EventLogTags.logtags
+++ /dev/null
@@ -1,9 +0,0 @@
-# See system/core/logcat/event.logtags for a description of the format of this file.
-
-option java_package com.android.phone2;
-
-70301 phone_ui_enter
-70302 phone_ui_exit
-70303 phone_ui_button_click (text|3)
-70304 phone_ui_ringer_query_elapsed
-70305 phone_ui_multiple_query
diff --git a/phone/src/com/android/phone2/FakePhoneActivity.java b/phone/src/com/android/phone2/FakePhoneActivity.java
deleted file mode 100644
index 67d9350..0000000
--- a/phone/src/com/android/phone2/FakePhoneActivity.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone2;
-
-import android.app.Activity;
-import android.app.NotificationManager;
-import android.os.Bundle;
-import com.android.internal.telephony.test.SimulatedRadioControl;
-import android.util.Log;
-import android.view.View.OnClickListener;
-import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.Toast;
-
-/**
- * A simple activity that presents you with a UI for faking incoming phone operations.
- */
-public class FakePhoneActivity extends Activity {
- private static final String TAG = "FakePhoneActivity";
-
- private Button mPlaceCall;
- private EditText mPhoneNumber;
- SimulatedRadioControl mRadioControl;
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- setContentView(R.layout.fake_phone_activity);
-
- mPlaceCall = (Button) findViewById(R.id.placeCall);
- mPlaceCall.setOnClickListener(new ButtonListener());
-
- mPhoneNumber = (EditText) findViewById(R.id.phoneNumber);
- mPhoneNumber.setOnClickListener(
- new View.OnClickListener() {
- public void onClick(View v) {
- mPlaceCall.requestFocus();
- }
- });
-
- mRadioControl = PhoneApp.getInstance().phone.getSimulatedRadioControl();
-
- Log.i(TAG, "- PhoneApp.getInstance(): " + PhoneApp.getInstance());
- Log.i(TAG, "- PhoneApp.getInstance().phone: " + PhoneApp.getInstance().phone);
- Log.i(TAG, "- mRadioControl: " + mRadioControl);
- }
-
- private class ButtonListener implements OnClickListener {
- public void onClick(View v) {
- if (mRadioControl == null) {
- Log.e("Phone", "SimulatedRadioControl not available, abort!");
- NotificationManager nm =
- (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
- Toast.makeText(FakePhoneActivity.this, "null mRadioControl!",
- Toast.LENGTH_SHORT).show();
- return;
- }
-
- mRadioControl.triggerRing(mPhoneNumber.getText().toString());
- }
- }
-}
diff --git a/phone/src/com/android/phone2/FdnList.java b/phone/src/com/android/phone2/FdnList.java
deleted file mode 100644
index c66d338..0000000
--- a/phone/src/com/android/phone2/FdnList.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone2;
-
-import android.content.Intent;
-import android.content.res.Resources;
-import android.net.Uri;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.ListView;
-
-/**
- * FDN List UI for the Phone app.
- */
-public class FdnList extends ADNList {
- private static final int MENU_ADD = 1;
- private static final int MENU_EDIT = 2;
- private static final int MENU_DELETE = 3;
-
- private static final String INTENT_EXTRA_NAME = "name";
- private static final String INTENT_EXTRA_NUMBER = "number";
-
-
- @Override
- protected Uri resolveIntent() {
- Intent intent = getIntent();
- intent.setData(Uri.parse("content://icc/fdn"));
- return intent.getData();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
-
- Resources r = getResources();
-
- // Added the icons to the context menu
- menu.add(0, MENU_ADD, 0, r.getString(R.string.menu_add))
- .setIcon(android.R.drawable.ic_menu_add);
- menu.add(0, MENU_EDIT, 0, r.getString(R.string.menu_edit))
- .setIcon(android.R.drawable.ic_menu_edit);
- menu.add(0, MENU_DELETE, 0, r.getString(R.string.menu_delete))
- .setIcon(android.R.drawable.ic_menu_delete);
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
- boolean hasSelection = (getSelectedItemPosition() >= 0);
-
- menu.findItem(MENU_ADD).setVisible(true);
- menu.findItem(MENU_EDIT).setVisible(hasSelection);
- menu.findItem(MENU_DELETE).setVisible(hasSelection);
-
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case MENU_ADD:
- addContact();
- return true;
-
- case MENU_EDIT:
- editSelected();
- return true;
-
- case MENU_DELETE:
- deleteSelected();
- return true;
- }
-
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public void onListItemClick(ListView l, View v, int position, long id) {
- // TODO: is this what we really want?
- editSelected(position);
- }
-
- private void addContact() {
- // if we don't put extras "name" when starting this activity, then
- // EditFdnContactScreen treats it like add contact.
- Intent intent = new Intent();
- intent.setClass(this, EditFdnContactScreen.class);
- startActivity(intent);
- }
-
- /**
- * Overloaded to call editSelected with the current selection
- * by default. This method may have a problem with touch UI
- * since touch UI does not really have a concept of "selected"
- * items.
- */
- private void editSelected() {
- editSelected(getSelectedItemPosition());
- }
-
- /**
- * Edit the item at the selected position in the list.
- */
- private void editSelected(int position) {
- if (mCursor.moveToPosition(position)) {
- String name = mCursor.getString(NAME_COLUMN);
- String number = mCursor.getString(NUMBER_COLUMN);
-
- Intent intent = new Intent();
- intent.setClass(this, EditFdnContactScreen.class);
- intent.putExtra(INTENT_EXTRA_NAME, name);
- intent.putExtra(INTENT_EXTRA_NUMBER, number);
- startActivity(intent);
- }
- }
-
- private void deleteSelected() {
- if (mCursor.moveToPosition(getSelectedItemPosition())) {
- String name = mCursor.getString(NAME_COLUMN);
- String number = mCursor.getString(NUMBER_COLUMN);
-
- Intent intent = new Intent();
- intent.setClass(this, DeleteFdnContactScreen.class);
- intent.putExtra(INTENT_EXTRA_NAME, name);
- intent.putExtra(INTENT_EXTRA_NUMBER, number);
- startActivity(intent);
- }
- }
-}
diff --git a/phone/src/com/android/phone2/FdnSetting.java b/phone/src/com/android/phone2/FdnSetting.java
deleted file mode 100644
index 1760183..0000000
--- a/phone/src/com/android/phone2/FdnSetting.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.view.WindowManager;
-import android.widget.Toast;
-
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-/**
- * FDN settings UI for the Phone app.
- * Rewritten to look and behave closer to the other preferences.
- */
-public class FdnSetting extends PreferenceActivity
- implements EditPinPreference.OnPinEnteredListener, DialogInterface.OnCancelListener {
-
- private Phone mPhone;
-
- /**
- * Events we handle.
- * The first is used for toggling FDN enable, the second for the PIN change.
- */
- private static final int EVENT_PIN2_ENTRY_COMPLETE = 100;
- private static final int EVENT_PIN2_CHANGE_COMPLETE = 200;
-
- // String keys for preference lookup
- // We only care about the pin preferences here, the manage FDN contacts
- // Preference is handled solely in xml.
- private static final String BUTTON_FDN_ENABLE_KEY = "button_fdn_enable_key";
- private static final String BUTTON_CHANGE_PIN2_KEY = "button_change_pin2_key";
-
- private EditPinPreference mButtonEnableFDN;
- private EditPinPreference mButtonChangePin2;
-
- // State variables
- private String mOldPin;
- private String mNewPin;
- private static final int PIN_CHANGE_OLD = 0;
- private static final int PIN_CHANGE_NEW = 1;
- private static final int PIN_CHANGE_REENTER = 2;
- private static final int PIN_CHANGE_PUK = 3;
- private int mPinChangeState;
- private boolean mSkipOldPin; // Indicates we know that we are PUK2 blocked.
-
- private static final String SKIP_OLD_PIN_KEY = "skip_old_pin_key";
- private static final String PIN_CHANGE_STATE_KEY = "pin_change_state_key";
- private static final String OLD_PIN_KEY = "old_pin_key";
- private static final String NEW_PIN_KEY = "new_pin_key";
- private static final String DIALOG_MESSAGE_KEY = "dialog_message_key";
- private static final String DIALOG_PIN_ENTRY_KEY = "dialog_pin_entry_key";
-
- // size limits for the pin.
- private static final int MIN_PIN_LENGTH = 4;
- private static final int MAX_PIN_LENGTH = 8;
-
- /**
- * Delegate to the respective handlers.
- */
- public void onPinEntered(EditPinPreference preference, boolean positiveResult) {
- if (preference == mButtonEnableFDN) {
- toggleFDNEnable(positiveResult);
- } else if (preference == mButtonChangePin2){
- updatePINChangeState(positiveResult);
- }
- }
-
- /**
- * Attempt to toggle FDN activation.
- */
- private void toggleFDNEnable(boolean positiveResult) {
- if (!positiveResult) {
- return;
- }
-
- // validate the pin first, before submitting it to the RIL for FDN enable.
- String password = mButtonEnableFDN.getText();
- if (validatePin (password, false)) {
- // get the relevant data for the icc call
- boolean isEnabled = mPhone.getIccCard().getIccFdnEnabled();
- Message onComplete = mFDNHandler.obtainMessage(EVENT_PIN2_ENTRY_COMPLETE);
-
- // make fdn request
- mPhone.getIccCard().setIccFdnEnabled(!isEnabled, password, onComplete);
- } else {
- // throw up error if the pin is invalid.
- displayMessage(R.string.invalidPin2);
- }
-
- mButtonEnableFDN.setText("");
- }
-
- /**
- * Attempt to change the pin.
- */
- private void updatePINChangeState(boolean positiveResult) {
- if (!positiveResult) {
- // reset the state on cancel, either to expect PUK2 or PIN2
- if (!mSkipOldPin) {
- resetPinChangeState();
- } else {
- resetPinChangeStateForPUK2();
- }
- return;
- }
-
- // Progress through the dialog states, generally in this order:
- // 1. Enter old pin
- // 2. Enter new pin
- // 3. Re-Enter new pin
- // While handling any error conditions that may show up in between.
- // Also handle the PUK2 entry, if it is requested.
- //
- // In general, if any invalid entries are made, the dialog re-
- // appears with text to indicate what the issue is.
- switch (mPinChangeState) {
- case PIN_CHANGE_OLD:
- mOldPin = mButtonChangePin2.getText();
- mButtonChangePin2.setText("");
- // if the pin is not valid, display a message and reset the state.
- if (validatePin (mOldPin, false)) {
- mPinChangeState = PIN_CHANGE_NEW;
- displayPinChangeDialog();
- } else {
- displayPinChangeDialog(R.string.invalidPin2, true);
- }
- break;
- case PIN_CHANGE_NEW:
- mNewPin = mButtonChangePin2.getText();
- mButtonChangePin2.setText("");
- // if the new pin is not valid, display a message and reset the state.
- if (validatePin (mNewPin, false)) {
- mPinChangeState = PIN_CHANGE_REENTER;
- displayPinChangeDialog();
- } else {
- displayPinChangeDialog(R.string.invalidPin2, true);
- }
- break;
- case PIN_CHANGE_REENTER:
- // if the re-entered pin is not valid, display a message and reset the state.
- if (!mNewPin.equals(mButtonChangePin2.getText())) {
- mPinChangeState = PIN_CHANGE_NEW;
- mButtonChangePin2.setText("");
- displayPinChangeDialog(R.string.mismatchPin2, true);
- } else {
- // If the PIN is valid, then we either submit the change PIN request or
- // display the PUK2 dialog if we KNOW that we're PUK2 locked.
- mButtonChangePin2.setText("");
- if (!mSkipOldPin) {
- Message onComplete = mFDNHandler.obtainMessage(EVENT_PIN2_CHANGE_COMPLETE);
- mPhone.getIccCard().changeIccFdnPassword(mOldPin, mNewPin, onComplete);
- } else {
- mPinChangeState = PIN_CHANGE_PUK;
- displayPinChangeDialog();
- }
- }
- break;
- case PIN_CHANGE_PUK: {
- // Doh! too many incorrect requests, PUK requested.
- // if the pin is not valid, display a message and reset the state.
- String puk2 = mButtonChangePin2.getText();
- mButtonChangePin2.setText("");
- // make sure that the puk is valid before submitting it.
- if (validatePin (puk2, true)) {
- Message onComplete = mFDNHandler.obtainMessage(EVENT_PIN2_CHANGE_COMPLETE);
- mPhone.getIccCard().supplyPuk2(puk2, mNewPin, onComplete);
- } else {
- displayPinChangeDialog(R.string.invalidPuk2, true);
- }
- }
- break;
- }
- }
-
- /**
- * Handler for asynchronous replies from the sim.
- */
- private Handler mFDNHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
-
- // when we are enabling FDN, either we are unsuccessful and display
- // a toast, or just update the UI.
- case EVENT_PIN2_ENTRY_COMPLETE: {
- AsyncResult ar = (AsyncResult) msg.obj;
- if (ar.exception != null) {
- // see if PUK2 is requested and alert the user accordingly.
- CommandException ce = (CommandException) ar.exception;
- if (ce.getCommandError() == CommandException.Error.SIM_PUK2) {
- // make sure we set the PUK2 state so that we can skip
- // some redundant behaviour.
- displayMessage(R.string.fdn_enable_puk2_requested);
- resetPinChangeStateForPUK2();
- } else {
- displayMessage(R.string.pin2_invalid);
- }
- }
- updateEnableFDN();
- }
- break;
-
- // when changing the pin we need to pay attention to whether or not
- // the error requests a PUK (usually after too many incorrect tries)
- // Set the state accordingly.
- case EVENT_PIN2_CHANGE_COMPLETE: {
- AsyncResult ar = (AsyncResult) msg.obj;
- if (ar.exception != null) {
- CommandException ce = (CommandException) ar.exception;
- if (ce.getCommandError() == CommandException.Error.SIM_PUK2) {
- // throw an alert dialog on the screen, displaying the
- // request for a PUK2. set the cancel listener to
- // FdnSetting.onCancel().
- AlertDialog a = new AlertDialog.Builder(FdnSetting.this)
- .setMessage(R.string.puk2_requested)
- .setCancelable(true)
- .setOnCancelListener(FdnSetting.this)
- .create();
- a.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_DIM_BEHIND);
- a.show();
- } else {
- // set the correct error message depending upon the state.
- if (mPinChangeState == PIN_CHANGE_PUK) {
- displayMessage(R.string.badPuk2);
- } else {
- displayMessage(R.string.badPin2);
- }
-
- // Reset the state depending upon or knowledge of the PUK state.
- if (!mSkipOldPin) {
- resetPinChangeState();
- } else {
- resetPinChangeStateForPUK2();
- }
- }
- } else {
- // reset to normal behaviour on successful change.
- displayMessage(R.string.pin2_changed);
- mSkipOldPin = false;
- resetPinChangeState();
- }
- }
- break;
- }
- }
- };
-
- /**
- * Cancel listener for the PUK2 request alert dialog.
- */
- public void onCancel(DialogInterface dialog) {
- // set the state of the preference and then display the dialog.
- mPinChangeState = PIN_CHANGE_PUK;
- displayPinChangeDialog(0, true);
- }
-
- /**
- * Display a toast for message, like the rest of the settings.
- */
- private final void displayMessage(int strId) {
- Toast.makeText(this, getString(strId), Toast.LENGTH_SHORT)
- .show();
- }
-
- /**
- * The next two functions are for updating the message field on the dialog.
- */
- private final void displayPinChangeDialog() {
- displayPinChangeDialog(0, true);
- }
-
- private final void displayPinChangeDialog(int strId, boolean shouldDisplay) {
- int msgId;
- switch (mPinChangeState) {
- case PIN_CHANGE_OLD:
- msgId = R.string.oldPin2Label;
- break;
- case PIN_CHANGE_NEW:
- msgId = R.string.newPin2Label;
- break;
- case PIN_CHANGE_REENTER:
- msgId = R.string.confirmPin2Label;
- break;
- case PIN_CHANGE_PUK:
- default:
- msgId = R.string.label_puk2_code;
- break;
- }
-
- // append the note / additional message, if needed.
- if (strId != 0) {
- mButtonChangePin2.setDialogMessage(getText(msgId) + "\n" + getText(strId));
- } else {
- mButtonChangePin2.setDialogMessage(msgId);
- }
-
- // only display if requested.
- if (shouldDisplay) {
- mButtonChangePin2.showPinDialog();
- }
- }
-
- /**
- * Reset the state of the pin change dialog.
- */
- private final void resetPinChangeState() {
- mPinChangeState = PIN_CHANGE_OLD;
- displayPinChangeDialog(0, false);
- mOldPin = mNewPin = "";
- }
-
- /**
- * Reset the state of the pin change dialog solely for PUK2 use.
- */
- private final void resetPinChangeStateForPUK2() {
- mPinChangeState = PIN_CHANGE_NEW;
- displayPinChangeDialog(0, false);
- mOldPin = mNewPin = "";
- mSkipOldPin = true;
- }
-
- /**
- * Validate the pin entry.
- *
- * @param pin This is the pin to validate
- * @param isPuk Boolean indicating whether we are to treat
- * the pin input as a puk.
- */
- private boolean validatePin(String pin, boolean isPUK) {
-
- // for pin, we have 4-8 numbers, or puk, we use only 8.
- int pinMinimum = isPUK ? MAX_PIN_LENGTH : MIN_PIN_LENGTH;
-
- // check validity
- if (pin == null || pin.length() < pinMinimum || pin.length() > MAX_PIN_LENGTH) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * Reflect the updated FDN state in the UI.
- */
- private void updateEnableFDN() {
- if (mPhone.getIccCard().getIccFdnEnabled()) {
- mButtonEnableFDN.setTitle(R.string.enable_fdn_ok);
- mButtonEnableFDN.setSummary(R.string.fdn_enabled);
- mButtonEnableFDN.setDialogTitle(R.string.disable_fdn);
- } else {
- mButtonEnableFDN.setTitle(R.string.disable_fdn_ok);
- mButtonEnableFDN.setSummary(R.string.fdn_disabled);
- mButtonEnableFDN.setDialogTitle(R.string.enable_fdn);
- }
- }
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.fdn_setting);
-
- mPhone = SipPhoneFactory.getDefaultPhone();
-
- //get UI object references
- PreferenceScreen prefSet = getPreferenceScreen();
- mButtonEnableFDN = (EditPinPreference) prefSet.findPreference(BUTTON_FDN_ENABLE_KEY);
- mButtonChangePin2 = (EditPinPreference) prefSet.findPreference(BUTTON_CHANGE_PIN2_KEY);
-
- //assign click listener and update state
- mButtonEnableFDN.setOnPinEnteredListener(this);
- updateEnableFDN();
-
- mButtonChangePin2.setOnPinEnteredListener(this);
-
- // Only reset the pin change dialog if we're not in the middle of changing it.
- if (icicle == null) {
- resetPinChangeState();
- } else {
- mSkipOldPin = icicle.getBoolean(SKIP_OLD_PIN_KEY);
- mPinChangeState = icicle.getInt(PIN_CHANGE_STATE_KEY);
- mOldPin = icicle.getString(OLD_PIN_KEY);
- mNewPin = icicle.getString(NEW_PIN_KEY);
- mButtonChangePin2.setDialogMessage(icicle.getString(DIALOG_MESSAGE_KEY));
- mButtonChangePin2.setText(icicle.getString(DIALOG_PIN_ENTRY_KEY));
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mPhone = SipPhoneFactory.getDefaultPhone();
- updateEnableFDN();
- }
-
- /**
- * Save the state of the pin change.
- */
- @Override
- protected void onSaveInstanceState(Bundle out) {
- super.onSaveInstanceState(out);
- out.putBoolean(SKIP_OLD_PIN_KEY, mSkipOldPin);
- out.putInt(PIN_CHANGE_STATE_KEY, mPinChangeState);
- out.putString(OLD_PIN_KEY, mOldPin);
- out.putString(NEW_PIN_KEY, mNewPin);
- out.putString(DIALOG_MESSAGE_KEY, mButtonChangePin2.getDialogMessage().toString());
- out.putString(DIALOG_PIN_ENTRY_KEY, mButtonChangePin2.getText());
- }
-}
-
diff --git a/phone/src/com/android/phone2/GetPin2Screen.java b/phone/src/com/android/phone2/GetPin2Screen.java
deleted file mode 100644
index cbaaa75..0000000
--- a/phone/src/com/android/phone2/GetPin2Screen.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.text.method.DigitsKeyListener;
-import android.util.Log;
-import android.view.View;
-import android.widget.EditText;
-
-/**
- * Pin2 entry screen.
- */
-public class GetPin2Screen extends Activity {
- private static final String LOG_TAG = PhoneApp.LOG_TAG;
-
- private EditText mPin2Field;
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- setContentView(R.layout.get_pin2_screen);
- setupView();
- }
-
- /**
- * Reflect the changes in the layout that force the user to open
- * the keyboard.
- */
- private void setupView() {
- mPin2Field = (EditText) findViewById(R.id.pin);
- if (mPin2Field != null) {
- mPin2Field.setKeyListener(DigitsKeyListener.getInstance());
- mPin2Field.setMovementMethod(null);
- mPin2Field.setOnClickListener(mClicked);
- }
- }
-
- private String getPin2() {
- return mPin2Field.getText().toString();
- }
-
- private void returnResult() {
- Bundle map = new Bundle();
- map.putString("pin2", getPin2());
-
- Intent intent = getIntent();
- Uri uri = intent.getData();
-
- Intent action = new Intent();
- if (uri != null) action.setAction(uri.toString());
- setResult(RESULT_OK, action.putExtras(map));
- finish();
- }
-
- private View.OnClickListener mClicked = new View.OnClickListener() {
- public void onClick(View v) {
- if (TextUtils.isEmpty(mPin2Field.getText())) {
- return;
- }
-
- returnResult();
- }
- };
-
- private void log(String msg) {
- Log.d(LOG_TAG, "[GetPin2] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/GsmUmtsAdditionalCallOptions.java b/phone/src/com/android/phone2/GsmUmtsAdditionalCallOptions.java
deleted file mode 100644
index 9283ed4..0000000
--- a/phone/src/com/android/phone2/GsmUmtsAdditionalCallOptions.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.android.phone2;
-
-import java.util.ArrayList;
-
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceScreen;
-import android.util.Log;
-
-public class GsmUmtsAdditionalCallOptions extends
- TimeConsumingPreferenceActivity {
- private static final String LOG_TAG = "GsmUmtsAdditionalCallOptions";
- private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- private static final String BUTTON_CLIR_KEY = "button_clir_key";
- private static final String BUTTON_CW_KEY = "button_cw_key";
-
- private CLIRListPreference mCLIRButton;
- private CallWaitingCheckBoxPreference mCWButton;
-
- private ArrayList<Preference> mPreferences = new ArrayList<Preference> ();
- private int mInitIndex= 0;
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.gsm_umts_additional_options);
-
- PreferenceScreen prefSet = getPreferenceScreen();
- mCLIRButton = (CLIRListPreference) prefSet.findPreference(BUTTON_CLIR_KEY);
- mCWButton = (CallWaitingCheckBoxPreference) prefSet.findPreference(BUTTON_CW_KEY);
-
- mPreferences.add(mCLIRButton);
- mPreferences.add(mCWButton);
-
- if (icicle == null) {
- if (DBG) Log.d(LOG_TAG, "start to init ");
- mCLIRButton.init(this, false);
- } else {
- if (DBG) Log.d(LOG_TAG, "restore stored states");
- mInitIndex = mPreferences.size();
- mCLIRButton.init(this, true);
- mCWButton.init(this, true);
- int[] clirArray = icicle.getIntArray(mCLIRButton.getKey());
- if (clirArray != null) {
- if (DBG) Log.d(LOG_TAG, "onCreate: clirArray[0]="
- + clirArray[0] + ", clirArray[1]=" + clirArray[1]);
- mCLIRButton.handleGetCLIRResult(clirArray);
- } else {
- mCLIRButton.init(this, false);
- }
- }
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
-
- if (mCLIRButton.clirArray != null) {
- outState.putIntArray(mCLIRButton.getKey(), mCLIRButton.clirArray);
- }
- }
-
- @Override
- public void onFinished(Preference preference, boolean reading) {
- if (mInitIndex < mPreferences.size()-1 && !isFinishing()) {
- mInitIndex++;
- Preference pref = mPreferences.get(mInitIndex);
- if (pref instanceof CallWaitingCheckBoxPreference) {
- ((CallWaitingCheckBoxPreference) pref).init(this, false);
- }
- }
- super.onFinished(preference, reading);
- }
-
-}
diff --git a/phone/src/com/android/phone2/GsmUmtsCallForwardOptions.java b/phone/src/com/android/phone2/GsmUmtsCallForwardOptions.java
deleted file mode 100644
index 0cc4b98..0000000
--- a/phone/src/com/android/phone2/GsmUmtsCallForwardOptions.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package com.android.phone2;
-
-import android.content.Intent;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.PreferenceScreen;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.util.Log;
-
-import com.android.internal.telephony.CallForwardInfo;
-import com.android.internal.telephony.CommandsInterface;
-
-import java.util.ArrayList;
-
-
-public class GsmUmtsCallForwardOptions extends TimeConsumingPreferenceActivity {
- private static final String LOG_TAG = "GsmUmtsCallForwardOptions";
- private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- private static final String NUM_PROJECTION[] = {Phone.NUMBER};
-
- private static final String BUTTON_CFU_KEY = "button_cfu_key";
- private static final String BUTTON_CFB_KEY = "button_cfb_key";
- private static final String BUTTON_CFNRY_KEY = "button_cfnry_key";
- private static final String BUTTON_CFNRC_KEY = "button_cfnrc_key";
-
- private static final String KEY_TOGGLE = "toggle";
- private static final String KEY_STATUS = "status";
- private static final String KEY_NUMBER = "number";
-
- private CallForwardEditPreference mButtonCFU;
- private CallForwardEditPreference mButtonCFB;
- private CallForwardEditPreference mButtonCFNRy;
- private CallForwardEditPreference mButtonCFNRc;
-
- private final ArrayList<CallForwardEditPreference> mPreferences =
- new ArrayList<CallForwardEditPreference> ();
- private int mInitIndex= 0;
-
- private boolean mFirstResume;
- private Bundle mIcicle;
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.callforward_options);
-
- PreferenceScreen prefSet = getPreferenceScreen();
- mButtonCFU = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFU_KEY);
- mButtonCFB = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFB_KEY);
- mButtonCFNRy = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRY_KEY);
- mButtonCFNRc = (CallForwardEditPreference) prefSet.findPreference(BUTTON_CFNRC_KEY);
-
- mButtonCFU.setParentActivity(this, mButtonCFU.reason);
- mButtonCFB.setParentActivity(this, mButtonCFB.reason);
- mButtonCFNRy.setParentActivity(this, mButtonCFNRy.reason);
- mButtonCFNRc.setParentActivity(this, mButtonCFNRc.reason);
-
- mPreferences.add(mButtonCFU);
- mPreferences.add(mButtonCFB);
- mPreferences.add(mButtonCFNRy);
- mPreferences.add(mButtonCFNRc);
-
- // we wait to do the initialization until onResume so that the
- // TimeConsumingPreferenceActivity dialog can display as it
- // relies on onResume / onPause to maintain its foreground state.
-
- mFirstResume = true;
- mIcicle = icicle;
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- if (mFirstResume) {
- if (mIcicle == null) {
- if (DBG) Log.d(LOG_TAG, "start to init ");
- mPreferences.get(mInitIndex).init(this, false);
- } else {
- mInitIndex = mPreferences.size();
-
- for (CallForwardEditPreference pref : mPreferences) {
- Bundle bundle = mIcicle.getParcelable(pref.getKey());
- pref.setToggled(bundle.getBoolean(KEY_TOGGLE));
- CallForwardInfo cf = new CallForwardInfo();
- cf.number = bundle.getString(KEY_NUMBER);
- cf.status = bundle.getInt(KEY_STATUS);
- pref.handleCallForwardResult(cf);
- pref.init(this, true);
- }
- }
- mFirstResume = false;
- mIcicle=null;
- }
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
-
- for (CallForwardEditPreference pref : mPreferences) {
- Bundle bundle = new Bundle();
- bundle.putBoolean(KEY_TOGGLE, pref.isToggled());
- if (pref.callForwardInfo != null) {
- bundle.putString(KEY_NUMBER, pref.callForwardInfo.number);
- bundle.putInt(KEY_STATUS, pref.callForwardInfo.status);
- }
- outState.putParcelable(pref.getKey(), bundle);
- }
- }
-
- @Override
- public void onFinished(Preference preference, boolean reading) {
- if (mInitIndex < mPreferences.size()-1 && !isFinishing()) {
- mInitIndex++;
- mPreferences.get(mInitIndex).init(this, false);
- }
-
- super.onFinished(preference, reading);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (DBG) Log.d(LOG_TAG, "onActivityResult: done");
- if (resultCode != RESULT_OK) {
- if (DBG) Log.d(LOG_TAG, "onActivityResult: contact picker result not OK.");
- return;
- }
- Cursor cursor = getContentResolver().query(data.getData(),
- NUM_PROJECTION, null, null, null);
- if ((cursor == null) || (!cursor.moveToFirst())) {
- if (DBG) Log.d(LOG_TAG, "onActivityResult: bad contact data, no results found.");
- return;
- }
-
- switch (requestCode) {
- case CommandsInterface.CF_REASON_UNCONDITIONAL:
- mButtonCFU.onPickActivityResult(cursor.getString(0));
- break;
- case CommandsInterface.CF_REASON_BUSY:
- mButtonCFB.onPickActivityResult(cursor.getString(0));
- break;
- case CommandsInterface.CF_REASON_NO_REPLY:
- mButtonCFNRy.onPickActivityResult(cursor.getString(0));
- break;
- case CommandsInterface.CF_REASON_NOT_REACHABLE:
- mButtonCFNRc.onPickActivityResult(cursor.getString(0));
- break;
- default:
- // TODO: may need exception here.
- }
- }
-}
diff --git a/phone/src/com/android/phone2/GsmUmtsCallOptions.java b/phone/src/com/android/phone2/GsmUmtsCallOptions.java
deleted file mode 100644
index 9853577..0000000
--- a/phone/src/com/android/phone2/GsmUmtsCallOptions.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.phone2;
-
-import android.os.Bundle;
-import android.preference.CheckBoxPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-public class GsmUmtsCallOptions extends PreferenceActivity {
- private static final String LOG_TAG = "GsmUmtsCallOptions";
- private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.gsm_umts_call_options);
-
- if (SipPhoneFactory.getDefaultPhone().getPhoneType() != Phone.PHONE_TYPE_GSM) {
- //disable the entire screen
- getPreferenceScreen().setEnabled(false);
- }
- }
-}
diff --git a/phone/src/com/android/phone2/GsmUmtsOptions.java b/phone/src/com/android/phone2/GsmUmtsOptions.java
deleted file mode 100644
index 331b293..0000000
--- a/phone/src/com/android/phone2/GsmUmtsOptions.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.phone2;
-
-import android.os.Bundle;
-import android.preference.CheckBoxPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-/**
- * List of Network-specific settings screens.
- */
-public class GsmUmtsOptions extends PreferenceActivity {
-
- private PreferenceScreen mButtonAPNExpand;
- private PreferenceScreen mButtonOperatorSelectionExpand;
- private CheckBoxPreference mButtonPrefer2g;
-
- private static final String BUTTON_APN_EXPAND_KEY = "button_apn_key";
- private static final String BUTTON_OPERATOR_SELECTION_EXPAND_KEY = "button_carrier_sel_key";
- private static final String BUTTON_PREFER_2G_KEY = "button_prefer_2g_key";
-
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.gsm_umts_options);
- PreferenceScreen prefSet = getPreferenceScreen();
- mButtonAPNExpand = (PreferenceScreen) prefSet.findPreference(BUTTON_APN_EXPAND_KEY);
- mButtonOperatorSelectionExpand =
- (PreferenceScreen) prefSet.findPreference(BUTTON_OPERATOR_SELECTION_EXPAND_KEY);
- mButtonPrefer2g = (CheckBoxPreference) prefSet.findPreference(BUTTON_PREFER_2G_KEY);
- if (SipPhoneFactory.getDefaultPhone().getPhoneType() != Phone.PHONE_TYPE_GSM) {
- mButtonAPNExpand.setEnabled(false);
- mButtonOperatorSelectionExpand.setEnabled(false);
- mButtonPrefer2g.setEnabled(false);
- }
- }
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- if (preference.getKey().equals(BUTTON_PREFER_2G_KEY)) {
- return true;
- }
- return false;
- }
-}
diff --git a/phone/src/com/android/phone2/HapticFeedback.java b/phone/src/com/android/phone2/HapticFeedback.java
deleted file mode 100644
index 64a3002..0000000
--- a/phone/src/com/android/phone2/HapticFeedback.java
+++ /dev/null
@@ -1,159 +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.phone2;
-
-import android.content.Context;
-import android.content.ContentResolver;
-import android.content.res.Resources;
-import android.os.Vibrator;
-import android.util.Log;
-import android.provider.Settings;
-import android.provider.Settings.System;
-
-/**
- * Handles the haptic feedback: a light buzz happening when the user
- * presses a soft key (UI button or capacitive key). The haptic
- * feedback is controlled by:
- * - a system resource for the pattern
- * The pattern used is tuned per device and stored in an internal
- * resource (config_virtualKeyVibePattern.)
- * - a system setting HAPTIC_FEEDBACK_ENABLED.
- * HAPTIC_FEEDBACK_ENABLED can be changed by the user using the
- * system Settings activity. It must be rechecked each time the
- * activity comes in the foreground (onResume).
- *
- * This class is not thread safe. It assumes it'll be called from the
- * UI thead.
- *
- * Typical usage:
- * --------------
- * static private final boolean HAPTIC_ENABLED = true;
- * private HapticFeedback mHaptic = new HapticFeedback();
- *
- * protected void onCreate(Bundle icicle) {
- * mHaptic.init((Context)this, HAPTIC_ENABLED);
- * }
- *
- * protected void onResume() {
- * // Refresh the system setting.
- * mHaptic.checkSystemSetting();
- * }
- *
- * public void foo() {
- * mHaptic.vibrate();
- * }
- *
- */
-
-public class HapticFeedback {
- private static final int VIBRATION_PATTERN_ID =
- com.android.internal.R.array.config_virtualKeyVibePattern;
- /** If no pattern was found, vibrate for a small amount of time. */
- private static final long DURATION = 10; // millisec.
- /** Play the haptic pattern only once. */
- private static final int NO_REPEAT = -1;
-
- private static final String TAG = "HapticFeedback";
- private Context mContext;
- private long[] mHapticPattern;
- private Vibrator mVibrator;
-
- private boolean mEnabled;
- private Settings.System mSystemSettings;
- private ContentResolver mContentResolver;
- private boolean mSettingEnabled;
-
- /**
- * Initialize this instance using the app and system
- * configs. Since these don't change, init is typically called
- * once in 'onCreate'.
- * checkSettings is not called during init.
- * @param context To look up the resources and system settings.
- * @param enabled If false, vibrate will be a no-op regardless of
- * the system settings.
- */
- public void init(Context context, boolean enabled) {
- mEnabled = enabled;
- if (enabled) {
- mVibrator = new Vibrator();
- if (!loadHapticSystemPattern(context.getResources())) {
- mHapticPattern = new long[] {0, DURATION, 2 * DURATION, 3 * DURATION};
- }
- mSystemSettings = new Settings.System();
- mContentResolver = context.getContentResolver();
- }
- }
-
-
- /**
- * Reload the system settings to check if the user enabled the
- * haptic feedback.
- */
- public void checkSystemSetting() {
- if (!mEnabled) {
- return;
- }
- try {
- int val = mSystemSettings.getInt(mContentResolver, System.HAPTIC_FEEDBACK_ENABLED, 0);
- mSettingEnabled = val != 0;
- } catch (Resources.NotFoundException nfe) {
- Log.e(TAG, "Could not retrieve system setting.", nfe);
- mSettingEnabled = false;
- }
-
- }
-
-
- /**
- * Generate the haptic feedback vibration. Only one thread can
- * request it. If the phone is already in a middle of an haptic
- * feedback sequence, the request is ignored.
- */
- public void vibrate() {
- if (!mEnabled || !mSettingEnabled) {
- return;
- }
- mVibrator.vibrate(mHapticPattern, NO_REPEAT);
- }
-
- /**
- * @return true If the system haptic pattern was found.
- */
- private boolean loadHapticSystemPattern(Resources r) {
- int[] pattern;
-
- mHapticPattern = null;
- try {
- pattern = r.getIntArray(VIBRATION_PATTERN_ID);
- } catch (Resources.NotFoundException nfe) {
- Log.e(TAG, "Vibrate pattern missing.", nfe);
- return false;
- }
-
- if (null == pattern || pattern.length == 0) {
- Log.e(TAG, "Haptic pattern is null or empty.");
- return false;
- }
-
- // int[] to long[] conversion.
- mHapticPattern = new long[pattern.length];
- for (int i = 0; i < pattern.length; i++) {
- mHapticPattern[i] = pattern[i];
- }
- return true;
- }
-}
diff --git a/phone/src/com/android/phone2/INetworkQueryService.aidl b/phone/src/com/android/phone2/INetworkQueryService.aidl
deleted file mode 100644
index 4292984..0000000
--- a/phone/src/com/android/phone2/INetworkQueryService.aidl
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.phone2;
-
-import com.android.phone2.INetworkQueryServiceCallback;
-
-/**
- * Service interface to handle queries for available networks. The
- * Phone application lets this service interface handle carrier
- * availability queries instead of making direct calls to the
- * GSMPhone layer.
- */
-oneway interface INetworkQueryService {
-
- /**
- * Starts a network query if it has not been started yet, and
- * request a callback through the INetworkQueryServiceCallback
- * object on query completion. If there is an existing request,
- * then just add the callback to the list of notifications
- * that will be sent upon query completion.
- */
- void startNetworkQuery(in INetworkQueryServiceCallback cb);
-
- /**
- * Tells the service that the requested query is to be ignored.
- * This may not do anything for the Query request in the
- * underlying RIL, but it ensures that the callback is removed
- * from the list of notifications.
- */
- void stopNetworkQuery(in INetworkQueryServiceCallback cb);
-}
diff --git a/phone/src/com/android/phone2/INetworkQueryServiceCallback.aidl b/phone/src/com/android/phone2/INetworkQueryServiceCallback.aidl
deleted file mode 100644
index fa92b4f..0000000
--- a/phone/src/com/android/phone2/INetworkQueryServiceCallback.aidl
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.phone2;
-
-import com.android.internal.telephony.gsm.NetworkInfo;
-
-/**
- * Service interface to handle callbacks into the activity from the
- * NetworkQueryService. These objects are used to notify that a
- * query is complete and that the results are ready to process.
- */
-oneway interface INetworkQueryServiceCallback {
-
- /**
- * Called upon query completion, handing a status value and an
- * array of NetworkInfo objects.
- *
- * @param networkInfoArray is the list of NetworkInfo. Can be
- * null, indicating no results were found, or an error.
- * @param status the status indicating if there were any
- * problems with the request.
- */
- void onQueryComplete(in List<NetworkInfo> networkInfoArray, int status);
-
-}
diff --git a/phone/src/com/android/phone2/IccMissingPanel.java b/phone/src/com/android/phone2/IccMissingPanel.java
deleted file mode 100644
index 4be664e..0000000
--- a/phone/src/com/android/phone2/IccMissingPanel.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.view.View;
-import android.widget.Button;
-import android.os.Bundle;
-
-/**
- * Panel which displays the "ICC missing" message.
- */
-public class IccMissingPanel extends IccPanel {
-
- public IccMissingPanel(Context context) {
- super(context);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.sim_missing);
- ((Button) findViewById(R.id.continueView)).setOnClickListener(mButtonListener);
- }
-
- View.OnClickListener mButtonListener = new View.OnClickListener() {
- public void onClick(View v) {
- dismiss();
- }
- };
-}
diff --git a/phone/src/com/android/phone2/IccNetworkDepersonalizationPanel.java b/phone/src/com/android/phone2/IccNetworkDepersonalizationPanel.java
deleted file mode 100644
index 216dc62..0000000
--- a/phone/src/com/android/phone2/IccNetworkDepersonalizationPanel.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.text.Editable;
-import android.text.Spannable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.method.DialerKeyListener;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-/**
- * "SIM network unlock" PIN entry screen.
- *
- * @see PhoneApp.EVENT_SIM_NETWORK_LOCKED
- *
- * TODO: This UI should be part of the lock screen, not the
- * phone app (see bug 1804111).
- */
-public class IccNetworkDepersonalizationPanel extends IccPanel {
-
- //debug constants
- private static final boolean DBG = false;
-
- //events
- private static final int EVENT_ICC_NTWRK_DEPERSONALIZATION_RESULT = 100;
-
- private Phone mPhone;
-
- //UI elements
- private EditText mPinEntry;
- private LinearLayout mEntryPanel;
- private LinearLayout mStatusPanel;
- private TextView mStatusText;
-
- private Button mUnlockButton;
- private Button mDismissButton;
-
- //private textwatcher to control text entry.
- private TextWatcher mPinEntryWatcher = new TextWatcher() {
- public void beforeTextChanged(CharSequence buffer, int start, int olen, int nlen) {
- }
-
- public void onTextChanged(CharSequence buffer, int start, int olen, int nlen) {
- }
-
- public void afterTextChanged(Editable buffer) {
- if (SpecialCharSequenceMgr.handleChars(
- getContext(), buffer.toString())) {
- mPinEntry.getText().clear();
- }
- }
- };
-
- //handler for unlock function results
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- if (msg.what == EVENT_ICC_NTWRK_DEPERSONALIZATION_RESULT) {
- AsyncResult res = (AsyncResult) msg.obj;
- if (res.exception != null) {
- if (DBG) log("network depersonalization request failure.");
- indicateError();
- postDelayed(new Runnable() {
- public void run() {
- hideAlert();
- mPinEntry.getText().clear();
- mPinEntry.requestFocus();
- }
- }, 3000);
- } else {
- if (DBG) log("network depersonalization success.");
- indicateSuccess();
- postDelayed(new Runnable() {
- public void run() {
- dismiss();
- }
- }, 3000);
- }
- }
- }
- };
-
- //constructor
- public IccNetworkDepersonalizationPanel(Context context) {
- super(context);
- }
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(R.layout.sim_ndp);
-
- // PIN entry text field
- mPinEntry = (EditText) findViewById(R.id.pin_entry);
- mPinEntry.setKeyListener(DialerKeyListener.getInstance());
- mPinEntry.setOnClickListener(mUnlockListener);
-
- // Attach the textwatcher
- CharSequence text = mPinEntry.getText();
- Spannable span = (Spannable) text;
- span.setSpan(mPinEntryWatcher, 0, text.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
-
- mEntryPanel = (LinearLayout) findViewById(R.id.entry_panel);
-
- mUnlockButton = (Button) findViewById(R.id.ndp_unlock);
- mUnlockButton.setOnClickListener(mUnlockListener);
-
- // The "Dismiss" button is present in some (but not all) products,
- // based on the "sim_network_unlock_allow_dismiss" resource.
- mDismissButton = (Button) findViewById(R.id.ndp_dismiss);
- if (getContext().getResources().getBoolean(R.bool.sim_network_unlock_allow_dismiss)) {
- if (DBG) log("Enabling 'Dismiss' button...");
- mDismissButton.setVisibility(View.VISIBLE);
- mDismissButton.setOnClickListener(mDismissListener);
- } else {
- if (DBG) log("Removing 'Dismiss' button...");
- mDismissButton.setVisibility(View.GONE);
- }
-
- //status panel is used since we're having problems with the alert dialog.
- mStatusPanel = (LinearLayout) findViewById(R.id.status_panel);
- mStatusText = (TextView) findViewById(R.id.status_text);
-
- mPhone = SipPhoneFactory.getDefaultPhone();
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- }
-
- //Mirrors IccPinUnlockPanel.onKeyDown().
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- return true;
- }
-
- return super.onKeyDown(keyCode, event);
- }
-
- View.OnClickListener mUnlockListener = new View.OnClickListener() {
- public void onClick(View v) {
- String pin = mPinEntry.getText().toString();
-
- if (TextUtils.isEmpty(pin)) {
- return;
- }
-
- if (DBG) log("requesting network depersonalization with code " + pin);
- mPhone.getIccCard().supplyNetworkDepersonalization(pin,
- Message.obtain(mHandler, EVENT_ICC_NTWRK_DEPERSONALIZATION_RESULT));
- indicateBusy();
- }
- };
-
- private void indicateBusy() {
- mStatusText.setText(R.string.requesting_unlock);
- mEntryPanel.setVisibility(View.GONE);
- mStatusPanel.setVisibility(View.VISIBLE);
- }
-
- private void indicateError() {
- mStatusText.setText(R.string.unlock_failed);
- mEntryPanel.setVisibility(View.GONE);
- mStatusPanel.setVisibility(View.VISIBLE);
- }
-
- private void indicateSuccess() {
- mStatusText.setText(R.string.unlock_success);
- mEntryPanel.setVisibility(View.GONE);
- mStatusPanel.setVisibility(View.VISIBLE);
- }
-
- private void hideAlert() {
- mEntryPanel.setVisibility(View.VISIBLE);
- mStatusPanel.setVisibility(View.GONE);
- }
-
- View.OnClickListener mDismissListener = new View.OnClickListener() {
- public void onClick(View v) {
- if (DBG) log("mDismissListener: skipping depersonalization...");
- dismiss();
- }
- };
-
- private void log(String msg) {
- Log.v(TAG, "[IccNetworkDepersonalizationPanel] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/IccPanel.java b/phone/src/com/android/phone2/IccPanel.java
deleted file mode 100644
index 8a607cb..0000000
--- a/phone/src/com/android/phone2/IccPanel.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Dialog;
-import android.app.KeyguardManager;
-import android.app.StatusBarManager;
-import android.content.Context;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.WindowManager;
-import android.view.Window;
-import android.os.Bundle;
-
-/**
- * Base class for ICC-related panels in the Phone UI.
- */
-public class IccPanel extends Dialog {
- protected static final String TAG = PhoneApp.LOG_TAG;
-
- private KeyguardManager.KeyguardLock mKeyguardLock;
- private StatusBarManager mStatusBarManager;
-
- public IccPanel(Context context) {
- super(context, R.style.IccPanel);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Window winP = getWindow();
- winP.setType(WindowManager.LayoutParams.TYPE_PRIORITY_PHONE);
- winP.setLayout(WindowManager.LayoutParams.MATCH_PARENT,
- WindowManager.LayoutParams.MATCH_PARENT);
- winP.setGravity(Gravity.CENTER);
-
- PhoneApp app = PhoneApp.getInstance();
- KeyguardManager km = (KeyguardManager) app.getSystemService(Context.KEYGUARD_SERVICE);
- mKeyguardLock = km.newKeyguardLock(TAG);
- mStatusBarManager = (StatusBarManager) app.getSystemService(Context.STATUS_BAR_SERVICE);
-
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- disableKeyguard(true);
- }
-
- @Override
- public void onStop() {
- super.onStop();
- disableKeyguard(false);
- }
-
- /**
- * Acquires a wake lock and prevents keyguard from enabling.
- */
- private void disableKeyguard(boolean disable) {
- if (disable) {
- mKeyguardLock.disableKeyguard();
- mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND);
- } else {
- mKeyguardLock.reenableKeyguard();
- mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
- }
- }
-
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- return true;
- }
-
- return super.onKeyDown(keyCode, event);
- }
-}
diff --git a/phone/src/com/android/phone2/IccPinUnlockPanel.java b/phone/src/com/android/phone2/IccPinUnlockPanel.java
deleted file mode 100644
index 537d033..0000000
--- a/phone/src/com/android/phone2/IccPinUnlockPanel.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.Spannable;
-import android.text.TextUtils;
-import android.text.TextWatcher;
-import android.text.method.DialerKeyListener;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.IccCard;
-
-/**
- * Panel where you enter your PIN to unlock the SIM card.
- */
-public class IccPinUnlockPanel extends IccPanel {
- private static final boolean DBG = false;
-
- private static final int EVENT_ICC_UNLOCKED_RESULT = 100;
-
- private enum IccLockState {
- UNLOCKED,
- REQUIRE_PIN,
- REQUIRE_PUK,
- REQUIRE_NEW_PIN,
- VERIFY_NEW_PIN,
- VERIFY_NEW_PIN_FAILED
- };
-
- private IccLockState mState;
- private String mPUKCode;
- private String mNewPinCode;
-
- private EditText mEntry;
- private TextView mFailure;
- private TextView mLabel;
- private TextView mStatus;
- private Button mUnlockButton;
- private Button mDismissButton;
- private LinearLayout mUnlockPane;
- private LinearLayout mUnlockInProgressPane;
-
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case EVENT_ICC_UNLOCKED_RESULT:
- AsyncResult ar = (AsyncResult) msg.obj;
- handleUnlockResult(ar);
- break;
- }
- }
- };
-
- private class MyTextWatcher implements TextWatcher {
- Context mContext;
-
- public MyTextWatcher(Context context) {
- mContext = context;
- }
-
- public void beforeTextChanged(CharSequence buffer,
- int start, int olen, int nlen) {
- }
-
- public void onTextChanged(CharSequence buffer,
- int start, int olen, int nlen) {
- }
-
- public void afterTextChanged(Editable buffer) {
- if (SpecialCharSequenceMgr.handleChars(
- mContext, buffer.toString())) {
- mEntry.getText().clear();
- }
- }
- }
-
- public IccPinUnlockPanel(Context context) {
- super(context);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.sim_unlock);
- updateState();
- initView();
- updateView();
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- if (updateState()) {
- updateView(); // need to update the view only if state changed
- }
- }
-
- /**
- * @return Whether the state changed.
- */
- boolean updateState() {
- PhoneApp app = PhoneApp.getInstance();
- IccCard iccCardInterface = app.phone.getIccCard();
-
- try {
- if (iccCardInterface.getState() == IccCard.State.PUK_REQUIRED) {
- if (getState() != IccLockState.REQUIRE_PUK) {
- setState(IccLockState.REQUIRE_PUK);
- return true;
- }
- } else if (getState() != IccLockState.REQUIRE_PIN){
- setState(IccLockState.REQUIRE_PIN);
- return true;
- }
- } catch (Exception ex) {
- }
- return false;
- }
-
- void setState(IccLockState state) {
- mState = state;
- }
-
- IccLockState getState() {
- return mState;
- }
-
- void initView() {
- mUnlockPane = (LinearLayout) findViewById(R.id.simPINPane);
- mUnlockInProgressPane = (LinearLayout) findViewById(R.id.progress);
-
- mEntry = (EditText) findViewById(R.id.entry);
- mEntry.setKeyListener(DialerKeyListener.getInstance());
- mEntry.setMovementMethod(null);
- mEntry.setOnClickListener(mUnlockListener);
-
- // set up the text watcher
- CharSequence text = mEntry.getText();
- Spannable span = (Spannable) text;
- span.setSpan(new MyTextWatcher(this.getContext()),
- 0, text.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
-
- mFailure = (TextView) findViewById(R.id.failure);
- mLabel = (TextView) findViewById(R.id.label);
- mStatus = (TextView) findViewById(R.id.status);
-
- mUnlockButton = (Button) findViewById(R.id.unlock);
- mUnlockButton.setOnClickListener(mUnlockListener);
-
- mDismissButton = (Button) findViewById(R.id.dismiss);
-
- // if we are using the ICC pin for keyguard password, force the
- // user to enter the correct PIN to proceed. Otherwise, we won't
- // know what the correct keyguard password is.
- mDismissButton.setOnClickListener(mDismissListener);
- }
-
- void updateView() {
- Context context = getContext();
-
- switch (mState) {
- case REQUIRE_PIN:
- mLabel.setText(context.getText(R.string.enterPin));
- break;
-
- case REQUIRE_PUK:
- mLabel.setText(context.getText(R.string.enterPuk));
- mUnlockButton.setText(
- context.getText(R.string.buttonTxtContinue));
- break;
-
- case REQUIRE_NEW_PIN:
- hideIncorrectPinMessage();
- mLabel.setText(context.getText(R.string.enterNewPin));
- break;
-
- case VERIFY_NEW_PIN:
- mLabel.setText(context.getText(R.string.verifyNewPin));
- break;
-
- case VERIFY_NEW_PIN_FAILED:
- mLabel.setText(context.getText(R.string.verifyFailed));
- setState(IccLockState.REQUIRE_NEW_PIN);
- break;
- }
-
- mEntry.getText().clear();
- mEntry.requestFocus(View.FOCUS_FORWARD);
- }
-
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- return true;
- }
-
- return super.onKeyDown(keyCode, event);
- }
-
- void handleUnlockResult(AsyncResult ar) {
- if (ar.exception == null) {
- handleSuccess();
- return;
- }
-
- // pin/puk unlock failed!
- if (ar.exception instanceof com.android.internal.telephony.CommandException &&
- ((CommandException) ar.exception).getCommandError() ==
- CommandException.Error.PASSWORD_INCORRECT) {
- hidePinUnlockInProgress();
- handleFailure();
- }
-
- // PENDING: any other failure types?
- }
-
- void handleSuccess() {
- if (DBG) log("unlock successful!");
- showUnlockSuccess();
-
- // store the ICC pin in memory, to be used later for keyguard lock
- // and radio reboots.
- PhoneApp.getInstance().setCachedSimPin(mEntry.getText().toString());
- }
-
- void handleFailure() {
- if (DBG) log("unlock failed");
- showIncorrectPinMessage();
- mEntry.getText().clear();
- updateState();
- updateView();
- }
-
- void showIncorrectPinMessage() {
- CharSequence msg;
- Context context = getContext();
-
- if (getState() == IccLockState.REQUIRE_PIN) {
- msg = context.getText(R.string.badPin);
- } else {
- msg = context.getText(R.string.badPuk);
- }
-
- mFailure.setText(msg);
- mFailure.setVisibility(View.VISIBLE);
- }
-
- void hideIncorrectPinMessage() {
- mFailure.setVisibility(View.GONE);
- }
-
- void showUnlockInProgress() {
- mUnlockInProgressPane.setVisibility(View.VISIBLE);
- mUnlockPane.setVisibility(View.GONE);
- }
-
- void hidePinUnlockInProgress() {
- mUnlockInProgressPane.setVisibility(View.GONE);
- mUnlockPane.setVisibility(View.VISIBLE);
- }
-
- void showUnlockSuccess() {
- mStatus.setText(getContext().getText(R.string.pinUnlocked));
- mHandler.postDelayed(
- new Runnable() {
- public void run() {
- dismiss();
- }
- }, 1000);
- }
-
- private boolean verifyNewPin(String pin2) {
- if (mNewPinCode.equals(pin2)) {
- return true;
- }
-
- return false;
- }
-
- //***** Listeners
-
- View.OnClickListener mUnlockListener = new View.OnClickListener() {
- public void onClick(View v) {
- String code = mEntry.getText().toString();
-
- if (TextUtils.isEmpty(code)) {
- return;
- }
-
- PhoneApp app = PhoneApp.getInstance();
- IccCard iccCardInterface = app.phone.getIccCard();
- if (iccCardInterface != null) {
- Message callBack = Message.obtain(mHandler,
- EVENT_ICC_UNLOCKED_RESULT);
-
- switch (mState) {
- case REQUIRE_PIN:
- if (DBG) log("unlock attempt: PIN code entered = " +
- code);
- showUnlockInProgress();
- iccCardInterface.supplyPin(code, callBack);
- break;
-
- case REQUIRE_PUK:
- if (DBG) log("puk code entered, request for new pin");
- mPUKCode = code;
- setState(IccLockState.REQUIRE_NEW_PIN);
- updateView();
- break;
-
- case REQUIRE_NEW_PIN:
- if (DBG) log("new pin code entered, verify pin");
- mNewPinCode = code;
- setState(IccLockState.VERIFY_NEW_PIN);
- updateView();
- break;
-
- case VERIFY_NEW_PIN:
- if (DBG) log("new pin code re-entered");
-
- if (verifyNewPin(code)) {
- // proceed
- showUnlockInProgress();
- iccCardInterface.supplyPuk(mPUKCode, mNewPinCode,
- callBack);
- } else {
- setState(IccLockState.VERIFY_NEW_PIN_FAILED);
- updateView();
- }
-
- break;
- }
- }
- }
- };
-
- View.OnClickListener mDismissListener = new View.OnClickListener() {
- public void onClick(View v) {
- dismiss();
- }
- };
-
- private void log(String msg) {
- Log.v(TAG, "[SimPinUnlock] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/IccProvider.java b/phone/src/com/android/phone2/IccProvider.java
deleted file mode 100644
index 9433d2b..0000000
--- a/phone/src/com/android/phone2/IccProvider.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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.phone2;
-
-/**
- * ICC address book content provider.
- */
-public class IccProvider extends com.android.internal.telephony.IccProvider {
- public IccProvider() {
- super();
- }
-}
diff --git a/phone/src/com/android/phone2/InCallControlState.java b/phone/src/com/android/phone2/InCallControlState.java
deleted file mode 100644
index d154d55..0000000
--- a/phone/src/com/android/phone2/InCallControlState.java
+++ /dev/null
@@ -1,215 +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.phone2;
-
-import android.telephony.PhoneNumberUtils;
-import android.util.Log;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.Phone;
-
-
-/**
- * Helper class to keep track of enabledness, visibility, and "on/off"
- * or "checked" state of the various controls available in the in-call
- * UI, based on the current telephony state.
- *
- * This class is independent of the exact UI controls used on any given
- * device. (Some devices use onscreen touchable buttons, for example, and
- * other devices use menu items.) To avoid cluttering up the InCallMenu
- * and InCallTouchUi code with logic about which functions are available
- * right now, we instead have that logic here, and provide simple boolean
- * flags to indicate the state and/or enabledness of all possible in-call
- * user operations.
- *
- * (In other words, this is the "model" that corresponds to the "view"
- * implemented by InCallMenu and InCallTouchUi.)
- */
-public class InCallControlState {
- private static final String LOG_TAG = "InCallControlState";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- private InCallScreen mInCallScreen;
- private Phone mPhone;
-
- //
- // Our "public API": Boolean flags to indicate the state and/or
- // enabledness of all possible in-call user operations:
- //
-
- public boolean manageConferenceVisible;
- public boolean manageConferenceEnabled;
- //
- public boolean canAddCall;
- //
- public boolean canSwap;
- public boolean canMerge;
- //
- public boolean bluetoothEnabled;
- public boolean bluetoothIndicatorOn;
- //
- public boolean speakerEnabled;
- public boolean speakerOn;
- //
- public boolean canMute;
- public boolean muteIndicatorOn;
- //
- public boolean dialpadEnabled;
- public boolean dialpadVisible;
- //
- /** True if the "Hold" function is *ever* available on this device */
- public boolean supportsHold;
- /** True if the call is currently on hold */
- public boolean onHold;
- /** True if the "Hold" or "Unhold" function should be available right now */
- // TODO: this name is misleading. Let's break this apart into
- // separate canHold and canUnhold flags, and have the caller look at
- // "canHold || canUnhold" to decide whether the hold/unhold UI element
- // should be visible.
- public boolean canHold;
-
-
- public InCallControlState(InCallScreen inCallScreen, Phone phone) {
- if (DBG) log("InCallControlState constructor...");
- mInCallScreen = inCallScreen;
- mPhone = phone;
- }
-
- /**
- * Updates all our public boolean flags based on the current state of
- * the Phone.
- */
- public void update() {
- final boolean hasRingingCall = !mPhone.getRingingCall().isIdle();
- final Call fgCall = mPhone.getForegroundCall();
- final Call.State fgCallState = fgCall.getState();
- final boolean hasActiveForegroundCall = (fgCallState == Call.State.ACTIVE);
- final boolean hasHoldingCall = !mPhone.getBackgroundCall().isIdle();
-
- // Manage conference:
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- // This item is visible only if the foreground call is a
- // conference call, and it's enabled unless the "Manage
- // conference" UI is already up.
- manageConferenceVisible = PhoneUtils.isConferenceCall(fgCall);
- manageConferenceEnabled =
- manageConferenceVisible && !mInCallScreen.isManageConferenceMode();
- } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // CDMA has no concept of managing a conference call.
- manageConferenceVisible = false;
- manageConferenceEnabled = false;
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
-
- // "Add call":
- canAddCall = PhoneUtils.okToAddCall(mPhone);
-
- // Swap / merge calls
- canSwap = PhoneUtils.okToSwapCalls(mPhone);
- canMerge = PhoneUtils.okToMergeCalls(mPhone);
-
- // "Bluetooth":
- if (mInCallScreen.isBluetoothAvailable()) {
- bluetoothEnabled = true;
- bluetoothIndicatorOn = mInCallScreen.isBluetoothAudioConnectedOrPending();
- } else {
- bluetoothEnabled = false;
- bluetoothIndicatorOn = false;
- }
-
- // "Speaker": always enabled.
- // The current speaker state comes from the AudioManager.
- speakerEnabled = true;
- speakerOn = PhoneUtils.isSpeakerOn(mInCallScreen);
-
- // "Mute": only enabled when the foreground call is ACTIVE.
- // (It's meaningless while on hold, or while DIALING/ALERTING.)
- // Also disabled (on CDMA devices) during emergency calls.
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- Connection c = fgCall.getLatestConnection();
- boolean isEmergencyCall = false;
- if (c != null) isEmergencyCall = PhoneNumberUtils.isEmergencyNumber(c.getAddress());
-
- if (isEmergencyCall) { // disable "Mute" item
- canMute = false;
- muteIndicatorOn = false;
- } else {
- canMute = hasActiveForegroundCall;
- muteIndicatorOn = PhoneUtils.getMute(mPhone);
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- canMute = hasActiveForegroundCall;
- muteIndicatorOn = PhoneUtils.getMute(mPhone);
- }
-
- // "Dialpad": Enabled only when it's OK to use the dialpad in the
- // first place.
- dialpadEnabled = mInCallScreen.okToShowDialpad();
-
- // Also keep track of whether the dialpad is currently "opened"
- // (i.e. visible).
- dialpadVisible = mInCallScreen.isDialerOpened();
-
- // "Hold:
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- // GSM phones have the concept of "Hold" and "Unhold".
- supportsHold = true;
- // "On hold" means that there's a holding call and
- // *no* foreground call. (If there *is* a foreground call,
- // that's "two lines in use".)
- onHold = hasHoldingCall && (fgCallState == Call.State.IDLE);
- // The "Hold" control is disabled entirely if there's
- // no way to either hold or unhold in the current state.
- boolean okToHold = hasActiveForegroundCall && !hasHoldingCall;
- boolean okToUnhold = onHold;
- canHold = okToHold || okToUnhold;
- } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // CDMA has no concept of "putting a call on hold."
- supportsHold = false;
- onHold = false;
- canHold = false;
- }
-
- if (DBG) dumpState();
- }
-
- public void dumpState() {
- log("InCallControlState:");
- log(" manageConferenceVisible: " + manageConferenceVisible);
- log(" manageConferenceEnabled: " + manageConferenceEnabled);
- log(" canAddCall: " + canAddCall);
- log(" canSwap: " + canSwap);
- log(" canMerge: " + canMerge);
- log(" bluetoothEnabled: " + bluetoothEnabled);
- log(" bluetoothIndicatorOn: " + bluetoothIndicatorOn);
- log(" speakerEnabled: " + speakerEnabled);
- log(" speakerOn: " + speakerOn);
- log(" canMute: " + canMute);
- log(" muteIndicatorOn: " + muteIndicatorOn);
- log(" dialpadEnabled: " + dialpadEnabled);
- log(" dialpadVisible: " + dialpadVisible);
- log(" onHold: " + onHold);
- log(" canHold: " + canHold);
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/InCallMenu.java b/phone/src/com/android/phone2/InCallMenu.java
deleted file mode 100755
index d6ad635..0000000
--- a/phone/src/com/android/phone2/InCallMenu.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.util.Log;
-import android.view.ContextThemeWrapper;
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.Phone;
-
-/**
- * Helper class to manage the options menu for the InCallScreen.
- *
- * This class is the "Model" (in M-V-C nomenclature) for the in-call menu;
- * it knows about all possible menu items, and contains logic to determine
- * the current state and enabledness of each item based on the state of
- * the Phone.
- *
- * The corresponding View classes are InCallMenuView, which is used purely
- * to lay out and draw the menu, and InCallMenuItemView, which is the View
- * for a single item.
- */
-class InCallMenu {
- private static final String LOG_TAG = "PHONE/InCallMenu";
- private static final boolean DBG = false;
-
- /**
- * Reference to the InCallScreen activity that owns us. This will be
- * null if we haven't been initialized yet *or* after the InCallScreen
- * activity has been destroyed.
- */
- private InCallScreen mInCallScreen;
-
- /**
- * Our corresponding View class.
- */
- private InCallMenuView mInCallMenuView;
-
- /**
- * All possible menu items (see initMenu().)
- */
- InCallMenuItemView mManageConference;
- InCallMenuItemView mShowDialpad;
- InCallMenuItemView mEndCall;
- InCallMenuItemView mAddCall;
- InCallMenuItemView mSwapCalls;
- InCallMenuItemView mMergeCalls;
- InCallMenuItemView mBluetooth;
- InCallMenuItemView mSpeaker;
- InCallMenuItemView mMute;
- InCallMenuItemView mHold;
- InCallMenuItemView mAnswerAndHold;
- InCallMenuItemView mAnswerAndEnd;
- InCallMenuItemView mAnswer;
- InCallMenuItemView mIgnore;
-
- InCallMenu(InCallScreen inCallScreen) {
- if (DBG) log("InCallMenu constructor...");
- mInCallScreen = inCallScreen;
- }
-
- /**
- * Null out our reference to the InCallScreen activity.
- * This indicates that the InCallScreen activity has been destroyed.
- */
- void clearInCallScreenReference() {
- mInCallScreen = null;
- if (mInCallMenuView != null) mInCallMenuView.clearInCallScreenReference();
- }
-
- /* package */ InCallMenuView getView() {
- return mInCallMenuView;
- }
-
- /**
- * Initializes the in-call menu by creating a new InCallMenuView,
- * creating all possible menu items, and loading them into the
- * InCallMenuView.
- *
- * The only initialization of the individual items we do here is
- * one-time stuff, like setting the ID and click listener, or calling
- * setIndicatorVisible() for buttons that have a green LED, or calling
- * setText() for buttons whose text never changes. The actual
- * *current* state and enabledness of each item is set in
- * updateItems().
- */
- /* package */ void initMenu() {
- if (DBG) log("initMenu()...");
-
- // Explicitly use the "icon menu" theme for the Views we create.
- Context wrappedContext = new ContextThemeWrapper(
- mInCallScreen,
- com.android.internal.R.style.Theme_IconMenu);
-
- mInCallMenuView = new InCallMenuView(wrappedContext, mInCallScreen);
-
- //
- // Create all possible InCallMenuView objects.
- //
-
- mManageConference = new InCallMenuItemView(wrappedContext);
- mManageConference.setId(R.id.menuManageConference);
- mManageConference.setOnClickListener(mInCallScreen);
- mManageConference.setText(R.string.menu_manageConference);
- mManageConference.setIconResource(com.android.internal.R.drawable.ic_menu_allfriends);
-
- mShowDialpad = new InCallMenuItemView(wrappedContext);
- mShowDialpad.setId(R.id.menuShowDialpad);
- mShowDialpad.setOnClickListener(mInCallScreen);
- mShowDialpad.setText(R.string.menu_showDialpad); // or "Hide dialpad" if it's open
- mShowDialpad.setIconResource(R.drawable.ic_menu_dial_pad);
-
- mEndCall = new InCallMenuItemView(wrappedContext);
- mEndCall.setId(R.id.menuEndCall);
- mEndCall.setOnClickListener(mInCallScreen);
- mEndCall.setText(R.string.menu_endCall);
- mEndCall.setIconResource(R.drawable.ic_menu_end_call);
-
- mAddCall = new InCallMenuItemView(wrappedContext);
- mAddCall.setId(R.id.menuAddCall);
- mAddCall.setOnClickListener(mInCallScreen);
- mAddCall.setText(R.string.menu_addCall);
- mAddCall.setIconResource(android.R.drawable.ic_menu_add);
-
- mSwapCalls = new InCallMenuItemView(wrappedContext);
- mSwapCalls.setId(R.id.menuSwapCalls);
- mSwapCalls.setOnClickListener(mInCallScreen);
- mSwapCalls.setText(R.string.menu_swapCalls);
- mSwapCalls.setIconResource(R.drawable.ic_menu_swap_calls);
-
- mMergeCalls = new InCallMenuItemView(wrappedContext);
- mMergeCalls.setId(R.id.menuMergeCalls);
- mMergeCalls.setOnClickListener(mInCallScreen);
- mMergeCalls.setText(R.string.menu_mergeCalls);
- mMergeCalls.setIconResource(R.drawable.ic_menu_merge_calls);
-
- // TODO: Icons for menu items we don't have yet:
- // R.drawable.ic_menu_answer_call
- // R.drawable.ic_menu_silence_ringer
-
- mBluetooth = new InCallMenuItemView(wrappedContext);
- mBluetooth.setId(R.id.menuBluetooth);
- mBluetooth.setOnClickListener(mInCallScreen);
- mBluetooth.setText(R.string.menu_bluetooth);
- mBluetooth.setIndicatorVisible(true);
-
- mSpeaker = new InCallMenuItemView(wrappedContext);
- mSpeaker.setId(R.id.menuSpeaker);
- mSpeaker.setOnClickListener(mInCallScreen);
- mSpeaker.setText(R.string.menu_speaker);
- mSpeaker.setIndicatorVisible(true);
-
- mMute = new InCallMenuItemView(wrappedContext);
- mMute.setId(R.id.menuMute);
- mMute.setOnClickListener(mInCallScreen);
- mMute.setText(R.string.menu_mute);
- mMute.setIndicatorVisible(true);
-
- mHold = new InCallMenuItemView(wrappedContext);
- mHold.setId(R.id.menuHold);
- mHold.setOnClickListener(mInCallScreen);
- mHold.setText(R.string.menu_hold);
- mHold.setIndicatorVisible(true);
-
- mAnswerAndHold = new InCallMenuItemView(wrappedContext);
- mAnswerAndHold.setId(R.id.menuAnswerAndHold);
- mAnswerAndHold.setOnClickListener(mInCallScreen);
- mAnswerAndHold.setText(R.string.menu_answerAndHold);
-
- mAnswerAndEnd = new InCallMenuItemView(wrappedContext);
- mAnswerAndEnd.setId(R.id.menuAnswerAndEnd);
- mAnswerAndEnd.setOnClickListener(mInCallScreen);
- mAnswerAndEnd.setText(R.string.menu_answerAndEnd);
-
- mAnswer = new InCallMenuItemView(wrappedContext);
- mAnswer.setId(R.id.menuAnswer);
- mAnswer.setOnClickListener(mInCallScreen);
- mAnswer.setText(R.string.menu_answer);
-
- mIgnore = new InCallMenuItemView(wrappedContext);
- mIgnore.setId(R.id.menuIgnore);
- mIgnore.setOnClickListener(mInCallScreen);
- mIgnore.setText(R.string.menu_ignore);
-
- //
- // Load all the items into the correct "slots" in the InCallMenuView.
- //
- // Row 0 is the topmost row onscreen, item 0 is the leftmost item in a row.
- //
- // Individual items may be disabled or hidden, but never move between
- // rows or change their order within a row.
- //
- // TODO: these items and their layout ought be specifiable
- // entirely in XML (just like we currently do with res/menu/*.xml
- // files.)
- //
-
- // Row 0:
- // This usually has "Show/Hide dialpad", but that gets replaced by
- // "Manage conference" if a conference call is active.
- PhoneApp app = PhoneApp.getInstance();
- // As managing conference is only valid for GSM and not for CDMA
- int phoneType = app.phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- mInCallMenuView.addItemView(mManageConference, 0);
- }
- mInCallMenuView.addItemView(mShowDialpad, 0);
-
- // Row 1:
- mInCallMenuView.addItemView(mSwapCalls, 1);
- mInCallMenuView.addItemView(mMergeCalls, 1);
- mInCallMenuView.addItemView(mAddCall, 1);
- mInCallMenuView.addItemView(mEndCall, 1);
-
- // Row 2:
- // In this row we see *either* bluetooth/speaker/mute/hold
- // *or* answerAndHold/answerAndEnd, but never all 6 together.
- // For CDMA only Answer or Ignore option is valid for a Call Waiting scenario
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- mInCallMenuView.addItemView(mAnswer, 2);
- mInCallMenuView.addItemView(mIgnore, 2);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- mInCallMenuView.addItemView(mHold, 2);
- mInCallMenuView.addItemView(mAnswerAndHold, 2);
- mInCallMenuView.addItemView(mAnswerAndEnd, 2);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- mInCallMenuView.addItemView(mMute, 2);
- mInCallMenuView.addItemView(mSpeaker, 2);
- mInCallMenuView.addItemView(mBluetooth, 2);
-
- mInCallMenuView.dumpState();
- }
-
- /**
- * Updates the enabledness and visibility of all items in the
- * InCallMenuView based on the current state of the Phone.
- *
- * This is called every time we need to display the menu, right before
- * it becomes visible.
- *
- * @return true if we successfully updated the items and it's OK
- * to go ahead and show the menu, or false if
- * we shouldn't show the menu at all.
- */
- /* package */ boolean updateItems(Phone phone) {
- if (DBG) log("updateItems()...");
- // if (DBG) PhoneUtils.dumpCallState(phone);
-
- // If the phone is totally idle (like in the "call ended" state)
- // there's no menu at all.
- if (phone.getState() == Phone.State.IDLE) {
- if (DBG) log("- Phone is idle! Don't show the menu...");
- return false;
- }
-
- final boolean hasRingingCall = !phone.getRingingCall().isIdle();
- final boolean hasActiveCall = !phone.getForegroundCall().isIdle();
- final Call.State fgCallState = phone.getForegroundCall().getState();
- final boolean hasHoldingCall = !phone.getBackgroundCall().isIdle();
-
- // For OTA call, only show dialpad, endcall, speaker, and mute menu items
- if (hasActiveCall && (PhoneApp.getInstance().isOtaCallInActiveState())) {
- mAnswerAndHold.setVisible(false);
- mAnswerAndHold.setEnabled(false);
- mAnswerAndEnd.setVisible(false);
- mAnswerAndEnd.setEnabled(false);
-
- mManageConference.setVisible(false);
- mAddCall.setEnabled(false);
- mSwapCalls.setEnabled(false);
- mMergeCalls.setEnabled(false);
- mHold.setEnabled(false);
- mBluetooth.setEnabled(false);
- mMute.setEnabled(false);
- mAnswer.setVisible(false);
- mIgnore.setVisible(false);
-
- boolean inConferenceCall =
- PhoneUtils.isConferenceCall(phone.getForegroundCall());
- boolean showShowDialpad = !inConferenceCall;
- boolean enableShowDialpad = showShowDialpad && mInCallScreen.okToShowDialpad();
- mShowDialpad.setVisible(showShowDialpad);
- mShowDialpad.setEnabled(enableShowDialpad);
- boolean isDtmfDialerOpened = mInCallScreen.isDialerOpened();
- mShowDialpad.setText(isDtmfDialerOpened
- ? R.string.menu_hideDialpad
- : R.string.menu_showDialpad);
-
- mEndCall.setVisible(true);
- mEndCall.setEnabled(true);
-
- mSpeaker.setVisible(true);
- mSpeaker.setEnabled(true);
- boolean speakerOn = PhoneUtils.isSpeakerOn(mInCallScreen.getApplicationContext());
- mSpeaker.setIndicatorState(speakerOn);
-
- mInCallMenuView.updateVisibility();
- return true;
- }
-
- // Special cases when an incoming call is ringing.
- if (hasRingingCall) {
- // In the "call waiting" state, show ONLY the "answer & end"
- // and "answer & hold" buttons, and nothing else.
- // TODO: be sure to test this for "only one line in use and it's
- // active" AND for "only one line in use and it's on hold".
- if (hasActiveCall && !hasHoldingCall) {
- int phoneType = phone.getPhoneType();
- // For CDMA only make "Answer" and "Ignore" visible
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- mAnswer.setVisible(true);
- mAnswer.setEnabled(true);
- mIgnore.setVisible(true);
- mIgnore.setEnabled(true);
-
- // Explicitly remove GSM menu items
- mAnswerAndHold.setVisible(false);
- mAnswerAndEnd.setVisible(false);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- mAnswerAndHold.setVisible(true);
- mAnswerAndHold.setEnabled(true);
- mAnswerAndEnd.setVisible(true);
- mAnswerAndEnd.setEnabled(true);
-
- // Explicitly remove CDMA menu items
- mAnswer.setVisible(false);
- mIgnore.setVisible(false);
-
- mManageConference.setVisible(false);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
-
- mShowDialpad.setVisible(false);
- mEndCall.setVisible(false);
- mAddCall.setVisible(false);
- mSwapCalls.setVisible(false);
- mMergeCalls.setVisible(false);
- mBluetooth.setVisible(false);
- mSpeaker.setVisible(false);
- mMute.setVisible(false);
- mHold.setVisible(false);
-
- // Done updating the individual items.
- // The last step is to tell the InCallMenuView to update itself
- // based on any visibility changes that just happened.
- mInCallMenuView.updateVisibility();
-
- return true;
- } else {
- // If there's an incoming ringing call but there aren't
- // any "special actions" to take, don't show a menu at all.
- return false;
- }
- }
-
- // TODO: double-check if any items here need to be disabled based on:
- // boolean keyguardRestricted = mInCallScreen.isPhoneStateRestricted();
-
- // The InCallControlState object tells us the enabledness and/or
- // state of the various menu items:
- InCallControlState inCallControlState = mInCallScreen.getUpdatedInCallControlState();
-
- // Manage conference: visible only if the foreground call is a
- // conference call. Enabled unless the "Manage conference" UI is
- // already up.
- mManageConference.setVisible(inCallControlState.manageConferenceVisible);
- mManageConference.setEnabled(inCallControlState.manageConferenceEnabled);
-
- // "Show/Hide dialpad":
- // - Visible: only in portrait mode, but NOT when "Manage
- // conference" is available (since that's shown instead.)
- // - Enabled: Only when it's OK to use the dialpad in the first
- // place (i.e. in the same states where the SlidingDrawer handle
- // is visible.)
- // - Text label: "Show" or "Hide", depending on the current state
- // of the sliding drawer.
- // (Note this logic is totally specific to the in-call menu, so
- // this state doesn't come from the inCallControlState object.)
- boolean showShowDialpad = !inCallControlState.manageConferenceVisible;
- boolean enableShowDialpad = showShowDialpad && mInCallScreen.okToShowDialpad();
- mShowDialpad.setVisible(showShowDialpad);
- mShowDialpad.setEnabled(enableShowDialpad);
- mShowDialpad.setText(inCallControlState.dialpadVisible
- ? R.string.menu_hideDialpad
- : R.string.menu_showDialpad);
-
- // "End call": this button has no state and is always visible.
- // It's also always enabled. (Actually it *would* need to be
- // disabled if the phone was totally idle, but the entire in-call
- // menu is already disabled in that case (see above.))
- mEndCall.setVisible(true);
- mEndCall.setEnabled(true);
-
- // "Add call"
- mAddCall.setVisible(true);
- mAddCall.setEnabled(inCallControlState.canAddCall);
-
- // Swap / merge calls
- mSwapCalls.setVisible(true);
- mSwapCalls.setEnabled(inCallControlState.canSwap);
- mMergeCalls.setVisible(true);
- mMergeCalls.setEnabled(inCallControlState.canMerge);
-
- // "Bluetooth": always visible, only enabled if BT is available.
- mBluetooth.setVisible(true);
- mBluetooth.setEnabled(inCallControlState.bluetoothEnabled);
- mBluetooth.setIndicatorState(inCallControlState.bluetoothIndicatorOn);
-
- // "Speaker": always visible. Disabled if a wired headset is
- // plugged in, otherwise enabled (and indicates the current
- // speaker state.)
- mSpeaker.setVisible(true);
- mSpeaker.setEnabled(inCallControlState.speakerEnabled);
- mSpeaker.setIndicatorState(inCallControlState.speakerOn);
-
- // "Mute": only enabled when the foreground call is ACTIVE.
- // (It's meaningless while on hold, or while DIALING/ALERTING.)
- // Also disabled (on CDMA devices) during emergency calls.
- mMute.setVisible(true);
- mMute.setEnabled(inCallControlState.canMute);
- mMute.setIndicatorState(inCallControlState.muteIndicatorOn);
-
- // "Hold"
- mHold.setVisible(inCallControlState.supportsHold);
- mHold.setIndicatorState(inCallControlState.onHold);
- mHold.setEnabled(inCallControlState.canHold);
-
- // "Answer" and "Ignore" are used only when there's an incoming
- // ringing call (see above). (And for now they're only used in
- // CDMA, for the call waiting case.)
- mAnswer.setVisible(false);
- mAnswer.setEnabled(false);
- mIgnore.setVisible(false);
- mIgnore.setEnabled(false);
-
- // "Answer & end" and "Answer & hold" are only useful
- // when there's an incoming ringing call (see above.)
- mAnswerAndHold.setVisible(false);
- mAnswerAndHold.setEnabled(false);
- mAnswerAndEnd.setVisible(false);
- mAnswerAndEnd.setEnabled(false);
-
- // Done updating the individual items.
- // The last step is to tell the InCallMenuView to update itself
- // based on any visibility changes that just happened.
- mInCallMenuView.updateVisibility();
-
- return true;
- }
-
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/InCallMenuItemView.java b/phone/src/com/android/phone2/InCallMenuItemView.java
deleted file mode 100644
index 4554189..0000000
--- a/phone/src/com/android/phone2/InCallMenuItemView.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.text.TextUtils.TruncateAt;
-import android.util.Log;
-import android.view.Gravity;
-import android.widget.TextView;
-
-
-/**
- * The View for each item in the {@link InCallMenuView}.
- *
- * Each in-call menu item has a text label, an optional "green LED" on/off
- * indicator below the text, and an optional icon above the text.
- * (It's really just a TextView, using "compound drawables" for
- * the indicator and icon.)
- *
- * Originally modeled after android/widget/IconMenuItemView.java.
- */
-class InCallMenuItemView extends TextView {
- private static final String LOG_TAG = "PHONE/InCallMenuItemView";
- private static final boolean DBG = false;
-
- private boolean mIndicatorVisible;
- private boolean mIndicatorState;
- private Drawable mIndicatorDrawable;
- private Drawable mIcon;
-
- public InCallMenuItemView(Context context) {
- super(context);
- if (DBG) log("InCallMenuView constructor...");
-
- setGravity(Gravity.CENTER);
-
- TypedArray a =
- context.obtainStyledAttributes(
- com.android.internal.R.styleable.MenuView);
- int textAppearance = a.getResourceId(com.android.internal.R.styleable.
- MenuView_itemTextAppearance, -1);
- // TODO: any other styleable attrs we need from the standard menu item style?
- a.recycle();
-
- setClickable(true);
- setFocusable(true);
- setTextAppearance(context, textAppearance);
-
- // Set the padding like the regular menu items do
- setPadding(3, getPaddingTop(), 3, getPaddingBottom());
- }
-
- //
- // Visibility: we only ever use the VISIBLE and GONE states.
- //
-
- public void setVisible(boolean isVisible) {
- setVisibility(isVisible ? VISIBLE : GONE);
- }
-
- public boolean isVisible() {
- return (getVisibility() == VISIBLE);
- }
-
- /**
- * Sets whether or not this item's "green LED" state indicator
- * should be visible.
- */
- public void setIndicatorVisible(boolean isVisible) {
- if (DBG) log("setIndicatorVisible(" + isVisible + ")...");
- mIndicatorVisible = isVisible;
- updateIndicator();
- updateCompoundDrawables();
- }
-
- /**
- * Turns this item's "green LED" state indicator on or off.
- */
- public void setIndicatorState(boolean onoff) {
- if (DBG) log("setIndicatorState(" + onoff + ")...");
- mIndicatorState = onoff;
- updateIndicator();
- updateCompoundDrawables();
- }
-
- /**
- * Sets this item's icon, to be drawn above the text label.
- */
- public void setIcon(Drawable icon) {
- if (DBG) log("setIcon(" + icon + ")...");
- mIcon = icon;
- updateCompoundDrawables();
-
- // If there's an icon, we'll only have enough room for one line of text.
- if (icon != null) setSingleLineMarquee();
- }
-
- /**
- * Sets this item's icon, to be drawn above the text label.
- */
- public void setIconResource(int resId) {
- if (DBG) log("setIconResource(" + resId + ")...");
- Drawable iconDrawable = getResources().getDrawable(resId);
- setIcon(iconDrawable);
- }
-
- /**
- * Updates mIndicatorDrawable based on mIndicatorVisible and mIndicatorState.
- */
- private void updateIndicator() {
- if (mIndicatorVisible) {
- int resId = mIndicatorState ? android.R.drawable.button_onoff_indicator_on
- : android.R.drawable.button_onoff_indicator_off;
- mIndicatorDrawable = getResources().getDrawable(resId);
- } else {
- mIndicatorDrawable = null;
- }
- }
-
- /**
- * Installs mIcon and mIndicatorDrawable as our TextView "compound drawables",
- * and does any necessary layout tweaking depending on the presence or
- * absence of the icon or indicator.
- */
- private void updateCompoundDrawables() {
- // TODO: There are several hand-tweaked layout constants hardcoded here.
- // If we ever move this widget into the framework (and make it
- // usable from XML), be sure to move these constants to XML too.
-
- // If the icon is visible, add a bit of negative padding to scoot
- // it down closer to the text.
- if (mIcon != null) {
- setCompoundDrawablePadding(-10);
- }
-
- // Add some top/bottom padding when the indicator and/or icon are
- // visible (to add a little vertical space between the indicator
- // and the bottom of the item, or the icon and the top of the
- // item.)
- int topPadding = (mIcon != null) ? 5 : 0;
- int bottomPadding = (mIndicatorDrawable != null) ? 5 : 0;
- setPadding(0, topPadding, 0, bottomPadding);
-
- // TODO: topPadding seems to have no effect here.
- // Regardless of the value I use, the icon image
- // ends up right up against the top edge of the button...
- // (Maybe we're just out of room?)
- // if (DBG) log("updateCompoundDrawables: padding: top " + topPadding
- // + ", bottom " + bottomPadding);
-
- setCompoundDrawablesWithIntrinsicBounds(null, mIcon, null, mIndicatorDrawable);
- }
-
- /**
- * Forces this menu item into "single line" mode, with marqueeing enabled.
- * This is only necessary when an icon is present, since otherwise
- * there's enough room for long labels to wrap onto two lines.
- */
- private void setSingleLineMarquee() {
- setEllipsize(TruncateAt.MARQUEE);
- setHorizontalFadingEdgeEnabled(true);
- setSingleLine(true);
- }
-
- @Override
- public String toString() {
- return "'" + getText() + "' (" + super.toString() + ")";
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/InCallMenuView.java b/phone/src/com/android/phone2/InCallMenuView.java
deleted file mode 100644
index 2ae5358..0000000
--- a/phone/src/com/android/phone2/InCallMenuView.java
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.util.ArrayList;
-
-
-/**
- * Custom View used as the "options panel" for the InCallScreen
- * (i.e. the standard menu triggered by the MENU button.)
- *
- * This class purely handles the layout and display of the in-call menu
- * items, *not* the actual contents of the menu or the states of the
- * items. (See InCallMenu for the corresponding "model" class.)
-
- */
-class InCallMenuView extends ViewGroup {
- private static final String LOG_TAG = "PHONE/InCallMenuView";
- private static final boolean DBG = false;
-
- private int mRowHeight;
-
- /** Divider that is drawn between all rows */
- private Drawable mHorizontalDivider;
- /** Height of the horizontal divider */
- private int mHorizontalDividerHeight;
- /** Set of horizontal divider positions where the horizontal divider will be drawn */
- private ArrayList<Rect> mHorizontalDividerRects;
-
- /** Divider that is drawn between all columns */
- private Drawable mVerticalDivider;
- /** Width of the vertical divider */
- private int mVerticalDividerWidth;
- /** Set of vertical divider positions where the vertical divider will be drawn */
- private ArrayList<Rect> mVerticalDividerRects;
-
- /** Background of each item (should contain the selected and focused states) */
- private Drawable mItemBackground;
-
- /**
- * The actual layout of items in the menu, organized into 3 rows.
- *
- * Row 0 is the topmost row onscreen, item 0 is the leftmost item in a row.
- *
- * Individual items may be disabled or hidden, but never move between
- * rows or change their order within a row.
- */
- private static final int NUM_ROWS = 3;
- private static final int MAX_ITEMS_PER_ROW = 10;
- private InCallMenuItemView[][] mItems = new InCallMenuItemView[NUM_ROWS][MAX_ITEMS_PER_ROW];
-
- private int mNumItemsForRow[] = new int[NUM_ROWS];
-
- /**
- * Number of visible items per row, given the current state of all the
- * menu items.
- * A row with zero visible items isn't drawn at all.
- */
- private int mNumVisibleItemsForRow[] = new int[NUM_ROWS];
- private int mNumVisibleRows;
-
- /**
- * Reference to the InCallScreen activity that owns us. This will be
- * null if we haven't been initialized yet *or* after the InCallScreen
- * activity has been destroyed.
- */
- private InCallScreen mInCallScreen;
-
-
- InCallMenuView(Context context, InCallScreen inCallScreen) {
- super(context);
- if (DBG) log("InCallMenuView constructor...");
-
- mInCallScreen = inCallScreen;
-
- // Look up a few styled attrs from IconMenuView and/or MenuView
- // (to keep our look and feel at least *somewhat* consistent with
- // menus in other apps.)
-
- TypedArray a =
- mContext.obtainStyledAttributes(com.android.internal.R.styleable.IconMenuView);
- if (DBG) log("- IconMenuView styled attrs: " + a);
- mRowHeight = a.getDimensionPixelSize(
- com.android.internal.R.styleable.IconMenuView_rowHeight, 64);
- if (DBG) log(" - mRowHeight: " + mRowHeight);
- a.recycle();
-
- a = mContext.obtainStyledAttributes(com.android.internal.R.styleable.MenuView);
- if (DBG) log("- MenuView styled attrs: " + a);
- mItemBackground = a.getDrawable(com.android.internal.R.styleable.MenuView_itemBackground);
- if (DBG) log(" - mItemBackground: " + mItemBackground);
- mHorizontalDivider = a.getDrawable(com.android.internal.R.styleable.MenuView_horizontalDivider);
- if (DBG) log(" - mHorizontalDivider: " + mHorizontalDivider);
- mHorizontalDividerRects = new ArrayList<Rect>();
- mVerticalDivider = a.getDrawable(com.android.internal.R.styleable.MenuView_verticalDivider);
- if (DBG) log(" - mVerticalDivider: " + mVerticalDivider);
- mVerticalDividerRects = new ArrayList<Rect>();
- a.recycle();
-
- if (mHorizontalDivider != null) {
- mHorizontalDividerHeight = mHorizontalDivider.getIntrinsicHeight();
- // Make sure to have some height for the divider
- if (mHorizontalDividerHeight == -1) mHorizontalDividerHeight = 1;
- }
-
- if (mVerticalDivider != null) {
- mVerticalDividerWidth = mVerticalDivider.getIntrinsicWidth();
- // Make sure to have some width for the divider
- if (mVerticalDividerWidth == -1) mVerticalDividerWidth = 1;
- }
-
- // This view will be drawing the dividers.
- setWillNotDraw(false);
-
- // Arrange to get key events even when there's no focused item in
- // the in-call menu (i.e. when in touch mode).
- // (We *always* want key events whenever we're visible, so that we
- // can forward them to the InCallScreen activity; see dispatchKeyEvent().)
- setFocusableInTouchMode(true);
- setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
-
- // The default ViewGroup.LayoutParams width and height are
- // WRAP_CONTENT. (This applies to us right now since we
- // initially have no LayoutParams at all.)
- // But in the Menu framework, when returning a view from
- // onCreatePanelView(), a layout width of WRAP_CONTENT indicates
- // that you want the smaller-sized "More" menu frame. We want the
- // full-screen-width menu frame instead, though, so we need to
- // give ourselves a LayoutParams with width==MATCH_PARENT.
- ViewGroup.LayoutParams lp =
- new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
- setLayoutParams(lp);
- }
-
- /**
- * Null out our reference to the InCallScreen activity.
- * This indicates that the InCallScreen activity has been destroyed.
- */
- void clearInCallScreenReference() {
- mInCallScreen = null;
- }
-
- /**
- * Adds an InCallMenuItemView to the specified row.
- */
- /* package */ void addItemView(InCallMenuItemView itemView, int row) {
- if (DBG) log("addItemView(" + itemView + ", row " + row + ")...");
-
- if (row >= NUM_ROWS) {
- throw new IllegalStateException("Row index " + row + " > NUM_ROWS");
- }
-
- int indexInRow = mNumItemsForRow[row];
- if (indexInRow >= MAX_ITEMS_PER_ROW) {
- throw new IllegalStateException("Too many items (" + indexInRow + ") in row " + row);
- }
- mNumItemsForRow[row]++;
- mItems[row][indexInRow] = itemView;
-
- //
- // Finally, add this item as a child.
- //
-
- ViewGroup.LayoutParams lp = itemView.getLayoutParams();
-
- if (lp == null) {
- // Default layout parameters
- lp = new LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.MATCH_PARENT);
- }
-
- // Apply the background to the item view
- itemView.setBackgroundDrawable(mItemBackground.getConstantState().newDrawable());
-
- addView(itemView, lp);
- }
-
- /**
- * Precomputes the number of visible items per row, and the total
- * number of visible rows. (A row with zero visible items isn't
- * drawn at all.)
- */
- /* package */ void updateVisibility() {
- if (DBG) log("updateVisibility()...");
-
- mNumVisibleRows = 0;
-
- for (int row = 0; row < NUM_ROWS; row++) {
- InCallMenuItemView[] thisRow = mItems[row];
- int numItemsThisRow = mNumItemsForRow[row];
- int numVisibleThisRow = 0;
- for (int itemIndex = 0; itemIndex < numItemsThisRow; itemIndex++) {
- // if (DBG) log(" - Checking item: " + mItems[row][itemIndex]);
- if (mItems[row][itemIndex].isVisible()) numVisibleThisRow++;
- }
- if (DBG) log("==> Num visible for row " + row + ": " + numVisibleThisRow);
- mNumVisibleItemsForRow[row] = numVisibleThisRow;
- if (numVisibleThisRow > 0) mNumVisibleRows++;
- }
- if (DBG) log("==> Num visible rows: " + mNumVisibleRows);
- }
-
- /* package */ void dumpState() {
- if (DBG) log("============ dumpState() ============");
- if (DBG) log("- mItems LENGTH: " + mItems.length);
- for (int row = 0; row < NUM_ROWS; row++) {
- if (DBG) log("- Row " + row + ": length " + mItems[row].length
- + ", num items " + mNumItemsForRow[row]
- + ", num visible " + mNumVisibleItemsForRow[row]);
- }
- }
-
- /**
- * The positioning algorithm that gets called from onMeasure. It just
- * computes positions for each child, and then stores them in the
- * child's layout params.
- *
- * At this point the visibility of each item in mItems[][] is correct,
- * and mNumVisibleRows and mNumVisibleItemsForRow[] have already been
- * precomputed.
- *
- * @param menuWidth The width of this menu to assume for positioning
- * @param menuHeight The height of this menu to assume for positioning
- *
- * TODO: This is a near-exact duplicate of IconMenuView.positionChildren().
- * Consider abstracting this out into a more general-purpose "grid layout
- * with dividers" container that both classes could use...
- */
- private void positionChildren(int menuWidth, int menuHeight) {
- if (DBG) log("positionChildren(" + menuWidth + " x " + menuHeight + ")...");
-
- // Clear the containers for the positions where the dividers should be drawn
- if (mHorizontalDivider != null) mHorizontalDividerRects.clear();
- if (mVerticalDivider != null) mVerticalDividerRects.clear();
-
- InCallMenuItemView child;
- InCallMenuView.LayoutParams childLayoutParams = null;
-
- // Use float for this to get precise positions (uniform item widths
- // instead of last one taking any slack), and then convert to ints at last opportunity
- float itemLeft;
- float itemTop = 0;
- // Since each row can have a different number of items, this will be computed per row
- float itemWidth;
- // Subtract the space needed for the horizontal dividers
- final float itemHeight = (menuHeight - mHorizontalDividerHeight * (mNumVisibleRows - 1))
- / (float) mNumVisibleRows;
-
- // We add horizontal dividers between each visible row, so there should
- // be a total of mNumVisibleRows-1 of them.
- int numHorizDividersRemainingToDraw = mNumVisibleRows - 1;
-
- for (int row = 0; row < NUM_ROWS; row++) {
- int numItemsThisRow = mNumItemsForRow[row];
- int numVisibleThisRow = mNumVisibleItemsForRow[row];
- if (DBG) log(" - num visible for row " + row + ": " + numVisibleThisRow);
- if (numVisibleThisRow == 0) {
- continue;
- }
-
- InCallMenuItemView[] thisRow = mItems[row];
-
- // Start at the left
- itemLeft = 0;
-
- // Subtract the space needed for the vertical dividers, and
- // divide by the number of items.
- itemWidth = (menuWidth - mVerticalDividerWidth * (numVisibleThisRow - 1))
- / (float) numVisibleThisRow;
-
- for (int itemIndex = 0; itemIndex < numItemsThisRow; itemIndex++) {
- child = mItems[row][itemIndex];
-
- if (!child.isVisible()) continue;
-
- if (DBG) log("==> child [" + row + "][" + itemIndex + "]: " + child);
-
- // Tell the child to be exactly this size
- child.measure(MeasureSpec.makeMeasureSpec((int) itemWidth, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec((int) itemHeight, MeasureSpec.EXACTLY));
-
- // Remember the child's position for layout
- childLayoutParams = (InCallMenuView.LayoutParams) child.getLayoutParams();
- childLayoutParams.left = (int) itemLeft;
- childLayoutParams.right = (int) (itemLeft + itemWidth);
- childLayoutParams.top = (int) itemTop;
- childLayoutParams.bottom = (int) (itemTop + itemHeight);
-
- // Increment by item width
- itemLeft += itemWidth;
-
- // Add a vertical divider to draw
- if (mVerticalDivider != null) {
- mVerticalDividerRects.add(new Rect((int) itemLeft,
- (int) itemTop, (int) (itemLeft + mVerticalDividerWidth),
- (int) (itemTop + itemHeight)));
- }
-
- // Increment by divider width (even if we're not computing
- // dividers, since we need to leave room for them when
- // calculating item positions)
- itemLeft += mVerticalDividerWidth;
- }
-
- // Last child on each row should extend to very right edge
- if (childLayoutParams != null) {
- childLayoutParams.right = menuWidth;
- }
-
- itemTop += itemHeight;
-
- // Add a horizontal divider (if we need one under this row)
- if ((mHorizontalDivider != null) && (numHorizDividersRemainingToDraw-- > 0)) {
- mHorizontalDividerRects.add(new Rect(0, (int) itemTop, menuWidth,
- (int) (itemTop + mHorizontalDividerHeight)));
- itemTop += mHorizontalDividerHeight;
- }
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- if (DBG) log("onMeasure(" + widthMeasureSpec + " x " + heightMeasureSpec + ")...");
-
- // Get the desired height of the icon menu view (last row of items does
- // not have a divider below)
- final int desiredHeight = (mRowHeight + mHorizontalDividerHeight) * mNumVisibleRows
- - mHorizontalDividerHeight;
-
- // Maximum possible width and desired height
- setMeasuredDimension(resolveSize(Integer.MAX_VALUE, widthMeasureSpec),
- resolveSize(desiredHeight, heightMeasureSpec));
-
- // Position the children
- positionChildren(mMeasuredWidth, mMeasuredHeight);
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- if (DBG) log("onLayout(changed " + changed
- + ", l " + l + " t " + t + " r " + r + " b " + b + ")...");
-
- View child;
- InCallMenuView.LayoutParams childLayoutParams;
-
- for (int i = getChildCount() - 1; i >= 0; i--) {
- child = getChildAt(i);
- childLayoutParams = (InCallMenuView.LayoutParams) child.getLayoutParams();
-
- // Layout children according to positions set during the measure
- child.layout(childLayoutParams.left, childLayoutParams.top,
- childLayoutParams.right, childLayoutParams.bottom);
- }
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- if (DBG) log("onDraw()...");
-
- if (mHorizontalDivider != null) {
- // If we have a horizontal divider to draw, draw it at the remembered positions
- for (int i = mHorizontalDividerRects.size() - 1; i >= 0; i--) {
- mHorizontalDivider.setBounds(mHorizontalDividerRects.get(i));
- mHorizontalDivider.draw(canvas);
- }
- }
-
- if (mVerticalDivider != null) {
- // If we have a vertical divider to draw, draw it at the remembered positions
- for (int i = mVerticalDividerRects.size() - 1; i >= 0; i--) {
- mVerticalDivider.setBounds(mVerticalDividerRects.get(i));
- mVerticalDivider.draw(canvas);
- }
- }
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (DBG) log("dispatchKeyEvent(" + event + ")...");
-
- // In most other apps, when a menu is up, the menu itself handles
- // keypresses. And keys that aren't handled by the menu do NOT
- // get dispatched to the current Activity.
- //
- // But in the in-call UI, we don't have any menu shortcuts, *and*
- // it's important for buttons like CALL to work normally even
- // while the menu is up. So we handle ALL key events (with some
- // exceptions -- see below) by simply forwarding them to the
- // InCallScreen.
-
- int keyCode = event.getKeyCode();
- if (event.isDown()) {
- switch (keyCode) {
- // The BACK key dismisses the menu.
- case KeyEvent.KEYCODE_BACK:
- if (DBG) log("==> BACK key! handling it ourselves...");
- // We don't need to do anything here (since BACK
- // is magically handled by the framework); we just
- // need to *not* forward it to the InCallScreen.
- break;
-
- // Don't send KEYCODE_DPAD_CENTER/KEYCODE_ENTER to the
- // InCallScreen either, since the framework needs those to
- // activate the focused item when using the trackball.
- case KeyEvent.KEYCODE_DPAD_CENTER:
- case KeyEvent.KEYCODE_ENTER:
- break;
-
- // Anything else gets forwarded to the InCallScreen.
- default:
- if (DBG) log("==> dispatchKeyEvent: forwarding event to the InCallScreen");
- if (mInCallScreen != null) {
- return mInCallScreen.onKeyDown(keyCode, event);
- }
- break;
- }
- } else if (mInCallScreen != null &&
- (keyCode == KeyEvent.KEYCODE_CALL ||
- mInCallScreen.isKeyEventAcceptableDTMF(event))) {
-
- // Forward the key-up for the call and dialer buttons to the
- // InCallScreen. All other key-up events are NOT handled here,
- // but instead fall through to dispatchKeyEvent from the superclass.
- if (DBG) log("==> dispatchKeyEvent: forwarding key up event to the InCallScreen");
- return mInCallScreen.onKeyUp(keyCode, event);
- }
- return super.dispatchKeyEvent(event);
- }
-
-
- @Override
- public LayoutParams generateLayoutParams(AttributeSet attrs) {
- return new InCallMenuView.LayoutParams(getContext(), attrs);
- }
-
- @Override
- protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
- // Override to allow type-checking of LayoutParams.
- return p instanceof InCallMenuView.LayoutParams;
- }
-
- /**
- * Layout parameters specific to InCallMenuView (stores the left, top,
- * right, bottom from the measure pass).
- */
- public static class LayoutParams extends ViewGroup.MarginLayoutParams {
- int left, top, right, bottom;
-
- public LayoutParams(Context c, AttributeSet attrs) {
- super(c, attrs);
- }
-
- public LayoutParams(int width, int height) {
- super(width, height);
- }
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/InCallScreen.java b/phone/src/com/android/phone2/InCallScreen.java
deleted file mode 100755
index 9a74b88..0000000
--- a/phone/src/com/android/phone2/InCallScreen.java
+++ /dev/null
@@ -1,4943 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface.OnCancelListener;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.graphics.PixelFormat;
-import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.provider.Settings;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.ServiceState;
-import android.text.TextUtils;
-import android.text.method.DialerKeyListener;
-import android.util.EventLog;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.SlidingDrawer;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.MmiCode;
-import com.android.internal.telephony.Phone;
-import com.android.phone2.OtaUtils.CdmaOtaInCallScreenUiState;
-import com.android.phone2.OtaUtils.CdmaOtaScreenState;
-
-import java.util.List;
-
-/**
- * Phone app "in call" screen.
- */
-public class InCallScreen extends Activity
- implements View.OnClickListener, View.OnTouchListener {
- private static final String LOG_TAG = "InCallScreen";
-
- private static final boolean DBG =
- (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
- private static final boolean VDBG = (PhoneApp.DBG_LEVEL >= 2);
-
- /**
- * Intent extra used to specify whether the DTMF dialpad should be
- * initially visible when bringing up the InCallScreen. (If this
- * extra is present, the dialpad will be initially shown if the extra
- * has the boolean value true, and initially hidden otherwise.)
- */
- // TODO: Should be EXTRA_SHOW_DIALPAD for consistency.
- static final String SHOW_DIALPAD_EXTRA = "com.android.phone2.ShowDialpad";
-
- /**
- * Intent extra to specify the package name of the gateway
- * provider. Used to get the name displayed in the in-call screen
- * during the call setup. The value is a string.
- */
- // TODO: This extra is currently set by the gateway application as
- // a temporary measure. Ultimately, the framework will securely
- // set it.
- /* package */ static final String EXTRA_GATEWAY_PROVIDER_PACKAGE =
- "com.android.phone2.extra.GATEWAY_PROVIDER_PACKAGE";
-
- /**
- * Intent extra to specify the URI of the provider to place the
- * call. The value is a string. It holds the gateway address
- * (phone gateway URL should start with the 'tel:' scheme) that
- * will actually be contacted to call the number passed in the
- * intent URL or in the EXTRA_PHONE_NUMBER extra.
- */
- // TODO: Should the value be a Uri (Parcelable)? Need to make sure
- // MMI code '#' don't get confused as URI fragments.
- /* package */ static final String EXTRA_GATEWAY_URI =
- "com.android.phone2.extra.GATEWAY_URI";
-
- // Amount of time (in msec) that we display the "Call ended" state.
- // The "short" value is for calls ended by the local user, and the
- // "long" value is for calls ended by the remote caller.
- private static final int CALL_ENDED_SHORT_DELAY = 200; // msec
- private static final int CALL_ENDED_LONG_DELAY = 2000; // msec
-
- // Amount of time (in msec) that we keep the in-call menu onscreen
- // *after* the user changes the state of one of the toggle buttons.
- private static final int MENU_DISMISS_DELAY = 1000; // msec
-
- // Amount of time that we display the PAUSE alert Dialog showing the
- // post dial string yet to be send out to the n/w
- private static final int PAUSE_PROMPT_DIALOG_TIMEOUT = 2000; //msec
-
- // The "touch lock" overlay timeout comes from Gservices; this is the default.
- private static final int TOUCH_LOCK_DELAY_DEFAULT = 6000; // msec
-
- // Amount of time for Displaying "Dialing" for 3way Calling origination
- private static final int THREEWAY_CALLERINFO_DISPLAY_TIME = 3000; // msec
-
- // Amount of time that we display the provider's overlay if applicable.
- private static final int PROVIDER_OVERLAY_TIMEOUT = 5000; // msec
-
- // These are values for the settings of the auto retry mode:
- // 0 = disabled
- // 1 = enabled
- // TODO (Moto):These constants don't really belong here,
- // they should be moved to Settings where the value is being looked up in the first place
- static final int AUTO_RETRY_OFF = 0;
- static final int AUTO_RETRY_ON = 1;
-
- // Message codes; see mHandler below.
- // Note message codes < 100 are reserved for the PhoneApp.
- private static final int PHONE_STATE_CHANGED = 101;
- private static final int PHONE_DISCONNECT = 102;
- private static final int EVENT_HEADSET_PLUG_STATE_CHANGED = 103;
- private static final int POST_ON_DIAL_CHARS = 104;
- private static final int WILD_PROMPT_CHAR_ENTERED = 105;
- private static final int ADD_VOICEMAIL_NUMBER = 106;
- private static final int DONT_ADD_VOICEMAIL_NUMBER = 107;
- private static final int DELAYED_CLEANUP_AFTER_DISCONNECT = 108;
- private static final int SUPP_SERVICE_FAILED = 110;
- private static final int DISMISS_MENU = 111;
- private static final int ALLOW_SCREEN_ON = 112;
- private static final int TOUCH_LOCK_TIMER = 113;
- private static final int REQUEST_UPDATE_BLUETOOTH_INDICATION = 114;
- private static final int PHONE_CDMA_CALL_WAITING = 115;
- private static final int THREEWAY_CALLERINFO_DISPLAY_DONE = 116;
- private static final int EVENT_OTA_PROVISION_CHANGE = 117;
- private static final int REQUEST_CLOSE_SPC_ERROR_NOTICE = 118;
- private static final int REQUEST_CLOSE_OTA_FAILURE_NOTICE = 119;
- private static final int EVENT_PAUSE_DIALOG_COMPLETE = 120;
- private static final int EVENT_HIDE_PROVIDER_OVERLAY = 121; // Time to remove the overlay.
- private static final int REQUEST_UPDATE_TOUCH_UI = 122;
-
- //following constants are used for OTA Call
- public static final String ACTION_SHOW_ACTIVATION =
- "com.android.phone2.InCallScreen.SHOW_ACTIVATION";
- public static final String OTA_NUMBER = "*228";
- public static final String EXTRA_OTA_CALL = "android.phone.extra.OTA_CALL";
-
- // When InCallScreenMode is UNDEFINED set the default action
- // to ACTION_UNDEFINED so if we are resumed the activity will
- // know its undefined. In particular checkIsOtaCall will return
- // false.
- public static final String ACTION_UNDEFINED = "com.android.phone2.InCallScreen.UNDEFINED";
-
- // High-level "modes" of the in-call UI.
- private enum InCallScreenMode {
- /**
- * Normal in-call UI elements visible.
- */
- NORMAL,
- /**
- * "Manage conference" UI is visible, totally replacing the
- * normal in-call UI.
- */
- MANAGE_CONFERENCE,
- /**
- * Non-interactive UI state. Call card is visible,
- * displaying information about the call that just ended.
- */
- CALL_ENDED,
- /**
- * Normal OTA in-call UI elements visible.
- */
- OTA_NORMAL,
- /**
- * OTA call ended UI visible, replacing normal OTA in-call UI.
- */
- OTA_ENDED,
- /**
- * Default state when not on call
- */
- UNDEFINED
- }
- private InCallScreenMode mInCallScreenMode = InCallScreenMode.UNDEFINED;
-
- // Possible error conditions that can happen on startup.
- // These are returned as status codes from the various helper
- // functions we call from onCreate() and/or onResume().
- // See syncWithPhoneState() and checkIfOkToInitiateOutgoingCall() for details.
- private enum InCallInitStatus {
- SUCCESS,
- VOICEMAIL_NUMBER_MISSING,
- POWER_OFF,
- EMERGENCY_ONLY,
- OUT_OF_SERVICE,
- PHONE_NOT_IN_USE,
- NO_PHONE_NUMBER_SUPPLIED,
- DIALED_MMI,
- CALL_FAILED
- }
- private InCallInitStatus mInCallInitialStatus; // see onResume()
-
- private boolean mRegisteredForPhoneStates;
- private boolean mNeedShowCallLostDialog;
-
- private Phone mPhone;
- private Call mForegroundCall;
- private Call mBackgroundCall;
- private Call mRingingCall;
-
- private BluetoothHandsfree mBluetoothHandsfree;
- private BluetoothHeadset mBluetoothHeadset;
- private boolean mBluetoothConnectionPending;
- private long mBluetoothConnectionRequestTime;
-
- // Main in-call UI ViewGroups
- private ViewGroup mMainFrame;
- private ViewGroup mInCallPanel;
-
- // Main in-call UI elements:
- private CallCard mCallCard;
-
- // UI controls:
- private InCallControlState mInCallControlState;
- private InCallMenu mInCallMenu; // used on some devices
- private InCallTouchUi mInCallTouchUi; // used on some devices
- private ManageConferenceUtils mManageConferenceUtils;
-
- // DTMF Dialer controller and its view:
- private DTMFTwelveKeyDialer mDialer;
- private DTMFTwelveKeyDialerView mDialerView;
-
- // TODO: Move these providers related fields in their own class.
- // Optional overlay when a 3rd party provider is used.
- private boolean mProviderOverlayVisible = false;
- private CharSequence mProviderLabel;
- private Drawable mProviderIcon;
- private Uri mProviderGatewayUri;
- // The formated address extracted from mProviderGatewayUri. User visible.
- private String mProviderAddress;
-
- // For OTA Call
- public OtaUtils otaUtils;
-
- private EditText mWildPromptText;
-
- // "Touch lock overlay" feature
- private boolean mUseTouchLockOverlay; // True if we use this feature on the current device
- private View mTouchLockOverlay; // The overlay over the whole screen
- private View mTouchLockIcon; // The "lock" icon in the middle of the screen
- private Animation mTouchLockFadeIn;
- private long mTouchLockLastTouchTime; // in SystemClock.uptimeMillis() time base
-
- // Various dialogs we bring up (see dismissAllDialogs()).
- // TODO: convert these all to use the "managed dialogs" framework.
- //
- // The MMI started dialog can actually be one of 2 items:
- // 1. An alert dialog if the MMI code is a normal MMI
- // 2. A progress dialog if the user requested a USSD
- private Dialog mMmiStartedDialog;
- private AlertDialog mMissingVoicemailDialog;
- private AlertDialog mGenericErrorDialog;
- private AlertDialog mSuppServiceFailureDialog;
- private AlertDialog mWaitPromptDialog;
- private AlertDialog mWildPromptDialog;
- private AlertDialog mCallLostDialog;
- private AlertDialog mPausePromptDialog;
- // NOTE: if you add a new dialog here, be sure to add it to dismissAllDialogs() also.
-
- // TODO: If the Activity class ever provides an easy way to get the
- // current "activity lifecycle" state, we can remove these flags.
- private boolean mIsDestroyed = false;
- private boolean mIsForegroundActivity = false;
-
- // For use with CDMA Pause/Wait dialogs
- private String mPostDialStrAfterPause;
- private boolean mPauseInProgress = false;
-
- // Flag indicating whether or not we should bring up the Call Log when
- // exiting the in-call UI due to the Phone becoming idle. (This is
- // true if the most recently disconnected Call was initiated by the
- // user, or false if it was an incoming call.)
- // This flag is used by delayedCleanupAfterDisconnect(), and is set by
- // onDisconnect() (which is the only place that either posts a
- // DELAYED_CLEANUP_AFTER_DISCONNECT event *or* calls
- // delayedCleanupAfterDisconnect() directly.)
- private boolean mShowCallLogAfterDisconnect;
-
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- if (mIsDestroyed) {
- if (DBG) log("Handler: ignoring message " + msg + "; we're destroyed!");
- return;
- }
- if (!mIsForegroundActivity) {
- if (DBG) log("Handler: handling message " + msg + " while not in foreground");
- // Continue anyway; some of the messages below *want* to
- // be handled even if we're not the foreground activity
- // (like DELAYED_CLEANUP_AFTER_DISCONNECT), and they all
- // should at least be safe to handle if we're not in the
- // foreground...
- }
-
- PhoneApp app = PhoneApp.getInstance();
- switch (msg.what) {
- case SUPP_SERVICE_FAILED:
- onSuppServiceFailed((AsyncResult) msg.obj);
- break;
-
- case PHONE_STATE_CHANGED:
- onPhoneStateChanged((AsyncResult) msg.obj);
- break;
-
- case PHONE_DISCONNECT:
- onDisconnect((AsyncResult) msg.obj);
- break;
-
- case EVENT_HEADSET_PLUG_STATE_CHANGED:
- // Update the in-call UI, since some UI elements (in
- // particular the "Speaker" menu button) change state
- // depending on whether a headset is plugged in.
- // TODO: A full updateScreen() is overkill here, since
- // the value of PhoneApp.isHeadsetPlugged() only affects a
- // single menu item. (But even a full updateScreen()
- // is still pretty cheap, so let's keep this simple
- // for now.)
- if (!isBluetoothAudioConnected()) {
- if (msg.arg1 == 1) {
- // If the dialpad is open, we need to start the timer that will
- // eventually bring up the "touch lock" overlay.
- if (mDialer.isOpened() && !isTouchLocked()) {
- resetTouchLockTimer();
- }
- }
- }
- updateScreen();
- break;
-
- case PhoneApp.MMI_INITIATE:
- onMMIInitiate((AsyncResult) msg.obj);
- break;
-
- case PhoneApp.MMI_CANCEL:
- onMMICancel();
- break;
-
- // handle the mmi complete message.
- // since the message display class has been replaced with
- // a system dialog in PhoneUtils.displayMMIComplete(), we
- // should finish the activity here to close the window.
- case PhoneApp.MMI_COMPLETE:
- // Check the code to see if the request is ready to
- // finish, this includes any MMI state that is not
- // PENDING.
- MmiCode mmiCode = (MmiCode) ((AsyncResult) msg.obj).result;
- // if phone is a CDMA phone display feature code completed message
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- PhoneUtils.displayMMIComplete(mPhone, app, mmiCode, null, null);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- if (mmiCode.getState() != MmiCode.State.PENDING) {
- if (DBG) log("Got MMI_COMPLETE, finishing InCallScreen...");
- endInCallScreenSession();
- }
- }
- break;
-
- case POST_ON_DIAL_CHARS:
- handlePostOnDialChars((AsyncResult) msg.obj, (char) msg.arg1);
- break;
-
- case ADD_VOICEMAIL_NUMBER:
- addVoiceMailNumberPanel();
- break;
-
- case DONT_ADD_VOICEMAIL_NUMBER:
- dontAddVoiceMailNumber();
- break;
-
- case DELAYED_CLEANUP_AFTER_DISCONNECT:
- delayedCleanupAfterDisconnect();
- break;
-
- case DISMISS_MENU:
- // dismissMenu() has no effect if the menu is already closed.
- dismissMenu(true); // dismissImmediate = true
- break;
-
- case ALLOW_SCREEN_ON:
- if (VDBG) log("ALLOW_SCREEN_ON message...");
- // Undo our previous call to preventScreenOn(true).
- // (Note this will cause the screen to turn on
- // immediately, if it's currently off because of a
- // prior preventScreenOn(true) call.)
- app.preventScreenOn(false);
- break;
-
- case TOUCH_LOCK_TIMER:
- if (VDBG) log("TOUCH_LOCK_TIMER...");
- touchLockTimerExpired();
- break;
-
- case REQUEST_UPDATE_BLUETOOTH_INDICATION:
- if (VDBG) log("REQUEST_UPDATE_BLUETOOTH_INDICATION...");
- // The bluetooth headset state changed, so some UI
- // elements may need to update. (There's no need to
- // look up the current state here, since any UI
- // elements that care about the bluetooth state get it
- // directly from PhoneApp.showBluetoothIndication().)
- updateScreen();
- break;
-
- case PHONE_CDMA_CALL_WAITING:
- if (DBG) log("Received PHONE_CDMA_CALL_WAITING event ...");
- Connection cn = mRingingCall.getLatestConnection();
-
- // Only proceed if we get a valid connection object
- if (cn != null) {
- // Finally update screen with Call waiting info and request
- // screen to wake up
- updateScreen();
- app.updateWakeState();
- }
- break;
-
- case THREEWAY_CALLERINFO_DISPLAY_DONE:
- if (DBG) log("Received THREEWAY_CALLERINFO_DISPLAY_DONE event ...");
- if (app.cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
- // Set the mThreeWayCallOrigStateDialing state to true
- app.cdmaPhoneCallState.setThreeWayCallOrigState(false);
-
- //Finally update screen with with the current on going call
- updateScreen();
- }
- break;
-
- case EVENT_OTA_PROVISION_CHANGE:
- if (otaUtils != null) {
- otaUtils.onOtaProvisionStatusChanged((AsyncResult) msg.obj);
- }
- break;
-
- case REQUEST_CLOSE_SPC_ERROR_NOTICE:
- if (otaUtils != null) {
- otaUtils.onOtaCloseSpcNotice();
- }
- break;
-
- case REQUEST_CLOSE_OTA_FAILURE_NOTICE:
- if (otaUtils != null) {
- otaUtils.onOtaCloseFailureNotice();
- }
- break;
-
- case EVENT_PAUSE_DIALOG_COMPLETE:
- if (mPausePromptDialog != null) {
- if (DBG) log("- DISMISSING mPausePromptDialog.");
- mPausePromptDialog.dismiss(); // safe even if already dismissed
- mPausePromptDialog = null;
- }
- break;
-
- case EVENT_HIDE_PROVIDER_OVERLAY:
- mProviderOverlayVisible = false;
- updateProviderOverlay(); // Clear the overlay.
- break;
-
- case REQUEST_UPDATE_TOUCH_UI:
- updateInCallTouchUi();
- break;
- }
- }
- };
-
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
- // Listen for ACTION_HEADSET_PLUG broadcasts so that we
- // can update the onscreen UI when the headset state changes.
- // if (DBG) log("mReceiver: ACTION_HEADSET_PLUG");
- // if (DBG) log("==> intent: " + intent);
- // if (DBG) log(" state: " + intent.getIntExtra("state", 0));
- // if (DBG) log(" name: " + intent.getStringExtra("name"));
- // send the event and add the state as an argument.
- Message message = Message.obtain(mHandler, EVENT_HEADSET_PLUG_STATE_CHANGED,
- intent.getIntExtra("state", 0), 0);
- mHandler.sendMessage(message);
- }
- }
- };
-
-
- @Override
- protected void onCreate(Bundle icicle) {
- if (DBG) log("onCreate()... this = " + this);
-
- Profiler.callScreenOnCreate();
-
- super.onCreate(icicle);
-
- final PhoneApp app = PhoneApp.getInstance();
- app.setInCallScreenInstance(this);
-
- // set this flag so this activity will stay in front of the keyguard
- int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
- if (app.getPhoneState() == Phone.State.OFFHOOK) {
- // While we are in call, the in-call screen should dismiss the keyguard.
- // This allows the user to press Home to go directly home without going through
- // an insecure lock screen.
- // But we do not want to do this if there is no active call so we do not
- // bypass the keyguard if the call is not answered or declined.
- flags |= WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
- }
- getWindow().addFlags(flags);
-
- setPhone(app.phone); // Sets mPhone and mForegroundCall/mBackgroundCall/mRingingCall
-
- mBluetoothHandsfree = app.getBluetoothHandsfree();
- if (VDBG) log("- mBluetoothHandsfree: " + mBluetoothHandsfree);
-
- if (mBluetoothHandsfree != null) {
- // The PhoneApp only creates a BluetoothHandsfree instance in the
- // first place if BluetoothAdapter.getDefaultAdapter()
- // succeeds. So at this point we know the device is BT-capable.
- mBluetoothHeadset = new BluetoothHeadset(this, null);
- if (VDBG) log("- Got BluetoothHeadset: " + mBluetoothHeadset);
- }
-
- requestWindowFeature(Window.FEATURE_NO_TITLE);
-
- // Inflate everything in incall_screen.xml and add it to the screen.
- setContentView(R.layout.incall_screen);
-
- initInCallScreen();
-
- // Create the dtmf dialer. The dialer view we use depends on the
- // current platform:
- //
- // - On non-prox-sensor devices, it's the dialpad contained inside
- // a SlidingDrawer widget (see dtmf_twelve_key_dialer.xml).
- //
- // - On "full touch UI" devices, it's the compact non-sliding
- // dialpad that appears on the upper half of the screen,
- // above the main cluster of InCallTouchUi buttons
- // (see non_drawer_dialpad.xml).
- //
- // TODO: These should both be ViewStubs, and right here we should
- // inflate one or the other. (Also, while doing that, let's also
- // move this block of code over to initInCallScreen().)
- //
- SlidingDrawer dialerDrawer;
- if (isTouchUiEnabled()) {
- // This is a "full touch" device.
- mDialerView = (DTMFTwelveKeyDialerView) findViewById(R.id.non_drawer_dtmf_dialer);
- if (DBG) log("- Full touch device! Found dialerView: " + mDialerView);
- dialerDrawer = null; // No SlidingDrawer used on this device.
- } else {
- // Use the old-style dialpad contained within the SlidingDrawer.
- mDialerView = (DTMFTwelveKeyDialerView) findViewById(R.id.dtmf_dialer);
- if (DBG) log("- Using SlidingDrawer-based dialpad. Found dialerView: " + mDialerView);
- dialerDrawer = (SlidingDrawer) findViewById(R.id.dialer_container);
- if (DBG) log(" ...and the SlidingDrawer: " + dialerDrawer);
- }
- // Sanity-check that (regardless of the device) at least the
- // dialer view is present:
- if (mDialerView == null) {
- Log.e(LOG_TAG, "onCreate: couldn't find dialerView", new IllegalStateException());
- }
- // Finally, create the DTMFTwelveKeyDialer instance.
- mDialer = new DTMFTwelveKeyDialer(this, mDialerView, dialerDrawer);
-
- registerForPhoneStates();
-
- // No need to change wake state here; that happens in onResume() when we
- // are actually displayed.
-
- // Handle the Intent we were launched with, but only if this is the
- // the very first time we're being launched (ie. NOT if we're being
- // re-initialized after previously being shut down.)
- // Once we're up and running, any future Intents we need
- // to handle will come in via the onNewIntent() method.
- if (icicle == null) {
- if (DBG) log("onCreate(): this is our very first launch, checking intent...");
-
- // Stash the result code from internalResolveIntent() in the
- // mInCallInitialStatus field. If it's an error code, we'll
- // handle it in onResume().
- mInCallInitialStatus = internalResolveIntent(getIntent());
- if (DBG) log("onCreate(): mInCallInitialStatus = " + mInCallInitialStatus);
- if (mInCallInitialStatus != InCallInitStatus.SUCCESS) {
- Log.w(LOG_TAG, "onCreate: status " + mInCallInitialStatus
- + " from internalResolveIntent()");
- // See onResume() for the actual error handling.
- }
- } else {
- mInCallInitialStatus = InCallInitStatus.SUCCESS;
- }
-
- // The "touch lock overlay" feature is used only on devices that
- // *don't* use a proximity sensor to turn the screen off while in-call.
- mUseTouchLockOverlay = !app.proximitySensorModeEnabled();
-
- Profiler.callScreenCreated();
- if (DBG) log("onCreate(): exit");
- }
-
- /**
- * Sets the Phone object used internally by the InCallScreen.
- *
- * In normal operation this is called from onCreate(), and the
- * passed-in Phone object comes from the PhoneApp.
- * For testing, test classes can use this method to
- * inject a test Phone instance.
- */
- /* package */ void setPhone(Phone phone) {
- mPhone = phone;
- // Hang onto the three Call objects too; they're singletons that
- // are constant (and never null) for the life of the Phone.
- mForegroundCall = mPhone.getForegroundCall();
- mBackgroundCall = mPhone.getBackgroundCall();
- mRingingCall = mPhone.getRingingCall();
- }
-
- @Override
- protected void onResume() {
- if (DBG) log("onResume()...");
- super.onResume();
-
- mIsForegroundActivity = true;
-
- final PhoneApp app = PhoneApp.getInstance();
-
- app.disableStatusBar();
-
- // Touch events are never considered "user activity" while the
- // InCallScreen is active, so that unintentional touches won't
- // prevent the device from going to sleep.
- app.setIgnoreTouchUserActivity(true);
-
- // Disable the status bar "window shade" the entire time we're on
- // the in-call screen.
- NotificationMgr.getDefault().getStatusBarMgr().enableExpandedView(false);
-
- // Listen for broadcast intents that might affect the onscreen UI.
- registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));
-
- // Keep a "dialer session" active when we're in the foreground.
- // (This is needed to play DTMF tones.)
- mDialer.startDialerSession();
-
- // Check for any failures that happened during onCreate() or onNewIntent().
- if (DBG) log("- onResume: initial status = " + mInCallInitialStatus);
- if (mInCallInitialStatus != InCallInitStatus.SUCCESS) {
- if (DBG) log("- onResume: failure during startup: " + mInCallInitialStatus);
-
- // Don't bring up the regular Phone UI! Instead bring up
- // something more specific to let the user deal with the
- // problem.
- handleStartupError(mInCallInitialStatus);
-
- // But it *is* OK to continue with the rest of onResume(),
- // since any further setup steps (like updateScreen() and the
- // CallCard setup) will fall back to a "blank" state if the
- // phone isn't in use.
- mInCallInitialStatus = InCallInitStatus.SUCCESS;
- }
-
- // Set the volume control handler while we are in the foreground.
- final boolean bluetoothConnected = isBluetoothAudioConnected();
-
- if (bluetoothConnected) {
- setVolumeControlStream(AudioManager.STREAM_BLUETOOTH_SCO);
- } else {
- setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
- }
-
- takeKeyEvents(true);
-
- boolean phoneIsCdma = (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA);
-
- boolean inOtaCall = false;
- if (phoneIsCdma) {
- inOtaCall = initOtaState();
- }
- if (!inOtaCall) {
- // Always start off in NORMAL mode
- setInCallScreenMode(InCallScreenMode.NORMAL);
- }
-
- // Before checking the state of the phone, clean up any
- // connections in the DISCONNECTED state.
- // (The DISCONNECTED state is used only to drive the "call ended"
- // UI; it's totally useless when *entering* the InCallScreen.)
- mPhone.clearDisconnected();
-
- InCallInitStatus status = syncWithPhoneState();
- if (status != InCallInitStatus.SUCCESS) {
- if (DBG) log("- syncWithPhoneState failed! status = " + status);
- // Couldn't update the UI, presumably because the phone is totally
- // idle. But don't endInCallScreenSession immediately, since we might still
- // have an error dialog up that the user needs to see.
- // (And in that case, the error dialog is responsible for calling
- // endInCallScreenSession when the user dismisses it.)
- } else if (phoneIsCdma) {
- if (mInCallScreenMode == InCallScreenMode.OTA_NORMAL ||
- mInCallScreenMode == InCallScreenMode.OTA_ENDED) {
- mDialer.setHandleVisible(false);
- if (mInCallPanel != null) mInCallPanel.setVisibility(View.GONE);
- updateScreen();
- return;
- }
- }
-
- // InCallScreen is now active.
- EventLog.writeEvent(EventLogTags.PHONE_UI_ENTER);
-
- // Update the poke lock and wake lock when we move to
- // the foreground.
- //
- // But we need to do something special if we're coming
- // to the foreground while an incoming call is ringing:
- if (mPhone.getState() == Phone.State.RINGING) {
- // If the phone is ringing, we *should* already be holding a
- // full wake lock (which we would have acquired before
- // firing off the intent that brought us here; see
- // PhoneUtils.showIncomingCallUi().)
- //
- // We also called preventScreenOn(true) at that point, to
- // avoid cosmetic glitches while we were being launched.
- // So now we need to post an ALLOW_SCREEN_ON message to
- // (eventually) undo the prior preventScreenOn(true) call.
- //
- // (In principle we shouldn't do this until after our first
- // layout/draw pass. But in practice, the delay caused by
- // simply waiting for the end of the message queue is long
- // enough to avoid any flickering of the lock screen before
- // the InCallScreen comes up.)
- if (VDBG) log("- posting ALLOW_SCREEN_ON message...");
- mHandler.removeMessages(ALLOW_SCREEN_ON);
- mHandler.sendEmptyMessage(ALLOW_SCREEN_ON);
-
- // TODO: There ought to be a more elegant way of doing this,
- // probably by having the PowerManager and ActivityManager
- // work together to let apps request that the screen on/off
- // state be synchronized with the Activity lifecycle.
- // (See bug 1648751.)
- } else {
- // The phone isn't ringing; this is either an outgoing call, or
- // we're returning to a call in progress. There *shouldn't* be
- // any prior preventScreenOn(true) call that we need to undo,
- // but let's do this just to be safe:
- app.preventScreenOn(false);
- }
- app.updateWakeState();
-
- // The "touch lock" overlay is NEVER visible when we resume.
- // (In particular, this check ensures that we won't still be
- // locked after the user wakes up the screen by pressing MENU.)
- enableTouchLock(false);
- // ...but if the dialpad is open we DO need to start the timer
- // that will eventually bring up the "touch lock" overlay.
- if (mDialer.isOpened()) resetTouchLockTimer();
-
- // Restore the mute state if the last mute state change was NOT
- // done by the user.
- if (app.getRestoreMuteOnInCallResume()) {
- PhoneUtils.restoreMuteState(mPhone);
- app.setRestoreMuteOnInCallResume(false);
- }
-
- Profiler.profileViewCreate(getWindow(), InCallScreen.class.getName());
- if (VDBG) log("onResume() done.");
- }
-
- // onPause is guaranteed to be called when the InCallScreen goes
- // in the background.
- @Override
- protected void onPause() {
- if (DBG) log("onPause()...");
- super.onPause();
-
- mIsForegroundActivity = false;
-
- // Force a clear of the provider overlay' frame. Since the
- // overlay is removed using a timed message, it is
- // possible we missed it if the prev call was interrupted.
- mProviderOverlayVisible = false;
- updateProviderOverlay();
-
- final PhoneApp app = PhoneApp.getInstance();
-
- // A safety measure to disable proximity sensor in case call failed
- // and the telephony state did not change.
- app.setBeginningCall(false);
-
- // Make sure the "Manage conference" chronometer is stopped when
- // we move away from the foreground.
- mManageConferenceUtils.stopConferenceTime();
-
- // as a catch-all, make sure that any dtmf tones are stopped
- // when the UI is no longer in the foreground.
- mDialer.onDialerKeyUp(null);
-
- // Release any "dialer session" resources, now that we're no
- // longer in the foreground.
- mDialer.stopDialerSession();
-
- // If the device is put to sleep as the phone call is ending,
- // we may see cases where the DELAYED_CLEANUP_AFTER_DISCONNECT
- // event gets handled AFTER the device goes to sleep and wakes
- // up again.
-
- // This is because it is possible for a sleep command
- // (executed with the End Call key) to come during the 2
- // seconds that the "Call Ended" screen is up. Sleep then
- // pauses the device (including the cleanup event) and
- // resumes the event when it wakes up.
-
- // To fix this, we introduce a bit of code that pushes the UI
- // to the background if we pause and see a request to
- // DELAYED_CLEANUP_AFTER_DISCONNECT.
-
- // Note: We can try to finish directly, by:
- // 1. Removing the DELAYED_CLEANUP_AFTER_DISCONNECT messages
- // 2. Calling delayedCleanupAfterDisconnect directly
-
- // However, doing so can cause problems between the phone
- // app and the keyguard - the keyguard is trying to sleep at
- // the same time that the phone state is changing. This can
- // end up causing the sleep request to be ignored.
- if (mHandler.hasMessages(DELAYED_CLEANUP_AFTER_DISCONNECT)
- && mPhone.getState() != Phone.State.RINGING) {
- if (DBG) log("DELAYED_CLEANUP_AFTER_DISCONNECT detected, moving UI to background.");
- endInCallScreenSession();
- }
-
- EventLog.writeEvent(EventLogTags.PHONE_UI_EXIT);
-
- // Clean up the menu, in case we get paused while the menu is up
- // for some reason.
- dismissMenu(true); // dismiss immediately
-
- // Dismiss any dialogs we may have brought up, just to be 100%
- // sure they won't still be around when we get back here.
- dismissAllDialogs();
-
- // Re-enable the status bar (which we disabled in onResume().)
- NotificationMgr.getDefault().getStatusBarMgr().enableExpandedView(true);
-
- // Unregister for broadcast intents. (These affect the visible UI
- // of the InCallScreen, so we only care about them while we're in the
- // foreground.)
- unregisterReceiver(mReceiver);
-
- // Re-enable "user activity" for touch events.
- // We actually do this slightly *after* onPause(), to work around a
- // race condition where a touch can come in after we've paused
- // but before the device actually goes to sleep.
- // TODO: The PowerManager itself should prevent this from happening.
- mHandler.postDelayed(new Runnable() {
- public void run() {
- app.setIgnoreTouchUserActivity(false);
- }
- }, 500);
-
- app.reenableStatusBar();
-
- // Make sure we revert the poke lock and wake lock when we move to
- // the background.
- app.updateWakeState();
-
- // clear the dismiss keyguard flag so we are back to the default state
- // when we next resume
- updateKeyguardPolicy(false);
- }
-
- @Override
- protected void onStop() {
- if (DBG) log("onStop()...");
- super.onStop();
-
- stopTimer();
-
- Phone.State state = mPhone.getState();
- if (DBG) log("onStop: state = " + state);
-
- if (state == Phone.State.IDLE) {
- final PhoneApp app = PhoneApp.getInstance();
- // when OTA Activation, OTA Success/Failure dialog or OTA SPC
- // failure dialog is running, do not destroy inCallScreen. Because call
- // is already ended and dialog will not get redrawn on slider event.
- if ((app.cdmaOtaProvisionData != null) && (app.cdmaOtaScreenState != null)
- && ((app.cdmaOtaScreenState.otaScreenState !=
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION)
- && (app.cdmaOtaScreenState.otaScreenState !=
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG)
- && (!app.cdmaOtaProvisionData.inOtaSpcState))) {
- // we don't want the call screen to remain in the activity history
- // if there are not active or ringing calls.
- if (DBG) log("- onStop: calling finish() to clear activity history...");
- moveTaskToBack(true);
- if (otaUtils != null) {
- otaUtils.cleanOtaScreen(true);
- }
- }
- }
- }
-
- @Override
- protected void onDestroy() {
- if (DBG) log("onDestroy()...");
- super.onDestroy();
-
- // Set the magic flag that tells us NOT to handle any handler
- // messages that come in asynchronously after we get destroyed.
- mIsDestroyed = true;
-
- final PhoneApp app = PhoneApp.getInstance();
- app.setInCallScreenInstance(null);
-
- // Clear out the InCallScreen references in various helper objects
- // (to let them know we've been destroyed).
- if (mInCallMenu != null) {
- mInCallMenu.clearInCallScreenReference();
- }
- if (mCallCard != null) {
- mCallCard.setInCallScreenInstance(null);
- }
- if (mInCallTouchUi != null) {
- mInCallTouchUi.setInCallScreenInstance(null);
- }
-
- mDialer.clearInCallScreenReference();
- mDialer = null;
-
- unregisterForPhoneStates();
- // No need to change wake state here; that happens in onPause() when we
- // are moving out of the foreground.
-
- if (mBluetoothHeadset != null) {
- mBluetoothHeadset.close();
- mBluetoothHeadset = null;
- }
-
- // Dismiss all dialogs, to be absolutely sure we won't leak any of
- // them while changing orientation.
- dismissAllDialogs();
- }
-
- /**
- * Dismisses the in-call screen.
- *
- * We never *really* finish() the InCallScreen, since we don't want to
- * get destroyed and then have to be re-created from scratch for the
- * next call. Instead, we just move ourselves to the back of the
- * activity stack.
- *
- * This also means that we'll no longer be reachable via the BACK
- * button (since moveTaskToBack() puts us behind the Home app, but the
- * home app doesn't allow the BACK key to move you any farther down in
- * the history stack.)
- *
- * (Since the Phone app itself is never killed, this basically means
- * that we'll keep a single InCallScreen instance around for the
- * entire uptime of the device. This noticeably improves the UI
- * responsiveness for incoming calls.)
- */
- @Override
- public void finish() {
- if (DBG) log("finish()...");
- moveTaskToBack(true);
- }
-
- /**
- * End the current in call screen session.
- *
- * This must be called when an InCallScreen session has
- * complete so that the next invocation via an onResume will
- * not be in an old state.
- */
- public void endInCallScreenSession() {
- if (DBG) log("endInCallScreenSession()...");
- moveTaskToBack(true);
- setInCallScreenMode(InCallScreenMode.UNDEFINED);
- }
-
- /* package */ boolean isForegroundActivity() {
- return mIsForegroundActivity;
- }
-
- /* package */ void updateKeyguardPolicy(boolean dismissKeyguard) {
- if (dismissKeyguard) {
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
- } else {
- getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
- }
- }
-
- private void registerForPhoneStates() {
- if (!mRegisteredForPhoneStates) {
- mPhone.registerForPreciseCallStateChanged(mHandler, PHONE_STATE_CHANGED, null);
- mPhone.registerForDisconnect(mHandler, PHONE_DISCONNECT, null);
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- mPhone.registerForMmiInitiate(mHandler, PhoneApp.MMI_INITIATE, null);
-
- // register for the MMI complete message. Upon completion,
- // PhoneUtils will bring up a system dialog instead of the
- // message display class in PhoneUtils.displayMMIComplete().
- // We'll listen for that message too, so that we can finish
- // the activity at the same time.
- mPhone.registerForMmiComplete(mHandler, PhoneApp.MMI_COMPLETE, null);
- } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
- if (DBG) log("Registering for Call Waiting.");
- mPhone.registerForCallWaiting(mHandler, PHONE_CDMA_CALL_WAITING, null);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
-
- mPhone.setOnPostDialCharacter(mHandler, POST_ON_DIAL_CHARS, null);
- mPhone.registerForSuppServiceFailed(mHandler, SUPP_SERVICE_FAILED, null);
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- mPhone.registerForCdmaOtaStatusChange(mHandler, EVENT_OTA_PROVISION_CHANGE, null);
- }
- mRegisteredForPhoneStates = true;
- }
- }
-
- private void unregisterForPhoneStates() {
- mPhone.unregisterForPreciseCallStateChanged(mHandler);
- mPhone.unregisterForDisconnect(mHandler);
- mPhone.unregisterForMmiInitiate(mHandler);
- mPhone.unregisterForCallWaiting(mHandler);
- mPhone.setOnPostDialCharacter(null, POST_ON_DIAL_CHARS, null);
- mPhone.unregisterForCdmaOtaStatusChange(mHandler);
- mRegisteredForPhoneStates = false;
- }
-
- /* package */ void updateAfterRadioTechnologyChange() {
- if (DBG) Log.d(LOG_TAG, "updateAfterRadioTechnologyChange()...");
- // Unregister for all events from the old obsolete phone
- unregisterForPhoneStates();
-
- // (Re)register for all events relevant to the new active phone
- registerForPhoneStates();
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- if (DBG) log("onNewIntent: intent=" + intent);
-
- // We're being re-launched with a new Intent. Since we keep
- // around a single InCallScreen instance for the life of the phone
- // process (see finish()), this sequence will happen EVERY time
- // there's a new incoming or outgoing call except for the very
- // first time the InCallScreen gets created. This sequence will
- // also happen if the InCallScreen is already in the foreground
- // (e.g. getting a new ACTION_CALL intent while we were already
- // using the other line.)
-
- // 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 this intent, and stash the
- // result code from internalResolveIntent() in the
- // mInCallInitialStatus field. If it's an error code, we'll
- // handle it in onResume().
- mInCallInitialStatus = internalResolveIntent(intent);
- if (mInCallInitialStatus != InCallInitStatus.SUCCESS) {
- Log.w(LOG_TAG, "onNewIntent: status " + mInCallInitialStatus
- + " from internalResolveIntent()");
- // See onResume() for the actual error handling.
- }
- }
-
- /* package */ InCallInitStatus internalResolveIntent(Intent intent) {
- if (intent == null || intent.getAction() == null) {
- return InCallInitStatus.SUCCESS;
- }
-
- checkIsOtaCall(intent);
-
- String action = intent.getAction();
- if (DBG) log("internalResolveIntent: action=" + action);
-
- // The calls to setRestoreMuteOnInCallResume() inform the phone
- // that we're dealing with new connections (either a placing an
- // outgoing call or answering an incoming one, and NOT handling
- // an aborted "Add Call" request), so we should let the mute state
- // be handled by the PhoneUtils phone state change handler.
- final PhoneApp app = PhoneApp.getInstance();
- // If OTA Activation is configured for Power up scenario, then
- // InCallScreen UI started with Intent of ACTION_SHOW_ACTIVATION
- // to show OTA Activation screen at power up.
- if ((action.equals(ACTION_SHOW_ACTIVATION))
- && ((mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA))) {
- setInCallScreenMode(InCallScreenMode.OTA_NORMAL);
- if ((app.cdmaOtaProvisionData != null)
- && (!app.cdmaOtaProvisionData.isOtaCallIntentProcessed)) {
- app.cdmaOtaProvisionData.isOtaCallIntentProcessed = true;
- app.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION;
- }
- return InCallInitStatus.SUCCESS;
- } else if (action.equals(Intent.ACTION_ANSWER)) {
- internalAnswerCall();
- app.setRestoreMuteOnInCallResume(false);
- return InCallInitStatus.SUCCESS;
- } else if (action.equals(Intent.ACTION_CALL)
- || action.equals(Intent.ACTION_CALL_EMERGENCY)) {
- app.setRestoreMuteOnInCallResume(false);
-
- // If a provider is used, extract the info to build the
- // overlay and route the call. The overlay will be
- // displayed the first time updateScreen is called.
- if (PhoneUtils.hasPhoneProviderExtras(intent)) {
- mProviderLabel = PhoneUtils.getProviderLabel(this, intent);
- mProviderIcon = PhoneUtils.getProviderIcon(this, intent);
- mProviderGatewayUri = PhoneUtils.getProviderGatewayUri(intent);
- mProviderAddress = PhoneUtils.formatProviderUri(mProviderGatewayUri);
- mProviderOverlayVisible = true;
-
- if (TextUtils.isEmpty(mProviderLabel) || null == mProviderIcon ||
- null == mProviderGatewayUri || TextUtils.isEmpty(mProviderAddress)) {
- clearProvider();
- }
- } else {
- clearProvider();
- }
- InCallInitStatus status = placeCall(intent);
- if (status == InCallInitStatus.SUCCESS) {
- // Notify the phone app that a call is beginning so it can
- // enable the proximity sensor
- app.setBeginningCall(true);
- }
- return status;
- } else if (action.equals(intent.ACTION_MAIN)) {
- // The MAIN action is used to bring up the in-call screen without
- // doing any other explicit action, like when you return to the
- // current call after previously bailing out of the in-call UI.
- // 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.
-
- if ((mInCallScreenMode == InCallScreenMode.OTA_NORMAL)
- || (mInCallScreenMode == InCallScreenMode.OTA_ENDED)) {
- // If in OTA Call, update the OTA UI
- updateScreen();
- return InCallInitStatus.SUCCESS;
- }
- if (intent.hasExtra(SHOW_DIALPAD_EXTRA)) {
- boolean showDialpad = intent.getBooleanExtra(SHOW_DIALPAD_EXTRA, false);
- if (VDBG) log("- internalResolveIntent: SHOW_DIALPAD_EXTRA: " + showDialpad);
- if (showDialpad) {
- mDialer.openDialer(false); // no "opening" animation
- } else {
- mDialer.closeDialer(false); // no "closing" animation
- }
- }
- return InCallInitStatus.SUCCESS;
- } else if (action.equals(ACTION_UNDEFINED)) {
- return InCallInitStatus.SUCCESS;
- } else {
- Log.w(LOG_TAG, "internalResolveIntent: unexpected intent action: " + action);
- // But continue the best we can (basically treating this case
- // like ACTION_MAIN...)
- return InCallInitStatus.SUCCESS;
- }
- }
-
- private void stopTimer() {
- if (mCallCard != null) mCallCard.stopTimer();
- }
-
- private void initInCallScreen() {
- if (VDBG) log("initInCallScreen()...");
-
- // Have the WindowManager filter out touch events that are "too fat".
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES);
-
- // Run in a 32-bit window, which improves the appearance of some
- // semitransparent artwork in the in-call UI (like the CallCard
- // photo borders).
- getWindow().setFormat(PixelFormat.RGBX_8888);
-
- mMainFrame = (ViewGroup) findViewById(R.id.mainFrame);
- mInCallPanel = (ViewGroup) findViewById(R.id.inCallPanel);
-
- // Initialize the CallCard.
- mCallCard = (CallCard) findViewById(R.id.callCard);
- if (VDBG) log(" - mCallCard = " + mCallCard);
- mCallCard.setInCallScreenInstance(this);
-
- // Onscreen touch UI elements (used on some platforms)
- initInCallTouchUi();
-
- // Helper class to keep track of enabledness/state of UI controls
- mInCallControlState = new InCallControlState(this, mPhone);
-
- // Helper class to run the "Manage conference" UI
- mManageConferenceUtils = new ManageConferenceUtils(this, mPhone);
- }
-
- /**
- * Returns true if the phone is "in use", meaning that at least one line
- * is active (ie. off hook or ringing or dialing). Conversely, a return
- * value of false means there's currently no phone activity at all.
- */
- private boolean phoneIsInUse() {
- return mPhone.getState() != Phone.State.IDLE;
- }
-
- private boolean handleDialerKeyDown(int keyCode, KeyEvent event) {
- if (VDBG) log("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. We do so
- // only if the okToDialDTMFTones() conditions pass.
- if (okToDialDTMFTones()) {
- return mDialer.onDialerKeyDown(event);
-
- // TODO: If the dialpad isn't currently visible, maybe
- // consider automatically bringing it up right now?
- // (Just to make sure the user sees the digits widget...)
- // But this probably isn't too critical since it's awkward to
- // use the hard keyboard while in-call in the first place,
- // especially now that the in-call UI is portrait-only...
- }
-
- return false;
- }
-
- @Override
- public void onBackPressed() {
- if (DBG) log("onBackPressed()...");
-
- // To consume this BACK press, the code here should just do
- // something and return. Otherwise, call super.onBackPressed() to
- // get the default implementation (which simply finishes the
- // current activity.)
-
- if (!mRingingCall.isIdle()) {
- // While an incoming call is ringing, BACK behaves just like
- // ENDCALL: it stops the ringing and rejects the current call.
- // (This is only enabled on some platforms, though.)
- if (getResources().getBoolean(R.bool.allow_back_key_to_reject_incoming_call)) {
- if (DBG) log("BACK key while ringing: reject the call");
- internalHangupRingingCall();
-
- // Don't consume the key; instead let the BACK event *also*
- // get handled normally by the framework (which presumably
- // will cause us to exit out of this activity.)
- super.onBackPressed();
- return;
- } else {
- // The BACK key is disabled; don't reject the call, but
- // *do* consume the keypress (otherwise we'll exit out of
- // this activity.)
- if (DBG) log("BACK key while ringing: ignored");
- return;
- }
- }
-
- // BACK is also used to exit out of any "special modes" of the
- // in-call UI:
-
- if (mDialer.isOpened()) {
- // Take down the "touch lock" overlay *immediately* to let the
- // user clearly see the DTMF dialpad's closing animation.
- enableTouchLock(false);
-
- mDialer.closeDialer(true); // do the "closing" animation
- return;
- }
-
- if (mInCallScreenMode == InCallScreenMode.MANAGE_CONFERENCE) {
- // Hide the Manage Conference panel, return to NORMAL mode.
- setInCallScreenMode(InCallScreenMode.NORMAL);
- return;
- }
-
- // Nothing special to do. Fall back to the default behavior.
- super.onBackPressed();
- }
-
- /**
- * Handles the green CALL key while in-call.
- * @return true if we consumed the event.
- */
- private boolean 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.
-
- final boolean hasRingingCall = !mRingingCall.isIdle();
- final boolean hasActiveCall = !mForegroundCall.isIdle();
- final boolean hasHoldingCall = !mBackgroundCall.isIdle();
-
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // The green CALL button means either "Answer", "Swap calls/On Hold", or
- // "Add to 3WC", depending on the current state of the Phone.
-
- PhoneApp app = PhoneApp.getInstance();
- CdmaPhoneCallState.PhoneCallState currCallState =
- app.cdmaPhoneCallState.getCurrentCallState();
- if (hasRingingCall) {
- //Scenario 1: Accepting the First Incoming and Call Waiting call
- if (DBG) log("answerCall: First Incoming and Call Waiting scenario");
- internalAnswerCall(); // Automatically holds the current active call,
- // if there is one
- } else if ((currCallState == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE)
- && (hasActiveCall)) {
- //Scenario 2: Merging 3Way calls
- if (DBG) log("answerCall: Merge 3-way call scenario");
- // Merge calls
- PhoneUtils.mergeCalls(mPhone);
- } else if (currCallState == CdmaPhoneCallState.PhoneCallState.CONF_CALL) {
- //Scenario 3: Switching between two Call waiting calls or drop the latest
- // connection if in a 3Way merge scenario
- if (DBG) log("answerCall: Switch btwn 2 calls scenario");
- internalSwapCalls();
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- if (hasRingingCall) {
- // If an incoming call is ringing, the CALL button is actually
- // handled by the PhoneWindowManager. (We do this to make
- // sure that we'll respond to the key even if the InCallScreen
- // hasn't come to the foreground yet.)
- //
- // We'd only ever get here in the extremely rare case that the
- // incoming call started ringing *after*
- // PhoneWindowManager.interceptKeyTq() but before the event
- // got here, or else if the PhoneWindowManager had some
- // problem connecting to the ITelephony service.
- Log.w(LOG_TAG, "handleCallKey: incoming call is ringing!"
- + " (PhoneWindowManager should have handled this key.)");
- // But go ahead and handle the key as normal, since the
- // PhoneWindowManager presumably did NOT handle it:
-
- // There's an incoming ringing call: CALL means "Answer".
- internalAnswerCall();
- } else if (hasActiveCall && hasHoldingCall) {
- // Two lines are in use: CALL means "Swap calls".
- if (DBG) log("handleCallKey: both lines in use ==> swap calls.");
- internalSwapCalls();
- } else if (hasHoldingCall) {
- // There's only one line in use, AND it's on hold.
- // In this case CALL is a shortcut for "unhold".
- if (DBG) log("handleCallKey: call on hold ==> unhold.");
- PhoneUtils.switchHoldingAndActive(mPhone); // Really means "unhold" in this state
- } else {
- // The most common case: there's only one line in use, and
- // it's an active call (i.e. it's not on hold.)
- // In this case CALL is a no-op.
- // (This used to be a shortcut for "add call", but that was a
- // bad idea because "Add call" is so infrequently-used, and
- // because the user experience is pretty confusing if you
- // inadvertently trigger it.)
- if (VDBG) log("handleCallKey: call in foregound ==> ignoring.");
- // But note we still consume this key event; see below.
- }
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
-
- // We *always* consume the CALL key, since the system-wide default
- // action ("go to the in-call screen") is useless here.
- return true;
- }
-
- boolean isKeyEventAcceptableDTMF (KeyEvent event) {
- return (mDialer != null && mDialer.isKeyEventAcceptable(event));
- }
-
- /**
- * Overriden to track relevant focus changes.
- *
- * If a key is down and some time later the focus changes, we may
- * NOT recieve the keyup event; logically the keyup event has not
- * occured in this window. This issue is fixed by treating a focus
- * changed event as an interruption to the keydown, making sure
- * that any code that needs to be run in onKeyUp is ALSO run here.
- *
- * Note, this focus change event happens AFTER the in-call menu is
- * displayed, so mIsMenuDisplayed should always be correct by the
- * time this method is called in the framework, please see:
- * {@link onCreatePanelView}, {@link onOptionsMenuClosed}
- */
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- // the dtmf tones should no longer be played
- if (VDBG) log("onWindowFocusChanged(" + hasFocus + ")...");
- if (!hasFocus && mDialer != null) {
- if (VDBG) log("- onWindowFocusChanged: faking onDialerKeyUp()...");
- mDialer.onDialerKeyUp(null);
- }
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- // if (DBG) log("dispatchKeyEvent(event " + event + ")...");
-
- // Intercept some events before they get dispatched to our views.
- switch (event.getKeyCode()) {
- case KeyEvent.KEYCODE_DPAD_CENTER:
- case KeyEvent.KEYCODE_DPAD_UP:
- case KeyEvent.KEYCODE_DPAD_DOWN:
- case KeyEvent.KEYCODE_DPAD_LEFT:
- case KeyEvent.KEYCODE_DPAD_RIGHT:
- // Disable DPAD keys and trackball clicks if the touch lock
- // overlay is up, since "touch lock" really means "disable
- // the DTMF dialpad" (rather than only disabling touch events.)
- if (mDialer.isOpened() && isTouchLocked()) {
- if (DBG) log("- ignoring DPAD event while touch-locked...");
- return true;
- }
- break;
-
- default:
- break;
- }
-
- return super.dispatchKeyEvent(event);
- }
-
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- // if (DBG) log("onKeyUp(keycode " + keyCode + ")...");
-
- // push input to the dialer.
- if ((mDialer != null) && (mDialer.onDialerKeyUp(event))){
- return true;
- } else if (keyCode == KeyEvent.KEYCODE_CALL) {
- // Always consume CALL to be sure the PhoneWindow won't do anything with it
- return true;
- }
- return super.onKeyUp(keyCode, event);
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- // if (DBG) log("onKeyDown(keycode " + keyCode + ")...");
-
- switch (keyCode) {
- case KeyEvent.KEYCODE_CALL:
- boolean handled = handleCallKey();
- if (!handled) {
- Log.w(LOG_TAG, "InCallScreen 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:
- if (mPhone.getState() == Phone.State.RINGING) {
- // If an incoming call is ringing, the VOLUME buttons are
- // actually handled by the PhoneWindowManager. (We do
- // this to make sure that we'll respond to them even if
- // the InCallScreen hasn't come to the foreground yet.)
- //
- // We'd only ever get here in the extremely rare case that the
- // incoming call started ringing *after*
- // PhoneWindowManager.interceptKeyTq() but before the event
- // got here, or else if the PhoneWindowManager had some
- // problem connecting to the ITelephony service.
- Log.w(LOG_TAG, "VOLUME key: incoming call is ringing!"
- + " (PhoneWindowManager should have handled this key.)");
- // But go ahead and handle the key as normal, since the
- // PhoneWindowManager presumably did NOT handle it:
-
- final CallNotifier notifier = PhoneApp.getInstance().notifier;
- if (notifier.isRinging()) {
- // ringer is actually playing, so silence it.
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_IDLE);
- if (DBG) log("VOLUME key: silence ringer");
- notifier.silenceRinger();
- }
-
- // As long as an incoming call is ringing, we always
- // consume the VOLUME keys.
- return true;
- }
- break;
-
- case KeyEvent.KEYCODE_MENU:
- // Special case for the MENU key: if the "touch lock"
- // overlay is up (over the DTMF dialpad), allow MENU to
- // dismiss the overlay just as if you had double-tapped
- // the onscreen icon.
- // (We do this because MENU is normally used to bring the
- // UI back after the screen turns off, and the touch lock
- // overlay "feels" very similar to the screen going off.
- // This is also here to be "backward-compatibile" with the
- // 1.0 behavior, where you *needed* to hit MENU to bring
- // back the dialpad after 6 seconds of idle time.)
- if (mDialer.isOpened() && isTouchLocked()) {
- if (VDBG) log("- allowing MENU to dismiss touch lock overlay...");
- // Take down the touch lock overlay, but post a
- // message in the future to bring it back later.
- enableTouchLock(false);
- resetTouchLockTimer();
- return true;
- }
- break;
-
- case KeyEvent.KEYCODE_MUTE:
- PhoneUtils.setMute(mPhone, !PhoneUtils.getMute(mPhone));
- return true;
-
- // Various testing/debugging features, enabled ONLY when VDBG == true.
- case KeyEvent.KEYCODE_SLASH:
- if (VDBG) {
- log("----------- InCallScreen View dump --------------");
- // Dump starting from the top-level view of the entire activity:
- Window w = this.getWindow();
- View decorView = w.getDecorView();
- decorView.debug();
- return true;
- }
- break;
- case KeyEvent.KEYCODE_EQUALS:
- if (VDBG) {
- log("----------- InCallScreen call state dump --------------");
- PhoneUtils.dumpCallState(mPhone);
- return true;
- }
- break;
- case KeyEvent.KEYCODE_GRAVE:
- if (VDBG) {
- // Placeholder for other misc temp testing
- log("------------ Temp testing -----------------");
- return true;
- }
- break;
- }
-
- if (event.getRepeatCount() == 0 && handleDialerKeyDown(keyCode, event)) {
- return true;
- }
-
- return super.onKeyDown(keyCode, event);
- }
-
- /**
- * Handle a failure notification for a supplementary service
- * (i.e. conference, switch, separate, transfer, etc.).
- */
- void onSuppServiceFailed(AsyncResult r) {
- Phone.SuppService service = (Phone.SuppService) r.result;
- if (DBG) log("onSuppServiceFailed: " + service);
-
- int errorMessageResId;
- switch (service) {
- case SWITCH:
- // Attempt to switch foreground and background/incoming calls failed
- // ("Failed to switch calls")
- errorMessageResId = R.string.incall_error_supp_service_switch;
- break;
-
- case SEPARATE:
- // Attempt to separate a call from a conference call
- // failed ("Failed to separate out call")
- errorMessageResId = R.string.incall_error_supp_service_separate;
- break;
-
- case TRANSFER:
- // Attempt to connect foreground and background calls to
- // each other (and hanging up user's line) failed ("Call
- // transfer failed")
- errorMessageResId = R.string.incall_error_supp_service_transfer;
- break;
-
- case CONFERENCE:
- // Attempt to add a call to conference call failed
- // ("Conference call failed")
- errorMessageResId = R.string.incall_error_supp_service_conference;
- break;
-
- case REJECT:
- // Attempt to reject an incoming call failed
- // ("Call rejection failed")
- errorMessageResId = R.string.incall_error_supp_service_reject;
- break;
-
- case HANGUP:
- // Attempt to release a call failed ("Failed to release call(s)")
- errorMessageResId = R.string.incall_error_supp_service_hangup;
- break;
-
- case UNKNOWN:
- default:
- // Attempt to use a service we don't recognize or support
- // ("Unsupported service" or "Selected service failed")
- errorMessageResId = R.string.incall_error_supp_service_unknown;
- break;
- }
-
- // mSuppServiceFailureDialog is a generic dialog used for any
- // supp service failure, and there's only ever have one
- // instance at a time. So just in case a previous dialog is
- // still around, dismiss it.
- if (mSuppServiceFailureDialog != null) {
- if (DBG) log("- DISMISSING mSuppServiceFailureDialog.");
- mSuppServiceFailureDialog.dismiss(); // It's safe to dismiss() a dialog
- // that's already dismissed.
- mSuppServiceFailureDialog = null;
- }
-
- mSuppServiceFailureDialog = new AlertDialog.Builder(this)
- .setMessage(errorMessageResId)
- .setPositiveButton(R.string.ok, null)
- .setCancelable(true)
- .create();
- mSuppServiceFailureDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
- mSuppServiceFailureDialog.show();
- }
-
- /**
- * Something has changed in the phone's state. Update the UI.
- */
- private void onPhoneStateChanged(AsyncResult r) {
- if (DBG) log("onPhoneStateChanged()...");
-
- // There's nothing to do here if we're not the foreground activity.
- // (When we *do* eventually come to the foreground, we'll do a
- // full update then.)
- if (!mIsForegroundActivity) {
- if (DBG) log("onPhoneStateChanged: Activity not in foreground! Bailing out...");
- return;
- }
-
- updateScreen();
-
- // Make sure we update the poke lock and wake lock when certain
- // phone state changes occur.
- PhoneApp.getInstance().updateWakeState();
- }
-
- /**
- * Updates the UI after a phone connection is disconnected, as follows:
- *
- * - If this was a missed or rejected incoming call, and no other
- * calls are active, dismiss the in-call UI immediately. (The
- * CallNotifier will still create a "missed call" notification if
- * necessary.)
- *
- * - With any other disconnect cause, if the phone is now totally
- * idle, display the "Call ended" state for a couple of seconds.
- *
- * - Or, if the phone is still in use, stay on the in-call screen
- * (and update the UI to reflect the current state of the Phone.)
- *
- * @param r r.result contains the connection that just ended
- */
- private void onDisconnect(AsyncResult r) {
- Connection c = (Connection) r.result;
- Connection.DisconnectCause cause = c.getDisconnectCause();
- if (DBG) log("onDisconnect: " + c + ", cause=" + cause);
-
- boolean currentlyIdle = !phoneIsInUse();
- int autoretrySetting = AUTO_RETRY_OFF;
- boolean phoneIsCdma = (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA);
- if (phoneIsCdma) {
- // Get the Auto-retry setting only if Phone State is IDLE,
- // else let it stay as AUTO_RETRY_OFF
- if (currentlyIdle) {
- autoretrySetting = android.provider.Settings.System.getInt(mPhone.getContext().
- getContentResolver(), android.provider.Settings.System.CALL_AUTO_RETRY, 0);
- }
- }
-
- // for OTA Call, only if in OTA NORMAL mode, handle OTA END scenario
- final PhoneApp app = PhoneApp.getInstance();
- if ((mInCallScreenMode == InCallScreenMode.OTA_NORMAL)
- && ((app.cdmaOtaProvisionData != null)
- && (!app.cdmaOtaProvisionData.inOtaSpcState))) {
- setInCallScreenMode(InCallScreenMode.OTA_ENDED);
- updateScreen();
- return;
- } else if ((mInCallScreenMode == InCallScreenMode.OTA_ENDED)
- || ((app.cdmaOtaProvisionData != null) && app.cdmaOtaProvisionData.inOtaSpcState)) {
- if (DBG) log("onDisconnect: OTA Call end already handled");
- return;
- }
-
- // Any time a call disconnects, clear out the "history" of DTMF
- // digits you typed (to make sure it doesn't persist from one call
- // to the next.)
- mDialer.clearDigits();
-
- // Under certain call disconnected states, we want to alert the user
- // with a dialog instead of going through the normal disconnect
- // routine.
- if (cause == Connection.DisconnectCause.CALL_BARRED) {
- showGenericErrorDialog(R.string.callFailed_cb_enabled, false);
- return;
- } else if (cause == Connection.DisconnectCause.FDN_BLOCKED) {
- showGenericErrorDialog(R.string.callFailed_fdn_only, false);
- return;
- } else if (cause == Connection.DisconnectCause.CS_RESTRICTED) {
- showGenericErrorDialog(R.string.callFailed_dsac_restricted, false);
- return;
- } else if (cause == Connection.DisconnectCause.CS_RESTRICTED_EMERGENCY) {
- showGenericErrorDialog(R.string.callFailed_dsac_restricted_emergency, false);
- return;
- } else if (cause == Connection.DisconnectCause.CS_RESTRICTED_NORMAL) {
- showGenericErrorDialog(R.string.callFailed_dsac_restricted_normal, false);
- return;
- }
-
- if (phoneIsCdma) {
- Call.State callState = PhoneApp.getInstance().notifier.getPreviousCdmaCallState();
- if ((callState == Call.State.ACTIVE)
- && (cause != Connection.DisconnectCause.INCOMING_MISSED)
- && (cause != Connection.DisconnectCause.NORMAL)
- && (cause != Connection.DisconnectCause.LOCAL)
- && (cause != Connection.DisconnectCause.INCOMING_REJECTED)) {
- showCallLostDialog();
- } else if ((callState == Call.State.DIALING || callState == Call.State.ALERTING)
- && (cause != Connection.DisconnectCause.INCOMING_MISSED)
- && (cause != Connection.DisconnectCause.NORMAL)
- && (cause != Connection.DisconnectCause.LOCAL)
- && (cause != Connection.DisconnectCause.INCOMING_REJECTED)) {
-
- if (mNeedShowCallLostDialog) {
- // Show the dialog now since the call that just failed was a retry.
- showCallLostDialog();
- mNeedShowCallLostDialog = false;
- } else {
- if (autoretrySetting == AUTO_RETRY_OFF) {
- // Show the dialog for failed call if Auto Retry is OFF in Settings.
- showCallLostDialog();
- mNeedShowCallLostDialog = false;
- } else {
- // Set the mNeedShowCallLostDialog flag now, so we'll know to show
- // the dialog if *this* call fails.
- mNeedShowCallLostDialog = true;
- }
- }
- }
- }
-
- // Explicitly clean up up any DISCONNECTED connections
- // in a conference call.
- // [Background: Even after a connection gets disconnected, its
- // Connection object still stays around for a few seconds, in the
- // DISCONNECTED state. With regular calls, this state drives the
- // "call ended" UI. But when a single person disconnects from a
- // conference call there's no "call ended" state at all; in that
- // case we blow away any DISCONNECTED connections right now to make sure
- // the UI updates instantly to reflect the current state.]
- Call call = c.getCall();
- if (call != null) {
- // We only care about situation of a single caller
- // disconnecting from a conference call. In that case, the
- // call will have more than one Connection (including the one
- // that just disconnected, which will be in the DISCONNECTED
- // state) *and* at least one ACTIVE connection. (If the Call
- // has *no* ACTIVE connections, that means that the entire
- // conference call just ended, so we *do* want to show the
- // "Call ended" state.)
- List<Connection> connections = call.getConnections();
- if (connections != null && connections.size() > 1) {
- for (Connection conn : connections) {
- if (conn.getState() == Call.State.ACTIVE) {
- // This call still has at least one ACTIVE connection!
- // So blow away any DISCONNECTED connections
- // (including, presumably, the one that just
- // disconnected from this conference call.)
-
- // We also force the wake state to refresh, just in
- // case the disconnected connections are removed
- // before the phone state change.
- if (VDBG) log("- Still-active conf call; clearing DISCONNECTED...");
- app.updateWakeState();
- mPhone.clearDisconnected(); // This happens synchronously.
- break;
- }
- }
- }
- }
-
- // Retrieve the emergency call retry count from this intent, in
- // case we need to retry the call again.
- int emergencyCallRetryCount = getIntent().getIntExtra(
- EmergencyCallHandler.EMERGENCY_CALL_RETRY_KEY,
- EmergencyCallHandler.INITIAL_ATTEMPT);
-
- // Note: see CallNotifier.onDisconnect() for some other behavior
- // that might be triggered by a disconnect event, like playing the
- // busy/congestion tone.
-
- // Keep track of whether this call was user-initiated or not.
- // (This affects where we take the user next; see delayedCleanupAfterDisconnect().)
- mShowCallLogAfterDisconnect = !c.isIncoming();
-
- // We bail out immediately (and *don't* display the "call ended"
- // state at all) in a couple of cases, including those where we
- // are waiting for the radio to finish powering up for an
- // emergency call:
- boolean bailOutImmediately =
- ((cause == Connection.DisconnectCause.INCOMING_MISSED)
- || (cause == Connection.DisconnectCause.INCOMING_REJECTED)
- || ((cause == Connection.DisconnectCause.OUT_OF_SERVICE)
- && (emergencyCallRetryCount > 0)))
- && currentlyIdle;
-
- if (bailOutImmediately) {
- if (VDBG) log("- onDisconnect: bailOutImmediately...");
- // Exit the in-call UI!
- // (This is basically the same "delayed cleanup" we do below,
- // just with zero delay. Since the Phone is currently idle,
- // this call is guaranteed to immediately finish this activity.)
- delayedCleanupAfterDisconnect();
-
- // Retry the call, by resending the intent to the emergency
- // call handler activity.
- if ((cause == Connection.DisconnectCause.OUT_OF_SERVICE)
- && (emergencyCallRetryCount > 0)) {
- startActivity(getIntent()
- .setClassName(this, EmergencyCallHandler.class.getName()));
- }
- } else {
- if (VDBG) log("- onDisconnect: delayed bailout...");
- // Stay on the in-call screen for now. (Either the phone is
- // still in use, or the phone is idle but we want to display
- // the "call ended" state for a couple of seconds.)
-
- // Force a UI update in case we need to display anything
- // special given this connection's DisconnectCause (see
- // CallCard.getCallFailedString()).
- updateScreen();
-
- // Display the special "Call ended" state when the phone is idle
- // but there's still a call in the DISCONNECTED state:
- if (currentlyIdle
- && ((mForegroundCall.getState() == Call.State.DISCONNECTED)
- || (mBackgroundCall.getState() == Call.State.DISCONNECTED))) {
- if (VDBG) log("- onDisconnect: switching to 'Call ended' state...");
- setInCallScreenMode(InCallScreenMode.CALL_ENDED);
- }
-
- // Some other misc cleanup that we do if the call that just
- // disconnected was the foreground call.
- final boolean hasActiveCall = !mForegroundCall.isIdle();
- if (!hasActiveCall) {
- if (VDBG) log("- onDisconnect: cleaning up after FG call disconnect...");
-
- // Dismiss any dialogs which are only meaningful for an
- // active call *and* which become moot if the call ends.
- if (mWaitPromptDialog != null) {
- if (VDBG) log("- DISMISSING mWaitPromptDialog.");
- mWaitPromptDialog.dismiss(); // safe even if already dismissed
- mWaitPromptDialog = null;
- }
- if (mWildPromptDialog != null) {
- if (VDBG) log("- DISMISSING mWildPromptDialog.");
- mWildPromptDialog.dismiss(); // safe even if already dismissed
- mWildPromptDialog = null;
- }
- if (mPausePromptDialog != null) {
- if (DBG) log("- DISMISSING mPausePromptDialog.");
- mPausePromptDialog.dismiss(); // safe even if already dismissed
- mPausePromptDialog = null;
- }
- }
-
- // Updating the screen wake state is done in onPhoneStateChanged().
-
-
- // CDMA: We only clean up if the Phone state is IDLE as we might receive an
- // onDisconnect for a Call Collision case (rare but possible).
- // For Call collision cases i.e. when the user makes an out going call
- // and at the same time receives an Incoming Call, the Incoming Call is given
- // higher preference. At this time framework sends a disconnect for the Out going
- // call connection hence we should *not* bring down the InCallScreen as the Phone
- // State would be RINGING
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- if (!currentlyIdle) {
- // Clean up any connections in the DISCONNECTED state.
- // This is necessary cause in CallCollision the foreground call might have
- // connections in DISCONNECTED state which needs to be cleared.
- mPhone.clearDisconnected();
-
- // The phone is still in use. Stay here in this activity.
- // But we don't need to keep the screen on.
- if (DBG) log("onDisconnect: Call Collision case - staying on InCallScreen.");
- if (DBG) PhoneUtils.dumpCallState(mPhone);
- return;
- }
- }
-
- // Finally, arrange for delayedCleanupAfterDisconnect() to get
- // called after a short interval (during which we display the
- // "call ended" state.) At that point, if the
- // Phone is idle, we'll finish out of this activity.
- int callEndedDisplayDelay =
- (cause == Connection.DisconnectCause.LOCAL)
- ? CALL_ENDED_SHORT_DELAY : CALL_ENDED_LONG_DELAY;
- mHandler.removeMessages(DELAYED_CLEANUP_AFTER_DISCONNECT);
- mHandler.sendEmptyMessageDelayed(DELAYED_CLEANUP_AFTER_DISCONNECT,
- callEndedDisplayDelay);
- }
-
- // Remove 3way timer (only meaningful for CDMA)
- mHandler.removeMessages(THREEWAY_CALLERINFO_DISPLAY_DONE);
- }
-
- /**
- * Brings up the "MMI Started" dialog.
- */
- private void onMMIInitiate(AsyncResult r) {
- if (VDBG) log("onMMIInitiate()... AsyncResult r = " + r);
-
- // Watch out: don't do this if we're not the foreground activity,
- // mainly since in the Dialog.show() might fail if we don't have a
- // valid window token any more...
- // (Note that this exact sequence can happen if you try to start
- // an MMI code while the radio is off or out of service.)
- if (!mIsForegroundActivity) {
- if (VDBG) log("Activity not in foreground! Bailing out...");
- return;
- }
-
- // Also, if any other dialog is up right now (presumably the
- // generic error dialog displaying the "Starting MMI..." message)
- // take it down before bringing up the real "MMI Started" dialog
- // in its place.
- dismissAllDialogs();
-
- MmiCode mmiCode = (MmiCode) r.result;
- if (VDBG) log(" - MmiCode: " + mmiCode);
-
- Message message = Message.obtain(mHandler, PhoneApp.MMI_CANCEL);
- mMmiStartedDialog = PhoneUtils.displayMMIInitiate(this, mmiCode,
- message, mMmiStartedDialog);
- }
-
- /**
- * Handles an MMI_CANCEL event, which is triggered by the button
- * (labeled either "OK" or "Cancel") on the "MMI Started" dialog.
- * @see onMMIInitiate
- * @see PhoneUtils.cancelMmiCode
- */
- private void onMMICancel() {
- if (VDBG) log("onMMICancel()...");
-
- // First of all, cancel the outstanding MMI code (if possible.)
- PhoneUtils.cancelMmiCode(mPhone);
-
- // Regardless of whether the current MMI code was cancelable, the
- // PhoneApp will get an MMI_COMPLETE event very soon, which will
- // take us to the MMI Complete dialog (see
- // PhoneUtils.displayMMIComplete().)
- //
- // But until that event comes in, we *don't* want to stay here on
- // the in-call screen, since we'll be visible in a
- // partially-constructed state as soon as the "MMI Started" dialog
- // gets dismissed. So let's forcibly bail out right now.
- if (DBG) log("onMMICancel: finishing InCallScreen...");
- endInCallScreenSession();
- }
-
- /**
- * Handles the POST_ON_DIAL_CHARS message from the Phone
- * (see our call to mPhone.setOnPostDialCharacter() above.)
- *
- * TODO: NEED TO TEST THIS SEQUENCE now that we no longer handle
- * "dialable" key events here in the InCallScreen: we do directly to the
- * Dialer UI instead. Similarly, we may now need to go directly to the
- * Dialer to handle POST_ON_DIAL_CHARS too.
- */
- private void handlePostOnDialChars(AsyncResult r, char ch) {
- Connection c = (Connection) r.result;
-
- if (c != null) {
- Connection.PostDialState state =
- (Connection.PostDialState) r.userObj;
-
- if (VDBG) log("handlePostOnDialChar: state = " +
- state + ", ch = " + ch);
-
- int phoneType = mPhone.getPhoneType();
- switch (state) {
- case STARTED:
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- mDialer.stopLocalToneCdma();
- if (mPauseInProgress) {
- showPausePromptDialogCDMA(c, mPostDialStrAfterPause);
- }
- mPauseInProgress = false;
- mDialer.startLocalToneCdma(ch);
- }
- // TODO: is this needed, now that you can't actually
- // type DTMF chars or dial directly from here?
- // If so, we'd need to yank you out of the in-call screen
- // here too (and take you to the 12-key dialer in "in-call" mode.)
- // displayPostDialedChar(ch);
- break;
-
- case WAIT:
- if (DBG) log("handlePostOnDialChars: show WAIT prompt...");
- String postDialStr = c.getRemainingPostDialString();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- mDialer.stopLocalToneCdma();
- showWaitPromptDialogCDMA(c, postDialStr);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- showWaitPromptDialogGSM(c, postDialStr);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- break;
-
- case WILD:
- if (DBG) log("handlePostOnDialChars: show WILD prompt");
- showWildPromptDialog(c);
- break;
-
- case COMPLETE:
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- mDialer.stopLocalToneCdma();
- }
- break;
-
- case PAUSE:
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- mPostDialStrAfterPause = c.getRemainingPostDialString();
- mDialer.stopLocalToneCdma();
- mPauseInProgress = true;
- }
- break;
-
- default:
- break;
- }
- }
- }
-
- private void showWaitPromptDialogGSM(final Connection c, String postDialStr) {
- if (DBG) log("showWaitPromptDialogGSM: '" + postDialStr + "'...");
-
- Resources r = getResources();
- StringBuilder buf = new StringBuilder();
- buf.append(r.getText(R.string.wait_prompt_str));
- buf.append(postDialStr);
-
- // if (DBG) log("- mWaitPromptDialog = " + mWaitPromptDialog);
- if (mWaitPromptDialog != null) {
- if (DBG) log("- DISMISSING mWaitPromptDialog.");
- mWaitPromptDialog.dismiss(); // safe even if already dismissed
- mWaitPromptDialog = null;
- }
-
- mWaitPromptDialog = new AlertDialog.Builder(this)
- .setMessage(buf.toString())
- .setPositiveButton(R.string.send_button, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- if (DBG) log("handle WAIT_PROMPT_CONFIRMED, proceed...");
- c.proceedAfterWaitChar();
- PhoneApp.getInstance().pokeUserActivity();
- }
- })
- .setOnCancelListener(new DialogInterface.OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- if (DBG) log("handle POST_DIAL_CANCELED!");
- c.cancelPostDial();
- PhoneApp.getInstance().pokeUserActivity();
- }
- })
- .create();
- mWaitPromptDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
- mWaitPromptDialog.show();
- }
-
- /**
- * Processes the CDMA specific requirements of a WAIT character in a
- * dial string.
- *
- * 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.
- */
- private void showWaitPromptDialogCDMA(final Connection c, String postDialStr) {
- if (DBG) log("showWaitPromptDialogCDMA: '" + postDialStr + "'...");
-
- Resources r = getResources();
- StringBuilder buf = new StringBuilder();
- buf.append(r.getText(R.string.wait_prompt_str));
- buf.append(postDialStr);
-
- // if (DBG) log("- mWaitPromptDialog = " + mWaitPromptDialog);
- if (mWaitPromptDialog != null) {
- if (DBG) log("- DISMISSING mWaitPromptDialog.");
- mWaitPromptDialog.dismiss(); // safe even if already dismissed
- mWaitPromptDialog = null;
- }
-
- mWaitPromptDialog = new AlertDialog.Builder(this)
- .setMessage(buf.toString())
- .setPositiveButton(R.string.pause_prompt_yes,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- if (DBG) log("handle WAIT_PROMPT_CONFIRMED, proceed...");
- c.proceedAfterWaitChar();
- }
- })
- .setNegativeButton(R.string.pause_prompt_no, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- if (DBG) log("handle POST_DIAL_CANCELED!");
- c.cancelPostDial();
- }
- })
- .create();
- mWaitPromptDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
- mWaitPromptDialog.show();
- }
-
- /**
- * Pop up an alert dialog which waits for 2 seconds for each P (Pause) Character entered
- * as part of the Dial String.
- */
- private void showPausePromptDialogCDMA(final Connection c, String postDialStrAfterPause) {
- Resources r = getResources();
- StringBuilder buf = new StringBuilder();
- buf.append(r.getText(R.string.pause_prompt_str));
- buf.append(postDialStrAfterPause);
-
- if (mPausePromptDialog != null) {
- if (DBG) log("- DISMISSING mPausePromptDialog.");
- mPausePromptDialog.dismiss(); // safe even if already dismissed
- mPausePromptDialog = null;
- }
-
- mPausePromptDialog = new AlertDialog.Builder(this)
- .setMessage(buf.toString())
- .create();
- mPausePromptDialog.show();
- // 2 second timer
- Message msg = Message.obtain(mHandler, EVENT_PAUSE_DIALOG_COMPLETE);
- mHandler.sendMessageDelayed(msg, PAUSE_PROMPT_DIALOG_TIMEOUT);
- }
-
- private View createWildPromptView() {
- LinearLayout result = new LinearLayout(this);
- result.setOrientation(LinearLayout.VERTICAL);
- result.setPadding(5, 5, 5, 5);
-
- LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
-
- TextView promptMsg = new TextView(this);
- promptMsg.setTextSize(14);
- promptMsg.setTypeface(Typeface.DEFAULT_BOLD);
- promptMsg.setText(getResources().getText(R.string.wild_prompt_str));
-
- result.addView(promptMsg, lp);
-
- mWildPromptText = new EditText(this);
- mWildPromptText.setKeyListener(DialerKeyListener.getInstance());
- mWildPromptText.setMovementMethod(null);
- mWildPromptText.setTextSize(14);
- mWildPromptText.setMaxLines(1);
- mWildPromptText.setHorizontallyScrolling(true);
- mWildPromptText.setBackgroundResource(android.R.drawable.editbox_background);
-
- LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
- lp2.setMargins(0, 3, 0, 0);
-
- result.addView(mWildPromptText, lp2);
-
- return result;
- }
-
- private void showWildPromptDialog(final Connection c) {
- View v = createWildPromptView();
-
- if (mWildPromptDialog != null) {
- if (VDBG) log("- DISMISSING mWildPromptDialog.");
- mWildPromptDialog.dismiss(); // safe even if already dismissed
- mWildPromptDialog = null;
- }
-
- mWildPromptDialog = new AlertDialog.Builder(this)
- .setView(v)
- .setPositiveButton(
- R.string.send_button,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- if (VDBG) log("handle WILD_PROMPT_CHAR_ENTERED, proceed...");
- String replacement = null;
- if (mWildPromptText != null) {
- replacement = mWildPromptText.getText().toString();
- mWildPromptText = null;
- }
- c.proceedAfterWildChar(replacement);
- PhoneApp.getInstance().pokeUserActivity();
- }
- })
- .setOnCancelListener(
- new DialogInterface.OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- if (VDBG) log("handle POST_DIAL_CANCELED!");
- c.cancelPostDial();
- PhoneApp.getInstance().pokeUserActivity();
- }
- })
- .create();
- mWildPromptDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
- mWildPromptDialog.show();
-
- mWildPromptText.requestFocus();
- }
-
- /**
- * Updates the state of the in-call UI based on the current state of
- * the Phone.
- */
- private void updateScreen() {
- if (DBG) log("updateScreen()...");
-
- // Don't update anything if we're not in the foreground (there's
- // no point updating our UI widgets since we're not visible!)
- // Also note this check also ensures we won't update while we're
- // in the middle of pausing, which could cause a visible glitch in
- // the "activity ending" transition.
- if (!mIsForegroundActivity) {
- if (DBG) log("- updateScreen: not the foreground Activity! Bailing out...");
- return;
- }
-
- // Update the state of the in-call menu items.
- if (mInCallMenu != null) {
- // TODO: do this only if the menu is visible!
- if (DBG) log("- updateScreen: updating menu items...");
- boolean okToShowMenu = mInCallMenu.updateItems(mPhone);
- if (!okToShowMenu) {
- // Uh oh: we were only trying to update the state of the
- // menu items, but the logic in InCallMenu.updateItems()
- // just decided the menu shouldn't be visible at all!
- // (That's probably means that the call ended
- // asynchronously while the menu was up.)
- //
- // So take the menu down ASAP.
- if (DBG) log("- updateScreen: Tried to update menu; now need to dismiss!");
- // dismissMenu() has no effect if the menu is already closed.
- dismissMenu(true); // dismissImmediate = true
- }
- }
-
- final PhoneApp app = PhoneApp.getInstance();
-
- if (mInCallScreenMode == InCallScreenMode.OTA_NORMAL) {
- if (DBG) log("- updateScreen: OTA call state NORMAL...");
- if (otaUtils != null) {
- if (DBG) log("- updateScreen: otaUtils is not null, call otaShowProperScreen");
- otaUtils.otaShowProperScreen();
- }
- return;
- } else if (mInCallScreenMode == InCallScreenMode.OTA_ENDED) {
- if (DBG) log("- updateScreen: OTA call ended state ...");
- // Wake up the screen when we get notification, good or bad.
- PhoneApp.getInstance().wakeUpScreen();
- if (app.cdmaOtaScreenState.otaScreenState
- == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION) {
- if (DBG) log("- updateScreen: OTA_STATUS_ACTIVATION");
- if (otaUtils != null) {
- if (DBG) log("- updateScreen: otaUtils is not null, "
- + "call otaShowActivationScreen");
- otaUtils.otaShowActivateScreen();
- }
- } else {
- if (DBG) log("- updateScreen: OTA Call end state for Dialogs");
- if (otaUtils != null) {
- if (DBG) log("- updateScreen: Show OTA Success Failure dialog");
- otaUtils.otaShowSuccessFailure();
- }
- }
- return;
- } else if (mInCallScreenMode == InCallScreenMode.MANAGE_CONFERENCE) {
- if (DBG) log("- updateScreen: manage conference mode (NOT updating in-call UI)...");
- updateManageConferencePanelIfNecessary();
- return;
- } else if (mInCallScreenMode == InCallScreenMode.CALL_ENDED) {
- if (DBG) log("- updateScreen: call ended state (NOT updating in-call UI)...");
- // Actually we do need to update one thing: the background.
- updateInCallBackground();
- return;
- }
-
- if (DBG) log("- updateScreen: updating the in-call UI...");
- mCallCard.updateState(mPhone);
- updateDialpadVisibility();
- updateInCallTouchUi();
- updateProviderOverlay();
- updateMenuButtonHint();
- updateInCallBackground();
-
- // Forcibly take down all dialog if an incoming call is ringing.
- if (!mRingingCall.isIdle()) {
- dismissAllDialogs();
- } else {
- // Wait prompt dialog is not currently up. But it *should* be
- // up if the FG call has a connection in the WAIT state and
- // the phone isn't ringing.
- String postDialStr = null;
- List<Connection> fgConnections = mForegroundCall.getConnections();
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- Connection fgLatestConnection = mForegroundCall.getLatestConnection();
- if (PhoneApp.getInstance().cdmaPhoneCallState.getCurrentCallState() ==
- CdmaPhoneCallState.PhoneCallState.CONF_CALL) {
- for (Connection cn : fgConnections) {
- if ((cn != null) && (cn.getPostDialState() ==
- Connection.PostDialState.WAIT)) {
- cn.cancelPostDial();
- }
- }
- } else if ((fgLatestConnection != null)
- && (fgLatestConnection.getPostDialState() == Connection.PostDialState.WAIT)) {
- if(DBG) log("show the Wait dialog for CDMA");
- postDialStr = fgLatestConnection.getRemainingPostDialString();
- showWaitPromptDialogCDMA(fgLatestConnection, postDialStr);
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- for (Connection cn : fgConnections) {
- if ((cn != null) && (cn.getPostDialState() == Connection.PostDialState.WAIT)) {
- postDialStr = cn.getRemainingPostDialString();
- showWaitPromptDialogGSM(cn, postDialStr);
- }
- }
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
- }
-
- /**
- * (Re)synchronizes the onscreen UI with the current state of the
- * Phone.
- *
- * @return InCallInitStatus.SUCCESS if we successfully updated the UI, or
- * InCallInitStatus.PHONE_NOT_IN_USE if there was no phone state to sync
- * with (ie. the phone was completely idle). In the latter case, we
- * shouldn't even be in the in-call UI in the first place, and it's
- * the caller's responsibility to bail out of this activity by
- * calling endInCallScreenSession if appropriate.
- */
- private InCallInitStatus syncWithPhoneState() {
- boolean updateSuccessful = false;
- if (DBG) log("syncWithPhoneState()...");
- if (DBG) PhoneUtils.dumpCallState(mPhone);
- if (VDBG) dumpBluetoothState();
-
- // Make sure the Phone is "in use". (If not, we shouldn't be on
- // this screen in the first place.)
-
- // Need to treat running MMI codes as a connection as well.
- // Do not check for getPendingMmiCodes when phone is a CDMA phone
- int phoneType = mPhone.getPhoneType();
-
- if ((phoneType == Phone.PHONE_TYPE_CDMA)
- && ((mInCallScreenMode == InCallScreenMode.OTA_NORMAL)
- || (mInCallScreenMode == InCallScreenMode.OTA_ENDED))) {
- // Even when OTA Call ends, need to show OTA End UI,
- // so return Success to allow UI update.
- return InCallInitStatus.SUCCESS;
- }
-
- if ((phoneType == Phone.PHONE_TYPE_CDMA)
- || !mForegroundCall.isIdle() || !mBackgroundCall.isIdle() || !mRingingCall.isIdle()
- || !mPhone.getPendingMmiCodes().isEmpty()) {
- if (VDBG) log("syncWithPhoneState: it's ok to be here; update the screen...");
- updateScreen();
- return InCallInitStatus.SUCCESS;
- }
-
- if (DBG) log("syncWithPhoneState: phone is idle; we shouldn't be here!");
- return InCallInitStatus.PHONE_NOT_IN_USE;
- }
-
- /**
- * Given the Intent we were initially launched with,
- * figure out the actual phone number we should dial.
- *
- * @return the phone number corresponding to the
- * specified Intent, or null if the Intent is not
- * an ACTION_CALL intent or if the intent's data is
- * malformed or missing.
- *
- * @throws VoiceMailNumberMissingException if the intent
- * contains a "voicemail" URI, but there's no voicemail
- * number configured on the device.
- */
- private String getInitialNumber(Intent intent)
- throws PhoneUtils.VoiceMailNumberMissingException {
- String action = intent.getAction();
-
- if (action == null) {
- return null;
- }
-
- if (action != null && action.equals(Intent.ACTION_CALL) &&
- intent.hasExtra(Intent.EXTRA_PHONE_NUMBER)) {
- return intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
- }
-
- return PhoneUtils.getNumberFromIntent(this, mPhone, intent);
- }
-
- /**
- * Make a call to whomever the intent tells us to.
- *
- * @param intent the Intent we were launched with
- * @return InCallInitStatus.SUCCESS if we successfully initiated an
- * outgoing call. If there was some kind of failure, return one of
- * the other InCallInitStatus codes indicating what went wrong.
- */
- private InCallInitStatus placeCall(Intent intent) {
- if (VDBG) log("placeCall()... intent = " + intent);
-
- String number;
-
- // Check the current ServiceState to make sure it's OK
- // to even try making a call.
- InCallInitStatus okToCallStatus = checkIfOkToInitiateOutgoingCall();
-
- try {
- number = getInitialNumber(intent);
- } catch (PhoneUtils.VoiceMailNumberMissingException ex) {
- // If the call status is NOT in an acceptable state, it
- // may effect the way the voicemail number is being
- // retrieved. Mask the VoiceMailNumberMissingException
- // with the underlying issue of the phone state.
- if (okToCallStatus != InCallInitStatus.SUCCESS) {
- if (DBG) log("Voicemail number not reachable in current SIM card state.");
- return okToCallStatus;
- }
- if (DBG) log("VoiceMailNumberMissingException from getInitialNumber()");
- return InCallInitStatus.VOICEMAIL_NUMBER_MISSING;
- }
-
- if (number == null) {
- Log.w(LOG_TAG, "placeCall: couldn't get a phone number from Intent " + intent);
- return InCallInitStatus.NO_PHONE_NUMBER_SUPPLIED;
- }
-
- boolean isEmergencyNumber = PhoneNumberUtils.isEmergencyNumber(number);
- boolean isEmergencyIntent = Intent.ACTION_CALL_EMERGENCY.equals(intent.getAction());
-
- if (isEmergencyNumber && !isEmergencyIntent) {
- Log.e(LOG_TAG, "Non-CALL_EMERGENCY Intent " + intent
- + " attempted to call emergency number " + number
- + ".");
- return InCallInitStatus.CALL_FAILED;
- } else if (!isEmergencyNumber && isEmergencyIntent) {
- Log.e(LOG_TAG, "Received CALL_EMERGENCY Intent " + intent
- + " with non-emergency number " + number
- + " -- failing call.");
- return InCallInitStatus.CALL_FAILED;
- }
-
- // If we're trying to call an emergency number, then it's OK to
- // proceed in certain states where we'd usually just bring up
- // an error dialog:
- // - If we're in EMERGENCY_ONLY mode, then (obviously) you're allowed
- // to dial emergency numbers.
- // - If we're OUT_OF_SERVICE, we still attempt to make a call,
- // since the radio will register to any available network.
-
- if (isEmergencyNumber
- && ((okToCallStatus == InCallInitStatus.EMERGENCY_ONLY)
- || (okToCallStatus == InCallInitStatus.OUT_OF_SERVICE))) {
- if (DBG) log("placeCall: Emergency number detected with status = " + okToCallStatus);
- okToCallStatus = InCallInitStatus.SUCCESS;
- if (DBG) log("==> UPDATING status to: " + okToCallStatus);
- }
-
- if (okToCallStatus != InCallInitStatus.SUCCESS) {
- // If this is an emergency call, we call the emergency call
- // handler activity to turn on the radio and do whatever else
- // is needed. For now, we finish the InCallScreen (since were
- // expecting a callback when the emergency call handler dictates
- // it) and just return the success state.
- if (isEmergencyNumber && (okToCallStatus == InCallInitStatus.POWER_OFF)) {
- startActivity(intent.setClassName(this, EmergencyCallHandler.class.getName()));
- if (DBG) log("placeCall: starting EmergencyCallHandler, finishing InCallScreen...");
- endInCallScreenSession();
- return InCallInitStatus.SUCCESS;
- } else {
- return okToCallStatus;
- }
- }
-
- final PhoneApp app = PhoneApp.getInstance();
-
- if ((mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) && (mPhone.isOtaSpNumber(number))) {
- if (DBG) log("placeCall: isOtaSpNumber() returns true");
- setInCallScreenMode(InCallScreenMode.OTA_NORMAL);
- if (app.cdmaOtaProvisionData != null) {
- app.cdmaOtaProvisionData.isOtaCallCommitted = false;
- }
- }
-
- mNeedShowCallLostDialog = false;
-
- // We have a valid number, so try to actually place a call:
- // make sure we pass along the intent's URI which is a
- // reference to the contact. We may have a provider gateway
- // phone number to use for the outgoing call.
- int callStatus;
- Uri contactUri = intent.getData();
-
- if (null != mProviderGatewayUri &&
- !(isEmergencyNumber || isEmergencyIntent) &&
- PhoneUtils.isRoutableViaGateway(number)) { // Filter out MMI, OTA and other codes.
-
- callStatus = PhoneUtils.placeCallVia(
- this, mPhone, number, contactUri, mProviderGatewayUri);
- } else {
- callStatus = PhoneUtils.placeCall(mPhone, number, contactUri);
- }
-
- switch (callStatus) {
- case PhoneUtils.CALL_STATUS_DIALED:
- if (VDBG) log("placeCall: PhoneUtils.placeCall() succeeded for regular call '"
- + number + "'.");
-
- if (mInCallScreenMode == InCallScreenMode.OTA_NORMAL) {
- app.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING;
- updateScreen();
- }
-
- // Any time we initiate a call, force the DTMF dialpad to
- // close. (We want to make sure the user can see the regular
- // in-call UI while the new call is dialing, and when it
- // first gets connected.)
- mDialer.closeDialer(false); // no "closing" animation
-
- // Also, in case a previous call was already active (i.e. if
- // we just did "Add call"), clear out the "history" of DTMF
- // digits you typed, to make sure it doesn't persist from the
- // previous call to the new call.
- // TODO: it would be more precise to do this when the actual
- // phone state change happens (i.e. when a new foreground
- // call appears and the previous call moves to the
- // background), but the InCallScreen doesn't keep enough
- // state right now to notice that specific transition in
- // onPhoneStateChanged().
- mDialer.clearDigits();
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- // Start the 2 second timer for 3 Way CallerInfo
- if (app.cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
- //Unmute for the second MO call
- PhoneUtils.setMuteInternal(mPhone, false);
-
- //Start the timer for displaying "Dialing" for second call
- Message msg = Message.obtain(mHandler, THREEWAY_CALLERINFO_DISPLAY_DONE);
- mHandler.sendMessageDelayed(msg, THREEWAY_CALLERINFO_DISPLAY_TIME);
-
- // Set the mThreeWayCallOrigStateDialing state to true
- app.cdmaPhoneCallState.setThreeWayCallOrigState(true);
-
- //Update screen to show 3way dialing
- updateScreen();
- }
- }
-
- return InCallInitStatus.SUCCESS;
- case PhoneUtils.CALL_STATUS_DIALED_MMI:
- if (DBG) log("placeCall: specified number was an MMI code: '" + number + "'.");
- // The passed-in number was an MMI code, not a regular phone number!
- // This isn't really a failure; the Dialer may have deliberately
- // fired an ACTION_CALL intent to dial an MMI code, like for a
- // USSD call.
- //
- // Presumably an MMI_INITIATE message will come in shortly
- // (and we'll bring up the "MMI Started" dialog), or else
- // an MMI_COMPLETE will come in (which will take us to a
- // different Activity; see PhoneUtils.displayMMIComplete()).
- return InCallInitStatus.DIALED_MMI;
- case PhoneUtils.CALL_STATUS_FAILED:
- Log.w(LOG_TAG, "placeCall: PhoneUtils.placeCall() FAILED for number '"
- + number + "'.");
- // We couldn't successfully place the call; there was some
- // failure in the telephony layer.
- return InCallInitStatus.CALL_FAILED;
- default:
- Log.w(LOG_TAG, "placeCall: unknown callStatus " + callStatus
- + " from PhoneUtils.placeCall() for number '" + number + "'.");
- return InCallInitStatus.SUCCESS; // Try to continue anyway...
- }
- }
-
- /**
- * Checks the current ServiceState to make sure it's OK
- * to try making an outgoing call to the specified number.
- *
- * @return InCallInitStatus.SUCCESS if it's OK to try calling the specified
- * number. If not, like if the radio is powered off or we have no
- * signal, return one of the other InCallInitStatus codes indicating what
- * the problem is.
- */
- private InCallInitStatus checkIfOkToInitiateOutgoingCall() {
- // Watch out: do NOT use PhoneStateIntentReceiver.getServiceState() here;
- // that's not guaranteed to be fresh. To synchronously get the
- // CURRENT service state, ask the Phone object directly:
- int state = mPhone.getServiceState().getState();
- if (VDBG) log("checkIfOkToInitiateOutgoingCall: ServiceState = " + state);
-
- switch (state) {
- case ServiceState.STATE_IN_SERVICE:
- // Normal operation. It's OK to make outgoing calls.
- return InCallInitStatus.SUCCESS;
-
- case ServiceState.STATE_POWER_OFF:
- // Radio is explictly powered off.
- return InCallInitStatus.POWER_OFF;
-
- case ServiceState.STATE_EMERGENCY_ONLY:
- // The phone is registered, but locked. Only emergency
- // numbers are allowed.
- // Note that as of Android 2.0 at least, the telephony layer
- // does not actually use ServiceState.STATE_EMERGENCY_ONLY,
- // mainly since there's no guarantee that the radio/RIL can
- // make this distinction. So in practice the
- // InCallInitStatus.EMERGENCY_ONLY state and the string
- // "incall_error_emergency_only" are totally unused.
- return InCallInitStatus.EMERGENCY_ONLY;
-
- case ServiceState.STATE_OUT_OF_SERVICE:
- // No network connection.
- return InCallInitStatus.OUT_OF_SERVICE;
-
- default:
- throw new IllegalStateException("Unexpected ServiceState: " + state);
- }
- }
-
- private void handleMissingVoiceMailNumber() {
- if (DBG) log("handleMissingVoiceMailNumber");
-
- final Message msg = Message.obtain(mHandler);
- msg.what = DONT_ADD_VOICEMAIL_NUMBER;
-
- final Message msg2 = Message.obtain(mHandler);
- msg2.what = ADD_VOICEMAIL_NUMBER;
-
- mMissingVoicemailDialog = new AlertDialog.Builder(this)
- .setTitle(R.string.no_vm_number)
- .setMessage(R.string.no_vm_number_msg)
- .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- if (VDBG) log("Missing voicemail AlertDialog: POSITIVE click...");
- msg.sendToTarget(); // see dontAddVoiceMailNumber()
- PhoneApp.getInstance().pokeUserActivity();
- }})
- .setNegativeButton(R.string.add_vm_number_str,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- if (VDBG) log("Missing voicemail AlertDialog: NEGATIVE click...");
- msg2.sendToTarget(); // see addVoiceMailNumber()
- PhoneApp.getInstance().pokeUserActivity();
- }})
- .setOnCancelListener(new OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- if (VDBG) log("Missing voicemail AlertDialog: CANCEL handler...");
- msg.sendToTarget(); // see dontAddVoiceMailNumber()
- PhoneApp.getInstance().pokeUserActivity();
- }})
- .create();
-
- // When the dialog is up, completely hide the in-call UI
- // underneath (which is in a partially-constructed state).
- mMissingVoicemailDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-
- mMissingVoicemailDialog.show();
- }
-
- private void addVoiceMailNumberPanel() {
- if (mMissingVoicemailDialog != null) {
- mMissingVoicemailDialog.dismiss();
- mMissingVoicemailDialog = null;
- }
- if (DBG) log("addVoiceMailNumberPanel: finishing InCallScreen...");
- endInCallScreenSession();
-
- if (DBG) log("show vm setting");
-
- // navigate to the Voicemail setting in the Call Settings activity.
- Intent intent = new Intent(CallFeaturesSetting.ACTION_ADD_VOICEMAIL);
- intent.setClass(this, CallFeaturesSetting.class);
- startActivity(intent);
- }
-
- private void dontAddVoiceMailNumber() {
- if (mMissingVoicemailDialog != null) {
- mMissingVoicemailDialog.dismiss();
- mMissingVoicemailDialog = null;
- }
- if (DBG) log("dontAddVoiceMailNumber: finishing InCallScreen...");
- endInCallScreenSession();
- }
-
- /**
- * Do some delayed cleanup after a Phone call gets disconnected.
- *
- * This method gets called a couple of seconds after any DISCONNECT
- * event from the Phone; it's triggered by the
- * DELAYED_CLEANUP_AFTER_DISCONNECT message we send in onDisconnect().
- *
- * If the Phone is totally idle right now, that means we've already
- * shown the "call ended" state for a couple of seconds, and it's now
- * time to endInCallScreenSession this activity.
- *
- * If the Phone is *not* idle right now, that probably means that one
- * call ended but the other line is still in use. In that case, we
- * *don't* exit the in-call screen, but we at least turn off the
- * backlight (which we turned on in onDisconnect().)
- */
- private void delayedCleanupAfterDisconnect() {
- if (VDBG) log("delayedCleanupAfterDisconnect()... Phone state = " + mPhone.getState());
-
- // Clean up any connections in the DISCONNECTED state.
- //
- // [Background: Even after a connection gets disconnected, its
- // Connection object still stays around, in the special
- // DISCONNECTED state. This is necessary because we we need the
- // caller-id information from that Connection to properly draw the
- // "Call ended" state of the CallCard.
- // But at this point we truly don't need that connection any
- // more, so tell the Phone that it's now OK to to clean up any
- // connections still in that state.]
- mPhone.clearDisconnected();
-
- if (!phoneIsInUse()) {
- // Phone is idle! We should exit this screen now.
- if (DBG) log("- delayedCleanupAfterDisconnect: phone is idle...");
-
- // And (finally!) exit from the in-call screen
- // (but not if we're already in the process of pausing...)
- if (mIsForegroundActivity) {
- if (DBG) log("- delayedCleanupAfterDisconnect: finishing InCallScreen...");
-
- // If this is a call that was initiated by the user, and
- // we're *not* in emergency mode, finish the call by
- // taking the user to the Call Log.
- // Otherwise we simply call endInCallScreenSession, which will take us
- // back to wherever we came from.
- if (mShowCallLogAfterDisconnect && !isPhoneStateRestricted()) {
- if (VDBG) log("- Show Call Log after disconnect...");
- final Intent intent = PhoneApp.createCallLogIntent();
- intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
- startActivity(intent);
- // Even in this case we still call endInCallScreenSession (below),
- // to make sure we don't stay in the activity history.
- }
-
- endInCallScreenSession();
- }
- } else {
- // The phone is still in use. Stay here in this activity, but
- // we don't need to keep the screen on.
- if (DBG) log("- delayedCleanupAfterDisconnect: staying on the InCallScreen...");
- if (DBG) PhoneUtils.dumpCallState(mPhone);
- }
- }
-
-
- //
- // Callbacks for buttons / menu items.
- //
-
- public void onClick(View view) {
- int id = view.getId();
- if (VDBG) log("onClick(View " + view + ", id " + id + ")...");
- if (VDBG && view instanceof InCallMenuItemView) {
- InCallMenuItemView item = (InCallMenuItemView) view;
- log(" ==> menu item! " + item);
- }
-
- // Most menu items dismiss the menu immediately once you click
- // them. But some items (the "toggle" buttons) are different:
- // they want the menu to stay visible for a second afterwards to
- // give you feedback about the state change.
- boolean dismissMenuImmediate = true;
-
- switch (id) {
- case R.id.menuAnswerAndHold:
- if (VDBG) log("onClick: AnswerAndHold...");
- internalAnswerCall(); // Automatically holds the current active call
- break;
-
- case R.id.menuAnswerAndEnd:
- if (VDBG) log("onClick: AnswerAndEnd...");
- internalAnswerAndEnd();
- break;
-
- case R.id.menuAnswer:
- if (DBG) log("onClick: Answer...");
- internalAnswerCall();
- break;
-
- case R.id.menuIgnore:
- if (DBG) log("onClick: Ignore...");
- internalHangupRingingCall();
- break;
-
- case R.id.menuSwapCalls:
- if (DBG) log("onClick: SwapCalls...");
- internalSwapCalls();
- break;
-
- case R.id.menuMergeCalls:
- if (VDBG) log("onClick: MergeCalls...");
- PhoneUtils.mergeCalls(mPhone);
- break;
-
- case R.id.menuManageConference:
- if (VDBG) log("onClick: ManageConference...");
- // Show the Manage Conference panel.
- setInCallScreenMode(InCallScreenMode.MANAGE_CONFERENCE);
- break;
-
- case R.id.menuShowDialpad:
- if (VDBG) log("onClick: Show/hide dialpad...");
- onShowHideDialpad();
- break;
-
- case R.id.manage_done: // mButtonManageConferenceDone
- if (VDBG) log("onClick: mButtonManageConferenceDone...");
- // Hide the Manage Conference panel, return to NORMAL mode.
- setInCallScreenMode(InCallScreenMode.NORMAL);
- break;
-
- case R.id.menuSpeaker:
- if (VDBG) log("onClick: Speaker...");
- onSpeakerClick();
- // This is a "toggle" button; let the user see the new state for a moment.
- dismissMenuImmediate = false;
- break;
-
- case R.id.menuBluetooth:
- if (VDBG) log("onClick: Bluetooth...");
- onBluetoothClick();
- // This is a "toggle" button; let the user see the new state for a moment.
- dismissMenuImmediate = false;
- break;
-
- case R.id.menuMute:
- if (VDBG) log("onClick: Mute...");
- onMuteClick();
- // This is a "toggle" button; let the user see the new state for a moment.
- dismissMenuImmediate = false;
- break;
-
- case R.id.menuHold:
- if (VDBG) log("onClick: Hold...");
- onHoldClick();
- // This is a "toggle" button; let the user see the new state for a moment.
- dismissMenuImmediate = false;
- break;
-
- case R.id.menuAddCall:
- if (VDBG) log("onClick: AddCall...");
- PhoneUtils.startNewCall(mPhone); // Fires off an ACTION_DIAL intent
- break;
-
- case R.id.menuEndCall:
- if (VDBG) log("onClick: EndCall...");
- internalHangup();
- break;
-
- default:
- if ((mInCallScreenMode == InCallScreenMode.OTA_NORMAL
- || mInCallScreenMode == InCallScreenMode.OTA_ENDED)
- && otaUtils != null) {
- otaUtils.onClickHandler(id);
- } else {
- Log.w(LOG_TAG,
- "Got click from unexpected View ID " + id + " (View = " + view + ")");
- }
- break;
- }
-
- EventLog.writeEvent(EventLogTags.PHONE_UI_BUTTON_CLICK,
- (view instanceof TextView) ? ((TextView) view).getText() : "");
-
- // If the user just clicked a "stateful" menu item (i.e. one of
- // the toggle buttons), we keep the menu onscreen briefly to
- // provide visual feedback. Since we want the user to see the
- // *new* current state, force the menu items to update right now.
- //
- // Note that some toggle buttons ("Hold" in particular) do NOT
- // immediately change the state of the Phone. In that case, the
- // updateItems() call below won't have any visible effect.
- // Instead, the menu will get updated by the updateScreen() call
- // that happens from onPhoneStateChanged().
-
- if (!dismissMenuImmediate) {
- // TODO: mInCallMenu.updateItems() is a very big hammer; it
- // would be more efficient to update *only* the menu item(s)
- // we just changed. (Doing it this way doesn't seem to cause
- // a noticeable performance problem, though.)
- if (VDBG) log("- onClick: updating menu to show 'new' current state...");
- boolean okToShowMenu = mInCallMenu.updateItems(mPhone);
- if (!okToShowMenu) {
- // Uh oh. All we tried to do was update the state of the
- // menu items, but the logic in InCallMenu.updateItems()
- // just decided the menu shouldn't be visible at all!
- // (That probably means that the call ended asynchronously
- // while the menu was up.)
- //
- // That's OK; just make sure to take the menu down ASAP.
- if (VDBG) log("onClick: Tried to update menu, but now need to take it down!");
- dismissMenuImmediate = true;
- }
- }
-
- // Any menu item counts as explicit "user activity".
- PhoneApp.getInstance().pokeUserActivity();
-
- // Finally, *any* action handled here closes the menu (either
- // immediately, or after a short delay).
- //
- // Note that some of the clicks we handle here aren't even menu
- // items in the first place, like the mButtonManageConferenceDone
- // button. That's OK; if the menu is already closed, the
- // dismissMenu() call does nothing.
- dismissMenu(dismissMenuImmediate);
- }
-
- private void onHoldClick() {
- if (VDBG) log("onHoldClick()...");
-
- final boolean hasActiveCall = !mForegroundCall.isIdle();
- final boolean hasHoldingCall = !mBackgroundCall.isIdle();
- if (VDBG) log("- hasActiveCall = " + hasActiveCall
- + ", hasHoldingCall = " + hasHoldingCall);
- boolean newHoldState;
- boolean holdButtonEnabled;
- if (hasActiveCall && !hasHoldingCall) {
- // There's only one line in use, and that line is active.
- PhoneUtils.switchHoldingAndActive(mPhone); // Really means "hold" in this state
- newHoldState = true;
- holdButtonEnabled = true;
- } else if (!hasActiveCall && hasHoldingCall) {
- // There's only one line in use, and that line is on hold.
- PhoneUtils.switchHoldingAndActive(mPhone); // Really means "unhold" in this state
- newHoldState = false;
- holdButtonEnabled = true;
- } else {
- // Either zero or 2 lines are in use; "hold/unhold" is meaningless.
- newHoldState = false;
- holdButtonEnabled = false;
- }
- // TODO: we *could* now forcibly update the "Hold" button based on
- // "newHoldState" and "holdButtonEnabled". But for now, do
- // nothing here, and instead let the menu get updated when the
- // onPhoneStateChanged() callback comes in. (This seems to be
- // responsive enough.)
-
- // Also, any time we hold or unhold, force the DTMF dialpad to close.
- mDialer.closeDialer(true); // do the "closing" animation
- }
-
- private void onSpeakerClick() {
- if (VDBG) log("onSpeakerClick()...");
-
- // TODO: Turning on the speaker seems to enable the mic
- // whether or not the "mute" feature is active!
- // Not sure if this is an feature of the telephony API
- // that I need to handle specially, or just a bug.
- boolean newSpeakerState = !PhoneUtils.isSpeakerOn(this);
- if (newSpeakerState && isBluetoothAvailable() && isBluetoothAudioConnected()) {
- disconnectBluetoothAudio();
- }
- PhoneUtils.turnOnSpeaker(this, newSpeakerState, true);
-
- if (newSpeakerState) {
- // The "touch lock" overlay is NEVER used when the speaker is on.
- enableTouchLock(false);
- } else {
- // User just turned the speaker *off*. If the dialpad
- // is open, we need to start the timer that will
- // eventually bring up the "touch lock" overlay.
- if (mDialer.isOpened() && !isTouchLocked()) {
- resetTouchLockTimer();
- }
- }
- }
-
- private void onMuteClick() {
- if (VDBG) log("onMuteClick()...");
- boolean newMuteState = !PhoneUtils.getMute(mPhone);
- PhoneUtils.setMute(mPhone, newMuteState);
- }
-
- private void onBluetoothClick() {
- if (VDBG) log("onBluetoothClick()...");
-
- if (isBluetoothAvailable()) {
- // Toggle the bluetooth audio connection state:
- if (isBluetoothAudioConnected()) {
- disconnectBluetoothAudio();
- } else {
- // Manually turn the speaker phone off, instead of allowing the
- // Bluetooth audio routing handle it. This ensures that the rest
- // of the speakerphone code is executed, and reciprocates the
- // menuSpeaker code above in onClick(). The onClick() code
- // disconnects the active bluetooth headsets when the
- // speakerphone is turned on.
- if (PhoneUtils.isSpeakerOn(this)) {
- PhoneUtils.turnOnSpeaker(this, false, true);
- }
-
- connectBluetoothAudio();
- }
- } else {
- // Bluetooth isn't available; the "Audio" button shouldn't have
- // been enabled in the first place!
- Log.w(LOG_TAG, "Got onBluetoothClick, but bluetooth is unavailable");
- }
- }
-
- private void onShowHideDialpad() {
- if (VDBG) log("onShowHideDialpad()...");
- if (mDialer.isOpened()) {
- mDialer.closeDialer(true); // do the "closing" animation
- } else {
- mDialer.openDialer(true); // do the "opening" animation
- }
- mDialer.setHandleVisible(true);
- }
-
- /**
- * Handles button clicks from the InCallTouchUi widget.
- */
- /* package */ void handleOnscreenButtonClick(int id) {
- if (DBG) log("handleOnscreenButtonClick(id " + id + ")...");
-
- switch (id) {
- // TODO: since every button here corresponds to a menu item that we
- // already handle in onClick(), maybe merge the guts of these two
- // methods into a separate helper that takes an ID (of either a menu
- // item *or* touch button) and does the appropriate user action.
-
- // Actions while an incoming call is ringing:
- case R.id.answerButton:
- internalAnswerCall();
- break;
- case R.id.rejectButton:
- internalHangupRingingCall();
- break;
-
- // The other regular (single-tap) buttons used while in-call:
- case R.id.holdButton:
- onHoldClick();
- break;
- case R.id.swapButton:
- internalSwapCalls();
- break;
- case R.id.endButton:
- internalHangup();
- break;
- case R.id.dialpadButton:
- onShowHideDialpad();
- break;
- case R.id.bluetoothButton:
- onBluetoothClick();
- break;
- case R.id.muteButton:
- onMuteClick();
- break;
- case R.id.speakerButton:
- onSpeakerClick();
- break;
- case R.id.addButton:
- PhoneUtils.startNewCall(mPhone); // Fires off an ACTION_DIAL intent
- break;
- case R.id.mergeButton:
- case R.id.cdmaMergeButton:
- PhoneUtils.mergeCalls(mPhone);
- break;
- case R.id.manageConferencePhotoButton:
- // Show the Manage Conference panel.
- setInCallScreenMode(InCallScreenMode.MANAGE_CONFERENCE);
- break;
-
- default:
- Log.w(LOG_TAG, "handleOnscreenButtonClick: unexpected ID " + id);
- break;
- }
-
- // Just in case the user clicked a "stateful" menu item (i.e. one
- // of the toggle buttons), we force the in-call buttons to update,
- // to make sure the user sees the *new* current state.
- //
- // (But note that some toggle buttons may *not* immediately change
- // the state of the Phone, in which case the updateInCallTouchUi()
- // call here won't have any visible effect. Instead, those
- // buttons will get updated by the updateScreen() call that gets
- // triggered when the onPhoneStateChanged() event comes in.)
- //
- // TODO: updateInCallTouchUi() is overkill here; it would be
- // more efficient to update *only* the affected button(s).
- // Consider adding API for that. (This is lo-pri since
- // updateInCallTouchUi() is pretty cheap already...)
- updateInCallTouchUi();
- }
-
- /**
- * Update the network provider's overlay based on the value of
- * mProviderOverlayVisible.
- * If false the overlay is hidden otherwise it is shown. A
- * delayed message is posted to take the overalay down after
- * PROVIDER_OVERLAY_TIMEOUT. This ensures the user will see the
- * overlay even if the call setup phase is very short.
- */
- private void updateProviderOverlay() {
- if (VDBG) log("updateProviderOverlay: " + mProviderOverlayVisible);
-
- ViewGroup overlay = (ViewGroup) findViewById(R.id.inCallProviderOverlay);
-
- if (mProviderOverlayVisible) {
- CharSequence template = getText(R.string.calling_via_template);
- CharSequence text = TextUtils.expandTemplate(template, mProviderLabel,
- mProviderAddress);
-
- TextView message = (TextView) findViewById(R.id.callingVia);
- message.setCompoundDrawablesWithIntrinsicBounds(mProviderIcon, null, null, null);
- message.setText(text);
-
- overlay.setVisibility(View.VISIBLE);
-
- // Remove any zombie messages and then send a message to
- // self to remove the overlay after some time.
- mHandler.removeMessages(EVENT_HIDE_PROVIDER_OVERLAY);
- Message msg = Message.obtain(mHandler, EVENT_HIDE_PROVIDER_OVERLAY);
- mHandler.sendMessageDelayed(msg, PROVIDER_OVERLAY_TIMEOUT);
- } else {
- overlay.setVisibility(View.GONE);
- }
- }
-
- /**
- * Updates the "Press Menu for more options" hint based on the current
- * state of the Phone.
- */
- private void updateMenuButtonHint() {
- if (VDBG) log("updateMenuButtonHint()...");
- boolean hintVisible = true;
-
- final boolean hasRingingCall = !mRingingCall.isIdle();
- final boolean hasActiveCall = !mForegroundCall.isIdle();
- final boolean hasHoldingCall = !mBackgroundCall.isIdle();
-
- // The hint is hidden only when there's no menu at all,
- // which only happens in a few specific cases:
- if (mInCallScreenMode == InCallScreenMode.CALL_ENDED) {
- // The "Call ended" state.
- hintVisible = false;
- } else if (hasRingingCall && !(hasActiveCall && !hasHoldingCall)) {
- // An incoming call where you *don't* have the option to
- // "answer & end" or "answer & hold".
- hintVisible = false;
- } else if (!phoneIsInUse()) {
- // Or if the phone is totally idle (like if an error dialog
- // is up, or an MMI is running.)
- hintVisible = false;
- }
-
- // The hint is also hidden on devices where we use onscreen
- // touchable buttons instead.
- if (isTouchUiEnabled()) {
- hintVisible = false;
- }
-
- // Also, if an incoming call is ringing, hide the hint if the
- // "incoming call" touch UI is present (since the SlidingTab
- // widget takes up a lot of space and the hint would collide with
- // it.)
- if (hasRingingCall && isIncomingCallTouchUiEnabled()) {
- hintVisible = false;
- }
-
- int hintVisibility = (hintVisible) ? View.VISIBLE : View.GONE;
- mCallCard.getMenuButtonHint().setVisibility(hintVisibility);
-
- // TODO: Consider hiding the hint(s) whenever the menu is onscreen!
- // (Currently, the menu is rendered on top of the hint, but the
- // menu is semitransparent so you can still see the hint
- // underneath, and the hint is *just* visible enough to be
- // distracting.)
- }
-
- /**
- * Brings up UI to handle the various error conditions that
- * can occur when first initializing the in-call UI.
- * This is called from onResume() if we encountered
- * an error while processing our initial Intent.
- *
- * @param status one of the InCallInitStatus error codes.
- */
- private void handleStartupError(InCallInitStatus status) {
- if (DBG) log("handleStartupError(): status = " + status);
-
- // NOTE that the regular Phone UI is in an uninitialized state at
- // this point, so we don't ever want the user to see it.
- // That means:
- // - Any cases here that need to go to some other activity should
- // call startActivity() AND immediately call endInCallScreenSession
- // on this one.
- // - Any cases here that bring up a Dialog must ensure that the
- // Dialog handles both OK *and* cancel by calling endInCallScreenSession.
- // Activity. (See showGenericErrorDialog() for an example.)
-
- switch (status) {
-
- case VOICEMAIL_NUMBER_MISSING:
- // Bring up the "Missing Voicemail Number" dialog, which
- // will ultimately take us to some other Activity (or else
- // just bail out of this activity.)
- handleMissingVoiceMailNumber();
- break;
-
- case POWER_OFF:
- // Radio is explictly powered off.
-
- // TODO: This UI is ultra-simple for 1.0. It would be nicer
- // to bring up a Dialog instead with the option "turn on radio
- // now". If selected, we'd turn the radio on, wait for
- // network registration to complete, and then make the call.
-
- showGenericErrorDialog(R.string.incall_error_power_off, true);
- break;
-
- case EMERGENCY_ONLY:
- // Only emergency numbers are allowed, but we tried to dial
- // a non-emergency number.
- // (This state is currently unused; see comments above.)
- showGenericErrorDialog(R.string.incall_error_emergency_only, true);
- break;
-
- case OUT_OF_SERVICE:
- // No network connection.
- showGenericErrorDialog(R.string.incall_error_out_of_service, true);
- break;
-
- case PHONE_NOT_IN_USE:
- // This error is handled directly in onResume() (by bailing
- // out of the activity.) We should never see it here.
- Log.w(LOG_TAG,
- "handleStartupError: unexpected PHONE_NOT_IN_USE status");
- break;
-
- case NO_PHONE_NUMBER_SUPPLIED:
- // The supplied Intent didn't contain a valid phone number.
- // TODO: Need UI spec for this failure case; for now just
- // show a generic error.
- showGenericErrorDialog(R.string.incall_error_no_phone_number_supplied, true);
- break;
-
- case DIALED_MMI:
- // Our initial phone number was actually an MMI sequence.
- // There's no real "error" here, but we do bring up the
- // a Toast (as requested of the New UI paradigm).
- //
- // In-call MMIs do not trigger the normal MMI Initiate
- // Notifications, so we should notify the user here.
- // Otherwise, the code in PhoneUtils.java should handle
- // user notifications in the form of Toasts or Dialogs.
- if (mPhone.getState() == Phone.State.OFFHOOK) {
- Toast.makeText(this, R.string.incall_status_dialed_mmi, Toast.LENGTH_SHORT)
- .show();
- }
- break;
-
- case CALL_FAILED:
- // We couldn't successfully place the call; there was some
- // failure in the telephony layer.
- // TODO: Need UI spec for this failure case; for now just
- // show a generic error.
- showGenericErrorDialog(R.string.incall_error_call_failed, true);
- break;
-
- default:
- Log.w(LOG_TAG, "handleStartupError: unexpected status code " + status);
- showGenericErrorDialog(R.string.incall_error_call_failed, true);
- break;
- }
- }
-
- /**
- * Utility function to bring up a generic "error" dialog, and then bail
- * out of the in-call UI when the user hits OK (or the BACK button.)
- */
- private void showGenericErrorDialog(int resid, boolean isStartupError) {
- CharSequence msg = getResources().getText(resid);
- if (DBG) log("showGenericErrorDialog('" + msg + "')...");
-
- // create the clicklistener and cancel listener as needed.
- DialogInterface.OnClickListener clickListener;
- OnCancelListener cancelListener;
- if (isStartupError) {
- clickListener = new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- bailOutAfterErrorDialog();
- }};
- cancelListener = new OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- bailOutAfterErrorDialog();
- }};
- } else {
- clickListener = new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- delayedCleanupAfterDisconnect();
- }};
- cancelListener = new OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- delayedCleanupAfterDisconnect();
- }};
- }
-
- // TODO: Consider adding a setTitle() call here (with some generic
- // "failure" title?)
- mGenericErrorDialog = new AlertDialog.Builder(this)
- .setMessage(msg)
- .setPositiveButton(R.string.ok, clickListener)
- .setOnCancelListener(cancelListener)
- .create();
-
- // When the dialog is up, completely hide the in-call UI
- // underneath (which is in a partially-constructed state).
- mGenericErrorDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-
- mGenericErrorDialog.show();
- }
-
- private void showCallLostDialog() {
- if (DBG) log("showCallLostDialog()...");
-
- // Don't need to show the dialog if InCallScreen isn't in the forgeround
- if (!mIsForegroundActivity) {
- if (DBG) log("showCallLostDialog: not the foreground Activity! Bailing out...");
- return;
- }
-
- // Don't need to show the dialog again, if there is one already.
- if (mCallLostDialog != null) {
- if (DBG) log("showCallLostDialog: There is a mCallLostDialog already.");
- return;
- }
-
- mCallLostDialog = new AlertDialog.Builder(this)
- .setMessage(R.string.call_lost)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .create();
- mCallLostDialog.show();
- }
-
- private void bailOutAfterErrorDialog() {
- if (mGenericErrorDialog != null) {
- if (DBG) log("bailOutAfterErrorDialog: DISMISSING mGenericErrorDialog.");
- mGenericErrorDialog.dismiss();
- mGenericErrorDialog = null;
- }
- if (DBG) log("bailOutAfterErrorDialog(): end InCallScreen session...");
- endInCallScreenSession();
- }
-
- /**
- * Dismisses (and nulls out) all persistent Dialogs managed
- * by the InCallScreen. Useful if (a) we're about to bring up
- * a dialog and want to pre-empt any currently visible dialogs,
- * or (b) as a cleanup step when the Activity is going away.
- */
- private void dismissAllDialogs() {
- if (DBG) log("dismissAllDialogs()...");
-
- // Note it's safe to dismiss() a dialog that's already dismissed.
- // (Even if the AlertDialog object(s) below are still around, it's
- // possible that the actual dialog(s) may have already been
- // dismissed by the user.)
-
- if (mMissingVoicemailDialog != null) {
- if (VDBG) log("- DISMISSING mMissingVoicemailDialog.");
- mMissingVoicemailDialog.dismiss();
- mMissingVoicemailDialog = null;
- }
- if (mMmiStartedDialog != null) {
- if (VDBG) log("- DISMISSING mMmiStartedDialog.");
- mMmiStartedDialog.dismiss();
- mMmiStartedDialog = null;
- }
- if (mGenericErrorDialog != null) {
- if (VDBG) log("- DISMISSING mGenericErrorDialog.");
- mGenericErrorDialog.dismiss();
- mGenericErrorDialog = null;
- }
- if (mSuppServiceFailureDialog != null) {
- if (VDBG) log("- DISMISSING mSuppServiceFailureDialog.");
- mSuppServiceFailureDialog.dismiss();
- mSuppServiceFailureDialog = null;
- }
- if (mWaitPromptDialog != null) {
- if (VDBG) log("- DISMISSING mWaitPromptDialog.");
- mWaitPromptDialog.dismiss();
- mWaitPromptDialog = null;
- }
- if (mWildPromptDialog != null) {
- if (VDBG) log("- DISMISSING mWildPromptDialog.");
- mWildPromptDialog.dismiss();
- mWildPromptDialog = null;
- }
- if (mCallLostDialog != null) {
- if (VDBG) log("- DISMISSING mCallLostDialog.");
- mCallLostDialog.dismiss();
- mCallLostDialog = null;
- }
- if ((mInCallScreenMode == InCallScreenMode.OTA_NORMAL
- || mInCallScreenMode == InCallScreenMode.OTA_ENDED)
- && otaUtils != null) {
- otaUtils.dismissAllOtaDialogs();
- }
- if (mPausePromptDialog != null) {
- if (DBG) log("- DISMISSING mPausePromptDialog.");
- mPausePromptDialog.dismiss();
- mPausePromptDialog = null;
- }
- }
-
-
- //
- // Helper functions for answering incoming calls.
- //
-
- /**
- * Answer a ringing call. This method does nothing if there's no
- * ringing or waiting call.
- */
- /* package */ void internalAnswerCall() {
- // if (DBG) log("internalAnswerCall()...");
- // if (DBG) PhoneUtils.dumpCallState(mPhone);
-
- final boolean hasRingingCall = !mRingingCall.isIdle();
-
- if (hasRingingCall) {
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- if (DBG) log("internalAnswerCall: answering (CDMA)...");
- // In CDMA this is simply a wrapper around PhoneUtils.answerCall().
- PhoneUtils.answerCall(mPhone); // Automatically holds the current active call,
- // if there is one
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- // GSM: this is usually just a wrapper around
- // PhoneUtils.answerCall(), *but* we also need to do
- // something special for the "both lines in use" case.
-
- final boolean hasActiveCall = !mForegroundCall.isIdle();
- final boolean hasHoldingCall = !mBackgroundCall.isIdle();
-
- if (hasActiveCall && hasHoldingCall) {
- if (DBG) log("internalAnswerCall: answering (both lines in use!)...");
- // The relatively rare case where both lines are
- // already in use. We "answer incoming, end ongoing"
- // in this case, according to the current UI spec.
- PhoneUtils.answerAndEndActive(mPhone);
-
- // Alternatively, we could use
- // PhoneUtils.answerAndEndHolding(mPhone);
- // here to end the on-hold call instead.
- } else {
- if (DBG) log("internalAnswerCall: answering...");
- PhoneUtils.answerCall(mPhone); // Automatically holds the current active call,
- // if there is one
- }
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
- }
-
- /**
- * Answer the ringing call *and* hang up the ongoing call.
- */
- /* package */ void internalAnswerAndEnd() {
- if (DBG) log("internalAnswerAndEnd()...");
- // if (DBG) PhoneUtils.dumpCallState(mPhone);
- PhoneUtils.answerAndEndActive(mPhone);
- }
-
- /**
- * Hang up the ringing call (aka "Don't answer").
- */
- /* package */ void internalHangupRingingCall() {
- if (DBG) log("internalHangupRingingCall()...");
- PhoneUtils.hangupRingingCall(mPhone);
- }
-
- /**
- * Hang up the current active call.
- */
- /* package */ void internalHangup() {
- if (DBG) log("internalHangup()..." + mPhone);
- PhoneUtils.hangup(mPhone);
- }
-
- /**
- * InCallScreen-specific wrapper around PhoneUtils.switchHoldingAndActive().
- */
- private void internalSwapCalls() {
- if (DBG) log("internalSwapCalls()...");
-
- // Any time we swap calls, force the DTMF dialpad to close.
- // (We want the regular in-call UI to be visible right now, so the
- // user can clearly see which call is now in the foreground.)
- mDialer.closeDialer(true); // do the "closing" animation
-
- // Also, clear out the "history" of DTMF digits you typed, to make
- // sure you don't see digits from call #1 while call #2 is active.
- // (Yes, this does mean that swapping calls twice will cause you
- // to lose any previous digits from the current call; see the TODO
- // comment on DTMFTwelvKeyDialer.clearDigits() for more info.)
- mDialer.clearDigits();
-
- // Swap the fg and bg calls.
- PhoneUtils.switchHoldingAndActive(mPhone);
-
- // If we have a valid BluetoothHandsfree then since CDMA network or
- // Telephony FW does not send us information on which caller got swapped
- // we need to update the second call active state in BluetoothHandsfree internally
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- BluetoothHandsfree bthf = PhoneApp.getInstance().getBluetoothHandsfree();
- if (bthf != null) {
- bthf.cdmaSwapSecondCallState();
- }
- }
-
- }
-
- /**
- * Sets the current high-level "mode" of the in-call UI.
- *
- * NOTE: if newMode is CALL_ENDED, the caller is responsible for
- * posting a delayed DELAYED_CLEANUP_AFTER_DISCONNECT message, to make
- * sure the "call ended" state goes away after a couple of seconds.
- */
- private void setInCallScreenMode(InCallScreenMode newMode) {
- if (DBG) log("setInCallScreenMode: " + newMode);
- mInCallScreenMode = newMode;
- switch (mInCallScreenMode) {
- case MANAGE_CONFERENCE:
- if (!PhoneUtils.isConferenceCall(mForegroundCall)) {
- Log.w(LOG_TAG, "MANAGE_CONFERENCE: no active conference call!");
- // Hide the Manage Conference panel, return to NORMAL mode.
- setInCallScreenMode(InCallScreenMode.NORMAL);
- return;
- }
- List<Connection> connections = mForegroundCall.getConnections();
- // There almost certainly will be > 1 connection,
- // since isConferenceCall() just returned true.
- if ((connections == null) || (connections.size() <= 1)) {
- Log.w(LOG_TAG,
- "MANAGE_CONFERENCE: Bogus TRUE from isConferenceCall(); connections = "
- + connections);
- // Hide the Manage Conference panel, return to NORMAL mode.
- setInCallScreenMode(InCallScreenMode.NORMAL);
- return;
- }
-
- // TODO: Don't do this here. The call to
- // initManageConferencePanel() should instead happen
- // automagically in ManageConferenceUtils the very first
- // time you call updateManageConferencePanel() or
- // setPanelVisible(true).
- mManageConferenceUtils.initManageConferencePanel(); // if necessary
-
- mManageConferenceUtils.updateManageConferencePanel(connections);
-
- // The "Manage conference" UI takes up the full main frame,
- // replacing the inCallPanel and CallCard PopupWindow.
- mManageConferenceUtils.setPanelVisible(true);
-
- // Start the chronometer.
- // TODO: Similarly, we shouldn't expose startConferenceTime()
- // and stopConferenceTime(); the ManageConferenceUtils
- // class ought to manage the conferenceTime widget itself
- // based on setPanelVisible() calls.
- long callDuration = mForegroundCall.getEarliestConnection().getDurationMillis();
- mManageConferenceUtils.startConferenceTime(
- SystemClock.elapsedRealtime() - callDuration);
-
- mInCallPanel.setVisibility(View.GONE);
-
- // No need to close the dialer here, since the Manage
- // Conference UI will just cover it up anyway.
-
- break;
-
- case CALL_ENDED:
- // Display the CallCard (in the "Call ended" state)
- // and hide all other UI.
-
- mManageConferenceUtils.setPanelVisible(false);
- mManageConferenceUtils.stopConferenceTime();
-
- updateMenuButtonHint(); // Hide the Menu button hint
-
- // Make sure the CallCard (which is a child of mInCallPanel) is visible.
- mInCallPanel.setVisibility(View.VISIBLE);
-
- break;
-
- case NORMAL:
- mInCallPanel.setVisibility(View.VISIBLE);
- mManageConferenceUtils.setPanelVisible(false);
- mManageConferenceUtils.stopConferenceTime();
- break;
-
- case OTA_NORMAL:
- otaUtils.setCdmaOtaInCallScreenUiState(
- OtaUtils.CdmaOtaInCallScreenUiState.State.NORMAL);
- mInCallPanel.setVisibility(View.GONE);
- break;
-
- case OTA_ENDED:
- otaUtils.setCdmaOtaInCallScreenUiState(
- OtaUtils.CdmaOtaInCallScreenUiState.State.ENDED);
- mInCallPanel.setVisibility(View.GONE);
- break;
-
- case UNDEFINED:
- // Set our Activities intent to ACTION_UNDEFINED so
- // that if we get resumed after we've completed a call
- // the next call will not cause checkIsOtaCall to
- // return true.
- //
- // With the framework as of October 2009 the sequence below
- // causes the framework to call onResume, onPause, onNewIntent,
- // onResume. If we don't call setIntent below then when the
- // first onResume calls checkIsOtaCall via initOtaState it will
- // return true and the Activity will be confused.
- //
- // 1) Power up Phone A
- // 2) Place *22899 call and activate Phone A
- // 3) Press the power key on Phone A to turn off the display
- // 4) Call Phone A from Phone B answering Phone A
- // 5) The screen will be blank (Should be normal InCallScreen)
- // 6) Hang up the Phone B
- // 7) Phone A displays the activation screen.
- //
- // Step 3 is the critical step to cause the onResume, onPause
- // onNewIntent, onResume sequence. If step 3 is skipped the
- // sequence will be onNewIntent, onResume and all will be well.
- setIntent(new Intent(ACTION_UNDEFINED));
-
- // Cleanup Ota Screen if necessary and set the panel
- // to VISIBLE.
- if (mPhone.getState() != Phone.State.OFFHOOK) {
- if (otaUtils != null) {
- otaUtils.cleanOtaScreen(true);
- }
- } else {
- log("WARNING: Setting mode to UNDEFINED but phone is OFFHOOK,"
- + " skip cleanOtaScreen.");
- }
- mInCallPanel.setVisibility(View.VISIBLE);
- break;
- }
-
- // Update the visibility of the DTMF dialer tab on any state
- // change.
- updateDialpadVisibility();
-
- // Update the in-call touch UI on any state change (since it may
- // need to hide or re-show itself.)
- updateInCallTouchUi();
- }
-
- /**
- * @return true if the "Manage conference" UI is currently visible.
- */
- /* package */ boolean isManageConferenceMode() {
- return (mInCallScreenMode == InCallScreenMode.MANAGE_CONFERENCE);
- }
-
- /**
- * Checks if the "Manage conference" UI needs to be updated.
- * If the state of the current conference call has changed
- * since our previous call to updateManageConferencePanel()),
- * do a fresh update. Also, if the current call is no longer a
- * conference call at all, bail out of the "Manage conference" UI and
- * return to InCallScreenMode.NORMAL mode.
- */
- private void updateManageConferencePanelIfNecessary() {
- if (VDBG) log("updateManageConferencePanelIfNecessary: " + mForegroundCall + "...");
-
- List<Connection> connections = mForegroundCall.getConnections();
- if (connections == null) {
- if (VDBG) log("==> no connections on foreground call!");
- // Hide the Manage Conference panel, return to NORMAL mode.
- setInCallScreenMode(InCallScreenMode.NORMAL);
- InCallInitStatus status = syncWithPhoneState();
- if (status != InCallInitStatus.SUCCESS) {
- Log.w(LOG_TAG, "- syncWithPhoneState failed! status = " + status);
- // We shouldn't even be in the in-call UI in the first
- // place, so bail out:
- if (DBG) log("updateManageConferencePanelIfNecessary: endInCallScreenSession... 1");
- endInCallScreenSession();
- return;
- }
- return;
- }
-
- int numConnections = connections.size();
- if (numConnections <= 1) {
- if (VDBG) log("==> foreground call no longer a conference!");
- // Hide the Manage Conference panel, return to NORMAL mode.
- setInCallScreenMode(InCallScreenMode.NORMAL);
- InCallInitStatus status = syncWithPhoneState();
- if (status != InCallInitStatus.SUCCESS) {
- Log.w(LOG_TAG, "- syncWithPhoneState failed! status = " + status);
- // We shouldn't even be in the in-call UI in the first
- // place, so bail out:
- if (DBG) log("updateManageConferencePanelIfNecessary: endInCallScreenSession... 2");
- endInCallScreenSession();
- return;
- }
- return;
- }
-
- // TODO: the test to see if numConnections has changed can go in
- // updateManageConferencePanel(), rather than here.
- if (numConnections != mManageConferenceUtils.getNumCallersInConference()) {
- if (VDBG) log("==> Conference size has changed; need to rebuild UI!");
- mManageConferenceUtils.updateManageConferencePanel(connections);
- }
- }
-
- /**
- * Updates the visibility of the DTMF dialpad (and its onscreen
- * "handle", if applicable), based on the current state of the phone
- * and/or the current InCallScreenMode.
- */
- private void updateDialpadVisibility() {
- //
- // (1) The dialpad itself:
- //
- // If an incoming call is ringing, make sure the dialpad is
- // closed. (We do this to make sure we're not covering up the
- // "incoming call" UI, and especially to make sure that the "touch
- // lock" overlay won't appear.)
- if (mPhone.getState() == Phone.State.RINGING) {
- mDialer.closeDialer(false); // don't do the "closing" animation
-
- // Also, clear out the "history" of DTMF digits you may have typed
- // into the previous call (so you don't see the previous call's
- // digits if you answer this call and then bring up the dialpad.)
- //
- // TODO: it would be more precise to do this when you *answer* the
- // incoming call, rather than as soon as it starts ringing, but
- // the InCallScreen doesn't keep enough state right now to notice
- // that specific transition in onPhoneStateChanged().
- mDialer.clearDigits();
- }
-
- //
- // (2) The onscreen "handle":
- //
- // The handle is visible only if it's OK to actually open the
- // dialpad. (Note this is meaningful only on platforms that use a
- // SlidingDrawer as a container for the dialpad.)
- mDialer.setHandleVisible(okToShowDialpad());
-
- //
- // (3) The main in-call panel (containing the CallCard):
- //
- // On some platforms(*) we need to hide the CallCard (which is a
- // child of mInCallPanel) while the dialpad is visible.
- //
- // (*) We need to do this when using the dialpad from the
- // InCallTouchUi widget, but not when using the
- // SlidingDrawer-based dialpad, because the SlidingDrawer itself
- // is opaque.)
- if (!mDialer.usingSlidingDrawer()) {
- if (mDialerView != null) {
- mDialerView.setKeysBackgroundResource(
- isBluetoothAudioConnected() ? R.drawable.btn_dial_blue
- : R.drawable.btn_dial_green);
- }
-
- if (isDialerOpened()) {
- mInCallPanel.setVisibility(View.GONE);
- } else {
- // Dialpad is dismissed; bring back the CallCard if
- // it's supposed to be visible.
- if ((mInCallScreenMode == InCallScreenMode.NORMAL)
- || (mInCallScreenMode == InCallScreenMode.CALL_ENDED)) {
- mInCallPanel.setVisibility(View.VISIBLE);
- }
- }
- }
- }
-
- /**
- * @return true if the DTMF dialpad is currently visible.
- */
- /* package */ boolean isDialerOpened() {
- return (mDialer != null && mDialer.isOpened());
- }
-
- /**
- * Called any time the DTMF dialpad is opened.
- * @see DTMFTwelveKeyDialer.onDialerOpen()
- */
- /* package */ void onDialerOpen() {
- if (DBG) log("onDialerOpen()...");
-
- // ANY time the dialpad becomes visible, start the timer that will
- // eventually bring up the "touch lock" overlay.
- resetTouchLockTimer();
-
- // Update the in-call touch UI (which may need to hide itself, if
- // it's enabled.)
- updateInCallTouchUi();
-
- // Update any other onscreen UI elements that depend on the dialpad.
- updateDialpadVisibility();
-
- // This counts as explicit "user activity".
- PhoneApp.getInstance().pokeUserActivity();
-
- //If on OTA Call, hide OTA Screen
- // TODO: This may not be necessary, now that the dialpad is
- // always visible in OTA mode.
- if ((mInCallScreenMode == InCallScreenMode.OTA_NORMAL
- || mInCallScreenMode == InCallScreenMode.OTA_ENDED)
- && otaUtils != null) {
- otaUtils.hideOtaScreen();
- }
- }
-
- /**
- * Called any time the DTMF dialpad is closed.
- * @see DTMFTwelveKeyDialer.onDialerClose()
- */
- /* package */ void onDialerClose() {
- if (DBG) log("onDialerClose()...");
-
- final PhoneApp app = PhoneApp.getInstance();
-
- // OTA-specific cleanup upon closing the dialpad.
- if ((mInCallScreenMode == InCallScreenMode.OTA_NORMAL)
- || (mInCallScreenMode == InCallScreenMode.OTA_ENDED)
- || ((app.cdmaOtaScreenState != null)
- && (app.cdmaOtaScreenState.otaScreenState ==
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION))) {
- mDialer.setHandleVisible(false);
- if (otaUtils != null) {
- otaUtils.otaShowProperScreen();
- }
- }
-
- // Dismiss the "touch lock" overlay if it was visible.
- // (The overlay is only ever used on top of the dialpad).
- enableTouchLock(false);
-
- // Update the in-call touch UI (which may need to re-show itself.)
- updateInCallTouchUi();
-
- // Update the visibility of the dialpad itself (and any other
- // onscreen UI elements that depend on it.)
- updateDialpadVisibility();
-
- // This counts as explicit "user activity".
- app.getInstance().pokeUserActivity();
- }
-
- /**
- * Determines when we can dial DTMF tones.
- */
- private boolean okToDialDTMFTones() {
- final boolean hasRingingCall = !mRingingCall.isIdle();
- final Call.State fgCallState = mForegroundCall.getState();
-
- // We're allowed to send DTMF tones when there's an ACTIVE
- // foreground call, and not when an incoming call is ringing
- // (since DTMF tones are useless in that state), or if the
- // Manage Conference UI is visible (since the tab interferes
- // with the "Back to call" button.)
-
- // We can also dial while in ALERTING state because there are
- // some connections that never update to an ACTIVE state (no
- // indication from the network).
- boolean canDial =
- (fgCallState == Call.State.ACTIVE || fgCallState == Call.State.ALERTING)
- && !hasRingingCall
- && (mInCallScreenMode != InCallScreenMode.MANAGE_CONFERENCE);
-
- if (VDBG) log ("[okToDialDTMFTones] foreground state: " + fgCallState +
- ", ringing state: " + hasRingingCall +
- ", call screen mode: " + mInCallScreenMode +
- ", result: " + canDial);
-
- return canDial;
- }
-
- /**
- * @return true if the in-call DTMF dialpad should be available to the
- * user, given the current state of the phone and the in-call UI.
- * (This is used to control the visibility of the dialer's
- * onscreen handle, if applicable, and the enabledness of the "Show
- * dialpad" onscreen button or menu item.)
- */
- /* package */ boolean okToShowDialpad() {
- // The dialpad is available only when it's OK to dial DTMF
- // tones given the current state of the current call.
- return okToDialDTMFTones();
- }
-
- /**
- * Initializes the in-call touch UI on devices that need it.
- */
- private void initInCallTouchUi() {
- if (DBG) log("initInCallTouchUi()...");
- // TODO: we currently use the InCallTouchUi widget in at least
- // some states on ALL platforms. But if some devices ultimately
- // end up not using *any* onscreen touch UI, we should make sure
- // to not even inflate the InCallTouchUi widget on those devices.
- mInCallTouchUi = (InCallTouchUi) findViewById(R.id.inCallTouchUi);
- mInCallTouchUi.setInCallScreenInstance(this);
- }
-
- /**
- * Updates the state of the in-call touch UI.
- */
- private void updateInCallTouchUi() {
- if (mInCallTouchUi != null) {
- mInCallTouchUi.updateState(mPhone);
- }
- }
-
- /**
- * @return true if the onscreen touch UI is enabled (for regular
- * "ongoing call" states) on the current device.
- */
- public boolean isTouchUiEnabled() {
- return (mInCallTouchUi != null) && mInCallTouchUi.isTouchUiEnabled();
- }
-
- /**
- * @return true if the onscreen touch UI is enabled for
- * the "incoming call" state on the current device.
- */
- public boolean isIncomingCallTouchUiEnabled() {
- return (mInCallTouchUi != null) && mInCallTouchUi.isIncomingCallTouchUiEnabled();
- }
-
- /**
- * Posts a handler message telling the InCallScreen to update the
- * onscreen in-call touch UI.
- *
- * This is just a wrapper around updateInCallTouchUi(), for use by the
- * rest of the phone app or from a thread other than the UI thread.
- */
- /* package */ void requestUpdateTouchUi() {
- if (DBG) log("requestUpdateTouchUi()...");
-
- mHandler.removeMessages(REQUEST_UPDATE_TOUCH_UI);
- mHandler.sendEmptyMessage(REQUEST_UPDATE_TOUCH_UI);
- }
-
- /**
- * @return true if it's OK to display the in-call touch UI, given the
- * current state of the InCallScreen.
- */
- /* package */ boolean okToShowInCallTouchUi() {
- // Note that this method is concerned only with the internal state
- // of the InCallScreen. (The InCallTouchUi widget has separate
- // logic to make sure it's OK to display the touch UI given the
- // current telephony state, and that it's allowed on the current
- // device in the first place.)
-
- // The touch UI is NOT available if:
- // - we're in some InCallScreenMode other than NORMAL
- // (like CALL_ENDED or one of the OTA modes)
- return (mInCallScreenMode == InCallScreenMode.NORMAL);
- }
-
- /**
- * @return true if we're in restricted / emergency dialing only mode.
- */
- public boolean isPhoneStateRestricted() {
- // TODO: This needs to work IN TANDEM with the KeyGuardViewMediator Code.
- // Right now, it looks like the mInputRestricted flag is INTERNAL to the
- // KeyGuardViewMediator and SPECIFICALLY set to be FALSE while the emergency
- // phone call is being made, to allow for input into the InCallScreen.
- // Having the InCallScreen judge the state of the device from this flag
- // becomes meaningless since it is always false for us. The mediator should
- // have an additional API to let this app know that it should be restricted.
- return ((mPhone.getServiceState().getState() == ServiceState.STATE_EMERGENCY_ONLY) ||
- (mPhone.getServiceState().getState() == ServiceState.STATE_OUT_OF_SERVICE) ||
- (PhoneApp.getInstance().getKeyguardManager().inKeyguardRestrictedInputMode()));
- }
-
- //
- // In-call menu UI
- //
-
- /**
- * Override onCreatePanelView(), in order to get complete control
- * over the UI that comes up when the user presses MENU.
- *
- * This callback allows me to return a totally custom View hierarchy
- * (with custom layout and custom "item" views) to be shown instead
- * of a standard android.view.Menu hierarchy.
- *
- * This gets called (with featureId == FEATURE_OPTIONS_PANEL) every
- * time we need to bring up the menu. (And in cases where we return
- * non-null, that means that the "standard" menu callbacks
- * onCreateOptionsMenu() and onPrepareOptionsMenu() won't get called
- * at all.)
- */
- @Override
- public View onCreatePanelView(int featureId) {
- if (VDBG) log("onCreatePanelView(featureId = " + featureId + ")...");
-
- // We only want this special behavior for the "options panel"
- // feature (i.e. the standard menu triggered by the MENU button.)
- if (featureId != Window.FEATURE_OPTIONS_PANEL) {
- return null;
- }
-
- // For now, totally disable the in-call menu on devices where we
- // use onscreen touchable buttons instead.
- // TODO: even on "full touch" devices we may still ultimately need
- // a regular menu in some states. Need UI spec.
- if (isTouchUiEnabled()) {
- return null;
- }
-
- // TODO: May need to revisit the wake state here if this needs to be
- // tweaked.
-
- // Make sure there are no pending messages to *dismiss* the menu.
- mHandler.removeMessages(DISMISS_MENU);
-
- if (mInCallMenu == null) {
- if (VDBG) log("onCreatePanelView: creating mInCallMenu (first time)...");
- mInCallMenu = new InCallMenu(this);
- mInCallMenu.initMenu();
- }
-
- boolean okToShowMenu = mInCallMenu.updateItems(mPhone);
- return okToShowMenu ? mInCallMenu.getView() : null;
- }
-
- /**
- * Dismisses the menu panel (see onCreatePanelView().)
- *
- * @param dismissImmediate If true, hide the panel immediately.
- * If false, leave the menu visible onscreen for
- * a brief interval before dismissing it (so the
- * user can see the state change resulting from
- * his original click.)
- */
- /* package */ void dismissMenu(boolean dismissImmediate) {
- if (VDBG) log("dismissMenu(immediate = " + dismissImmediate + ")...");
-
- if (dismissImmediate) {
- closeOptionsMenu();
- } else {
- mHandler.removeMessages(DISMISS_MENU);
- mHandler.sendEmptyMessageDelayed(DISMISS_MENU, MENU_DISMISS_DELAY);
- // This will result in a dismissMenu(true) call shortly.
- }
- }
-
- /**
- * Override onPanelClosed() to capture the panel closing event,
- * allowing us to set the poke lock correctly whenever the option
- * menu panel goes away.
- */
- @Override
- public void onPanelClosed(int featureId, Menu menu) {
- if (VDBG) log("onPanelClosed(featureId = " + featureId + ")...");
-
- // We only want this special behavior for the "options panel"
- // feature (i.e. the standard menu triggered by the MENU button.)
- if (featureId == Window.FEATURE_OPTIONS_PANEL) {
- // TODO: May need to return to the original wake state here
- // if onCreatePanelView ends up changing the wake state.
- }
-
- super.onPanelClosed(featureId, menu);
- }
-
- //
- // Bluetooth helper methods.
- //
- // - BluetoothAdapter is the Bluetooth system service. If
- // getDefaultAdapter() returns null
- // then the device is not BT capable. Use BluetoothDevice.isEnabled()
- // to see if BT is enabled on the device.
- //
- // - BluetoothHeadset is the API for the control connection to a
- // Bluetooth Headset. This lets you completely connect/disconnect a
- // headset (which we don't do from the Phone UI!) but also lets you
- // get the address of the currently active headset and see whether
- // it's currently connected.
- //
- // - BluetoothHandsfree is the API to control the audio connection to
- // a bluetooth headset. We use this API to switch the headset on and
- // off when the user presses the "Bluetooth" button.
- // Our BluetoothHandsfree instance (mBluetoothHandsfree) is created
- // by the PhoneApp and will be null if the device is not BT capable.
- //
-
- /**
- * @return true if the Bluetooth on/off switch in the UI should be
- * available to the user (i.e. if the device is BT-capable
- * and a headset is connected.)
- */
- /* package */ boolean isBluetoothAvailable() {
- if (VDBG) log("isBluetoothAvailable()...");
- if (mBluetoothHandsfree == null) {
- // Device is not BT capable.
- if (VDBG) log(" ==> FALSE (not BT capable)");
- return false;
- }
-
- // There's no need to ask the Bluetooth system service if BT is enabled:
- //
- // BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
- // if ((adapter == null) || !adapter.isEnabled()) {
- // if (DBG) log(" ==> FALSE (BT not enabled)");
- // return false;
- // }
- // if (DBG) log(" - BT enabled! device name " + adapter.getName()
- // + ", address " + adapter.getAddress());
- //
- // ...since we already have a BluetoothHeadset instance. We can just
- // call isConnected() on that, and assume it'll be false if BT isn't
- // enabled at all.
-
- // Check if there's a connected headset, using the BluetoothHeadset API.
- boolean isConnected = false;
- if (mBluetoothHeadset != null) {
- if (VDBG) log(" - headset state = " + mBluetoothHeadset.getState());
- BluetoothDevice headset = mBluetoothHeadset.getCurrentHeadset();
- if (VDBG) log(" - headset address: " + headset);
- if (headset != null) {
- isConnected = mBluetoothHeadset.isConnected(headset);
- if (VDBG) log(" - isConnected: " + isConnected);
- }
- }
-
- if (VDBG) log(" ==> " + isConnected);
- return isConnected;
- }
-
- /**
- * @return true if a BT device is available, and its audio is currently connected.
- */
- /* package */ boolean isBluetoothAudioConnected() {
- if (mBluetoothHandsfree == null) {
- if (VDBG) log("isBluetoothAudioConnected: ==> FALSE (null mBluetoothHandsfree)");
- return false;
- }
- boolean isAudioOn = mBluetoothHandsfree.isAudioOn();
- if (VDBG) log("isBluetoothAudioConnected: ==> isAudioOn = " + isAudioOn);
- return isAudioOn;
- }
-
- /**
- * Helper method used to control the state of the green LED in the
- * "Bluetooth" menu item.
- *
- * @return true if a BT device is available and its audio is currently connected,
- * <b>or</b> if we issued a BluetoothHandsfree.userWantsAudioOn()
- * call within the last 5 seconds (which presumably means
- * that the BT audio connection is currently being set
- * up, and will be connected soon.)
- */
- /* package */ boolean isBluetoothAudioConnectedOrPending() {
- if (isBluetoothAudioConnected()) {
- if (VDBG) log("isBluetoothAudioConnectedOrPending: ==> TRUE (really connected)");
- return true;
- }
-
- // If we issued a userWantsAudioOn() call "recently enough", even
- // if BT isn't actually connected yet, let's still pretend BT is
- // on. This is how we make the green LED in the menu item turn on
- // right away.
- if (mBluetoothConnectionPending) {
- long timeSinceRequest =
- SystemClock.elapsedRealtime() - mBluetoothConnectionRequestTime;
- if (timeSinceRequest < 5000 /* 5 seconds */) {
- if (VDBG) log("isBluetoothAudioConnectedOrPending: ==> TRUE (requested "
- + timeSinceRequest + " msec ago)");
- return true;
- } else {
- if (VDBG) log("isBluetoothAudioConnectedOrPending: ==> FALSE (request too old: "
- + timeSinceRequest + " msec ago)");
- mBluetoothConnectionPending = false;
- return false;
- }
- }
-
- if (VDBG) log("isBluetoothAudioConnectedOrPending: ==> FALSE");
- return false;
- }
-
- /**
- * Posts a message to our handler saying to update the onscreen UI
- * based on a bluetooth headset state change.
- */
- /* package */ void requestUpdateBluetoothIndication() {
- if (VDBG) log("requestUpdateBluetoothIndication()...");
- // No need to look at the current state here; any UI elements that
- // care about the bluetooth state (i.e. the CallCard) get
- // the necessary state directly from PhoneApp.showBluetoothIndication().
- mHandler.removeMessages(REQUEST_UPDATE_BLUETOOTH_INDICATION);
- mHandler.sendEmptyMessage(REQUEST_UPDATE_BLUETOOTH_INDICATION);
- }
-
- private void dumpBluetoothState() {
- log("============== dumpBluetoothState() =============");
- log("= isBluetoothAvailable: " + isBluetoothAvailable());
- log("= isBluetoothAudioConnected: " + isBluetoothAudioConnected());
- log("= isBluetoothAudioConnectedOrPending: " + isBluetoothAudioConnectedOrPending());
- log("= PhoneApp.showBluetoothIndication: "
- + PhoneApp.getInstance().showBluetoothIndication());
- log("=");
- if (mBluetoothHandsfree != null) {
- log("= BluetoothHandsfree.isAudioOn: " + mBluetoothHandsfree.isAudioOn());
- if (mBluetoothHeadset != null) {
- BluetoothDevice headset = mBluetoothHeadset.getCurrentHeadset();
- log("= BluetoothHeadset.getCurrentHeadset: " + headset);
- if (headset != null) {
- log("= BluetoothHeadset.isConnected: "
- + mBluetoothHeadset.isConnected(headset));
- }
- } else {
- log("= mBluetoothHeadset is null");
- }
- } else {
- log("= mBluetoothHandsfree is null; device is not BT capable");
- }
- }
-
- /* package */ void connectBluetoothAudio() {
- if (VDBG) log("connectBluetoothAudio()...");
- if (mBluetoothHandsfree != null) {
- mBluetoothHandsfree.userWantsAudioOn();
- }
-
- // Watch out: The bluetooth connection doesn't happen instantly;
- // the userWantsAudioOn() call returns instantly but does its real
- // work in another thread. Also, in practice the BT connection
- // takes longer than MENU_DISMISS_DELAY to complete(!) so we need
- // a little trickery here to make the menu item's green LED update
- // instantly.
- // (See isBluetoothAudioConnectedOrPending() above.)
- mBluetoothConnectionPending = true;
- mBluetoothConnectionRequestTime = SystemClock.elapsedRealtime();
- }
-
- /* package */ void disconnectBluetoothAudio() {
- if (VDBG) log("disconnectBluetoothAudio()...");
- if (mBluetoothHandsfree != null) {
- mBluetoothHandsfree.userWantsAudioOff();
- }
- mBluetoothConnectionPending = false;
- }
-
- //
- // "Touch lock" UI.
- //
- // When the DTMF dialpad is up, after a certain amount of idle time we
- // display an overlay graphic on top of the dialpad and "lock" the
- // touch UI. (UI Rationale: We need *some* sort of screen lock, with
- // a fairly short timeout, to avoid false touches from the user's face
- // while in-call. But we *don't* want to do this by turning off the
- // screen completely, since that's confusing (the user can't tell
- // what's going on) *and* it's fairly cumbersome to have to hit MENU
- // to bring the screen back, rather than using some gesture on the
- // touch screen.)
- //
- // The user can dismiss the touch lock overlay by double-tapping on
- // the central "lock" icon. Also, the touch lock overlay will go away
- // by itself if the DTMF dialpad is dismissed for any reason, such as
- // the current call getting disconnected (see onDialerClose()).
- //
- // This entire feature is disabled on devices which use a proximity
- // sensor to turn the screen off while in-call.
- //
-
- /**
- * Initializes the "touch lock" UI widgets. We do this lazily
- * to avoid slowing down the initial launch of the InCallScreen.
- */
- private void initTouchLock() {
- if (VDBG) log("initTouchLock()...");
- if (mTouchLockOverlay != null) {
- Log.w(LOG_TAG, "initTouchLock: already initialized!");
- return;
- }
-
- if (!mUseTouchLockOverlay) {
- Log.w(LOG_TAG, "initTouchLock: touch lock isn't used on this device!");
- return;
- }
-
- mTouchLockOverlay = (View) findViewById(R.id.touchLockOverlay);
- // Note mTouchLockOverlay's visibility is initially GONE.
- mTouchLockIcon = (View) findViewById(R.id.touchLockIcon);
-
- // Handle touch events. (Basically mTouchLockOverlay consumes and
- // discards any touch events it sees, and mTouchLockIcon listens
- // for the "double-tap to unlock" gesture.)
- mTouchLockOverlay.setOnTouchListener(this);
- mTouchLockIcon.setOnTouchListener(this);
-
- mTouchLockFadeIn = AnimationUtils.loadAnimation(this, R.anim.touch_lock_fade_in);
- }
-
- private boolean isTouchLocked() {
- return mUseTouchLockOverlay
- && (mTouchLockOverlay != null)
- && (mTouchLockOverlay.getVisibility() == View.VISIBLE);
- }
-
- /**
- * Enables or disables the "touch lock" overlay on top of the DTMF dialpad.
- *
- * If enable=true, bring up the overlay immediately using an animated
- * fade-in effect. (Or do nothing if the overlay isn't appropriate
- * right now, like if the dialpad isn't up, or the speaker is on.)
- *
- * If enable=false, immediately take down the overlay. (Or do nothing
- * if the overlay isn't actually up right now.)
- *
- * Note that with enable=false this method will *not* automatically
- * start the touch lock timer. (So when taking down the overlay while
- * the dialer is still up, the caller is also responsible for calling
- * resetTouchLockTimer(), to make sure the overlay will get
- * (re-)enabled later.)
- *
- */
- private void enableTouchLock(boolean enable) {
- if (VDBG) log("enableTouchLock(" + enable + ")...");
- if (enable) {
- // We shouldn't have even gotten here if we don't use the
- // touch lock overlay feature at all on this device.
- if (!mUseTouchLockOverlay) {
- Log.w(LOG_TAG, "enableTouchLock: touch lock isn't used on this device!");
- return;
- }
-
- // The "touch lock" overlay is only ever used on top of the
- // DTMF dialpad.
- if (!mDialer.isOpened()) {
- if (VDBG) log("enableTouchLock: dialpad isn't up, no need to lock screen.");
- return;
- }
-
- // Also, the "touch lock" overlay NEVER appears if the speaker is in use.
- if (PhoneUtils.isSpeakerOn(this)) {
- if (VDBG) log("enableTouchLock: speaker is on, no need to lock screen.");
- return;
- }
-
- // Initialize the UI elements if necessary.
- if (mTouchLockOverlay == null) {
- initTouchLock();
- }
-
- // First take down the menu if it's up (since it's confusing
- // to see a touchable menu *above* the touch lock overlay.)
- // Note dismissMenu() has no effect if the menu is already closed.
- dismissMenu(true); // dismissImmediate = true
-
- // Bring up the touch lock overlay (with an animated fade)
- mTouchLockOverlay.setVisibility(View.VISIBLE);
- mTouchLockOverlay.startAnimation(mTouchLockFadeIn);
- } else {
- // TODO: it might be nice to immediately kill the animation if
- // we're in the middle of fading-in:
- // if (mTouchLockFadeIn.hasStarted() && !mTouchLockFadeIn.hasEnded()) {
- // mTouchLockOverlay.clearAnimation();
- // }
- // but the fade-in is so quick that this probably isn't necessary.
-
- // Take down the touch lock overlay (immediately)
- if (mTouchLockOverlay != null) mTouchLockOverlay.setVisibility(View.GONE);
- }
- }
-
- /**
- * Schedule the "touch lock" overlay to begin fading in after a short
- * delay, but only if the DTMF dialpad is currently visible.
- *
- * (This is designed to be triggered on any user activity
- * while the dialpad is up but not locked, and also
- * whenever the user "unlocks" the touch lock overlay.)
- *
- * Calling this method supersedes any previous resetTouchLockTimer()
- * calls (i.e. we first clear any pending TOUCH_LOCK_TIMER messages.)
- */
- private void resetTouchLockTimer() {
- if (VDBG) log("resetTouchLockTimer()...");
-
- // This is a no-op if this device doesn't use the touch lock
- // overlay feature at all.
- if (!mUseTouchLockOverlay) return;
-
- mHandler.removeMessages(TOUCH_LOCK_TIMER);
- if (mDialer.isOpened() && !isTouchLocked()) {
- // The touch lock delay value comes from Gservices; we use
- // the same value that's used for the PowerManager's
- // POKE_LOCK_SHORT_TIMEOUT flag (i.e. the fastest possible
- // screen timeout behavior.)
-
- // Do a fresh lookup each time, since settings values can
- // change on the fly. (The Settings.Secure helper class
- // caches these values so this call is usually cheap.)
- int touchLockDelay = Settings.Secure.getInt(
- getContentResolver(),
- Settings.Secure.SHORT_KEYLIGHT_DELAY_MS,
- TOUCH_LOCK_DELAY_DEFAULT);
- mHandler.sendEmptyMessageDelayed(TOUCH_LOCK_TIMER, touchLockDelay);
- }
- }
-
- /**
- * Handles the TOUCH_LOCK_TIMER event.
- * @see resetTouchLockTimer
- */
- private void touchLockTimerExpired() {
- // Ok, it's been long enough since we had any user activity with
- // the DTMF dialpad up. If the dialpad is still up, start fading
- // in the "touch lock" overlay.
- enableTouchLock(true);
- }
-
- // View.OnTouchListener implementation
- public boolean onTouch(View v, MotionEvent event) {
- if (VDBG) log ("onTouch(View " + v + ")...");
-
- // Handle touch events on the "touch lock" overlay.
- if ((v == mTouchLockIcon) || (v == mTouchLockOverlay)) {
-
- // TODO: move this big hunk of code to a helper function, or
- // even better out to a separate helper class containing all
- // the touch lock overlay code.
-
- // We only care about these touches while the touch lock UI is
- // visible (including the time during the fade-in animation.)
- if (!isTouchLocked()) {
- // Got an event from the touch lock UI, but we're not locked!
- // (This was probably a touch-UP right after we unlocked.
- // Ignore it.)
- return false;
- }
-
- // (v == mTouchLockIcon) means the user hit the lock icon in the
- // middle of the screen, and (v == mTouchLockOverlay) is a touch
- // anywhere else on the overlay.
-
- if (v == mTouchLockIcon) {
- // Direct hit on the "lock" icon. Handle the double-tap gesture.
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- long now = SystemClock.uptimeMillis();
- if (VDBG) log("- touch lock icon: handling a DOWN event, t = " + now);
-
- // Look for the double-tap gesture:
- if (now < mTouchLockLastTouchTime + ViewConfiguration.getDoubleTapTimeout()) {
- if (VDBG) log("==> touch lock icon: DOUBLE-TAP!");
- // This was the 2nd tap of a double-tap gesture.
- // Take down the touch lock overlay, but post a
- // message in the future to bring it back later.
- enableTouchLock(false);
- resetTouchLockTimer();
- // This counts as explicit "user activity".
- PhoneApp.getInstance().pokeUserActivity();
- }
- } else if (event.getAction() == MotionEvent.ACTION_UP) {
- // Stash away the current time in case this is the first
- // tap of a double-tap gesture. (We measure the time from
- // the first tap's UP to the second tap's DOWN.)
- mTouchLockLastTouchTime = SystemClock.uptimeMillis();
- }
-
- // And regardless of what just happened, we *always* consume
- // touch events while the touch lock UI is (or was) visible.
- return true;
-
- } else { // (v == mTouchLockOverlay)
- // User touched the "background" area of the touch lock overlay.
-
- // TODO: If we're in the middle of the fade-in animation,
- // consider making a touch *anywhere* immediately unlock the
- // UI. This could be risky, though, if the user tries to
- // *double-tap* during the fade-in (in which case the 2nd tap
- // might 't become a false touch on the dialpad!)
- //
- //if (event.getAction() == MotionEvent.ACTION_DOWN) {
- // if (DBG) log("- touch lock overlay background: handling a DOWN event.");
- //
- // if (mTouchLockFadeIn.hasStarted() && !mTouchLockFadeIn.hasEnded()) {
- // // If we're still fading-in, a touch *anywhere* onscreen
- // // immediately unlocks.
- // if (DBG) log("==> touch lock: tap during fade-in!");
- //
- // mTouchLockOverlay.clearAnimation();
- // enableTouchLock(false);
- // // ...but post a message in the future to bring it
- // // back later.
- // resetTouchLockTimer();
- // }
- //}
-
- // And regardless of what just happened, we *always* consume
- // touch events while the touch lock UI is (or was) visible.
- return true;
- }
- } else {
- Log.w(LOG_TAG, "onTouch: event from unexpected View: " + v);
- return false;
- }
- }
-
- // Any user activity while the dialpad is up, but not locked, should
- // reset the touch lock timer back to the full delay amount.
- @Override
- public void onUserInteraction() {
- if (mDialer.isOpened() && !isTouchLocked()) {
- resetTouchLockTimer();
- }
- }
-
- /**
- * Posts a handler message telling the InCallScreen to close
- * the OTA failure notice after the specified delay.
- * @see OtaUtils.otaShowProgramFailureNotice
- */
- /* package */ void requestCloseOtaFailureNotice(long timeout) {
- if (DBG) log("requestCloseOtaFailureNotice() with timeout: " + timeout);
- mHandler.sendEmptyMessageDelayed(REQUEST_CLOSE_OTA_FAILURE_NOTICE, timeout);
-
- // TODO: we probably ought to call removeMessages() for this
- // message code in either onPause or onResume, just to be 100%
- // sure that the message we just posted has no way to affect a
- // *different* call if the user quickly backs out and restarts.
- // (This is also true for requestCloseSpcErrorNotice() below, and
- // probably anywhere else we use mHandler.sendEmptyMessageDelayed().)
- }
-
- /**
- * Posts a handler message telling the InCallScreen to close
- * the SPC error notice after the specified delay.
- * @see OtaUtils.otaShowSpcErrorNotice
- */
- /* package */ void requestCloseSpcErrorNotice(long timeout) {
- if (DBG) log("requestCloseSpcErrorNotice() with timeout: " + timeout);
- mHandler.sendEmptyMessageDelayed(REQUEST_CLOSE_SPC_ERROR_NOTICE, timeout);
- }
-
- public boolean isOtaCallInActiveState() {
- final PhoneApp app = PhoneApp.getInstance();
- if ((mInCallScreenMode == InCallScreenMode.OTA_NORMAL)
- || ((app.cdmaOtaScreenState != null)
- && (app.cdmaOtaScreenState.otaScreenState ==
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION))) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Handle OTA Call End scenario when display becomes dark during OTA Call
- * and InCallScreen is in pause mode. CallNotifier will listen for call
- * end indication and call this api to handle OTA Call end scenario
- */
- public void handleOtaCallEnd() {
- final PhoneApp app = PhoneApp.getInstance();
-
- if (DBG) log("handleOtaCallEnd entering");
- if (((mInCallScreenMode == InCallScreenMode.OTA_NORMAL)
- || ((app.cdmaOtaScreenState != null)
- && (app.cdmaOtaScreenState.otaScreenState !=
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED)))
- && ((app.cdmaOtaProvisionData != null)
- && (!app.cdmaOtaProvisionData.inOtaSpcState))) {
- if (DBG) log("handleOtaCallEnd - Set OTA Call End stater");
- setInCallScreenMode(InCallScreenMode.OTA_ENDED);
- updateScreen();
- }
- }
-
- public boolean isOtaCallInEndState() {
- return (mInCallScreenMode == InCallScreenMode.OTA_ENDED);
- }
-
- /**
- * Checks to see if the current call is a CDMA OTA Call, based on the
- * action of the specified intent and OTA Screen state information.
- *
- * The OTA call is a CDMA-specific concept, so this method will
- * always return false on a GSM phone.
- */
- private boolean checkIsOtaCall(Intent intent) {
- if (VDBG) log("checkIsOtaCall...");
-
- if (intent == null || intent.getAction() == null) {
- return false;
- }
-
- if (mPhone.getPhoneType() != Phone.PHONE_TYPE_CDMA) {
- return false;
- }
-
- final PhoneApp app = PhoneApp.getInstance();
-
- if ((app.cdmaOtaScreenState == null)
- || (app.cdmaOtaProvisionData == null)) {
- if (DBG) log("checkIsOtaCall: OtaUtils.CdmaOtaScreenState not initialized");
- return false;
- }
-
- String action = intent.getAction();
- boolean isOtaCall = false;
- if (action.equals(ACTION_SHOW_ACTIVATION)) {
- if (DBG) log("checkIsOtaCall action = ACTION_SHOW_ACTIVATION");
- if (!app.cdmaOtaProvisionData.isOtaCallIntentProcessed) {
- if (DBG) log("checkIsOtaCall: ACTION_SHOW_ACTIVATION is not handled before");
- app.cdmaOtaProvisionData.isOtaCallIntentProcessed = true;
- app.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION;
- }
- isOtaCall = true;
- } else if (action.equals(Intent.ACTION_CALL)
- || action.equals(Intent.ACTION_CALL_EMERGENCY)) {
- String number;
- try {
- number = getInitialNumber(intent);
- } catch (PhoneUtils.VoiceMailNumberMissingException ex) {
- if (DBG) log("Error retrieving number using the api getInitialNumber()");
- return false;
- }
- if (mPhone.isOtaSpNumber(number)) {
- if (DBG) log("checkIsOtaCall action ACTION_CALL, it is valid OTA number");
- isOtaCall = true;
- }
- } else if (action.equals(intent.ACTION_MAIN)) {
- if (DBG) log("checkIsOtaCall action ACTION_MAIN");
- boolean isRingingCall = !mRingingCall.isIdle();
- if (isRingingCall) {
- if (DBG) log("checkIsOtaCall isRingingCall: " + isRingingCall);
- return false;
- } else if ((app.cdmaOtaInCallScreenUiState.state
- == CdmaOtaInCallScreenUiState.State.NORMAL)
- || (app.cdmaOtaInCallScreenUiState.state
- == CdmaOtaInCallScreenUiState.State.ENDED)) {
- if (DBG) log("checkIsOtaCall action ACTION_MAIN, OTA call already in progress");
- isOtaCall = true;
- } else {
- if (app.cdmaOtaScreenState.otaScreenState !=
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED) {
- if (DBG) log("checkIsOtaCall action ACTION_MAIN, "
- + "OTA call in progress with UNDEFINED");
- isOtaCall = true;
- }
- }
- }
-
- if (DBG) log("checkIsOtaCall: isOtaCall =" + isOtaCall);
- if (isOtaCall && (otaUtils == null)) {
- if (DBG) log("checkIsOtaCall: creating OtaUtils...");
- otaUtils = new OtaUtils(getApplicationContext(),
- this, mInCallPanel, mCallCard, mDialer);
- }
- return isOtaCall;
- }
-
- /**
- * Initialize the OTA State and UI.
- *
- * On Resume, this function is called to check if current call is
- * OTA Call and if it is OTA Call, create OtaUtil object and set
- * InCallScreenMode to OTA Call mode (OTA_NORMAL or OTA_ENDED).
- * As part of initialization, OTA Call Card is inflated.
- * OtaUtil object provides utility apis that InCallScreen calls for OTA Call UI
- * rendering, handling of touck/key events on OTA Screens and handling of
- * Framework events that result in OTA State change
- *
- * @return: true if we are in an OtaCall
- */
- private boolean initOtaState() {
- boolean inOtaCall = false;
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- final PhoneApp app = PhoneApp.getInstance();
-
- if ((app.cdmaOtaScreenState == null) || (app.cdmaOtaProvisionData == null)) {
- if (DBG) log("initOtaState func - All CdmaOTA utility classes not initialized");
- return false;
- }
-
- inOtaCall = checkIsOtaCall(getIntent());
- if (inOtaCall) {
- OtaUtils.CdmaOtaInCallScreenUiState.State cdmaOtaInCallScreenState =
- otaUtils.getCdmaOtaInCallScreenUiState();
- if (cdmaOtaInCallScreenState == OtaUtils.CdmaOtaInCallScreenUiState.State.NORMAL) {
- if (DBG) log("initOtaState - in OTA Normal mode");
- setInCallScreenMode(InCallScreenMode.OTA_NORMAL);
- } else if (cdmaOtaInCallScreenState ==
- OtaUtils.CdmaOtaInCallScreenUiState.State.ENDED) {
- if (DBG) log("initOtaState - in OTA END mode");
- setInCallScreenMode(InCallScreenMode.OTA_ENDED);
- } else if (app.cdmaOtaScreenState.otaScreenState ==
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG) {
- if (DBG) log("initOtaState - set OTA END Mode");
- setInCallScreenMode(InCallScreenMode.OTA_ENDED);
- } else {
- if (DBG) log("initOtaState - Set OTA NORMAL Mode");
- setInCallScreenMode(InCallScreenMode.OTA_NORMAL);
- }
- } else {
- if (otaUtils != null) {
- otaUtils.cleanOtaScreen(false);
- }
- }
- }
- return inOtaCall;
- }
-
- public void updateMenuItems() {
- if (mInCallMenu != null) {
- boolean okToShowMenu = mInCallMenu.updateItems(PhoneApp.getInstance().phone);
- if (!okToShowMenu) {
- dismissMenu(true);
- }
- }
- }
-
- /**
- * Updates and returns the InCallControlState instance.
- */
- public InCallControlState getUpdatedInCallControlState() {
- mInCallControlState.update();
- return mInCallControlState;
- }
-
- /**
- * Updates the background of the InCallScreen to indicate the state of
- * the current call(s).
- */
- private void updateInCallBackground() {
- final boolean hasRingingCall = !mRingingCall.isIdle();
- final boolean hasActiveCall = !mForegroundCall.isIdle();
- final boolean hasHoldingCall = !mPhone.getBackgroundCall().isIdle();
- final PhoneApp app = PhoneApp.getInstance();
- final boolean bluetoothActive = app.showBluetoothIndication();
-
- int backgroundResId = R.drawable.bg_in_call_gradient_unidentified;
-
- // Possible states of the background are:
- // - bg_in_call_gradient_bluetooth.9.png // blue
- // - bg_in_call_gradient_connected.9.png // green
- // - bg_in_call_gradient_ended.9.png // red
- // - bg_in_call_gradient_on_hold.9.png // orange
- // - bg_in_call_gradient_unidentified.9.png // gray
-
- if (hasRingingCall) {
- // There's an INCOMING (or WAITING) call.
- if (bluetoothActive) {
- backgroundResId = R.drawable.bg_in_call_gradient_bluetooth;
- } else {
- backgroundResId = R.drawable.bg_in_call_gradient_unidentified;
- }
- } else if (hasHoldingCall && !hasActiveCall) {
- // No foreground call, but there is a call on hold.
- backgroundResId = R.drawable.bg_in_call_gradient_on_hold;
- } else {
- // In all cases other than "ringing" and "on hold", the state
- // of the foreground call determines the background.
- final Call.State fgState = mForegroundCall.getState();
- switch (fgState) {
- case ACTIVE:
- case DISCONNECTING: // Call will disconnect soon, but keep showing
- // the normal "connected" background for now.
- if (bluetoothActive) {
- backgroundResId = R.drawable.bg_in_call_gradient_bluetooth;
- } else {
- backgroundResId = R.drawable.bg_in_call_gradient_connected;
- }
- break;
-
- case DISCONNECTED:
- backgroundResId = R.drawable.bg_in_call_gradient_ended;
- break;
-
- case DIALING:
- case ALERTING:
- if (bluetoothActive) {
- backgroundResId = R.drawable.bg_in_call_gradient_bluetooth;
- } else {
- backgroundResId = R.drawable.bg_in_call_gradient_unidentified;
- }
- break;
-
- default:
- // Foreground call is (presumably) IDLE.
- // We're not usually here at all in this state, but
- // this *does* happen in some unusual cases (like
- // while displaying an MMI result).
- // Use the most generic background.
- backgroundResId = R.drawable.bg_in_call_gradient_unidentified;
- break;
- }
- }
- mMainFrame.setBackgroundResource(backgroundResId);
- }
-
- public void resetInCallScreenMode() {
- if (DBG) log("resetInCallScreenMode - InCallScreenMode set to UNDEFINED");
- setInCallScreenMode(InCallScreenMode.UNDEFINED);
- }
-
- /**
- * Clear all the fields related to the provider support.
- */
- private void clearProvider() {
- mProviderOverlayVisible = false;
- mProviderLabel = null;
- mProviderIcon = null;
- mProviderGatewayUri = null;
- mProviderAddress = null;
- }
-
- /**
- * Updates the onscreen hint displayed while the user is dragging one
- * of the handles of the RotarySelector widget used for incoming
- * calls.
- *
- * @param hintTextResId resource ID of the hint text to display,
- * or 0 if no hint should be visible.
- * @param hintColorResId resource ID for the color of the hint text
- */
- /* package */ void updateSlidingTabHint(int hintTextResId, int hintColorResId) {
- if (VDBG) log("updateRotarySelectorHint(" + hintTextResId + ")...");
- if (mCallCard != null) {
- mCallCard.setRotarySelectorHint(hintTextResId, hintColorResId);
- mCallCard.updateState(mPhone);
- // TODO: if hintTextResId == 0, consider NOT clearing the onscreen
- // hint right away, but instead post a delayed handler message to
- // keep it onscreen for an extra second or two. (This might make
- // the hint more helpful if the user quickly taps one of the
- // handles without dragging at all...)
- // (Or, maybe this should happen completely within the RotarySelector
- // widget, since the widget itself probably wants to keep the colored
- // arrow visible for some extra time also...)
- }
- }
-
- @Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.dispatchPopulateAccessibilityEvent(event);
- mCallCard.dispatchPopulateAccessibilityEvent(event);
- return true;
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/InCallScreenShowActivation.java b/phone/src/com/android/phone2/InCallScreenShowActivation.java
deleted file mode 100644
index 37a01bf..0000000
--- a/phone/src/com/android/phone2/InCallScreenShowActivation.java
+++ /dev/null
@@ -1,60 +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.phone2;
-
-import com.android.internal.telephony.Phone;
-
-import android.app.Activity;
-import android.app.PendingIntent;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-
-/**
- * Trampoline to InCallScreen protected by PERFORM_CDMA_PROVISIONING permission
- * to only expose SHOW_ACTIVATION.
- */
-public class InCallScreenShowActivation extends Activity {
- private static final String LOG_TAG = "InCallScreenShowActivation";
-
- // the pending intent we'll use to report the user skipped provisioning
- // Note: this constant must match the one defined in SetupWizardActivity
- private static final String EXTRA_USER_SKIP_PENDING_INTENT = "ota_user_skip_pending_intent";
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- Intent intent = getIntent();
- if (intent.getAction().equals(InCallScreen.ACTION_SHOW_ACTIVATION)) {
- Intent newIntent = new Intent().setClass(this, InCallScreen.class)
- .setAction(InCallScreen.ACTION_SHOW_ACTIVATION);
-
- // tuck away the pending intent to send later if the user skips provisioning
- PhoneApp app = PhoneApp.getInstance();
- app.cdmaOtaInCallScreenUiState.reportSkipPendingIntent = (PendingIntent) intent
- .getParcelableExtra(EXTRA_USER_SKIP_PENDING_INTENT);
-
- startActivity(newIntent);
- } else {
- Log.e(LOG_TAG, "Inappropriate launch of InCallScreenShowActivation");
- }
-
- finish();
- }
-
-}
diff --git a/phone/src/com/android/phone2/InCallTouchUi.java b/phone/src/com/android/phone2/InCallTouchUi.java
deleted file mode 100644
index 1488caf..0000000
--- a/phone/src/com/android/phone2/InCallTouchUi.java
+++ /dev/null
@@ -1,777 +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.phone2;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.os.SystemClock;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.Animation.AnimationListener;
-import android.widget.Button;
-import android.widget.FrameLayout;
-import android.widget.ImageButton;
-import android.widget.TextView;
-import android.widget.ToggleButton;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.Phone;
-import com.android.internal.widget.SlidingTab;
-
-
-/**
- * In-call onscreen touch UI elements, used on some platforms.
- *
- * This widget is a fullscreen overlay, drawn on top of the
- * non-touch-sensitive parts of the in-call UI (i.e. the call card).
- */
-public class InCallTouchUi extends FrameLayout
- implements View.OnClickListener, SlidingTab.OnTriggerListener {
- private static final int IN_CALL_WIDGET_TRANSITION_TIME = 250; // in ms
- private static final String LOG_TAG = "InCallTouchUi";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- /**
- * Reference to the InCallScreen activity that owns us. This may be
- * null if we haven't been initialized yet *or* after the InCallScreen
- * activity has been destroyed.
- */
- private InCallScreen mInCallScreen;
-
- // Phone app instance
- private PhoneApp mApplication;
-
- // UI containers / elements
- private SlidingTab mIncomingCallWidget; // UI used for an incoming call
- private View mInCallControls; // UI elements while on a regular call
- //
- private Button mAddButton;
- private Button mMergeButton;
- private Button mEndButton;
- private Button mDialpadButton;
- private ToggleButton mBluetoothButton;
- private ToggleButton mMuteButton;
- private ToggleButton mSpeakerButton;
- //
- private View mHoldButtonContainer;
- private ImageButton mHoldButton;
- private TextView mHoldButtonLabel;
- private View mSwapButtonContainer;
- private ImageButton mSwapButton;
- private TextView mSwapButtonLabel;
- private View mCdmaMergeButtonContainer;
- private ImageButton mCdmaMergeButton;
- //
- private Drawable mHoldIcon;
- private Drawable mUnholdIcon;
- private Drawable mShowDialpadIcon;
- private Drawable mHideDialpadIcon;
-
- // Time of the most recent "answer" or "reject" action (see updateState())
- private long mLastIncomingCallActionTime; // in SystemClock.uptimeMillis() time base
-
- // Overall enabledness of the "touch UI" features
- private boolean mAllowIncomingCallTouchUi;
- private boolean mAllowInCallTouchUi;
-
- public InCallTouchUi(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- if (DBG) log("InCallTouchUi constructor...");
- if (DBG) log("- this = " + this);
- if (DBG) log("- context " + context + ", attrs " + attrs);
-
- // Inflate our contents, and add it (to ourself) as a child.
- LayoutInflater inflater = LayoutInflater.from(context);
- inflater.inflate(
- R.layout.incall_touch_ui, // resource
- this, // root
- true);
-
- mApplication = PhoneApp.getInstance();
-
- // The various touch UI features are enabled on a per-product
- // basis. (These flags in config.xml may be overridden by
- // product-specific overlay files.)
-
- mAllowIncomingCallTouchUi = getResources().getBoolean(R.bool.allow_incoming_call_touch_ui);
- if (DBG) log("- incoming call touch UI: "
- + (mAllowIncomingCallTouchUi ? "ENABLED" : "DISABLED"));
- mAllowInCallTouchUi = getResources().getBoolean(R.bool.allow_in_call_touch_ui);
- if (DBG) log("- regular in-call touch UI: "
- + (mAllowInCallTouchUi ? "ENABLED" : "DISABLED"));
- }
-
- void setInCallScreenInstance(InCallScreen inCallScreen) {
- mInCallScreen = inCallScreen;
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- if (DBG) log("InCallTouchUi onFinishInflate(this = " + this + ")...");
-
- // Look up the various UI elements.
-
- // "Dial-to-answer" widget for incoming calls.
- mIncomingCallWidget = (SlidingTab) findViewById(R.id.incomingCallWidget);
- mIncomingCallWidget.setLeftTabResources(
- R.drawable.ic_jog_dial_answer,
- com.android.internal.R.drawable.jog_tab_target_green,
- com.android.internal.R.drawable.jog_tab_bar_left_answer,
- com.android.internal.R.drawable.jog_tab_left_answer
- );
- mIncomingCallWidget.setRightTabResources(
- R.drawable.ic_jog_dial_decline,
- com.android.internal.R.drawable.jog_tab_target_red,
- com.android.internal.R.drawable.jog_tab_bar_right_decline,
- com.android.internal.R.drawable.jog_tab_right_decline
- );
-
- // For now, we only need to show two states: answer and decline.
- mIncomingCallWidget.setLeftHintText(R.string.slide_to_answer_hint);
- mIncomingCallWidget.setRightHintText(R.string.slide_to_decline_hint);
-
- mIncomingCallWidget.setOnTriggerListener(this);
-
- // Container for the UI elements shown while on a regular call.
- mInCallControls = findViewById(R.id.inCallControls);
-
- // Regular (single-tap) buttons, where we listen for click events:
- // Main cluster of buttons:
- mAddButton = (Button) mInCallControls.findViewById(R.id.addButton);
- mAddButton.setOnClickListener(this);
- mMergeButton = (Button) mInCallControls.findViewById(R.id.mergeButton);
- mMergeButton.setOnClickListener(this);
- mEndButton = (Button) mInCallControls.findViewById(R.id.endButton);
- mEndButton.setOnClickListener(this);
- mDialpadButton = (Button) mInCallControls.findViewById(R.id.dialpadButton);
- mDialpadButton.setOnClickListener(this);
- mBluetoothButton = (ToggleButton) mInCallControls.findViewById(R.id.bluetoothButton);
- mBluetoothButton.setOnClickListener(this);
- mMuteButton = (ToggleButton) mInCallControls.findViewById(R.id.muteButton);
- mMuteButton.setOnClickListener(this);
- mSpeakerButton = (ToggleButton) mInCallControls.findViewById(R.id.speakerButton);
- mSpeakerButton.setOnClickListener(this);
-
- // Upper corner buttons:
- mHoldButtonContainer = mInCallControls.findViewById(R.id.holdButtonContainer);
- mHoldButton = (ImageButton) mInCallControls.findViewById(R.id.holdButton);
- mHoldButton.setOnClickListener(this);
- mHoldButtonLabel = (TextView) mInCallControls.findViewById(R.id.holdButtonLabel);
- //
- mSwapButtonContainer = mInCallControls.findViewById(R.id.swapButtonContainer);
- mSwapButton = (ImageButton) mInCallControls.findViewById(R.id.swapButton);
- mSwapButton.setOnClickListener(this);
- mSwapButtonLabel = (TextView) mInCallControls.findViewById(R.id.swapButtonLabel);
- if (PhoneApp.getInstance().phone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- // In CDMA we use a generalized text - "Manage call", as behavior on selecting
- // this option depends entirely on what the current call state is.
- mSwapButtonLabel.setText(R.string.onscreenManageCallsText);
- } else {
- mSwapButtonLabel.setText(R.string.onscreenSwapCallsText);
- }
- //
- mCdmaMergeButtonContainer = mInCallControls.findViewById(R.id.cdmaMergeButtonContainer);
- mCdmaMergeButton = (ImageButton) mInCallControls.findViewById(R.id.cdmaMergeButton);
- mCdmaMergeButton.setOnClickListener(this);
-
- // Add a custom OnTouchListener to manually shrink the "hit
- // target" of some buttons.
- // (We do this for a few specific buttons which are vulnerable to
- // "false touches" because either (1) they're near the edge of the
- // screen and might be unintentionally touched while holding the
- // device in your hand, or (2) they're in the upper corners and might
- // be touched by the user's ear before the prox sensor has a chance to
- // kick in.)
- View.OnTouchListener smallerHitTargetTouchListener = new SmallerHitTargetTouchListener();
- mAddButton.setOnTouchListener(smallerHitTargetTouchListener);
- mMergeButton.setOnTouchListener(smallerHitTargetTouchListener);
- mDialpadButton.setOnTouchListener(smallerHitTargetTouchListener);
- mBluetoothButton.setOnTouchListener(smallerHitTargetTouchListener);
- mSpeakerButton.setOnTouchListener(smallerHitTargetTouchListener);
- mHoldButton.setOnTouchListener(smallerHitTargetTouchListener);
- mSwapButton.setOnTouchListener(smallerHitTargetTouchListener);
- mCdmaMergeButton.setOnTouchListener(smallerHitTargetTouchListener);
- mSpeakerButton.setOnTouchListener(smallerHitTargetTouchListener);
-
- // Icons we need to change dynamically. (Most other icons are specified
- // directly in incall_touch_ui.xml.)
- mHoldIcon = getResources().getDrawable(R.drawable.ic_in_call_touch_round_hold);
- mUnholdIcon = getResources().getDrawable(R.drawable.ic_in_call_touch_round_unhold);
- mShowDialpadIcon = getResources().getDrawable(R.drawable.ic_in_call_touch_dialpad);
- mHideDialpadIcon = getResources().getDrawable(R.drawable.ic_in_call_touch_dialpad_close);
- }
-
- /**
- * Updates the visibility and/or state of our UI elements, based on
- * the current state of the phone.
- */
- void updateState(Phone phone) {
- if (DBG) log("updateState(" + phone + ")...");
-
- if (mInCallScreen == null) {
- log("- updateState: mInCallScreen has been destroyed; bailing out...");
- return;
- }
-
- Phone.State state = phone.getState(); // IDLE, RINGING, or OFFHOOK
- if (DBG) log("- updateState: phone state is " + state);
-
- boolean showIncomingCallControls = false;
- boolean showInCallControls = false;
-
- if (state == Phone.State.RINGING) {
- // A phone call is ringing *or* call waiting.
- if (mAllowIncomingCallTouchUi) {
- // Watch out: even if the phone state is RINGING, it's
- // possible for the ringing call to be in the DISCONNECTING
- // state. (This typically happens immediately after the user
- // rejects an incoming call, and in that case we *don't* show
- // the incoming call controls.)
- final Call ringingCall = phone.getRingingCall();
- if (ringingCall.getState().isAlive()) {
- if (DBG) log("- updateState: RINGING! Showing incoming call controls...");
- showIncomingCallControls = true;
- }
-
- // Ugly hack to cover up slow response from the radio:
- // if we attempted to answer or reject an incoming call
- // within the last 500 msec, *don't* show the incoming call
- // UI even if the phone is still in the RINGING state.
- /*
- long now = SystemClock.uptimeMillis();
- if (now < mLastIncomingCallActionTime + 500) {
- log("updateState: Too soon after last action; not drawing!"
- + (now - mLastIncomingCallActionTime) + " / " + (mLastIncomingCallActionTime/100));
- showIncomingCallControls = false;
- }
- */
-
- // TODO: UI design issue: if the device is NOT currently
- // locked, we probably don't need to make the user
- // double-tap the "incoming call" buttons. (The device
- // presumably isn't in a pocket or purse, so we don't need
- // to worry about false touches while it's ringing.)
- // But OTOH having "inconsistent" buttons might just make
- // it *more* confusing.
- }
- } else {
- if (mAllowInCallTouchUi) {
- // Ok, the in-call touch UI is available on this platform,
- // so make it visible (with some exceptions):
- if (mInCallScreen.okToShowInCallTouchUi()) {
- showInCallControls = true;
- } else {
- if (DBG) log("- updateState: NOT OK to show touch UI; disabling...");
- }
- }
- }
-
- if (showInCallControls) {
- updateInCallControls(phone);
- }
-
- if (showIncomingCallControls && showInCallControls) {
- throw new IllegalStateException(
- "'Incoming' and 'in-call' touch controls visible at the same time!");
- }
-
- if (showIncomingCallControls) {
- showIncomingCallWidget();
- } else {
- hideIncomingCallWidget();
- }
-
- mInCallControls.setVisibility(showInCallControls ? View.VISIBLE : View.GONE);
-
- // TODO: As an optimization, also consider setting the visibility
- // of the overall InCallTouchUi widget to GONE if *nothing at all*
- // is visible right now.
- }
-
- // View.OnClickListener implementation
- public void onClick(View view) {
- int id = view.getId();
- if (DBG) log("onClick(View " + view + ", id " + id + ")...");
-
- switch (id) {
- case R.id.addButton:
- case R.id.mergeButton:
- case R.id.endButton:
- case R.id.dialpadButton:
- case R.id.bluetoothButton:
- case R.id.muteButton:
- case R.id.speakerButton:
- case R.id.holdButton:
- case R.id.swapButton:
- case R.id.cdmaMergeButton:
- // Clicks on the regular onscreen buttons get forwarded
- // straight to the InCallScreen.
- mInCallScreen.handleOnscreenButtonClick(id);
- break;
-
- default:
- Log.w(LOG_TAG, "onClick: unexpected click: View " + view + ", id " + id);
- break;
- }
- }
-
- /**
- * Updates the enabledness and "checked" state of the buttons on the
- * "inCallControls" panel, based on the current telephony state.
- */
- void updateInCallControls(Phone phone) {
- int phoneType = phone.getPhoneType();
- // Note we do NOT need to worry here about cases where the entire
- // in-call touch UI is disabled, like during an OTA call or if the
- // dtmf dialpad is up. (That's handled by updateState(), which
- // calls InCallScreen.okToShowInCallTouchUi().)
- //
- // If we get here, it *is* OK to show the in-call touch UI, so we
- // now need to update the enabledness and/or "checked" state of
- // each individual button.
- //
-
- // The InCallControlState object tells us the enabledness and/or
- // state of the various onscreen buttons:
- InCallControlState inCallControlState = mInCallScreen.getUpdatedInCallControlState();
-
- // "Add" or "Merge":
- // These two buttons occupy the same space onscreen, so only
- // one of them should be available at a given moment.
- if (inCallControlState.canAddCall) {
- mAddButton.setVisibility(View.VISIBLE);
- mAddButton.setEnabled(true);
- mMergeButton.setVisibility(View.GONE);
- } else if (inCallControlState.canMerge) {
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // In CDMA "Add" option is always given to the user and the
- // "Merge" option is provided as a button on the top left corner of the screen,
- // we always set the mMergeButton to GONE
- mMergeButton.setVisibility(View.GONE);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- mMergeButton.setVisibility(View.VISIBLE);
- mMergeButton.setEnabled(true);
- mAddButton.setVisibility(View.GONE);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- } else {
- // Neither "Add" nor "Merge" is available. (This happens in
- // some transient states, like while dialing an outgoing call,
- // and in other rare cases like if you have both lines in use
- // *and* there are already 5 people on the conference call.)
- // Since the common case here is "while dialing", we show the
- // "Add" button in a disabled state so that there won't be any
- // jarring change in the UI when the call finally connects.
- mAddButton.setVisibility(View.VISIBLE);
- mAddButton.setEnabled(false);
- mMergeButton.setVisibility(View.GONE);
- }
- if (inCallControlState.canAddCall && inCallControlState.canMerge) {
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- // Uh oh, the InCallControlState thinks that "Add" *and* "Merge"
- // should both be available right now. This *should* never
- // happen with GSM, but if it's possible on any
- // future devices we may need to re-layout Add and Merge so
- // they can both be visible at the same time...
- Log.w(LOG_TAG, "updateInCallControls: Add *and* Merge enabled," +
- " but can't show both!");
- } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // In CDMA "Add" option is always given to the user and the hence
- // in this case both "Add" and "Merge" options would be available to user
- if (DBG) log("updateInCallControls: CDMA: Add and Merge both enabled");
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
-
- // "End call": this button has no state and it's always enabled.
- mEndButton.setEnabled(true);
-
- // "Dialpad": Enabled only when it's OK to use the dialpad in the
- // first place.
- mDialpadButton.setEnabled(inCallControlState.dialpadEnabled);
- //
- if (inCallControlState.dialpadVisible) {
- // Show the "hide dialpad" state.
- mDialpadButton.setText(R.string.onscreenHideDialpadText);
- mDialpadButton.setCompoundDrawablesWithIntrinsicBounds(
- null, mHideDialpadIcon, null, null);
- } else {
- // Show the "show dialpad" state.
- mDialpadButton.setText(R.string.onscreenShowDialpadText);
- mDialpadButton.setCompoundDrawablesWithIntrinsicBounds(
- null, mShowDialpadIcon, null, null);
- }
-
- // "Bluetooth"
- mBluetoothButton.setEnabled(inCallControlState.bluetoothEnabled);
- mBluetoothButton.setChecked(inCallControlState.bluetoothIndicatorOn);
-
- // "Mute"
- mMuteButton.setEnabled(inCallControlState.canMute);
- mMuteButton.setChecked(inCallControlState.muteIndicatorOn);
-
- // "Speaker"
- mSpeakerButton.setEnabled(inCallControlState.speakerEnabled);
- mSpeakerButton.setChecked(inCallControlState.speakerOn);
-
- // "Hold"
- // (Note "Hold" and "Swap" are never both available at
- // the same time. That's why it's OK for them to both be in the
- // same position onscreen.)
- // This button is totally hidden (rather than just disabled)
- // when the operation isn't available.
- mHoldButtonContainer.setVisibility(
- inCallControlState.canHold ? View.VISIBLE : View.GONE);
- if (inCallControlState.canHold) {
- // The Hold button icon and label (either "Hold" or "Unhold")
- // depend on the current Hold state.
- if (inCallControlState.onHold) {
- mHoldButton.setImageDrawable(mUnholdIcon);
- mHoldButtonLabel.setText(R.string.onscreenUnholdText);
- } else {
- mHoldButton.setImageDrawable(mHoldIcon);
- mHoldButtonLabel.setText(R.string.onscreenHoldText);
- }
- }
-
- // "Swap"
- // This button is totally hidden (rather than just disabled)
- // when the operation isn't available.
- mSwapButtonContainer.setVisibility(
- inCallControlState.canSwap ? View.VISIBLE : View.GONE);
-
- if (phone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- // "Merge"
- // This button is totally hidden (rather than just disabled)
- // when the operation isn't available.
- mCdmaMergeButtonContainer.setVisibility(
- inCallControlState.canMerge ? View.VISIBLE : View.GONE);
- }
-
- if (inCallControlState.canSwap && inCallControlState.canHold) {
- // Uh oh, the InCallControlState thinks that Swap *and* Hold
- // should both be available. This *should* never happen with
- // either GSM or CDMA, but if it's possible on any future
- // devices we may need to re-layout Hold and Swap so they can
- // both be visible at the same time...
- Log.w(LOG_TAG, "updateInCallControls: Hold *and* Swap enabled, but can't show both!");
- }
-
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- if (inCallControlState.canSwap && inCallControlState.canMerge) {
- // Uh oh, the InCallControlState thinks that Swap *and* Merge
- // should both be available. This *should* never happen with
- // CDMA, but if it's possible on any future
- // devices we may need to re-layout Merge and Swap so they can
- // both be visible at the same time...
- Log.w(LOG_TAG, "updateInCallControls: Merge *and* Swap" +
- "enabled, but can't show both!");
- }
- }
-
- // One final special case: if the dialpad is visible, that trumps
- // *any* of the upper corner buttons:
- if (inCallControlState.dialpadVisible) {
- mHoldButtonContainer.setVisibility(View.GONE);
- mSwapButtonContainer.setVisibility(View.GONE);
- mCdmaMergeButtonContainer.setVisibility(View.GONE);
- }
- }
-
- //
- // InCallScreen API
- //
-
- /**
- * @return true if the onscreen touch UI is enabled (for regular
- * "ongoing call" states) on the current device.
- */
- /* package */ boolean isTouchUiEnabled() {
- return mAllowInCallTouchUi;
- }
-
- /**
- * @return true if the onscreen touch UI is enabled for
- * the "incoming call" state on the current device.
- */
- /* package */ boolean isIncomingCallTouchUiEnabled() {
- return mAllowIncomingCallTouchUi;
- }
-
- //
- // SlidingTab.OnTriggerListener implementation
- //
-
- /**
- * Handles "Answer" and "Reject" actions for an incoming call.
- * We get this callback from the SlidingTab
- * when the user triggers an action.
- *
- * To answer or reject the incoming call, we call
- * InCallScreen.handleOnscreenButtonClick() and pass one of the
- * special "virtual button" IDs:
- * - R.id.answerButton to answer the call
- * or
- * - R.id.rejectButton to reject the call.
- */
- public void onTrigger(View v, int whichHandle) {
- log("onDialTrigger(whichHandle = " + whichHandle + ")...");
-
- switch (whichHandle) {
- case SlidingTab.OnTriggerListener.LEFT_HANDLE:
- if (DBG) log("LEFT_HANDLE: answer!");
-
- hideIncomingCallWidget();
-
- // ...and also prevent it from reappearing right away.
- // (This covers up a slow response from the radio; see updateState().)
- mLastIncomingCallActionTime = SystemClock.uptimeMillis();
- log("update mLastIncomingCallActionTime = " + (mLastIncomingCallActionTime / 100));
-
- // Do the appropriate action.
- if (mInCallScreen != null) {
- // Send this to the InCallScreen as a virtual "button click" event:
- mInCallScreen.handleOnscreenButtonClick(R.id.answerButton);
- } else {
- Log.e(LOG_TAG, "answer trigger: mInCallScreen is null");
- }
- break;
-
- case SlidingTab.OnTriggerListener.RIGHT_HANDLE:
- if (DBG) log("RIGHT_HANDLE: reject!");
-
- hideIncomingCallWidget();
-
- // ...and also prevent it from reappearing right away.
- // (This covers up a slow response from the radio; see updateState().)
- mLastIncomingCallActionTime = SystemClock.uptimeMillis();
- log("update mLastIncomingCallActionTime = " + (mLastIncomingCallActionTime / 100));
-
- // Do the appropriate action.
- if (mInCallScreen != null) {
- // Send this to the InCallScreen as a virtual "button click" event:
- mInCallScreen.handleOnscreenButtonClick(R.id.rejectButton);
- } else {
- Log.e(LOG_TAG, "reject trigger: mInCallScreen is null");
- }
- break;
-
- default:
- Log.e(LOG_TAG, "onDialTrigger: unexpected whichHandle value: " + whichHandle);
- break;
- }
-
- // Regardless of what action the user did, be sure to clear out
- // the hint text we were displaying while the user was dragging.
- mInCallScreen.updateSlidingTabHint(0, 0);
- }
-
- /**
- * Apply an animation to hide the incoming call widget.
- */
- private void hideIncomingCallWidget() {
- if (mIncomingCallWidget.getVisibility() != View.VISIBLE
- || mIncomingCallWidget.getAnimation() != null) {
- // Widget is already hidden or in the process of being hidden
- return;
- }
- // Hide the incoming call screen with a transition
- AlphaAnimation anim = new AlphaAnimation(1.0f, 0.0f);
- anim.setDuration(IN_CALL_WIDGET_TRANSITION_TIME);
- anim.setAnimationListener(new AnimationListener() {
-
- public void onAnimationStart(Animation animation) {
-
- }
-
- public void onAnimationRepeat(Animation animation) {
-
- }
-
- public void onAnimationEnd(Animation animation) {
- // hide the incoming call UI.
- mIncomingCallWidget.clearAnimation();
- mIncomingCallWidget.setVisibility(View.GONE);
- }
- });
- mIncomingCallWidget.startAnimation(anim);
- }
-
- /**
- * Shows the incoming call widget and cancels any animation that may be fading it out.
- */
- private void showIncomingCallWidget() {
- Animation anim = mIncomingCallWidget.getAnimation();
- if (anim != null) {
- anim.reset();
- mIncomingCallWidget.clearAnimation();
- }
- mIncomingCallWidget.reset(false);
- mIncomingCallWidget.setVisibility(View.VISIBLE);
- }
-
- /**
- * Handles state changes of the SlidingTabSelector widget. While the user
- * is dragging one of the handles, we display an onscreen hint; see
- * CallCard.getRotateWidgetHint().
- */
- public void onGrabbedStateChange(View v, int grabbedState) {
- if (mInCallScreen != null) {
- // Look up the hint based on which handle is currently grabbed.
- // (Note we don't simply pass grabbedState thru to the InCallScreen,
- // since *this* class is the only place that knows that the left
- // handle means "Answer" and the right handle means "Decline".)
- int hintTextResId, hintColorResId;
- switch (grabbedState) {
- case SlidingTab.OnTriggerListener.NO_HANDLE:
- hintTextResId = 0;
- hintColorResId = 0;
- break;
- case SlidingTab.OnTriggerListener.LEFT_HANDLE:
- // TODO: Use different variants of "Slide to answer" in some cases
- // depending on the phone state, like slide_to_answer_and_hold
- // for a call waiting call, or slide_to_answer_and_end_active or
- // slide_to_answer_and_end_onhold for the 2-lines-in-use case.
- // (Note these are GSM-only cases, though.)
- hintTextResId = R.string.slide_to_answer;
- hintColorResId = R.color.incall_textConnected; // green
- break;
- case SlidingTab.OnTriggerListener.RIGHT_HANDLE:
- hintTextResId = R.string.slide_to_decline;
- hintColorResId = R.color.incall_textEnded; // red
- break;
- default:
- Log.e(LOG_TAG, "onGrabbedStateChange: unexpected grabbedState: "
- + grabbedState);
- hintTextResId = 0;
- hintColorResId = 0;
- break;
- }
-
- // Tell the InCallScreen to update the CallCard and force the
- // screen to redraw.
- mInCallScreen.updateSlidingTabHint(hintTextResId, hintColorResId);
- }
- }
-
-
- /**
- * OnTouchListener used to shrink the "hit target" of some onscreen
- * buttons.
- */
- class SmallerHitTargetTouchListener implements View.OnTouchListener {
- /**
- * Width of the allowable "hit target" as a percentage of
- * the total width of this button.
- */
- private static final int HIT_TARGET_PERCENT_X = 50;
-
- /**
- * Height of the allowable "hit target" as a percentage of
- * the total height of this button.
- *
- * This is larger than HIT_TARGET_PERCENT_X because some of
- * the onscreen buttons are wide but not very tall and we don't
- * want to make the vertical hit target *too* small.
- */
- private static final int HIT_TARGET_PERCENT_Y = 80;
-
- // Size (percentage-wise) of the "edge" area that's *not* touch-sensitive.
- private static final int X_EDGE = (100 - HIT_TARGET_PERCENT_X) / 2;
- private static final int Y_EDGE = (100 - HIT_TARGET_PERCENT_Y) / 2;
- // Min/max values (percentage-wise) of the touch-sensitive hit target.
- private static final int X_HIT_MIN = X_EDGE;
- private static final int X_HIT_MAX = 100 - X_EDGE;
- private static final int Y_HIT_MIN = Y_EDGE;
- private static final int Y_HIT_MAX = 100 - Y_EDGE;
-
- // True if the most recent DOWN event was a "hit".
- boolean mDownEventHit;
-
- /**
- * Called when a touch event is dispatched to a view. This allows listeners to
- * get a chance to respond before the target view.
- *
- * @return True if the listener has consumed the event, false otherwise.
- * (In other words, we return true when the touch is *outside*
- * the "smaller hit target", which will prevent the actual
- * button from handling these events.)
- */
- public boolean onTouch(View v, MotionEvent event) {
- // if (DBG) log("SmallerHitTargetTouchListener: " + v + ", event " + event);
-
- if (event.getAction() == MotionEvent.ACTION_DOWN) {
- // Note that event.getX() and event.getY() are already
- // translated into the View's coordinates. (In other words,
- // "0,0" is a touch on the upper-left-most corner of the view.)
- int touchX = (int) event.getX();
- int touchY = (int) event.getY();
-
- int viewWidth = v.getWidth();
- int viewHeight = v.getHeight();
-
- // Touch location as a percentage of the total button width or height.
- int touchXPercent = (int) ((float) (touchX * 100) / (float) viewWidth);
- int touchYPercent = (int) ((float) (touchY * 100) / (float) viewHeight);
- // if (DBG) log("- percentage: x = " + touchXPercent + ", y = " + touchYPercent);
-
- // TODO: user research: add event logging here of the actual
- // hit location (and button ID), and enable it for dogfooders
- // for a few days. That'll give us a good idea of how close
- // to the center of the button(s) most touch events are, to
- // help us fine-tune the HIT_TARGET_PERCENT_* constants.
-
- if (touchXPercent < X_HIT_MIN || touchXPercent > X_HIT_MAX
- || touchYPercent < Y_HIT_MIN || touchYPercent > Y_HIT_MAX) {
- // Missed!
- // if (DBG) log(" -> MISSED!");
- mDownEventHit = false;
- return true; // Consume this event; don't let the button see it
- } else {
- // Hit!
- // if (DBG) log(" -> HIT!");
- mDownEventHit = true;
- return false; // Let this event through to the actual button
- }
- } else {
- // This is a MOVE, UP or CANCEL event.
- //
- // We only do the "smaller hit target" check on DOWN events.
- // For the subsequent MOVE/UP/CANCEL events, we let them
- // through to the actual button IFF the previous DOWN event
- // got through to the actual button (i.e. it was a "hit".)
- return !mDownEventHit;
- }
- }
- }
-
-
- // Debugging / testing code
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/ManageConferenceUtils.java b/phone/src/com/android/phone2/ManageConferenceUtils.java
deleted file mode 100644
index 299ff5e..0000000
--- a/phone/src/com/android/phone2/ManageConferenceUtils.java
+++ /dev/null
@@ -1,341 +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.phone2;
-
-import android.os.SystemProperties;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewStub;
-import android.widget.Button;
-import android.widget.Chronometer;
-import android.widget.ImageButton;
-import android.widget.TextView;
-
-import com.android.internal.telephony.CallerInfo;
-import com.android.internal.telephony.CallerInfoAsyncQuery;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.Phone;
-
-import java.util.List;
-
-
-/**
- * Helper class to initialize and run the InCallScreen's "Manage conference" UI.
- */
-public class ManageConferenceUtils
- implements CallerInfoAsyncQuery.OnQueryCompleteListener {
- private static final String LOG_TAG = "ManageConferenceUtils";
- private static final boolean DBG =
- (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
-
- private InCallScreen mInCallScreen;
- private Phone mPhone;
-
- // "Manage conference" UI elements and state
- private ViewGroup mManageConferencePanel;
- private Button mButtonManageConferenceDone;
- private ViewGroup[] mConferenceCallList;
- private int mNumCallersInConference;
- private Chronometer mConferenceTime;
-
- // See CallTracker.MAX_CONNECTIONS_PER_CALL
- private static final int MAX_CALLERS_IN_CONFERENCE = 5;
-
- public ManageConferenceUtils(InCallScreen inCallScreen, Phone phone) {
- if (DBG) log("ManageConferenceUtils constructor...");
- mInCallScreen = inCallScreen;
- mPhone = phone;
- }
-
- public void initManageConferencePanel() {
- if (DBG) log("initManageConferencePanel()...");
- if (mManageConferencePanel == null) {
- if (DBG) log("initManageConferencePanel: first-time initialization!");
-
- // Inflate the ViewStub, look up and initialize the UI elements.
- ViewStub stub = (ViewStub) mInCallScreen.findViewById(R.id.manageConferencePanelStub);
- stub.inflate();
-
- mManageConferencePanel =
- (ViewGroup) mInCallScreen.findViewById(R.id.manageConferencePanel);
- if (mManageConferencePanel == null) {
- throw new IllegalStateException("Couldn't find manageConferencePanel!");
- }
-
- // set up the Conference Call chronometer
- mConferenceTime =
- (Chronometer) mInCallScreen.findViewById(R.id.manageConferencePanelHeader);
- mConferenceTime.setFormat(mInCallScreen.getString(R.string.caller_manage_header));
-
- // Create list of conference call widgets
- mConferenceCallList = new ViewGroup[MAX_CALLERS_IN_CONFERENCE];
-
- final int[] viewGroupIdList = { R.id.caller0, R.id.caller1, R.id.caller2,
- R.id.caller3, R.id.caller4 };
- for (int i = 0; i < MAX_CALLERS_IN_CONFERENCE; i++) {
- mConferenceCallList[i] =
- (ViewGroup) mInCallScreen.findViewById(viewGroupIdList[i]);
- }
-
- mButtonManageConferenceDone = (Button) mInCallScreen.findViewById(R.id.manage_done);
- mButtonManageConferenceDone.setOnClickListener(mInCallScreen);
- }
- }
-
- /**
- * Shows or hides the manageConferencePanel.
- */
- public void setPanelVisible(boolean visible) {
- if (mManageConferencePanel != null) {
- mManageConferencePanel.setVisibility(visible ? View.VISIBLE : View.GONE);
- }
- }
-
- /**
- * Starts the "conference time" chronometer.
- */
- public void startConferenceTime(long base) {
- if (mConferenceTime != null) {
- mConferenceTime.setBase(base);
- mConferenceTime.start();
- }
- }
-
- /**
- * Stops the "conference time" chronometer.
- */
- public void stopConferenceTime() {
- if (mConferenceTime != null) {
- mConferenceTime.stop();
- }
- }
-
- public int getNumCallersInConference() {
- return mNumCallersInConference;
- }
-
- /**
- * Updates the "Manage conference" UI based on the specified List of
- * connections.
- *
- * @param connections the List of connections belonging to
- * the current foreground call; size must be greater than 1
- * (or it wouldn't be a conference call in the first place.)
- */
- public void updateManageConferencePanel(List<Connection> connections) {
- mNumCallersInConference = connections.size();
- if (DBG) log("updateManageConferencePanel()... num connections in conference = "
- + mNumCallersInConference);
-
- // Can we give the user the option to separate out ("go private with") a single
- // caller from this conference?
- final boolean hasActiveCall = !mPhone.getForegroundCall().isIdle();
- final boolean hasHoldingCall = !mPhone.getBackgroundCall().isIdle();
- boolean canSeparate = !(hasActiveCall && hasHoldingCall);
-
- for (int i = 0; i < MAX_CALLERS_IN_CONFERENCE; i++) {
- if (i < mNumCallersInConference) {
- // Fill in the row in the UI for this caller.
- Connection connection = (Connection) connections.get(i);
- updateManageConferenceRow(i, connection, canSeparate);
- } else {
- // Blank out this row in the UI
- updateManageConferenceRow(i, null, false);
- }
- }
- }
-
- /**
- * Updates a single row of the "Manage conference" UI. (One row in this
- * UI represents a single caller in the conference.)
- *
- * @param i the row to update
- * @param connection the Connection corresponding to this caller.
- * If null, that means this is an "empty slot" in the conference,
- * so hide this row in the UI.
- * @param canSeparate if true, show a "Separate" (i.e. "Private") button
- * on this row in the UI.
- */
- public void updateManageConferenceRow(final int i,
- final Connection connection,
- boolean canSeparate) {
- if (DBG) log("updateManageConferenceRow(" + i + ")... connection = " + connection);
-
- if (connection != null) {
- // Activate this row of the Manage conference panel:
- mConferenceCallList[i].setVisibility(View.VISIBLE);
-
- // get the relevant children views
- ImageButton endButton = (ImageButton) mConferenceCallList[i].findViewById(
- R.id.conferenceCallerDisconnect);
- ImageButton separateButton = (ImageButton) mConferenceCallList[i].findViewById(
- R.id.conferenceCallerSeparate);
- TextView nameTextView = (TextView) mConferenceCallList[i].findViewById(
- R.id.conferenceCallerName);
- TextView numberTextView = (TextView) mConferenceCallList[i].findViewById(
- R.id.conferenceCallerNumber);
- TextView numberTypeTextView = (TextView) mConferenceCallList[i].findViewById(
- R.id.conferenceCallerNumberType);
-
- if (DBG) log("- button: " + endButton + ", nameTextView: " + nameTextView);
-
- // Hook up this row's buttons.
- View.OnClickListener endThisConnection = new View.OnClickListener() {
- public void onClick(View v) {
- endConferenceConnection(i, connection);
- PhoneApp.getInstance().pokeUserActivity();
- }
- };
- endButton.setOnClickListener(endThisConnection);
- //
- if (canSeparate) {
- View.OnClickListener separateThisConnection = new View.OnClickListener() {
- public void onClick(View v) {
- separateConferenceConnection(i, connection);
- PhoneApp.getInstance().pokeUserActivity();
- }
- };
- separateButton.setOnClickListener(separateThisConnection);
- separateButton.setVisibility(View.VISIBLE);
- } else {
- separateButton.setVisibility(View.INVISIBLE);
- }
-
- // Name/number for this caller.
- // TODO: need to deal with private or blocked caller id?
- PhoneUtils.CallerInfoToken info =
- PhoneUtils.startGetCallerInfo(mInCallScreen,
- connection,
- this,
- mConferenceCallList[i]);
- if (DBG) log(" - got info from startGetCallerInfo(): " + info);
-
- // display the CallerInfo.
- displayCallerInfoForConferenceRow(info.currentInfo, nameTextView,
- numberTypeTextView, numberTextView);
- } else {
- // Disable this row of the Manage conference panel:
- mConferenceCallList[i].setVisibility(View.GONE);
- }
- }
-
- /**
- * Helper function to fill out the Conference Call(er) information
- * for each item in the "Manage Conference Call" list.
- */
- public final void displayCallerInfoForConferenceRow(CallerInfo ci,
- TextView nameTextView,
- TextView numberTypeTextView,
- TextView numberTextView) {
- // gather the correct name and number information.
- String callerName = "";
- String callerNumber = "";
- String callerNumberType = "";
- if (ci != null) {
- callerName = ci.name;
- if (TextUtils.isEmpty(callerName)) {
- callerName = ci.phoneNumber;
- if (TextUtils.isEmpty(callerName)) {
- callerName = mInCallScreen.getString(R.string.unknown);
- }
- } else {
- callerNumber = ci.phoneNumber;
- callerNumberType = ci.phoneLabel;
- }
- }
-
- // set the caller name
- nameTextView.setText(callerName);
-
- // 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(callerNumber);
- numberTypeTextView.setVisibility(View.VISIBLE);
- numberTypeTextView.setText(callerNumberType);
- }
- }
-
- /**
- * Ends the specified connection on a conference call. This method is
- * run (via a closure containing a row index and Connection) when the
- * user clicks the "End" button on a specific row in the Manage
- * conference UI.
- */
- public void endConferenceConnection(int i, Connection connection) {
- if (DBG) log("===> ENDING conference connection " + i
- + ": Connection " + connection);
- // The actual work of ending the connection:
- PhoneUtils.hangup(connection);
- // No need to manually update the "Manage conference" UI here;
- // that'll happen automatically very soon (when we get the
- // onDisconnect() callback triggered by this hangup() call.)
- }
-
- /**
- * Separates out the specified connection on a conference call. This
- * method is run (via a closure containing a row index and Connection)
- * when the user clicks the "Separate" (i.e. "Private") button on a
- * specific row in the Manage conference UI.
- */
- public void separateConferenceConnection(int i, Connection connection) {
- if (DBG) log("===> SEPARATING conference connection " + i
- + ": Connection " + connection);
-
- PhoneUtils.separateCall(connection);
-
- // Note that separateCall() automagically makes the
- // newly-separated call into the foreground call (which is the
- // desired UI), so there's no need to do any further
- // call-switching here.
- // There's also no need to manually update (or hide) the "Manage
- // conference" UI; that'll happen on its own in a moment (when we
- // get the phone state change event triggered by the call to
- // separateCall().)
- }
-
- /**
- * CallerInfoAsyncQuery.OnQueryCompleteListener implementation.
- *
- * This method listens for results from the caller-id info queries we
- * fire off in updateManageConferenceRow(), and updates the
- * corresponding conference row.
- */
- public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
- if (DBG) log("callerinfo query complete, updating UI." + ci);
-
- // get the viewgroup (conference call list item) and make it visible
- ViewGroup vg = (ViewGroup) cookie;
- vg.setVisibility(View.VISIBLE);
-
- // update the list item with this information.
- displayCallerInfoForConferenceRow(ci,
- (TextView) vg.findViewById(R.id.conferenceCallerName),
- (TextView) vg.findViewById(R.id.conferenceCallerNumberType),
- (TextView) vg.findViewById(R.id.conferenceCallerNumber));
- }
-
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/NetworkQueryService.java b/phone/src/com/android/phone2/NetworkQueryService.java
deleted file mode 100644
index 98f2730..0000000
--- a/phone/src/com/android/phone2/NetworkQueryService.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Service;
-import android.content.Intent;
-import com.android.internal.telephony.gsm.NetworkInfo;
-import android.os.AsyncResult;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import android.util.Log;
-
-import java.util.ArrayList;
-
-/**
- * Service code used to assist in querying the network for service
- * availability.
- */
-public class NetworkQueryService extends Service {
- // debug data
- private static final String LOG_TAG = "NetworkQuery";
- private static final boolean DBG = false;
-
- // static events
- private static final int EVENT_NETWORK_SCAN_COMPLETED = 100;
-
- // static states indicating the query status of the service
- private static final int QUERY_READY = -1;
- private static final int QUERY_IS_RUNNING = -2;
-
- // error statuses that will be retured in the callback.
- public static final int QUERY_OK = 0;
- public static final int QUERY_EXCEPTION = 1;
-
- /** state of the query service */
- private int mState;
-
- /** local handle to the phone object */
- private Phone mPhone;
-
- /**
- * Class for clients to access. Because we know this service always
- * runs in the same process as its clients, we don't need to deal with
- * IPC.
- */
- public class LocalBinder extends Binder {
- INetworkQueryService getService() {
- return mBinder;
- }
- }
- private final IBinder mLocalBinder = new LocalBinder();
-
- /**
- * Local handler to receive the network query compete callback
- * from the RIL.
- */
- Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- // if the scan is complete, broadcast the results.
- // to all registerd callbacks.
- case EVENT_NETWORK_SCAN_COMPLETED:
- if (DBG) log("scan completed, broadcasting results");
- broadcastQueryResults((AsyncResult) msg.obj);
- break;
- }
- }
- };
-
- /**
- * List of callback objects, also used to synchronize access to
- * itself and to changes in state.
- */
- final RemoteCallbackList<INetworkQueryServiceCallback> mCallbacks =
- new RemoteCallbackList<INetworkQueryServiceCallback> ();
-
- /**
- * Implementation of the INetworkQueryService interface.
- */
- private final INetworkQueryService.Stub mBinder = new INetworkQueryService.Stub() {
-
- /**
- * Starts a query with a INetworkQueryServiceCallback object if
- * one has not been started yet. Ignore the new query request
- * if the query has been started already. Either way, place the
- * callback object in the queue to be notified upon request
- * completion.
- */
- public void startNetworkQuery(INetworkQueryServiceCallback cb) {
- if (cb != null) {
- // register the callback to the list of callbacks.
- synchronized (mCallbacks) {
- mCallbacks.register(cb);
- if (DBG) log("registering callback " + cb.getClass().toString());
-
- switch (mState) {
- case QUERY_READY:
- // TODO: we may want to install a timeout here in case we
- // do not get a timely response from the RIL.
- mPhone.getAvailableNetworks(
- mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED));
- mState = QUERY_IS_RUNNING;
- if (DBG) log("starting new query");
- break;
-
- // do nothing if we're currently busy.
- case QUERY_IS_RUNNING:
- if (DBG) log("query already in progress");
- break;
- default:
- }
- }
- }
- }
-
- /**
- * Stops a query with a INetworkQueryServiceCallback object as
- * a token.
- */
- public void stopNetworkQuery(INetworkQueryServiceCallback cb) {
- // currently we just unregister the callback, since there is
- // no way to tell the RIL to terminate the query request.
- // This means that the RIL may still be busy after the stop
- // request was made, but the state tracking logic ensures
- // that the delay will only last for 1 request even with
- // repeated button presses in the NetworkSetting activity.
- if (cb != null) {
- synchronized (mCallbacks) {
- if (DBG) log("unregistering callback " + cb.getClass().toString());
- mCallbacks.unregister(cb);
- }
- }
- }
- };
-
- @Override
- public void onCreate() {
- mState = QUERY_READY;
- mPhone = SipPhoneFactory.getDefaultPhone();
- }
-
- /**
- * Required for service implementation.
- */
- @Override
- public void onStart(Intent intent, int startId) {
- }
-
- /**
- * Handle the bind request.
- */
- @Override
- public IBinder onBind(Intent intent) {
- // TODO: Currently, return only the LocalBinder instance. If we
- // end up requiring support for a remote binder, we will need to
- // return mBinder as well, depending upon the intent.
- if (DBG) log("binding service implementation");
- return mLocalBinder;
- }
-
- /**
- * Broadcast the results from the query to all registered callback
- * objects.
- */
- private void broadcastQueryResults (AsyncResult ar) {
- // reset the state.
- synchronized (mCallbacks) {
- mState = QUERY_READY;
-
- // see if we need to do any work.
- if (ar == null) {
- if (DBG) log("AsyncResult is null.");
- return;
- }
-
- // TODO: we may need greater accuracy here, but for now, just a
- // simple status integer will suffice.
- int exception = (ar.exception == null) ? QUERY_OK : QUERY_EXCEPTION;
- if (DBG) log("AsyncResult has exception " + exception);
-
- // Make the calls to all the registered callbacks.
- for (int i = (mCallbacks.beginBroadcast() - 1); i >= 0; i--) {
- INetworkQueryServiceCallback cb = mCallbacks.getBroadcastItem(i);
- if (DBG) log("broadcasting results to " + cb.getClass().toString());
- try {
- cb.onQueryComplete((ArrayList<NetworkInfo>) ar.result, exception);
- } catch (RemoteException e) {
- }
- }
-
- // finish up.
- mCallbacks.finishBroadcast();
- }
- }
-
- private static void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/NetworkSetting.java b/phone/src/com/android/phone2/NetworkSetting.java
deleted file mode 100644
index 7fcf75f..0000000
--- a/phone/src/com/android/phone2/NetworkSetting.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.RemoteException;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceGroup;
-import android.preference.PreferenceScreen;
-import android.util.Log;
-
-import com.android.internal.telephony.CommandException;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.gsm.NetworkInfo;
-
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * "Networks" settings UI for the Phone app.
- */
-public class NetworkSetting extends PreferenceActivity
- implements DialogInterface.OnCancelListener {
-
- private static final String LOG_TAG = "phone";
- private static final boolean DBG = false;
-
- private static final int EVENT_NETWORK_SCAN_COMPLETED = 100;
- private static final int EVENT_NETWORK_SELECTION_DONE = 200;
- private static final int EVENT_AUTO_SELECT_DONE = 300;
-
- //dialog ids
- private static final int DIALOG_NETWORK_SELECTION = 100;
- private static final int DIALOG_NETWORK_LIST_LOAD = 200;
- private static final int DIALOG_NETWORK_AUTO_SELECT = 300;
-
- //String keys for preference lookup
- private static final String LIST_NETWORKS_KEY = "list_networks_key";
- private static final String BUTTON_SRCH_NETWRKS_KEY = "button_srch_netwrks_key";
- private static final String BUTTON_AUTO_SELECT_KEY = "button_auto_select_key";
-
- //map of network controls to the network data.
- private HashMap<Preference, NetworkInfo> mNetworkMap;
-
- Phone mPhone;
- protected boolean mIsForeground = false;
-
- /** message for network selection */
- String mNetworkSelectMsg;
-
- //preference objects
- private PreferenceGroup mNetworkList;
- private Preference mSearchButton;
- private Preference mAutoSelect;
-
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- AsyncResult ar;
- switch (msg.what) {
- case EVENT_NETWORK_SCAN_COMPLETED:
- networksListLoaded ((List<NetworkInfo>) msg.obj, msg.arg1);
- break;
-
- case EVENT_NETWORK_SELECTION_DONE:
- if (DBG) log("hideProgressPanel");
- removeDialog(DIALOG_NETWORK_SELECTION);
- getPreferenceScreen().setEnabled(true);
-
- ar = (AsyncResult) msg.obj;
- if (ar.exception != null) {
- if (DBG) log("manual network selection: failed!");
- displayNetworkSelectionFailed(ar.exception);
- } else {
- if (DBG) log("manual network selection: succeeded!");
- displayNetworkSelectionSucceeded();
- }
- break;
- case EVENT_AUTO_SELECT_DONE:
- if (DBG) log("hideProgressPanel");
-
- if (mIsForeground) {
- dismissDialog(DIALOG_NETWORK_AUTO_SELECT);
- }
- getPreferenceScreen().setEnabled(true);
-
- ar = (AsyncResult) msg.obj;
- if (ar.exception != null) {
- if (DBG) log("automatic network selection: failed!");
- displayNetworkSelectionFailed(ar.exception);
- } else {
- if (DBG) log("automatic network selection: succeeded!");
- displayNetworkSelectionSucceeded();
- }
- break;
- }
-
- return;
- }
- };
-
- /**
- * Service connection code for the NetworkQueryService.
- * Handles the work of binding to a local object so that we can make
- * the appropriate service calls.
- */
-
- /** Local service interface */
- private INetworkQueryService mNetworkQueryService = null;
-
- /** Service connection */
- private final ServiceConnection mNetworkQueryServiceConnection = new ServiceConnection() {
-
- /** Handle the task of binding the local object to the service */
- public void onServiceConnected(ComponentName className, IBinder service) {
- if (DBG) log("connection created, binding local service.");
- mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService();
- // as soon as it is bound, run a query.
- loadNetworksList();
- }
-
- /** Handle the task of cleaning up the local binding */
- public void onServiceDisconnected(ComponentName className) {
- if (DBG) log("connection disconnected, cleaning local binding.");
- mNetworkQueryService = null;
- }
- };
-
- /**
- * This implementation of INetworkQueryServiceCallback is used to receive
- * callback notifications from the network query service.
- */
- private final INetworkQueryServiceCallback mCallback = new INetworkQueryServiceCallback.Stub() {
-
- /** place the message on the looper queue upon query completion. */
- public void onQueryComplete(List<NetworkInfo> networkInfoArray, int status) {
- if (DBG) log("notifying message loop of query completion.");
- Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED,
- status, 0, networkInfoArray);
- msg.sendToTarget();
- }
- };
-
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- boolean handled = false;
-
- if (preference == mSearchButton) {
- loadNetworksList();
- handled = true;
- } else if (preference == mAutoSelect) {
- selectNetworkAutomatic();
- handled = true;
- } else {
- Preference selectedCarrier = preference;
-
- String networkStr = selectedCarrier.getTitle().toString();
- if (DBG) log("selected network: " + networkStr);
-
- Message msg = mHandler.obtainMessage(EVENT_NETWORK_SELECTION_DONE);
- mPhone.selectNetworkManually(mNetworkMap.get(selectedCarrier), msg);
-
- displayNetworkSeletionInProgress(networkStr);
-
- handled = true;
- }
-
- return handled;
- }
-
- //implemented for DialogInterface.OnCancelListener
- public void onCancel(DialogInterface dialog) {
- // request that the service stop the query with this callback object.
- try {
- mNetworkQueryService.stopNetworkQuery(mCallback);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- finish();
- }
-
- public String getNormalizedCarrierName(NetworkInfo ni) {
- if (ni != null) {
- return ni.getOperatorAlphaLong() + " (" + ni.getOperatorNumeric() + ")";
- }
- return null;
- }
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.carrier_select);
-
- mPhone = PhoneApp.getInstance().phone;
-
- mNetworkList = (PreferenceGroup) getPreferenceScreen().findPreference(LIST_NETWORKS_KEY);
- mNetworkMap = new HashMap<Preference, NetworkInfo>();
-
- mSearchButton = getPreferenceScreen().findPreference(BUTTON_SRCH_NETWRKS_KEY);
- mAutoSelect = getPreferenceScreen().findPreference(BUTTON_AUTO_SELECT_KEY);
-
- // Start the Network Query service, and bind it.
- // The OS knows to start he service only once and keep the instance around (so
- // long as startService is called) until a stopservice request is made. Since
- // we want this service to just stay in the background until it is killed, we
- // don't bother stopping it from our end.
- startService (new Intent(this, NetworkQueryService.class));
- bindService (new Intent(this, NetworkQueryService.class), mNetworkQueryServiceConnection,
- Context.BIND_AUTO_CREATE);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mIsForeground = true;
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mIsForeground = false;
- }
-
- /**
- * Override onDestroy() to unbind the query service, avoiding service
- * leak exceptions.
- */
- @Override
- protected void onDestroy() {
- // unbind the service.
- unbindService(mNetworkQueryServiceConnection);
-
- super.onDestroy();
- }
-
- @Override
- protected Dialog onCreateDialog(int id) {
-
- if ((id == DIALOG_NETWORK_SELECTION) || (id == DIALOG_NETWORK_LIST_LOAD) ||
- (id == DIALOG_NETWORK_AUTO_SELECT)) {
- ProgressDialog dialog = new ProgressDialog(this);
- switch (id) {
- case DIALOG_NETWORK_SELECTION:
- // It would be more efficient to reuse this dialog by moving
- // this setMessage() into onPreparedDialog() and NOT use
- // removeDialog(). However, this is not possible since the
- // message is rendered only 2 times in the ProgressDialog -
- // after show() and before onCreate.
- dialog.setMessage(mNetworkSelectMsg);
- dialog.setCancelable(false);
- dialog.setIndeterminate(true);
- break;
- case DIALOG_NETWORK_AUTO_SELECT:
- dialog.setMessage(getResources().getString(R.string.register_automatically));
- dialog.setCancelable(false);
- dialog.setIndeterminate(true);
- break;
- case DIALOG_NETWORK_LIST_LOAD:
- default:
- // reinstate the cancelablity of the dialog.
- dialog.setMessage(getResources().getString(R.string.load_networks_progress));
- dialog.setCancelable(true);
- dialog.setOnCancelListener(this);
- break;
- }
- return dialog;
- }
- return null;
- }
-
- @Override
- protected void onPrepareDialog(int id, Dialog dialog) {
- if ((id == DIALOG_NETWORK_SELECTION) || (id == DIALOG_NETWORK_LIST_LOAD) ||
- (id == DIALOG_NETWORK_AUTO_SELECT)) {
- // when the dialogs come up, we'll need to indicate that
- // we're in a busy state to dissallow further input.
- getPreferenceScreen().setEnabled(false);
- }
- }
-
- private void displayEmptyNetworkList(boolean flag) {
- mNetworkList.setTitle(flag ? R.string.empty_networks_list : R.string.label_available);
- }
-
- private void displayNetworkSeletionInProgress(String networkStr) {
- // TODO: use notification manager?
- mNetworkSelectMsg = getResources().getString(R.string.register_on_network, networkStr);
-
- if (mIsForeground) {
- showDialog(DIALOG_NETWORK_SELECTION);
- }
- }
-
- private void displayNetworkQueryFailed(int error) {
- String status = getResources().getString(R.string.network_query_error);
-
- NotificationMgr.getDefault().postTransientNotification(
- NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
- }
-
- private void displayNetworkSelectionFailed(Throwable ex) {
- String status;
-
- if ((ex != null && ex instanceof CommandException) &&
- ((CommandException)ex).getCommandError()
- == CommandException.Error.ILLEGAL_SIM_OR_ME)
- {
- status = getResources().getString(R.string.not_allowed);
- } else {
- status = getResources().getString(R.string.connect_later);
- }
-
- NotificationMgr.getDefault().postTransientNotification(
- NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
- }
-
- private void displayNetworkSelectionSucceeded() {
- String status = getResources().getString(R.string.registration_done);
-
- NotificationMgr.getDefault().postTransientNotification(
- NotificationMgr.NETWORK_SELECTION_NOTIFICATION, status);
-
- mHandler.postDelayed(new Runnable() {
- public void run() {
- finish();
- }
- }, 3000);
- }
-
- private void loadNetworksList() {
- if (DBG) log("load networks list...");
-
- if (mIsForeground) {
- showDialog(DIALOG_NETWORK_LIST_LOAD);
- }
-
- // delegate query request to the service.
- try {
- mNetworkQueryService.startNetworkQuery(mCallback);
- } catch (RemoteException e) {
- }
-
- displayEmptyNetworkList(false);
- }
-
- /**
- * networksListLoaded has been rewritten to take an array of
- * NetworkInfo objects and a status field, instead of an
- * AsyncResult. Otherwise, the functionality which takes the
- * NetworkInfo array and creates a list of preferences from it,
- * remains unchanged.
- */
- private void networksListLoaded(List<NetworkInfo> result, int status) {
- if (DBG) log("networks list loaded");
-
- // update the state of the preferences.
- if (DBG) log("hideProgressPanel");
-
- if (mIsForeground) {
- dismissDialog(DIALOG_NETWORK_LIST_LOAD);
- }
-
- getPreferenceScreen().setEnabled(true);
- clearList();
-
- if (status != NetworkQueryService.QUERY_OK) {
- if (DBG) log("error while querying available networks");
- displayNetworkQueryFailed(status);
- displayEmptyNetworkList(true);
- } else {
- if (result != null){
- displayEmptyNetworkList(false);
-
- // create a preference for each item in the list.
- // just use the operator name instead of the mildly
- // confusing mcc/mnc.
- for (NetworkInfo ni : result) {
- Preference carrier = new Preference(this, null);
- carrier.setTitle(ni.getOperatorAlphaLong());
- carrier.setPersistent(false);
- mNetworkList.addPreference(carrier);
- mNetworkMap.put(carrier, ni);
-
- if (DBG) log(" " + ni);
- }
-
- } else {
- displayEmptyNetworkList(true);
- }
- }
- }
-
- private void clearList() {
- for (Preference p : mNetworkMap.keySet()) {
- mNetworkList.removePreference(p);
- }
- mNetworkMap.clear();
- }
-
- private void selectNetworkAutomatic() {
- if (DBG) log("select network automatically...");
- if (mIsForeground) {
- showDialog(DIALOG_NETWORK_AUTO_SELECT);
- }
-
- Message msg = mHandler.obtainMessage(EVENT_AUTO_SELECT_DONE);
- mPhone.setNetworkSelectionModeAutomatic(msg);
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, "[NetworksList] " + msg);
- }
-}
-
diff --git a/phone/src/com/android/phone2/NotificationMgr.java b/phone/src/com/android/phone2/NotificationMgr.java
deleted file mode 100644
index bfc16ce..0000000
--- a/phone/src/com/android/phone2/NotificationMgr.java
+++ /dev/null
@@ -1,972 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.app.StatusBarManager;
-import android.content.AsyncQueryHandler;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.database.Cursor;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.IBinder;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.preference.PreferenceManager;
-import android.provider.Settings;
-import android.provider.CallLog.Calls;
-import android.provider.ContactsContract.PhoneLookup;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.ServiceState;
-import android.text.TextUtils;
-import android.util.Log;
-import android.widget.RemoteViews;
-import android.widget.Toast;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.CallerInfo;
-import com.android.internal.telephony.CallerInfoAsyncQuery;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneBase;
-
-
-/**
- * NotificationManager-related utility code for the Phone app.
- */
-public class NotificationMgr implements CallerInfoAsyncQuery.OnQueryCompleteListener{
- private static final String LOG_TAG = "NotificationMgr";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- private static final String[] CALL_LOG_PROJECTION = new String[] {
- Calls._ID,
- Calls.NUMBER,
- Calls.DATE,
- Calls.DURATION,
- Calls.TYPE,
- };
-
- // notification types
- static final int MISSED_CALL_NOTIFICATION = 1;
- static final int IN_CALL_NOTIFICATION = 2;
- static final int MMI_NOTIFICATION = 3;
- static final int NETWORK_SELECTION_NOTIFICATION = 4;
- static final int VOICEMAIL_NOTIFICATION = 5;
- static final int CALL_FORWARD_NOTIFICATION = 6;
- static final int DATA_DISCONNECTED_ROAMING_NOTIFICATION = 7;
- static final int SELECTED_OPERATOR_FAIL_NOTIFICATION = 8;
-
- private static NotificationMgr sMe = null;
- private Phone mPhone;
-
- private Context mContext;
- private NotificationManager mNotificationMgr;
- private StatusBarManager mStatusBar;
- private StatusBarMgr mStatusBarMgr;
- private Toast mToast;
- private IBinder mSpeakerphoneIcon;
- private IBinder mMuteIcon;
-
- // used to track the missed call counter, default to 0.
- private int mNumberMissedCalls = 0;
-
- // Currently-displayed resource IDs for some status bar icons (or zero
- // if no notification is active):
- private int mInCallResId;
-
- // used to track the notification of selected network unavailable
- private boolean mSelectedUnavailableNotify = false;
-
- // Retry params for the getVoiceMailNumber() call; see updateMwi().
- private static final int MAX_VM_NUMBER_RETRIES = 5;
- private static final int VM_NUMBER_RETRY_DELAY_MILLIS = 10000;
- private int mVmNumberRetriesRemaining = MAX_VM_NUMBER_RETRIES;
-
- // Query used to look up caller-id info for the "call log" notification.
- private QueryHandler mQueryHandler = null;
- private static final int CALL_LOG_TOKEN = -1;
- private static final int CONTACT_TOKEN = -2;
-
- NotificationMgr(Context context) {
- mContext = context;
- mNotificationMgr = (NotificationManager)
- context.getSystemService(Context.NOTIFICATION_SERVICE);
-
- mStatusBar = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE);
-
- PhoneApp app = PhoneApp.getInstance();
- mPhone = app.phone;
- }
-
- static void init(Context context) {
- sMe = new NotificationMgr(context);
-
- // update the notifications that need to be touched at startup.
- sMe.updateNotificationsAtStartup();
- }
-
- static NotificationMgr getDefault() {
- return sMe;
- }
-
- /**
- * Class that controls the status bar. This class maintains a set
- * of state and acts as an interface between the Phone process and
- * the Status bar. All interaction with the status bar should be
- * though the methods contained herein.
- */
-
- /**
- * Factory method
- */
- StatusBarMgr getStatusBarMgr() {
- if (mStatusBarMgr == null) {
- mStatusBarMgr = new StatusBarMgr();
- }
- return mStatusBarMgr;
- }
-
- /**
- * StatusBarMgr implementation
- */
- class StatusBarMgr {
- // current settings
- private boolean mIsNotificationEnabled = true;
- private boolean mIsExpandedViewEnabled = true;
-
- private StatusBarMgr () {
- }
-
- /**
- * Sets the notification state (enable / disable
- * vibrating notifications) for the status bar,
- * updates the status bar service if there is a change.
- * Independent of the remaining Status Bar
- * functionality, including icons and expanded view.
- */
- void enableNotificationAlerts(boolean enable) {
- if (mIsNotificationEnabled != enable) {
- mIsNotificationEnabled = enable;
- updateStatusBar();
- }
- }
-
- /**
- * Sets the ability to expand the notifications for the
- * status bar, updates the status bar service if there
- * is a change. Independent of the remaining Status Bar
- * functionality, including icons and notification
- * alerts.
- */
- void enableExpandedView(boolean enable) {
- if (mIsExpandedViewEnabled != enable) {
- mIsExpandedViewEnabled = enable;
- updateStatusBar();
- }
- }
-
- /**
- * Method to synchronize status bar state with our current
- * state.
- */
- void updateStatusBar() {
- int state = StatusBarManager.DISABLE_NONE;
-
- if (!mIsExpandedViewEnabled) {
- state |= StatusBarManager.DISABLE_EXPAND;
- }
-
- if (!mIsNotificationEnabled) {
- state |= StatusBarManager.DISABLE_NOTIFICATION_ALERTS;
- }
-
- // send the message to the status bar manager.
- if (DBG) log("updating status bar state: " + state);
- mStatusBar.disable(state);
- }
- }
-
- /**
- * Makes sure phone-related notifications are up to date on a
- * freshly-booted device.
- */
- private void updateNotificationsAtStartup() {
- if (DBG) log("updateNotificationsAtStartup()...");
-
- // instantiate query handler
- mQueryHandler = new QueryHandler(mContext.getContentResolver());
-
- // setup query spec, look for all Missed calls that are new.
- StringBuilder where = new StringBuilder("type=");
- where.append(Calls.MISSED_TYPE);
- where.append(" AND new=1");
-
- // start the query
- mQueryHandler.startQuery(CALL_LOG_TOKEN, null, Calls.CONTENT_URI, CALL_LOG_PROJECTION,
- where.toString(), null, Calls.DEFAULT_SORT_ORDER);
-
- // synchronize the in call notification
- if (mPhone.getState() != Phone.State.OFFHOOK) {
- if (DBG) log("Phone is idle, canceling notification.");
- cancelInCall();
- } else {
- if (DBG) log("Phone is offhook, updating notification.");
- updateInCallNotification();
- }
-
- // Depend on android.app.StatusBarManager to be set to
- // disable(DISABLE_NONE) upon startup. This will be the
- // case even if the phone app crashes.
- }
-
- /** The projection to use when querying the phones table */
- static final String[] PHONES_PROJECTION = new String[] {
- PhoneLookup.NUMBER,
- PhoneLookup.DISPLAY_NAME
- };
-
- /**
- * Class used to run asynchronous queries to re-populate
- * the notifications we care about.
- */
- private class QueryHandler extends AsyncQueryHandler {
-
- /**
- * Used to store relevant fields for the Missed Call
- * notifications.
- */
- private class NotificationInfo {
- public String name;
- public String number;
- public String label;
- public long date;
- }
-
- public QueryHandler(ContentResolver cr) {
- super(cr);
- }
-
- /**
- * Handles the query results. There are really 2 steps to this,
- * similar to what happens in RecentCallsListActivity.
- * 1. Find the list of missed calls
- * 2. For each call, run a query to retrieve the caller's name.
- */
- @Override
- protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
- // TODO: it would be faster to use a join here, but for the purposes
- // of this small record set, it should be ok.
-
- // Note that CursorJoiner is not useable here because the number
- // comparisons are not strictly equals; the comparisons happen in
- // the SQL function PHONE_NUMBERS_EQUAL, which is not available for
- // the CursorJoiner.
-
- // Executing our own query is also feasible (with a join), but that
- // will require some work (possibly destabilizing) in Contacts
- // Provider.
-
- // At this point, we will execute subqueries on each row just as
- // RecentCallsListActivity.java does.
- switch (token) {
- case CALL_LOG_TOKEN:
- if (DBG) log("call log query complete.");
-
- // initial call to retrieve the call list.
- if (cursor != null) {
- while (cursor.moveToNext()) {
- // for each call in the call log list, create
- // the notification object and query contacts
- NotificationInfo n = getNotificationInfo (cursor);
-
- if (DBG) log("query contacts for number: " + n.number);
-
- mQueryHandler.startQuery(CONTACT_TOKEN, n,
- Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, n.number),
- PHONES_PROJECTION, null, null, PhoneLookup.NUMBER);
- }
-
- if (DBG) log("closing call log cursor.");
- cursor.close();
- }
- break;
- case CONTACT_TOKEN:
- if (DBG) log("contact query complete.");
-
- // subqueries to get the caller name.
- if ((cursor != null) && (cookie != null)){
- NotificationInfo n = (NotificationInfo) cookie;
-
- if (cursor.moveToFirst()) {
- // we have contacts data, get the name.
- if (DBG) log("contact :" + n.name + " found for phone: " + n.number);
- n.name = cursor.getString(
- cursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME));
- }
-
- // send the notification
- if (DBG) log("sending notification.");
- notifyMissedCall(n.name, n.number, n.label, n.date);
-
- if (DBG) log("closing contact cursor.");
- cursor.close();
- }
- break;
- default:
- }
- }
-
- /**
- * Factory method to generate a NotificationInfo object given a
- * cursor from the call log table.
- */
- private final NotificationInfo getNotificationInfo(Cursor cursor) {
- NotificationInfo n = new NotificationInfo();
- n.name = null;
- n.number = cursor.getString(cursor.getColumnIndexOrThrow(Calls.NUMBER));
- n.label = cursor.getString(cursor.getColumnIndexOrThrow(Calls.TYPE));
- n.date = cursor.getLong(cursor.getColumnIndexOrThrow(Calls.DATE));
-
- // make sure we update the number depending upon saved values in
- // CallLog.addCall(). If either special values for unknown or
- // private number are detected, we need to hand off the message
- // to the missed call notification.
- if ( (n.number.equals(CallerInfo.UNKNOWN_NUMBER)) ||
- (n.number.equals(CallerInfo.PRIVATE_NUMBER)) ||
- (n.number.equals(CallerInfo.PAYPHONE_NUMBER)) ) {
- n.number = null;
- }
-
- if (DBG) log("NotificationInfo constructed for number: " + n.number);
-
- return n;
- }
- }
-
- /**
- * Configures a Notification to emit the blinky green message-waiting/
- * missed-call signal.
- */
- private static void configureLedNotification(Notification note) {
- note.flags |= Notification.FLAG_SHOW_LIGHTS;
- note.defaults |= Notification.DEFAULT_LIGHTS;
- }
-
- /**
- * Displays a notification about a missed call.
- *
- * @param nameOrNumber either the contact name, or the phone number if no contact
- * @param label the label of the number if nameOrNumber is a name, null if it is a number
- */
- void notifyMissedCall(String name, String number, String label, long date) {
- // title resource id
- int titleResId;
- // the text in the notification's line 1 and 2.
- String expandedText, callName;
-
- // increment number of missed calls.
- mNumberMissedCalls++;
-
- // get the name for the ticker text
- // i.e. "Missed call from <caller name or number>"
- if (name != null && TextUtils.isGraphic(name)) {
- callName = name;
- } else if (!TextUtils.isEmpty(number)){
- callName = number;
- } else {
- // use "unknown" if the caller is unidentifiable.
- callName = mContext.getString(R.string.unknown);
- }
-
- // display the first line of the notification:
- // 1 missed call: call name
- // more than 1 missed call: <number of calls> + "missed calls"
- if (mNumberMissedCalls == 1) {
- titleResId = R.string.notification_missedCallTitle;
- expandedText = callName;
- } else {
- titleResId = R.string.notification_missedCallsTitle;
- expandedText = mContext.getString(R.string.notification_missedCallsMsg,
- mNumberMissedCalls);
- }
-
- // create the target call log intent
- final Intent intent = PhoneApp.createCallLogIntent();
-
- // make the notification
- Notification note = new Notification(mContext, // context
- android.R.drawable.stat_notify_missed_call, // icon
- mContext.getString(R.string.notification_missedCallTicker, callName), // tickerText
- date, // when
- mContext.getText(titleResId), // expandedTitle
- expandedText, // expandedText
- intent // contentIntent
- );
- configureLedNotification(note);
- mNotificationMgr.notify(MISSED_CALL_NOTIFICATION, note);
- }
-
- void cancelMissedCallNotification() {
- // reset the number of missed calls to 0.
- mNumberMissedCalls = 0;
- mNotificationMgr.cancel(MISSED_CALL_NOTIFICATION);
- }
-
- void notifySpeakerphone() {
- if (mSpeakerphoneIcon == null) {
- mSpeakerphoneIcon = mStatusBar.addIcon("speakerphone",
- android.R.drawable.stat_sys_speakerphone, 0);
- }
- }
-
- void cancelSpeakerphone() {
- if (mSpeakerphoneIcon != null) {
- mStatusBar.removeIcon(mSpeakerphoneIcon);
- mSpeakerphoneIcon = null;
- }
- }
-
- /**
- * Calls either notifySpeakerphone() or cancelSpeakerphone() based on
- * the actual current state of the speaker.
- */
- void updateSpeakerNotification() {
- AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
-
- if ((mPhone.getState() == Phone.State.OFFHOOK) && audioManager.isSpeakerphoneOn()) {
- if (DBG) log("updateSpeakerNotification: speaker ON");
- notifySpeakerphone();
- } else {
- if (DBG) log("updateSpeakerNotification: speaker OFF (or not offhook)");
- cancelSpeakerphone();
- }
- }
-
- void notifyMute() {
- if (mMuteIcon == null) {
- mMuteIcon = mStatusBar.addIcon("mute", android.R.drawable.stat_notify_call_mute, 0);
- }
- }
-
- void cancelMute() {
- if (mMuteIcon != null) {
- mStatusBar.removeIcon(mMuteIcon);
- mMuteIcon = null;
- }
- }
-
- /**
- * Calls either notifyMute() or cancelMute() based on
- * the actual current mute state of the Phone.
- */
- void updateMuteNotification() {
- if ((mPhone.getState() == Phone.State.OFFHOOK) && mPhone.getMute()) {
- if (DBG) log("updateMuteNotification: MUTED");
- notifyMute();
- } else {
- if (DBG) log("updateMuteNotification: not muted (or not offhook)");
- cancelMute();
- }
- }
-
- void updateInCallNotification() {
- int resId;
- if (DBG) log("updateInCallNotification()...");
-
- if (mPhone.getState() != Phone.State.OFFHOOK) {
- return;
- }
-
- final boolean hasActiveCall = !mPhone.getForegroundCall().isIdle();
- final boolean hasHoldingCall = !mPhone.getBackgroundCall().isIdle();
-
- // Display the appropriate "in-call" icon in the status bar,
- // which depends on the current phone and/or bluetooth state.
-
-
- boolean enhancedVoicePrivacy = PhoneApp.getInstance().notifier.getCdmaVoicePrivacyState();
- if (DBG) log("updateInCallNotification: enhancedVoicePrivacy = " + enhancedVoicePrivacy);
-
- if (!hasActiveCall && hasHoldingCall) {
- // There's only one call, and it's on hold.
- if (enhancedVoicePrivacy) {
- resId = android.R.drawable.stat_sys_vp_phone_call_on_hold;
- } else {
- resId = android.R.drawable.stat_sys_phone_call_on_hold;
- }
- } else if (PhoneApp.getInstance().showBluetoothIndication()) {
- // Bluetooth is active.
- if (enhancedVoicePrivacy) {
- resId = com.android.internal.R.drawable.stat_sys_vp_phone_call_bluetooth;
- } else {
- resId = com.android.internal.R.drawable.stat_sys_phone_call_bluetooth;
- }
- } else {
- if (enhancedVoicePrivacy) {
- resId = android.R.drawable.stat_sys_vp_phone_call;
- } else {
- resId = android.R.drawable.stat_sys_phone_call;
- }
- }
-
- // Note we can't just bail out now if (resId == mInCallResId),
- // since even if the status icon hasn't changed, some *other*
- // notification-related info may be different from the last time
- // we were here (like the caller-id info of the foreground call,
- // if the user swapped calls...)
-
- if (DBG) log("- Updating status bar icon: " + resId);
- mInCallResId = resId;
-
- // 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.)
-
- // The icon in the expanded view is the same as in the status bar.
- int expandedViewIcon = mInCallResId;
-
- // Also, we don't have room to display caller-id info from two
- // different calls. So if there's only one call, use that, but if
- // both lines are in use we display the caller-id info from the
- // foreground call and totally ignore the background call.
- Call currentCall = hasActiveCall ? mPhone.getForegroundCall()
- : mPhone.getBackgroundCall();
- Connection currentConn = currentCall.getEarliestConnection();
-
- // When expanded, the "Ongoing call" notification is (visually)
- // different from most other Notifications, so we need to use a
- // custom view hierarchy.
-
- Notification notification = new Notification();
- notification.icon = mInCallResId;
- notification.contentIntent = PendingIntent.getActivity(mContext, 0,
- PhoneApp.createInCallIntent(), 0);
- notification.flags |= Notification.FLAG_ONGOING_EVENT;
-
- // Our custom view, which includes an icon (either "ongoing call" or
- // "on hold") and 2 lines of text: (1) the label (either "ongoing
- // call" with time counter, or "on hold), and (2) the compact name of
- // the current Connection.
- RemoteViews contentView = new RemoteViews(mContext.getPackageName(),
- R.layout.ongoing_call_notification);
- contentView.setImageViewResource(R.id.icon, expandedViewIcon);
-
- // if the connection is valid, then build what we need for the
- // first line of notification information, and start the chronometer.
- // Otherwise, don't bother and just stick with line 2.
- if (currentConn != null) {
- // Determine the "start time" of the current connection, in terms
- // of the SystemClock.elapsedRealtime() timebase (which is what
- // the Chronometer widget needs.)
- // We can't use currentConn.getConnectTime(), because (1) that's
- // in the currentTimeMillis() time base, and (2) it's zero when
- // the phone first goes off hook, since the getConnectTime counter
- // doesn't start until the DIALING -> ACTIVE transition.
- // Instead we start with the current connection's duration,
- // and translate that into the elapsedRealtime() timebase.
- long callDurationMsec = currentConn.getDurationMillis();
- long chronometerBaseTime = SystemClock.elapsedRealtime() - callDurationMsec;
-
- // Line 1 of the expanded view (in bold text):
- String expandedViewLine1;
- if (hasHoldingCall && !hasActiveCall) {
- // Only one call, and it's on hold!
- // Note this isn't a format string! (We want "On hold" here,
- // not "On hold (1:23)".) That's OK; if you call
- // String.format() with more arguments than format specifiers,
- // the extra arguments are ignored.
- expandedViewLine1 = mContext.getString(R.string.notification_on_hold);
- } else {
- // Format string with a "%s" where the current call time should go.
- expandedViewLine1 = mContext.getString(R.string.notification_ongoing_call_format);
- }
-
- if (DBG) log("- Updating expanded view: line 1 '" + expandedViewLine1 + "'");
-
- // Text line #1 is actually a Chronometer, not a plain TextView.
- // We format the elapsed time of the current call into a line like
- // "Ongoing call (01:23)".
- contentView.setChronometer(R.id.text1,
- chronometerBaseTime,
- expandedViewLine1,
- true);
- } else if (DBG) {
- log("updateInCallNotification: connection is null, call status not updated.");
- }
-
- // display conference call string if this call is a conference
- // call, otherwise display the connection information.
-
- // TODO: it may not make sense for every point to make separate
- // checks for isConferenceCall, so we need to think about
- // possibly including this in startGetCallerInfo or some other
- // common point.
- String expandedViewLine2 = "";
- if (PhoneUtils.isConferenceCall(currentCall)) {
- // if this is a conference call, just use that as the caller name.
- expandedViewLine2 = mContext.getString(R.string.card_title_conf_call);
- } else {
- // Start asynchronous call to get the compact name.
- PhoneUtils.CallerInfoToken cit =
- PhoneUtils.startGetCallerInfo (mContext, currentCall, this, contentView);
- // Line 2 of the expanded view (smaller text):
- expandedViewLine2 = PhoneUtils.getCompactNameFromCallerInfo(cit.currentInfo, mContext);
- }
-
- if (DBG) log("- Updating expanded view: line 2 '" + expandedViewLine2 + "'");
- contentView.setTextViewText(R.id.text2, expandedViewLine2);
- notification.contentView = contentView;
-
- // TODO: We also need to *update* this notification in some cases,
- // like when a call ends on one line but the other is still in use
- // (ie. make sure the caller info here corresponds to the active
- // line), and maybe even when the user swaps calls (ie. if we only
- // show info here for the "current active call".)
-
- if (DBG) log("Notifying IN_CALL_NOTIFICATION: " + notification);
- mNotificationMgr.notify(IN_CALL_NOTIFICATION,
- notification);
-
- // Finally, refresh the mute and speakerphone notifications (since
- // some phone state changes can indirectly affect the mute and/or
- // speaker state).
- updateSpeakerNotification();
- updateMuteNotification();
- }
-
- /**
- * Implemented for CallerInfoAsyncQuery.OnQueryCompleteListener interface.
- * refreshes the contentView when called.
- */
- public void onQueryComplete(int token, Object cookie, CallerInfo ci){
- if (DBG) log("callerinfo query complete, updating ui.");
-
- ((RemoteViews) cookie).setTextViewText(R.id.text2,
- PhoneUtils.getCompactNameFromCallerInfo(ci, mContext));
- }
-
- private void cancelInCall() {
- if (DBG) log("cancelInCall()...");
- cancelMute();
- cancelSpeakerphone();
- mNotificationMgr.cancel(IN_CALL_NOTIFICATION);
- mInCallResId = 0;
- }
-
- void cancelCallInProgressNotification() {
- if (DBG) log("cancelCallInProgressNotification()...");
- if (mInCallResId == 0) {
- return;
- }
-
- if (DBG) log("cancelCallInProgressNotification: " + mInCallResId);
- cancelInCall();
- }
-
- /**
- * Updates the message waiting indicator (voicemail) notification.
- *
- * @param visible true if there are messages waiting
- */
- /* package */ void updateMwi(boolean visible) {
- if (DBG) log("updateMwi(): " + visible);
- if (visible) {
- int resId = android.R.drawable.stat_notify_voicemail;
-
- // This Notification can get a lot fancier once we have more
- // information about the current voicemail messages.
- // (For example, the current voicemail system can't tell
- // us the caller-id or timestamp of a message, or tell us the
- // message count.)
-
- // But for now, the UI is ultra-simple: if the MWI indication
- // is supposed to be visible, just show a single generic
- // notification.
-
- String notificationTitle = mContext.getString(R.string.notification_voicemail_title);
- String vmNumber = mPhone.getVoiceMailNumber();
- if (DBG) log("- got vm number: '" + vmNumber + "'");
-
- // Watch out: vmNumber may be null, for two possible reasons:
- //
- // (1) This phone really has no voicemail number
- //
- // (2) This phone *does* have a voicemail number, but
- // the SIM isn't ready yet.
- //
- // Case (2) *does* happen in practice if you have voicemail
- // messages when the device first boots: we get an MWI
- // notification as soon as we register on the network, but the
- // SIM hasn't finished loading yet.
- //
- // So handle case (2) by retrying the lookup after a short
- // delay.
-
- if ((vmNumber == null) && !mPhone.getIccRecordsLoaded()) {
- if (DBG) log("- Null vm number: SIM records not loaded (yet)...");
-
- // TODO: rather than retrying after an arbitrary delay, it
- // would be cleaner to instead just wait for a
- // SIM_RECORDS_LOADED notification.
- // (Unfortunately right now there's no convenient way to
- // get that notification in phone app code. We'd first
- // want to add a call like registerForSimRecordsLoaded()
- // to Phone.java and GSMPhone.java, and *then* we could
- // listen for that in the CallNotifier class.)
-
- // Limit the number of retries (in case the SIM is broken
- // or missing and can *never* load successfully.)
- if (mVmNumberRetriesRemaining-- > 0) {
- if (DBG) log(" - Retrying in " + VM_NUMBER_RETRY_DELAY_MILLIS + " msec...");
- PhoneApp.getInstance().notifier.sendMwiChangedDelayed(
- VM_NUMBER_RETRY_DELAY_MILLIS);
- return;
- } else {
- Log.w(LOG_TAG, "NotificationMgr.updateMwi: getVoiceMailNumber() failed after "
- + MAX_VM_NUMBER_RETRIES + " retries; giving up.");
- // ...and continue with vmNumber==null, just as if the
- // phone had no VM number set up in the first place.
- }
- }
-
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- int vmCount = mPhone.getVoiceMessageCount();
- String titleFormat = mContext.getString(R.string.notification_voicemail_title_count);
- notificationTitle = String.format(titleFormat, vmCount);
- }
-
- String notificationText;
- if (TextUtils.isEmpty(vmNumber)) {
- notificationText = mContext.getString(
- R.string.notification_voicemail_no_vm_number);
- } else {
- notificationText = String.format(
- mContext.getString(R.string.notification_voicemail_text_format),
- PhoneNumberUtils.formatNumber(vmNumber));
- }
-
- Intent intent = new Intent(Intent.ACTION_CALL,
- Uri.fromParts("voicemail", "", null));
- PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
-
- Notification notification = new Notification(
- resId, // icon
- null, // tickerText
- System.currentTimeMillis() // Show the time the MWI notification came in,
- // since we don't know the actual time of the
- // most recent voicemail message
- );
- notification.setLatestEventInfo(
- mContext, // context
- notificationTitle, // contentTitle
- notificationText, // contentText
- pendingIntent // contentIntent
- );
- notification.defaults |= Notification.DEFAULT_SOUND;
- notification.flags |= Notification.FLAG_NO_CLEAR;
- configureLedNotification(notification);
- mNotificationMgr.notify(VOICEMAIL_NOTIFICATION, notification);
- } else {
- mNotificationMgr.cancel(VOICEMAIL_NOTIFICATION);
- }
- }
-
- /**
- * Updates the message call forwarding indicator notification.
- *
- * @param visible true if there are messages waiting
- */
- /* package */ void updateCfi(boolean visible) {
- if (DBG) log("updateCfi(): " + visible);
- if (visible) {
- // If Unconditional Call Forwarding (forward all calls) for VOICE
- // is enabled, just show a notification. We'll default to expanded
- // view for now, so the there is less confusion about the icon. If
- // it is deemed too weird to have CF indications as expanded views,
- // then we'll flip the flag back.
-
- // TODO: We may want to take a look to see if the notification can
- // display the target to forward calls to. This will require some
- // effort though, since there are multiple layers of messages that
- // will need to propagate that information.
-
- Notification notification;
- final boolean showExpandedNotification = true;
- if (showExpandedNotification) {
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setClassName("com.android.phone2",
- "com.android.phone2.CallFeaturesSetting");
-
- notification = new Notification(
- mContext, // context
- android.R.drawable.stat_sys_phone_call_forward, // icon
- null, // tickerText
- 0, // The "timestamp" of this notification is meaningless;
- // we only care about whether CFI is currently on or not.
- mContext.getString(R.string.labelCF), // expandedTitle
- mContext.getString(R.string.sum_cfu_enabled_indicator), // expandedText
- intent // contentIntent
- );
-
- } else {
- notification = new Notification(
- android.R.drawable.stat_sys_phone_call_forward, // icon
- null, // tickerText
- System.currentTimeMillis() // when
- );
- }
-
- notification.flags |= Notification.FLAG_ONGOING_EVENT; // also implies FLAG_NO_CLEAR
-
- mNotificationMgr.notify(
- CALL_FORWARD_NOTIFICATION,
- notification);
- } else {
- mNotificationMgr.cancel(CALL_FORWARD_NOTIFICATION);
- }
- }
-
- /**
- * Shows the "data disconnected due to roaming" notification, which
- * appears when you lose data connectivity because you're roaming and
- * you have the "data roaming" feature turned off.
- */
- /* package */ void showDataDisconnectedRoaming() {
- if (DBG) log("showDataDisconnectedRoaming()...");
-
- Intent intent = new Intent(mContext,
- Settings.class); // "Mobile network settings" screen
-
- Notification notification = new Notification(
- mContext, // context
- android.R.drawable.stat_sys_warning, // icon
- null, // tickerText
- System.currentTimeMillis(),
- mContext.getString(R.string.roaming), // expandedTitle
- mContext.getString(R.string.roaming_reenable_message), // expandedText
- intent // contentIntent
- );
- mNotificationMgr.notify(
- DATA_DISCONNECTED_ROAMING_NOTIFICATION,
- notification);
- }
-
- /**
- * Turns off the "data disconnected due to roaming" notification.
- */
- /* package */ void hideDataDisconnectedRoaming() {
- if (DBG) log("hideDataDisconnectedRoaming()...");
- mNotificationMgr.cancel(DATA_DISCONNECTED_ROAMING_NOTIFICATION);
- }
-
- /**
- * Display the network selection "no service" notification
- * @param operator is the numeric operator number
- */
- private void showNetworkSelection(String operator) {
- if (DBG) log("showNetworkSelection(" + operator + ")...");
-
- String titleText = mContext.getString(
- R.string.notification_network_selection_title);
- String expandedText = mContext.getString(
- R.string.notification_network_selection_text, operator);
-
- Notification notification = new Notification();
- notification.icon = com.android.internal.R.drawable.stat_sys_warning;
- notification.when = 0;
- notification.flags = Notification.FLAG_ONGOING_EVENT;
- notification.tickerText = null;
-
- // create the target network operators settings intent
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
- Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- // Use NetworkSetting to handle the selection intent
- intent.setComponent(new ComponentName("com.android.phone2",
- "com.android.phone2.NetworkSetting"));
- PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0);
-
- notification.setLatestEventInfo(mContext, titleText, expandedText, pi);
-
- mNotificationMgr.notify(SELECTED_OPERATOR_FAIL_NOTIFICATION, notification);
- }
-
- /**
- * Turn off the network selection "no service" notification
- */
- private void cancelNetworkSelection() {
- if (DBG) log("cancelNetworkSelection()...");
- mNotificationMgr.cancel(SELECTED_OPERATOR_FAIL_NOTIFICATION);
- }
-
- /**
- * Update notification about no service of user selected operator
- *
- * @param serviceState Phone service state
- */
- void updateNetworkSelection(int serviceState) {
- if (mPhone.getPhoneType() == Phone.PHONE_TYPE_GSM) {
- // get the shared preference of network_selection.
- // empty is auto mode, otherwise it is the operator alpha name
- // in case there is no operator name, check the operator numeric
- SharedPreferences sp =
- PreferenceManager.getDefaultSharedPreferences(mContext);
- String networkSelection =
- sp.getString(PhoneBase.NETWORK_SELECTION_NAME_KEY, "");
- if (TextUtils.isEmpty(networkSelection)) {
- networkSelection =
- sp.getString(PhoneBase.NETWORK_SELECTION_KEY, "");
- }
-
- if (DBG) log("updateNetworkSelection()..." + "state = " +
- serviceState + " new network " + networkSelection);
-
- if (serviceState == ServiceState.STATE_OUT_OF_SERVICE
- && !TextUtils.isEmpty(networkSelection)) {
- if (!mSelectedUnavailableNotify) {
- showNetworkSelection(networkSelection);
- mSelectedUnavailableNotify = true;
- }
- } else {
- if (mSelectedUnavailableNotify) {
- cancelNetworkSelection();
- mSelectedUnavailableNotify = false;
- }
- }
- }
- }
-
- /* package */ void postTransientNotification(int notifyId, CharSequence msg) {
- if (mToast != null) {
- mToast.cancel();
- }
-
- mToast = Toast.makeText(mContext, msg, Toast.LENGTH_LONG);
- mToast.show();
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/OtaStartupReceiver.java b/phone/src/com/android/phone2/OtaStartupReceiver.java
deleted file mode 100644
index bd16435..0000000
--- a/phone/src/com/android/phone2/OtaStartupReceiver.java
+++ /dev/null
@@ -1,99 +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.phone2;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemProperties;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.Log;
-
-/*
- * Handles OTA Start procedure at phone power up. At phone power up, if phone is not OTA
- * provisioned (check MIN value of the Phone) and 'device_provisioned' is not set,
- * OTA Activation screen is shown that helps user activate the phone
- */
-public class OtaStartupReceiver extends BroadcastReceiver {
- private static final String TAG = "OtaStartupReceiver";
- private static final boolean DBG = (SystemProperties.getInt("ro.debuggable", 0) == 1);
- private static final int MIN_READY = 10;
- private Context mContext;
-
- private Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MIN_READY:
- Log.v(TAG, "Attempting OtaActivation from handler");
- OtaUtils.maybeDoOtaCall(mContext, mHandler, MIN_READY);
- }
- }
- };
-
- public void onReceive(Context context, Intent intent) {
- mContext = context;
-
- if (!OtaUtils.isCdmaPhone()) {
- if (DBG) Log.d(TAG, "Not a CDMA phone, no need to process OTA");
- return;
- }
-
- if (shouldPostpone(context)) {
- if (DBG) Log.d(TAG, "Postponing CDMA provisioning until wizard runs");
- return;
- }
-
- // The following depends on the phone process being persistent. Normally we can't
- // expect a BroadcastReceiver to persist after returning from this function but it does
- // because the phone activity is persistent.
- OtaUtils.maybeDoOtaCall(mContext, mHandler, MIN_READY);
- }
-
- /**
- * On devices that provide a phone initialization wizard (such as Google Setup Wizard), we
- * allow delaying CDMA OTA setup so it can be done in a single wizard. The wizard is responsible
- * for (1) disabling itself once it has been run and/or (2) setting the 'device_provisioned'
- * flag to something non-zero and (3) calling the OTA Setup with the action below.
- *
- * NB: Typical phone initialization wizards will install themselves as the homescreen
- * (category "android.intent.category.HOME") with a priority higher than the default.
- * The wizard should set 'device_provisioned' when it completes, disable itself with the
- * PackageManager.setComponentEnabledSetting() and then start home screen.
- *
- * @return true if setup will be handled by wizard, false if it should be done now.
- */
- private boolean shouldPostpone(Context context) {
- Intent intent = new Intent("android.intent.action.DEVICE_INITIALIZATION_WIZARD");
- ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent,
- PackageManager.MATCH_DEFAULT_ONLY);
- boolean provisioned = Settings.Secure.getInt(context.getContentResolver(),
- Settings.Secure.DEVICE_PROVISIONED, 0) != 0;
- String mode = SystemProperties.get("ro.setupwizard.mode", "REQUIRED");
- boolean runningSetupWizard = "REQUIRED".equals(mode) || "OPTIONAL".equals(mode);
- if (DBG) {
- Log.v(TAG, "resolvInfo = " + resolveInfo + ", provisioned = " + provisioned
- + ", runningSetupWizard = " + runningSetupWizard);
- }
- return resolveInfo != null && !provisioned && runningSetupWizard;
- }
-}
diff --git a/phone/src/com/android/phone2/OtaUtils.java b/phone/src/com/android/phone2/OtaUtils.java
deleted file mode 100644
index 1632cb9..0000000
--- a/phone/src/com/android/phone2/OtaUtils.java
+++ /dev/null
@@ -1,1019 +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.phone2;
-
-import com.android.internal.telephony.Phone;
-import com.android.phone2.OtaUtils.CdmaOtaInCallScreenUiState.State;
-
-import android.app.AlertDialog;
-import android.app.PendingIntent;
-import android.app.PendingIntent.CanceledException;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.provider.Settings;
-
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewStub;
-import android.view.WindowManager;
-
-import android.widget.Button;
-import android.widget.ScrollView;
-import android.widget.ToggleButton;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-/**
- * Handles all OTA Call related logic and UI functionality.
- * The InCallScreen interacts with this class to perform an OTA Call.
- *
- * OTA is a CDMA-specific feature:
- * OTA or OTASP == Over The Air service provisioning
- * SPC == Service Programming Code
- * TODO: Include pointer to more detailed documentation.
- */
-public class OtaUtils {
- private static final String LOG_TAG = "OtaUtils";
- private static final String UNACTIVATED_MIN2_VALUE = "000000";
- private static final String UNACTIVATED_MIN_VALUE = "1111110111";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 1);
-
- public static final int OTA_SHOW_ACTIVATION_SCREEN_OFF = 0;
- public static final int OTA_SHOW_ACTIVATION_SCREEN_ON = 1;
- public static final int OTA_SHOW_LISTENING_SCREEN_OFF =0;
- public static final int OTA_SHOW_LISTENING_SCREEN_ON =1;
- public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF = 0;
- public static final int OTA_SHOW_ACTIVATE_FAIL_COUNT_THREE = 3;
- public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_OFF = 0;
- public static final int OTA_PLAY_SUCCESS_FAILURE_TONE_ON = 1;
-
- // SPC Timeout is 60 seconds
- public final int OTA_SPC_TIMEOUT = 60;
- public final int OTA_FAILURE_DIALOG_TIMEOUT = 2;
-
- private InCallScreen mInCallScreen;
- private Context mContext;
- private PhoneApp mApplication;
- private OtaWidgetData mOtaWidgetData;
- private ViewGroup mInCallPanel;
- private CallCard mCallCard;
-
- // The DTMFTwelveKeyDialer instance owned by the InCallScreen, which
- // the InCallScreen passes in to our constructor.
- private DTMFTwelveKeyDialer mDialer;
- //
- // The DTMFTwelveKeyDialer instance that we create ourselves in
- // initOtaInCallScreen(), and attach to the DTMFTwelveKeyDialerView
- // ("otaDtmfDialerView") that comes from otacall_card.xml.
- private DTMFTwelveKeyDialer mOtaCallCardDtmfDialer;
- // TODO: we ought to share a single DTMFTwelveKeyDialer instance for
- // both these uses, but see bug 2432289 for related issues.
-
- private static boolean mIsWizardMode = true;
-
- /**
- * OtaWidgetData class represent all OTA UI elements
- */
- private class OtaWidgetData {
- public Button otaEndButton;
- public Button otaActivateButton;
- public Button otaSkipButton;
- public Button otaNextButton;
- public ToggleButton otaSpeakerButton;
- public View otaCallCardBase;
- public View callCardOtaButtonsFailSuccess;
- public ProgressBar otaTextProgressBar;
- public TextView otaTextSuccessFail;
- public View callCardOtaButtonsActivate;
- public View callCardOtaButtonsListenProgress;
- public TextView otaTextActivate;
- public TextView otaTextListenProgress;
- public ScrollView otaTextListenProgressContainer;
- public AlertDialog spcErrorDialog;
- public AlertDialog otaFailureDialog;
- public AlertDialog otaSkipConfirmationDialog;
- public TextView otaTitle;
- public DTMFTwelveKeyDialerView otaDtmfDialerView;
- public Button otaTryAgainButton;
- }
-
- public OtaUtils(Context context,
- InCallScreen inCallScreen,
- ViewGroup inCallPanel,
- CallCard callCard,
- DTMFTwelveKeyDialer dialer) {
-
- if (DBG) log("Enter OtaUtil constructor");
-
- mInCallScreen = inCallScreen;
- mContext = context;
- mInCallPanel = inCallPanel;
- mCallCard = callCard;
- mDialer = dialer;
- mApplication = PhoneApp.getInstance();
- mOtaWidgetData = new OtaWidgetData();
-
- // inflate OTA Call card and footers
- ViewStub otaCallCardStub = (ViewStub) mInCallScreen.findViewById(R.id.otaCallCardStub);
- otaCallCardStub.inflate();
- readXmlSettings();
- initOtaInCallScreen();
- }
-
- /**
- * Returns true if the phone needs activation.
- *
- * @param minString the phone's MIN configuration string
- * @return true if phone needs activation
- * @throws OtaConfigurationException if the string is invalid
- */
- public static boolean needsActivation(String minString) throws IllegalArgumentException {
- if (minString == null || (minString.length() < 6)) {
- throw new IllegalArgumentException();
- }
- return (minString.equals(UNACTIVATED_MIN_VALUE)
- || minString.substring(0,6).equals(UNACTIVATED_MIN2_VALUE))
- || SystemProperties.getBoolean("test_cdma_setup", false);
- }
-
- /**
- * Starts the OTA provisioning call. If the MIN isn't available yet, it returns false and adds
- * an event to return the request to the calling app when it becomes available.
- *
- * @param context
- * @param handler
- * @param request
- * @return true if we were able to launch Ota activity or it's not required; false otherwise
- */
- public static boolean maybeDoOtaCall(Context context, Handler handler, int request) {
-
- PhoneApp app = PhoneApp.getInstance();
- Phone phone = app.phone;
-
- if (!isCdmaPhone()) {
- if (DBG) Log.v("OtaUtils", "Can't run provisioning on a non-CDMA phone");
- return true; // sanity check - a non-cdma phone doesn't need to run this
- }
-
- if (!phone.isMinInfoReady()) {
- if (DBG) log("MIN is not ready. Registering to receive notification.");
- phone.registerForSubscriptionInfoReady(handler, request, null);
- return false;
- }
-
- phone.unregisterForSubscriptionInfoReady(handler);
- String min = phone.getCdmaMin();
-
- if (DBG) log("min_string: " + min);
-
- boolean phoneNeedsActivation = false;
- try {
- phoneNeedsActivation = needsActivation(min);
- } catch (IllegalArgumentException e) {
- if (DBG) log("invalid MIN string, exit");
- return true; // If the MIN string is wrong, there's nothing else we can do.
- }
-
- if (DBG) log("phoneNeedsActivation is set to " + phoneNeedsActivation);
-
- int otaShowActivationScreen = context.getResources().getInteger(
- R.integer.OtaShowActivationScreen);
-
- if (DBG) log("otaShowActivationScreen: " + otaShowActivationScreen);
-
- if (phoneNeedsActivation && (otaShowActivationScreen == OTA_SHOW_ACTIVATION_SCREEN_ON)) {
- app.cdmaOtaProvisionData.isOtaCallIntentProcessed = false;
- Intent newIntent = new Intent(InCallScreen.ACTION_SHOW_ACTIVATION);
- newIntent.setClass(context, InCallScreen.class);
- newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mIsWizardMode = false;
- context.startActivity(newIntent);
- if (DBG) log("activation intent sent.");
- } else {
- if (DBG) log("activation intent NOT sent.");
- }
- return true;
- }
-
- private void setSpeaker(boolean state) {
- if (DBG) log("setSpeaker : " + state );
- if (state == PhoneUtils.isSpeakerOn(mContext)) {
- if (DBG) log("no change. returning");
- return;
- }
-
- if (state && mInCallScreen.isBluetoothAvailable()
- && mInCallScreen.isBluetoothAudioConnected()) {
- mInCallScreen.disconnectBluetoothAudio();
- }
- PhoneUtils.turnOnSpeaker(mContext, state, true);
- }
-
- /**
- * Handle OTA Provision events from Framework. Possible events are:
- * OTA Commit Event - OTA provisioning was successful
- * SPC retries exceeded - SPC failure retries has exceeded, and Phone needs to
- * power down.
- */
- public void onOtaProvisionStatusChanged(AsyncResult r) {
- int OtaStatus[] = (int[]) r.result;
- if (DBG) log("onOtaProvisionStatusChanged(): OtaStatus[0]" + OtaStatus[0]);
-
- switch(OtaStatus[0]) {
- case Phone.CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED:
- otaShowInProgressScreen();
- mApplication.cdmaOtaProvisionData.otaSpcUptime = SystemClock.elapsedRealtime();
- otaShowSpcErrorNotice(OTA_SPC_TIMEOUT);
- if (DBG) log("onOtaProvisionStatusChanged(): RETRIES EXCEEDED");
- // Power.shutdown();
- break;
-
- case Phone.CDMA_OTA_PROVISION_STATUS_COMMITTED:
- otaShowInProgressScreen();
- mApplication.cdmaOtaProvisionData.isOtaCallCommitted = true;
- if (DBG) log("onOtaProvisionStatusChanged(): DONE, isOtaCallCommitted set to true");
- break;
-
- case Phone.CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED:
- case Phone.CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED:
- case Phone.CDMA_OTA_PROVISION_STATUS_SSD_UPDATED:
- case Phone.CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED:
- case Phone.CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED:
- case Phone.CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED:
- case Phone.CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED:
- case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED:
- case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED:
- case Phone.CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED:
- if (DBG) log("onOtaProvisionStatusChanged(): change to ProgressScreen");
- otaShowInProgressScreen();
- break;
-
- default:
- if (DBG) log("onOtaProvisionStatusChanged(): Ignoring OtaStatus " + OtaStatus[0]);
- break;
- }
- }
-
- private void otaShowHome() {
- if (DBG) log("OtaShowHome()...");
- mApplication.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED;
- mInCallScreen.endInCallScreenSession();
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.addCategory (Intent.CATEGORY_HOME);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(intent);
- return;
- }
-
- private void otaSkipActivation() {
- if (DBG) log("otaSkipActivation()...");
-
- PhoneApp app = PhoneApp.getInstance();
- if (app != null && app.cdmaOtaInCallScreenUiState.reportSkipPendingIntent != null) {
- try {
- app.cdmaOtaInCallScreenUiState.reportSkipPendingIntent.send();
- } catch (CanceledException e) {
- // should never happen because no code cancels the pending intent right now,
- // but if it does, the user will simply be returned to the initial setup screen
- }
- }
-
- mInCallScreen.finish();
- return;
- }
-
- private void otaPerformActivation() {
- if (DBG) log("otaPerformActivation()...");
- if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) {
- Intent newIntent = new Intent(Intent.ACTION_CALL);
- newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, InCallScreen.OTA_NUMBER);
- mInCallScreen.internalResolveIntent(newIntent);
- otaShowListeningScreen();
- }
- return;
- }
-
- /**
- * Show Activation Screen when phone powers up and OTA provision is
- * required. Also shown when activation fails and user needs
- * to re-attempt it. Contains ACTIVATE and SKIP buttons
- * which allow user to start OTA activation or skip the activation process.
- */
- public void otaShowActivateScreen() {
- if (DBG) log("OtaShowActivationScreen()...");
- if (mApplication.cdmaOtaConfigData.otaShowActivationScreen
- == OTA_SHOW_ACTIVATION_SCREEN_ON) {
- if (DBG) log("OtaShowActivationScreen(): show activation screen");
- if (!isDialerOpened()) {
- otaScreenInitialize();
- mOtaWidgetData.otaSkipButton.setVisibility(mIsWizardMode ?
- View.VISIBLE : View.INVISIBLE);
- mOtaWidgetData.otaTextActivate.setVisibility(View.VISIBLE);
- mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.VISIBLE);
- } else {
- mDialer.setHandleVisible(true);
- }
- mApplication.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION;
- } else {
- if (DBG) log("OtaShowActivationScreen(): show home screen");
- otaShowHome();
- }
- }
-
- /**
- * Show "Listen for Instruction" screen during OTA call. Shown when OTA Call
- * is initiated and user needs to listen for network instructions and press
- * appropriate DTMF digits to proceed to the "Programming in Progress" phase.
- */
- private void otaShowListeningScreen() {
- if (DBG) log("OtaShowListeningScreen()...");
- if (mApplication.cdmaOtaConfigData.otaShowListeningScreen
- == OTA_SHOW_LISTENING_SCREEN_ON) {
- if (DBG) log("OtaShowListeningScreen(): show listening screen");
- if (!isDialerOpened()) {
- otaScreenInitialize();
- mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.VISIBLE);
- mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_listen);
- mOtaWidgetData.otaDtmfDialerView.setVisibility(View.VISIBLE);
- mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE);
- mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE);
- boolean speakerOn = PhoneUtils.isSpeakerOn(mContext);
- mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn);
- } else {
- mDialer.setHandleVisible(true);
- }
- mApplication.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING;
-
- // Update the state of the in-call menu items.
- mInCallScreen.updateMenuItems();
- } else {
- if (DBG) log("OtaShowListeningScreen(): show progress screen");
- otaShowInProgressScreen();
- }
- }
-
- /**
- * Show "Programming In Progress" screen during OTA call. Shown when OTA
- * provisioning is in progress after user has selected an option.
- */
- private void otaShowInProgressScreen() {
- if (DBG) log("OtaShowInProgressScreen()...");
- if (!isDialerOpened()) {
- otaScreenInitialize();
- mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.VISIBLE);
- mOtaWidgetData.otaTextListenProgress.setText(R.string.ota_progress);
- mOtaWidgetData.otaTextProgressBar.setVisibility(View.VISIBLE);
- mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.VISIBLE);
- mOtaWidgetData.otaSpeakerButton.setVisibility(View.VISIBLE);
- boolean speakerOn = PhoneUtils.isSpeakerOn(mContext);
- mOtaWidgetData.otaSpeakerButton.setChecked(speakerOn);
- } else {
- mDialer.setHandleVisible(true);
- }
- mApplication.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS;
-
- // Update the state of the in-call menu items.
- mInCallScreen.updateMenuItems();
- }
-
- /**
- * Show programming failure dialog when OTA provisioning fails.
- * If OTA provisioning attempts fail more than 3 times, then unsuccessful
- * dialog is shown. Otherwise a two-second notice is shown with unsuccessful
- * information. When notice expires, phone returns to activation screen.
- */
- private void otaShowProgramFailure(int length) {
- if (DBG) log("OtaShowProgramFailure()...");
- mApplication.cdmaOtaProvisionData.activationCount++;
- if ((mApplication.cdmaOtaProvisionData.activationCount <
- mApplication.cdmaOtaConfigData.otaShowActivateFailTimes)
- && (mApplication.cdmaOtaConfigData.otaShowActivationScreen ==
- OTA_SHOW_ACTIVATION_SCREEN_ON)) {
- if (DBG) log("OtaShowProgramFailure(): activationCount"
- + mApplication.cdmaOtaProvisionData.activationCount);
- if (DBG) log("OtaShowProgramFailure(): show failure notice");
- otaShowProgramFailureNotice(length);
- } else {
- if (DBG) log("OtaShowProgramFailure(): show failure dialog");
- otaShowProgramFailureDialog();
- }
- }
-
- /**
- * Show either programming success dialog when OTA provisioning succeeds, or
- * programming failure dialog when it fails. See {@link otaShowProgramFailure}
- * for more details.
- */
- public void otaShowSuccessFailure() {
- if (DBG) log("OtaShowSuccessFailure()...");
- otaScreenInitialize();
- if (DBG) log("OtaShowSuccessFailure(): isOtaCallCommitted"
- + mApplication.cdmaOtaProvisionData.isOtaCallCommitted);
- if (mApplication.cdmaOtaProvisionData.isOtaCallCommitted) {
- if (DBG) log("OtaShowSuccessFailure(), show success dialog");
- otaShowProgramSuccessDialog();
- } else {
- if (DBG) log("OtaShowSuccessFailure(), show failure dialog");
- otaShowProgramFailure(OTA_FAILURE_DIALOG_TIMEOUT);
- }
- return;
- }
-
- /**
- * Show programming failure dialog when OTA provisioning fails more than 3
- * times.
- */
- private void otaShowProgramFailureDialog() {
- if (DBG) log("OtaShowProgramFailureDialog()...");
- mApplication.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG;
- mOtaWidgetData.otaTitle.setText(R.string.ota_title_problem_with_activation);
- mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE);
- mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_unsuccessful);
- mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE);
- mOtaWidgetData.otaTryAgainButton.setVisibility(View.VISIBLE);
- //close the dialer if open
- if (isDialerOpened()) {
- mDialer.closeDialer(false);
- }
- }
-
- /**
- * Show programming success dialog when OTA provisioning succeeds.
- */
- private void otaShowProgramSuccessDialog() {
- if (DBG) log("OtaShowProgramSuccessDialog()...");
- mApplication.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_SUCCESS_FAILURE_DLG;
- mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate_success);
- mOtaWidgetData.otaTextSuccessFail.setVisibility(View.VISIBLE);
- mOtaWidgetData.otaTextSuccessFail.setText(R.string.ota_successful);
- mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.VISIBLE);
- mOtaWidgetData.otaNextButton.setVisibility(View.VISIBLE);
- //close the dialer if open
- if (isDialerOpened()) {
- mDialer.closeDialer(false);
- }
- }
-
- /**
- * Show SPC failure notice when SPC attempts exceed 15 times.
- * During OTA provisioning, if SPC code is incorrect OTA provisioning will
- * fail. When SPC attempts are over 15, it shows SPC failure notice for one minute and
- * then phone will power down.
- */
- private void otaShowSpcErrorNotice(int length) {
- if (DBG) log("OtaShowSpcErrorNotice()...");
- if (mOtaWidgetData.spcErrorDialog == null) {
- mApplication.cdmaOtaProvisionData.inOtaSpcState = true;
- DialogInterface.OnKeyListener keyListener;
- keyListener = new DialogInterface.OnKeyListener() {
- public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
- log("Ignoring key events...");
- return true;
- }};
- mOtaWidgetData.spcErrorDialog = new AlertDialog.Builder(mInCallScreen)
- .setMessage(R.string.ota_spc_failure)
- .setOnKeyListener(keyListener)
- .create();
- mOtaWidgetData.spcErrorDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- mOtaWidgetData.spcErrorDialog.show();
- //close the dialer if open
- if (isDialerOpened()) {
- mDialer.closeDialer(false);
- }
- long noticeTime = length*1000;
- if (DBG) log("OtaShowSpcErrorNotice(), remaining SPC noticeTime" + noticeTime);
- mInCallScreen.requestCloseSpcErrorNotice(noticeTime);
- }
- }
-
- /**
- * When SPC notice times out, force phone to power down.
- */
- public void onOtaCloseSpcNotice() {
- if (DBG) log("onOtaCloseSpcNotice(), send shutdown intent");
- Intent shutdown = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
- shutdown.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
- shutdown.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mContext.startActivity(shutdown);
- }
-
- /**
- * Show two-second notice when OTA provisioning fails and number of failed attempts
- * is less then 3.
- */
- private void otaShowProgramFailureNotice(int length) {
- if (DBG) log("OtaShowProgramFailureNotice()...");
- if (mOtaWidgetData.otaFailureDialog == null) {
- mOtaWidgetData.otaFailureDialog = new AlertDialog.Builder(mInCallScreen)
- .setMessage(R.string.ota_failure)
- .create();
- mOtaWidgetData.otaFailureDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- mOtaWidgetData.otaFailureDialog.show();
-
- long noticeTime = length*1000;
- mInCallScreen.requestCloseOtaFailureNotice(noticeTime);
- }
- }
-
- /**
- * Handle OTA unsuccessful notice expiry. Dismisses the
- * two-second notice and shows the activation screen.
- */
- public void onOtaCloseFailureNotice() {
- if (DBG) log("onOtaCloseFailureNotice()...");
- if (mOtaWidgetData.otaFailureDialog != null) {
- mOtaWidgetData.otaFailureDialog.dismiss();
- mOtaWidgetData.otaFailureDialog = null;
- }
- otaShowActivateScreen();
- }
-
- /**
- * Initialize all OTA UI elements to be gone. Also set inCallPanel,
- * callCard and the dialpad handle to be gone. This is called before any OTA screen
- * gets drawn.
- */
- private void otaScreenInitialize() {
- if (DBG) log("OtaScreenInitialize()...");
-
- if (mInCallPanel != null) mInCallPanel.setVisibility(View.GONE);
- if (mCallCard != null) mCallCard.hideCallCardElements();
- mDialer.setHandleVisible(false);
-
- mOtaWidgetData.otaTitle.setText(R.string.ota_title_activate);
- mOtaWidgetData.otaTextActivate.setVisibility(View.GONE);
- mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.GONE);
- mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE);
- mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE);
- mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE);
- mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE);
- mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE);
- mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE);
- mOtaWidgetData.otaSpeakerButton.setVisibility(View.GONE);
- mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE);
- mOtaWidgetData.otaNextButton.setVisibility(View.GONE);
- mOtaWidgetData.otaCallCardBase.setVisibility(View.VISIBLE);
- mOtaWidgetData.otaSkipButton.setVisibility(View.VISIBLE);
- }
-
- public void hideOtaScreen() {
- if (DBG) log("hideOtaScreen()...");
-
- mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE);
- mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE);
- mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE);
- mOtaWidgetData.otaCallCardBase.setVisibility(View.GONE);
- }
-
- public boolean isDialerOpened() {
- return (mDialer != null && mDialer.isOpened());
- }
-
- /**
- * Show the appropriate OTA screen based on the current state of OTA call.
- * Shown whenever calling screen is resumed.
- */
- public void otaShowProperScreen() {
- if (DBG) log("otaShowProperScreen()...");
- if (mInCallScreen.isForegroundActivity()) {
- if (DBG) log("otaShowProperScreen(), OTA is foreground activity, currentstate ="
- + mApplication.cdmaOtaScreenState.otaScreenState);
- if (mInCallPanel != null) {
- mInCallPanel.setVisibility(View.GONE);
- }
- if (mApplication.cdmaOtaScreenState.otaScreenState
- == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION) {
- otaShowActivateScreen();
- } else if (mApplication.cdmaOtaScreenState.otaScreenState
- == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING) {
- otaShowListeningScreen();
- } else if (mApplication.cdmaOtaScreenState.otaScreenState
- == CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS) {
- otaShowInProgressScreen();
- }
-
- if (mApplication.cdmaOtaProvisionData.inOtaSpcState) {
- otaShowSpcErrorNotice(getOtaSpcDisplayTime());
- }
- }
- }
-
- /**
- * Read configuration values for each OTA screen from config.xml.
- * These configuration values control visibility of each screen.
- */
- private void readXmlSettings() {
- if (DBG) log("readXmlSettings()...");
- if (mApplication.cdmaOtaConfigData.configComplete) {
- return;
- }
-
- mApplication.cdmaOtaConfigData.configComplete = true;
- int tmpOtaShowActivationScreen =
- mContext.getResources().getInteger(R.integer.OtaShowActivationScreen);
- mApplication.cdmaOtaConfigData.otaShowActivationScreen = tmpOtaShowActivationScreen;
- if (DBG) log("readXmlSettings(), otaShowActivationScreen"
- + mApplication.cdmaOtaConfigData.otaShowActivationScreen);
-
- int tmpOtaShowListeningScreen =
- mContext.getResources().getInteger(R.integer.OtaShowListeningScreen);
- mApplication.cdmaOtaConfigData.otaShowListeningScreen = tmpOtaShowListeningScreen;
- if (DBG) log("readXmlSettings(), otaShowListeningScreen"
- + mApplication.cdmaOtaConfigData.otaShowListeningScreen);
-
- int tmpOtaShowActivateFailTimes =
- mContext.getResources().getInteger(R.integer.OtaShowActivateFailTimes);
- mApplication.cdmaOtaConfigData.otaShowActivateFailTimes = tmpOtaShowActivateFailTimes;
- if (DBG) log("readXmlSettings(), otaShowActivateFailTimes"
- + mApplication.cdmaOtaConfigData.otaShowActivateFailTimes);
-
- int tmpOtaPlaySuccessFailureTone =
- mContext.getResources().getInteger(R.integer.OtaPlaySuccessFailureTone);
- mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone = tmpOtaPlaySuccessFailureTone;
- if (DBG) log("readXmlSettings(), otaPlaySuccessFailureTone"
- + mApplication.cdmaOtaConfigData.otaPlaySuccessFailureTone);
- }
-
- /**
- * Handle the click events for OTA buttons.
- */
- public void onClickHandler(int id) {
- switch (id) {
- case R.id.otaEndButton:
- onClickOtaEndButton();
- break;
-
- case R.id.otaSpeakerButton:
- onClickOtaSpeakerButton();
- break;
-
- case R.id.otaActivateButton:
- onClickOtaActivateButton();
- break;
-
- case R.id.otaSkipButton:
- onClickOtaActivateSkipButton();
- break;
-
- case R.id.otaNextButton:
- onClickOtaActivateNextButton();
- break;
-
- case R.id.otaTryAgainButton:
- onClickOtaTryAgainButton();
- break;
-
- default:
- if (DBG) log ("onClickHandler: received a click event for unrecognized id");
- break;
- }
- }
-
- private void onClickOtaTryAgainButton() {
- if (DBG) log("Activation Try Again Clicked!");
- if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) {
- otaShowActivateScreen();
- }
- }
-
- private void onClickOtaEndButton() {
- if (DBG) log("Activation End Call Button Clicked!");
- if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) {
- if (PhoneUtils.hangup(mApplication.phone) == false) {
- // If something went wrong when placing the OTA call,
- // the screen is not updated by the call disconnect
- // handler and we have to do it here
- setSpeaker(false);
- mInCallScreen.handleOtaCallEnd();
- }
- }
- }
-
- private void onClickOtaSpeakerButton() {
- if (DBG) log("OTA Speaker button Clicked!");
- if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) {
- boolean isChecked = !PhoneUtils.isSpeakerOn(mContext);
- setSpeaker(isChecked);
- }
- }
-
- private void onClickOtaActivateButton() {
- if (DBG) log("Call Activation Clicked!");
- otaPerformActivation();
- }
-
- private void onClickOtaActivateSkipButton() {
- if (DBG) log("Activation Skip Clicked!");
- DialogInterface.OnKeyListener keyListener;
- keyListener = new DialogInterface.OnKeyListener() {
- public boolean onKey(DialogInterface dialog, int keyCode,
- KeyEvent event) {
- if (DBG) log("Ignoring key events...");
- return true;
- }
- };
- mOtaWidgetData.otaSkipConfirmationDialog = new AlertDialog.Builder(mInCallScreen)
- .setTitle(R.string.ota_skip_activation_dialog_title)
- .setMessage(R.string.ota_skip_activation_dialog_message)
- .setPositiveButton(
- R.string.ota_skip_activation_dialog_skip_label,
- new AlertDialog.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- otaSkipActivation();
- }
- })
- .setNegativeButton(
- R.string.ota_skip_activation_dialog_continue_label,
- new AlertDialog.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- otaPerformActivation();
- }
- })
- .setOnKeyListener(keyListener)
- .create();
- mOtaWidgetData.otaSkipConfirmationDialog.show();
- }
-
- private void onClickOtaActivateNextButton() {
- if (DBG) log("Dialog Next Clicked!");
- if (!mApplication.cdmaOtaProvisionData.inOtaSpcState) {
- mApplication.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED;
- otaShowHome();
- }
- }
-
- public void dismissAllOtaDialogs() {
- if (mOtaWidgetData.spcErrorDialog != null) {
- if (DBG) log("- DISMISSING mSpcErrorDialog.");
- mOtaWidgetData.spcErrorDialog.dismiss();
- mOtaWidgetData.spcErrorDialog = null;
- }
- if (mOtaWidgetData.otaFailureDialog != null) {
- if (DBG) log("- DISMISSING mOtaFailureDialog.");
- mOtaWidgetData.otaFailureDialog.dismiss();
- mOtaWidgetData.otaFailureDialog = null;
- }
- }
-
- private int getOtaSpcDisplayTime() {
- if (DBG) log("getOtaSpcDisplayTime()...");
- int tmpSpcTime = 1;
- if (mApplication.cdmaOtaProvisionData.inOtaSpcState) {
- long tmpOtaSpcRunningTime = 0;
- long tmpOtaSpcLeftTime = 0;
- tmpOtaSpcRunningTime = SystemClock.elapsedRealtime();
- tmpOtaSpcLeftTime =
- tmpOtaSpcRunningTime - mApplication.cdmaOtaProvisionData.otaSpcUptime;
- if (tmpOtaSpcLeftTime >= OTA_SPC_TIMEOUT*1000) {
- tmpSpcTime = 1;
- } else {
- tmpSpcTime = OTA_SPC_TIMEOUT - (int)tmpOtaSpcLeftTime/1000;
- }
- }
- if (DBG) log("getOtaSpcDisplayTime(), time for SPC error notice: " + tmpSpcTime);
- return tmpSpcTime;
- }
-
- /**
- * Initialize the OTA widgets for all OTA screens.
- */
- private void initOtaInCallScreen() {
- if (DBG) log("initOtaInCallScreen()...");
- mOtaWidgetData.otaTitle = (TextView) mInCallScreen.findViewById(R.id.otaTitle);
- mOtaWidgetData.otaTextActivate = (TextView) mInCallScreen.findViewById(R.id.otaActivate);
- mOtaWidgetData.otaTextActivate.setVisibility(View.GONE);
- mOtaWidgetData.otaTextListenProgressContainer =
- (ScrollView) mInCallScreen.findViewById(R.id.otaListenProgressContainer);
- mOtaWidgetData.otaTextListenProgress =
- (TextView) mInCallScreen.findViewById(R.id.otaListenProgress);
- mOtaWidgetData.otaTextProgressBar =
- (ProgressBar) mInCallScreen.findViewById(R.id.progress_large);
- mOtaWidgetData.otaTextProgressBar.setIndeterminate(true);
- mOtaWidgetData.otaTextSuccessFail =
- (TextView) mInCallScreen.findViewById(R.id.otaSuccessFailStatus);
-
- mOtaWidgetData.otaCallCardBase = (View) mInCallScreen.findViewById(R.id.otaBase);
- mOtaWidgetData.callCardOtaButtonsListenProgress =
- (View) mInCallScreen.findViewById(R.id.callCardOtaListenProgress);
- mOtaWidgetData.callCardOtaButtonsActivate =
- (View) mInCallScreen.findViewById(R.id.callCardOtaActivate);
- mOtaWidgetData.callCardOtaButtonsFailSuccess =
- (View) mInCallScreen.findViewById(R.id.callCardOtaFailOrSuccessful);
-
- mOtaWidgetData.otaEndButton = (Button) mInCallScreen.findViewById(R.id.otaEndButton);
- mOtaWidgetData.otaEndButton.setOnClickListener(mInCallScreen);
- mOtaWidgetData.otaSpeakerButton =
- (ToggleButton) mInCallScreen.findViewById(R.id.otaSpeakerButton);
- mOtaWidgetData.otaSpeakerButton.setOnClickListener(mInCallScreen);
- mOtaWidgetData.otaActivateButton =
- (Button) mInCallScreen.findViewById(R.id.otaActivateButton);
- mOtaWidgetData.otaActivateButton.setOnClickListener(mInCallScreen);
- mOtaWidgetData.otaSkipButton = (Button) mInCallScreen.findViewById(R.id.otaSkipButton);
- mOtaWidgetData.otaSkipButton.setOnClickListener(mInCallScreen);
- mOtaWidgetData.otaNextButton = (Button) mInCallScreen.findViewById(R.id.otaNextButton);
- mOtaWidgetData.otaNextButton.setOnClickListener(mInCallScreen);
- mOtaWidgetData.otaTryAgainButton =
- (Button) mInCallScreen.findViewById(R.id.otaTryAgainButton);
- mOtaWidgetData.otaTryAgainButton.setOnClickListener(mInCallScreen);
-
- mOtaWidgetData.otaDtmfDialerView =
- (DTMFTwelveKeyDialerView) mInCallScreen.findViewById(R.id.otaDtmfDialer);
- // Sanity-check: the otaDtmfDialer widget should *always* be present.
- if (mOtaWidgetData.otaDtmfDialerView == null) {
- Log.e(LOG_TAG, "onCreate: couldn't find otaDtmfDialer", new IllegalStateException());
- }
-
-
- // Create a new DTMFTwelveKeyDialer instance purely for use by the
- // DTMFTwelveKeyDialerView ("otaDtmfDialerView") that comes from
- // otacall_card.xml.
- // (But note that mDialer is a separate DTMFTwelveKeyDialer
- // instance, that belongs to the InCallScreen. This is confusing;
- // see the TODO comment above.)
- mOtaCallCardDtmfDialer = new DTMFTwelveKeyDialer(mInCallScreen,
- mOtaWidgetData.otaDtmfDialerView,
- null /* no SlidingDrawer used here */);
-
- // Initialize the new DTMFTwelveKeyDialer instance. This is
- // needed to play local DTMF tones.
- mOtaCallCardDtmfDialer.startDialerSession();
-
- mOtaWidgetData.otaDtmfDialerView.setDialer(mOtaCallCardDtmfDialer);
- }
-
- /**
- * Clear out all OTA UI widget elements. Needs to get called
- * when OTA call ends or InCallScreen is destroyed.
- * @param disableSpeaker parameter control whether Speaker should be turned off.
- */
- public void cleanOtaScreen(boolean disableSpeaker) {
- if (DBG) log("OTA ends, cleanOtaScreen!");
-
- mApplication.cdmaOtaScreenState.otaScreenState =
- CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED;
- mApplication.cdmaOtaProvisionData.isOtaCallCommitted = false;
- mApplication.cdmaOtaProvisionData.isOtaCallIntentProcessed = false;
- mApplication.cdmaOtaProvisionData.inOtaSpcState = false;
- mApplication.cdmaOtaProvisionData.activationCount = 0;
- mApplication.cdmaOtaProvisionData.otaSpcUptime = 0;
- mApplication.cdmaOtaInCallScreenUiState.state = State.UNDEFINED;
-
- if (mInCallPanel != null) mInCallPanel.setVisibility(View.VISIBLE);
- if (mCallCard != null) mCallCard.hideCallCardElements();
- mDialer.setHandleVisible(true);
-
- // Free resources from the DTMFTwelveKeyDialer instance we created
- // in initOtaInCallScreen().
- if (mOtaCallCardDtmfDialer != null) {
- mOtaCallCardDtmfDialer.stopDialerSession();
- }
-
- mOtaWidgetData.otaTextActivate.setVisibility(View.GONE);
- mOtaWidgetData.otaTextListenProgressContainer.setVisibility(View.GONE);
- mOtaWidgetData.otaTextProgressBar.setVisibility(View.GONE);
- mOtaWidgetData.otaTextSuccessFail.setVisibility(View.GONE);
- mOtaWidgetData.callCardOtaButtonsActivate.setVisibility(View.GONE);
- mOtaWidgetData.callCardOtaButtonsListenProgress.setVisibility(View.GONE);
- mOtaWidgetData.callCardOtaButtonsFailSuccess.setVisibility(View.GONE);
- mOtaWidgetData.otaCallCardBase.setVisibility(View.GONE);
- mOtaWidgetData.otaDtmfDialerView.setVisibility(View.GONE);
- mOtaWidgetData.otaNextButton.setVisibility(View.GONE);
- mOtaWidgetData.otaTryAgainButton.setVisibility(View.GONE);
-
- // turn off the speaker in case it was turned on
- // but the OTA call could not be completed
- if (disableSpeaker) {
- setSpeaker(false);
- }
- }
-
- /**
- * Defines OTA information that needs to be maintained during
- * an OTA call when display orientation changes.
- */
- public static class CdmaOtaProvisionData {
- public boolean isOtaCallCommitted;
- public boolean isOtaCallIntentProcessed;
- public boolean inOtaSpcState;
- public int activationCount;
- public long otaSpcUptime;
- }
-
- /**
- * Defines OTA screen configuration items read from config.xml
- * and used to control OTA display.
- */
- public static class CdmaOtaConfigData {
- public int otaShowActivationScreen;
- public int otaShowListeningScreen;
- public int otaShowActivateFailTimes;
- public int otaPlaySuccessFailureTone;
- public boolean configComplete;
- public CdmaOtaConfigData() {
- if (DBG) log("CdmaOtaConfigData constructor!");
- otaShowActivationScreen = OTA_SHOW_ACTIVATION_SCREEN_OFF;
- otaShowListeningScreen = OTA_SHOW_LISTENING_SCREEN_OFF;
- otaShowActivateFailTimes = OTA_SHOW_ACTIVATE_FAIL_COUNT_OFF;
- otaPlaySuccessFailureTone = OTA_PLAY_SUCCESS_FAILURE_TONE_OFF;
- }
- }
-
- /**
- * The state of the OTA InCallScreen UI.
- */
- public static class CdmaOtaInCallScreenUiState {
- public enum State {
- UNDEFINED,
- NORMAL,
- ENDED
- }
-
- public State state;
-
- public CdmaOtaInCallScreenUiState() {
- if (DBG) log("CdmaOtaInCallScreenState: constructor init to UNDEFINED");
- state = CdmaOtaInCallScreenUiState.State.UNDEFINED;
- }
-
- // the pending intent used to report when the user skips ota provisioning
- public PendingIntent reportSkipPendingIntent;
- }
-
- /**
- * Save the Ota InCallScreen UI state
- */
- public void setCdmaOtaInCallScreenUiState(CdmaOtaInCallScreenUiState.State state) {
- if (DBG) log("setCdmaOtaInCallScreenState: " + state);
- mApplication.cdmaOtaInCallScreenUiState.state = state;
- }
-
- /**
- * Get the Ota InCallScreen UI state
- */
- public CdmaOtaInCallScreenUiState.State getCdmaOtaInCallScreenUiState() {
- if (DBG) log("getCdmaOtaInCallScreenState: " + mApplication.cdmaOtaInCallScreenUiState.state);
- return mApplication.cdmaOtaInCallScreenUiState.state;
- }
-
- /**
- * The OTA screen state machine.
- */
- public static class CdmaOtaScreenState {
- public enum OtaScreenState {
- OTA_STATUS_UNDEFINED,
- OTA_STATUS_ACTIVATION,
- OTA_STATUS_LISTENING,
- OTA_STATUS_PROGRESS,
- OTA_STATUS_SUCCESS_FAILURE_DLG
- }
-
- public OtaScreenState otaScreenState;
-
- public CdmaOtaScreenState() {
- otaScreenState = OtaScreenState.OTA_STATUS_UNDEFINED;
- }
- }
-
- private static void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-
- public static boolean isCdmaPhone() {
- return (PhoneApp.getInstance().phone.getPhoneType() == Phone.PHONE_TYPE_CDMA);
- }
-}
diff --git a/phone/src/com/android/phone2/OutgoingCallBroadcaster.java b/phone/src/com/android/phone2/OutgoingCallBroadcaster.java
deleted file mode 100644
index 0236645..0000000
--- a/phone/src/com/android/phone2/OutgoingCallBroadcaster.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.SystemProperties;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.telephony.Phone;
-
-/**
- * OutgoingCallBroadcaster receives CALL and CALL_PRIVILEGED Intents, and
- * broadcasts the ACTION_NEW_OUTGOING_CALL intent which allows other
- * applications to monitor, redirect, or prevent the outgoing call.
-
- * After the other applications have had a chance to see the
- * ACTION_NEW_OUTGOING_CALL intent, it finally reaches the
- * {@link OutgoingCallReceiver}, which passes the (possibly modified)
- * intent on to the {@link InCallScreen}.
- *
- * Emergency calls and calls where no number is present (like for a CDMA
- * "empty flash" or a nonexistent voicemail number) are exempt from being
- * broadcast.
- */
-public class OutgoingCallBroadcaster extends Activity {
-
- private static final String PERMISSION = android.Manifest.permission.PROCESS_OUTGOING_CALLS;
- private static final String TAG = "OutgoingCallBroadcaster";
- private static final boolean DBG =
- (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
-
- public static final String EXTRA_ALREADY_CALLED = "android.phone.extra.ALREADY_CALLED";
- public static final String EXTRA_ORIGINAL_URI = "android.phone.extra.ORIGINAL_URI";
-
- /**
- * Identifier for intent extra for sending an empty Flash message for
- * CDMA networks. This message is used by the network to simulate a
- * press/depress of the "hookswitch" of a landline phone. Aka "empty flash".
- *
- * TODO: Receiving an intent extra to tell the phone to send this flash is a
- * temporary measure. To be replaced with an external ITelephony call in the future.
- * TODO: Keep in sync with the string defined in TwelveKeyDialer.java in Contacts app
- * until this is replaced with the ITelephony API.
- */
- public static final String EXTRA_SEND_EMPTY_FLASH = "com.android.phone2.extra.SEND_EMPTY_FLASH";
-
- /**
- * OutgoingCallReceiver finishes NEW_OUTGOING_CALL broadcasts, starting
- * the InCallScreen if the broadcast has not been canceled, possibly with
- * a modified phone number and optional provider info (uri + package name + remote views.)
- */
- public class OutgoingCallReceiver extends BroadcastReceiver {
- private static final String TAG = "OutgoingCallReceiver";
-
- public void onReceive(Context context, Intent intent) {
- doReceive(context, intent);
- finish();
- }
-
- public void doReceive(Context context, Intent intent) {
- if (DBG) Log.v(TAG, "doReceive: " + intent);
-
- boolean alreadyCalled;
- String number;
- String originalUri;
-
- alreadyCalled = intent.getBooleanExtra(
- OutgoingCallBroadcaster.EXTRA_ALREADY_CALLED, false);
- if (alreadyCalled) {
- if (DBG) Log.v(TAG, "CALL already placed -- returning.");
- return;
- }
-
- number = getResultData();
- final PhoneApp app = PhoneApp.getInstance();
- int phoneType = app.phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- boolean activateState = (app.cdmaOtaScreenState.otaScreenState
- == OtaUtils.CdmaOtaScreenState.OtaScreenState.OTA_STATUS_ACTIVATION);
- boolean dialogState = (app.cdmaOtaScreenState.otaScreenState
- == OtaUtils.CdmaOtaScreenState.OtaScreenState
- .OTA_STATUS_SUCCESS_FAILURE_DLG);
- boolean isOtaCallActive = false;
-
- if ((app.cdmaOtaScreenState.otaScreenState
- == OtaUtils.CdmaOtaScreenState.OtaScreenState.OTA_STATUS_PROGRESS)
- || (app.cdmaOtaScreenState.otaScreenState
- == OtaUtils.CdmaOtaScreenState.OtaScreenState.OTA_STATUS_LISTENING)) {
- isOtaCallActive = true;
- }
-
- if (activateState || dialogState) {
- if (dialogState) app.dismissOtaDialogs();
- app.clearOtaState();
- app.clearInCallScreenMode();
- } else if (isOtaCallActive) {
- if (DBG) Log.v(TAG, "OTA call is active, a 2nd CALL cancelled -- returning.");
- return;
- }
- }
-
- if (number == null) {
- if (DBG) Log.v(TAG, "CALL cancelled (null number), returning...");
- return;
- } else if ((phoneType == Phone.PHONE_TYPE_CDMA)
- && ((app.phone.getState() != Phone.State.IDLE)
- && (app.phone.isOtaSpNumber(number)))) {
- if (DBG) Log.v(TAG, "Call is active, a 2nd OTA call cancelled -- returning.");
- return;
- } else if (PhoneNumberUtils.isEmergencyNumber(number)) {
- Log.w(TAG, "Cannot modify outgoing call to emergency number " + number + ".");
- return;
- }
-
- originalUri = intent.getStringExtra(
- OutgoingCallBroadcaster.EXTRA_ORIGINAL_URI);
- if (originalUri == null) {
- Log.e(TAG, "Intent is missing EXTRA_ORIGINAL_URI -- returning.");
- return;
- }
-
- Uri uri = Uri.parse(originalUri);
-
- if (DBG) Log.v(TAG, "CALL to " + number + " proceeding.");
-
- Intent newIntent = new Intent(Intent.ACTION_CALL, uri);
- newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
-
- PhoneUtils.checkAndCopyPhoneProviderExtras(intent, newIntent);
-
- newIntent.setClass(context, InCallScreen.class);
- newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
- if (DBG) Log.v(TAG, "doReceive(): calling startActivity: " + newIntent);
- context.startActivity(newIntent);
- }
- }
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- Intent intent = getIntent();
- final Configuration configuration = getResources().getConfiguration();
-
- if (DBG) Log.v(TAG, "onCreate: this = " + this + ", icicle = " + icicle);
- if (DBG) Log.v(TAG, " - getIntent() = " + intent);
- if (DBG) Log.v(TAG, " - configuration = " + configuration);
-
- if (icicle != null) {
- // A non-null icicle means that this activity is being
- // re-initialized after previously being shut down.
- //
- // In practice this happens very rarely (because the lifetime
- // of this activity is so short!), but it *can* happen if the
- // framework detects a configuration change at exactly the
- // right moment; see bug 2202413.
- //
- // In this case, do nothing. Our onCreate() method has already
- // run once (with icicle==null the first time), which means
- // that the NEW_OUTGOING_CALL broadcast for this new call has
- // already been sent.
- Log.i(TAG, "onCreate: non-null icicle! "
- + "Bailing out, not sending NEW_OUTGOING_CALL broadcast...");
-
- // No need to finish() here, since the OutgoingCallReceiver from
- // our original instance will do that. (It'll actually call
- // finish() on our original instance, which apparently works fine
- // even though the ActivityManager has already shut that instance
- // down. And note that if we *do* call finish() here, that just
- // results in an "ActivityManager: Duplicate finish request"
- // warning when the OutgoingCallReceiver runs.)
-
- return;
- }
-
- String action = intent.getAction();
- String number = PhoneNumberUtils.getNumberFromIntent(intent, this);
- Log.w(TAG, "getNumberFromIntent(): " + intent.getData() + " --> " + number);
- if (number != null) {
- // TODO: SIP: integrate this to PhoneApp later
- if (!isUri(number)) {
- number = PhoneNumberUtils.convertKeypadLettersToDigits(number);
- number = PhoneNumberUtils.stripSeparators(number);
- } else {
- number = stripSeparators(number);
- }
- }
- final boolean emergencyNumber =
- (number != null) && PhoneNumberUtils.isEmergencyNumber(number);
-
- boolean callNow;
-
- if (getClass().getName().equals(intent.getComponent().getClassName())) {
- // If we were launched directly from the OutgoingCallBroadcaster,
- // not one of its more privileged aliases, then make sure that
- // only the non-privileged actions are allowed.
- if (!Intent.ACTION_CALL.equals(intent.getAction())) {
- Log.w(TAG, "Attempt to deliver non-CALL action; forcing to CALL");
- intent.setAction(Intent.ACTION_CALL);
- }
- }
-
- /* Change CALL_PRIVILEGED into CALL or CALL_EMERGENCY as needed. */
- // TODO: This code is redundant with some code in InCallScreen: refactor.
- if (Intent.ACTION_CALL_PRIVILEGED.equals(action)) {
- action = emergencyNumber
- ? Intent.ACTION_CALL_EMERGENCY
- : Intent.ACTION_CALL;
- intent.setAction(action);
- }
-
- if (Intent.ACTION_CALL.equals(action)) {
- if (emergencyNumber) {
- Log.w(TAG, "Cannot call emergency number " + number
- + " with CALL Intent " + intent + ".");
-
- Intent invokeFrameworkDialer = new Intent();
-
- // TwelveKeyDialer is in a tab so we really want
- // DialtactsActivity. Build the intent 'manually' to
- // use the java resolver to find the dialer class (as
- // opposed to a Context which look up known android
- // packages only)
- invokeFrameworkDialer.setClassName("com.android.contacts",
- "com.android.contacts.DialtactsActivity");
- invokeFrameworkDialer.setAction(Intent.ACTION_DIAL);
- invokeFrameworkDialer.setData(intent.getData());
-
- if (DBG) Log.v(TAG, "onCreate(): calling startActivity for Dialer: "
- + invokeFrameworkDialer);
- startActivity(invokeFrameworkDialer);
- finish();
- return;
- }
- callNow = false;
- } else if (Intent.ACTION_CALL_EMERGENCY.equals(action)) {
- // ACTION_CALL_EMERGENCY case: this is either a CALL_PRIVILEGED
- // intent that we just turned into a CALL_EMERGENCY intent (see
- // above), or else it really is an CALL_EMERGENCY intent that
- // came directly from some other app (e.g. the EmergencyDialer
- // activity built in to the Phone app.)
- if (!emergencyNumber) {
- Log.w(TAG, "Cannot call non-emergency number " + number
- + " with EMERGENCY_CALL Intent " + intent + ".");
- finish();
- return;
- }
- callNow = true;
- } else {
- Log.e(TAG, "Unhandled Intent " + intent + ".");
- finish();
- return;
- }
-
- // Make sure the screen is turned on. This is probably the right
- // thing to do, and more importantly it works around an issue in the
- // activity manager where we will not launch activities consistently
- // when the screen is off (since it is trying to keep them paused
- // and has... issues).
- //
- // Also, this ensures the device stays awake while doing the following
- // broadcast; technically we should be holding a wake lock here
- // as well.
- PhoneApp.getInstance().wakeUpScreen();
-
- /* If number is null, we're probably trying to call a non-existent voicemail number,
- * send an empty flash or something else is fishy. Whatever the problem, there's no
- * number, so there's no point in allowing apps to modify the number. */
- if (number == null || TextUtils.isEmpty(number)) {
- if (intent.getBooleanExtra(EXTRA_SEND_EMPTY_FLASH, false)) {
- Log.i(TAG, "onCreate: SEND_EMPTY_FLASH...");
- PhoneUtils.sendEmptyFlash(PhoneApp.getInstance().phone);
- finish();
- return;
- } else {
- Log.i(TAG, "onCreate: null or empty number, setting callNow=true...");
- callNow = true;
- }
- }
-
- if (callNow) {
- intent.setClass(this, InCallScreen.class);
- if (DBG) Log.v(TAG, "onCreate(): callNow case, calling startActivity: " + intent);
- startActivity(intent);
- }
-
- Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);
- if (number != null) {
- broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
- }
- PhoneUtils.checkAndCopyPhoneProviderExtras(intent, broadcastIntent);
- broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow);
- broadcastIntent.putExtra(EXTRA_ORIGINAL_URI, intent.getData().toString());
-
- if (DBG) Log.v(TAG, "Broadcasting intent " + broadcastIntent + ".");
- sendOrderedBroadcast(broadcastIntent, PERMISSION,
- new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, null);
- // The receiver will finish our activity when it finally runs.
- }
-
- private static final char PAUSE = PhoneNumberUtils.PAUSE;
- private static final char WAIT = PhoneNumberUtils.WAIT;
- private static final char WILD = PhoneNumberUtils.WILD;
-
- // TODO: SIP: move isUri() to PhoneNumberUtils later
- // TODO: SIP: fix the check; how do we tell if it's a regular phone number
- // or a username in a SIP URI
- static boolean isUri(String phoneNumber) {
- if (TextUtils.isEmpty(phoneNumber)) return false;
- if (phoneNumber.contains("@")) return true;
- char c = phoneNumber.charAt(0);
- if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
- return true;
- } else {
- return false;
- }
- }
-
- private static String stripSeparators(String phoneNumber) {
- if (phoneNumber == null) {
- return null;
- }
- int len = phoneNumber.length();
- StringBuilder ret = new StringBuilder(len);
-
- for (int i = 0; i < len; i++) {
- char c = phoneNumber.charAt(i);
- if (isNonSeparator(c)) {
- ret.append(c);
- }
- }
-
- return ret.toString();
- }
-
- private static boolean isNonSeparator(char c) {
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'
- || c == '.' || c == '@' || PhoneNumberUtils.isNonSeparator(c);
- }
-
- // Implement onConfigurationChanged() purely for debugging purposes,
- // to make sure that the android:configChanges element in our manifest
- // is working properly.
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- if (DBG) Log.v(TAG, "onConfigurationChanged: newConfig = " + newConfig);
- }
-}
diff --git a/phone/src/com/android/phone2/PhoneApp.java b/phone/src/com/android/phone2/PhoneApp.java
deleted file mode 100755
index d053105..0000000
--- a/phone/src/com/android/phone2/PhoneApp.java
+++ /dev/null
@@ -1,1665 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.app.Application;
-import android.app.KeyguardManager;
-import android.app.ProgressDialog;
-import android.app.StatusBarManager;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothHeadset;
-import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Configuration;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.AsyncResult;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.IPowerManager;
-import android.os.LocalPowerManager;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.preference.PreferenceManager;
-import android.provider.Settings.System;
-import android.telephony.ServiceState;
-import android.util.Config;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.widget.Toast;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.MmiCode;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.telephony.cdma.EriInfo;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import com.android.phone2.OtaUtils.CdmaOtaScreenState;
-import com.android.internal.telephony.cdma.TtyIntent;
-
-/**
- * Top-level Application class for the Phone app.
- */
-public class PhoneApp extends Application implements AccelerometerListener.OrientationListener {
- /* package */ static final String LOG_TAG = "PhoneApp";
-
- /**
- * Phone app-wide debug level:
- * 0 - no debug logging
- * 1 - normal debug logging if ro.debuggable is set (which is true in
- * "eng" and "userdebug" builds but not "user" builds)
- * 2 - ultra-verbose debug logging
- *
- * Most individual classes in the phone app have a local DBG constant,
- * typically set to
- * (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1)
- * or else
- * (PhoneApp.DBG_LEVEL >= 2)
- * depending on the desired verbosity.
- */
- /* package */ static final int DBG_LEVEL = 1;
-
- private static final boolean DBG =
- (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
- private static final boolean VDBG = (PhoneApp.DBG_LEVEL >= 2);
-
- // Message codes; see mHandler below.
- private static final int EVENT_SIM_NETWORK_LOCKED = 3;
- private static final int EVENT_WIRED_HEADSET_PLUG = 7;
- private static final int EVENT_SIM_STATE_CHANGED = 8;
- private static final int EVENT_UPDATE_INCALL_NOTIFICATION = 9;
- private static final int EVENT_DATA_ROAMING_DISCONNECTED = 10;
- private static final int EVENT_DATA_ROAMING_OK = 11;
- private static final int EVENT_UNSOL_CDMA_INFO_RECORD = 12;
- private static final int EVENT_DOCK_STATE_CHANGED = 13;
- private static final int EVENT_TTY_PREFERRED_MODE_CHANGED = 14;
- private static final int EVENT_TTY_MODE_GET = 15;
- private static final int EVENT_TTY_MODE_SET = 16;
-
- // The MMI codes are also used by the InCallScreen.
- public static final int MMI_INITIATE = 51;
- public static final int MMI_COMPLETE = 52;
- public static final int MMI_CANCEL = 53;
- // Don't use message codes larger than 99 here; those are reserved for
- // the individual Activities of the Phone UI.
-
- /**
- * Allowable values for the poke lock code (timeout between a user activity and the
- * going to sleep), please refer to {@link com.android.server.PowerManagerService}
- * for additional reference.
- * SHORT uses the short delay for the timeout (SHORT_KEYLIGHT_DELAY, 6 sec)
- * MEDIUM uses the medium delay for the timeout (MEDIUM_KEYLIGHT_DELAY, 15 sec)
- * DEFAULT is the system-wide default delay for the timeout (1 min)
- */
- public enum ScreenTimeoutDuration {
- SHORT,
- MEDIUM,
- DEFAULT
- }
-
- /**
- * Allowable values for the wake lock code.
- * SLEEP means the device can be put to sleep.
- * PARTIAL means wake the processor, but we display can be kept off.
- * FULL means wake both the processor and the display.
- */
- public enum WakeState {
- SLEEP,
- PARTIAL,
- FULL
- }
-
- private static PhoneApp sMe;
-
- // A few important fields we expose to the rest of the package
- // directly (rather than thru set/get methods) for efficiency.
- Phone phone;
- CallNotifier notifier;
- Ringer ringer;
- BluetoothHandsfree mBtHandsfree;
- PhoneInterfaceManager phoneMgr;
- int mBluetoothHeadsetState = BluetoothHeadset.STATE_ERROR;
- int mBluetoothHeadsetAudioState = BluetoothHeadset.STATE_ERROR;
- boolean mShowBluetoothIndication = false;
- static int mDockState = Intent.EXTRA_DOCK_STATE_UNDOCKED;
-
- // Internal PhoneApp Call state tracker
- CdmaPhoneCallState cdmaPhoneCallState;
-
- // The InCallScreen instance (or null if the InCallScreen hasn't been
- // created yet.)
- private InCallScreen mInCallScreen;
-
- // The currently-active PUK entry activity and progress dialog.
- // Normally, these are the Emergency Dialer and the subsequent
- // progress dialog. null if there is are no such objects in
- // the foreground.
- private Activity mPUKEntryActivity;
- private ProgressDialog mPUKEntryProgressDialog;
-
- private boolean mIsSimPinEnabled;
- private String mCachedSimPin;
-
- // True if a wired headset is currently plugged in, based on the state
- // from the latest Intent.ACTION_HEADSET_PLUG broadcast we received in
- // mReceiver.onReceive().
- private boolean mIsHeadsetPlugged;
-
- // True if the keyboard is currently *not* hidden
- // Gets updated whenever there is a Configuration change
- private boolean mIsHardKeyboardOpen;
-
- // True if we are beginning a call, but the phone state has not changed yet
- private boolean mBeginningCall;
-
- // Last phone state seen by updatePhoneState()
- Phone.State mLastPhoneState = Phone.State.IDLE;
-
- private WakeState mWakeState = WakeState.SLEEP;
- private ScreenTimeoutDuration mScreenTimeoutDuration = ScreenTimeoutDuration.DEFAULT;
- private boolean mIgnoreTouchUserActivity = false;
- private IBinder mPokeLockToken = new Binder();
- private IPowerManager mPowerManagerService;
- private PowerManager.WakeLock mWakeLock;
- private PowerManager.WakeLock mPartialWakeLock;
- private PowerManager.WakeLock mProximityWakeLock;
- private KeyguardManager mKeyguardManager;
- private StatusBarManager mStatusBarManager;
- private int mStatusBarDisableCount;
- private AccelerometerListener mAccelerometerListener;
- private int mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
-
- // Broadcast receiver for various intent broadcasts (see onCreate())
- private final BroadcastReceiver mReceiver = new PhoneAppBroadcastReceiver();
-
- // Broadcast receiver purely for ACTION_MEDIA_BUTTON broadcasts
- private final BroadcastReceiver mMediaButtonReceiver = new MediaButtonBroadcastReceiver();
-
- /** boolean indicating restoring mute state on InCallScreen.onResume() */
- private boolean mShouldRestoreMuteOnInCallResume;
-
- // Following are the CDMA OTA information Objects used during OTA Call.
- // cdmaOtaProvisionData object store static OTA information that needs
- // to be maintained even during Slider open/close scenarios.
- // cdmaOtaConfigData object stores configuration info to control visiblity
- // of each OTA Screens.
- // cdmaOtaScreenState object store OTA Screen State information.
- public OtaUtils.CdmaOtaProvisionData cdmaOtaProvisionData;
- public OtaUtils.CdmaOtaConfigData cdmaOtaConfigData;
- public OtaUtils.CdmaOtaScreenState cdmaOtaScreenState;
- public OtaUtils.CdmaOtaInCallScreenUiState cdmaOtaInCallScreenUiState;
-
- // TTY feature enabled on this platform
- private boolean mTtyEnabled;
- // Current TTY operating mode selected by user
- private int mPreferredTtyMode = Phone.TTY_MODE_OFF;
-
- /**
- * Set the restore mute state flag. Used when we are setting the mute state
- * OUTSIDE of user interaction {@link PhoneUtils#startNewCall(Phone)}
- */
- /*package*/void setRestoreMuteOnInCallResume (boolean mode) {
- mShouldRestoreMuteOnInCallResume = mode;
- }
-
- /**
- * Get the restore mute state flag.
- * This is used by the InCallScreen {@link InCallScreen#onResume()} to figure
- * out if we need to restore the mute state for the current active call.
- */
- /*package*/boolean getRestoreMuteOnInCallResume () {
- return mShouldRestoreMuteOnInCallResume;
- }
-
- Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- Phone.State phoneState;
- switch (msg.what) {
-
- // TODO: This event should be handled by the lock screen, just
- // like the "SIM missing" and "Sim locked" cases (bug 1804111).
- case EVENT_SIM_NETWORK_LOCKED:
- if (getResources().getBoolean(R.bool.ignore_sim_network_locked_events)) {
- // Some products don't have the concept of a "SIM network lock"
- Log.i(LOG_TAG, "Ignoring EVENT_SIM_NETWORK_LOCKED event; "
- + "not showing 'SIM network unlock' PIN entry screen");
- } else {
- // Normal case: show the "SIM network unlock" PIN entry screen.
- // The user won't be able to do anything else until
- // they enter a valid SIM network PIN.
- Log.i(LOG_TAG, "show sim depersonal panel");
- IccNetworkDepersonalizationPanel ndpPanel =
- new IccNetworkDepersonalizationPanel(PhoneApp.getInstance());
- ndpPanel.show();
- }
- break;
-
- case EVENT_UPDATE_INCALL_NOTIFICATION:
- // Tell the NotificationMgr to update the "ongoing
- // call" icon in the status bar, if necessary.
- // Currently, this is triggered by a bluetooth headset
- // state change (since the status bar icon needs to
- // turn blue when bluetooth is active.)
- NotificationMgr.getDefault().updateInCallNotification();
- break;
-
- case EVENT_DATA_ROAMING_DISCONNECTED:
- NotificationMgr.getDefault().showDataDisconnectedRoaming();
- break;
-
- case EVENT_DATA_ROAMING_OK:
- NotificationMgr.getDefault().hideDataDisconnectedRoaming();
- break;
-
- case MMI_COMPLETE:
- onMMIComplete((AsyncResult) msg.obj);
- break;
-
- case MMI_CANCEL:
- PhoneUtils.cancelMmiCode(phone);
- break;
-
- case EVENT_WIRED_HEADSET_PLUG:
- // Since the presence of a wired headset or bluetooth affects the
- // speakerphone, update the "speaker" state. We ONLY want to do
- // this on the wired headset connect / disconnect events for now
- // though, so we're only triggering on EVENT_WIRED_HEADSET_PLUG.
-
- phoneState = phone.getState();
- // Do not change speaker state if phone is not off hook
- if (phoneState == Phone.State.OFFHOOK) {
- if (mBtHandsfree == null || !mBtHandsfree.isAudioOn()) {
- if (!isHeadsetPlugged()) {
- // if the state is "not connected", restore the speaker state.
- PhoneUtils.restoreSpeakerMode(getApplicationContext());
- } else {
- // if the state is "connected", force the speaker off without
- // storing the state.
- PhoneUtils.turnOnSpeaker(getApplicationContext(), false, false);
- }
- }
- }
- // Update the Proximity sensor based on headset state
- updateProximitySensorMode(phoneState);
-
- // Force TTY state update according to new headset state
- if (mTtyEnabled) {
- sendMessage(obtainMessage(EVENT_TTY_PREFERRED_MODE_CHANGED, 0));
- }
- break;
-
- case EVENT_SIM_STATE_CHANGED:
- // Marks the event where the SIM goes into ready state.
- // Right now, this is only used for the PUK-unlocking
- // process.
- if (msg.obj.equals(IccCard.INTENT_VALUE_ICC_READY)) {
- // when the right event is triggered and there
- // are UI objects in the foreground, we close
- // them to display the lock panel.
- if (mPUKEntryActivity != null) {
- mPUKEntryActivity.finish();
- mPUKEntryActivity = null;
- }
- if (mPUKEntryProgressDialog != null) {
- mPUKEntryProgressDialog.dismiss();
- mPUKEntryProgressDialog = null;
- }
- }
- break;
-
- case EVENT_UNSOL_CDMA_INFO_RECORD:
- //TODO: handle message here;
- break;
-
- case EVENT_DOCK_STATE_CHANGED:
- // If the phone is docked/undocked during a call, and no wired or BT headset
- // is connected: turn on/off the speaker accordingly.
- boolean inDockMode = false;
- if (mDockState == Intent.EXTRA_DOCK_STATE_DESK ||
- mDockState == Intent.EXTRA_DOCK_STATE_CAR) {
- inDockMode = true;
- }
- if (VDBG) Log.d(LOG_TAG, "received EVENT_DOCK_STATE_CHANGED. Phone inDock = "
- + inDockMode);
-
- phoneState = phone.getState();
- if (phoneState == Phone.State.OFFHOOK &&
- !isHeadsetPlugged() &&
- !(mBtHandsfree != null && mBtHandsfree.isAudioOn())) {
- PhoneUtils.turnOnSpeaker(getApplicationContext(), inDockMode, true);
-
- if (mInCallScreen != null) {
- mInCallScreen.requestUpdateTouchUi();
- }
- }
-
- case EVENT_TTY_PREFERRED_MODE_CHANGED:
- // TTY mode is only applied if a headset is connected
- int ttyMode;
- if (isHeadsetPlugged()) {
- ttyMode = mPreferredTtyMode;
- } else {
- ttyMode = Phone.TTY_MODE_OFF;
- }
- phone.setTTYMode(ttyMode, mHandler.obtainMessage(EVENT_TTY_MODE_SET));
- break;
-
- case EVENT_TTY_MODE_GET:
- handleQueryTTYModeResponse(msg);
- break;
-
- case EVENT_TTY_MODE_SET:
- handleSetTTYModeResponse(msg);
- break;
- }
- }
- };
-
- public PhoneApp() {
- sMe = this;
- }
-
- @Override
- public void onCreate() {
- if (VDBG) Log.v(LOG_TAG, "onCreate()...");
-
- ContentResolver resolver = getContentResolver();
-
- if (phone == null) {
- // Initialize the telephony framework
- SipPhoneFactory.makeDefaultPhones(this);
-
- // Get the default phone
- phone = SipPhoneFactory.getDefaultPhone();
-
- NotificationMgr.init(this);
-
- //phoneMgr = new PhoneInterfaceManager(this, phone);
-
- int phoneType = phone.getPhoneType();
-
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // Create an instance of CdmaPhoneCallState and initialize it to IDLE
- cdmaPhoneCallState = new CdmaPhoneCallState();
- cdmaPhoneCallState.CdmaPhoneCallStateInit();
- }
-
- if (BluetoothAdapter.getDefaultAdapter() != null) {
- mBtHandsfree = new BluetoothHandsfree(this, phone);
- startService(new Intent(this, BluetoothHeadsetService.class));
- } else {
- // Device is not bluetooth capable
- mBtHandsfree = null;
- }
-
- ringer = new Ringer(phone);
-
- // before registering for phone state changes
- PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
- | PowerManager.ACQUIRE_CAUSES_WAKEUP
- | PowerManager.ON_AFTER_RELEASE, LOG_TAG);
- // lock used to keep the processor awake, when we don't care for the display.
- mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK
- | PowerManager.ON_AFTER_RELEASE, LOG_TAG);
- // Wake lock used to control proximity sensor behavior.
- if ((pm.getSupportedWakeLockFlags()
- & PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) != 0x0) {
- mProximityWakeLock =
- pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, LOG_TAG);
- }
- if (DBG) Log.d(LOG_TAG, "onCreate: mProximityWakeLock: " + mProximityWakeLock);
-
- // create mAccelerometerListener only if we are using the proximity sensor
- if (proximitySensorModeEnabled()) {
- mAccelerometerListener = new AccelerometerListener(this, this);
- }
-
- mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
- mStatusBarManager = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);
-
- // get a handle to the service so that we can use it later when we
- // want to set the poke lock.
- mPowerManagerService = IPowerManager.Stub.asInterface(
- ServiceManager.getService("power"));
-
- notifier = new CallNotifier(this, phone, ringer, mBtHandsfree, new CallLogAsync());
-
- // register for ICC status
- IccCard sim = phone.getIccCard();
- if (sim != null) {
- if (VDBG) Log.v(LOG_TAG, "register for ICC status");
- sim.registerForNetworkLocked(mHandler, EVENT_SIM_NETWORK_LOCKED, null);
- }
-
- // register for MMI/USSD
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- phone.registerForMmiComplete(mHandler, MMI_COMPLETE, null);
- }
-
- // register connection tracking to PhoneUtils
- PhoneUtils.initializeConnectionHandler(phone);
-
- // Read platform settings for TTY feature
- mTtyEnabled = getResources().getBoolean(R.bool.tty_enabled);
-
- // Register for misc other intent broadcasts.
- IntentFilter intentFilter =
- new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
- intentFilter.addAction(BluetoothHeadset.ACTION_STATE_CHANGED);
- intentFilter.addAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
- intentFilter.addAction(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
- intentFilter.addAction(Intent.ACTION_HEADSET_PLUG);
- intentFilter.addAction(Intent.ACTION_DOCK_EVENT);
- intentFilter.addAction(Intent.ACTION_BATTERY_LOW);
- intentFilter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
- intentFilter.addAction(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
- intentFilter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);
- intentFilter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
- if (mTtyEnabled) {
- intentFilter.addAction(TtyIntent.TTY_PREFERRED_MODE_CHANGE_ACTION);
- }
- intentFilter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
- registerReceiver(mReceiver, intentFilter);
-
- // Use a separate receiver for ACTION_MEDIA_BUTTON broadcasts,
- // since we need to manually adjust its priority (to make sure
- // we get these intents *before* the media player.)
- IntentFilter mediaButtonIntentFilter =
- new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
- //
- // Make sure we're higher priority than the media player's
- // MediaButtonIntentReceiver (which currently has the default
- // priority of zero; see apps/Music/AndroidManifest.xml.)
- mediaButtonIntentFilter.setPriority(1);
- //
- registerReceiver(mMediaButtonReceiver, mediaButtonIntentFilter);
-
- //set the default values for the preferences in the phone.
- PreferenceManager.setDefaultValues(this, R.xml.network_setting, false);
-
- PreferenceManager.setDefaultValues(this, R.xml.call_feature_setting, false);
-
- // Make sure the audio mode (along with some
- // audio-mode-related state of our own) is initialized
- // correctly, given the current state of the phone.
- switch (phone.getState()) {
- case IDLE:
- if (DBG) Log.d(LOG_TAG, "Resetting audio state/mode: IDLE");
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_IDLE);
- PhoneUtils.setAudioMode(this, AudioManager.MODE_NORMAL);
- break;
- case RINGING:
- if (DBG) Log.d(LOG_TAG, "Resetting audio state/mode: RINGING");
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_RINGING);
- PhoneUtils.setAudioMode(this, AudioManager.MODE_RINGTONE);
- break;
- case OFFHOOK:
- if (DBG) Log.d(LOG_TAG, "Resetting audio state/mode: OFFHOOK");
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_OFFHOOK);
- PhoneUtils.setAudioMode(this, AudioManager.MODE_IN_CALL);
- break;
- }
- }
-
- boolean phoneIsCdma = (phone.getPhoneType() == Phone.PHONE_TYPE_CDMA);
-
- if (phoneIsCdma) {
- cdmaOtaProvisionData = new OtaUtils.CdmaOtaProvisionData();
- cdmaOtaConfigData = new OtaUtils.CdmaOtaConfigData();
- cdmaOtaScreenState = new OtaUtils.CdmaOtaScreenState();
- cdmaOtaInCallScreenUiState = new OtaUtils.CdmaOtaInCallScreenUiState();
- }
-
- // XXX pre-load the SimProvider so that it's ready
- resolver.getType(Uri.parse("content://icc/adn"));
-
- // start with the default value to set the mute state.
- mShouldRestoreMuteOnInCallResume = false;
-
- // TODO: Register for Cdma Information Records
- // phone.registerCdmaInformationRecord(mHandler, EVENT_UNSOL_CDMA_INFO_RECORD, null);
-
- // Read TTY settings and store it into BP NV.
- // AP owns (i.e. stores) the TTY setting in AP settings database and pushes the setting
- // to BP at power up (BP does not need to make the TTY setting persistent storage).
- // This way, there is a single owner (i.e AP) for the TTY setting in the phone.
- if (mTtyEnabled) {
- mPreferredTtyMode = android.provider.Settings.Secure.getInt(
- phone.getContext().getContentResolver(),
- android.provider.Settings.Secure.PREFERRED_TTY_MODE,
- Phone.TTY_MODE_OFF);
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_TTY_PREFERRED_MODE_CHANGED, 0));
- }
- // Read HAC settings and configure audio hardware
- if (getResources().getBoolean(R.bool.hac_enabled)) {
- int hac = android.provider.Settings.System.getInt(phone.getContext().getContentResolver(),
- android.provider.Settings.System.HEARING_AID,
- 0);
- AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
- audioManager.setParameter(CallFeaturesSetting.HAC_KEY, hac != 0 ?
- CallFeaturesSetting.HAC_VAL_ON :
- CallFeaturesSetting.HAC_VAL_OFF);
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
- mIsHardKeyboardOpen = true;
- } else {
- mIsHardKeyboardOpen = false;
- }
-
- // Update the Proximity sensor based on keyboard state
- updateProximitySensorMode(phone.getState());
- super.onConfigurationChanged(newConfig);
- }
-
- /**
- * Returns the singleton instance of the PhoneApp.
- */
- static PhoneApp getInstance() {
- return sMe;
- }
-
- Ringer getRinger() {
- return ringer;
- }
-
- BluetoothHandsfree getBluetoothHandsfree() {
- return mBtHandsfree;
- }
-
- static Intent createCallLogIntent() {
- Intent intent = new Intent(Intent.ACTION_VIEW, null);
- intent.setType("vnd.android.cursor.dir/calls");
- return intent;
- }
-
- /**
- * Return an Intent that can be used to bring up the in-call screen.
- *
- * This intent can only be used from within the Phone app, since the
- * InCallScreen is not exported from our AndroidManifest.
- */
- /* package */ static Intent createInCallIntent() {
- Intent intent = new Intent(Intent.ACTION_MAIN, null);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
- intent.setClassName("com.android.phone2", getCallScreenClassName());
- return intent;
- }
-
- /**
- * Variation of createInCallIntent() that also specifies whether the
- * DTMF dialpad should be initially visible when the InCallScreen
- * comes up.
- */
- /* package */ static Intent createInCallIntent(boolean showDialpad) {
- Intent intent = createInCallIntent();
- intent.putExtra(InCallScreen.SHOW_DIALPAD_EXTRA, showDialpad);
- return intent;
- }
-
- static String getCallScreenClassName() {
- return InCallScreen.class.getName();
- }
-
- /**
- * Starts the InCallScreen Activity.
- */
- void displayCallScreen() {
- if (VDBG) Log.d(LOG_TAG, "displayCallScreen()...");
- startActivity(createInCallIntent());
- Profiler.callScreenRequested();
- }
-
- /**
- * Helper function to check for one special feature of the CALL key:
- * Normally, when the phone is idle, CALL takes you to the call log
- * (see the handler for KEYCODE_CALL in PhoneWindow.onKeyUp().)
- * But if the phone is in use (either off-hook or ringing) we instead
- * handle the CALL button by taking you to the in-call UI.
- *
- * @return true if we intercepted the CALL keypress (i.e. the phone
- * was in use)
- *
- * @see DialerActivity#onCreate
- */
- boolean handleInCallOrRinging() {
- if (phone.getState() != Phone.State.IDLE) {
- // Phone is OFFHOOK or RINGING.
- if (DBG) Log.v(LOG_TAG,
- "handleInCallOrRinging: show call screen");
- displayCallScreen();
- return true;
- }
- return false;
- }
-
- boolean isSimPinEnabled() {
- return mIsSimPinEnabled;
- }
-
- boolean authenticateAgainstCachedSimPin(String pin) {
- return (mCachedSimPin != null && mCachedSimPin.equals(pin));
- }
-
- void setCachedSimPin(String pin) {
- mCachedSimPin = pin;
- }
-
- void setInCallScreenInstance(InCallScreen inCallScreen) {
- mInCallScreen = inCallScreen;
- }
-
- /**
- * @return true if the in-call UI is running as the foreground
- * activity. (In other words, from the perspective of the
- * InCallScreen activity, return true between onResume() and
- * onPause().)
- *
- * Note this method will return false if the screen is currently off,
- * even if the InCallScreen *was* in the foreground just before the
- * screen turned off. (This is because the foreground activity is
- * always "paused" while the screen is off.)
- */
- boolean isShowingCallScreen() {
- if (mInCallScreen == null) return false;
- return mInCallScreen.isForegroundActivity();
- }
-
- /**
- * Dismisses the in-call UI.
- *
- * This also ensures that you won't be able to get back to the in-call
- * UI via the BACK button (since this call removes the InCallScreen
- * from the activity history.)
- * For OTA Call, it call InCallScreen api to handle OTA Call End scenario
- * to display OTA Call End screen.
- */
- void dismissCallScreen() {
- if (mInCallScreen != null) {
- if (mInCallScreen.isOtaCallInActiveState()
- || mInCallScreen.isOtaCallInEndState()
- || ((cdmaOtaScreenState != null)
- && (cdmaOtaScreenState.otaScreenState
- != CdmaOtaScreenState.OtaScreenState.OTA_STATUS_UNDEFINED))) {
- // TODO: During OTA Call, display should not become dark to
- // allow user to see OTA UI update. Phone app needs to hold
- // a SCREEN_DIM_WAKE_LOCK wake lock during the entire OTA call.
- wakeUpScreen();
- // If InCallScreen is not in foreground we resume it to show the OTA call end screen
- // Fire off the InCallScreen intent
- displayCallScreen();
-
- mInCallScreen.handleOtaCallEnd();
- return;
- } else {
- mInCallScreen.finish();
- }
- }
- }
-
- /**
- * Handle OTA events
- *
- * When OTA call is active and display becomes dark, then CallNotifier will
- * handle OTA Events by calling this api which then calls OtaUtil function.
- */
- void handleOtaEvents(Message msg) {
-
- if (DBG) Log.d(LOG_TAG, "Enter handleOtaEvents");
- if ((mInCallScreen != null) && (!isShowingCallScreen())) {
- if (mInCallScreen.otaUtils != null) {
- mInCallScreen.otaUtils.onOtaProvisionStatusChanged((AsyncResult) msg.obj);
- }
- }
- }
-
-
- /**
- * Sets the activity responsible for un-PUK-blocking the device
- * so that we may close it when we receive a positive result.
- * mPUKEntryActivity is also used to indicate to the device that
- * we are trying to un-PUK-lock the phone. In other words, iff
- * it is NOT null, then we are trying to unlock and waiting for
- * the SIM to move to READY state.
- *
- * @param activity is the activity to close when PUK has
- * finished unlocking. Can be set to null to indicate the unlock
- * or SIM READYing process is over.
- */
- void setPukEntryActivity(Activity activity) {
- mPUKEntryActivity = activity;
- }
-
- Activity getPUKEntryActivity() {
- return mPUKEntryActivity;
- }
-
- /**
- * Sets the dialog responsible for notifying the user of un-PUK-
- * blocking - SIM READYing progress, so that we may dismiss it
- * when we receive a positive result.
- *
- * @param dialog indicates the progress dialog informing the user
- * of the state of the device. Dismissed upon completion of
- * READYing process
- */
- void setPukEntryProgressDialog(ProgressDialog dialog) {
- mPUKEntryProgressDialog = dialog;
- }
-
- ProgressDialog getPUKEntryProgressDialog() {
- return mPUKEntryProgressDialog;
- }
-
- /**
- * Disables the status bar. This is used by the phone app when in-call UI is active.
- *
- * Any call to this method MUST be followed (eventually)
- * by a corresponding reenableStatusBar() call.
- */
- /* package */ void disableStatusBar() {
- if (DBG) Log.d(LOG_TAG, "disable status bar");
- synchronized (this) {
- if (mStatusBarDisableCount++ == 0) {
- if (DBG) Log.d(LOG_TAG, "StatusBarManager.DISABLE_EXPAND");
- mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND);
- }
- }
- }
-
- /**
- * Re-enables the status bar after a previous disableStatusBar() call.
- *
- * Any call to this method MUST correspond to (i.e. be balanced with)
- * a previous disableStatusBar() call.
- */
- /* package */ void reenableStatusBar() {
- if (DBG) Log.d(LOG_TAG, "re-enable status bar");
- synchronized (this) {
- if (mStatusBarDisableCount > 0) {
- if (--mStatusBarDisableCount == 0) {
- if (DBG) Log.d(LOG_TAG, "StatusBarManager.DISABLE_NONE");
- mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
- }
- } else {
- Log.e(LOG_TAG, "mStatusBarDisableCount is already zero");
- }
- }
- }
-
- /**
- * Controls how quickly the screen times out.
- *
- * The poke lock controls how long it takes before the screen powers
- * down, and therefore has no immediate effect when the current
- * WakeState (see {@link PhoneApp#requestWakeState}) is FULL.
- * If we're in a state where the screen *is* allowed to turn off,
- * though, the poke lock will determine the timeout interval (long or
- * short).
- *
- * @param shortPokeLock tells the device the timeout duration to use
- * before going to sleep
- * {@link com.android.server.PowerManagerService#SHORT_KEYLIGHT_DELAY}.
- */
- /* package */ void setScreenTimeout(ScreenTimeoutDuration duration) {
- if (VDBG) Log.d(LOG_TAG, "setScreenTimeout(" + duration + ")...");
-
- // make sure we don't set the poke lock repeatedly so that we
- // avoid triggering the userActivity calls in
- // PowerManagerService.setPokeLock().
- if (duration == mScreenTimeoutDuration) {
- return;
- }
- // stick with default timeout if we are using the proximity sensor
- if (proximitySensorModeEnabled()) {
- return;
- }
- mScreenTimeoutDuration = duration;
- updatePokeLock();
- }
-
- /**
- * Update the state of the poke lock held by the phone app,
- * based on the current desired screen timeout and the
- * current "ignore user activity on touch" flag.
- */
- private void updatePokeLock() {
- // This is kind of convoluted, but the basic thing to remember is
- // that the poke lock just sends a message to the screen to tell
- // it to stay on for a while.
- // The default is 0, for a long timeout and should be set that way
- // when we are heading back into a the keyguard / screen off
- // state, and also when we're trying to keep the screen alive
- // while ringing. We'll also want to ignore the cheek events
- // regardless of the timeout duration.
- // The short timeout is really used whenever we want to give up
- // the screen lock, such as when we're in call.
- int pokeLockSetting = LocalPowerManager.POKE_LOCK_IGNORE_CHEEK_EVENTS;
- switch (mScreenTimeoutDuration) {
- case SHORT:
- // Set the poke lock to timeout the display after a short
- // timeout (5s). This ensures that the screen goes to sleep
- // as soon as acceptably possible after we the wake lock
- // has been released.
- pokeLockSetting |= LocalPowerManager.POKE_LOCK_SHORT_TIMEOUT;
- break;
-
- case MEDIUM:
- // Set the poke lock to timeout the display after a medium
- // timeout (15s). This ensures that the screen goes to sleep
- // as soon as acceptably possible after we the wake lock
- // has been released.
- pokeLockSetting |= LocalPowerManager.POKE_LOCK_MEDIUM_TIMEOUT;
- break;
-
- case DEFAULT:
- default:
- // set the poke lock to timeout the display after a long
- // delay by default.
- // TODO: it may be nice to be able to disable cheek presses
- // for long poke locks (emergency dialer, for instance).
- break;
- }
-
- if (mIgnoreTouchUserActivity) {
- pokeLockSetting |= LocalPowerManager.POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS;
- }
-
- // Send the request
- try {
- mPowerManagerService.setPokeLock(pokeLockSetting, mPokeLockToken, LOG_TAG);
- } catch (RemoteException e) {
- Log.w(LOG_TAG, "mPowerManagerService.setPokeLock() failed: " + e);
- }
- }
-
- /**
- * Controls whether or not the screen is allowed to sleep.
- *
- * Once sleep is allowed (WakeState is SLEEP), it will rely on the
- * settings for the poke lock to determine when to timeout and let
- * the device sleep {@link PhoneApp#setScreenTimeout}.
- *
- * @param ws tells the device to how to wake.
- */
- /* package */ void requestWakeState(WakeState ws) {
- if (VDBG) Log.d(LOG_TAG, "requestWakeState(" + ws + ")...");
- synchronized (this) {
- if (mWakeState != ws) {
- switch (ws) {
- case PARTIAL:
- // acquire the processor wake lock, and release the FULL
- // lock if it is being held.
- mPartialWakeLock.acquire();
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- }
- break;
- case FULL:
- // acquire the full wake lock, and release the PARTIAL
- // lock if it is being held.
- mWakeLock.acquire();
- if (mPartialWakeLock.isHeld()) {
- mPartialWakeLock.release();
- }
- break;
- case SLEEP:
- default:
- // release both the PARTIAL and FULL locks.
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- }
- if (mPartialWakeLock.isHeld()) {
- mPartialWakeLock.release();
- }
- break;
- }
- mWakeState = ws;
- }
- }
- }
-
- /**
- * If we are not currently keeping the screen on, then poke the power
- * manager to wake up the screen for the user activity timeout duration.
- */
- /* package */ void wakeUpScreen() {
- synchronized (this) {
- if (mWakeState == WakeState.SLEEP) {
- if (DBG) Log.d(LOG_TAG, "pulse screen lock");
- try {
- mPowerManagerService.userActivityWithForce(SystemClock.uptimeMillis(), false, true);
- } catch (RemoteException ex) {
- // Ignore -- the system process is dead.
- }
- }
- }
- }
-
- /**
- * Sets the wake state and screen timeout based on the current state
- * of the phone, and the current state of the in-call UI.
- *
- * This method is a "UI Policy" wrapper around
- * {@link PhoneApp#requestWakeState} and {@link PhoneApp#setScreenTimeout}.
- *
- * It's safe to call this method regardless of the state of the Phone
- * (e.g. whether or not it's idle), and regardless of the state of the
- * Phone UI (e.g. whether or not the InCallScreen is active.)
- */
- /* package */ void updateWakeState() {
- Phone.State state = phone.getState();
-
- // True if the in-call UI is the foreground activity.
- // (Note this will be false if the screen is currently off,
- // since in that case *no* activity is in the foreground.)
- boolean isShowingCallScreen = isShowingCallScreen();
-
- // True if the InCallScreen's DTMF dialer is currently opened.
- // (Note this does NOT imply whether or not the InCallScreen
- // itself is visible.)
- boolean isDialerOpened = (mInCallScreen != null) && mInCallScreen.isDialerOpened();
-
- // True if the speakerphone is in use. (If so, we *always* use
- // the default timeout. Since the user is obviously not holding
- // the phone up to his/her face, we don't need to worry about
- // false touches, and thus don't need to turn the screen off so
- // aggressively.)
- // Note that we need to make a fresh call to this method any
- // time the speaker state changes. (That happens in
- // PhoneUtils.turnOnSpeaker().)
- boolean isSpeakerInUse = (state == Phone.State.OFFHOOK) && PhoneUtils.isSpeakerOn(this);
-
- // TODO (bug 1440854): The screen timeout *might* also need to
- // depend on the bluetooth state, but this isn't as clear-cut as
- // the speaker state (since while using BT it's common for the
- // user to put the phone straight into a pocket, in which case the
- // timeout should probably still be short.)
-
- if (DBG) Log.d(LOG_TAG, "updateWakeState: callscreen " + isShowingCallScreen
- + ", dialer " + isDialerOpened
- + ", speaker " + isSpeakerInUse + "...");
-
- //
- // (1) Set the screen timeout.
- //
- // Note that the "screen timeout" value we determine here is
- // meaningless if the screen is forced on (see (2) below.)
- //
- if (!isShowingCallScreen || isSpeakerInUse) {
- // Use the system-wide default timeout.
- setScreenTimeout(ScreenTimeoutDuration.DEFAULT);
- } else {
- // We're on the in-call screen, and *not* using the speakerphone.
- if (isDialerOpened) {
- // The DTMF dialpad is up. This case is special because
- // the in-call UI has its own "touch lock" mechanism to
- // disable the dialpad after a very short amount of idle
- // time (to avoid false touches from the user's face while
- // in-call.)
- //
- // In this case the *physical* screen just uses the
- // system-wide default timeout.
- setScreenTimeout(ScreenTimeoutDuration.DEFAULT);
- } else {
- // We're on the in-call screen, and not using the DTMF dialpad.
- // There's actually no touchable UI onscreen at all in
- // this state. Also, the user is (most likely) not
- // looking at the screen at all, since they're probably
- // holding the phone up to their face. Here we use a
- // special screen timeout value specific to the in-call
- // screen, purely to save battery life.
- setScreenTimeout(ScreenTimeoutDuration.MEDIUM);
- }
- }
-
- //
- // (2) Decide whether to force the screen on or not.
- //
- // Force the screen to be on if the phone is ringing or dialing,
- // or if we're displaying the "Call ended" UI for a connection in
- // the "disconnected" state.
- //
- boolean isRinging = (state == Phone.State.RINGING);
- boolean isDialing = (phone.getForegroundCall().getState() == Call.State.DIALING);
- boolean showingDisconnectedConnection =
- PhoneUtils.hasDisconnectedConnections(phone) && isShowingCallScreen;
- boolean keepScreenOn = isRinging || isDialing || showingDisconnectedConnection;
- if (DBG) Log.d(LOG_TAG, "updateWakeState: keepScreenOn = " + keepScreenOn
- + " (isRinging " + isRinging
- + ", isDialing " + isDialing
- + ", showingDisc " + showingDisconnectedConnection + ")");
- // keepScreenOn == true means we'll hold a full wake lock:
- requestWakeState(keepScreenOn ? WakeState.FULL : WakeState.SLEEP);
- }
-
- /**
- * Wrapper around the PowerManagerService.preventScreenOn() API.
- * This allows the in-call UI to prevent the screen from turning on
- * even if a subsequent call to updateWakeState() causes us to acquire
- * a full wake lock.
- */
- /* package */ void preventScreenOn(boolean prevent) {
- if (VDBG) Log.d(LOG_TAG, "- preventScreenOn(" + prevent + ")...");
- try {
- mPowerManagerService.preventScreenOn(prevent);
- } catch (RemoteException e) {
- Log.w(LOG_TAG, "mPowerManagerService.preventScreenOn() failed: " + e);
- }
- }
-
- /**
- * Sets or clears the flag that tells the PowerManager that touch
- * (and cheek) events should NOT be considered "user activity".
- *
- * Since the in-call UI is totally insensitive to touch in most
- * states, we set this flag whenever the InCallScreen is in the
- * foreground. (Otherwise, repeated unintentional touches could
- * prevent the device from going to sleep.)
- *
- * There *are* some some touch events that really do count as user
- * activity, though. For those, we need to manually poke the
- * PowerManager's userActivity method; see pokeUserActivity().
- */
- /* package */ void setIgnoreTouchUserActivity(boolean ignore) {
- if (VDBG) Log.d(LOG_TAG, "setIgnoreTouchUserActivity(" + ignore + ")...");
- mIgnoreTouchUserActivity = ignore;
- updatePokeLock();
- }
-
- /**
- * Manually pokes the PowerManager's userActivity method. Since we
- * hold the POKE_LOCK_IGNORE_TOUCH_AND_CHEEK_EVENTS poke lock while
- * the InCallScreen is active, we need to do this for touch events
- * that really do count as user activity (like DTMF key presses, or
- * unlocking the "touch lock" overlay.)
- */
- /* package */ void pokeUserActivity() {
- if (VDBG) Log.d(LOG_TAG, "pokeUserActivity()...");
- try {
- mPowerManagerService.userActivity(SystemClock.uptimeMillis(), false);
- } catch (RemoteException e) {
- Log.w(LOG_TAG, "mPowerManagerService.userActivity() failed: " + e);
- }
- }
-
- /**
- * Set when a new outgoing call is beginning, so we can update
- * the proximity sensor state.
- * Cleared when the InCallScreen is no longer in the foreground,
- * in case the call fails without changing the telephony state.
- */
- /* package */ void setBeginningCall(boolean beginning) {
- // Note that we are beginning a new call, for proximity sensor support
- mBeginningCall = beginning;
- // Update the Proximity sensor based on mBeginningCall state
- updateProximitySensorMode(phone.getState());
- }
-
- /**
- * Updates the wake lock used to control proximity sensor behavior,
- * based on the current state of the phone. This method is called
- * from the CallNotifier on any phone state change.
- *
- * 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.
- *
- * Note this method doesn't care if the InCallScreen is the foreground
- * activity or not. That's because we want the proximity sensor to be
- * enabled any time the phone is in use, to avoid false cheek events
- * for whatever app you happen to be running.
- *
- * 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)
- *
- * @param state current state of the phone (see {@link Phone#State})
- */
- /* package */ void updateProximitySensorMode(Phone.State state) {
- if (VDBG) Log.d(LOG_TAG, "updateProximitySensorMode: state = " + state);
-
- if (proximitySensorModeEnabled()) {
- synchronized (mProximityWakeLock) {
- // 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 = (isHeadsetPlugged()
- || PhoneUtils.isSpeakerOn(this)
- || ((mBtHandsfree != null) && mBtHandsfree.isAudioOn())
- || mIsHardKeyboardOpen
- || mOrientation == AccelerometerListener.ORIENTATION_HORIZONTAL);
-
- if (((state == Phone.State.OFFHOOK) || mBeginningCall) && !screenOnImmediately) {
- // Phone is in use! Arrange for the screen to turn off
- // automatically when the sensor detects a close object.
- if (!mProximityWakeLock.isHeld()) {
- if (DBG) Log.d(LOG_TAG, "updateProximitySensorMode: acquiring...");
- mProximityWakeLock.acquire();
- } else {
- if (VDBG) Log.d(LOG_TAG, "updateProximitySensorMode: lock already held.");
- }
- } else {
- // Phone is either idle, or ringing. We don't want any
- // special proximity sensor behavior in either case.
- if (mProximityWakeLock.isHeld()) {
- if (DBG) Log.d(LOG_TAG, "updateProximitySensorMode: releasing...");
- // Wait until user has moved the phone away from his head if we are
- // releasing due to the phone call ending.
- // Qtherwise, turn screen on immediately
- int flags =
- (screenOnImmediately ? 0 : PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE);
- mProximityWakeLock.release(flags);
- } else {
- if (VDBG) {
- Log.d(LOG_TAG, "updateProximitySensorMode: lock already released.");
- }
- }
- }
- }
- }
- }
-
- public void orientationChanged(int orientation) {
- mOrientation = orientation;
- updateProximitySensorMode(phone.getState());
- }
-
- /**
- * Notifies the phone app when the phone state changes.
- * Currently used only for proximity sensor support.
- */
- /* package */ void updatePhoneState(Phone.State state) {
- if (state != mLastPhoneState) {
- mLastPhoneState = state;
- updateProximitySensorMode(state);
- if (mAccelerometerListener != null) {
- // use accelerometer to augment proximity sensor when in call
- mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
- mAccelerometerListener.enable(state == Phone.State.OFFHOOK);
- }
- // clear our beginning call flag
- mBeginningCall = false;
- // While we are in call, the in-call screen should dismiss the keyguard.
- // This allows the user to press Home to go directly home without going through
- // an insecure lock screen.
- // But we do not want to do this if there is no active call so we do not
- // bypass the keyguard if the call is not answered or declined.
- if (mInCallScreen != null) {
- mInCallScreen.updateKeyguardPolicy(state == Phone.State.OFFHOOK);
- }
- }
- }
-
- /* package */ Phone.State getPhoneState() {
- return mLastPhoneState;
- }
-
- /**
- * @return true if this device supports the "proximity sensor
- * auto-lock" feature while in-call (see updateProximitySensorMode()).
- */
- /* package */ boolean proximitySensorModeEnabled() {
- return (mProximityWakeLock != null);
- }
-
- KeyguardManager getKeyguardManager() {
- return mKeyguardManager;
- }
-
- private void onMMIComplete(AsyncResult r) {
- if (VDBG) Log.d(LOG_TAG, "onMMIComplete()...");
- MmiCode mmiCode = (MmiCode) r.result;
- PhoneUtils.displayMMIComplete(phone, getInstance(), mmiCode, null, null);
- }
-
- private void initForNewRadioTechnology() {
- if (DBG) Log.d(LOG_TAG, "initForNewRadioTechnology...");
-
- if (phone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- // Create an instance of CdmaPhoneCallState and initialize it to IDLE
- cdmaPhoneCallState = new CdmaPhoneCallState();
- cdmaPhoneCallState.CdmaPhoneCallStateInit();
-
- //create instances of CDMA OTA data classes
- if (cdmaOtaProvisionData == null) {
- cdmaOtaProvisionData = new OtaUtils.CdmaOtaProvisionData();
- }
- if (cdmaOtaConfigData == null) {
- cdmaOtaConfigData = new OtaUtils.CdmaOtaConfigData();
- }
- if (cdmaOtaScreenState == null) {
- cdmaOtaScreenState = new OtaUtils.CdmaOtaScreenState();
- }
- if (cdmaOtaInCallScreenUiState == null) {
- cdmaOtaInCallScreenUiState = new OtaUtils.CdmaOtaInCallScreenUiState();
- }
- }
-
- ringer.updateRingerContextAfterRadioTechnologyChange(this.phone);
- notifier.updateCallNotifierRegistrationsAfterRadioTechnologyChange();
- if (mBtHandsfree != null) {
- mBtHandsfree.updateBtHandsfreeAfterRadioTechnologyChange();
- }
- if (mInCallScreen != null) {
- mInCallScreen.updateAfterRadioTechnologyChange();
- }
-
- // Update registration for ICC status after radio technology change
- IccCard sim = phone.getIccCard();
- if (sim != null) {
- if (DBG) Log.d(LOG_TAG, "Update registration for ICC status...");
-
- //Register all events new to the new active phone
- sim.registerForNetworkLocked(mHandler, EVENT_SIM_NETWORK_LOCKED, null);
- }
- }
-
-
- /**
- * @return true if a wired headset is currently plugged in.
- *
- * @see Intent.ACTION_HEADSET_PLUG (which we listen for in mReceiver.onReceive())
- */
- boolean isHeadsetPlugged() {
- return mIsHeadsetPlugged;
- }
-
- /**
- * @return true if the onscreen UI should currently be showing the
- * special "bluetooth is active" indication in a couple of places (in
- * which UI elements turn blue and/or show the bluetooth logo.)
- *
- * This depends on the BluetoothHeadset state *and* the current
- * telephony state; see shouldShowBluetoothIndication().
- *
- * @see CallCard
- * @see NotificationMgr.updateInCallNotification
- */
- /* package */ boolean showBluetoothIndication() {
- return mShowBluetoothIndication;
- }
-
- /**
- * Recomputes the mShowBluetoothIndication flag based on the current
- * bluetooth state and current telephony state.
- *
- * This needs to be called any time the bluetooth headset state or the
- * telephony state changes.
- *
- * @param forceUiUpdate if true, force the UI elements that care
- * about this flag to update themselves.
- */
- /* package */ void updateBluetoothIndication(boolean forceUiUpdate) {
- mShowBluetoothIndication = shouldShowBluetoothIndication(mBluetoothHeadsetState,
- mBluetoothHeadsetAudioState,
- phone);
- if (forceUiUpdate) {
- // Post Handler messages to the various components that might
- // need to be refreshed based on the new state.
- if (isShowingCallScreen()) mInCallScreen.requestUpdateBluetoothIndication();
- mHandler.sendEmptyMessage(EVENT_UPDATE_INCALL_NOTIFICATION);
- }
-
- // Update the Proximity sensor based on Bluetooth audio state
- updateProximitySensorMode(phone.getState());
- }
-
- /**
- * UI policy helper function for the couple of places in the UI that
- * have some way of indicating that "bluetooth is in use."
- *
- * @return true if the onscreen UI should indicate that "bluetooth is in use",
- * based on the specified bluetooth headset state, and the
- * current state of the phone.
- * @see showBluetoothIndication()
- */
- private static boolean shouldShowBluetoothIndication(int bluetoothState,
- int bluetoothAudioState,
- Phone phone) {
- // We want the UI to indicate that "bluetooth is in use" in two
- // slightly different cases:
- //
- // (a) The obvious case: if a bluetooth headset is currently in
- // use for an ongoing call.
- //
- // (b) The not-so-obvious case: if an incoming call is ringing,
- // and we expect that audio *will* be routed to a bluetooth
- // headset once the call is answered.
-
- switch (phone.getState()) {
- case OFFHOOK:
- // This covers normal active calls, and also the case if
- // the foreground call is DIALING or ALERTING. In this
- // case, bluetooth is considered "active" if a headset
- // is connected *and* audio is being routed to it.
- return ((bluetoothState == BluetoothHeadset.STATE_CONNECTED)
- && (bluetoothAudioState == BluetoothHeadset.AUDIO_STATE_CONNECTED));
-
- case RINGING:
- // If an incoming call is ringing, we're *not* yet routing
- // audio to the headset (since there's no in-call audio
- // yet!) In this case, if a bluetooth headset is
- // connected at all, we assume that it'll become active
- // once the user answers the phone.
- return (bluetoothState == BluetoothHeadset.STATE_CONNECTED);
-
- default: // Presumably IDLE
- return false;
- }
- }
-
-
- /**
- * Receiver for misc intent broadcasts the Phone app cares about.
- */
- private class PhoneAppBroadcastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
- boolean enabled = System.getInt(getContentResolver(),
- System.AIRPLANE_MODE_ON, 0) == 0;
- phone.setRadioPower(enabled);
- } else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) {
- mBluetoothHeadsetState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE,
- BluetoothHeadset.STATE_ERROR);
- if (VDBG) Log.d(LOG_TAG, "mReceiver: HEADSET_STATE_CHANGED_ACTION");
- if (VDBG) Log.d(LOG_TAG, "==> new state: " + mBluetoothHeadsetState);
- updateBluetoothIndication(true); // Also update any visible UI if necessary
- } else if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) {
- mBluetoothHeadsetAudioState =
- intent.getIntExtra(BluetoothHeadset.EXTRA_AUDIO_STATE,
- BluetoothHeadset.STATE_ERROR);
- if (VDBG) Log.d(LOG_TAG, "mReceiver: HEADSET_AUDIO_STATE_CHANGED_ACTION");
- if (VDBG) Log.d(LOG_TAG, "==> new state: " + mBluetoothHeadsetAudioState);
- updateBluetoothIndication(true); // Also update any visible UI if necessary
- } else if (action.equals(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) {
- if (VDBG) Log.d(LOG_TAG, "mReceiver: ACTION_ANY_DATA_CONNECTION_STATE_CHANGED");
- if (VDBG) Log.d(LOG_TAG, "- state: " + intent.getStringExtra(Phone.STATE_KEY));
- if (VDBG) Log.d(LOG_TAG, "- reason: "
- + intent.getStringExtra(Phone.STATE_CHANGE_REASON_KEY));
-
- // The "data disconnected due to roaming" notification is
- // visible if you've lost data connectivity because you're
- // roaming and you have the "data roaming" feature turned off.
- boolean disconnectedDueToRoaming = false;
- if ("DISCONNECTED".equals(intent.getStringExtra(Phone.STATE_KEY))) {
- String reason = intent.getStringExtra(Phone.STATE_CHANGE_REASON_KEY);
- if (Phone.REASON_ROAMING_ON.equals(reason)) {
- // We just lost our data connection, and the reason
- // is that we started roaming. This implies that
- // the user has data roaming turned off.
- disconnectedDueToRoaming = true;
- }
- }
- mHandler.sendEmptyMessage(disconnectedDueToRoaming
- ? EVENT_DATA_ROAMING_DISCONNECTED
- : EVENT_DATA_ROAMING_OK);
- } else if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
- if (VDBG) Log.d(LOG_TAG, "mReceiver: ACTION_HEADSET_PLUG");
- if (VDBG) Log.d(LOG_TAG, " state: " + intent.getIntExtra("state", 0));
- if (VDBG) Log.d(LOG_TAG, " name: " + intent.getStringExtra("name"));
- mIsHeadsetPlugged = (intent.getIntExtra("state", 0) == 1);
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_WIRED_HEADSET_PLUG, 0));
- } else if (action.equals(Intent.ACTION_BATTERY_LOW)) {
- if (VDBG) Log.d(LOG_TAG, "mReceiver: ACTION_BATTERY_LOW");
- notifier.sendBatteryLow(); // Play a warning tone if in-call
- } else if ((action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) &&
- (mPUKEntryActivity != null)) {
- // if an attempt to un-PUK-lock the device was made, while we're
- // receiving this state change notification, notify the handler.
- // NOTE: This is ONLY triggered if an attempt to un-PUK-lock has
- // been attempted.
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_SIM_STATE_CHANGED,
- intent.getStringExtra(IccCard.INTENT_KEY_ICC_STATE)));
- } else if (action.equals(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED)) {
- String newPhone = intent.getStringExtra(Phone.PHONE_NAME_KEY);
- Log.d(LOG_TAG, "Radio technology switched. Now " + newPhone + " is active.");
- initForNewRadioTechnology();
- } else if (action.equals(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)) {
- handleServiceStateChanged(intent);
- } else if (action.equals(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED)) {
- if (phone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- Log.d(LOG_TAG, "Emergency Callback Mode arrived in PhoneApp.");
- // Start Emergency Callback Mode service
- if (intent.getBooleanExtra("phoneinECMState", false)) {
- context.startService(new Intent(context,
- EmergencyCallbackModeService.class));
- }
- } else {
- Log.e(LOG_TAG, "Error! Emergency Callback Mode not supported for " +
- phone.getPhoneName() + " phones");
- }
- } else if (action.equals(Intent.ACTION_DOCK_EVENT)) {
- mDockState = intent.getIntExtra(Intent.EXTRA_DOCK_STATE,
- Intent.EXTRA_DOCK_STATE_UNDOCKED);
- if (VDBG) Log.d(LOG_TAG, "ACTION_DOCK_EVENT -> mDockState = " + mDockState);
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_DOCK_STATE_CHANGED, 0));
- } else if (action.equals(TtyIntent.TTY_PREFERRED_MODE_CHANGE_ACTION)) {
- mPreferredTtyMode = intent.getIntExtra(TtyIntent.TTY_PREFFERED_MODE,
- Phone.TTY_MODE_OFF);
- if (VDBG) Log.d(LOG_TAG, "mReceiver: TTY_PREFERRED_MODE_CHANGE_ACTION");
- if (VDBG) Log.d(LOG_TAG, " mode: " + mPreferredTtyMode);
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_TTY_PREFERRED_MODE_CHANGED, 0));
- } else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
- int ringerMode = intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE,
- AudioManager.RINGER_MODE_NORMAL);
- if(ringerMode == AudioManager.RINGER_MODE_SILENT) {
- notifier.silenceRinger();
- }
- }
- }
- }
-
- /**
- * Broadcast receiver for the ACTION_MEDIA_BUTTON broadcast intent.
- *
- * This functionality isn't lumped in with the other intents in
- * PhoneAppBroadcastReceiver because we instantiate this as a totally
- * separate BroadcastReceiver instance, since we need to manually
- * adjust its IntentFilter's priority (to make sure we get these
- * intents *before* the media player.)
- */
- private class MediaButtonBroadcastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
- if (VDBG) Log.d(LOG_TAG,
- "MediaButtonBroadcastReceiver.onReceive()... event = " + event);
- if ((event != null)
- && (event.getKeyCode() == KeyEvent.KEYCODE_HEADSETHOOK)) {
- if (VDBG) Log.d(LOG_TAG, "MediaButtonBroadcastReceiver: HEADSETHOOK");
- boolean consumed = PhoneUtils.handleHeadsetHook(phone, event);
- if (VDBG) Log.d(LOG_TAG, "==> handleHeadsetHook(): consumed = " + consumed);
- if (consumed) {
- // If a headset is attached and the press is consumed, also update
- // any UI items (such as an InCallScreen mute button) that may need to
- // be updated if their state changed.
- if (isShowingCallScreen()) {
- updateInCallScreenTouchUi();
- }
- abortBroadcast();
- }
- } else {
- if (phone.getState() != Phone.State.IDLE) {
- // If the phone is anything other than completely idle,
- // then we consume and ignore any media key events,
- // Otherwise it is too easy to accidentally start
- // playing music while a phone call is in progress.
- if (VDBG) Log.d(LOG_TAG, "MediaButtonBroadcastReceiver: consumed");
- abortBroadcast();
- }
- }
- }
- }
-
- private void handleServiceStateChanged(Intent intent) {
- /**
- * This used to handle updating EriTextWidgetProvider this routine
- * and and listening for ACTION_SERVICE_STATE_CHANGED intents could
- * be removed. But leaving just in case it might be needed in the near
- * future.
- */
-
- // If service just returned, start sending out the queued messages
- ServiceState ss = ServiceState.newFromBundle(intent.getExtras());
-
- boolean hasService = true;
- boolean isCdma = false;
- String eriText = "";
-
- if (ss != null) {
- int state = ss.getState();
- NotificationMgr.getDefault().updateNetworkSelection(state);
- switch (state) {
- case ServiceState.STATE_OUT_OF_SERVICE:
- case ServiceState.STATE_POWER_OFF:
- hasService = false;
- break;
- }
- } else {
- hasService = false;
- }
- }
-
- public boolean isOtaCallInActiveState() {
- boolean otaCallActive = false;
- if (mInCallScreen != null) {
- otaCallActive = mInCallScreen.isOtaCallInActiveState();
- }
- if (VDBG) Log.d(LOG_TAG, "- isOtaCallInActiveState " + otaCallActive);
- return otaCallActive;
- }
-
- public boolean isOtaCallInEndState() {
- boolean otaCallEnded = false;
- if (mInCallScreen != null) {
- otaCallEnded = mInCallScreen.isOtaCallInEndState();
- }
- if (VDBG) Log.d(LOG_TAG, "- isOtaCallInEndState " + otaCallEnded);
- return otaCallEnded;
- }
-
- // it is safe to call clearOtaState() even if the InCallScreen isn't active
- public void clearOtaState() {
- if (DBG) Log.d(LOG_TAG, "- clearOtaState ...");
- if ((mInCallScreen != null)
- && (mInCallScreen.otaUtils != null)) {
- mInCallScreen.otaUtils.cleanOtaScreen(true);
- if (DBG) Log.d(LOG_TAG, " - clearOtaState clears OTA screen");
- }
- }
-
- // it is safe to call dismissOtaDialogs() even if the InCallScreen isn't active
- public void dismissOtaDialogs() {
- if (DBG) Log.d(LOG_TAG, "- dismissOtaDialogs ...");
- if ((mInCallScreen != null)
- && (mInCallScreen.otaUtils != null)) {
- mInCallScreen.otaUtils.dismissAllOtaDialogs();
- if (DBG) Log.d(LOG_TAG, " - dismissOtaDialogs clears OTA dialogs");
- }
- }
-
- // it is safe to call clearInCallScreenMode() even if the InCallScreen isn't active
- public void clearInCallScreenMode() {
- if (DBG) Log.d(LOG_TAG, "- clearInCallScreenMode ...");
- if (mInCallScreen != null) {
- mInCallScreen.resetInCallScreenMode();
- }
- }
-
- // Update InCallScreen's touch UI. It is safe to call even if InCallScreen isn't active
- public void updateInCallScreenTouchUi() {
- if (DBG) Log.d(LOG_TAG, "- updateInCallScreenTouchUi ...");
- if (mInCallScreen != null) {
- mInCallScreen.requestUpdateTouchUi();
- }
- }
-
- private void handleQueryTTYModeResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
- if (ar.exception != null) {
- if (DBG) Log.d(LOG_TAG, "handleQueryTTYModeResponse: Error getting TTY state.");
- } else {
- if (DBG) Log.d(LOG_TAG,
- "handleQueryTTYModeResponse: TTY enable state successfully queried.");
-
- int ttymode = ((int[]) ar.result)[0];
- if (DBG) Log.d(LOG_TAG, "handleQueryTTYModeResponse:ttymode=" + ttymode);
-
- Intent ttyModeChanged = new Intent(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
- ttyModeChanged.putExtra("ttyEnabled", ttymode != Phone.TTY_MODE_OFF);
- sendBroadcast(ttyModeChanged);
-
- String audioTtyMode;
- switch (ttymode) {
- case Phone.TTY_MODE_FULL:
- audioTtyMode = "tty_full";
- break;
- case Phone.TTY_MODE_VCO:
- audioTtyMode = "tty_vco";
- break;
- case Phone.TTY_MODE_HCO:
- audioTtyMode = "tty_hco";
- break;
- case Phone.TTY_MODE_OFF:
- default:
- audioTtyMode = "tty_off";
- break;
- }
- AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
- audioManager.setParameters("tty_mode="+audioTtyMode);
- }
- }
-
- private void handleSetTTYModeResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception != null) {
- if (DBG) Log.d (LOG_TAG,
- "handleSetTTYModeResponse: Error setting TTY mode, ar.exception"
- + ar.exception);
- }
- phone.queryTTYMode(mHandler.obtainMessage(EVENT_TTY_MODE_GET));
- }
-}
diff --git a/phone/src/com/android/phone2/PhoneInterfaceManager.java b/phone/src/com/android/phone2/PhoneInterfaceManager.java
deleted file mode 100644
index e42f95b..0000000
--- a/phone/src/com/android/phone2/PhoneInterfaceManager.java
+++ /dev/null
@@ -1,729 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Intent;
-import android.net.Uri;
-import android.os.AsyncResult;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.ServiceManager;
-import android.telephony.NeighboringCellInfo;
-import android.telephony.ServiceState;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.telephony.DefaultPhoneNotifier;
-import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.ITelephony;
-import com.android.internal.telephony.Phone;
-
-import java.util.List;
-import java.util.ArrayList;
-
-/**
- * Implementation of the ITelephony interface.
- */
-public class PhoneInterfaceManager extends ITelephony.Stub {
- private static final String LOG_TAG = "PhoneInterfaceManager";
- private static final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- // Message codes used with mMainThreadHandler
- private static final int CMD_HANDLE_PIN_MMI = 1;
- private static final int CMD_HANDLE_NEIGHBORING_CELL = 2;
- private static final int EVENT_NEIGHBORING_CELL_DONE = 3;
- private static final int CMD_ANSWER_RINGING_CALL = 4;
- private static final int CMD_END_CALL = 5; // not used yet
- private static final int CMD_SILENCE_RINGER = 6;
-
- PhoneApp mApp;
- Phone mPhone;
- MainThreadHandler mMainThreadHandler;
-
- /**
- * A request object for use with {@link MainThreadHandler}. Requesters should wait() on the
- * request after sending. The main thread will notify the request when it is complete.
- */
- private static final class MainThreadRequest {
- /** The argument to use for the request */
- public Object argument;
- /** The result of the request that is run on the main thread */
- public Object result;
-
- public MainThreadRequest(Object argument) {
- this.argument = argument;
- }
- }
-
- /**
- * A handler that processes messages on the main thread in the phone process. Since many
- * of the Phone calls are not thread safe this is needed to shuttle the requests from the
- * inbound binder threads to the main thread in the phone process. The Binder thread
- * may provide a {@link MainThreadRequest} object in the msg.obj field that they are waiting
- * on, which will be notified when the operation completes and will contain the result of the
- * request.
- *
- * <p>If a MainThreadRequest object is provided in the msg.obj field,
- * note that request.result must be set to something non-null for the calling thread to
- * unblock.
- */
- private final class MainThreadHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- MainThreadRequest request;
- Message onCompleted;
- AsyncResult ar;
-
- switch (msg.what) {
- case CMD_HANDLE_PIN_MMI:
- request = (MainThreadRequest) msg.obj;
- request.result = Boolean.valueOf(
- mPhone.handlePinMmi((String) request.argument));
- // Wake up the requesting thread
- synchronized (request) {
- request.notifyAll();
- }
- break;
-
- case CMD_HANDLE_NEIGHBORING_CELL:
- request = (MainThreadRequest) msg.obj;
- onCompleted = obtainMessage(EVENT_NEIGHBORING_CELL_DONE,
- request);
- mPhone.getNeighboringCids(onCompleted);
- break;
-
- case EVENT_NEIGHBORING_CELL_DONE:
- ar = (AsyncResult) msg.obj;
- request = (MainThreadRequest) ar.userObj;
- if (ar.exception == null && ar.result != null) {
- request.result = ar.result;
- } else {
- // create an empty list to notify the waiting thread
- request.result = new ArrayList<NeighboringCellInfo>();
- }
- // Wake up the requesting thread
- synchronized (request) {
- request.notifyAll();
- }
- break;
-
- case CMD_ANSWER_RINGING_CALL:
- answerRingingCallInternal();
- break;
-
- case CMD_SILENCE_RINGER:
- silenceRingerInternal();
- break;
-
- case CMD_END_CALL:
- request = (MainThreadRequest) msg.obj;
- boolean hungUp = false;
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // CDMA: If the user presses the Power button we treat it as
- // ending the complete call session
- hungUp = PhoneUtils.hangupRingingAndActive(mPhone);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- // GSM: End the call as per the Phone state
- hungUp = PhoneUtils.hangup(mPhone);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- if (DBG) log("CMD_END_CALL: " + (hungUp ? "hung up!" : "no call to hang up"));
- request.result = hungUp;
- // Wake up the requesting thread
- synchronized (request) {
- request.notifyAll();
- }
- break;
-
- default:
- Log.w(LOG_TAG, "MainThreadHandler: unexpected message code: " + msg.what);
- break;
- }
- }
- }
-
- /**
- * Posts the specified command to be executed on the main thread,
- * waits for the request to complete, and returns the result.
- * @see sendRequestAsync
- */
- private Object sendRequest(int command, Object argument) {
- if (Looper.myLooper() == mMainThreadHandler.getLooper()) {
- throw new RuntimeException("This method will deadlock if called from the main thread.");
- }
-
- MainThreadRequest request = new MainThreadRequest(argument);
- Message msg = mMainThreadHandler.obtainMessage(command, request);
- msg.sendToTarget();
-
- // Wait for the request to complete
- synchronized (request) {
- while (request.result == null) {
- try {
- request.wait();
- } catch (InterruptedException e) {
- // Do nothing, go back and wait until the request is complete
- }
- }
- }
- return request.result;
- }
-
- /**
- * Asynchronous ("fire and forget") version of sendRequest():
- * Posts the specified command to be executed on the main thread, and
- * returns immediately.
- * @see sendRequest
- */
- private void sendRequestAsync(int command) {
- mMainThreadHandler.sendEmptyMessage(command);
- }
-
- public PhoneInterfaceManager(PhoneApp app, Phone phone) {
- mApp = app;
- mPhone = phone;
- mMainThreadHandler = new MainThreadHandler();
- publish();
- }
-
- private void publish() {
- if (DBG) log("publish: " + this);
-
- //ServiceManager.addService("phone", this);
- }
-
- //
- // Implementation of the ITelephony interface.
- //
-
- public void dial(String number) {
- if (DBG) log("dial: " + number);
- // No permission check needed here: This is just a wrapper around the
- // ACTION_DIAL intent, which is available to any app since it puts up
- // the UI before it does anything.
-
- String url = createTelUrl(number);
- if (url == null) {
- return;
- }
-
- // PENDING: should we just silently fail if phone is offhook or ringing?
- Phone.State state = mPhone.getState();
- if (state != Phone.State.OFFHOOK && state != Phone.State.RINGING) {
- Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- mApp.startActivity(intent);
- }
- }
-
- public void call(String number) {
- if (DBG) log("call: " + number);
-
- // This is just a wrapper around the ACTION_CALL intent, but we still
- // need to do a permission check since we're calling startActivity()
- // from the context of the phone app.
- enforceCallPermission();
-
- String url = createTelUrl(number);
- if (url == null) {
- return;
- }
-
- Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url));
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setClassName(mApp, PhoneApp.getCallScreenClassName());
- mApp.startActivity(intent);
- }
-
- private boolean showCallScreenInternal(boolean specifyInitialDialpadState,
- boolean initialDialpadState) {
- if (isIdle()) {
- return false;
- }
- // If the phone isn't idle then go to the in-call screen
- long callingId = Binder.clearCallingIdentity();
- try {
- Intent intent;
- if (specifyInitialDialpadState) {
- intent = PhoneApp.createInCallIntent(initialDialpadState);
- } else {
- intent = PhoneApp.createInCallIntent();
- }
- mApp.startActivity(intent);
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
- return true;
- }
-
- // Show the in-call screen without specifying the initial dialpad state.
- public boolean showCallScreen() {
- return showCallScreenInternal(false, false);
- }
-
- // The variation of showCallScreen() that specifies the initial dialpad state.
- // (Ideally this would be called showCallScreen() too, just with a different
- // signature, but AIDL doesn't allow that.)
- public boolean showCallScreenWithDialpad(boolean showDialpad) {
- return showCallScreenInternal(true, showDialpad);
- }
-
- /**
- * End a call based on call state
- * @return true is a call was ended
- */
- public boolean endCall() {
- enforceCallPermission();
- return (Boolean) sendRequest(CMD_END_CALL, null);
- }
-
- public void answerRingingCall() {
- if (DBG) log("answerRingingCall...");
- // TODO: there should eventually be a separate "ANSWER_PHONE" permission,
- // but that can probably wait till the big TelephonyManager API overhaul.
- // For now, protect this call with the MODIFY_PHONE_STATE permission.
- enforceModifyPermission();
- sendRequestAsync(CMD_ANSWER_RINGING_CALL);
- }
-
- /**
- * Make the actual telephony calls to implement answerRingingCall().
- * This should only be called from the main thread of the Phone app.
- * @see answerRingingCall
- *
- * TODO: it would be nice to return true if we answered the call, or
- * false if there wasn't actually a ringing incoming call, or some
- * other error occurred. (In other words, pass back the return value
- * from PhoneUtils.answerCall() or PhoneUtils.answerAndEndActive().)
- * But that would require calling this method via sendRequest() rather
- * than sendRequestAsync(), and right now we don't actually *need* that
- * return value, so let's just return void for now.
- */
- private void answerRingingCallInternal() {
- final boolean hasRingingCall = !mPhone.getRingingCall().isIdle();
- if (hasRingingCall) {
- final boolean hasActiveCall = !mPhone.getForegroundCall().isIdle();
- final boolean hasHoldingCall = !mPhone.getBackgroundCall().isIdle();
- if (hasActiveCall && hasHoldingCall) {
- // Both lines are in use!
- // TODO: provide a flag to let the caller specify what
- // policy to use if both lines are in use. (The current
- // behavior is hardwired to "answer incoming, end ongoing",
- // which is how the CALL button is specced to behave.)
- PhoneUtils.answerAndEndActive(mPhone);
- return;
- } else {
- // answerCall() will automatically hold the current active
- // call, if there is one.
- PhoneUtils.answerCall(mPhone);
- return;
- }
- } else {
- // No call was ringing.
- return;
- }
- }
-
- public void silenceRinger() {
- if (DBG) log("silenceRinger...");
- // TODO: find a more appropriate permission to check here.
- // (That can probably wait till the big TelephonyManager API overhaul.
- // For now, protect this call with the MODIFY_PHONE_STATE permission.)
- enforceModifyPermission();
- sendRequestAsync(CMD_SILENCE_RINGER);
- }
-
- /**
- * Internal implemenation of silenceRinger().
- * This should only be called from the main thread of the Phone app.
- * @see silenceRinger
- */
- private void silenceRingerInternal() {
- if ((mPhone.getState() == Phone.State.RINGING)
- && mApp.notifier.isRinging()) {
- // Ringer is actually playing, so silence it.
- if (DBG) log("silenceRingerInternal: silencing...");
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_IDLE);
- mApp.notifier.silenceRinger();
- }
- }
-
- public boolean isOffhook() {
- return (mPhone.getState() == Phone.State.OFFHOOK);
- }
-
- public boolean isRinging() {
- return (mPhone.getState() == Phone.State.RINGING);
- }
-
- public boolean isIdle() {
- return (mPhone.getState() == Phone.State.IDLE);
- }
-
- public boolean isSimPinEnabled() {
- enforceReadPermission();
- return (PhoneApp.getInstance().isSimPinEnabled());
- }
-
- public boolean supplyPin(String pin) {
- enforceModifyPermission();
- final CheckSimPin checkSimPin = new CheckSimPin(mPhone.getIccCard());
- checkSimPin.start();
- return checkSimPin.checkPin(pin);
- }
-
- /**
- * Helper thread to turn async call to {@link SimCard#supplyPin} into
- * a synchronous one.
- */
- private static class CheckSimPin extends Thread {
-
- private final IccCard mSimCard;
-
- private boolean mDone = false;
- private boolean mResult = false;
-
- // For replies from SimCard interface
- private Handler mHandler;
-
- // For async handler to identify request type
- private static final int SUPPLY_PIN_COMPLETE = 100;
-
- public CheckSimPin(IccCard simCard) {
- mSimCard = simCard;
- }
-
- @Override
- public void run() {
- Looper.prepare();
- synchronized (CheckSimPin.this) {
- mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
- switch (msg.what) {
- case SUPPLY_PIN_COMPLETE:
- Log.d(LOG_TAG, "SUPPLY_PIN_COMPLETE");
- synchronized (CheckSimPin.this) {
- mResult = (ar.exception == null);
- mDone = true;
- CheckSimPin.this.notifyAll();
- }
- break;
- }
- }
- };
- CheckSimPin.this.notifyAll();
- }
- Looper.loop();
- }
-
- synchronized boolean checkPin(String pin) {
-
- while (mHandler == null) {
- try {
- wait();
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- }
- Message callback = Message.obtain(mHandler, SUPPLY_PIN_COMPLETE);
-
- mSimCard.supplyPin(pin, callback);
-
- while (!mDone) {
- try {
- Log.d(LOG_TAG, "wait for done");
- wait();
- } catch (InterruptedException e) {
- // Restore the interrupted status
- Thread.currentThread().interrupt();
- }
- }
- Log.d(LOG_TAG, "done");
- return mResult;
- }
- }
-
- public void updateServiceLocation() {
- // No permission check needed here: this call is harmless, and it's
- // needed for the ServiceState.requestStateUpdate() call (which is
- // already intentionally exposed to 3rd parties.)
- mPhone.updateServiceLocation();
- }
-
- public boolean isRadioOn() {
- return mPhone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
- }
-
- public void toggleRadioOnOff() {
- enforceModifyPermission();
- mPhone.setRadioPower(!isRadioOn());
- }
- public boolean setRadio(boolean turnOn) {
- enforceModifyPermission();
- if ((mPhone.getServiceState().getState() != ServiceState.STATE_POWER_OFF) != turnOn) {
- toggleRadioOnOff();
- }
- return true;
- }
-
- public boolean enableDataConnectivity() {
- enforceModifyPermission();
- return mPhone.enableDataConnectivity();
- }
-
- public int enableApnType(String type) {
- enforceModifyPermission();
- return mPhone.enableApnType(type);
- }
-
- public int disableApnType(String type) {
- enforceModifyPermission();
- return mPhone.disableApnType(type);
- }
-
- public boolean disableDataConnectivity() {
- enforceModifyPermission();
- return mPhone.disableDataConnectivity();
- }
-
- public boolean isDataConnectivityPossible() {
- return mPhone.isDataConnectivityPossible();
- }
-
- public boolean handlePinMmi(String dialString) {
- enforceModifyPermission();
- return (Boolean) sendRequest(CMD_HANDLE_PIN_MMI, dialString);
- }
-
- public void cancelMissedCallsNotification() {
- enforceModifyPermission();
- NotificationMgr.getDefault().cancelMissedCallNotification();
- }
-
- public int getCallState() {
- return DefaultPhoneNotifier.convertCallState(mPhone.getState());
- }
-
- public int getDataState() {
- return DefaultPhoneNotifier.convertDataState(mPhone.getDataConnectionState());
- }
-
- public int getDataActivity() {
- return DefaultPhoneNotifier.convertDataActivityState(mPhone.getDataActivityState());
- }
-
- public Bundle getCellLocation() {
- try {
- mApp.enforceCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_FINE_LOCATION, null);
- } catch (SecurityException e) {
- // If we have ACCESS_FINE_LOCATION permission, skip the check for ACCESS_COARSE_LOCATION
- // A failure should throw the SecurityException from ACCESS_COARSE_LOCATION since this
- // is the weaker precondition
- mApp.enforceCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_COARSE_LOCATION, null);
- }
- Bundle data = new Bundle();
- mPhone.getCellLocation().fillInNotifierBundle(data);
- return data;
- }
-
- public void enableLocationUpdates() {
- mApp.enforceCallingOrSelfPermission(
- android.Manifest.permission.CONTROL_LOCATION_UPDATES, null);
- mPhone.enableLocationUpdates();
- }
-
- public void disableLocationUpdates() {
- mApp.enforceCallingOrSelfPermission(
- android.Manifest.permission.CONTROL_LOCATION_UPDATES, null);
- mPhone.disableLocationUpdates();
- }
-
- @SuppressWarnings("unchecked")
- public List<NeighboringCellInfo> getNeighboringCellInfo() {
- try {
- mApp.enforceCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_FINE_LOCATION, null);
- } catch (SecurityException e) {
- // If we have ACCESS_FINE_LOCATION permission, skip the check
- // for ACCESS_COARSE_LOCATION
- // A failure should throw the SecurityException from
- // ACCESS_COARSE_LOCATION since this is the weaker precondition
- mApp.enforceCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_COARSE_LOCATION, null);
- }
-
- ArrayList<NeighboringCellInfo> cells = null;
-
- try {
- cells = (ArrayList<NeighboringCellInfo>) sendRequest(
- CMD_HANDLE_NEIGHBORING_CELL, null);
- } catch (RuntimeException e) {
- Log.e(LOG_TAG, "getNeighboringCellInfo " + e);
- }
-
- return (List <NeighboringCellInfo>) cells;
- }
-
-
- //
- // Internal helper methods.
- //
-
- /**
- * Make sure the caller has the READ_PHONE_STATE permission.
- *
- * @throws SecurityException if the caller does not have the required permission
- */
- private void enforceReadPermission() {
- mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE, null);
- }
-
- /**
- * Make sure the caller has the MODIFY_PHONE_STATE permission.
- *
- * @throws SecurityException if the caller does not have the required permission
- */
- private void enforceModifyPermission() {
- mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null);
- }
-
- /**
- * Make sure the caller has the CALL_PHONE permission.
- *
- * @throws SecurityException if the caller does not have the required permission
- */
- private void enforceCallPermission() {
- mApp.enforceCallingOrSelfPermission(android.Manifest.permission.CALL_PHONE, null);
- }
-
-
- private String createTelUrl(String number) {
- if (TextUtils.isEmpty(number)) {
- return null;
- }
-
- StringBuilder buf = new StringBuilder("tel:");
- buf.append(number);
- return buf.toString();
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, "[PhoneIntfMgr] " + msg);
- }
-
- public int getActivePhoneType() {
- return mPhone.getPhoneType();
- }
-
- /**
- * Returns the CDMA ERI icon index to display
- */
- public int getCdmaEriIconIndex() {
- return mPhone.getCdmaEriIconIndex();
- }
-
- /**
- * Returns the CDMA ERI icon mode,
- * 0 - ON
- * 1 - FLASHING
- */
- public int getCdmaEriIconMode() {
- return mPhone.getCdmaEriIconMode();
- }
-
- /**
- * Returns the CDMA ERI text,
- */
- public String getCdmaEriText() {
- return mPhone.getCdmaEriText();
- }
-
- /**
- * Returns true if CDMA provisioning needs to run.
- */
- public boolean getCdmaNeedsProvisioning() {
- if (getActivePhoneType() == Phone.PHONE_TYPE_GSM) {
- return false;
- }
-
- boolean needsProvisioning = false;
- String cdmaMin = mPhone.getCdmaMin();
- try {
- needsProvisioning = OtaUtils.needsActivation(cdmaMin);
- } catch (IllegalArgumentException e) {
- // shouldn't get here unless hardware is misconfigured
- Log.e(LOG_TAG, "CDMA MIN string " + ((cdmaMin == null) ? "was null" : "was too short"));
- }
- return needsProvisioning;
- }
-
- /**
- * Returns the unread count of voicemails
- */
- public int getVoiceMessageCount() {
- return mPhone.getVoiceMessageCount();
- }
-
- /**
- * Returns the network type
- */
- public int getNetworkType() {
- int radiotech = mPhone.getServiceState().getRadioTechnology();
- switch(radiotech) {
- case ServiceState.RADIO_TECHNOLOGY_GPRS:
- return TelephonyManager.NETWORK_TYPE_GPRS;
- case ServiceState.RADIO_TECHNOLOGY_EDGE:
- return TelephonyManager.NETWORK_TYPE_EDGE;
- case ServiceState.RADIO_TECHNOLOGY_UMTS:
- return TelephonyManager.NETWORK_TYPE_UMTS;
- case ServiceState.RADIO_TECHNOLOGY_HSDPA:
- return TelephonyManager.NETWORK_TYPE_HSDPA;
- case ServiceState.RADIO_TECHNOLOGY_HSUPA:
- return TelephonyManager.NETWORK_TYPE_HSUPA;
- case ServiceState.RADIO_TECHNOLOGY_HSPA:
- return TelephonyManager.NETWORK_TYPE_HSPA;
- case ServiceState.RADIO_TECHNOLOGY_IS95A:
- case ServiceState.RADIO_TECHNOLOGY_IS95B:
- return TelephonyManager.NETWORK_TYPE_CDMA;
- case ServiceState.RADIO_TECHNOLOGY_1xRTT:
- return TelephonyManager.NETWORK_TYPE_1xRTT;
- case ServiceState.RADIO_TECHNOLOGY_EVDO_0:
- return TelephonyManager.NETWORK_TYPE_EVDO_0;
- case ServiceState.RADIO_TECHNOLOGY_EVDO_A:
- return TelephonyManager.NETWORK_TYPE_EVDO_A;
- default:
- return TelephonyManager.NETWORK_TYPE_UNKNOWN;
- }
- }
-
- /**
- * @return true if a ICC card is present
- */
- public boolean hasIccCard() {
- return mPhone.getIccCard().hasIccCard();
- }
-}
diff --git a/phone/src/com/android/phone2/PhoneUtils.java b/phone/src/com/android/phone2/PhoneUtils.java
deleted file mode 100755
index 014d65d..0000000
--- a/phone/src/com/android/phone2/PhoneUtils.java
+++ /dev/null
@@ -1,2390 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.ActivityManagerNative;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.content.ComponentName;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.SystemProperties;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.EditText;
-import android.widget.Toast;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.CallStateException;
-import com.android.internal.telephony.CallerInfo;
-import com.android.internal.telephony.CallerInfoAsyncQuery;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.IExtendedNetworkService;
-import com.android.internal.telephony.MmiCode;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.TelephonyProperties;
-import com.android.internal.telephony.cdma.CdmaConnection;
-
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Misc utilities for the Phone app.
- */
-public class PhoneUtils {
- private static final String LOG_TAG = "PhoneUtils";
- private static final boolean DBG = true; //(PhoneApp.DBG_LEVEL >= 2);
-
- /** Control stack trace for Audio Mode settings */
- private static final boolean DBG_SETAUDIOMODE_STACK = false;
-
- /** Identifier for the "Add Call" intent extra. */
- static final String ADD_CALL_MODE_KEY = "add_call_mode";
-
- // Return codes from placeCall()
- static final int CALL_STATUS_DIALED = 0; // The number was successfully dialed
- static final int CALL_STATUS_DIALED_MMI = 1; // The specified number was an MMI code
- static final int CALL_STATUS_FAILED = 2; // The call failed
-
- // State of the Phone's audio modes
- // Each state can move to the other states, but within the state only certain
- // transitions for AudioManager.setMode() are allowed.
- static final int AUDIO_IDLE = 0; /** audio behaviour at phone idle */
- static final int AUDIO_RINGING = 1; /** audio behaviour while ringing */
- static final int AUDIO_OFFHOOK = 2; /** audio behaviour while in call. */
- private static int sAudioBehaviourState = AUDIO_IDLE;
-
- /** Speaker state, persisting between wired headset connection events */
- private static boolean sIsSpeakerEnabled = false;
-
- /** Hash table to store mute (Boolean) values based upon the connection.*/
- private static Hashtable<Connection, Boolean> sConnectionMuteTable =
- new Hashtable<Connection, Boolean>();
-
- /** Static handler for the connection/mute tracking */
- private static ConnectionHandler mConnectionHandler;
-
- /** Phone state changed event*/
- private static final int PHONE_STATE_CHANGED = -1;
-
- /** Define for not a special CNAP string */
- private static final int CNAP_SPECIAL_CASE_NO = -1;
-
- // Extended network service interface instance
- private static IExtendedNetworkService mNwService = null;
- // used to cancel MMI command after 15 seconds timeout for NWService requirement
- private static Message mMmiTimeoutCbMsg = null;
-
- /** Noise suppression status as selected by user */
- private static boolean sIsNoiseSuppressionEnabled = true;
-
- /**
- * Handler that tracks the connections and updates the value of the
- * Mute settings for each connection as needed.
- */
- private static class ConnectionHandler extends Handler {
- @Override
- public void handleMessage(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
- switch (msg.what) {
- case PHONE_STATE_CHANGED:
- if (DBG) log("ConnectionHandler: updating mute state for each connection");
-
- Phone phone = (Phone) ar.userObj;
-
- // update the foreground connections, if there are new connections.
- List<Connection> fgConnections = phone.getForegroundCall().getConnections();
- for (Connection cn : fgConnections) {
- if (sConnectionMuteTable.get(cn) == null) {
- sConnectionMuteTable.put(cn, Boolean.FALSE);
- }
- }
-
- // update the background connections, if there are new connections.
- List<Connection> bgConnections = phone.getBackgroundCall().getConnections();
- for (Connection cn : bgConnections) {
- if (sConnectionMuteTable.get(cn) == null) {
- sConnectionMuteTable.put(cn, Boolean.FALSE);
- }
- }
-
- // Check to see if there are any lingering connections here
- // (disconnected connections), use old-school iterators to avoid
- // concurrent modification exceptions.
- Connection cn;
- for (Iterator<Connection> cnlist = sConnectionMuteTable.keySet().iterator();
- cnlist.hasNext();) {
- cn = cnlist.next();
- if (!fgConnections.contains(cn) && !bgConnections.contains(cn)) {
- if (DBG) log("connection: " + cn + "not accounted for, removing.");
- cnlist.remove();
- }
- }
-
- // Restore the mute state of the foreground call if we're not IDLE,
- // otherwise just clear the mute state. This is really saying that
- // as long as there is one or more connections, we should update
- // the mute state with the earliest connection on the foreground
- // call, and that with no connections, we should be back to a
- // non-mute state.
- if (phone.getState() != Phone.State.IDLE) {
- restoreMuteState(phone);
- } else {
- setMuteInternal(phone, false);
- }
-
- break;
- }
- }
- }
-
-
- private static ServiceConnection ExtendedNetworkServiceConnection = new ServiceConnection() {
- public void onServiceConnected(ComponentName name, IBinder iBinder) {
- if (DBG) log("Extended NW onServiceConnected");
- mNwService = IExtendedNetworkService.Stub.asInterface(iBinder);
- }
-
- public void onServiceDisconnected(ComponentName arg0) {
- if (DBG) log("Extended NW onServiceDisconnected");
- mNwService = null;
- }
- };
-
- /**
- * Register the ConnectionHandler with the phone, to receive connection events
- */
- public static void initializeConnectionHandler(Phone phone) {
- if (mConnectionHandler == null) {
- mConnectionHandler = new ConnectionHandler();
- }
-
- phone.registerForPreciseCallStateChanged(mConnectionHandler, PHONE_STATE_CHANGED, phone);
- // Extended NW service
- Intent intent = new Intent("com.android.ussd.IExtendedNetworkService");
- phone.getContext().bindService(intent,
- ExtendedNetworkServiceConnection, Context.BIND_AUTO_CREATE);
- if (DBG) log("Extended NW bindService IExtendedNetworkService");
-
- }
-
- /** This class is never instantiated. */
- private PhoneUtils() {
- }
-
- //static method to set the audio control state.
- static void setAudioControlState(int newState) {
- sAudioBehaviourState = newState;
- }
-
- /**
- * Answer the currently-ringing call.
- *
- * @return true if we answered the call, or false if there wasn't
- * actually a ringing incoming call, or some other error occurred.
- *
- * @see answerAndEndHolding()
- * @see answerAndEndActive()
- */
- static boolean answerCall(Phone phone) {
- if (DBG) log("answerCall()...");
-
- // If the ringer is currently ringing and/or vibrating, stop it
- // right now (before actually answering the call.)
- PhoneApp.getInstance().getRinger().stopRing();
-
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_OFFHOOK);
-
- boolean answered = false;
- Call call = phone.getRingingCall();
- PhoneApp app = PhoneApp.getInstance();
- boolean phoneIsCdma = (phone.getPhoneType() == Phone.PHONE_TYPE_CDMA);
- BluetoothHandsfree bthf = null;
-
- if (phoneIsCdma) {
- // Stop any signalInfo tone being played when a Call waiting gets answered
- if (call.getState() == Call.State.WAITING) {
- final CallNotifier notifier = app.notifier;
- notifier.stopSignalInfoTone();
- }
- }
-
- if (call != null && call.isRinging()) {
- if (DBG) log("answerCall: call state = " + call.getState());
- try {
- if (phoneIsCdma) {
- if (app.cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.IDLE) {
- // This is the FIRST incoming call being answered.
- // Set the Phone Call State to SINGLE_ACTIVE
- app.cdmaPhoneCallState.setCurrentCallState(
- CdmaPhoneCallState.PhoneCallState.SINGLE_ACTIVE);
- } else {
- // This is the CALL WAITING call being answered.
- // Set the Phone Call State to CONF_CALL
- app.cdmaPhoneCallState.setCurrentCallState(
- CdmaPhoneCallState.PhoneCallState.CONF_CALL);
- // Enable "Add Call" option after answering a Call Waiting as the user
- // should be allowed to add another call in case one of the parties
- // drops off
- app.cdmaPhoneCallState.setAddCallMenuStateAfterCallWaiting(true);
-
- // If a BluetoothHandsfree is valid we need to set the second call state
- // so that the Bluetooth client can update the Call state correctly when
- // a call waiting is answered from the Phone.
- bthf = app.getBluetoothHandsfree();
- if (bthf != null) {
- bthf.cdmaSetSecondCallState(true);
- }
- }
- }
-
- //if (DBG) log("sPhone.acceptCall");
- phone.acceptCall();
- answered = true;
- if (phoneIsCdma) {
- // automatically reset mute state to unmuted for CDMA
- // TODO: Would GSM want this also?
- setMute(phone, false);
- }
- setAudioMode(phone.getContext(), AudioManager.MODE_IN_CALL);
-
- // Check is phone in any dock, and turn on speaker accordingly
- activateSpeakerIfDocked(phone);
- } catch (CallStateException ex) {
- Log.w(LOG_TAG, "answerCall: caught " + ex, ex);
-
- if (phoneIsCdma) {
- // restore the cdmaPhoneCallState and bthf.cdmaSetSecondCallState:
- app.cdmaPhoneCallState.setCurrentCallState(
- app.cdmaPhoneCallState.getPreviousCallState());
- if (bthf != null) {
- bthf.cdmaSetSecondCallState(false);
- }
- }
- }
- }
- return answered;
- }
-
- /**
- * Smart "hang up" helper method which hangs up exactly one connection,
- * based on the current Phone state, as follows:
- * <ul>
- * <li>If there's a ringing call, hang that up.
- * <li>Else if there's a foreground call, hang that up.
- * <li>Else if there's a background call, hang that up.
- * <li>Otherwise do nothing.
- * </ul>
- * @return true if we successfully hung up, or false
- * if there were no active calls at all.
- */
- static boolean hangup(Phone phone) {
- boolean hungup = false;
- Call ringing = phone.getRingingCall();
- Call fg = phone.getForegroundCall();
- Call bg = phone.getBackgroundCall();
-
- if (!ringing.isIdle()) {
- if (DBG) log("HANGUP ringing call");
- hungup = hangupRingingCall(phone);
- } else if (!fg.isIdle()) {
- if (DBG) log("HANGUP foreground call");
- hungup = hangup(fg);
- } else if (!bg.isIdle()) {
- if (DBG) log("HANGUP background call");
- hungup = hangup(bg);
- }
-
- if (DBG) log("hungup=" + hungup);
-
- return hungup;
- }
-
- static boolean hangupRingingCall(Phone phone) {
- if (DBG) log("hangup ringing call");
- Call ringing = phone.getRingingCall();
- int phoneType = phone.getPhoneType();
-
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // CDMA: Ringing call and Call waiting hangup is handled differently.
- // For Call waiting we DO NOT call the conventional hangup(call) function
- // as in CDMA we just want to hungup the Call waiting connection.
- Call.State state = ringing.getState();
- if (state == Call.State.INCOMING) {
- if (DBG) log("hangup ringing call");
- return hangup(ringing);
- } else if (state == Call.State.WAITING) {
- if (DBG) log("hangup Call waiting call");
- final CallNotifier notifier = PhoneApp.getInstance().notifier;
- notifier.sendCdmaCallWaitingReject();
- return true;
- } else {
- // This should never happen cause hangupRingingCall should always be called
- // if the call.isRinging() returns TRUE, which basically means that the call
- // should either be in INCOMING or WAITING state
- if (DBG) log("No Ringing call to hangup");
- return false;
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- // GSM: Ringing Call and Call waiting, both are hungup by calling
- // hangup(call) function.
- if (DBG) log("hangup ringing call");
- return hangup(ringing);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
-
- static boolean hangupActiveCall(Phone phone) {
- if (DBG) log("hangup active call");
- return hangup(phone.getForegroundCall());
- }
-
- static boolean hangupHoldingCall(Phone phone) {
- if (DBG) log("hangup holding call");
- return hangup(phone.getBackgroundCall());
- }
-
- /**
- * Used in CDMA phones to end the complete Call session
- * @param phone the Phone object.
- * @return true if *any* call was successfully hung up
- */
- static boolean hangupRingingAndActive(Phone phone) {
- boolean hungUpRingingCall = false;
- boolean hungUpFgCall = false;
- Call ringingCall = phone.getRingingCall();
- Call fgCall = phone.getForegroundCall();
-
- // Hang up any Ringing Call
- if (!ringingCall.isIdle()) {
- if (DBG) log("endCallInternal: Hang up Ringing Call");
- hungUpRingingCall = hangupRingingCall(phone);
- }
-
- // Hang up any Active Call
- if (!fgCall.isIdle()) {
- if (DBG) log("endCallInternal: Hang up Foreground Call");
- hungUpFgCall = hangupActiveCall(phone);
- }
-
- return hungUpRingingCall || hungUpFgCall;
- }
-
- /**
- * Trivial wrapper around Call.hangup(), except that we return a
- * boolean success code rather than throwing CallStateException on
- * failure.
- *
- * @return true if the call was successfully hung up, or false
- * if the call wasn't actually active.
- */
- static boolean hangup(Call call) {
- try {
- call.hangup();
- return true;
- } catch (CallStateException ex) {
- Log.e(LOG_TAG, "Call hangup: caught " + ex, ex);
- }
-
- return false;
- }
-
- /**
- * Trivial wrapper around Connection.hangup(), except that we silently
- * do nothing (rather than throwing CallStateException) if the
- * connection wasn't actually active.
- */
- static void hangup(Connection c) {
- try {
- if (c != null) {
- c.hangup();
- }
- } catch (CallStateException ex) {
- Log.w(LOG_TAG, "Connection hangup: caught " + ex, ex);
- }
- }
-
- static boolean answerAndEndHolding(Phone phone) {
- if (DBG) log("end holding & answer waiting: 1");
- if (!hangupHoldingCall(phone)) {
- Log.e(LOG_TAG, "end holding failed!");
- return false;
- }
-
- if (DBG) log("end holding & answer waiting: 2");
- return answerCall(phone);
-
- }
-
- static boolean answerAndEndActive(Phone phone) {
- if (DBG) log("answerAndEndActive()...");
-
- // Unlike the answerCall() method, we *don't* need to stop the
- // ringer or change audio modes here since the user is already
- // in-call, which means that the audio mode is already set
- // correctly, and that we wouldn't have started the ringer in the
- // first place.
-
- // hanging up the active call also accepts the waiting call
- return hangupActiveCall(phone);
- }
-
- /**
- * For a CDMA phone, advance the call state upon making a new
- * outgoing call.
- *
- * <pre>
- * IDLE -> SINGLE_ACTIVE
- * or
- * SINGLE_ACTIVE -> THRWAY_ACTIVE
- * </pre>
- * @param app The phone instance.
- */
- static private void updateCdmaCallStateOnNewOutgoingCall(PhoneApp app) {
- if (app.cdmaPhoneCallState.getCurrentCallState() ==
- CdmaPhoneCallState.PhoneCallState.IDLE) {
- // This is the first outgoing call. Set the Phone Call State to ACTIVE
- app.cdmaPhoneCallState.setCurrentCallState(
- CdmaPhoneCallState.PhoneCallState.SINGLE_ACTIVE);
- } else {
- // This is the second outgoing call. Set the Phone Call State to 3WAY
- app.cdmaPhoneCallState.setCurrentCallState(
- CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE);
- }
- }
-
- /**
- * Dial the number using the phone passed in.
- *
- * @param phone the Phone object.
- * @param number to be dialed as requested by the user.
- * @param contactRef that triggered the call. Either a 'tel:' or a
- * 'content://contacts' uri depending on how the call was
- * initiated (dialpad vs contact).
- * @return either CALL_STATUS_DIALED, CALL_STATUS_DIALED_MMI, or CALL_STATUS_FAILED
- */
- static int placeCall(Phone phone, String number, Uri contactRef) {
- int status = CALL_STATUS_DIALED;
- try {
- if (DBG) log("placeCall: '" + number + "'...");
-
- Connection cn = phone.dial(number);
- if (DBG) log("===> phone.dial() returned: " + cn);
-
- int phoneType = phone.getPhoneType();
-
- // On GSM phones, null is returned for MMI codes
- if (cn == null) {
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- if (DBG) log("dialed MMI code: " + number);
- status = CALL_STATUS_DIALED_MMI;
- // Set dialed MMI command to service
- if (mNwService != null) {
- try {
- mNwService.setMmiString(number);
- if (DBG) log("Extended NW bindService setUssdString (" + number + ")");
- } catch (RemoteException e) {
- mNwService = null;
- }
- }
- } else {
- status = PhoneUtils.CALL_STATUS_FAILED;
- }
- } else {
- PhoneApp app = PhoneApp.getInstance();
-
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- updateCdmaCallStateOnNewOutgoingCall(app);
- }
-
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_OFFHOOK);
-
- // phone.dial() succeeded: we're now in a normal phone call.
- // attach the URI to the CallerInfo Object if it is there,
- // otherwise just attach the Uri Reference.
- // if the uri does not have a "content" scheme, then we treat
- // it as if it does NOT have a unique reference.
- String content = phone.getContext().getContentResolver().SCHEME_CONTENT;
- if ((contactRef != null) && (contactRef.getScheme().equals(content))) {
- Object userDataObject = cn.getUserData();
- if (userDataObject == null) {
- cn.setUserData(contactRef);
- } else {
- // TODO: This branch is dead code, we have
- // just created the connection 'cn' which has
- // no user data (null) by default.
- if (userDataObject instanceof CallerInfo) {
- ((CallerInfo) userDataObject).contactRefUri = contactRef;
- } else {
- ((CallerInfoToken) userDataObject).currentInfo.contactRefUri =
- contactRef;
- }
- }
- }
- setAudioMode(phone.getContext(), AudioManager.MODE_IN_CALL);
-
- // Check is phone in any dock, and turn on speaker accordingly
- activateSpeakerIfDocked(phone);
- }
- } catch (CallStateException ex) {
- Log.w(LOG_TAG, "Exception from phone.dial()", ex);
- status = CALL_STATUS_FAILED;
- }
-
- return status;
- }
-
- /**
- * Dial the number using a 3rd party provider gateway. Should
- * *NOT* be called if the number is either:
- * . An emergency one
- * . A GSM MMI code
- * . A CDMA feature code
- * None of the above is checked in this method, it's the caller's
- * responsability to make sure the number is 'valid'.
- *
- * If the connection is establised, this method issues a sync call
- * that may block to query the caller info.
- * TODO: Change the logic to use the async query.
- *
- * @param phone the Phone object.
- * @param context To perform the CallerInfo query.
- * @param number to be dialed as requested by the user. This is
- * NOT the phone number to connect to. It is used only to build the
- * call card and to update the call log. See above for restrictions.
- * @param contactRef that triggered the call. Typically a 'tel:'
- * uri but can also be a 'content://contacts' one.
- * @param gatewayUri Is the address used to setup the connection.
- * @return either CALL_STATUS_DIALED or CALL_STATUS_FAILED
- */
- static int placeCallVia(Context context, Phone phone,
- String number, Uri contactRef, Uri gatewayUri) {
- if (DBG) log("placeCallVia: '" + number + "' GW:'" + gatewayUri + "'");
-
- // TODO: 'tel' should be a contant defined in framework base
- // somewhere (it is in webkit.)
- if (null == gatewayUri || !"tel".equals(gatewayUri.getScheme())) {
- Log.e(LOG_TAG, "Unsupported URL:" + gatewayUri);
- return CALL_STATUS_FAILED;
- }
-
- // We can use getSchemeSpecificPart because we don't allow #
- // in the gateway numbers (treated a fragment delim.) However
- // if we allow more complex gateway numbers sequence (with
- // passwords or whatnot) that use #, this may break.
- // TODO: Need to support MMI codes.
- String gatewayNumber = gatewayUri.getSchemeSpecificPart();
- Connection connection;
- try {
- connection = phone.dial(gatewayNumber);
- } catch (CallStateException ex) {
- Log.e(LOG_TAG, "Exception dialing gateway", ex);
- connection = null;
- }
-
- if (null == connection) {
- Log.e(LOG_TAG, "Got null connection.");
- return CALL_STATUS_FAILED;
- }
-
- PhoneApp app = PhoneApp.getInstance();
- boolean phoneIsCdma = (phone.getPhoneType() == Phone.PHONE_TYPE_CDMA);
-
- if (phoneIsCdma) {
- updateCdmaCallStateOnNewOutgoingCall(app);
- }
- PhoneUtils.setAudioControlState(PhoneUtils.AUDIO_OFFHOOK);
-
- // Clean up the number to be displayed.
- if (phoneIsCdma) {
- number = CdmaConnection.formatDialString(number);
- }
- number = PhoneNumberUtils.extractNetworkPortion(number);
- number = PhoneNumberUtils.convertKeypadLettersToDigits(number);
- number = PhoneNumberUtils.formatNumber(number);
-
- // Get the caller info synchronously because we need the final
- // CallerInfo object to update the dialed number with the one
- // requested by the user (and not the provider's gateway number).
- CallerInfo info = null;
-
- if (ContentResolver.SCHEME_CONTENT.equals(contactRef.getScheme())) {
- info = CallerInfo.getCallerInfo(context, contactRef);
- }
-
- // Fallback, lookup contact using the phone number if the
- // contact's URI scheme was not content:// or if is was but
- // the lookup failed.
- if (null == info) {
- info = CallerInfo.getCallerInfo(context, number);
- }
- info.phoneNumber = number;
- connection.setUserData(info);
-
- setAudioMode(phone.getContext(), AudioManager.MODE_IN_CALL);
- return CALL_STATUS_DIALED;
- }
-
- /**
- * Wrapper function to control when to send an empty Flash command to the network.
- * Mainly needed for CDMA networks, such as scenarios when we need to send a blank flash
- * to the network prior to placing a 3-way call for it to be successful.
- */
- static void sendEmptyFlash(Phone phone) {
- if (phone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- Call fgCall = phone.getForegroundCall();
- if (fgCall.getState() == Call.State.ACTIVE) {
- // Send the empty flash
- if (DBG) Log.d(LOG_TAG, "onReceive: (CDMA) sending empty flash to network");
- switchHoldingAndActive(phone);
- }
- }
- }
-
- static void switchHoldingAndActive(Phone phone) {
- try {
- if (DBG) log("switchHoldingAndActive");
- phone.switchHoldingAndActive();
- } catch (CallStateException ex) {
- Log.w(LOG_TAG, "switchHoldingAndActive: caught " + ex, ex);
- }
- }
-
- /**
- * Restore the mute setting from the earliest connection of the
- * foreground call.
- */
- static Boolean restoreMuteState(Phone phone) {
- //get the earliest connection
- Connection c = phone.getForegroundCall().getEarliestConnection();
-
- // only do this if connection is not null.
- if (c != null) {
-
- int phoneType = phone.getPhoneType();
-
- // retrieve the mute value.
- Boolean shouldMute = null;
-
- // In CDMA, mute is not maintained per Connection. Single mute apply for
- // a call where call can have multiple connections such as
- // Three way and Call Waiting. Therefore retrieving Mute state for
- // latest connection can apply for all connection in that call
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- shouldMute = sConnectionMuteTable.get(
- phone.getForegroundCall().getLatestConnection());
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- shouldMute = sConnectionMuteTable.get(
- phone.getForegroundCall().getEarliestConnection());
- }
- if (shouldMute == null) {
- if (DBG) log("problem retrieving mute value for this connection.");
- shouldMute = Boolean.FALSE;
- }
-
- // set the mute value and return the result.
- setMute (phone, shouldMute.booleanValue());
- return shouldMute;
- }
- return Boolean.valueOf(getMute (phone));
- }
-
- static void mergeCalls(Phone phone) {
- int phoneType = phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_GSM) {
- try {
- if (DBG) log("mergeCalls");
- phone.conference();
- } catch (CallStateException ex) {
- Log.w(LOG_TAG, "mergeCalls: caught " + ex, ex);
- }
- } else if (phoneType == Phone.PHONE_TYPE_CDMA) {
- if (DBG) log("mergeCalls");
- PhoneApp app = PhoneApp.getInstance();
- if (app.cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE) {
- // Set the Phone Call State to conference
- app.cdmaPhoneCallState.setCurrentCallState(
- CdmaPhoneCallState.PhoneCallState.CONF_CALL);
-
- // Send flash cmd
- // TODO: Need to change the call from switchHoldingAndActive to
- // something meaningful as we are not actually trying to swap calls but
- // instead are merging two calls by sending a Flash command.
- switchHoldingAndActive(phone);
- }
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
-
- static void separateCall(Connection c) {
- try {
- if (DBG) log("separateCall: " + c.getAddress());
- c.separate();
- } catch (CallStateException ex) {
- Log.w(LOG_TAG, "separateCall: caught " + ex, ex);
- }
- }
-
- /**
- * Handle the MMIInitiate message and put up an alert that lets
- * the user cancel the operation, if applicable.
- *
- * @param context context to get strings.
- * @param mmiCode the MmiCode object being started.
- * @param buttonCallbackMessage message to post when button is clicked.
- * @param previousAlert a previous alert used in this activity.
- * @return the dialog handle
- */
- static Dialog displayMMIInitiate(Context context,
- MmiCode mmiCode,
- Message buttonCallbackMessage,
- Dialog previousAlert) {
- if (DBG) log("displayMMIInitiate: " + mmiCode);
- if (previousAlert != null) {
- previousAlert.dismiss();
- }
-
- // The UI paradigm we are using now requests that all dialogs have
- // user interaction, and that any other messages to the user should
- // be by way of Toasts.
- //
- // In adhering to this request, all MMI initiating "OK" dialogs
- // (non-cancelable MMIs) that end up being closed when the MMI
- // completes (thereby showing a completion dialog) are being
- // replaced with Toasts.
- //
- // As a side effect, moving to Toasts for the non-cancelable MMIs
- // also means that buttonCallbackMessage (which was tied into "OK")
- // is no longer invokable for these dialogs. This is not a problem
- // since the only callback messages we supported were for cancelable
- // MMIs anyway.
- //
- // A cancelable MMI is really just a USSD request. The term
- // "cancelable" here means that we can cancel the request when the
- // system prompts us for a response, NOT while the network is
- // processing the MMI request. Any request to cancel a USSD while
- // the network is NOT ready for a response may be ignored.
- //
- // With this in mind, we replace the cancelable alert dialog with
- // a progress dialog, displayed until we receive a request from
- // the the network. For more information, please see the comments
- // in the displayMMIComplete() method below.
- //
- // Anything that is NOT a USSD request is a normal MMI request,
- // which will bring up a toast (desribed above).
- // Optional code for Extended USSD running prompt
- if (mNwService != null) {
- if (DBG) log("running USSD code, displaying indeterminate progress.");
- // create the indeterminate progress dialog and display it.
- ProgressDialog pd = new ProgressDialog(context);
- CharSequence textmsg = "";
- try {
- textmsg = mNwService.getMmiRunningText();
-
- } catch (RemoteException e) {
- mNwService = null;
- textmsg = context.getText(R.string.ussdRunning);
- }
- if (DBG) log("Extended NW displayMMIInitiate (" + textmsg+ ")");
- pd.setMessage(textmsg);
- pd.setCancelable(false);
- pd.setIndeterminate(true);
- pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
- pd.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
- pd.show();
- // trigger a 15 seconds timeout to clear this progress dialog
- mMmiTimeoutCbMsg = buttonCallbackMessage;
- try {
- mMmiTimeoutCbMsg.getTarget().sendMessageDelayed(buttonCallbackMessage, 15000);
- } catch(NullPointerException e) {
- mMmiTimeoutCbMsg = null;
- }
- return pd;
- }
-
- boolean isCancelable = (mmiCode != null) && mmiCode.isCancelable();
-
- if (!isCancelable) {
- if (DBG) log("not a USSD code, displaying status toast.");
- CharSequence text = context.getText(R.string.mmiStarted);
- Toast.makeText(context, text, Toast.LENGTH_SHORT)
- .show();
- return null;
- } else {
- if (DBG) log("running USSD code, displaying indeterminate progress.");
-
- // create the indeterminate progress dialog and display it.
- ProgressDialog pd = new ProgressDialog(context);
- pd.setMessage(context.getText(R.string.ussdRunning));
- pd.setCancelable(false);
- pd.setIndeterminate(true);
- pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-
- pd.show();
-
- return pd;
- }
-
- }
-
- /**
- * Handle the MMIComplete message and fire off an intent to display
- * the message.
- *
- * @param context context to get strings.
- * @param mmiCode MMI result.
- * @param previousAlert a previous alert used in this activity.
- */
- static void displayMMIComplete(final Phone phone, Context context, final MmiCode mmiCode,
- Message dismissCallbackMessage,
- AlertDialog previousAlert) {
- CharSequence text;
- int title = 0; // title for the progress dialog, if needed.
- MmiCode.State state = mmiCode.getState();
-
- if (DBG) log("displayMMIComplete: state=" + state);
- // Clear timeout trigger message
- if(mMmiTimeoutCbMsg != null) {
- try{
- mMmiTimeoutCbMsg.getTarget().removeMessages(mMmiTimeoutCbMsg.what);
- if (DBG) log("Extended NW displayMMIComplete removeMsg");
- } catch (NullPointerException e) {
- }
- mMmiTimeoutCbMsg = null;
- }
-
-
- switch (state) {
- case PENDING:
- // USSD code asking for feedback from user.
- text = mmiCode.getMessage();
- if (DBG) log("- using text from PENDING MMI message: '" + text + "'");
- break;
- case CANCELLED:
- text = context.getText(R.string.mmiCancelled);
- break;
- case COMPLETE:
- if (PhoneApp.getInstance().getPUKEntryActivity() != null) {
- // if an attempt to unPUK the device was made, we specify
- // the title and the message here.
- title = com.android.internal.R.string.PinMmi;
- text = context.getText(R.string.puk_unlocked);
- break;
- }
- // All other conditions for the COMPLETE mmi state will cause
- // the case to fall through to message logic in common with
- // the FAILED case.
-
- case FAILED:
- text = mmiCode.getMessage();
- if (DBG) log("- using text from MMI message: '" + text + "'");
- break;
- default:
- throw new IllegalStateException("Unexpected MmiCode state: " + state);
- }
-
- if (previousAlert != null) {
- previousAlert.dismiss();
- }
-
- // Check to see if a UI exists for the PUK activation. If it does
- // exist, then it indicates that we're trying to unblock the PUK.
- PhoneApp app = PhoneApp.getInstance();
- if ((app.getPUKEntryActivity() != null) && (state == MmiCode.State.COMPLETE)) {
- if (DBG) log("displaying PUK unblocking progress dialog.");
-
- // create the progress dialog, make sure the flags and type are
- // set correctly.
- ProgressDialog pd = new ProgressDialog(app);
- pd.setTitle(title);
- pd.setMessage(text);
- pd.setCancelable(false);
- pd.setIndeterminate(true);
- pd.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
- pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-
- // display the dialog
- pd.show();
-
- // indicate to the Phone app that the progress dialog has
- // been assigned for the PUK unlock / SIM READY process.
- app.setPukEntryProgressDialog(pd);
-
- } else {
- // In case of failure to unlock, we'll need to reset the
- // PUK unlock activity, so that the user may try again.
- if (app.getPUKEntryActivity() != null) {
- app.setPukEntryActivity(null);
- }
-
- // A USSD in a pending state means that it is still
- // interacting with the user.
- if (state != MmiCode.State.PENDING) {
- if (DBG) log("MMI code has finished running.");
-
- // Replace response message with Extended Mmi wording
- if (mNwService != null) {
- try {
- text = mNwService.getUserMessage(text);
- } catch (RemoteException e) {
- mNwService = null;
- }
- if (DBG) log("Extended NW displayMMIInitiate (" + text + ")");
- if (text == null || text.length() == 0)
- return;
- }
-
- // displaying system alert dialog on the screen instead of
- // using another activity to display the message. This
- // places the message at the forefront of the UI.
- AlertDialog newDialog = new AlertDialog.Builder(context)
- .setMessage(text)
- .setPositiveButton(R.string.ok, null)
- .setCancelable(true)
- .create();
-
- newDialog.getWindow().setType(
- WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
- newDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-
- newDialog.show();
- } else {
- if (DBG) log("USSD code has requested user input. Constructing input dialog.");
-
- // USSD MMI code that is interacting with the user. The
- // basic set of steps is this:
- // 1. User enters a USSD request
- // 2. We recognize the request and displayMMIInitiate
- // (above) creates a progress dialog.
- // 3. Request returns and we get a PENDING or COMPLETE
- // message.
- // 4. These MMI messages are caught in the PhoneApp
- // (onMMIComplete) and the InCallScreen
- // (mHandler.handleMessage) which bring up this dialog
- // and closes the original progress dialog,
- // respectively.
- // 5. If the message is anything other than PENDING,
- // we are done, and the alert dialog (directly above)
- // displays the outcome.
- // 6. If the network is requesting more information from
- // the user, the MMI will be in a PENDING state, and
- // we display this dialog with the message.
- // 7. User input, or cancel requests result in a return
- // to step 1. Keep in mind that this is the only
- // time that a USSD should be canceled.
-
- // inflate the layout with the scrolling text area for the dialog.
- LayoutInflater inflater = (LayoutInflater) context.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- View dialogView = inflater.inflate(R.layout.dialog_ussd_response, null);
-
- // get the input field.
- final EditText inputText = (EditText) dialogView.findViewById(R.id.input_field);
-
- // specify the dialog's click listener, with SEND and CANCEL logic.
- final DialogInterface.OnClickListener mUSSDDialogListener =
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- switch (whichButton) {
- case DialogInterface.BUTTON1:
- phone.sendUssdResponse(inputText.getText().toString());
- break;
- case DialogInterface.BUTTON2:
- if (mmiCode.isCancelable()) {
- mmiCode.cancel();
- }
- break;
- }
- }
- };
-
- // build the dialog
- final AlertDialog newDialog = new AlertDialog.Builder(context)
- .setMessage(text)
- .setView(dialogView)
- .setPositiveButton(R.string.send_button, mUSSDDialogListener)
- .setNegativeButton(R.string.cancel, mUSSDDialogListener)
- .setCancelable(false)
- .create();
-
- // attach the key listener to the dialog's input field and make
- // sure focus is set.
- final View.OnKeyListener mUSSDDialogInputListener =
- new View.OnKeyListener() {
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_CALL:
- case KeyEvent.KEYCODE_ENTER:
- phone.sendUssdResponse(inputText.getText().toString());
- newDialog.dismiss();
- return true;
- }
- return false;
- }
- };
- inputText.setOnKeyListener(mUSSDDialogInputListener);
- inputText.requestFocus();
-
- // set the window properties of the dialog
- newDialog.getWindow().setType(
- WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
- newDialog.getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-
- // now show the dialog!
- newDialog.show();
- }
- }
- }
-
- /**
- * Cancels the current pending MMI operation, if applicable.
- * @return true if we canceled an MMI operation, or false
- * if the current pending MMI wasn't cancelable
- * or if there was no current pending MMI at all.
- *
- * @see displayMMIInitiate
- */
- static boolean cancelMmiCode(Phone phone) {
- List<? extends MmiCode> pendingMmis = phone.getPendingMmiCodes();
- int count = pendingMmis.size();
- if (DBG) log("cancelMmiCode: num pending MMIs = " + count);
-
- boolean canceled = false;
- if (count > 0) {
- // assume that we only have one pending MMI operation active at a time.
- // I don't think it's possible to enter multiple MMI codes concurrently
- // in the phone UI, because during the MMI operation, an Alert panel
- // is displayed, which prevents more MMI code from being entered.
- MmiCode mmiCode = pendingMmis.get(0);
- if (mmiCode.isCancelable()) {
- mmiCode.cancel();
- canceled = true;
- }
- }
-
- //clear timeout message and pre-set MMI command
- if (mNwService != null) {
- try {
- mNwService.clearMmiString();
- } catch (RemoteException e) {
- mNwService = null;
- }
- }
- if (mMmiTimeoutCbMsg != null) {
- mMmiTimeoutCbMsg = null;
- }
- return canceled;
- }
-
- public static class VoiceMailNumberMissingException extends Exception {
- VoiceMailNumberMissingException() {
- super();
- }
-
- VoiceMailNumberMissingException(String msg) {
- super(msg);
- }
- }
-
- /**
- * Gets the phone number to be called from an intent. Requires a Context
- * to access the contacts database, and a Phone to access the voicemail
- * number.
- *
- * <p>If <code>phone</code> is <code>null</code>, the function will return
- * <code>null</code> for <code>voicemail:</code> URIs;
- * if <code>context</code> is <code>null</code>, the function will return
- * <code>null</code> for person/phone URIs.</p>
- *
- * @param context a context to use (or
- * @param phone the phone on which the number would be called
- * @param intent the intent
- *
- * @throws VoiceMailNumberMissingException if <code>intent</code> contains
- * a <code>voicemail:</code> URI, but <code>phone</code> does not
- * have a voicemail number set.
- *
- * @return the phone number that would be called by the intent,
- * or <code>null</code> if the number cannot be found.
- */
- static String getNumberFromIntent(Context context, Phone phone, Intent intent)
- throws VoiceMailNumberMissingException {
- final String number = PhoneNumberUtils.getNumberFromIntent(intent, context);
-
- // Check for a voicemail-dailing request. If the voicemail number is
- // empty, throw a VoiceMailNumberMissingException.
- if (intent.getData().getScheme().equals("voicemail") &&
- (number == null || TextUtils.isEmpty(number)))
- throw new VoiceMailNumberMissingException();
-
- return number;
- }
-
- /**
- * Returns the caller-id info corresponding to the specified Connection.
- * (This is just a simple wrapper around CallerInfo.getCallerInfo(): we
- * extract a phone number from the specified Connection, and feed that
- * number into CallerInfo.getCallerInfo().)
- *
- * The returned CallerInfo may be null in certain error cases, like if the
- * specified Connection was null, or if we weren't able to get a valid
- * phone number from the Connection.
- *
- * Finally, if the getCallerInfo() call did succeed, we save the resulting
- * CallerInfo object in the "userData" field of the Connection.
- *
- * NOTE: This API should be avoided, with preference given to the
- * asynchronous startGetCallerInfo API.
- */
- static CallerInfo getCallerInfo(Context context, Connection c) {
- CallerInfo info = null;
-
- if (c != null) {
- //See if there is a URI attached. If there is, this means
- //that there is no CallerInfo queried yet, so we'll need to
- //replace the URI with a full CallerInfo object.
- Object userDataObject = c.getUserData();
- if (userDataObject instanceof Uri) {
- info = CallerInfo.getCallerInfo(context, (Uri) userDataObject);
- if (info != null) {
- c.setUserData(info);
- }
- } else {
- if (userDataObject instanceof CallerInfoToken) {
- //temporary result, while query is running
- info = ((CallerInfoToken) userDataObject).currentInfo;
- } else {
- //final query result
- info = (CallerInfo) userDataObject;
- }
- if (info == null) {
- // No URI, or Existing CallerInfo, so we'll have to make do with
- // querying a new CallerInfo using the connection's phone number.
- String number = c.getAddress();
-
- if (DBG) log("getCallerInfo: number = " + number);
-
- if (!TextUtils.isEmpty(number)) {
- info = CallerInfo.getCallerInfo(context, number);
- if (info != null) {
- c.setUserData(info);
- }
- }
- }
- }
- }
- return info;
- }
-
- /**
- * Class returned by the startGetCallerInfo call to package a temporary
- * CallerInfo Object, to be superceded by the CallerInfo Object passed
- * into the listener when the query with token mAsyncQueryToken is complete.
- */
- public static class CallerInfoToken {
- /**indicates that there will no longer be updates to this request.*/
- public boolean isFinal;
-
- public CallerInfo currentInfo;
- public CallerInfoAsyncQuery asyncQuery;
- }
-
- /**
- * Start a CallerInfo Query based on the earliest connection in the call.
- */
- static CallerInfoToken startGetCallerInfo(Context context, Call call,
- CallerInfoAsyncQuery.OnQueryCompleteListener listener, Object cookie) {
- PhoneApp app = PhoneApp.getInstance();
- Connection conn = null;
- int phoneType = app.phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- conn = call.getLatestConnection();
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- conn = call.getEarliestConnection();
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
-
- return startGetCallerInfo(context, conn, listener, cookie);
- }
-
- /**
- * place a temporary callerinfo object in the hands of the caller and notify
- * caller when the actual query is done.
- */
- static CallerInfoToken startGetCallerInfo(Context context, Connection c,
- CallerInfoAsyncQuery.OnQueryCompleteListener listener, Object cookie) {
- CallerInfoToken cit;
-
- if (c == null) {
- //TODO: perhaps throw an exception here.
- cit = new CallerInfoToken();
- cit.asyncQuery = null;
- return cit;
- }
-
- // There are now 3 states for the userdata.
- // 1. Uri - query has not been executed yet
- // 2. CallerInfoToken - query is executing, but has not completed.
- // 3. CallerInfo - query has executed.
- // In each case we have slightly different behaviour:
- // 1. If the query has not been executed yet (Uri or null), we start
- // query execution asynchronously, and note it by attaching a
- // CallerInfoToken as the userData.
- // 2. If the query is executing (CallerInfoToken), we've essentially
- // reached a state where we've received multiple requests for the
- // same callerInfo. That means that once the query is complete,
- // we'll need to execute the additional listener requested.
- // 3. If the query has already been executed (CallerInfo), we just
- // return the CallerInfo object as expected.
- // 4. Regarding isFinal - there are cases where the CallerInfo object
- // will not be attached, like when the number is empty (caller id
- // blocking). This flag is used to indicate that the
- // CallerInfoToken object is going to be permanent since no
- // query results will be returned. In the case where a query
- // has been completed, this flag is used to indicate to the caller
- // that the data will not be updated since it is valid.
- //
- // Note: For the case where a number is NOT retrievable, we leave
- // the CallerInfo as null in the CallerInfoToken. This is
- // something of a departure from the original code, since the old
- // code manufactured a CallerInfo object regardless of the query
- // outcome. From now on, we will append an empty CallerInfo
- // object, to mirror previous behaviour, and to avoid Null Pointer
- // Exceptions.
- Object userDataObject = c.getUserData();
- if (userDataObject instanceof Uri) {
- //create a dummy callerinfo, populate with what we know from URI.
- cit = new CallerInfoToken();
- cit.currentInfo = new CallerInfo();
- cit.asyncQuery = CallerInfoAsyncQuery.startQuery(QUERY_TOKEN, context,
- (Uri) userDataObject, sCallerInfoQueryListener, c);
- cit.asyncQuery.addQueryListener(QUERY_TOKEN, listener, cookie);
- cit.isFinal = false;
-
- c.setUserData(cit);
-
- if (DBG) log("startGetCallerInfo: query based on Uri: " + userDataObject);
-
- } else if (userDataObject == null) {
- // No URI, or Existing CallerInfo, so we'll have to make do with
- // querying a new CallerInfo using the connection's phone number.
- String number = c.getAddress();
-
- cit = new CallerInfoToken();
- cit.currentInfo = new CallerInfo();
-
- // Store CNAP information retrieved from the Connection (we want to do this
- // here regardless of whether the number is empty or not).
- cit.currentInfo.cnapName = c.getCnapName();
- cit.currentInfo.name = cit.currentInfo.cnapName; // This can still get overwritten
- // by ContactInfo later
- cit.currentInfo.numberPresentation = c.getNumberPresentation();
- cit.currentInfo.namePresentation = c.getCnapNamePresentation();
-
- if (DBG) {
- log("startGetCallerInfo: number = " + number);
- log("startGetCallerInfo: CNAP Info from FW(1): name="
- + cit.currentInfo.cnapName
- + ", Name/Number Pres=" + cit.currentInfo.numberPresentation);
- }
-
- // handling case where number is null (caller id hidden) as well.
- if (!TextUtils.isEmpty(number)) {
- // Check for special CNAP cases and modify the CallerInfo accordingly
- // to be sure we keep the right information to display/log later
- number = modifyForSpecialCnapCases(context, cit.currentInfo, number,
- cit.currentInfo.numberPresentation);
-
- cit.currentInfo.phoneNumber = number;
- // For scenarios where we may receive a valid number from the network but a
- // restricted/unavailable presentation, we do not want to perform a contact query
- // (see note on isFinal above). So we set isFinal to true here as well.
- if (cit.currentInfo.numberPresentation != Connection.PRESENTATION_ALLOWED) {
- cit.isFinal = true;
- } else {
- cit.asyncQuery = CallerInfoAsyncQuery.startQuery(QUERY_TOKEN, context,
- number, sCallerInfoQueryListener, c);
- cit.asyncQuery.addQueryListener(QUERY_TOKEN, listener, cookie);
- cit.isFinal = false;
- }
- } else {
- // This is the case where we are querying on a number that
- // is null or empty, like a caller whose caller id is
- // blocked or empty (CLIR). The previous behaviour was to
- // throw a null CallerInfo object back to the user, but
- // this departure is somewhat cleaner.
- if (DBG) log("startGetCallerInfo: No query to start, send trivial reply.");
- cit.isFinal = true; // please see note on isFinal, above.
- }
-
- c.setUserData(cit);
-
- if (DBG) log("startGetCallerInfo: query based on number: " + number);
-
- } else if (userDataObject instanceof CallerInfoToken) {
- // query is running, just tack on this listener to the queue.
- cit = (CallerInfoToken) userDataObject;
-
- // handling case where number is null (caller id hidden) as well.
- if (cit.asyncQuery != null) {
- cit.asyncQuery.addQueryListener(QUERY_TOKEN, listener, cookie);
-
- if (DBG) log("startGetCallerInfo: query already running, adding listener: " +
- listener.getClass().toString());
- } else {
- // handling case where number/name gets updated later on by the network
- String updatedNumber = c.getAddress();
- if (DBG) log("startGetCallerInfo: updatedNumber initially = " + updatedNumber);
- if (!TextUtils.isEmpty(updatedNumber)) {
- // Store CNAP information retrieved from the Connection
- cit.currentInfo.cnapName = c.getCnapName();
- // This can still get overwritten by ContactInfo
- cit.currentInfo.name = cit.currentInfo.cnapName;
- cit.currentInfo.numberPresentation = c.getNumberPresentation();
- cit.currentInfo.namePresentation = c.getCnapNamePresentation();
-
- updatedNumber = modifyForSpecialCnapCases(context, cit.currentInfo,
- updatedNumber, cit.currentInfo.numberPresentation);
-
- cit.currentInfo.phoneNumber = updatedNumber;
- if (DBG) log("startGetCallerInfo: updatedNumber=" + updatedNumber);
- if (DBG) log("startGetCallerInfo: CNAP Info from FW(2): name="
- + cit.currentInfo.cnapName
- + ", Name/Number Pres=" + cit.currentInfo.numberPresentation);
- // For scenarios where we may receive a valid number from the network but a
- // restricted/unavailable presentation, we do not want to perform a contact query
- // (see note on isFinal above). So we set isFinal to true here as well.
- if (cit.currentInfo.numberPresentation != Connection.PRESENTATION_ALLOWED) {
- cit.isFinal = true;
- } else {
- cit.asyncQuery = CallerInfoAsyncQuery.startQuery(QUERY_TOKEN, context,
- updatedNumber, sCallerInfoQueryListener, c);
- cit.asyncQuery.addQueryListener(QUERY_TOKEN, listener, cookie);
- cit.isFinal = false;
- }
- } else {
- if (DBG) log("startGetCallerInfo: No query to attach to, send trivial reply.");
- if (cit.currentInfo == null) {
- cit.currentInfo = new CallerInfo();
- }
- // Store CNAP information retrieved from the Connection
- cit.currentInfo.cnapName = c.getCnapName(); // This can still get
- // overwritten by ContactInfo
- cit.currentInfo.name = cit.currentInfo.cnapName;
- cit.currentInfo.numberPresentation = c.getNumberPresentation();
- cit.currentInfo.namePresentation = c.getCnapNamePresentation();
-
- if (DBG) log("startGetCallerInfo: CNAP Info from FW(3): name="
- + cit.currentInfo.cnapName
- + ", Name/Number Pres=" + cit.currentInfo.numberPresentation);
- cit.isFinal = true; // please see note on isFinal, above.
- }
- }
- } else {
- cit = new CallerInfoToken();
- cit.currentInfo = (CallerInfo) userDataObject;
- cit.asyncQuery = null;
- cit.isFinal = true;
- // since the query is already done, call the listener.
- if (DBG) log("startGetCallerInfo: query already done, returning CallerInfo");
- }
- return cit;
- }
-
- /**
- * Implemented for CallerInfo.OnCallerInfoQueryCompleteListener interface.
- * Updates the connection's userData when called.
- */
- private static final int QUERY_TOKEN = -1;
- static CallerInfoAsyncQuery.OnQueryCompleteListener sCallerInfoQueryListener =
- new CallerInfoAsyncQuery.OnQueryCompleteListener () {
- public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
- if (DBG) log("query complete, updating connection.userdata");
- Connection conn = (Connection) cookie;
-
- // Added a check if CallerInfo is coming from ContactInfo or from Connection.
- // If no ContactInfo, then we want to use CNAP information coming from network
- if (DBG) log("- onQueryComplete: CallerInfo:" + ci);
- if (ci.contactExists || ci.isEmergencyNumber() || ci.isVoiceMailNumber()) {
- // If the number presentation has not been set by
- // the ContactInfo, use the one from the
- // connection.
-
- // TODO: Need a new util method to merge the info
- // from the Connection in a CallerInfo object.
- // Here 'ci' is a new CallerInfo instance read
- // from the DB. It has lost all the connection
- // info preset before the query (see PhoneUtils
- // line 1334). We should have a method to merge
- // back into this new instance the info from the
- // connection object not set by the DB. If the
- // Connection already has a CallerInfo instance in
- // userData, then we could use this instance to
- // fill 'ci' in. The same routine could be used in
- // PhoneUtils.
- if (0 == ci.numberPresentation) {
- ci.numberPresentation = conn.getNumberPresentation();
- }
- } else {
- CallerInfo newCi = getCallerInfo(null, conn);
- if (newCi != null) {
- newCi.phoneNumber = ci.phoneNumber; // To get formatted phone number
- ci = newCi;
- }
- }
- conn.setUserData(ci);
- }
- };
-
-
- /**
- * Returns a single "name" for the specified given a CallerInfo object.
- * If the name is null, return defaultString as the default value, usually
- * context.getString(R.string.unknown).
- */
- static String getCompactNameFromCallerInfo(CallerInfo ci, Context context) {
- if (DBG) log("getCompactNameFromCallerInfo: info = " + ci);
-
- String compactName = null;
- if (ci != null) {
- if (TextUtils.isEmpty(ci.name)) {
- // Perform any modifications for special CNAP cases to
- // the phone number being displayed, if applicable.
- compactName = modifyForSpecialCnapCases(context, ci, ci.phoneNumber,
- ci.numberPresentation);
- } else {
- // Don't call modifyForSpecialCnapCases on regular name. See b/2160795.
- compactName = ci.name;
- }
- }
-
- if ((compactName == null) || (TextUtils.isEmpty(compactName))) {
- // If we're still null/empty here, then check if we have a presentation
- // string that takes precedence that we could return, otherwise display
- // "unknown" string.
- if (ci != null && ci.numberPresentation == Connection.PRESENTATION_RESTRICTED) {
- compactName = context.getString(R.string.private_num);
- } else if (ci != null && ci.numberPresentation == Connection.PRESENTATION_PAYPHONE) {
- compactName = context.getString(R.string.payphone);
- } else {
- compactName = context.getString(R.string.unknown);
- }
- }
- if (DBG) log("getCompactNameFromCallerInfo: compactName=" + compactName);
- return compactName;
- }
-
- /**
- * Returns true if the specified Call is a "conference call", meaning
- * that it owns more than one Connection object. This information is
- * used to trigger certain UI changes that appear when a conference
- * call is active (like displaying the label "Conference call", and
- * enabling the "Manage conference" UI.)
- *
- * Watch out: This method simply checks the number of Connections,
- * *not* their states. So if a Call has (for example) one ACTIVE
- * connection and one DISCONNECTED connection, this method will return
- * true (which is unintuitive, since the Call isn't *really* a
- * conference call any more.)
- *
- * @return true if the specified call has more than one connection (in any state.)
- */
- static boolean isConferenceCall(Call call) {
- // CDMA phones don't have the same concept of "conference call" as
- // GSM phones do; there's no special "conference call" state of
- // the UI or a "manage conference" function. (Instead, when
- // you're in a 3-way call, all we can do is display the "generic"
- // state of the UI.) So as far as the in-call UI is concerned,
- // Conference corresponds to generic display.
- PhoneApp app = PhoneApp.getInstance();
- int phoneType = app.phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- CdmaPhoneCallState.PhoneCallState state = app.cdmaPhoneCallState.getCurrentCallState();
- if ((state == CdmaPhoneCallState.PhoneCallState.CONF_CALL)
- || ((state == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE)
- && !app.cdmaPhoneCallState.IsThreeWayCallOrigStateDialing())) {
- return true;
- }
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- List<Connection> connections = call.getConnections();
- if (connections != null && connections.size() > 1) {
- return true;
- }
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- return false;
-
- // TODO: We may still want to change the semantics of this method
- // to say that a given call is only really a conference call if
- // the number of ACTIVE connections, not the total number of
- // connections, is greater than one. (See warning comment in the
- // javadoc above.)
- // Here's an implementation of that:
- // if (connections == null) {
- // return false;
- // }
- // int numActiveConnections = 0;
- // for (Connection conn : connections) {
- // if (DBG) log(" - CONN: " + conn + ", state = " + conn.getState());
- // if (conn.getState() == Call.State.ACTIVE) numActiveConnections++;
- // if (numActiveConnections > 1) {
- // return true;
- // }
- // }
- // return false;
- }
-
- /**
- * Launch the Dialer to start a new call.
- * This is just a wrapper around the ACTION_DIAL intent.
- */
- static void startNewCall(final Phone phone) {
- // Sanity-check that this is OK given the current state of the phone.
- if (!okToAddCall(phone)) {
- Log.w(LOG_TAG, "startNewCall: can't add a new call in the current state");
- dumpCallState(phone);
- return;
- }
-
- // if applicable, mute the call while we're showing the add call UI.
- if (!phone.getForegroundCall().isIdle()) {
- setMuteInternal(phone, true);
- // Inform the phone app that this mute state was NOT done
- // voluntarily by the User.
- PhoneApp.getInstance().setRestoreMuteOnInCallResume(true);
- }
-
- 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);
-
- PhoneApp.getInstance().startActivity(intent);
- }
-
- /**
- * Brings up the UI used to handle an incoming call.
- *
- * Originally, this brought up an IncomingCallPanel instance
- * (which was a subclass of Dialog) on top of whatever app
- * was currently running. Now, we take you directly to the
- * in-call screen, whose CallCard automatically does the right
- * thing if there's a Call that's currently ringing.
- */
- static void showIncomingCallUi() {
- if (DBG) log("showIncomingCallUi()...");
- PhoneApp app = PhoneApp.getInstance();
-
- // Before bringing up the "incoming call" UI, force any system
- // dialogs (like "recent tasks" or the power dialog) to close first.
- try {
- ActivityManagerNative.getDefault().closeSystemDialogs("call");
- } catch (RemoteException e) {
- }
-
- // Go directly to the in-call screen.
- // (No need to do anything special if we're already on the in-call
- // screen; it'll notice the phone state change and update itself.)
-
- // But first, grab a full wake lock. We do this here, before we
- // even fire off the InCallScreen intent, to make sure the
- // ActivityManager doesn't try to pause the InCallScreen as soon
- // as it comes up. (See bug 1648751.)
- //
- // And since the InCallScreen isn't visible yet (we haven't even
- // fired off the intent yet), we DON'T want the screen to actually
- // come on right now. So *before* acquiring the wake lock we need
- // to call preventScreenOn(), which tells the PowerManager that
- // the screen should stay off even if someone's holding a full
- // wake lock. (This prevents any flicker during the "incoming
- // call" sequence. The corresponding preventScreenOn(false) call
- // will come from the InCallScreen when it's finally ready to be
- // displayed.)
- //
- // TODO: this is all a temporary workaround. The real fix is to add
- // an Activity attribute saying "this Activity wants to wake up the
- // phone when it's displayed"; that way the ActivityManager could
- // manage the wake locks *and* arrange for the screen to come on at
- // the exact moment that the InCallScreen is ready to be displayed.
- // (See bug 1648751.)
- app.preventScreenOn(true);
- app.requestWakeState(PhoneApp.WakeState.FULL);
-
- // Fire off the InCallScreen intent.
- app.displayCallScreen();
- }
-
- static void turnOnSpeaker(Context context, boolean flag, boolean store) {
- if (DBG) log("turnOnSpeaker(flag=" + flag + ", store=" + store + ")...");
- AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-
- audioManager.setSpeakerphoneOn(flag);
- // record the speaker-enable value
- if (store) {
- sIsSpeakerEnabled = flag;
- }
- if (flag) {
- NotificationMgr.getDefault().notifySpeakerphone();
- } else {
- NotificationMgr.getDefault().cancelSpeakerphone();
- }
-
- // We also need to make a fresh call to PhoneApp.updateWakeState()
- // any time the speaker state changes, since the screen timeout is
- // sometimes different depending on whether or not the speaker is
- // in use.
- PhoneApp app = PhoneApp.getInstance();
- app.updateWakeState();
-
- // Update the Proximity sensor based on speaker state
- app.updateProximitySensorMode(app.phone.getState());
- }
-
- /**
- * Restore the speaker mode, called after a wired headset disconnect
- * event.
- */
- static void restoreSpeakerMode(Context context) {
- if (DBG) log("restoreSpeakerMode, restoring to: " + sIsSpeakerEnabled);
-
- // change the mode if needed.
- if (isSpeakerOn(context) != sIsSpeakerEnabled) {
- turnOnSpeaker(context, sIsSpeakerEnabled, false);
- }
- }
-
- static boolean isSpeakerOn(Context context) {
- AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
- return audioManager.isSpeakerphoneOn();
- }
-
-
- static void turnOnNoiseSuppression(Context context, boolean flag, boolean store) {
- if (DBG) log("turnOnNoiseSuppression: " + flag);
- AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-
- if (!context.getResources().getBoolean(R.bool.has_in_call_noise_suppression)) {
- return;
- }
-
- if (flag) {
- audioManager.setParameters("noise_suppression=auto");
- } else {
- audioManager.setParameters("noise_suppression=off");
- }
-
- // record the speaker-enable value
- if (store) {
- sIsNoiseSuppressionEnabled = flag;
- }
-
- // TODO: implement and manage ICON
-
- }
-
- static void restoreNoiseSuppression(Context context) {
- if (DBG) log("restoreNoiseSuppression, restoring to: " + sIsNoiseSuppressionEnabled);
-
- if (!context.getResources().getBoolean(R.bool.has_in_call_noise_suppression)) {
- return;
- }
-
- // change the mode if needed.
- if (isNoiseSuppressionOn(context) != sIsNoiseSuppressionEnabled) {
- turnOnNoiseSuppression(context, sIsNoiseSuppressionEnabled, false);
- }
- }
-
- static boolean isNoiseSuppressionOn(Context context) {
-
- if (!context.getResources().getBoolean(R.bool.has_in_call_noise_suppression)) {
- return false;
- }
-
- AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
- String noiseSuppression = audioManager.getParameters("noise_suppression");
- if (DBG) log("isNoiseSuppressionOn: " + noiseSuppression);
- if (noiseSuppression.contains("off")) {
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * Wrapper around Phone.setMute() that also updates the mute icon in
- * the status bar.
- *
- * All muting / unmuting from the in-call UI should go through this
- * wrapper.
- */
- static void setMute(Phone phone, boolean muted) {
- // make the call to mute the audio
- setMuteInternal(phone, muted);
-
- // update the foreground connections to match. This includes
- // all the connections on conference calls.
- for (Connection cn : phone.getForegroundCall().getConnections()) {
- if (sConnectionMuteTable.get(cn) == null) {
- if (DBG) log("problem retrieving mute value for this connection.");
- }
- sConnectionMuteTable.put(cn, Boolean.valueOf(muted));
- }
- }
-
- /**
- * Internally used muting function. All UI calls should use {@link setMute}
- */
- static void setMuteInternal(Phone phone, boolean muted) {
- if (DBG) log("setMute: " + muted);
- Context context = phone.getContext();
- boolean routeToAudioManager =
- context.getResources().getBoolean(R.bool.send_mic_mute_to_AudioManager);
- if (routeToAudioManager) {
- AudioManager audioManager =
- (AudioManager) phone.getContext().getSystemService(Context.AUDIO_SERVICE);
- if (DBG) log(" setMicrophoneMute: " + muted);
- audioManager.setMicrophoneMute(muted);
- } else {
- phone.setMute(muted);
- }
- if (muted) {
- NotificationMgr.getDefault().notifyMute();
- } else {
- NotificationMgr.getDefault().cancelMute();
- }
- }
-
- static boolean getMute(Phone phone) {
- Context context = phone.getContext();
- boolean routeToAudioManager =
- context.getResources().getBoolean(R.bool.send_mic_mute_to_AudioManager);
- if (routeToAudioManager) {
- AudioManager audioManager =
- (AudioManager) phone.getContext().getSystemService(Context.AUDIO_SERVICE);
- return audioManager.isMicrophoneMute();
- } else {
- return phone.getMute();
- }
- }
-
- /**
- * A really simple wrapper around AudioManager.setMode(),
- * with a bit of extra logging to help debug the exact
- * timing (and call stacks) for all our setMode() calls.
- *
- * Also, add additional state monitoring to determine
- * whether or not certain calls to change the audio mode
- * are ignored.
- */
- /* package */ static void setAudioMode(Context context, int mode) {
- if (DBG) Log.d(LOG_TAG, "setAudioMode(" + audioModeToString(mode) + ")...");
-
- //decide whether or not to ignore the audio setting
- boolean ignore = false;
-
- switch (sAudioBehaviourState) {
- case AUDIO_RINGING:
- ignore = ((mode == AudioManager.MODE_NORMAL) || (mode == AudioManager.MODE_IN_CALL));
- break;
- case AUDIO_OFFHOOK:
- ignore = ((mode == AudioManager.MODE_NORMAL) || (mode == AudioManager.MODE_RINGTONE));
- break;
- case AUDIO_IDLE:
- default:
- ignore = (mode == AudioManager.MODE_IN_CALL);
- break;
- }
-
- if (!ignore) {
- AudioManager audioManager =
- (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
- // Enable stack dump only when actively debugging ("new Throwable()" is expensive!)
- if (DBG_SETAUDIOMODE_STACK) Log.d(LOG_TAG, "Stack:", new Throwable("stack dump"));
- audioManager.setMode(mode);
- } else {
- if (DBG) Log.d(LOG_TAG, "setAudioMode(), state is " + sAudioBehaviourState +
- " ignoring " + audioModeToString(mode) + " request");
- }
- }
- private static String audioModeToString(int mode) {
- switch (mode) {
- case AudioManager.MODE_INVALID: return "MODE_INVALID";
- case AudioManager.MODE_CURRENT: return "MODE_CURRENT";
- case AudioManager.MODE_NORMAL: return "MODE_NORMAL";
- case AudioManager.MODE_RINGTONE: return "MODE_RINGTONE";
- case AudioManager.MODE_IN_CALL: return "MODE_IN_CALL";
- default: return String.valueOf(mode);
- }
- }
-
- /**
- * Handles the wired headset button while in-call.
- *
- * This is called from the PhoneApp, not from the InCallScreen,
- * since the HEADSETHOOK button means "mute or unmute the current
- * call" *any* time a call is active, even if the user isn't actually
- * on the in-call screen.
- *
- * @return true if we consumed the event.
- */
- /* package */ static boolean handleHeadsetHook(Phone phone, KeyEvent event) {
- if (DBG) log("handleHeadsetHook()..." + event.getAction() + " " + event.getRepeatCount());
-
- // If the phone is totally idle, we ignore HEADSETHOOK events
- // (and instead let them fall through to the media player.)
- if (phone.getState() == Phone.State.IDLE) {
- return false;
- }
-
- // Ok, the phone is in use.
- // The headset button button means "Answer" if an incoming call is
- // ringing. If not, it toggles the mute / unmute state.
- //
- // And in any case we *always* consume this event; this means
- // that the usual mediaplayer-related behavior of the headset
- // button will NEVER happen while the user is on a call.
-
- final boolean hasRingingCall = !phone.getRingingCall().isIdle();
- final boolean hasActiveCall = !phone.getForegroundCall().isIdle();
- final boolean hasHoldingCall = !phone.getBackgroundCall().isIdle();
-
- if (hasRingingCall &&
- event.getRepeatCount() == 0 &&
- event.getAction() == KeyEvent.ACTION_UP) {
- // If an incoming call is ringing, answer it (just like with the
- // CALL button):
- int phoneType = phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- answerCall(phone);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- if (hasActiveCall && hasHoldingCall) {
- if (DBG) log("handleHeadsetHook: ringing (both lines in use) ==> answer!");
- answerAndEndActive(phone);
- } else {
- if (DBG) log("handleHeadsetHook: ringing ==> answer!");
- answerCall(phone); // Automatically holds the current active call,
- // if there is one
- }
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- } else {
- // No incoming ringing call.
- if (event.isLongPress()) {
- if (DBG) log("handleHeadsetHook: longpress -> hangup");
- hangup(phone);
- }
- else if (event.getAction() == KeyEvent.ACTION_UP &&
- event.getRepeatCount() == 0) {
- Connection c = phone.getForegroundCall().getLatestConnection();
- // If it is NOT an emg #, toggle the mute state. Otherwise, ignore the hook.
- if (c != null && !PhoneNumberUtils.isEmergencyNumber(c.getAddress())) {
- if (getMute(phone)) {
- if (DBG) log("handleHeadsetHook: UNmuting...");
- setMute(phone, false);
- } else {
- if (DBG) log("handleHeadsetHook: muting...");
- setMute(phone, true);
- }
- }
- }
- }
-
- // Even if the InCallScreen is the current activity, there's no
- // need to force it to update, because (1) if we answered a
- // ringing call, the InCallScreen will imminently get a phone
- // state change event (causing an update), and (2) if we muted or
- // unmuted, the setMute() call automagically updates the status
- // bar, and there's no "mute" indication in the InCallScreen
- // itself (other than the menu item, which only ever stays
- // onscreen for a second anyway.)
- // TODO: (2) isn't entirely true anymore. Once we return our result
- // to the PhoneApp, we ask InCallScreen to update its control widgets
- // in case we changed mute or speaker state and phones with touch-
- // screen [toggle] buttons need to update themselves.
-
- return true;
- }
-
- /**
- * Look for ANY connections on the phone that qualify as being
- * disconnected.
- *
- * @return true if we find a connection that is disconnected over
- * all the phone's call objects.
- */
- /* package */ static boolean hasDisconnectedConnections(Phone phone) {
- return hasDisconnectedConnections(phone.getForegroundCall()) ||
- hasDisconnectedConnections(phone.getBackgroundCall()) ||
- hasDisconnectedConnections(phone.getRingingCall());
- }
-
- /**
- * Iterate over all connections in a call to see if there are any
- * that are not alive (disconnected or idle).
- *
- * @return true if we find a connection that is disconnected, and
- * pending removal via
- * {@link com.android.internal.telephony.gsm.GsmCall#clearDisconnected()}.
- */
- private static final boolean hasDisconnectedConnections(Call call) {
- // look through all connections for non-active ones.
- for (Connection c : call.getConnections()) {
- if (!c.isAlive()) {
- return true;
- }
- }
- return false;
- }
-
- //
- // Misc UI policy helper functions
- //
-
- /**
- * @return true if we're allowed to swap calls, given the current
- * state of the Phone.
- */
- /* package */ static boolean okToSwapCalls(Phone phone) {
- int phoneType = phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // CDMA: "Swap" is enabled only when the phone reaches a *generic*.
- // state by either accepting a Call Waiting or by merging two calls
- PhoneApp app = PhoneApp.getInstance();
- return (app.cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.CONF_CALL);
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- // GSM: "Swap" is available if both lines are in use and there's no
- // incoming call. (Actually we need to verify that the active
- // call really is in the ACTIVE state and the holding call really
- // is in the HOLDING state, since you *can't* actually swap calls
- // when the foreground call is DIALING or ALERTING.)
- return phone.getRingingCall().isIdle()
- && (phone.getForegroundCall().getState() == Call.State.ACTIVE)
- && (phone.getBackgroundCall().getState() == Call.State.HOLDING);
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
-
- /**
- * @return true if we're allowed to merge calls, given the current
- * state of the Phone.
- */
- /* package */ static boolean okToMergeCalls(Phone phone) {
- int phoneType = phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // CDMA: "Merge" is enabled only when the user is in a 3Way call.
- PhoneApp app = PhoneApp.getInstance();
- return ((app.cdmaPhoneCallState.getCurrentCallState()
- == CdmaPhoneCallState.PhoneCallState.THRWAY_ACTIVE)
- && !app.cdmaPhoneCallState.IsThreeWayCallOrigStateDialing());
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- // GSM: "Merge" is available if both lines are in use and there's no
- // incoming call, *and* the current conference isn't already
- // "full".
- return phone.getRingingCall().isIdle() && phone.canConference();
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
-
- /**
- * @return true if the UI should let you add a new call, given the current
- * state of the Phone.
- */
- /* package */ static boolean okToAddCall(Phone phone) {
- int phoneType = phone.getPhoneType();
- final Call.State fgCallState = phone.getForegroundCall().getState();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- // CDMA: "Add call" menu item is only enabled when the call is in
- // - ForegroundCall is in ACTIVE state
- // - After 30 seconds of user Ignoring/Missing a Call Waiting call.
- PhoneApp app = PhoneApp.getInstance();
- return ((fgCallState == Call.State.ACTIVE)
- && (app.cdmaPhoneCallState.getAddCallMenuStateAfterCallWaiting()));
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- // GSM: "Add call" is available only if ALL of the following are true:
- // - There's no incoming ringing call
- // - There's < 2 lines in use
- // - The foreground call is ACTIVE or IDLE or DISCONNECTED.
- // (We mainly need to make sure it *isn't* DIALING or ALERTING.)
- final boolean hasRingingCall = !phone.getRingingCall().isIdle();
- final boolean hasActiveCall = !phone.getForegroundCall().isIdle();
- final boolean hasHoldingCall = !phone.getBackgroundCall().isIdle();
- final boolean allLinesTaken = hasActiveCall && hasHoldingCall;
-
- return !hasRingingCall
- && !allLinesTaken
- && ((fgCallState == Call.State.ACTIVE)
- || (fgCallState == Call.State.IDLE)
- || (fgCallState == Call.State.DISCONNECTED));
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
-
- /**
- * Based on the input CNAP number string,
- * @return _RESTRICTED or _UNKNOWN for all the special CNAP strings.
- * Otherwise, return CNAP_SPECIAL_CASE_NO.
- */
- private static int checkCnapSpecialCases(String n) {
- if (n.equals("PRIVATE") ||
- n.equals("P") ||
- n.equals("RES")) {
- if (DBG) log("checkCnapSpecialCases, PRIVATE string: " + n);
- return Connection.PRESENTATION_RESTRICTED;
- } else if (n.equals("UNAVAILABLE") ||
- n.equals("UNKNOWN") ||
- n.equals("UNA") ||
- n.equals("U")) {
- if (DBG) log("checkCnapSpecialCases, UNKNOWN string: " + n);
- return Connection.PRESENTATION_UNKNOWN;
- } else {
- if (DBG) log("checkCnapSpecialCases, normal str. number: " + n);
- return CNAP_SPECIAL_CASE_NO;
- }
- }
-
- /**
- * 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;
-
- if (DBG) log("modifyForSpecialCnapCases: initially, number=" + 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.
- if (number.equals(context.getString(R.string.absent_num))
- && presentation == Connection.PRESENTATION_ALLOWED) {
- number = context.getString(R.string.unknown);
- ci.numberPresentation = Connection.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 == Connection.PRESENTATION_ALLOWED
- || (ci.numberPresentation != presentation
- && presentation == Connection.PRESENTATION_ALLOWED)) {
- int cnapSpecialCase = checkCnapSpecialCases(number);
- if (cnapSpecialCase != CNAP_SPECIAL_CASE_NO) {
- // For all special strings, change number & numberPresentation.
- if (cnapSpecialCase == Connection.PRESENTATION_RESTRICTED) {
- number = context.getString(R.string.private_num);
- } else if (cnapSpecialCase == Connection.PRESENTATION_UNKNOWN) {
- number = context.getString(R.string.unknown);
- }
- if (DBG) log("SpecialCnap: number=" + number
- + "; presentation now=" + cnapSpecialCase);
- ci.numberPresentation = cnapSpecialCase;
- }
- }
- if (DBG) log("modifyForSpecialCnapCases: returning number string=" + number);
- return number;
- }
-
- //
- // Support for 3rd party phone service providers.
- //
-
- /**
- * Check if all the provider's info is present in the intent.
- * @param intent Expected to have the provider's extra.
- * @return true if the intent has all the extras to build the
- * in-call screen's provider info overlay.
- */
- /* package */ static boolean hasPhoneProviderExtras(Intent intent) {
- if (null == intent) {
- return false;
- }
- final String name = intent.getStringExtra(InCallScreen.EXTRA_GATEWAY_PROVIDER_PACKAGE);
- final String gatewayUri = intent.getStringExtra(InCallScreen.EXTRA_GATEWAY_URI);
-
- return !TextUtils.isEmpty(name) && !TextUtils.isEmpty(gatewayUri);
- }
-
- /**
- * Copy all the expected extras set when a 3rd party provider is
- * used from the source intent to the destination one. Checks all
- * the required extras are present, if any is missing, none will
- * be copied.
- * @param src Intent which may contain the provider's extras.
- * @param dst Intent where a copy of the extras will be added if applicable.
- */
- /* package */ static void checkAndCopyPhoneProviderExtras(Intent src, Intent dst) {
- if (!hasPhoneProviderExtras(src)) {
- Log.d(LOG_TAG, "checkAndCopyPhoneProviderExtras: some or all extras are missing.");
- return;
- }
-
- dst.putExtra(InCallScreen.EXTRA_GATEWAY_PROVIDER_PACKAGE,
- src.getStringExtra(InCallScreen.EXTRA_GATEWAY_PROVIDER_PACKAGE));
- dst.putExtra(InCallScreen.EXTRA_GATEWAY_URI,
- src.getStringExtra(InCallScreen.EXTRA_GATEWAY_URI));
- }
-
- /**
- * Get the provider's label from the intent.
- * @param context to lookup the provider's package name.
- * @param intent with an extra set to the provider's package name.
- * @return The provider's application label. null if an error
- * occurred during the lookup of the package name or the label.
- */
- /* package */ static CharSequence getProviderLabel(Context context, Intent intent) {
- String packageName = intent.getStringExtra(InCallScreen.EXTRA_GATEWAY_PROVIDER_PACKAGE);
- PackageManager pm = context.getPackageManager();
-
- try {
- ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
-
- return pm.getApplicationLabel(info);
- } catch (PackageManager.NameNotFoundException e) {
- return null;
- }
- }
-
- /**
- * Get the provider's icon.
- * @param context to lookup the provider's icon.
- * @param intent with an extra set to the provider's package name.
- * @return The provider's application icon. null if an error occured during the icon lookup.
- */
- /* package */ static Drawable getProviderIcon(Context context, Intent intent) {
- String packageName = intent.getStringExtra(InCallScreen.EXTRA_GATEWAY_PROVIDER_PACKAGE);
- PackageManager pm = context.getPackageManager();
-
- try {
- return pm.getApplicationIcon(packageName);
- } catch (PackageManager.NameNotFoundException e) {
- return null;
- }
- }
-
- /**
- * Return the gateway uri from the intent.
- * @param intent With the gateway uri extra.
- * @return The gateway URI or null if not found.
- */
- /* package */ static Uri getProviderGatewayUri(Intent intent) {
- String uri = intent.getStringExtra(InCallScreen.EXTRA_GATEWAY_URI);
- return TextUtils.isEmpty(uri) ? null : Uri.parse(uri);
- }
-
- /**
- * Return a formatted version of the uri's scheme specific
- * part. E.g for 'tel:12345678', return '1-234-5678'.
- * @param uri A 'tel:' URI with the gateway phone number.
- * @return the provider's address (from the gateway uri) formatted
- * for user display. null if uri was null or its scheme was not 'tel:'.
- */
- /* package */ static String formatProviderUri(Uri uri) {
- if (null != uri) {
- if ("tel".equals(uri.getScheme())) {
- return PhoneNumberUtils.formatNumber(uri.getSchemeSpecificPart());
- } else {
- return uri.toString();
- }
- }
- return null;
- }
-
- /**
- * Check if a phone number can be route through a 3rd party
- * gateway. The number must be a global phone number in numerical
- * form (1-800-666-SEXY won't work).
- *
- * MMI codes and the like cannot be used as a dial number for the
- * gateway either.
- *
- * @param number To be dialed via a 3rd party gateway.
- * @return true If the number can be routed through the 3rd party network.
- */
- /* package */ static boolean isRoutableViaGateway(String number) {
- if (TextUtils.isEmpty(number)) {
- return false;
- }
- number = PhoneNumberUtils.stripSeparators(number);
- if (!number.equals(PhoneNumberUtils.convertKeypadLettersToDigits(number))) {
- return false;
- }
- number = PhoneNumberUtils.extractNetworkPortion(number);
- return PhoneNumberUtils.isGlobalPhoneNumber(number);
- }
-
- /**
- * This function is called when phone answers or places a call.
- * Check if the phone is in a car dock or desk dock.
- * If yes, turn on the speaker, when no wired or BT headsets are connected.
- * Otherwise do nothing.
- */
- private static void activateSpeakerIfDocked(Phone phone) {
- if (DBG) log("activateSpeakerIfDocked()...");
-
- if (PhoneApp.mDockState == Intent.EXTRA_DOCK_STATE_DESK ||
- PhoneApp.mDockState == Intent.EXTRA_DOCK_STATE_CAR) {
- if (DBG) log("activateSpeakerIfDocked(): Phone in a dock -> may need to turn on speaker.");
- PhoneApp app = PhoneApp.getInstance();
- BluetoothHandsfree bthf = app.getBluetoothHandsfree();
-
- if (!app.isHeadsetPlugged() && !(bthf != null && bthf.isAudioOn())) {
- turnOnSpeaker(phone.getContext(), true, true);
- }
- }
- }
-
-
- /**
- * Returns whether the phone is in ECM ("Emergency Callback Mode") or not.
- * (For non-CDMA phones, this will always return false.
- * For CDMA Phones, return true iff PROPERTY_INECM_MODE == "true".)
- */
- /* package */ static boolean isPhoneInEcm(Phone phone) {
- boolean phoneInEcm = false;
- if ((phone != null) && (phone.getPhoneType() == Phone.PHONE_TYPE_CDMA)) {
- String ecmMode =
- SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE);
- if (ecmMode != null) {
- phoneInEcm = ecmMode.equals("true");
- }
- }
- return phoneInEcm;
- }
-
-
- //
- // General phone and call state debugging/testing code
- //
-
- /* package */ static void dumpCallState(Phone phone) {
- PhoneApp app = PhoneApp.getInstance();
- Log.d(LOG_TAG, "dumpCallState():");
- Log.d(LOG_TAG, "- Phone: " + phone + ", name = " + phone.getPhoneName()
- + ", state = " + phone.getState());
-
- StringBuilder b = new StringBuilder(128);
-
- Call call = phone.getForegroundCall();
- b.setLength(0);
- b.append(" - FG call: ").append(call.getState());
- b.append(" isAlive ").append(call.getState().isAlive());
- b.append(" isRinging ").append(call.getState().isRinging());
- b.append(" isDialing ").append(call.getState().isDialing());
- b.append(" isIdle ").append(call.isIdle());
- b.append(" hasConnections ").append(call.hasConnections());
- Log.d(LOG_TAG, b.toString());
-
- call = phone.getBackgroundCall();
- b.setLength(0);
- b.append(" - BG call: ").append(call.getState());
- b.append(" isAlive ").append(call.getState().isAlive());
- b.append(" isRinging ").append(call.getState().isRinging());
- b.append(" isDialing ").append(call.getState().isDialing());
- b.append(" isIdle ").append(call.isIdle());
- b.append(" hasConnections ").append(call.hasConnections());
- Log.d(LOG_TAG, b.toString());
-
- call = phone.getRingingCall();
- b.setLength(0);
- b.append(" - RINGING call: ").append(call.getState());
- b.append(" isAlive ").append(call.getState().isAlive());
- b.append(" isRinging ").append(call.getState().isRinging());
- b.append(" isDialing ").append(call.getState().isDialing());
- b.append(" isIdle ").append(call.isIdle());
- b.append(" hasConnections ").append(call.hasConnections());
- Log.d(LOG_TAG, b.toString());
-
-
- final boolean hasRingingCall = !phone.getRingingCall().isIdle();
- final boolean hasActiveCall = !phone.getForegroundCall().isIdle();
- final boolean hasHoldingCall = !phone.getBackgroundCall().isIdle();
- final boolean allLinesTaken = hasActiveCall && hasHoldingCall;
- b.setLength(0);
- b.append(" - hasRingingCall ").append(hasRingingCall);
- b.append(" hasActiveCall ").append(hasActiveCall);
- b.append(" hasHoldingCall ").append(hasHoldingCall);
- b.append(" allLinesTaken ").append(allLinesTaken);
- Log.d(LOG_TAG, b.toString());
-
- // On CDMA phones, dump out the CdmaPhoneCallState too:
- if (phone.getPhoneType() == Phone.PHONE_TYPE_CDMA) {
- if (app.cdmaPhoneCallState != null) {
- Log.d(LOG_TAG, " - CDMA call state: "
- + app.cdmaPhoneCallState.getCurrentCallState());
- } else {
- Log.d(LOG_TAG, " - CDMA device, but null cdmaPhoneCallState!");
- }
- }
-
- // Watch out: the isRinging() call below does NOT tell us anything
- // about the state of the telephony layer; it merely tells us whether
- // the Ringer manager is currently playing the ringtone.
- boolean ringing = app.getRinger().isRinging();
- Log.d(LOG_TAG, " - Ringer state: " + ringing);
- }
-
- private static void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/ProcessOutgoingCallTest.java b/phone/src/com/android/phone2/ProcessOutgoingCallTest.java
deleted file mode 100644
index 477ae26..0000000
--- a/phone/src/com/android/phone2/ProcessOutgoingCallTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.SearchManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.util.Config;
-import android.util.Log;
-
-/**
- * ProcessOutgoingCallTest tests {@link OutgoingCallBroadcaster} by performing
- * a couple of simple modifications to outgoing calls, and by printing log
- * messages for each call.
- */
-public class ProcessOutgoingCallTest extends BroadcastReceiver {
- private static final String TAG = "ProcessOutgoingCallTest";
- private static final String AREACODE = "617";
-
- private static final boolean LOGV = Config.LOGV;
-
- private static final boolean REDIRECT_411_TO_GOOG411 = true;
- private static final boolean SEVEN_DIGIT_DIALING = true;
- private static final boolean POUND_POUND_SEARCH = true;
- private static final boolean BLOCK_555 = true;
-
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
- String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
- if (LOGV) Log.v(TAG, "Received intent " + intent + " (number = " + number + ".");
- /* Example of how to redirect calls from one number to another. */
- if (REDIRECT_411_TO_GOOG411 && number.equals("411")) {
- setResultData("18004664411");
- }
-
- /* Example of how to modify the phone number in flight. */
- if (SEVEN_DIGIT_DIALING && number.length() == 7) {
- setResultData(AREACODE + number);
- }
-
- /* Example of how to route a call to another Application. */
- if (POUND_POUND_SEARCH && number.startsWith("##")) {
- Intent newIntent = new Intent(Intent.ACTION_SEARCH);
- newIntent.putExtra(SearchManager.QUERY, number.substring(2));
- newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(newIntent);
- setResultData(null);
- }
-
- /* Example of how to deny calls to a particular number.
- * Note that no UI is displayed to the user -- the call simply
- * does not happen. It is the application's responaibility to
- * explain this to the user. */
- int length = number.length();
- if (BLOCK_555 && length >= 7) {
- String exchange = number.substring(length - 7, length - 4);
- Log.v(TAG, "exchange = " + exchange);
- if (exchange.equals("555")) {
- setResultData(null);
- }
- }
- }
- }
-}
diff --git a/phone/src/com/android/phone2/Profiler.java b/phone/src/com/android/phone2/Profiler.java
deleted file mode 100644
index c0d2269..0000000
--- a/phone/src/com/android/phone2/Profiler.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * 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.phone2;
-
-import android.os.SystemClock;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewParent;
-import android.view.Window;
-
-/**
- * Profiling utilities for the Phone app.
- */
-public class Profiler {
- private static final String LOG_TAG = PhoneApp.LOG_TAG;
-
- // Let the compiler optimize all this code out unless we're actively
- // doing profiling runs.
- // TODO: Instead of doing all these "if (PROFILE)" checks here, every
- // place that *calls* any of these methods should check the value of
- // Profiler.PROFILE first, so the method calls will get optimized out
- // too.
- private static final boolean PROFILE = false;
-
- static long sTimeCallScreenRequested;
- static long sTimeCallScreenOnCreate;
- static long sTimeCallScreenCreated;
-
- // TODO: Clean up any usage of these times. (There's no "incoming call
- // panel" in the Phone UI any more; incoming calls just go straight to the
- // regular in-call UI.)
- static long sTimeIncomingCallPanelRequested;
- static long sTimeIncomingCallPanelOnCreate;
- static long sTimeIncomingCallPanelCreated;
-
- /** This class is never instantiated. */
- private Profiler() {
- }
-
- static void profileViewCreate(Window win, String tag) {
- if (false) {
- ViewParent p = (ViewParent) win.getDecorView();
- while (p instanceof View) {
- p = ((View) p).getParent();
- }
- //((ViewRoot)p).profile();
- //((ViewRoot)p).setProfileTag(tag);
- }
- }
-
- static void callScreenRequested() {
- if (PROFILE) {
- sTimeCallScreenRequested = SystemClock.uptimeMillis();
- }
- }
-
- static void callScreenOnCreate() {
- if (PROFILE) {
- sTimeCallScreenOnCreate = SystemClock.uptimeMillis();
- }
- }
-
- static void callScreenCreated() {
- if (PROFILE) {
- sTimeCallScreenCreated = SystemClock.uptimeMillis();
- dumpCallScreenStat();
- }
- }
-
- private static void dumpCallScreenStat() {
- if (PROFILE) {
- log(">>> call screen perf stats <<<");
- log(">>> request -> onCreate = " +
- (sTimeCallScreenOnCreate - sTimeCallScreenRequested));
- log(">>> onCreate -> created = " +
- (sTimeCallScreenCreated - sTimeCallScreenOnCreate));
- }
- }
-
- static void incomingCallPanelRequested() {
- if (PROFILE) {
- sTimeIncomingCallPanelRequested = SystemClock.uptimeMillis();
- }
- }
-
- static void incomingCallPanelOnCreate() {
- if (PROFILE) {
- sTimeIncomingCallPanelOnCreate = SystemClock.uptimeMillis();
- }
- }
-
- static void incomingCallPanelCreated() {
- if (PROFILE) {
- sTimeIncomingCallPanelCreated = SystemClock.uptimeMillis();
- dumpIncomingCallPanelStat();
- }
- }
-
- private static void dumpIncomingCallPanelStat() {
- if (PROFILE) {
- log(">>> incoming call panel perf stats <<<");
- log(">>> request -> onCreate = " +
- (sTimeIncomingCallPanelOnCreate - sTimeIncomingCallPanelRequested));
- log(">>> onCreate -> created = " +
- (sTimeIncomingCallPanelCreated - sTimeIncomingCallPanelOnCreate));
- }
- }
-
- private static void log(String msg) {
- Log.d(LOG_TAG, "[Profiler] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/Ringer.java b/phone/src/com/android/phone2/Ringer.java
deleted file mode 100644
index 33559de..0000000
--- a/phone/src/com/android/phone2/Ringer.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- * 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.phone2;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.IPowerManager;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.os.SystemProperties;
-import android.os.Vibrator;
-import android.util.Log;
-
-import com.android.internal.telephony.Phone;
-/**
- * Ringer manager for the Phone app.
- */
-public class Ringer {
- private static final String LOG_TAG = "Ringer";
- private static final boolean DBG =
- (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
-
- private static final int PLAY_RING_ONCE = 1;
- private static final int STOP_RING = 3;
-
- private static final int VIBRATE_LENGTH = 1000; // ms
- private static final int PAUSE_LENGTH = 1000; // ms
-
- // Uri for the ringtone.
- Uri mCustomRingtoneUri;
-
- Ringtone mRingtone;
- Vibrator mVibrator = new Vibrator();
- IPowerManager mPowerManager;
- volatile boolean mContinueVibrating;
- VibratorThread mVibratorThread;
- Context mContext;
- private Worker mRingThread;
- private Handler mRingHandler;
- private long mFirstRingEventTime = -1;
- private long mFirstRingStartTime = -1;
-
- Ringer(Phone phone) {
- mContext = phone.getContext();
- mPowerManager = IPowerManager.Stub.asInterface(ServiceManager.getService(Context.POWER_SERVICE));
- }
-
- /**
- * After a radio technology change, e.g. from CDMA to GSM or vice versa,
- * the Context of the Ringer has to be updated. This is done by that function.
- *
- * @parameter Phone, the new active phone for the appropriate radio
- * technology
- */
- void updateRingerContextAfterRadioTechnologyChange(Phone phone) {
- if(DBG) Log.d(LOG_TAG, "updateRingerContextAfterRadioTechnologyChange...");
- mContext = phone.getContext();
- }
-
- /**
- * @return true if we're playing a ringtone and/or vibrating
- * to indicate that there's an incoming call.
- * ("Ringing" here is used in the general sense. If you literally
- * need to know if we're playing a ringtone or vibrating, use
- * isRingtonePlaying() or isVibrating() instead.)
- *
- * @see isVibrating
- * @see isRingtonePlaying
- */
- boolean isRinging() {
- synchronized (this) {
- return (isRingtonePlaying() || isVibrating());
- }
- }
-
- /**
- * @return true if the ringtone is playing
- * @see isVibrating
- * @see isRinging
- */
- private boolean isRingtonePlaying() {
- synchronized (this) {
- return (mRingtone != null && mRingtone.isPlaying()) ||
- (mRingHandler != null && mRingHandler.hasMessages(PLAY_RING_ONCE));
- }
- }
-
- /**
- * @return true if we're vibrating in response to an incoming call
- * @see isVibrating
- * @see isRinging
- */
- private boolean isVibrating() {
- synchronized (this) {
- return (mVibratorThread != null);
- }
- }
-
- /**
- * Starts the ringtone and/or vibrator
- */
- void ring() {
- if (DBG) log("ring()...");
-
- synchronized (this) {
- try {
- if (PhoneApp.getInstance().showBluetoothIndication()) {
- mPowerManager.setAttentionLight(true, 0x000000ff);
- } else {
- mPowerManager.setAttentionLight(true, 0x00ffffff);
- }
- } catch (RemoteException ex) {
- // the other end of this binder call is in the system process.
- }
-
- if (shouldVibrate() && mVibratorThread == null) {
- mContinueVibrating = true;
- mVibratorThread = new VibratorThread();
- if (DBG) log("- starting vibrator...");
- mVibratorThread.start();
- }
- AudioManager audioManager =
- (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
-
- if (audioManager.getStreamVolume(AudioManager.STREAM_RING) == 0) {
- if (DBG) log("skipping ring because volume is zero");
- return;
- }
-
- makeLooper();
- if (mFirstRingEventTime < 0) {
- mFirstRingEventTime = SystemClock.elapsedRealtime();
- mRingHandler.sendEmptyMessage(PLAY_RING_ONCE);
- } else {
- // For repeat rings, figure out by how much to delay
- // the ring so that it happens the correct amount of
- // time after the previous ring
- if (mFirstRingStartTime > 0) {
- // Delay subsequent rings by the delta between event
- // and play time of the first ring
- if (DBG) {
- log("delaying ring by " + (mFirstRingStartTime - mFirstRingEventTime));
- }
- mRingHandler.sendEmptyMessageDelayed(PLAY_RING_ONCE,
- mFirstRingStartTime - mFirstRingEventTime);
- } else {
- // We've gotten two ring events so far, but the ring
- // still hasn't started. Reset the event time to the
- // time of this event to maintain correct spacing.
- mFirstRingEventTime = SystemClock.elapsedRealtime();
- }
- }
- }
- }
-
- boolean shouldVibrate() {
- AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- return audioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER);
- }
-
- /**
- * Stops the ringtone and/or vibrator if any of these are actually
- * ringing/vibrating.
- */
- void stopRing() {
- synchronized (this) {
- if (DBG) log("stopRing()...");
-
- try {
- mPowerManager.setAttentionLight(false, 0x00000000);
- } catch (RemoteException ex) {
- // the other end of this binder call is in the system process.
- }
-
- if (mRingHandler != null) {
- mRingHandler.removeCallbacksAndMessages(null);
- Message msg = mRingHandler.obtainMessage(STOP_RING);
- msg.obj = mRingtone;
- mRingHandler.sendMessage(msg);
- PhoneUtils.setAudioMode(mContext, AudioManager.MODE_NORMAL);
- mRingThread = null;
- mRingHandler = null;
- mRingtone = null;
- mFirstRingEventTime = -1;
- mFirstRingStartTime = -1;
- } else {
- if (DBG) log("- stopRing: null mRingHandler!");
- }
-
- if (mVibratorThread != null) {
- if (DBG) log("- stopRing: cleaning up vibrator thread...");
- mContinueVibrating = false;
- mVibratorThread = null;
- }
- // Also immediately cancel any vibration in progress.
- mVibrator.cancel();
- }
- }
-
- private class VibratorThread extends Thread {
- public void run() {
- while (mContinueVibrating) {
- mVibrator.vibrate(VIBRATE_LENGTH);
- SystemClock.sleep(VIBRATE_LENGTH + PAUSE_LENGTH);
- }
- }
- }
- private class Worker implements Runnable {
- private final Object mLock = new Object();
- private Looper mLooper;
-
- Worker(String name) {
- Thread t = new Thread(null, this, name);
- t.start();
- synchronized (mLock) {
- while (mLooper == null) {
- try {
- mLock.wait();
- } catch (InterruptedException ex) {
- }
- }
- }
- }
-
- public Looper getLooper() {
- return mLooper;
- }
-
- public void run() {
- synchronized (mLock) {
- Looper.prepare();
- mLooper = Looper.myLooper();
- mLock.notifyAll();
- }
- Looper.loop();
- }
-
- public void quit() {
- mLooper.quit();
- }
- }
-
- /**
- * Sets the ringtone uri in preparation for ringtone creation
- * in makeLooper(). This uri is defaulted to the phone-wide
- * default ringtone.
- */
- void setCustomRingtoneUri (Uri uri) {
- if (uri != null) {
- mCustomRingtoneUri = uri;
- }
- }
-
- private void makeLooper() {
- if (mRingThread == null) {
- mRingThread = new Worker("ringer");
- mRingHandler = new Handler(mRingThread.getLooper()) {
- @Override
- public void handleMessage(Message msg) {
- Ringtone r = null;
- switch (msg.what) {
- case PLAY_RING_ONCE:
- if (DBG) log("mRingHandler: PLAY_RING_ONCE...");
- if (mRingtone == null && !hasMessages(STOP_RING)) {
- // create the ringtone with the uri
- if (DBG) log("creating ringtone: " + mCustomRingtoneUri);
- r = RingtoneManager.getRingtone(mContext, mCustomRingtoneUri);
- synchronized (Ringer.this) {
- if (!hasMessages(STOP_RING)) {
- mRingtone = r;
- }
- }
- }
- r = mRingtone;
- if (r != null && !hasMessages(STOP_RING) && !r.isPlaying()) {
- PhoneUtils.setAudioMode(mContext, AudioManager.MODE_RINGTONE);
- r.play();
- synchronized (Ringer.this) {
- if (mFirstRingStartTime < 0) {
- mFirstRingStartTime = SystemClock.elapsedRealtime();
- }
- }
- }
- break;
- case STOP_RING:
- if (DBG) log("mRingHandler: STOP_RING...");
- r = (Ringtone) msg.obj;
- if (r != null) {
- r.stop();
- } else {
- if (DBG) log("- STOP_RING with null ringtone! msg = " + msg);
- }
- getLooper().quit();
- break;
- }
- }
- };
- }
- }
-
- private static void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/Settings.java b/phone/src/com/android/phone2/Settings.java
deleted file mode 100644
index 78c64c1..0000000
--- a/phone/src/com/android/phone2/Settings.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.net.ThrottleManager;
-import android.os.AsyncResult;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemProperties;
-import android.preference.CheckBoxPreference;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.util.Log;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.telephony.TelephonyProperties;
-
-/**
- * List of Phone-specific settings screens.
- */
-public class Settings extends PreferenceActivity implements DialogInterface.OnClickListener,
- DialogInterface.OnDismissListener, Preference.OnPreferenceChangeListener{
-
- // debug data
- private static final String LOG_TAG = "NetworkSettings";
- private static final boolean DBG = true;
- public static final int REQUEST_CODE_EXIT_ECM = 17;
-
- //String keys for preference lookup
- private static final String BUTTON_DATA_ENABLED_KEY = "button_data_enabled_key";
- private static final String BUTTON_DATA_USAGE_KEY = "button_data_usage_key";
- private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key";
- private static final String BUTTON_ROAMING_KEY = "button_roaming_key";
- private static final String BUTTON_CDMA_ROAMING_KEY = "cdma_roaming_mode_key";
-
- private static final String BUTTON_GSM_UMTS_OPTIONS = "gsm_umts_options_key";
- private static final String BUTTON_CDMA_OPTIONS = "cdma_options_key";
-
- static final int preferredNetworkMode = Phone.PREFERRED_NT_MODE;
-
- //UI objects
- private ListPreference mButtonPreferredNetworkMode;
- private CheckBoxPreference mButtonDataRoam;
- private CheckBoxPreference mButtonDataEnabled;
- private CdmaRoamingListPreference mButtonCdmaRoam;
-
- private Preference mButtonDataUsage;
- private DataUsageListener mDataUsageListener;
- private static final String iface = "rmnet0"; //TODO: this will go away
-
- private Phone mPhone;
- private MyHandler mHandler;
- private boolean mOkClicked;
-
- //GsmUmts options and Cdma options
- GsmUmtsOptions gsmumtsOptions;
- CdmaOptions cdmaOptions;
-
-
- //This is a method implemented for DialogInterface.OnClickListener.
- // Used to dismiss the dialogs when they come up.
- public void onClick(DialogInterface dialog, int which) {
- if (which == DialogInterface.BUTTON1) {
- mPhone.setDataRoamingEnabled(true);
- mOkClicked = true;
- } else {
- // Reset the toggle
- mButtonDataRoam.setChecked(false);
- }
- }
-
- public void onDismiss(DialogInterface dialog) {
- // Assuming that onClick gets called first
- if (!mOkClicked) {
- mButtonDataRoam.setChecked(false);
- }
- }
-
- /**
- * Invoked on each preference click in this hierarchy, overrides
- * PreferenceActivity's implementation. Used to make sure we track the
- * preference click events.
- */
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- if (gsmumtsOptions != null &&
- gsmumtsOptions.onPreferenceTreeClick(preferenceScreen, preference) == true) {
- return true;
- } else if (cdmaOptions != null &&
- cdmaOptions.onPreferenceTreeClick(preferenceScreen, preference) == true) {
- if (Boolean.parseBoolean(
- SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
- // In ECM mode launch ECM app dialog
- startActivityForResult(
- new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
- REQUEST_CODE_EXIT_ECM);
- }
- return true;
- } else if (preference == mButtonPreferredNetworkMode) {
- //displays the value taken from the Settings.System
- int settingsNetworkMode = android.provider.Settings.Secure.getInt(mPhone.getContext().
- getContentResolver(), android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
- preferredNetworkMode);
- mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
- return true;
- }
- else if (preference == mButtonDataRoam) {
- if (DBG) log("onPreferenceTreeClick: preference == mButtonDataRoam.");
-
- //normally called on the toggle click
- if (mButtonDataRoam.isChecked()) {
- // First confirm with a warning dialog about charges
- mOkClicked = false;
- new AlertDialog.Builder(this).setMessage(
- getResources().getString(R.string.roaming_warning))
- .setTitle(android.R.string.dialog_alert_title)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setPositiveButton(android.R.string.yes, this)
- .setNegativeButton(android.R.string.no, this)
- .show()
- .setOnDismissListener(this);
- }
- else {
- mPhone.setDataRoamingEnabled(false);
- }
- return true;
- } else if (preference == mButtonDataEnabled) {
- if (DBG) log("onPreferenceTreeClick: preference == mButtonDataEnabled.");
- ConnectivityManager cm =
- (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
-
- cm.setMobileDataEnabled(mButtonDataEnabled.isChecked());
- return true;
- } else {
- // if the button is anything but the simple toggle preference,
- // we'll need to disable all preferences to reject all click
- // events until the sub-activity's UI comes up.
- preferenceScreen.setEnabled(false);
- // Let the intents be launched by the Preference manager
- return false;
- }
- }
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- addPreferencesFromResource(R.xml.network_setting);
-
- mPhone = SipPhoneFactory.getDefaultPhone();
- mHandler = new MyHandler();
-
- //get UI object references
- PreferenceScreen prefSet = getPreferenceScreen();
-
- mButtonDataEnabled = (CheckBoxPreference) prefSet.findPreference(BUTTON_DATA_ENABLED_KEY);
- mButtonDataRoam = (CheckBoxPreference) prefSet.findPreference(BUTTON_ROAMING_KEY);
- mButtonPreferredNetworkMode = (ListPreference) prefSet.findPreference(
- BUTTON_PREFERED_NETWORK_MODE);
- mButtonDataUsage = prefSet.findPreference(BUTTON_DATA_USAGE_KEY);
-
- if (getResources().getBoolean(R.bool.world_phone) == true) {
- // set the listener for the mButtonPreferredNetworkMode list preference so we can issue
- // change Preferred Network Mode.
- mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this);
-
- //Get the networkMode from Settings.System and displays it
- int settingsNetworkMode = android.provider.Settings.Secure.getInt(mPhone.getContext().
- getContentResolver(),android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
- preferredNetworkMode);
- mButtonPreferredNetworkMode.setValue(Integer.toString(settingsNetworkMode));
- // The intent code that resided here in the past has been moved into the
- // more conventional location in network_setting.xml
-
- } else {
- prefSet.removePreference(mButtonPreferredNetworkMode);
- prefSet.removePreference(prefSet.findPreference(BUTTON_GSM_UMTS_OPTIONS));
- prefSet.removePreference(prefSet.findPreference(BUTTON_CDMA_OPTIONS));
- int phoneType = mPhone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- addPreferencesFromResource(R.xml.cdma_options);
- mButtonCdmaRoam =
- (CdmaRoamingListPreference) prefSet.findPreference(BUTTON_CDMA_ROAMING_KEY);
- cdmaOptions = new CdmaOptions();
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- addPreferencesFromResource(R.xml.gsm_umts_options);
- gsmumtsOptions = new GsmUmtsOptions();
- } else {
- throw new IllegalStateException("Unexpected phone type: " + phoneType);
- }
- }
- ThrottleManager tm = (ThrottleManager) getSystemService(Context.THROTTLE_SERVICE);
- mDataUsageListener = new DataUsageListener(this, mButtonDataUsage, prefSet);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- // upon resumption from the sub-activity, make sure we re-enable the
- // preferences.
- getPreferenceScreen().setEnabled(true);
-
- ConnectivityManager cm =
- (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
- mButtonDataEnabled.setChecked(cm.getMobileDataEnabled());
-
- // Set UI state in onResume because a user could go home, launch some
- // app to change this setting's backend, and re-launch this settings app
- // and the UI state would be inconsistent with actual state
- mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled());
-
- if (getPreferenceScreen().findPreference(BUTTON_PREFERED_NETWORK_MODE) != null) {
- mPhone.getPreferredNetworkType(mHandler.obtainMessage(
- MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
- }
- mDataUsageListener.resume();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mDataUsageListener.pause();
- }
-
- /**
- * Implemented to support onPreferenceChangeListener to look for preference
- * changes specifically on CLIR.
- *
- * @param preference is the preference to be changed, should be mButtonCLIR.
- * @param objValue should be the value of the selection, NOT its localized
- * display value.
- */
- public boolean onPreferenceChange(Preference preference, Object objValue) {
- if (preference == mButtonPreferredNetworkMode) {
- //NOTE onPreferenceChange seems to be called even if there is no change
- //Check if the button value is changed from the System.Setting
- mButtonPreferredNetworkMode.setValue((String) objValue);
- int buttonNetworkMode;
- buttonNetworkMode = Integer.valueOf((String) objValue).intValue();
- int settingsNetworkMode = android.provider.Settings.Secure.getInt(
- mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.PREFERRED_NETWORK_MODE, preferredNetworkMode);
- if (buttonNetworkMode != settingsNetworkMode) {
- int modemNetworkMode;
- switch(buttonNetworkMode) {
- case Phone.NT_MODE_GLOBAL:
- modemNetworkMode = Phone.NT_MODE_GLOBAL;
- break;
- case Phone.NT_MODE_EVDO_NO_CDMA:
- modemNetworkMode = Phone.NT_MODE_EVDO_NO_CDMA;
- break;
- case Phone.NT_MODE_CDMA_NO_EVDO:
- modemNetworkMode = Phone.NT_MODE_CDMA_NO_EVDO;
- break;
- case Phone.NT_MODE_CDMA:
- modemNetworkMode = Phone.NT_MODE_CDMA;
- break;
- case Phone.NT_MODE_GSM_UMTS:
- modemNetworkMode = Phone.NT_MODE_GSM_UMTS;
- break;
- case Phone.NT_MODE_WCDMA_ONLY:
- modemNetworkMode = Phone.NT_MODE_WCDMA_ONLY;
- break;
- case Phone.NT_MODE_GSM_ONLY:
- modemNetworkMode = Phone.NT_MODE_GSM_ONLY;
- break;
- case Phone.NT_MODE_WCDMA_PREF:
- modemNetworkMode = Phone.NT_MODE_WCDMA_PREF;
- break;
- default:
- modemNetworkMode = Phone.PREFERRED_NT_MODE;
- }
- UpdatePreferredNetworkModeSummary(buttonNetworkMode);
-
- android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
- buttonNetworkMode );
- //Set the modem network mode
- mPhone.setPreferredNetworkType(modemNetworkMode, mHandler
- .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
- }
- }
-
- // always let the preference setting proceed.
- return true;
- }
-
- private class MyHandler extends Handler {
-
- private static final int MESSAGE_GET_PREFERRED_NETWORK_TYPE = 0;
- private static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 1;
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_GET_PREFERRED_NETWORK_TYPE:
- handleGetPreferredNetworkTypeResponse(msg);
- break;
-
- case MESSAGE_SET_PREFERRED_NETWORK_TYPE:
- handleSetPreferredNetworkTypeResponse(msg);
- break;
- }
- }
-
- private void handleGetPreferredNetworkTypeResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception == null) {
- int modemNetworkMode = ((int[])ar.result)[0];
-
- if (DBG) {
- log ("handleGetPreferredNetworkTypeResponse: modemNetworkMode = " +
- modemNetworkMode);
- }
-
- int settingsNetworkMode = android.provider.Settings.Secure.getInt(
- mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
- preferredNetworkMode);
-
- if (DBG) {
- log("handleGetPreferredNetworkTypeReponse: settingsNetworkMode = " +
- settingsNetworkMode);
- }
-
- //check that modemNetworkMode is from an accepted value
- if (modemNetworkMode == Phone.NT_MODE_WCDMA_PREF ||
- modemNetworkMode == Phone.NT_MODE_GSM_ONLY ||
- modemNetworkMode == Phone.NT_MODE_WCDMA_ONLY ||
- modemNetworkMode == Phone.NT_MODE_GSM_UMTS ||
- modemNetworkMode == Phone.NT_MODE_CDMA ||
- modemNetworkMode == Phone.NT_MODE_CDMA_NO_EVDO ||
- modemNetworkMode == Phone.NT_MODE_EVDO_NO_CDMA ||
- modemNetworkMode == Phone.NT_MODE_GLOBAL ) {
- if (DBG) {
- log("handleGetPreferredNetworkTypeResponse: if 1: modemNetworkMode = " +
- modemNetworkMode);
- }
-
- //check changes in modemNetworkMode and updates settingsNetworkMode
- if (modemNetworkMode != settingsNetworkMode) {
- if (DBG) {
- log("handleGetPreferredNetworkTypeResponse: if 2: " +
- "modemNetworkMode != settingsNetworkMode");
- }
-
- settingsNetworkMode = modemNetworkMode;
-
- if (DBG) { log("handleGetPreferredNetworkTypeResponse: if 2: " +
- "settingsNetworkMode = " + settingsNetworkMode);
- }
-
- //changes the Settings.System accordingly to modemNetworkMode
- android.provider.Settings.Secure.putInt(
- mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
- settingsNetworkMode );
- }
-
- UpdatePreferredNetworkModeSummary(modemNetworkMode);
- // changes the mButtonPreferredNetworkMode accordingly to modemNetworkMode
- mButtonPreferredNetworkMode.setValue(Integer.toString(modemNetworkMode));
- } else {
- if (DBG) log("handleGetPreferredNetworkTypeResponse: else: reset to default");
- resetNetworkModeToDefault();
- }
- }
- }
-
- private void handleSetPreferredNetworkTypeResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception == null) {
- int networkMode = Integer.valueOf(
- mButtonPreferredNetworkMode.getValue()).intValue();
- android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
- networkMode );
- } else {
- mPhone.getPreferredNetworkType(obtainMessage(MESSAGE_GET_PREFERRED_NETWORK_TYPE));
- }
- }
-
- private void resetNetworkModeToDefault() {
- //set the mButtonPreferredNetworkMode
- mButtonPreferredNetworkMode.setValue(Integer.toString(preferredNetworkMode));
- //set the Settings.System
- android.provider.Settings.Secure.putInt(mPhone.getContext().getContentResolver(),
- android.provider.Settings.Secure.PREFERRED_NETWORK_MODE,
- preferredNetworkMode );
- //Set the Modem
- mPhone.setPreferredNetworkType(preferredNetworkMode,
- this.obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
- }
- }
-
- private void UpdatePreferredNetworkModeSummary(int NetworkMode) {
- switch(NetworkMode) {
- case Phone.NT_MODE_WCDMA_PREF:
- // TODO T: Make all of these strings come from res/values/strings.xml.
- mButtonPreferredNetworkMode.setSummary("Preferred network mode: WCDMA pref");
- break;
- case Phone.NT_MODE_GSM_ONLY:
- mButtonPreferredNetworkMode.setSummary("Preferred network mode: GSM only");
- break;
- case Phone.NT_MODE_WCDMA_ONLY:
- mButtonPreferredNetworkMode.setSummary("Preferred network mode: WCDMA only");
- break;
- case Phone.NT_MODE_GSM_UMTS:
- mButtonPreferredNetworkMode.setSummary("Preferred network mode: GSM/WCDMA");
- break;
- case Phone.NT_MODE_CDMA:
- mButtonPreferredNetworkMode.setSummary("Preferred network mode: CDMA / EvDo");
- break;
- case Phone.NT_MODE_CDMA_NO_EVDO:
- mButtonPreferredNetworkMode.setSummary("Preferred network mode: CDMA only");
- break;
- case Phone.NT_MODE_EVDO_NO_CDMA:
- mButtonPreferredNetworkMode.setSummary("Preferred network mode: EvDo only");
- break;
- case Phone.NT_MODE_GLOBAL:
- default:
- mButtonPreferredNetworkMode.setSummary("Preferred network mode: Global");
- }
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch(requestCode) {
- case REQUEST_CODE_EXIT_ECM:
- Boolean isChoiceYes =
- data.getBooleanExtra(EmergencyCallbackModeExitDialog.EXTRA_EXIT_ECM_RESULT, false);
- if (isChoiceYes) {
- // If the phone exits from ECM mode, show the system selection Options
- mButtonCdmaRoam.showDialog(null);
- } else {
- // do nothing
- }
- break;
-
- default:
- break;
- }
- }
-
- private static void log(String msg) {
- Log.d(LOG_TAG, msg);
- }
-}
diff --git a/phone/src/com/android/phone2/SimContacts.java b/phone/src/com/android/phone2/SimContacts.java
deleted file mode 100644
index fa15fa3..0000000
--- a/phone/src/com/android/phone2/SimContacts.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.phone2;
-
-import android.accounts.Account;
-import android.app.ProgressDialog;
-import android.content.ContentProviderOperation;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.OperationApplicationException;
-import android.content.DialogInterface.OnCancelListener;
-import android.content.DialogInterface.OnClickListener;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.Data;
-import android.provider.ContactsContract.Groups;
-import android.provider.ContactsContract.RawContacts;
-import android.provider.ContactsContract.CommonDataKinds.Email;
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.CursorAdapter;
-import android.widget.ListView;
-import android.widget.SimpleCursorAdapter;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-
-/**
- * SIM Address Book UI for the Phone app.
- */
-public class SimContacts extends ADNList {
- private static final String LOG_TAG = "SimContacts";
-
- static final ContentValues sEmptyContentValues = new ContentValues();
-
- private static final int MENU_IMPORT_ONE = 1;
- private static final int MENU_IMPORT_ALL = 2;
- private ProgressDialog mProgressDialog;
-
- private Account mAccount;
-
- private static class NamePhoneTypePair {
- final String name;
- final int phoneType;
- public NamePhoneTypePair(String nameWithPhoneType) {
- // Look for /W /H /M or /O at the end of the name signifying the type
- int nameLen = nameWithPhoneType.length();
- if (nameLen - 2 >= 0 && nameWithPhoneType.charAt(nameLen - 2) == '/') {
- char c = Character.toUpperCase(nameWithPhoneType.charAt(nameLen - 1));
- if (c == 'W') {
- phoneType = Phone.TYPE_WORK;
- } else if (c == 'M' || c == 'O') {
- phoneType = Phone.TYPE_MOBILE;
- } else if (c == 'H') {
- phoneType = Phone.TYPE_HOME;
- } else {
- phoneType = Phone.TYPE_OTHER;
- }
- name = nameWithPhoneType.substring(0, nameLen - 2);
- } else {
- phoneType = Phone.TYPE_OTHER;
- name = nameWithPhoneType;
- }
- }
- }
-
- private class ImportAllSimContactsThread extends Thread
- implements OnCancelListener, OnClickListener {
-
- boolean mCanceled = false;
-
- public ImportAllSimContactsThread() {
- super("ImportAllSimContactsThread");
- }
-
- @Override
- public void run() {
- final ContentValues emptyContentValues = new ContentValues();
- final ContentResolver resolver = getContentResolver();
-
- mCursor.moveToPosition(-1);
- while (!mCanceled && mCursor.moveToNext()) {
- actuallyImportOneSimContact(mCursor, resolver, mAccount);
- mProgressDialog.incrementProgressBy(1);
- }
-
- mProgressDialog.dismiss();
- finish();
- }
-
- public void onCancel(DialogInterface dialog) {
- mCanceled = true;
- }
-
- public void onClick(DialogInterface dialog, int which) {
- if (which == DialogInterface.BUTTON_NEGATIVE) {
- mCanceled = true;
- mProgressDialog.dismiss();
- } else {
- Log.e(LOG_TAG, "Unknown button event has come: " + dialog.toString());
- }
- }
- }
-
- // From HardCodedSources.java in Contacts app.
- // TODO: fix this.
- private static final String ACCOUNT_TYPE_GOOGLE = "com.google";
- private static final String GOOGLE_MY_CONTACTS_GROUP = "System Group: My Contacts";
-
- private static void actuallyImportOneSimContact(
- final Cursor cursor, final ContentResolver resolver, Account account) {
- final NamePhoneTypePair namePhoneTypePair =
- new NamePhoneTypePair(cursor.getString(NAME_COLUMN));
- final String name = namePhoneTypePair.name;
- final int phoneType = namePhoneTypePair.phoneType;
- final String phoneNumber = cursor.getString(NUMBER_COLUMN);
- final String emailAddresses = cursor.getString(EMAILS_COLUMN);
- final String[] emailAddressArray;
- if (!TextUtils.isEmpty(emailAddresses)) {
- emailAddressArray = emailAddresses.split(",");
- } else {
- emailAddressArray = null;
- }
-
- final ArrayList<ContentProviderOperation> operationList =
- new ArrayList<ContentProviderOperation>();
- ContentProviderOperation.Builder builder =
- ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
- String myGroupsId = null;
- if (account != null) {
- builder.withValue(RawContacts.ACCOUNT_NAME, account.name);
- builder.withValue(RawContacts.ACCOUNT_TYPE, account.type);
-
- // TODO: temporal fix for "My Groups" issue. Need to be refactored.
- if (ACCOUNT_TYPE_GOOGLE.equals(account.type)) {
- final Cursor tmpCursor = resolver.query(Groups.CONTENT_URI, new String[] {
- Groups.SOURCE_ID },
- Groups.TITLE + "=?", new String[] {
- GOOGLE_MY_CONTACTS_GROUP }, null);
- try {
- if (tmpCursor != null && tmpCursor.moveToFirst()) {
- myGroupsId = tmpCursor.getString(0);
- }
- } finally {
- if (tmpCursor != null) {
- tmpCursor.close();
- }
- }
- }
- } else {
- builder.withValues(sEmptyContentValues);
- }
- operationList.add(builder.build());
-
- builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
- builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
- builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
- builder.withValue(StructuredName.DISPLAY_NAME, name);
- operationList.add(builder.build());
-
- builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
- builder.withValueBackReference(Phone.RAW_CONTACT_ID, 0);
- builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
- builder.withValue(Phone.TYPE, phoneType);
- builder.withValue(Phone.NUMBER, phoneNumber);
- builder.withValue(Data.IS_PRIMARY, 1);
- operationList.add(builder.build());
-
- if (emailAddresses != null) {
- for (String emailAddress : emailAddressArray) {
- builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
- builder.withValueBackReference(Email.RAW_CONTACT_ID, 0);
- builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
- builder.withValue(Email.TYPE, Email.TYPE_MOBILE);
- builder.withValue(Email.DATA, emailAddress);
- operationList.add(builder.build());
- }
- }
-
- if (myGroupsId != null) {
- builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
- builder.withValueBackReference(GroupMembership.RAW_CONTACT_ID, 0);
- builder.withValue(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
- builder.withValue(GroupMembership.GROUP_SOURCE_ID, myGroupsId);
- operationList.add(builder.build());
- }
-
- try {
- resolver.applyBatch(ContactsContract.AUTHORITY, operationList);
- } catch (RemoteException e) {
- Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage()));
- } catch (OperationApplicationException e) {
- Log.e(LOG_TAG, String.format("%s: %s", e.toString(), e.getMessage()));
- }
- }
-
- private void importOneSimContact(int position) {
- final ContentResolver resolver = getContentResolver();
- if (mCursor.moveToPosition(position)) {
- actuallyImportOneSimContact(mCursor, resolver, mAccount);
- } else {
- Log.e(LOG_TAG, "Failed to move the cursor to the position \"" + position + "\"");
- }
- }
-
- /* Followings are overridden methods */
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- Intent intent = getIntent();
- if (intent != null) {
- final String accountName = intent.getStringExtra("account_name");
- final String accountType = intent.getStringExtra("account_type");
- if (!TextUtils.isEmpty(accountName) && !TextUtils.isEmpty(accountType)) {
- mAccount = new Account(accountName, accountType);
- }
- }
-
- registerForContextMenu(getListView());
- }
-
- @Override
- protected CursorAdapter newAdapter() {
- return new SimpleCursorAdapter(this, R.layout.sim_import_list_entry, mCursor,
- new String[] { "name" }, new int[] { android.R.id.text1 });
- }
-
- @Override
- protected Uri resolveIntent() {
- Intent intent = getIntent();
- intent.setData(Uri.parse("content://icc/adn"));
- if (Intent.ACTION_PICK.equals(intent.getAction())) {
- // "index" is 1-based
- mInitialSelection = intent.getIntExtra("index", 0) - 1;
- }
- return intent.getData();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- menu.add(0, MENU_IMPORT_ALL, 0, R.string.importAllSimEntries);
- return true;
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- MenuItem item = menu.findItem(MENU_IMPORT_ALL);
- if (item != null) {
- item.setVisible(mCursor != null && mCursor.getCount() > 0);
- }
- return super.onPrepareOptionsMenu(menu);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case MENU_IMPORT_ALL:
- CharSequence title = getString(R.string.importAllSimEntries);
- CharSequence message = getString(R.string.importingSimContacts);
-
- ImportAllSimContactsThread thread = new ImportAllSimContactsThread();
-
- mProgressDialog = new ProgressDialog(this);
- mProgressDialog.setTitle(title);
- mProgressDialog.setMessage(message);
- mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
- getString(R.string.cancel), thread);
- mProgressDialog.setProgress(0);
- if (mCursor != null) {
- mProgressDialog.setMax(mCursor.getCount());
- }
- mProgressDialog.show();
-
- thread.start();
-
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case MENU_IMPORT_ONE:
- ContextMenu.ContextMenuInfo menuInfo = item.getMenuInfo();
- if (menuInfo instanceof AdapterView.AdapterContextMenuInfo) {
- int position = ((AdapterView.AdapterContextMenuInfo)menuInfo).position;
- importOneSimContact(position);
- return true;
- }
- }
- return super.onContextItemSelected(item);
- }
-
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenu.ContextMenuInfo menuInfo) {
- if (menuInfo instanceof AdapterView.AdapterContextMenuInfo) {
- AdapterView.AdapterContextMenuInfo itemInfo =
- (AdapterView.AdapterContextMenuInfo) menuInfo;
- TextView textView = (TextView) itemInfo.targetView.findViewById(android.R.id.text1);
- if (textView != null) {
- menu.setHeaderTitle(textView.getText());
- }
- menu.add(0, MENU_IMPORT_ONE, 0, R.string.importSimEntry);
- }
- }
-
- @Override
- public void onListItemClick(ListView l, View v, int position, long id) {
- importOneSimContact(position);
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_CALL: {
- if (mCursor != null && mCursor.moveToPosition(getSelectedItemPosition())) {
- String phoneNumber = mCursor.getString(NUMBER_COLUMN);
- if (phoneNumber == null || !TextUtils.isGraphic(phoneNumber)) {
- // There is no number entered.
- //TODO play error sound or something...
- return true;
- }
- Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
- Uri.fromParts("tel", phoneNumber, null));
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- startActivity(intent);
- finish();
- return true;
- }
- }
- }
- return super.onKeyDown(keyCode, event);
- }
-}
diff --git a/phone/src/com/android/phone2/SpecialCharSequenceMgr.java b/phone/src/com/android/phone2/SpecialCharSequenceMgr.java
deleted file mode 100644
index c86566c..0000000
--- a/phone/src/com/android/phone2/SpecialCharSequenceMgr.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * 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.phone2;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.provider.Telephony.Intents;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import com.android.internal.telephony.Phone;
-import android.telephony.PhoneNumberUtils;
-import android.util.Log;
-import android.view.WindowManager;
-
-/**
- * Helper class to listen for some magic character sequences
- * that are handled specially by the Phone app.
- *
- * TODO: there's lots of duplicated code between this class and the
- * corresponding class under apps/Contacts. Let's figure out a way to
- * unify these two classes (in the framework? in a common shared library?)
- */
-public class SpecialCharSequenceMgr {
- private static final String TAG = PhoneApp.LOG_TAG;
- private static final boolean DBG = false;
-
- private static final String MMI_IMEI_DISPLAY = "*#06#";
-
- /** This class is never instantiated. */
- private SpecialCharSequenceMgr() {
- }
-
- /**
- * Check for special strings of digits from an input
- * string.
- * @param context input Context for the events we handle.
- * @param input the dial string to be examined.
- */
- static boolean handleChars(Context context, String input) {
- return handleChars(context, input, null);
- }
-
- /**
- * Generally used for the Personal Unblocking Key (PUK) unlocking
- * case, where we want to be able to maintain a handle to the
- * calling activity so that we can close it or otherwise display
- * indication if the PUK code is recognized.
- *
- * NOTE: The counterpart to this file in Contacts does
- * NOT contain the special PUK handling code, since it
- * does NOT need it. When the device gets into PUK-
- * locked state, the keyguard comes up and the only way
- * to unlock the device is through the Emergency dialer,
- * which is still in the Phone App.
- *
- * @param context input Context for the events we handle.
- * @param input the dial string to be examined.
- * @param pukInputActivity activity that originated this
- * PUK call, tracked so that we can close it or otherwise
- * indicate that special character sequence is
- * successfully processed. Can be null.
- * @return true if the input was a special string which has been
- * handled.
- */
- static boolean handleChars(Context context,
- String input,
- Activity pukInputActivity) {
-
- //get rid of the separators so that the string gets parsed correctly
- String dialString = PhoneNumberUtils.stripSeparators(input);
-
- if (handleIMEIDisplay(context, dialString)
- || handlePinEntry(context, dialString, pukInputActivity)
- || handleAdnEntry(context, dialString)
- || handleSecretCode(context, dialString)) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Variant of handleChars() that looks for the subset of "special
- * sequences" that are available even if the device is locked.
- *
- * (Specifically, these are the sequences that you're allowed to type
- * in the Emergency Dialer, which is accessible *without* unlocking
- * the device.)
- */
- static boolean handleCharsForLockedDevice(Context context,
- String input,
- Activity pukInputActivity) {
- // Get rid of the separators so that the string gets parsed correctly
- String dialString = PhoneNumberUtils.stripSeparators(input);
-
- // The only sequences available on a locked device are the "**04"
- // or "**05" sequences that allow you to enter PIN or PUK-related
- // codes. (e.g. for the case where you're currently locked out of
- // your phone, and need to change the PIN! The only way to do
- // that is via the Emergency Dialer.)
-
- if (handlePinEntry(context, dialString, pukInputActivity)) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Handles secret codes to launch arbitrary activities in the form of *#*#<code>#*#*.
- * If a secret code is encountered an Intent is started with the android_secret_code://<code>
- * URI.
- *
- * @param context the context to use
- * @param input the text to check for a secret code in
- * @return true if a secret code was encountered
- */
- static private boolean handleSecretCode(Context context, String input) {
- // Secret codes are in the form *#*#<code>#*#*
- int len = input.length();
- if (len > 8 && input.startsWith("*#*#") && input.endsWith("#*#*")) {
- Intent intent = new Intent(Intents.SECRET_CODE_ACTION,
- Uri.parse("android_secret_code://" + input.substring(4, len - 4)));
- context.sendBroadcast(intent);
- return true;
- }
-
- return false;
- }
-
- static private boolean handleAdnEntry(Context context, String input) {
- /* ADN entries are of the form "N(N)(N)#" */
-
- // if the phone is keyguard-restricted, then just ignore this
- // input. We want to make sure that sim card contacts are NOT
- // exposed unless the phone is unlocked, and this code can be
- // accessed from the emergency dialer.
- if (PhoneApp.getInstance().getKeyguardManager().inKeyguardRestrictedInputMode()) {
- return false;
- }
-
- int len = input.length();
- if ((len > 1) && (len < 5) && (input.endsWith("#"))) {
- try {
- int index = Integer.parseInt(input.substring(0, len-1));
- Intent intent = new Intent(Intent.ACTION_PICK);
-
- intent.setClassName("com.android.phone2",
- "com.android.phone2.SimContacts");
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.putExtra("index", index);
- PhoneApp.getInstance().startActivity(intent);
-
- return true;
- } catch (NumberFormatException ex) {}
- }
- return false;
- }
-
- static private boolean handlePinEntry(Context context, String input,
- Activity pukInputActivity) {
- // TODO: The string constants here should be removed in favor
- // of some call to a static the MmiCode class that determines
- // if a dialstring is an MMI code.
- if ((input.startsWith("**04") || input.startsWith("**05"))
- && input.endsWith("#")) {
- PhoneApp app = PhoneApp.getInstance();
- boolean isMMIHandled = app.phone.handlePinMmi(input);
-
- // if the PUK code is recognized then indicate to the
- // phone app that an attempt to unPUK the device was
- // made with this activity. The PUK code may still
- // fail though, but we won't know until the MMI code
- // returns a result.
- if (isMMIHandled && input.startsWith("**05")) {
- app.setPukEntryActivity(pukInputActivity);
- }
- return isMMIHandled;
- }
- return false;
- }
-
- static private boolean handleIMEIDisplay(Context context,
- String input) {
- if (input.equals(MMI_IMEI_DISPLAY)) {
- int phoneType = PhoneApp.getInstance().phone.getPhoneType();
- if (phoneType == Phone.PHONE_TYPE_CDMA) {
- showMEIDPanel(context);
- return true;
- } else if (phoneType == Phone.PHONE_TYPE_GSM) {
- showIMEIPanel(context);
- return true;
- }
- }
-
- return false;
- }
-
- // TODO: showIMEIPanel and showMEIDPanel are almost cut and paste
- // clones. Refactor.
- static private void showIMEIPanel(Context context) {
- if (DBG) log("showIMEIPanel");
-
- String imeiStr = SipPhoneFactory.getDefaultPhone().getDeviceId();
-
- AlertDialog alert = new AlertDialog.Builder(context)
- .setTitle(R.string.imei)
- .setMessage(imeiStr)
- .setPositiveButton(R.string.ok, null)
- .setCancelable(false)
- .show();
- alert.getWindow().setType(WindowManager.LayoutParams.TYPE_PRIORITY_PHONE);
- }
-
- static private void showMEIDPanel(Context context) {
- if (DBG) log("showMEIDPanel");
-
- String meidStr = SipPhoneFactory.getDefaultPhone().getDeviceId();
-
- AlertDialog alert = new AlertDialog.Builder(context)
- .setTitle(R.string.meid)
- .setMessage(meidStr)
- .setPositiveButton(R.string.ok, null)
- .setCancelable(false)
- .show();
- alert.getWindow().setType(WindowManager.LayoutParams.TYPE_PRIORITY_PHONE);
- }
-
- private static void log(String msg) {
- Log.d(TAG, "[SpecialCharSequenceMgr] " + msg);
- }
-}
diff --git a/phone/src/com/android/phone2/TimeConsumingPreferenceActivity.java b/phone/src/com/android/phone2/TimeConsumingPreferenceActivity.java
deleted file mode 100644
index 2918f07..0000000
--- a/phone/src/com/android/phone2/TimeConsumingPreferenceActivity.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package com.android.phone2;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ProgressDialog;
-import android.content.DialogInterface;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.util.Log;
-import android.view.WindowManager;
-
-import java.util.ArrayList;
-
-interface TimeConsumingPreferenceListener {
- public void onStarted(Preference preference, boolean reading);
- public void onFinished(Preference preference, boolean reading);
- public void onError(Preference preference, int error);
-}
-
-public class TimeConsumingPreferenceActivity extends PreferenceActivity
- implements TimeConsumingPreferenceListener, DialogInterface.OnClickListener,
- DialogInterface.OnCancelListener {
- private static final String LOG_TAG = "TimeConsumingPreferenceActivity";
- private final boolean DBG = (PhoneApp.DBG_LEVEL >= 2);
-
- private static final int BUSY_READING_DIALOG = 100;
- private static final int BUSY_SAVING_DIALOG = 200;
-
- static final int EXCEPTION_ERROR = 300;
- static final int RESPONSE_ERROR = 400;
- static final int RADIO_OFF_ERROR = 500;
-
- private final ArrayList<String> mBusyList=new ArrayList<String> ();
-
- protected boolean mIsForeground = false;
-
- @Override
- protected Dialog onCreateDialog(int id) {
- if (id == BUSY_READING_DIALOG || id == BUSY_SAVING_DIALOG) {
- ProgressDialog dialog = new ProgressDialog(this);
- dialog.setTitle(getText(R.string.updating_title));
- dialog.setIndeterminate(true);
-
- switch(id) {
- case BUSY_READING_DIALOG:
- dialog.setCancelable(true);
- dialog.setOnCancelListener(this);
- dialog.setMessage(getText(R.string.reading_settings));
- return dialog;
- case BUSY_SAVING_DIALOG:
- dialog.setCancelable(false);
- dialog.setMessage(getText(R.string.updating_settings));
- return dialog;
- }
- return null;
- }
-
- if (id == RESPONSE_ERROR || id == RADIO_OFF_ERROR || id == EXCEPTION_ERROR) {
- AlertDialog.Builder b = new AlertDialog.Builder(this);
-
- int msgId;
- int titleId = R.string.error_updating_title;
-
- switch (id) {
- case RESPONSE_ERROR:
- msgId = R.string.response_error;
- // Set Button 2, tells the activity that the error is
- // recoverable on dialog exit.
- b.setNegativeButton(R.string.close_dialog, this);
- break;
- case RADIO_OFF_ERROR:
- msgId = R.string.radio_off_error;
- // Set Button 3
- b.setNeutralButton(R.string.close_dialog, this);
- break;
- case EXCEPTION_ERROR:
- default:
- msgId = R.string.exception_error;
- // Set Button 3, tells the activity that the error is
- // not recoverable on dialog exit.
- b.setNeutralButton(R.string.close_dialog, this);
- break;
- }
-
- b.setTitle(getText(titleId));
- b.setMessage(getText(msgId));
- b.setCancelable(false);
- AlertDialog dialog = b.create();
-
- // make the dialog more obvious by blurring the background.
- dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
-
- return dialog;
- }
- return null;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mIsForeground = true;
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mIsForeground = false;
- }
-
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
-
- public void onStarted(Preference preference, boolean reading) {
- if (DBG) dumpState();
- if (DBG) Log.d(LOG_TAG, "onStarted, preference=" + preference.getKey()
- + ", reading=" + reading);
- mBusyList.add(preference.getKey());
-
- if (mIsForeground) {
- if (reading) {
- showDialog(BUSY_READING_DIALOG);
- } else {
- showDialog(BUSY_SAVING_DIALOG);
- }
- }
-
- }
-
- public void onFinished(Preference preference, boolean reading) {
- if (DBG) dumpState();
- if (DBG) Log.d(LOG_TAG, "onFinished, preference=" + preference.getKey()
- + ", reading=" + reading);
- mBusyList.remove(preference.getKey());
-
- if (mBusyList.isEmpty() && mIsForeground) {
- if (reading) {
- dismissDialogSafely(BUSY_READING_DIALOG);
- } else {
- dismissDialogSafely(BUSY_SAVING_DIALOG);
- }
- }
- }
-
- public void onError(Preference preference, int error) {
- if (DBG) dumpState();
- if (DBG) Log.d(LOG_TAG, "onError, preference=" + preference.getKey() + ", error=" + error);
-
- if (mIsForeground) {
- showDialog(error);
- }
- }
-
- public void onCancel(DialogInterface dialog) {
- if (DBG) dumpState();
- finish();
- }
-
- private void dismissDialogSafely(int id) {
- try {
- dismissDialog(id);
- } catch (IllegalArgumentException e) {
- // This is expected in the case where we were in the background
- // at the time we would normally have shown the dialog, so we didn't
- // show it.
- }
- }
-
- void dumpState() {
- Log.d(LOG_TAG, "dumpState begin");
- for (String key : mBusyList) {
- Log.d(LOG_TAG, "mBusyList: key=" + key);
- }
- Log.d(LOG_TAG, "dumpState end");
- }
-}
diff --git a/phone/src/com/android/phone2/Use2GOnlyCheckBoxPreference.java b/phone/src/com/android/phone2/Use2GOnlyCheckBoxPreference.java
deleted file mode 100644
index 62307f1..0000000
--- a/phone/src/com/android/phone2/Use2GOnlyCheckBoxPreference.java
+++ /dev/null
@@ -1,109 +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.phone2;
-
-import android.content.Context;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.preference.CheckBoxPreference;
-import android.util.AttributeSet;
-import android.util.Log;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.sip.SipPhoneFactory;
-
-public class Use2GOnlyCheckBoxPreference extends CheckBoxPreference {
- private static final String LOG_TAG = "Use2GOnlyCheckBoxPreference";
- private static final boolean DBG = true;
-
- private Phone mPhone;
- private MyHandler mHandler;
-
- public Use2GOnlyCheckBoxPreference(Context context) {
- this(context, null);
- }
-
- public Use2GOnlyCheckBoxPreference(Context context, AttributeSet attrs) {
- this(context, attrs,com.android.internal.R.attr.checkBoxPreferenceStyle);
- }
-
- public Use2GOnlyCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- mPhone = SipPhoneFactory.getDefaultPhone();
- mHandler = new MyHandler();
- mPhone.getPreferredNetworkType(
- mHandler.obtainMessage(MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE));
- }
-
- @Override
- protected void onClick() {
- super.onClick();
-
- int networkType = isChecked() ? Phone.NT_MODE_GSM_ONLY : Phone.NT_MODE_WCDMA_PREF;
- Log.i(LOG_TAG, "set preferred network type="+networkType);
- mPhone.setPreferredNetworkType(networkType, mHandler
- .obtainMessage(MyHandler.MESSAGE_SET_PREFERRED_NETWORK_TYPE));
- }
-
- private class MyHandler extends Handler {
-
- private static final int MESSAGE_GET_PREFERRED_NETWORK_TYPE = 0;
- private static final int MESSAGE_SET_PREFERRED_NETWORK_TYPE = 1;
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MESSAGE_GET_PREFERRED_NETWORK_TYPE:
- handleGetPreferredNetworkTypeResponse(msg);
- break;
-
- case MESSAGE_SET_PREFERRED_NETWORK_TYPE:
- handleSetPreferredNetworkTypeResponse(msg);
- break;
- }
- }
-
- private void handleGetPreferredNetworkTypeResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception == null) {
- int type = ((int[])ar.result)[0];
- Log.i(LOG_TAG, "get preferred network type="+type);
- setChecked(type == Phone.NT_MODE_GSM_ONLY);
- } else {
- // Weird state, disable the setting
- Log.i(LOG_TAG, "get preferred network type, exception="+ar.exception);
- setEnabled(false);
- }
- }
-
- private void handleSetPreferredNetworkTypeResponse(Message msg) {
- AsyncResult ar = (AsyncResult) msg.obj;
-
- if (ar.exception != null) {
- // Yikes, error, disable the setting
- setEnabled(false);
- // Set UI to current state
- Log.i(LOG_TAG, "set preferred network type, exception=" + ar.exception);
- mPhone.getPreferredNetworkType(obtainMessage(MESSAGE_GET_PREFERRED_NETWORK_TYPE));
- } else {
- Log.i(LOG_TAG, "set preferred network type done");
- }
- }
- }
-}
diff --git a/phone/src2/com/android/internal/telephony/SipPhoneNotifier.java b/phone/src2/com/android/internal/telephony/SipPhoneNotifier.java
deleted file mode 100644
index 81e151e..0000000
--- a/phone/src2/com/android/internal/telephony/SipPhoneNotifier.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony;
-
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.telephony.TelephonyManager;
-import android.util.Log;
-
-import com.android.internal.telephony.ITelephonyRegistry;
-
-/**
- * Temporary. Will be removed after integrating with CallManager.
- * 100% copy from DefaultPhoneNotifier. Cannot access its package level
- * constructor; thus the copy.
- * @hide
- */
-public class SipPhoneNotifier implements PhoneNotifier {
-
- static final String LOG_TAG = "GSM";
- private static final boolean DBG = true;
- private ITelephonyRegistry mRegistry;
-
- public SipPhoneNotifier() {
- mRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
- "telephony.registry"));
- }
-
- public void notifyPhoneState(Phone sender) {
- Call ringingCall = sender.getRingingCall();
- String incomingNumber = "";
- if (ringingCall != null && ringingCall.getEarliestConnection() != null){
- incomingNumber = ringingCall.getEarliestConnection().getAddress();
- }
- try {
- mRegistry.notifyCallState(convertCallState(sender.getState()), incomingNumber);
- } catch (RemoteException ex) {
- // system process is dead
- }
- }
-
- public void notifyServiceState(Phone sender) {
- try {
- mRegistry.notifyServiceState(sender.getServiceState());
- } catch (RemoteException ex) {
- // system process is dead
- }
- }
-
- public void notifySignalStrength(Phone sender) {
- try {
- mRegistry.notifySignalStrength(sender.getSignalStrength());
- } catch (RemoteException ex) {
- // system process is dead
- }
- }
-
- public void notifyMessageWaitingChanged(Phone sender) {
- try {
- mRegistry.notifyMessageWaitingChanged(sender.getMessageWaitingIndicator());
- } catch (RemoteException ex) {
- // system process is dead
- }
- }
-
- public void notifyCallForwardingChanged(Phone sender) {
- try {
- mRegistry.notifyCallForwardingChanged(sender.getCallForwardingIndicator());
- } catch (RemoteException ex) {
- // system process is dead
- }
- }
-
- public void notifyDataActivity(Phone sender) {
- try {
- mRegistry.notifyDataActivity(convertDataActivityState(sender.getDataActivityState()));
- } catch (RemoteException ex) {
- // system process is dead
- }
- }
-
- public void notifyDataConnection(Phone sender, String reason) {
- TelephonyManager telephony = TelephonyManager.getDefault();
- try {
- mRegistry.notifyDataConnection(
- convertDataState(sender.getDataConnectionState()),
- sender.isDataConnectivityPossible(), reason,
- sender.getActiveApn(),
- sender.getActiveApnTypes(),
- sender.getInterfaceName(null),
- ((telephony!=null) ? telephony.getNetworkType() :
- TelephonyManager.NETWORK_TYPE_UNKNOWN));
- } catch (RemoteException ex) {
- // system process is dead
- }
- }
-
- public void notifyDataConnectionFailed(Phone sender, String reason) {
- try {
- mRegistry.notifyDataConnectionFailed(reason);
- } catch (RemoteException ex) {
- // system process is dead
- }
- }
-
- public void notifyCellLocation(Phone sender) {
- Bundle data = new Bundle();
- sender.getCellLocation().fillInNotifierBundle(data);
- try {
- mRegistry.notifyCellLocation(data);
- } catch (RemoteException ex) {
- // system process is dead
- }
- }
-
- private void log(String s) {
- Log.d(LOG_TAG, "[PhoneNotifier] " + s);
- }
-
- /**
- * Convert the {@link State} enum into the TelephonyManager.CALL_STATE_* constants
- * for the public API.
- */
- public static int convertCallState(Phone.State state) {
- switch (state) {
- case RINGING:
- return TelephonyManager.CALL_STATE_RINGING;
- case OFFHOOK:
- return TelephonyManager.CALL_STATE_OFFHOOK;
- default:
- return TelephonyManager.CALL_STATE_IDLE;
- }
- }
-
- /**
- * Convert the TelephonyManager.CALL_STATE_* constants into the {@link State} enum
- * for the public API.
- */
- public static Phone.State convertCallState(int state) {
- switch (state) {
- case TelephonyManager.CALL_STATE_RINGING:
- return Phone.State.RINGING;
- case TelephonyManager.CALL_STATE_OFFHOOK:
- return Phone.State.OFFHOOK;
- default:
- return Phone.State.IDLE;
- }
- }
-
- /**
- * Convert the {@link DataState} enum into the TelephonyManager.DATA_* constants
- * for the public API.
- */
- public static int convertDataState(Phone.DataState state) {
- switch (state) {
- case CONNECTING:
- return TelephonyManager.DATA_CONNECTING;
- case CONNECTED:
- return TelephonyManager.DATA_CONNECTED;
- case SUSPENDED:
- return TelephonyManager.DATA_SUSPENDED;
- default:
- return TelephonyManager.DATA_DISCONNECTED;
- }
- }
-
- /**
- * Convert the TelephonyManager.DATA_* constants into {@link DataState} enum
- * for the public API.
- */
- public static Phone.DataState convertDataState(int state) {
- switch (state) {
- case TelephonyManager.DATA_CONNECTING:
- return Phone.DataState.CONNECTING;
- case TelephonyManager.DATA_CONNECTED:
- return Phone.DataState.CONNECTED;
- case TelephonyManager.DATA_SUSPENDED:
- return Phone.DataState.SUSPENDED;
- default:
- return Phone.DataState.DISCONNECTED;
- }
- }
-
- /**
- * Convert the {@link DataState} enum into the TelephonyManager.DATA_* constants
- * for the public API.
- */
- public static int convertDataActivityState(Phone.DataActivityState state) {
- switch (state) {
- case DATAIN:
- return TelephonyManager.DATA_ACTIVITY_IN;
- case DATAOUT:
- return TelephonyManager.DATA_ACTIVITY_OUT;
- case DATAINANDOUT:
- return TelephonyManager.DATA_ACTIVITY_INOUT;
- case DORMANT:
- return TelephonyManager.DATA_ACTIVITY_DORMANT;
- default:
- return TelephonyManager.DATA_ACTIVITY_NONE;
- }
- }
-
- /**
- * Convert the TelephonyManager.DATA_* constants into the {@link DataState} enum
- * for the public API.
- */
- public static Phone.DataActivityState convertDataActivityState(int state) {
- switch (state) {
- case TelephonyManager.DATA_ACTIVITY_IN:
- return Phone.DataActivityState.DATAIN;
- case TelephonyManager.DATA_ACTIVITY_OUT:
- return Phone.DataActivityState.DATAOUT;
- case TelephonyManager.DATA_ACTIVITY_INOUT:
- return Phone.DataActivityState.DATAINANDOUT;
- case TelephonyManager.DATA_ACTIVITY_DORMANT:
- return Phone.DataActivityState.DORMANT;
- default:
- return Phone.DataActivityState.NONE;
- }
- }
-}
diff --git a/phone/src2/com/android/internal/telephony/sip/CallFailCause.java b/phone/src2/com/android/internal/telephony/sip/CallFailCause.java
deleted file mode 100644
index 58fb408..0000000
--- a/phone/src2/com/android/internal/telephony/sip/CallFailCause.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony.sip;
-
-/**
- * Call fail causes from TS 24.008 .
- * These are mostly the cause codes we need to distinguish for the UI.
- * See 22.001 Annex F.4 for mapping of cause codes to local tones.
- *
- * {@hide}
- *
- */
-public interface CallFailCause {
- static final int NORMAL_CLEARING = 16;
- // Busy Tone
- static final int USER_BUSY = 17;
-
- // No Tone
- static final int NUMBER_CHANGED = 22;
- static final int STATUS_ENQUIRY = 30;
- static final int NORMAL_UNSPECIFIED = 31;
-
- // Congestion Tone
- static final int NO_CIRCUIT_AVAIL = 34;
- static final int TEMPORARY_FAILURE = 41;
- static final int SWITCHING_CONGESTION = 42;
- static final int CHANNEL_NOT_AVAIL = 44;
- static final int QOS_NOT_AVAIL = 49;
- static final int BEARER_NOT_AVAIL = 58;
-
- // others
- static final int ACM_LIMIT_EXCEEDED = 68;
- static final int CALL_BARRED = 240;
- static final int FDN_BLOCKED = 241;
- static final int ERROR_UNSPECIFIED = 0xffff;
-}
diff --git a/phone/src2/com/android/internal/telephony/sip/CallProxy.java b/phone/src2/com/android/internal/telephony/sip/CallProxy.java
deleted file mode 100644
index fad9663..0000000
--- a/phone/src2/com/android/internal/telephony/sip/CallProxy.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony.sip;
-
-import com.android.internal.telephony.*;
-import java.util.List;
-
-// TODO: remove this class after integrating with CallManager
-class CallProxy extends Call {
- private Call mTarget;
-
- void setTarget(Call target) {
- mTarget = target;
- }
-
- @Override
- public List<Connection> getConnections() {
- return mTarget.getConnections();
- }
-
- @Override
- public Phone getPhone() {
- return mTarget.getPhone();
- }
-
- @Override
- public boolean isMultiparty() {
- return mTarget.isMultiparty();
- }
-
- @Override
- public void hangup() throws CallStateException {
- mTarget.hangup();
- }
-
- @Override
- public boolean hasConnection(Connection c) {
- return mTarget.hasConnection(c);
- }
-
- @Override
- public boolean hasConnections() {
- return mTarget.hasConnections();
- }
-
- @Override
- public State getState() {
- return mTarget.getState();
- }
-
- @Override
- public boolean isIdle() {
- return mTarget.isIdle();
- }
-
- @Override
- public Connection getEarliestConnection() {
- return mTarget.getEarliestConnection();
- }
-
- @Override
- public long getEarliestCreateTime() {
- return mTarget.getEarliestCreateTime();
- }
-
- @Override
- public long getEarliestConnectTime() {
- return mTarget.getEarliestConnectTime();
- }
-
- @Override
- public boolean isDialingOrAlerting() {
- return mTarget.isDialingOrAlerting();
- }
-
- @Override
- public boolean isRinging() {
- return mTarget.isRinging();
- }
-
- @Override
- public Connection getLatestConnection() {
- return mTarget.getLatestConnection();
- }
-
- @Override
- public boolean isGeneric() {
- return mTarget.isGeneric();
- }
-
- @Override
- public void setGeneric(boolean generic) {
- mTarget.setGeneric(generic);
- }
-
- @Override
- public void hangupIfAlive() {
- mTarget.hangupIfAlive();
- }
-}
diff --git a/phone/src2/com/android/internal/telephony/sip/SipCallBase.java b/phone/src2/com/android/internal/telephony/sip/SipCallBase.java
deleted file mode 100644
index e7eda4f..0000000
--- a/phone/src2/com/android/internal/telephony/sip/SipCallBase.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony.sip;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.CallStateException;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.DriverCall;
-import com.android.internal.telephony.Phone;
-
-import android.net.sip.SipManager;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import javax.sip.SipException;
-
-abstract class SipCallBase extends Call {
- private static final int MAX_CONNECTIONS_PER_CALL = 5;
-
- protected List<Connection> connections = new ArrayList<Connection>();
-
- protected abstract void setState(State newState);
-
- public void dispose() {
- }
-
- public List<Connection> getConnections() {
- // FIXME should return Collections.unmodifiableList();
- return connections;
- }
-
- public boolean isMultiparty() {
- return connections.size() > 1;
- }
-
- public String toString() {
- return state.toString();
- }
-
- /**
- * Called by SipConnection when it has disconnected
- */
- void connectionDisconnected(Connection conn) {
- if (state != State.DISCONNECTED) {
- /* If only disconnected connections remain, we are disconnected*/
-
- boolean hasOnlyDisconnectedConnections = true;
-
- for (int i = 0, s = connections.size() ; i < s; i ++) {
- if (connections.get(i).getState()
- != State.DISCONNECTED
- ) {
- hasOnlyDisconnectedConnections = false;
- break;
- }
- }
-
- if (hasOnlyDisconnectedConnections) {
- state = State.DISCONNECTED;
- }
- }
- }
-
-
- /*package*/ void detach(Connection conn) {
- connections.remove(conn);
-
- if (connections.size() == 0) {
- state = State.IDLE;
- }
- }
-
- /**
- * @return true if there's no space in this call for additional
- * connections to be added via "conference"
- */
- /*package*/ boolean isFull() {
- return connections.size() == MAX_CONNECTIONS_PER_CALL;
- }
-
- void clearDisconnected() {
- for (Iterator<Connection> it = connections.iterator(); it.hasNext(); ) {
- Connection c = it.next();
- if (c.getState() == State.DISCONNECTED) it.remove();
- }
-
- if (connections.isEmpty()) setState(State.IDLE);
- }
-}
diff --git a/phone/src2/com/android/internal/telephony/sip/SipCommandInterface.java b/phone/src2/com/android/internal/telephony/sip/SipCommandInterface.java
deleted file mode 100644
index 2c264c7..0000000
--- a/phone/src2/com/android/internal/telephony/sip/SipCommandInterface.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony.sip;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.Message;
-
-import com.android.internal.telephony.BaseCommands;
-import com.android.internal.telephony.CommandsInterface;
-//import com.android.internal.telephony.UUSInfo;
-import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
-
-/**
- * SIP doesn't need CommandsInterface. The class does nothing but made to work
- * with PhoneBase's constructor.
- */
-class SipCommandInterface extends BaseCommands implements CommandsInterface {
- SipCommandInterface(Context context) {
- super(context);
- }
-
- @Override public void setOnNITZTime(Handler h, int what, Object obj) {
- }
-
- public void getIccCardStatus(Message result) {
- }
-
- public void supplyIccPin(String pin, Message result) {
- }
-
- public void supplyIccPuk(String puk, String newPin, Message result) {
- }
-
- public void supplyIccPin2(String pin, Message result) {
- }
-
- public void supplyIccPuk2(String puk, String newPin2, Message result) {
- }
-
- public void changeIccPin(String oldPin, String newPin, Message result) {
- }
-
- public void changeIccPin2(String oldPin2, String newPin2, Message result) {
- }
-
- public void changeBarringPassword(String facility, String oldPwd,
- String newPwd, Message result) {
- }
-
- public void supplyNetworkDepersonalization(String netpin, Message result) {
- }
-
- public void getCurrentCalls(Message result) {
- }
-
- @Deprecated public void getPDPContextList(Message result) {
- }
-
- public void getDataCallList(Message result) {
- }
-
- public void dial(String address, int clirMode, Message result) {
- }
-
- //public void dial(String address, int clirMode, UUSInfo uusInfo,
- // Message result) {
- //}
-
- public void getIMSI(Message result) {
- }
-
- public void getIMEI(Message result) {
- }
-
- public void getIMEISV(Message result) {
- }
-
-
- public void hangupConnection (int gsmIndex, Message result) {
- }
-
- public void hangupWaitingOrBackground (Message result) {
- }
-
- public void hangupForegroundResumeBackground (Message result) {
- }
-
- public void switchWaitingOrHoldingAndActive (Message result) {
- }
-
- public void conference (Message result) {
- }
-
-
- public void setPreferredVoicePrivacy(boolean enable, Message result) {
- }
-
- public void getPreferredVoicePrivacy(Message result) {
- }
-
- public void separateConnection (int gsmIndex, Message result) {
- }
-
- public void acceptCall (Message result) {
- }
-
- public void rejectCall (Message result) {
- }
-
- public void explicitCallTransfer (Message result) {
- }
-
- public void getLastCallFailCause (Message result) {
- }
-
- /** @deprecated */
- public void getLastPdpFailCause (Message result) {
- }
-
- public void getLastDataCallFailCause (Message result) {
- }
-
- public void setMute (boolean enableMute, Message response) {
- }
-
- public void getMute (Message response) {
- }
-
- public void getSignalStrength (Message result) {
- }
-
- public void getRegistrationState (Message result) {
- }
-
- public void getGPRSRegistrationState (Message result) {
- }
-
- public void getOperator(Message result) {
- }
-
- public void sendDtmf(char c, Message result) {
- }
-
- public void startDtmf(char c, Message result) {
- }
-
- public void stopDtmf(Message result) {
- }
-
- public void sendBurstDtmf(String dtmfString, int on, int off,
- Message result) {
- }
-
- public void sendSMS (String smscPDU, String pdu, Message result) {
- }
-
- public void sendCdmaSms(byte[] pdu, Message result) {
- }
-
- public void deleteSmsOnSim(int index, Message response) {
- }
-
- public void deleteSmsOnRuim(int index, Message response) {
- }
-
- public void writeSmsToSim(int status, String smsc, String pdu, Message response) {
- }
-
- public void writeSmsToRuim(int status, String pdu, Message response) {
- }
-
- public void setupDefaultPDP(String apn, String user, String password,
- Message result) {
- }
-
- public void deactivateDefaultPDP(int cid, Message result) {
- }
-
- public void setupDataCall(String radioTechnology, String profile,
- String apn, String user, String password, String authType,
- Message result) {
- }
-
- public void deactivateDataCall(int cid, Message result) {
- }
-
- public void setRadioPower(boolean on, Message result) {
- }
-
- public void setSuppServiceNotifications(boolean enable, Message result) {
- }
-
- public void acknowledgeLastIncomingGsmSms(boolean success, int cause,
- Message result) {
- }
-
- public void acknowledgeLastIncomingCdmaSms(boolean success, int cause,
- Message result) {
- }
-
-
- public void iccIO (int command, int fileid, String path, int p1, int p2,
- int p3, String data, String pin2, Message result) {
- }
-
- public void getCLIR(Message result) {
- }
-
- public void setCLIR(int clirMode, Message result) {
- }
-
- public void queryCallWaiting(int serviceClass, Message response) {
- }
-
- public void setCallWaiting(boolean enable, int serviceClass,
- Message response) {
- }
-
- public void setNetworkSelectionModeAutomatic(Message response) {
- }
-
- public void setNetworkSelectionModeManual(
- String operatorNumeric, Message response) {
- }
-
- public void getNetworkSelectionMode(Message response) {
- }
-
- public void getAvailableNetworks(Message response) {
- }
-
- public void setCallForward(int action, int cfReason, int serviceClass,
- String number, int timeSeconds, Message response) {
- }
-
- public void queryCallForwardStatus(int cfReason, int serviceClass,
- String number, Message response) {
- }
-
- public void queryCLIP(Message response) {
- }
-
- public void getBasebandVersion (Message response) {
- }
-
- public void queryFacilityLock (String facility, String password,
- int serviceClass, Message response) {
- }
-
- public void setFacilityLock (String facility, boolean lockState,
- String password, int serviceClass, Message response) {
- }
-
- public void sendUSSD (String ussdString, Message response) {
- }
-
- public void cancelPendingUssd (Message response) {
- }
-
- public void resetRadio(Message result) {
- }
-
- public void invokeOemRilRequestRaw(byte[] data, Message response) {
- }
-
- public void invokeOemRilRequestStrings(String[] strings, Message response) {
- }
-
- public void setBandMode (int bandMode, Message response) {
- }
-
- public void queryAvailableBandMode (Message response) {
- }
-
- public void sendTerminalResponse(String contents, Message response) {
- }
-
- public void sendEnvelope(String contents, Message response) {
- }
-
- public void handleCallSetupRequestFromSim(
- boolean accept, Message response) {
- }
-
- public void setPreferredNetworkType(int networkType , Message response) {
- }
-
- public void getPreferredNetworkType(Message response) {
- }
-
- public void getNeighboringCids(Message response) {
- }
-
- public void setLocationUpdates(boolean enable, Message response) {
- }
-
- public void getSmscAddress(Message result) {
- }
-
- public void setSmscAddress(String address, Message result) {
- }
-
- public void reportSmsMemoryStatus(boolean available, Message result) {
- }
-
- public void reportStkServiceIsRunning(Message result) {
- }
-
- public void getGsmBroadcastConfig(Message response) {
- }
-
- public void setGsmBroadcastConfig(SmsBroadcastConfigInfo[] config, Message response) {
- }
-
- public void setGsmBroadcastActivation(boolean activate, Message response) {
- }
-
-
- // ***** Methods for CDMA support
- public void getDeviceIdentity(Message response) {
- }
-
- public void getCDMASubscription(Message response) {
- }
-
- public void setPhoneType(int phoneType) { //Set by CDMAPhone and GSMPhone constructor
- }
-
- public void queryCdmaRoamingPreference(Message response) {
- }
-
- public void setCdmaRoamingPreference(int cdmaRoamingType, Message response) {
- }
-
- public void setCdmaSubscription(int cdmaSubscription , Message response) {
- }
-
- public void queryTTYMode(Message response) {
- }
-
- public void setTTYMode(int ttyMode, Message response) {
- }
-
- public void sendCDMAFeatureCode(String FeatureCode, Message response) {
- }
-
- public void getCdmaBroadcastConfig(Message response) {
- }
-
- public void setCdmaBroadcastConfig(int[] configValuesArray, Message response) {
- }
-
- public void setCdmaBroadcastActivation(boolean activate, Message response) {
- }
-
- public void exitEmergencyCallbackMode(Message response) {
- }
-}
diff --git a/phone/src2/com/android/internal/telephony/sip/SipConnectionBase.java b/phone/src2/com/android/internal/telephony/sip/SipConnectionBase.java
deleted file mode 100644
index d48f94a..0000000
--- a/phone/src2/com/android/internal/telephony/sip/SipConnectionBase.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony.sip;
-
-import android.content.Context;
-import android.net.sip.SipAudioCall;
-import android.os.Message;
-import android.os.Registrant;
-import android.os.SystemClock;
-import android.util.Log;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.ServiceState;
-
-import com.android.internal.telephony.*;
-
-abstract class SipConnectionBase extends Connection {
- //***** Event Constants
- private static final int EVENT_DTMF_DONE = 1;
- private static final int EVENT_PAUSE_DONE = 2;
- private static final int EVENT_NEXT_POST_DIAL = 3;
- private static final int EVENT_WAKE_LOCK_TIMEOUT = 4;
-
- //***** Constants
- private static final int PAUSE_DELAY_FIRST_MILLIS = 100;
- private static final int PAUSE_DELAY_MILLIS = 3 * 1000;
- private static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000;
-
- private static final String LOG_TAG = "SIP_CONN";
-
- private SipAudioCall mSipAudioCall;
-
- private String dialString; // outgoing calls only
- private String postDialString; // outgoing calls only
- private int nextPostDialChar; // index into postDialString
- private boolean isIncoming;
- private boolean disconnected;
-
- int index; // index in SipCallTracker.connections[], -1 if unassigned
- // The Sip index is 1 + this
-
- /*
- * These time/timespan values are based on System.currentTimeMillis(),
- * i.e., "wall clock" time.
- */
- private long createTime;
- private long connectTime;
- private long disconnectTime;
-
- /*
- * These time/timespan values are based on SystemClock.elapsedRealTime(),
- * i.e., time since boot. They are appropriate for comparison and
- * calculating deltas.
- */
- private long connectTimeReal;
- private long duration;
- private long holdingStartTime; // The time when the Connection last transitioned
- // into HOLDING
-
- private DisconnectCause mCause = DisconnectCause.NOT_DISCONNECTED;
- private PostDialState postDialState = PostDialState.NOT_STARTED;
-
- SipConnectionBase(String calleeSipUri) {
- dialString = calleeSipUri;
-
- postDialString = PhoneNumberUtils.extractPostDialPortion(dialString);
-
- isIncoming = false;
- createTime = System.currentTimeMillis();
- }
-
- protected void setState(Call.State state) {
- switch (state) {
- case ACTIVE:
- connectTimeReal = SystemClock.elapsedRealtime();
- connectTime = System.currentTimeMillis();
- break;
- case DISCONNECTED:
- duration = SystemClock.elapsedRealtime() - connectTimeReal;
- disconnectTime = System.currentTimeMillis();
- break;
- case HOLDING:
- holdingStartTime = SystemClock.elapsedRealtime();
- break;
- }
- }
-
- @Override
- public long getCreateTime() {
- return createTime;
- }
-
- @Override
- public long getConnectTime() {
- return connectTime;
- }
-
- @Override
- public long getDisconnectTime() {
- return disconnectTime;
- }
-
- @Override
- public long getDurationMillis() {
- if (connectTimeReal == 0) {
- return 0;
- } else if (duration == 0) {
- return SystemClock.elapsedRealtime() - connectTimeReal;
- } else {
- return duration;
- }
- }
-
- @Override
- public long getHoldDurationMillis() {
- if (getState() != Call.State.HOLDING) {
- // If not holding, return 0
- return 0;
- } else {
- return SystemClock.elapsedRealtime() - holdingStartTime;
- }
- }
-
- @Override
- public DisconnectCause getDisconnectCause() {
- return mCause;
- }
-
- void setDisconnectCause(DisconnectCause cause) {
- mCause = cause;
- }
-
- @Override
- public PostDialState getPostDialState() {
- return postDialState;
- }
-
- @Override
- public void proceedAfterWaitChar() {
- // TODO
- }
-
- @Override
- public void proceedAfterWildChar(String str) {
- // TODO
- }
-
- @Override
- public void cancelPostDial() {
- // TODO
- }
-
- protected abstract Phone getPhone();
-
- DisconnectCause disconnectCauseFromCode(int causeCode) {
- /**
- * See 22.001 Annex F.4 for mapping of cause codes
- * to local tones
- */
-
- switch (causeCode) {
- case CallFailCause.USER_BUSY:
- return DisconnectCause.BUSY;
-
- case CallFailCause.NO_CIRCUIT_AVAIL:
- case CallFailCause.TEMPORARY_FAILURE:
- case CallFailCause.SWITCHING_CONGESTION:
- case CallFailCause.CHANNEL_NOT_AVAIL:
- case CallFailCause.QOS_NOT_AVAIL:
- case CallFailCause.BEARER_NOT_AVAIL:
- return DisconnectCause.CONGESTION;
-
- case CallFailCause.ACM_LIMIT_EXCEEDED:
- return DisconnectCause.LIMIT_EXCEEDED;
-
- case CallFailCause.CALL_BARRED:
- return DisconnectCause.CALL_BARRED;
-
- case CallFailCause.FDN_BLOCKED:
- return DisconnectCause.FDN_BLOCKED;
-
- case CallFailCause.ERROR_UNSPECIFIED:
- case CallFailCause.NORMAL_CLEARING:
- default:
- Phone phone = getPhone();
- int serviceState = phone.getServiceState().getState();
- if (serviceState == ServiceState.STATE_POWER_OFF) {
- return DisconnectCause.POWER_OFF;
- } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE
- || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) {
- return DisconnectCause.OUT_OF_SERVICE;
- } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) {
- return DisconnectCause.ERROR_UNSPECIFIED;
- } else if (causeCode == CallFailCause.NORMAL_CLEARING) {
- return DisconnectCause.NORMAL;
- } else {
- // If nothing else matches, report unknown call drop reason
- // to app, not NORMAL call end.
- return DisconnectCause.ERROR_UNSPECIFIED;
- }
- }
- }
-
- @Override
- public String getRemainingPostDialString() {
- if (postDialState == PostDialState.CANCELLED
- || postDialState == PostDialState.COMPLETE
- || postDialString == null
- || postDialString.length() <= nextPostDialChar) {
- return "";
- }
-
- return postDialString.substring(nextPostDialChar);
- }
-
- private void log(String msg) {
- Log.d(LOG_TAG, "[SipConn] " + msg);
- }
-
- @Override
- public int getNumberPresentation() {
- // TODO: add PRESENTATION_URL
- return Connection.PRESENTATION_ALLOWED;
- }
-
- /*
- @Override
- public UUSInfo getUUSInfo() {
- // FIXME: what's this for SIP?
- return null;
- }
- */
-}
diff --git a/phone/src2/com/android/internal/telephony/sip/SipPhone.java b/phone/src2/com/android/internal/telephony/sip/SipPhone.java
deleted file mode 100755
index 59e0bd1..0000000
--- a/phone/src2/com/android/internal/telephony/sip/SipPhone.java
+++ /dev/null
@@ -1,751 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony.sip;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.net.rtp.AudioGroup;
-import android.net.sip.SipAudioCall;
-import android.net.sip.SipManager;
-import android.net.sip.SipProfile;
-import android.net.sip.SipSessionState;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Registrant;
-import android.os.RegistrantList;
-import android.os.SystemProperties;
-import android.preference.PreferenceManager;
-import android.provider.Telephony;
-import android.telephony.CellLocation;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.ServiceState;
-import android.telephony.SignalStrength;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.CallerInfo;
-import com.android.internal.telephony.CallStateException;
-import com.android.internal.telephony.CommandsInterface;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.DataConnection;
-import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.IccFileHandler;
-import com.android.internal.telephony.IccPhoneBookInterfaceManager;
-import com.android.internal.telephony.IccSmsInterfaceManager;
-import com.android.internal.telephony.MmiCode;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneBase;
-import com.android.internal.telephony.PhoneNotifier;
-import com.android.internal.telephony.PhoneProxy;
-import com.android.internal.telephony.PhoneSubInfo;
-import com.android.internal.telephony.TelephonyProperties;
-
-import java.io.IOException;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.sip.SipException;
-
-/**
- * {@hide}
- */
-public class SipPhone extends SipPhoneBase {
- private static final String LOG_TAG = "SipPhone";
- private static final boolean LOCAL_DEBUG = true;
-
- //private List<SipConnection> connections = new ArrayList<SipConnection>();
-
- // A call that is ringing or (call) waiting
- private SipCall ringingCall = new SipCall();
- private SipCall foregroundCall = new SipCall();
- private SipCall backgroundCall = new SipCall();
-
- private SipManager mSipManager;
- private SipProfile mProfile;
-
- SipPhone (Context context, PhoneNotifier notifier, SipProfile profile) {
- super(context, notifier);
-
- Log.v(LOG_TAG, " +++++++++++++++++++++ new SipPhone: " + profile.getUriString());
- ringingCall = new SipCall();
- foregroundCall = new SipCall();
- backgroundCall = new SipCall();
- mProfile = profile;
- mSipManager = SipManager.getInstance(context);
-
- // FIXME: what's this for SIP?
- //Change the system property
- //SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
- // new Integer(Phone.PHONE_TYPE_GSM).toString());
- }
-
- public String getPhoneName() {
- return mProfile.getProfileName();
- }
-
- public boolean canTake(Object incomingCall) {
- synchronized (SipPhone.class) {
- if (!(incomingCall instanceof SipAudioCall)) return false;
- if (ringingCall.getState().isAlive()) return false;
-
- // FIXME: is it true that we cannot take any incoming call if
- // both foreground and background are active
- if (foregroundCall.getState().isAlive()
- && backgroundCall.getState().isAlive()) {
- return false;
- }
-
- SipAudioCall sipAudioCall = (SipAudioCall) incomingCall;
- Log.v(LOG_TAG, " ++++++ taking call from: "
- + sipAudioCall.getPeerProfile().getUriString());
- String localUri = sipAudioCall.getLocalProfile().getUriString();
- if (localUri.equals(mProfile.getUriString())) {
- boolean makeCallWait = foregroundCall.getState().isAlive();
- ringingCall.initIncomingCall(sipAudioCall, makeCallWait);
- return true;
- }
- return false;
- }
- }
-
- public void acceptCall() throws CallStateException {
- synchronized (SipPhone.class) {
- // FIXME if SWITCH fails, should retry with ANSWER
- // in case the active/holding call disappeared and this
- // is no longer call waiting
-
- if (ringingCall.getState() == Call.State.INCOMING) {
- Log.v(LOG_TAG, "acceptCall");
- // Always unmute when answering a new call
- setMute(false);
- // make ringingCall foreground
- foregroundCall.switchWith(ringingCall);
- foregroundCall.acceptCall();
- } else if (ringingCall.getState() == Call.State.WAITING) {
- setMute(false);
- switchHoldingAndActive();
- // make ringingCall foreground
- foregroundCall.switchWith(ringingCall);
- foregroundCall.acceptCall();
- } else {
- throw new CallStateException("phone not ringing");
- }
- }
- }
-
- public void rejectCall() throws CallStateException {
- synchronized (SipPhone.class) {
- if (ringingCall.getState().isRinging()) {
- Log.v(LOG_TAG, "rejectCall");
- ringingCall.rejectCall();
- } else {
- throw new CallStateException("phone not ringing");
- }
- }
- }
-
- public Connection dial(String dialString) throws CallStateException {
- synchronized (SipPhone.class) {
- return dialInternal(dialString);
- }
- }
-
- private Connection dialInternal(String dialString)
- throws CallStateException {
- // TODO: parse SIP URL?
- // Need to make sure dialString gets parsed properly
- //String newDialString = PhoneNumberUtils.stripSeparators(dialString);
- //return mCT.dial(newDialString);
- clearDisconnected();
-
- if (!canDial()) {
- throw new CallStateException("cannot dial in current state");
- }
- if (foregroundCall.getState() == SipCall.State.ACTIVE) {
- switchHoldingAndActive();
- }
- if (foregroundCall.getState() != SipCall.State.IDLE) {
- //we should have failed in !canDial() above before we get here
- throw new CallStateException("cannot dial in current state");
- }
-
- setMute(false);
- //cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());
- try {
- Connection c = foregroundCall.dial(dialString);
- return c;
- } catch (SipException e) {
- Log.e(LOG_TAG, "dial()", e);
- throw new CallStateException("dial error: " + e);
- }
- }
-
- public void switchHoldingAndActive() throws CallStateException {
- Log.v(LOG_TAG, " ~~~~~~ switch fg and bg");
- synchronized (SipPhone.class) {
- foregroundCall.switchWith(backgroundCall);
- if (backgroundCall.getState().isAlive()) backgroundCall.hold();
- if (foregroundCall.getState().isAlive()) foregroundCall.unhold();
- }
- }
-
- public boolean canConference() {
- return true;
- }
-
- public void conference() throws CallStateException {
- // TODO
- }
-
- public boolean canTransfer() {
- return false;
- }
-
- public void explicitCallTransfer() throws CallStateException {
- //mCT.explicitCallTransfer();
- }
-
- public void clearDisconnected() {
- ringingCall.clearDisconnected();
- foregroundCall.clearDisconnected();
- backgroundCall.clearDisconnected();
-
- updatePhoneState();
- notifyPreciseCallStateChanged();
- }
-
- public void sendDtmf(char c) {
- if (!PhoneNumberUtils.is12Key(c)) {
- Log.e(LOG_TAG,
- "sendDtmf called with invalid character '" + c + "'");
- } else if (foregroundCall.getState().isAlive()) {
- foregroundCall.sendDtmf(c);
- }
- }
-
- public void startDtmf(char c) {
- if (!PhoneNumberUtils.is12Key(c)) {
- Log.e(LOG_TAG,
- "startDtmf called with invalid character '" + c + "'");
- } else {
- sendDtmf(c);
- }
- }
-
- public void stopDtmf() {
- // no op
- }
-
- public void sendBurstDtmf(String dtmfString) {
- Log.e(LOG_TAG, "[SipPhone] sendBurstDtmf() is a CDMA method");
- }
-
- public void getOutgoingCallerIdDisplay(Message onComplete) {
- // FIXME: what to reply?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
-
- public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode,
- Message onComplete) {
- // FIXME: what's this for SIP?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
-
- public void getCallWaiting(Message onComplete) {
- // FIXME: what to reply?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
-
- public void setCallWaiting(boolean enable, Message onComplete) {
- // FIXME: what to reply?
- Log.e(LOG_TAG, "call waiting not supported");
- }
-
- public void setMute(boolean muted) {
- foregroundCall.setMute(muted);
- }
-
- public boolean getMute() {
- return foregroundCall.getMute();
- }
-
- public Call getForegroundCall() {
- return foregroundCall;
- }
-
- public Call getBackgroundCall() {
- return backgroundCall;
- }
-
- public Call getRingingCall() {
- return ringingCall;
- }
-
- public ServiceState getServiceState() {
- // FIXME: we may need to provide this when data connectivity is lost
- // or when server is down
- return super.getServiceState();
- }
-
- private String getUriString(SipProfile p) {
- // SipProfile.getUriString() may contain "SIP:" and port
- return p.getUserName() + "@" + getSipDomain(p);
- }
-
- private String getSipDomain(SipProfile p) {
- String domain = p.getSipDomain();
- // TODO: move this to SipProfile
- if (domain.endsWith(":5060")) {
- return domain.substring(0, domain.length() - 5);
- } else {
- return domain;
- }
- }
-
- private class SipCall extends SipCallBase {
- void switchWith(SipCall that) {
- synchronized (SipPhone.class) {
- SipCall tmp = new SipCall();
- tmp.takeOver(this);
- this.takeOver(that);
- that.takeOver(tmp);
- }
- }
-
- private void takeOver(SipCall that) {
- connections = that.connections;
- state = that.state;
- for (Connection c : connections) {
- ((SipConnection) c).changeOwner(this);
- }
- }
-
- @Override
- public Phone getPhone() {
- return SipPhone.this;
- }
-
- @Override
- public List<Connection> getConnections() {
- synchronized (SipPhone.class) {
- // FIXME should return Collections.unmodifiableList();
- return connections;
- }
- }
-
- private CallerInfo getCallerInfo(String number) {
- CallerInfo info = CallerInfo.getCallerInfo(mContext, number);
- if ((info == null) || (info.name == null)) return null;
- Log.v(LOG_TAG, "++******++ got info from contact:");
- Log.v(LOG_TAG, " name: " + info.name);
- Log.v(LOG_TAG, " numb: " + info.phoneNumber);
- Log.v(LOG_TAG, " pres: " + info.numberPresentation);
- return info;
- }
-
- Connection dial(String calleeSipUri) throws SipException {
- CallerInfo info = getCallerInfo(calleeSipUri);
- if (!calleeSipUri.contains("@")) {
- calleeSipUri += "@" + getSipDomain(mProfile);
- if (info != null) info.phoneNumber = calleeSipUri;
- }
- try {
- SipProfile callee =
- new SipProfile.Builder(calleeSipUri).build();
- SipConnection c = new SipConnection(this, callee, info);
- connections.add(c);
- c.dial();
- setState(Call.State.DIALING);
- return c;
- } catch (ParseException e) {
- // TODO: notify someone
- throw new SipException("dial", e);
- }
- }
-
- @Override
- public void hangup() throws CallStateException {
- Log.v(LOG_TAG, "hang up call: " + getState() + ": " + this
- + " on phone " + getPhone());
- CallStateException excp = null;
- for (Connection c : connections) {
- try {
- c.hangup();
- } catch (CallStateException e) {
- excp = e;
- }
- }
- if (excp != null) throw excp;
- setState(State.DISCONNECTING);
- }
-
- void initIncomingCall(SipAudioCall sipAudioCall, boolean makeCallWait) {
- SipProfile callee = sipAudioCall.getPeerProfile();
- CallerInfo info = getCallerInfo(getUriString(callee));
- if (info == null) info = getCallerInfo(callee.getUserName());
- if (info == null) info = getCallerInfo(callee.getDisplayName());
- SipConnection c = new SipConnection(this, callee, info);
- connections.add(c);
-
- Call.State newState = makeCallWait ? State.WAITING : State.INCOMING;
- c.initIncomingCall(sipAudioCall, newState);
-
- setState(newState);
- notifyNewRingingConnectionP(c);
- }
-
- void rejectCall() throws CallStateException {
- hangup();
- }
-
- void acceptCall() throws CallStateException {
- if (this != foregroundCall) {
- throw new CallStateException("acceptCall() in a non-fg call");
- }
- if (connections.size() != 1) {
- throw new CallStateException("acceptCall() in a conf call");
- }
- ((SipConnection) connections.get(0)).acceptCall();
- }
-
- void hold() throws CallStateException {
- AudioGroup audioGroup = getAudioGroup();
- if (audioGroup == null) return;
- audioGroup.setMode(AudioGroup.MODE_ON_HOLD);
- setState(State.HOLDING);
- for (Connection c : connections) ((SipConnection) c).hold();
- }
-
- void unhold() throws CallStateException {
- AudioGroup audioGroup = getAudioGroup();
- if (audioGroup == null) return;
- audioGroup.setMode(AudioGroup.MODE_NORMAL);
- setState(State.ACTIVE);
- for (Connection c : connections) ((SipConnection) c).unhold();
- }
-
- void setMute(boolean muted) {
- AudioGroup audioGroup = getAudioGroup();
- if (audioGroup == null) return;
- audioGroup.setMode(
- muted ? AudioGroup.MODE_MUTED : AudioGroup.MODE_NORMAL);
- }
-
- boolean getMute() {
- AudioGroup audioGroup = getAudioGroup();
- if (audioGroup == null) return false;
- return (audioGroup.getMode() == AudioGroup.MODE_MUTED);
- }
-
- void sendDtmf(char c) {
- AudioGroup audioGroup = getAudioGroup();
- if (audioGroup == null) return;
- audioGroup.sendDtmf(convertDtmf(c));
- }
-
- private int convertDtmf(char c) {
- int code = c - '0';
- if ((code < 0) || (code > 9)) {
- switch (c) {
- case '*': return 10;
- case '#': return 11;
- case 'A': return 12;
- case 'B': return 13;
- case 'C': return 14;
- case 'D': return 15;
- default:
- throw new IllegalArgumentException(
- "invalid DTMF char: " + (int) c);
- }
- }
- return code;
- }
-
- @Override
- protected void setState(State newState) {
- if (state != newState) {
- Log.v(LOG_TAG, "++******++ call state changed: " + state
- + " --> " + newState + ": " + this + ": on phone "
- + getPhone() + " " + connections.size());
-
- if (newState == Call.State.ALERTING) {
- state = newState; // need in ALERTING to enable ringback
- SipPhone.this.startRingbackTone();
- } else if (state == Call.State.ALERTING) {
- SipPhone.this.stopRingbackTone();
- }
- state = newState;
- updatePhoneState();
- notifyPreciseCallStateChanged();
- }
- }
-
- void onConnectionStateChanged(SipConnection conn) {
- // this can be called back when a conf call is formed
- if (state != State.ACTIVE) {
- setState(conn.getState());
- }
- }
-
- void onConnectionEnded(SipConnection conn) {
- // set state to DISCONNECTED only when all conns are disconnected
- if (state != State.DISCONNECTED) {
- boolean allConnectionsDisconnected = true;
- for (Connection c : connections) {
- if (c.getState() != State.DISCONNECTED) {
- allConnectionsDisconnected = false;
- break;
- }
- }
- if (allConnectionsDisconnected) setState(State.DISCONNECTED);
- }
- notifyDisconnectP(conn);
- }
-
- private AudioGroup getAudioGroup() {
- if (connections.isEmpty()) return null;
- return ((SipConnection) connections.get(0)).getAudioGroup();
- }
- }
-
- private class SipConnection extends SipConnectionBase {
- private SipCall mOwner;
- private SipAudioCall mSipAudioCall;
- private Call.State mState = Call.State.IDLE;
- private SipProfile mPeer;
- private boolean mIncoming = false;
-
- private SipAudioCallAdapter mAdapter = new SipAudioCallAdapter() {
- @Override
- protected void onCallEnded(DisconnectCause cause) {
- if (getDisconnectCause() != DisconnectCause.LOCAL) {
- setDisconnectCause(cause);
- }
- synchronized (SipPhone.class) {
- setState(Call.State.DISCONNECTED);
- mOwner.onConnectionEnded(SipConnection.this);
- Log.v(LOG_TAG, "-------- connection ended: "
- + mPeer.getUriString() + ": "
- + mSipAudioCall.getState() + ", cause: "
- + getDisconnectCause() + ", on phone "
- + getPhone());
- }
- }
-
- @Override
- public void onChanged(SipAudioCall call) {
- synchronized (SipPhone.class) {
- Call.State newState = getCallStateFrom(call);
- if (mState == newState) return;
- if (newState == Call.State.INCOMING) {
- setState(mOwner.getState()); // INCOMING or WAITING
- } else {
- setState(newState);
- }
- mOwner.onConnectionStateChanged(SipConnection.this);
- Log.v(LOG_TAG, "++******++ connection state changed: "
- + mPeer.getUriString() + ": " + mState
- + " on phone " + getPhone());
- }
- }
-
- @Override
- protected void onError(String errorMessage) {
- Log.w(LOG_TAG, "SIP error: " + errorMessage);
- if (mSipAudioCall.isInCall()) {
- // Don't end the call when in call.
- // TODO: how to deliver the error to PhoneApp
- return;
- }
-
- // FIXME: specify error
- onCallEnded(DisconnectCause.ERROR_UNSPECIFIED);
- }
- };
-
- public SipConnection(SipCall owner, SipProfile callee,
- CallerInfo info) {
- super(getUriString(callee));
- mOwner = owner;
- mPeer = callee;
- if (info == null) info = createCallerInfo();
- setUserData(info);
- }
-
- private CallerInfo createCallerInfo() {
- SipProfile p = mPeer;
- String name = p.getDisplayName();
- if (TextUtils.isEmpty(name)) name = p.getUserName();
- CallerInfo info = new CallerInfo();
- info.name = name;
- info.phoneNumber = getUriString(p);
- return info;
- }
-
- void initIncomingCall(SipAudioCall sipAudioCall, Call.State newState) {
- setState(newState);
- mSipAudioCall = sipAudioCall;
- sipAudioCall.setListener(mAdapter); // call back to set state
- mIncoming = true;
- }
-
- void acceptCall() throws CallStateException {
- try {
- mSipAudioCall.answerCall();
- } catch (SipException e) {
- throw new CallStateException("acceptCall(): " + e);
- }
- }
-
- void changeOwner(SipCall owner) {
- mOwner = owner;
- }
-
- AudioGroup getAudioGroup() {
- if (mSipAudioCall == null) return null;
- return mSipAudioCall.getAudioGroup();
- }
-
- void dial() throws SipException {
- setState(Call.State.DIALING);
- mSipAudioCall = mSipManager.makeAudioCall(mContext, mProfile,
- mPeer, null);
- mSipAudioCall.setRingbackToneEnabled(false);
- mSipAudioCall.setListener(mAdapter);
- }
-
- void hold() throws CallStateException {
- try {
- mSipAudioCall.holdCall();
- } catch (SipException e) {
- throw new CallStateException("hold(): " + e);
- }
- }
-
- void unhold() throws CallStateException {
- try {
- mSipAudioCall.continueCall();
- } catch (SipException e) {
- throw new CallStateException("unhold(): " + e);
- }
- }
-
- @Override
- protected void setState(Call.State state) {
- if (state == mState) return;
- super.setState(state);
- mState = state;
- }
-
- @Override
- public Call.State getState() {
- return mState;
- }
-
- @Override
- public boolean isIncoming() {
- return mIncoming;
- }
-
- @Override
- public String getAddress() {
- return getUriString(mPeer);
- }
-
- @Override
- public SipCall getCall() {
- return mOwner;
- }
-
- @Override
- protected Phone getPhone() {
- return mOwner.getPhone();
- }
-
- @Override
- public void hangup() throws CallStateException {
- Log.v(LOG_TAG, "hangup conn: " + mPeer.getUriString() + ": "
- + ": on phone " + getPhone());
- try {
- mSipAudioCall.endCall();
- setState(Call.State.DISCONNECTING);
- setDisconnectCause(DisconnectCause.LOCAL);
- } catch (SipException e) {
- throw new CallStateException("hangup(): " + e);
- }
- }
-
- @Override
- public void separate() throws CallStateException {
- // TODO: what's this for SIP?
- /*
- if (!disconnected) {
- owner.separate(this);
- } else {
- throw new CallStateException ("disconnected");
- }
- */
- }
-
- }
-
- private static Call.State getCallStateFrom(SipAudioCall sipAudioCall) {
- if (sipAudioCall.isOnHold()) return Call.State.HOLDING;
- SipSessionState sessionState = sipAudioCall.getState();
- switch (sessionState) {
- case READY_TO_CALL: return Call.State.IDLE;
- case INCOMING_CALL:
- case INCOMING_CALL_ANSWERING: return Call.State.INCOMING;
- case OUTGOING_CALL: return Call.State.DIALING;
- case OUTGOING_CALL_RING_BACK: return Call.State.ALERTING;
- case OUTGOING_CALL_CANCELING: return Call.State.DISCONNECTING;
- case IN_CALL: return Call.State.ACTIVE;
- default:
- Log.w(LOG_TAG, "illegal connection state: " + sessionState);
- return Call.State.DISCONNECTED;
- }
- }
-
- private abstract class SipAudioCallAdapter extends SipAudioCall.Adapter {
- protected abstract void onCallEnded(Connection.DisconnectCause cause);
- protected abstract void onError(String errorMessage);
-
- @Override
- public void onCallEnded(SipAudioCall call) {
- onCallEnded(Connection.DisconnectCause.NORMAL);
- }
-
- @Override
- public void onCallBusy(SipAudioCall call) {
- onCallEnded(Connection.DisconnectCause.BUSY);
- }
-
- @Override
- public void onError(SipAudioCall call, String errorMessage) {
- onError(errorMessage);
- }
- }
-}
diff --git a/phone/src2/com/android/internal/telephony/sip/SipPhoneBase.java b/phone/src2/com/android/internal/telephony/sip/SipPhoneBase.java
deleted file mode 100755
index 36d65db..0000000
--- a/phone/src2/com/android/internal/telephony/sip/SipPhoneBase.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony.sip;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Registrant;
-import android.os.RegistrantList;
-import android.os.SystemProperties;
-import android.preference.PreferenceManager;
-import android.provider.Telephony;
-import android.telephony.CellLocation;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.ServiceState;
-import android.telephony.SignalStrength;
-import android.text.TextUtils;
-import android.util.Log;
-
-import static com.android.internal.telephony.CommandsInterface.CF_ACTION_DISABLE;
-import static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE;
-import static com.android.internal.telephony.CommandsInterface.CF_ACTION_ERASURE;
-import static com.android.internal.telephony.CommandsInterface.CF_ACTION_REGISTRATION;
-import static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL;
-import static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL_CONDITIONAL;
-import static com.android.internal.telephony.CommandsInterface.CF_REASON_NO_REPLY;
-import static com.android.internal.telephony.CommandsInterface.CF_REASON_NOT_REACHABLE;
-import static com.android.internal.telephony.CommandsInterface.CF_REASON_BUSY;
-import static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL;
-import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_BASEBAND_VERSION;
-
-import com.android.internal.telephony.Call;
-import com.android.internal.telephony.CallStateException;
-import com.android.internal.telephony.CommandsInterface;
-import com.android.internal.telephony.Connection;
-import com.android.internal.telephony.DataConnection;
-import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.IccFileHandler;
-import com.android.internal.telephony.IccPhoneBookInterfaceManager;
-import com.android.internal.telephony.IccSmsInterfaceManager;
-import com.android.internal.telephony.MmiCode;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneBase;
-import com.android.internal.telephony.PhoneNotifier;
-import com.android.internal.telephony.PhoneProxy;
-import com.android.internal.telephony.PhoneSubInfo;
-import com.android.internal.telephony.TelephonyProperties;
-//import com.android.internal.telephony.UUSInfo;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-abstract class SipPhoneBase extends PhoneBase {
- // NOTE that LOG_TAG here is "Sip", which means that log messages
- // from this file will go into the radio log rather than the main
- // log. (Use "adb logcat -b radio" to see them.)
- static final String LOG_TAG = "SipPhone";
- private static final boolean LOCAL_DEBUG = true;
-
- //SipCallTracker mCT;
- PhoneSubInfo mSubInfo;
-
- Registrant mPostDialHandler;
-
- final RegistrantList mRingbackRegistrants = new RegistrantList();
-
- private State state = State.IDLE;
-
- public SipPhoneBase(Context context, PhoneNotifier notifier) {
- super(notifier, context, new SipCommandInterface(context), false);
-
- // FIXME: what's this for SIP?
- //Change the system property
- //SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
- // new Integer(Phone.PHONE_TYPE_GSM).toString());
- }
-
- public abstract Call getForegroundCall();
-
- public abstract Call getBackgroundCall();
-
- public abstract Call getRingingCall();
-
- /*
- public Connection dial(String dialString, UUSInfo uusInfo)
- throws CallStateException {
- // ignore UUSInfo
- return dial(dialString);
- }
- */
-
- void migrateFrom(SipPhoneBase from) {
- migrate(mRingbackRegistrants, from.mRingbackRegistrants);
- migrate(mPreciseCallStateRegistrants, from.mPreciseCallStateRegistrants);
- migrate(mNewRingingConnectionRegistrants, from.mNewRingingConnectionRegistrants);
- migrate(mIncomingRingRegistrants, from.mIncomingRingRegistrants);
- migrate(mDisconnectRegistrants, from.mDisconnectRegistrants);
- migrate(mServiceStateRegistrants, from.mServiceStateRegistrants);
- migrate(mMmiCompleteRegistrants, from.mMmiCompleteRegistrants);
- migrate(mMmiRegistrants, from.mMmiRegistrants);
- migrate(mUnknownConnectionRegistrants, from.mUnknownConnectionRegistrants);
- migrate(mSuppServiceFailedRegistrants, from.mSuppServiceFailedRegistrants);
- }
-
- static void migrate(RegistrantList to, RegistrantList from) {
- from.removeCleared();
- for (int i = 0, n = from.size(); i < n; i++) {
- to.add((Registrant) from.get(i));
- }
- }
-
- @Override
- public void registerForRingbackTone(Handler h, int what, Object obj) {
- mRingbackRegistrants.addUnique(h, what, obj);
- }
-
- @Override
- public void unregisterForRingbackTone(Handler h) {
- mRingbackRegistrants.remove(h);
- }
-
- protected void startRingbackTone() {
- AsyncResult result = new AsyncResult(null, new Boolean(true), null);
- mRingbackRegistrants.notifyRegistrants(result);
- }
-
- protected void stopRingbackTone() {
- AsyncResult result = new AsyncResult(null, new Boolean(false), null);
- mRingbackRegistrants.notifyRegistrants(result);
- }
-
- public void dispose() {
- mIsTheCurrentActivePhone = false;
- mSubInfo.dispose();
- }
-
- public void removeReferences() {
- mSubInfo = null;
- }
-
- public ServiceState getServiceState() {
- // FIXME: we may need to provide this when data connectivity is lost
- // or when server is down
- ServiceState s = new ServiceState();
- s.setState(ServiceState.STATE_IN_SERVICE);
- return s;
- }
-
- public CellLocation getCellLocation() {
- return null; //mSST.cellLoc;
- }
-
- public State getState() {
- return state;
- }
-
- public String getPhoneName() {
- return "SIP";
- }
-
- public int getPhoneType() {
- // FIXME: add SIP phone type
- return Phone.PHONE_TYPE_GSM;
- }
-
- public SignalStrength getSignalStrength() {
- return new SignalStrength();
- }
-
- public boolean getMessageWaitingIndicator() {
- return false;
- }
-
- public boolean getCallForwardingIndicator() {
- return false;
- }
-
- public List<? extends MmiCode> getPendingMmiCodes() {
- return new ArrayList<MmiCode>(0);
- }
-
- public DataState getDataConnectionState() {
- return DataState.DISCONNECTED;
- }
-
- public DataState getDataConnectionState(String apnType) {
- return DataState.DISCONNECTED;
- }
-
- public DataActivityState getDataActivityState() {
- return DataActivityState.NONE;
- }
-
- /**
- * Notify any interested party of a Phone state change {@link Phone.State}
- */
- void notifyPhoneStateChanged() {
- mNotifier.notifyPhoneState(this);
- }
-
- /**
- * Notify registrants of a change in the call state. This notifies changes in {@link Call.State}
- * Use this when changes in the precise call state are needed, else use notifyPhoneStateChanged.
- */
- void notifyPreciseCallStateChanged() {
- /* we'd love it if this was package-scoped*/
- super.notifyPreciseCallStateChangedP();
- }
-
- void notifyNewRingingConnection(Connection c) {
- /* we'd love it if this was package-scoped*/
- super.notifyNewRingingConnectionP(c);
- }
-
- void notifyDisconnect(Connection cn) {
- mDisconnectRegistrants.notifyResult(cn);
- }
-
- void notifyUnknownConnection() {
- mUnknownConnectionRegistrants.notifyResult(this);
- }
-
- void notifySuppServiceFailed(SuppService code) {
- mSuppServiceFailedRegistrants.notifyResult(code);
- }
-
- void notifyServiceStateChanged(ServiceState ss) {
- super.notifyServiceStateChangedP(ss);
- }
-
- public void notifyCallForwardingIndicator() {
- mNotifier.notifyCallForwardingChanged(this);
- }
-
- public boolean canDial() {
- int serviceState = getServiceState().getState();
- Log.v(LOG_TAG, "canDial(): serviceState = " + serviceState);
- if (serviceState == ServiceState.STATE_POWER_OFF) return false;
-
- String disableCall = SystemProperties.get(
- TelephonyProperties.PROPERTY_DISABLE_CALL, "false");
- Log.v(LOG_TAG, "canDial(): disableCall = " + disableCall);
- if (disableCall.equals("true")) return false;
-
- Log.v(LOG_TAG, "canDial(): ringingCall: " + getRingingCall().getState());
- Log.v(LOG_TAG, "canDial(): foregndCall: " + getForegroundCall().getState());
- Log.v(LOG_TAG, "canDial(): backgndCall: " + getBackgroundCall().getState());
- return !getRingingCall().isRinging()
- && (!getForegroundCall().getState().isAlive()
- || !getBackgroundCall().getState().isAlive());
- }
-
- public boolean handleInCallMmiCommands(String dialString)
- throws CallStateException {
- return false;
- }
-
- boolean isInCall() {
- Call.State foregroundCallState = getForegroundCall().getState();
- Call.State backgroundCallState = getBackgroundCall().getState();
- Call.State ringingCallState = getRingingCall().getState();
-
- return (foregroundCallState.isAlive() || backgroundCallState.isAlive()
- || ringingCallState.isAlive());
- }
-
- public boolean handlePinMmi(String dialString) {
- return false;
- }
-
- public void sendUssdResponse(String ussdMessge) {
- }
-
- public void registerForSuppServiceNotification(
- Handler h, int what, Object obj) {
- }
-
- public void unregisterForSuppServiceNotification(Handler h) {
- }
-
- public void setRadioPower(boolean power) {
- }
-
- public String getVoiceMailNumber() {
- return null;
- }
-
- public String getVoiceMailAlphaTag() {
- return null;
- }
-
- public String getDeviceId() {
- return null;
- }
-
- public String getDeviceSvn() {
- return null;
- }
-
- public String getEsn() {
- Log.e(LOG_TAG, "[SipPhone] getEsn() is a CDMA method");
- return "0";
- }
-
- public String getMeid() {
- Log.e(LOG_TAG, "[SipPhone] getMeid() is a CDMA method");
- return "0";
- }
-
- public String getSubscriberId() {
- return null;
- }
-
- public String getIccSerialNumber() {
- return null;
- }
-
- public String getLine1Number() {
- return null;
- }
-
- public String getLine1AlphaTag() {
- return null;
- }
-
- public void setLine1Number(String alphaTag, String number, Message onComplete) {
- // FIXME: what to reply for SIP?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
-
- public void setVoiceMailNumber(String alphaTag, String voiceMailNumber,
- Message onComplete) {
- // FIXME: what to reply for SIP?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
-
- private boolean isValidCommandInterfaceCFReason(int commandInterfaceCFReason) {
- switch (commandInterfaceCFReason) {
- case CF_REASON_UNCONDITIONAL:
- case CF_REASON_BUSY:
- case CF_REASON_NO_REPLY:
- case CF_REASON_NOT_REACHABLE:
- case CF_REASON_ALL:
- case CF_REASON_ALL_CONDITIONAL:
- return true;
- default:
- return false;
- }
- }
-
- private boolean isValidCommandInterfaceCFAction (int commandInterfaceCFAction) {
- switch (commandInterfaceCFAction) {
- case CF_ACTION_DISABLE:
- case CF_ACTION_ENABLE:
- case CF_ACTION_REGISTRATION:
- case CF_ACTION_ERASURE:
- return true;
- default:
- return false;
- }
- }
-
- protected boolean isCfEnable(int action) {
- return (action == CF_ACTION_ENABLE) || (action == CF_ACTION_REGISTRATION);
- }
-
- public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {
- if (isValidCommandInterfaceCFReason(commandInterfaceCFReason)) {
- // FIXME: what to reply?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
- }
-
- public void setCallForwardingOption(int commandInterfaceCFAction,
- int commandInterfaceCFReason, String dialingNumber,
- int timerSeconds, Message onComplete) {
- if (isValidCommandInterfaceCFAction(commandInterfaceCFAction)
- && isValidCommandInterfaceCFReason(commandInterfaceCFReason)) {
- // FIXME: what to reply?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
- }
-
- public void getOutgoingCallerIdDisplay(Message onComplete) {
- // FIXME: what to reply?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
-
- public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode,
- Message onComplete) {
- // FIXME: what's this for SIP?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
-
- public void getCallWaiting(Message onComplete) {
- // FIXME: what to reply?
- AsyncResult.forMessage(onComplete, null, null);
- onComplete.sendToTarget();
- }
-
- public void setCallWaiting(boolean enable, Message onComplete) {
- // FIXME: what to reply?
- Log.e(LOG_TAG, "call waiting not supported");
- }
-
- public boolean getIccRecordsLoaded() {
- return false;
- }
-
- public IccCard getIccCard() {
- return null;
- }
-
- public void getAvailableNetworks(Message response) {
- // FIXME: what to reply?
- }
-
- public void setNetworkSelectionModeAutomatic(Message response) {
- // FIXME: what to reply?
- }
-
- public void selectNetworkManually(
- com.android.internal.telephony.gsm.NetworkInfo network,
- Message response) {
- // FIXME: what to reply?
- }
-
- public void getNeighboringCids(Message response) {
- // FIXME: what to reply?
- }
-
- public void setOnPostDialCharacter(Handler h, int what, Object obj) {
- mPostDialHandler = new Registrant(h, what, obj);
- }
-
- public void getDataCallList(Message response) {
- // FIXME: what to reply?
- }
-
- public List<DataConnection> getCurrentDataConnectionList () {
- return null;
- }
-
- public void updateServiceLocation() {
- }
-
- public void enableLocationUpdates() {
- }
-
- public void disableLocationUpdates() {
- }
-
- public boolean getDataRoamingEnabled() {
- return false;
- }
-
- public void setDataRoamingEnabled(boolean enable) {
- }
-
- public boolean enableDataConnectivity() {
- return false;
- }
-
- public boolean disableDataConnectivity() {
- return false;
- }
-
- public boolean isDataConnectivityPossible() {
- return false;
- }
-
- boolean updateCurrentCarrierInProvider() {
- return false;
- }
-
- public void saveClirSetting(int commandInterfaceCLIRMode) {
- // FIXME: what's this for SIP?
- }
-
- /**
- * Retrieves the PhoneSubInfo of the SipPhone
- */
- public PhoneSubInfo getPhoneSubInfo(){
- return mSubInfo;
- }
-
- /** {@inheritDoc} */
- public IccSmsInterfaceManager getIccSmsInterfaceManager(){
- return null;
- }
-
- /** {@inheritDoc} */
- public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){
- return null;
- }
-
- /** {@inheritDoc} */
- public IccFileHandler getIccFileHandler(){
- return null;
- }
-
- public void activateCellBroadcastSms(int activate, Message response) {
- Log.e(LOG_TAG, "Error! This functionality is not implemented for SIP.");
- }
-
- public void getCellBroadcastSmsConfig(Message response) {
- Log.e(LOG_TAG, "Error! This functionality is not implemented for SIP.");
- }
-
- public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response){
- Log.e(LOG_TAG, "Error! This functionality is not implemented for SIP.");
- }
-
- void updatePhoneState() {
- State oldState = state;
-
- if (getRingingCall().isRinging()) {
- state = State.RINGING;
- } else if (getForegroundCall().isIdle()
- && getBackgroundCall().isIdle()) {
- state = State.IDLE;
- } else {
- state = State.OFFHOOK;
- }
- Log.e(LOG_TAG, " ^^^^^^ new phone state: " + state);
-
- if (state != oldState) {
- notifyPhoneStateChanged();
- }
- }
-}
diff --git a/phone/src2/com/android/internal/telephony/sip/SipPhoneFactory.java b/phone/src2/com/android/internal/telephony/sip/SipPhoneFactory.java
deleted file mode 100644
index c9e9762..0000000
--- a/phone/src2/com/android/internal/telephony/sip/SipPhoneFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony.sip;
-
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneNotifier;
-
-import android.content.Context;
-import android.net.sip.SipProfile;
-import android.util.Log;
-
-import java.text.ParseException;
-
-/**
- * @hide
- */
-public class SipPhoneFactory {
- private static PhoneNotifier sPhoneNotifier = makeDefaultPhoneNotifier();
- private static Context sContext;
-
- public static void makeDefaultPhones(Context context) {
- makeDefaultPhone(context);
- }
-
- public static void makeDefaultPhone(Context context) {
- sContext = context;
- SipPhoneProxy.getInstance().setPhone(
- makePhone("sip:anonymous@localhost"));
- }
-
- public static Phone getDefaultPhone() {
- return SipPhoneProxy.getInstance();
- }
-
- public static SipPhone makePhone(String sipProfileUri) {
- try {
- SipProfile profile = new SipProfile.Builder(sipProfileUri).build();
- return new SipPhone(sContext, sPhoneNotifier, profile);
- } catch (ParseException e) {
- Log.v("SipPhoneProxy", "setPhone", e);
- return null;
- }
- }
-
- private static PhoneNotifier makeDefaultPhoneNotifier() {
- try {
- return new com.android.internal.telephony.SipPhoneNotifier();
- } catch (Error e) {
- Log.e("SipPhoneProxy", "makeDefaultPhoneNotifier", e);
- throw e;
- }
- }
-}
diff --git a/phone/src2/com/android/internal/telephony/sip/SipPhoneProxy.java b/phone/src2/com/android/internal/telephony/sip/SipPhoneProxy.java
deleted file mode 100644
index 778b3ae..0000000
--- a/phone/src2/com/android/internal/telephony/sip/SipPhoneProxy.java
+++ /dev/null
@@ -1,745 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.internal.telephony.sip;
-
-import com.android.internal.telephony.*;
-import com.android.internal.telephony.gsm.NetworkInfo;
-import com.android.internal.telephony.test.SimulatedRadioControl;
-
-import android.content.Context;
-import android.os.Handler;
-import android.os.Message;
-import android.telephony.CellLocation;
-import android.telephony.ServiceState;
-import android.telephony.SignalStrength;
-import android.util.Log;
-
-import java.util.List;
-
-/**
- * Temporary. Will be removed after integrating with CallManager.
- * (TODO)
- * @hide
- */
-public class SipPhoneProxy implements Phone {
- private static final String LOG_TAG = "PHONE";
-
- private static SipPhoneProxy sPhoneProxy = new SipPhoneProxy();
-
- public static SipPhoneProxy getInstance() {
- return sPhoneProxy;
- }
-
- private SipPhone mActivePhone;
- private CallProxy mRingingCall = new CallProxy();
- private CallProxy mForegroundCall = new CallProxy();
- private CallProxy mBackgroundCall = new CallProxy();
-
- private SipPhoneProxy() {
- }
-
- public void onNewCall(Object call) {
- if (mActivePhone.canTake(call)) {
- Log.v("SipPhoneProxy", "onNewCall(): call taken: " + call);
- } else {
- Log.v("SipPhoneProxy", "onNewCall(): call dropped: " + call);
- }
- }
-
- public synchronized void setPhone(SipPhone phone) {
- if (phone == null) return;
- if (mActivePhone != null) phone.migrateFrom(mActivePhone);
- mActivePhone = phone;
- mForegroundCall.setTarget(phone.getForegroundCall());
- mBackgroundCall.setTarget(phone.getBackgroundCall());
- mRingingCall.setTarget(phone.getRingingCall());
- }
-
- public synchronized Call getForegroundCall() {
- return mForegroundCall;
- }
-
- public synchronized Call getBackgroundCall() {
- return mBackgroundCall;
- }
-
- public synchronized Call getRingingCall() {
- return mRingingCall;
- }
-
-
- public ServiceState getServiceState() {
- return mActivePhone.getServiceState();
- }
-
- public CellLocation getCellLocation() {
- return mActivePhone.getCellLocation();
- }
-
- public DataState getDataConnectionState() {
- return mActivePhone.getDataConnectionState();
- }
-
- public DataActivityState getDataActivityState() {
- return mActivePhone.getDataActivityState();
- }
-
- public Context getContext() {
- return mActivePhone.getContext();
- }
-
- public void disableDnsCheck(boolean b) {
- mActivePhone.disableDnsCheck(b);
- }
-
- public boolean isDnsCheckDisabled() {
- return mActivePhone.isDnsCheckDisabled();
- }
-
- public State getState() {
- return mActivePhone.getState();
- }
-
- public String getPhoneName() {
- return mActivePhone.getPhoneName();
- }
-
- public int getPhoneType() {
- return mActivePhone.getPhoneType();
- }
-
- public String[] getActiveApnTypes() {
- return mActivePhone.getActiveApnTypes();
- }
-
- public String getActiveApn() {
- return mActivePhone.getActiveApn();
- }
-
- public SignalStrength getSignalStrength() {
- return mActivePhone.getSignalStrength();
- }
-
- public void registerForUnknownConnection(Handler h, int what, Object obj) {
- mActivePhone.registerForUnknownConnection(h, what, obj);
- }
-
- public void unregisterForUnknownConnection(Handler h) {
- mActivePhone.unregisterForUnknownConnection(h);
- }
-
- public void registerForPreciseCallStateChanged(Handler h, int what, Object obj) {
- mActivePhone.registerForPreciseCallStateChanged(h, what, obj);
- }
-
- public void unregisterForPreciseCallStateChanged(Handler h) {
- mActivePhone.unregisterForPreciseCallStateChanged(h);
- }
-
- public void registerForNewRingingConnection(Handler h, int what, Object obj) {
- mActivePhone.registerForNewRingingConnection(h, what, obj);
- }
-
- public void unregisterForNewRingingConnection(Handler h) {
- mActivePhone.unregisterForNewRingingConnection(h);
- }
-
- public void registerForIncomingRing(Handler h, int what, Object obj) {
- mActivePhone.registerForIncomingRing(h, what, obj);
- }
-
- public void unregisterForIncomingRing(Handler h) {
- mActivePhone.unregisterForIncomingRing(h);
- }
-
- public void registerForDisconnect(Handler h, int what, Object obj) {
- mActivePhone.registerForDisconnect(h, what, obj);
- }
-
- public void unregisterForDisconnect(Handler h) {
- mActivePhone.unregisterForDisconnect(h);
- }
-
- public void registerForMmiInitiate(Handler h, int what, Object obj) {
- mActivePhone.registerForMmiInitiate(h, what, obj);
- }
-
- public void unregisterForMmiInitiate(Handler h) {
- mActivePhone.unregisterForMmiInitiate(h);
- }
-
- public void registerForMmiComplete(Handler h, int what, Object obj) {
- mActivePhone.registerForMmiComplete(h, what, obj);
- }
-
- public void unregisterForMmiComplete(Handler h) {
- mActivePhone.unregisterForMmiComplete(h);
- }
-
- public List<? extends MmiCode> getPendingMmiCodes() {
- return mActivePhone.getPendingMmiCodes();
- }
-
- public void sendUssdResponse(String ussdMessge) {
- mActivePhone.sendUssdResponse(ussdMessge);
- }
-
- public void registerForServiceStateChanged(Handler h, int what, Object obj) {
- mActivePhone.registerForServiceStateChanged(h, what, obj);
- }
-
- public void unregisterForServiceStateChanged(Handler h) {
- mActivePhone.unregisterForServiceStateChanged(h);
- }
-
- public void registerForSuppServiceNotification(Handler h, int what, Object obj) {
- mActivePhone.registerForSuppServiceNotification(h, what, obj);
- }
-
- public void unregisterForSuppServiceNotification(Handler h) {
- mActivePhone.unregisterForSuppServiceNotification(h);
- }
-
- public void registerForSuppServiceFailed(Handler h, int what, Object obj) {
- mActivePhone.registerForSuppServiceFailed(h, what, obj);
- }
-
- public void unregisterForSuppServiceFailed(Handler h) {
- mActivePhone.unregisterForSuppServiceFailed(h);
- }
-
- public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj){
- mActivePhone.registerForInCallVoicePrivacyOn(h,what,obj);
- }
-
- public void unregisterForInCallVoicePrivacyOn(Handler h){
- mActivePhone.unregisterForInCallVoicePrivacyOn(h);
- }
-
- public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj){
- mActivePhone.registerForInCallVoicePrivacyOff(h,what,obj);
- }
-
- public void unregisterForInCallVoicePrivacyOff(Handler h){
- mActivePhone.unregisterForInCallVoicePrivacyOff(h);
- }
-
- public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) {
- mActivePhone.registerForCdmaOtaStatusChange(h,what,obj);
- }
-
- public void unregisterForCdmaOtaStatusChange(Handler h) {
- mActivePhone.unregisterForCdmaOtaStatusChange(h);
- }
-
- public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
- mActivePhone.registerForSubscriptionInfoReady(h, what, obj);
- }
-
- public void unregisterForSubscriptionInfoReady(Handler h) {
- mActivePhone.unregisterForSubscriptionInfoReady(h);
- }
-
- public void registerForEcmTimerReset(Handler h, int what, Object obj) {
- mActivePhone.registerForEcmTimerReset(h,what,obj);
- }
-
- public void unregisterForEcmTimerReset(Handler h) {
- mActivePhone.unregisterForEcmTimerReset(h);
- }
-
- public void registerForRingbackTone(Handler h, int what, Object obj) {
- mActivePhone.registerForRingbackTone(h,what,obj);
- }
-
- public void unregisterForRingbackTone(Handler h) {
- mActivePhone.unregisterForRingbackTone(h);
- }
-
- public void registerForResendIncallMute(Handler h, int what, Object obj) {
- mActivePhone.registerForResendIncallMute(h,what,obj);
- }
-
- public void unregisterForResendIncallMute(Handler h) {
- mActivePhone.unregisterForResendIncallMute(h);
- }
-
- public boolean getIccRecordsLoaded() {
- return mActivePhone.getIccRecordsLoaded();
- }
-
- public IccCard getIccCard() {
- return mActivePhone.getIccCard();
- }
-
- public void acceptCall() throws CallStateException {
- mActivePhone.acceptCall();
- }
-
- public void rejectCall() throws CallStateException {
- mActivePhone.rejectCall();
- }
-
- public void switchHoldingAndActive() throws CallStateException {
- mActivePhone.switchHoldingAndActive();
- }
-
- public boolean canConference() {
- return mActivePhone.canConference();
- }
-
- public void conference() throws CallStateException {
- mActivePhone.conference();
- }
-
- public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) {
- mActivePhone.enableEnhancedVoicePrivacy(enable, onComplete);
- }
-
- public void getEnhancedVoicePrivacy(Message onComplete) {
- mActivePhone.getEnhancedVoicePrivacy(onComplete);
- }
-
- public boolean canTransfer() {
- return mActivePhone.canTransfer();
- }
-
- public void explicitCallTransfer() throws CallStateException {
- mActivePhone.explicitCallTransfer();
- }
-
- public void clearDisconnected() {
- mActivePhone.clearDisconnected();
- }
-
- public Connection dial(String dialString) throws CallStateException {
- return mActivePhone.dial(dialString);
- }
-
- public boolean handlePinMmi(String dialString) {
- return mActivePhone.handlePinMmi(dialString);
- }
-
- public boolean handleInCallMmiCommands(String command) throws CallStateException {
- return mActivePhone.handleInCallMmiCommands(command);
- }
-
- public void sendDtmf(char c) {
- mActivePhone.sendDtmf(c);
- }
-
- public void startDtmf(char c) {
- mActivePhone.startDtmf(c);
- }
-
- public void stopDtmf() {
- mActivePhone.stopDtmf();
- }
-
- public void setRadioPower(boolean power) {
- mActivePhone.setRadioPower(power);
- }
-
- public boolean getMessageWaitingIndicator() {
- return mActivePhone.getMessageWaitingIndicator();
- }
-
- public boolean getCallForwardingIndicator() {
- return mActivePhone.getCallForwardingIndicator();
- }
-
- public String getLine1Number() {
- return mActivePhone.getLine1Number();
- }
-
- public String getCdmaMin() {
- return mActivePhone.getCdmaMin();
- }
-
- public boolean isMinInfoReady() {
- return mActivePhone.isMinInfoReady();
- }
-
- public String getCdmaPrlVersion() {
- return mActivePhone.getCdmaPrlVersion();
- }
-
- public String getLine1AlphaTag() {
- return mActivePhone.getLine1AlphaTag();
- }
-
- public void setLine1Number(String alphaTag, String number, Message onComplete) {
- mActivePhone.setLine1Number(alphaTag, number, onComplete);
- }
-
- public String getVoiceMailNumber() {
- return mActivePhone.getVoiceMailNumber();
- }
-
- /** @hide */
- public int getVoiceMessageCount(){
- return mActivePhone.getVoiceMessageCount();
- }
-
- public String getVoiceMailAlphaTag() {
- return mActivePhone.getVoiceMailAlphaTag();
- }
-
- public void setVoiceMailNumber(String alphaTag,String voiceMailNumber,
- Message onComplete) {
- mActivePhone.setVoiceMailNumber(alphaTag, voiceMailNumber, onComplete);
- }
-
- public void getCallForwardingOption(int commandInterfaceCFReason,
- Message onComplete) {
- mActivePhone.getCallForwardingOption(commandInterfaceCFReason,
- onComplete);
- }
-
- public void setCallForwardingOption(int commandInterfaceCFReason,
- int commandInterfaceCFAction, String dialingNumber,
- int timerSeconds, Message onComplete) {
- mActivePhone.setCallForwardingOption(commandInterfaceCFReason,
- commandInterfaceCFAction, dialingNumber, timerSeconds, onComplete);
- }
-
- public void getOutgoingCallerIdDisplay(Message onComplete) {
- mActivePhone.getOutgoingCallerIdDisplay(onComplete);
- }
-
- public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode,
- Message onComplete) {
- mActivePhone.setOutgoingCallerIdDisplay(commandInterfaceCLIRMode,
- onComplete);
- }
-
- public void getCallWaiting(Message onComplete) {
- mActivePhone.getCallWaiting(onComplete);
- }
-
- public void setCallWaiting(boolean enable, Message onComplete) {
- mActivePhone.setCallWaiting(enable, onComplete);
- }
-
- public void getAvailableNetworks(Message response) {
- mActivePhone.getAvailableNetworks(response);
- }
-
- public void setNetworkSelectionModeAutomatic(Message response) {
- mActivePhone.setNetworkSelectionModeAutomatic(response);
- }
-
- public void selectNetworkManually(NetworkInfo network, Message response) {
- mActivePhone.selectNetworkManually(network, response);
- }
-
- public void setPreferredNetworkType(int networkType, Message response) {
- mActivePhone.setPreferredNetworkType(networkType, response);
- }
-
- public void getPreferredNetworkType(Message response) {
- mActivePhone.getPreferredNetworkType(response);
- }
-
- public void getNeighboringCids(Message response) {
- mActivePhone.getNeighboringCids(response);
- }
-
- public void setOnPostDialCharacter(Handler h, int what, Object obj) {
- mActivePhone.setOnPostDialCharacter(h, what, obj);
- }
-
- public void setMute(boolean muted) {
- mActivePhone.setMute(muted);
- }
-
- public boolean getMute() {
- return mActivePhone.getMute();
- }
-
- public void invokeOemRilRequestRaw(byte[] data, Message response) {
- mActivePhone.invokeOemRilRequestRaw(data, response);
- }
-
- public void invokeOemRilRequestStrings(String[] strings, Message response) {
- mActivePhone.invokeOemRilRequestStrings(strings, response);
- }
-
- public void getDataCallList(Message response) {
- mActivePhone.getDataCallList(response);
- }
-
- public List<DataConnection> getCurrentDataConnectionList() {
- return mActivePhone.getCurrentDataConnectionList();
- }
-
- public void updateServiceLocation() {
- mActivePhone.updateServiceLocation();
- }
-
- public void enableLocationUpdates() {
- mActivePhone.enableLocationUpdates();
- }
-
- public void disableLocationUpdates() {
- mActivePhone.disableLocationUpdates();
- }
-
- public void setUnitTestMode(boolean f) {
- mActivePhone.setUnitTestMode(f);
- }
-
- public boolean getUnitTestMode() {
- return mActivePhone.getUnitTestMode();
- }
-
- public void setBandMode(int bandMode, Message response) {
- mActivePhone.setBandMode(bandMode, response);
- }
-
- public void queryAvailableBandMode(Message response) {
- mActivePhone.queryAvailableBandMode(response);
- }
-
- public boolean getDataRoamingEnabled() {
- return mActivePhone.getDataRoamingEnabled();
- }
-
- public void setDataRoamingEnabled(boolean enable) {
- mActivePhone.setDataRoamingEnabled(enable);
- }
-
- public void queryCdmaRoamingPreference(Message response) {
- mActivePhone.queryCdmaRoamingPreference(response);
- }
-
- public void setCdmaRoamingPreference(int cdmaRoamingType, Message response) {
- mActivePhone.setCdmaRoamingPreference(cdmaRoamingType, response);
- }
-
- public void setCdmaSubscription(int cdmaSubscriptionType, Message response) {
- mActivePhone.setCdmaSubscription(cdmaSubscriptionType, response);
- }
-
- public SimulatedRadioControl getSimulatedRadioControl() {
- return mActivePhone.getSimulatedRadioControl();
- }
-
- public boolean enableDataConnectivity() {
- return mActivePhone.enableDataConnectivity();
- }
-
- public boolean disableDataConnectivity() {
- return mActivePhone.disableDataConnectivity();
- }
-
- public int enableApnType(String type) {
- return mActivePhone.enableApnType(type);
- }
-
- public int disableApnType(String type) {
- return mActivePhone.disableApnType(type);
- }
-
- public boolean isDataConnectivityEnabled() {
- return mActivePhone.isDataConnectivityEnabled();
- }
-
- public boolean isDataConnectivityPossible() {
- return mActivePhone.isDataConnectivityPossible();
- }
-
- public String getInterfaceName(String apnType) {
- return mActivePhone.getInterfaceName(apnType);
- }
-
- public String getIpAddress(String apnType) {
- return mActivePhone.getIpAddress(apnType);
- }
-
- public String getGateway(String apnType) {
- return mActivePhone.getGateway(apnType);
- }
-
- public String[] getDnsServers(String apnType) {
- return mActivePhone.getDnsServers(apnType);
- }
-
- public String getDeviceId() {
- return mActivePhone.getDeviceId();
- }
-
- public String getDeviceSvn() {
- return mActivePhone.getDeviceSvn();
- }
-
- public String getSubscriberId() {
- return mActivePhone.getSubscriberId();
- }
-
- public String getIccSerialNumber() {
- return mActivePhone.getIccSerialNumber();
- }
-
- public String getEsn() {
- return mActivePhone.getEsn();
- }
-
- public String getMeid() {
- return mActivePhone.getMeid();
- }
-
- public PhoneSubInfo getPhoneSubInfo(){
- return mActivePhone.getPhoneSubInfo();
- }
-
- public IccSmsInterfaceManager getIccSmsInterfaceManager(){
- return mActivePhone.getIccSmsInterfaceManager();
- }
-
- public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){
- return mActivePhone.getIccPhoneBookInterfaceManager();
- }
-
- public void setTTYMode(int ttyMode, Message onComplete) {
- mActivePhone.setTTYMode(ttyMode, onComplete);
- }
-
- public void queryTTYMode(Message onComplete) {
- mActivePhone.queryTTYMode(onComplete);
- }
-
- public void activateCellBroadcastSms(int activate, Message response) {
- mActivePhone.activateCellBroadcastSms(activate, response);
- }
-
- public void getCellBroadcastSmsConfig(Message response) {
- mActivePhone.getCellBroadcastSmsConfig(response);
- }
-
- public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) {
- mActivePhone.setCellBroadcastSmsConfig(configValuesArray, response);
- }
-
- public void notifyDataActivity() {
- mActivePhone.notifyDataActivity();
- }
-
- public void getSmscAddress(Message result) {
- mActivePhone.getSmscAddress(result);
- }
-
- public void setSmscAddress(String address, Message result) {
- mActivePhone.setSmscAddress(address, result);
- }
-
- public int getCdmaEriIconIndex() {
- return mActivePhone.getCdmaEriIconIndex();
- }
-
- public String getCdmaEriText() {
- return mActivePhone.getCdmaEriText();
- }
-
- public int getCdmaEriIconMode() {
- return mActivePhone.getCdmaEriIconMode();
- }
-
- public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete){
- mActivePhone.sendBurstDtmf(dtmfString, on, off, onComplete);
- }
-
- public void exitEmergencyCallbackMode(){
- mActivePhone.exitEmergencyCallbackMode();
- }
-
- public boolean isOtaSpNumber(String dialStr){
- return mActivePhone.isOtaSpNumber(dialStr);
- }
-
- public void registerForCallWaiting(Handler h, int what, Object obj){
- mActivePhone.registerForCallWaiting(h,what,obj);
- }
-
- public void unregisterForCallWaiting(Handler h){
- mActivePhone.unregisterForCallWaiting(h);
- }
-
- public void registerForSignalInfo(Handler h, int what, Object obj) {
- mActivePhone.registerForSignalInfo(h,what,obj);
- }
-
- public void unregisterForSignalInfo(Handler h) {
- mActivePhone.unregisterForSignalInfo(h);
- }
-
- public void registerForDisplayInfo(Handler h, int what, Object obj) {
- mActivePhone.registerForDisplayInfo(h,what,obj);
- }
-
- public void unregisterForDisplayInfo(Handler h) {
- mActivePhone.unregisterForDisplayInfo(h);
- }
-
- public void registerForNumberInfo(Handler h, int what, Object obj) {
- mActivePhone.registerForNumberInfo(h, what, obj);
- }
-
- public void unregisterForNumberInfo(Handler h) {
- mActivePhone.unregisterForNumberInfo(h);
- }
-
- public void registerForRedirectedNumberInfo(Handler h, int what, Object obj) {
- mActivePhone.registerForRedirectedNumberInfo(h, what, obj);
- }
-
- public void unregisterForRedirectedNumberInfo(Handler h) {
- mActivePhone.unregisterForRedirectedNumberInfo(h);
- }
-
- public void registerForLineControlInfo(Handler h, int what, Object obj) {
- mActivePhone.registerForLineControlInfo( h, what, obj);
- }
-
- public void unregisterForLineControlInfo(Handler h) {
- mActivePhone.unregisterForLineControlInfo(h);
- }
-
- public void registerFoT53ClirlInfo(Handler h, int what, Object obj) {
- mActivePhone.registerFoT53ClirlInfo(h, what, obj);
- }
-
- public void unregisterForT53ClirInfo(Handler h) {
- mActivePhone.unregisterForT53ClirInfo(h);
- }
-
- public void registerForT53AudioControlInfo(Handler h, int what, Object obj) {
- mActivePhone.registerForT53AudioControlInfo( h, what, obj);
- }
-
- public void unregisterForT53AudioControlInfo(Handler h) {
- mActivePhone.unregisterForT53AudioControlInfo(h);
- }
-
- public void setOnEcbModeExitResponse(Handler h, int what, Object obj){
- mActivePhone.setOnEcbModeExitResponse(h,what,obj);
- }
-
- public void unsetOnEcbModeExitResponse(Handler h){
- mActivePhone.unsetOnEcbModeExitResponse(h);
- }
-}
diff --git a/phone/src2/com/android/phone2/SipBroadcastReceiver.java b/phone/src2/com/android/phone2/SipBroadcastReceiver.java
deleted file mode 100644
index bf46dbf..0000000
--- a/phone/src2/com/android/phone2/SipBroadcastReceiver.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.phone2;
-
-import com.android.internal.telephony.sip.SipPhoneFactory;
-import com.android.internal.telephony.sip.SipPhoneProxy;
-import com.android.internal.telephony.sip.SipPhone;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.sip.SipAudioCall;
-import android.net.sip.SipManager;
-import android.util.Log;
-
-import javax.sip.SipException;
-
-/**
- * Broadcast receiver that handles SIP-related intents.
- */
-public class SipBroadcastReceiver extends BroadcastReceiver {
- private static final String TAG = SipBroadcastReceiver.class.getSimpleName();
-
- @Override
- public void onReceive(Context context, final Intent intent) {
- String action = intent.getAction();
-
- if (action.equals(SipManager.SIP_INCOMING_CALL_ACTION)) {
- // TODO: remove background thread when sip service becomes system
- // service
- new Thread(new Runnable() {
- public void run() {
- takeCall(intent);
- }
- }).start();
- // TODO: bring up InCallScreen
-
- /*
- intent.setClass(context, SipCallUi.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- */
- } else if (action.equals(SipManager.SIP_ADD_PHONE_ACTION)) {
- String localSipUri = intent.getStringExtra(SipManager.LOCAL_URI_KEY);
- Log.v(TAG, "new profile: " + localSipUri);
- SipPhone phone = SipPhoneFactory.makePhone(localSipUri);
- if (phone != null) {
- // TODO: should call CallManager.getInstance().addPhone()
- SipPhoneProxy.getInstance().setPhone(phone);
- }
- } else {
- Log.v(TAG, "action not processed: " + action);
- return;
- }
- }
-
- private void takeCall(Intent intent) {
- Context phoneContext = SipPhoneProxy.getInstance().getContext();
- try {
- SipAudioCall sipAudioCall = SipManager.getInstance(phoneContext)
- .takeAudioCall(phoneContext, intent, null, false);
- SipPhoneProxy.getInstance().onNewCall(sipAudioCall);
- } catch (SipException e) {
- Log.e(TAG, "process incoming SIP call", e);
- }
- }
-}
diff --git a/res/drawable/voip.gif b/res/drawable/voip.gif
deleted file mode 100644
index d5b0634..0000000
--- a/res/drawable/voip.gif
+++ /dev/null
Binary files differ
diff --git a/res/layout/call_setup.xml b/res/layout/call_setup.xml
deleted file mode 100644
index f774166..0000000
--- a/res/layout/call_setup.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-android:layout_width="fill_parent"
-android:layout_height="fill_parent"
-xmlns:android="http://schemas.android.com/apk/res/android"
->
-<TextView
-android:id="@+id/localip"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:textSize="18sp"
-android:layout_alignTop="@+id/localip_title"
-android:layout_centerHorizontal="true"
->
-</TextView>
-<TextView
-android:id="@+id/status"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:textSize="18sp"
-android:layout_alignTop="@+id/status_title"
-android:layout_centerHorizontal="true"
->
-</TextView>
-<TextView
-android:id="@+id/localip_title"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:textSize="18sp"
-android:layout_below="@+id/status_title"
-android:layout_alignParentLeft="true"
->
-</TextView>
-<TextView
-android:id="@+id/status_title"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:textSize="18sp"
-android:layout_below="@+id/settings_btn"
-android:layout_alignParentLeft="true"
-android:layout_marginTop="10px"
->
-</TextView>
-<Button
-android:id="@+id/register_btn"
-android:layout_width="200px"
-android:layout_height="wrap_content"
-android:textSize="18sp"
-android:layout_below="@+id/call_btn"
-android:layout_centerHorizontal="true"
->
-</Button>
-<Button
-android:id="@+id/settings_btn"
-android:layout_width="200px"
-android:layout_height="wrap_content"
-android:textSize="18sp"
-android:layout_below="@+id/register_btn"
-android:layout_centerHorizontal="true"
->
-</Button>
-<Button
-android:id="@+id/call_btn"
-android:layout_width="200px"
-android:layout_height="wrap_content"
-android:layout_marginTop="10px"
-android:textSize="18sp"
-android:layout_below="@+id/caller"
-android:layout_centerHorizontal="true"
->
-</Button>
-<Spinner
-android:id="@+id/caller"
-android:layout_width="fill_parent"
-android:layout_height="wrap_content"
-android:layout_below="@+id/caller_title"
-android:layout_alignParentLeft="true"
->
-</Spinner>
-<TextView
-android:id="@+id/caller_title"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:textSize="18sp"
-android:layout_below="@+id/callee"
-android:layout_alignParentLeft="true"
->
-</TextView>
-<AutoCompleteTextView
-android:id="@+id/callee"
-android:layout_width="fill_parent"
-android:layout_height="wrap_content"
-android:textSize="18sp"
-android:layout_below="@+id/callee_title"
-android:layout_alignParentLeft="true"
->
-</AutoCompleteTextView>
-<TextView
-android:id="@+id/callee_title"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:textSize="18sp"
-android:layout_alignParentTop="true"
-android:layout_alignParentLeft="true"
->
-</TextView>
-</RelativeLayout>
-
diff --git a/res/layout/call_ui.xml b/res/layout/call_ui.xml
deleted file mode 100644
index 439ee8c..0000000
--- a/res/layout/call_ui.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-android:layout_width="fill_parent"
-android:layout_height="fill_parent"
-xmlns:android="http://schemas.android.com/apk/res/android"
->
-<RelativeLayout
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:layout_centerHorizontal="true"
-android:layout_below="@+id/hang_up_btn"
->
- <ToggleButton
- android:id="@+id/mode_btn"
- android:layout_width="135px"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_alignParentLeft="true"
- android:textSize="18sp"
- android:textOn="Speaker"
- android:textOff="Speaker"
- />
- <Button
- android:id="@+id/dtmf_btn"
- android:layout_width="135px"
- android:layout_height="wrap_content"
- android:layout_alignTop="@+id/mode_btn"
- android:layout_toRightOf="@+id/mode_btn"
- android:textSize="18sp"
- />
-</RelativeLayout>
-<TextView
-android:id="@+id/local_ip"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:layout_alignTop="@+id/local_ip_title"
-android:layout_centerHorizontal="true"
-android:textSize="18sp"
->
-</TextView>
-<ToggleButton
-android:id="@+id/hold_btn"
-android:layout_width="135px"
-android:layout_height="wrap_content"
-android:layout_below="@+id/local_ip_title"
-android:layout_toRightOf="@+id/hang_up_btn"
-android:textSize="18sp"
-android:textOn="Hold"
-android:textOff="Hold"
->
-</ToggleButton>
-<ToggleButton
-android:id="@+id/mute_btn"
-android:layout_width="135px"
-android:layout_height="wrap_content"
-android:layout_below="@+id/local_ip_title"
-android:layout_toLeftOf="@+id/hang_up_btn"
-android:textSize="18sp"
-android:textOn="Mute"
-android:textOff="Mute"
->
-</ToggleButton>
-<Button
-android:id="@+id/hang_up_btn"
-android:layout_width="160px"
-android:layout_height="wrap_content"
-android:layout_below="@+id/local_ip_title"
-android:layout_centerHorizontal="true"
-android:textSize="18sp"
-android:layout_marginBottom="30px"
->
-</Button>
-<TextView
-android:id="@+id/local_ip_title"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:layout_marginBottom="30px"
-android:layout_below="@+id/call_status"
-android:layout_alignLeft="@+id/call_status_title"
-android:textSize="18sp"
->
-</TextView>
-<TextView
-android:id="@+id/call_status"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:layout_alignTop="@+id/call_status_title"
-android:layout_centerHorizontal="true"
-android:textSize="18sp"
->
-</TextView>
-<TextView
-android:id="@+id/call_status_title"
-android:layout_width="wrap_content"
-android:layout_height="wrap_content"
-android:layout_alignBottom="@+id/caller"
-android:layout_alignLeft="@+id/caller"
-android:textSize="18sp"
->
-</TextView>
-<TextView
-android:id="@+id/caller"
-android:layout_width="fill_parent"
-android:layout_height="300px"
-android:padding="10px"
-android:layout_marginTop="10px"
-android:textSize="24sp"
-android:textColor="#ffffff00"
-android:gravity="center"
-android:layout_alignParentTop="true"
-android:layout_centerHorizontal="true"
->
-</TextView>
-</RelativeLayout>
-
diff --git a/res/layout/sip_settings_ui.xml b/res/layout/sip_settings_ui.xml
deleted file mode 100644
index 12c129e..0000000
--- a/res/layout/sip_settings_ui.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?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.
-*/
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- android:drawSelectorOnTop="false"
- android:scrollbarAlwaysDrawVerticalTrack="true"
- />
-
- <LinearLayout android:id="@+id/add_remove_account_bar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:background="@android:drawable/bottom_bar">
-
- <View
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"/>
-
- <Button android:id="@+id/add_remove_account_button"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="2"
- android:layout_marginTop="5dip"
- android:text="@string/add_sip_account" />
-
- <View
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"/>
- </LinearLayout>
-
-</LinearLayout>
diff --git a/res/values/array.xml b/res/values/array.xml
deleted file mode 100644
index 2ba321d..0000000
--- a/res/values/array.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 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.
--->
-
-<resources>
- <string-array name="transport_types">
- <item>UDP</item>
- <item>TCP</item>
- </string-array>
-</resources>
-
diff --git a/res/values/strings.xml b/res/values/strings.xml
deleted file mode 100644
index 29d62a2..0000000
--- a/res/values/strings.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 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.
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name">Sip Account Settings</string>
- <string name="sip_settings_activity_title">Sip Settings Activity</string>
-
- <string name="auto_reg">Auto Registration</string>
- <string name="call_priority">Outgoing Call via SIP</string>
- <string name="add_sip_account">Add SIP account</string>
- <string name="remove_sip_account">Remove SIP account</string>
- <string name="sip_account_list">SIP accounts</string>
-
- <string name="sip_menu_save">Save</string>
- <string name="sip_menu_discard">Discard</string>
-
- <string name="alert_dialog_ok">OK</string>
-
-
- <string name="sip_edit_title">Edit your SIP account</string>
-
- <string name="profile_name_title">Name</string>
- <string name="profile_name_summary">Not set</string>
- <string name="domain_address_title">Domain</string>
- <string name="domain_address_summary"></string>
- <string name="username_title">Username</string>
- <string name="username_summary">Enter the username</string>
- <string name="password_title">Password</string>
- <string name="password_summary">Click to enter password</string>
- <string name="display_name_title">Display name</string>
- <string name="display_name_summary">Your display name</string>
- <string name="proxy_address_title">Outbound Proxy address</string>
- <string name="proxy_address_summary"></string>
- <string name="port_title">Port Number</string>
- <string name="port_summary">5060</string>
- <string name="transport_title">Transport Type</string>
- <string name="transport_summary">TCP</string>
- <string name="send_keepalive_title">Send keep-alive</string>
- <string name="send_keepalive_summary">Send SIP keep-alive messages</string>
- <string name="auto_registration_title">Auto. Registration</string>
- <string name="auto_registration_summary">Register the profile automatically</string>
-
- <string name="sip_menu_enable_autoregister">Enable auto registration</string>
- <string name="sip_menu_disable_autoregister">Disable auto registration</string>
- <string name="sip_menu_register">Register the account</string>
- <string name="sip_menu_unregister">Unregister the account</string>
- <string name="sip_menu_edit">Edit the account</string>
- <string name="sip_menu_delete">Delete the account</string>
-
- <string name="empty_alert"> cannot be empty</string>
-
- <!-- Do not translate the following strings. Used for the preference keys -->
- <string name="profile_name">ProfileName</string>
- <string name="domain_address">SipDomain</string>
- <string name="username">UserName</string>
- <string name="password">Password</string>
- <string name="display_name">DisplayName</string>
- <string name="proxy_address">ProxyAddress</string>
- <string name="port">Port</string>
- <string name="transport">Protocol</string>
- <string name="send_keepalive">SendKeepAlive</string>
- <string name="auto_registration">AutoRegistration</string>
-</resources>
diff --git a/res/xml/dev_pref.xml b/res/xml/dev_pref.xml
deleted file mode 100644
index 047abfc..0000000
--- a/res/xml/dev_pref.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="SIP test (build 111)">
- <Preference
- android:key="call_status"
- android:title="Call status"
- />
-
- <EditTextPreference
- android:key="peer"
- android:title="Who to call?"
- android:defaultValue="test@192.168.1.1:5060"
- android:summary="test@192.168.1.1:5060"
- android:dialogTitle="Who to call?"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="server_address"
- android:title="Server address"
- android:defaultValue=""
- android:summary=""
- android:dialogTitle="Server address"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="password"
- android:title="Password"
- android:summary="Click to enter password"
- android:dialogTitle="Password"
- android:password="true"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="display_name"
- android:title="Display name"
- android:defaultValue="never mind"
- android:summary="never mind"
- android:dialogTitle="Display name"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="proxy_address"
- android:title="Outbound proxy address"
- android:defaultValue=""
- android:summary=""
- android:dialogTitle="Outbound proxy address"
- android:singleLine="true"/>
-
- <Preference
- android:key="my_ip"
- android:title="My IP"
- />
-</PreferenceScreen>
diff --git a/res/xml/sip_edit.xml b/res/xml/sip_edit.xml
deleted file mode 100644
index 18306a9..0000000
--- a/res/xml/sip_edit.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/sip_edit_title"
- android:persistent="false">
-
- <EditTextPreference
- android:key="@string/profile_name"
- android:title="@string/profile_name_title"
- android:defaultValue="@string/profile_name_summary"
- android:summary="@string/profile_name_summary"
- android:dialogTitle="@string/profile_name_title"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="@string/domain_address"
- android:title="@string/domain_address_title"
- android:defaultValue="@string/domain_address_summary"
- android:summary="@string/domain_address_summary"
- android:dialogTitle="@string/domain_address_title"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="@string/username"
- android:title="@string/username_title"
- android:summary="@string/username_summary"
- android:dialogTitle="@string/username_title"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="@string/password"
- android:title="@string/password_title"
- android:summary="@string/password_summary"
- android:dialogTitle="@string/password_title"
- android:password="true"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="@string/display_name"
- android:title="@string/display_name_title"
- android:defaultValue="@string/display_name_summary"
- android:summary="@string/display_name_summary"
- android:dialogTitle="@string/display_name_title"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="@string/proxy_address"
- android:title="@string/proxy_address_title"
- android:defaultValue="@string/proxy_address_summary"
- android:summary="@string/proxy_address_summary"
- android:dialogTitle="@string/proxy_address_title"
- android:singleLine="true"/>
-
- <EditTextPreference
- android:key="@string/port"
- android:title="@string/port_title"
- android:defaultValue="@string/port_summary"
- android:summary="@string/port_summary"
- android:dialogTitle="@string/port_title"
- android:singleLine="true"/>
-
- <ListPreference
- android:key="@string/transport"
- android:title="@string/transport_title"
- android:entries="@array/transport_types"
- android:entryValues="@array/transport_types"
- android:summary="@string/transport_summary"
- android:persistent="false"
- android:dialogTitle="@string/transport_title"/>
-
- <CheckBoxPreference
- android:key="@string/send_keepalive"
- android:title="@string/send_keepalive_title"
- android:defaultValue="false"
- android:summary="@string/send_keepalive_summary"
- android:dialogTitle="@string/send_keepalive_title"/>
-
- <CheckBoxPreference
- android:key="@string/auto_registration"
- android:title="@string/auto_registration_title"
- android:defaultValue="true"
- android:summary="@string/auto_registration_summary"
- android:dialogTitle="@string/auto_registration_title"/>
-</PreferenceScreen>
diff --git a/res/xml/sip_setting.xml b/res/xml/sip_setting.xml
deleted file mode 100644
index 20d7269..0000000
--- a/res/xml/sip_setting.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/sip_settings_activity_title">
-
- <CheckBoxPreference android:key="sip_call_first"
- android:title="@string/call_priority">
- </CheckBoxPreference>
-
- <CheckBoxPreference android:key="auto_reg"
- android:title="@string/auto_reg"
- android:summary="@string/auto_registration_summary">
- </CheckBoxPreference>
-
- <PreferenceCategory android:key="sip_account_list" android:title="@string/sip_account_list">
- </PreferenceCategory>
-</PreferenceScreen>
diff --git a/settings/com/android/settings/sip/BootCompletedReceiver.java b/settings/com/android/settings/sip/BootCompletedReceiver.java
deleted file mode 100644
index 8b6b0d8..0000000
--- a/settings/com/android/settings/sip/BootCompletedReceiver.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.settings.sip;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.BroadcastReceiver;
-import android.content.SharedPreferences;
-import android.util.Log;
-
-/**
- * The BroadcastReceiver class for enabling sip profiles in the storage after
- * system boots up.
- */
-public class BootCompletedReceiver extends BroadcastReceiver {
- private static final String TAG = "BootCompletedReceiver";
- private static final String START_AUTO = "android.net.sip.START_AUTO";
-
- public void onReceive(Context context, Intent intent) {
- // TODO: once we move sip service to framework, it could depend on the
- // sip service to bring up this.
- String action = intent.getAction();
- if (!Intent.ACTION_BOOT_COMPLETED.equals(action)
- && !START_AUTO.equals(action)) {
- Log.e(TAG, "should not be here " + intent.getAction());
- return;
- }
- SharedPreferences settings = context.getSharedPreferences(
- SipAutoRegistration.SIP_SHARED_PREFERENCES,
- Context.MODE_WORLD_READABLE);
- boolean autoReg = settings.getBoolean(
- SipAutoRegistration.AUTOREG_FLAG, false);
- if (autoReg) {
- context.startService(
- new Intent("android.net.sip.AUTO_REGISTRATOIN"));
- }
- }
-}
-
diff --git a/settings/com/android/settings/sip/ProfileUtil.java b/settings/com/android/settings/sip/ProfileUtil.java
deleted file mode 100644
index 27999d2..0000000
--- a/settings/com/android/settings/sip/ProfileUtil.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.settings.sip;
-
-import android.net.sip.SipProfile;
-
-import java.util.List;
-
-/**
- * For demo app. To be removed.
- */
-public class ProfileUtil {
- private static final String PROFILES_DIR = SipSettings.PROFILES_DIR;
-
- public static List<SipProfile> retrieveSipProfiles(String rootDir) {
- return SipSettings.retrieveSipListFromDirectory(rootDir + PROFILES_DIR);
- }
-}
diff --git a/settings/com/android/settings/sip/SipAutoRegistration.java b/settings/com/android/settings/sip/SipAutoRegistration.java
deleted file mode 100644
index 2f4c426..0000000
--- a/settings/com/android/settings/sip/SipAutoRegistration.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.settings.sip;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.content.BroadcastReceiver;
-import android.content.SharedPreferences;
-import android.net.sip.SipProfile;
-import android.net.sip.SipManager;
-import android.util.Log;
-import android.os.IBinder;
-
-import java.util.List;
-import javax.sip.SipException;
-
-/**
- * The service class for registering the sip profiles if the auto registration
- * flag is enabled in the sip settings.
- */
-public class SipAutoRegistration extends Service {
- public static final String SIP_SHARED_PREFERENCES = "SIP_PREFERENCES";
- public static final String AUTOREG_FLAG = "AUTOREG";
- public static final String SIP_CALL_FIRST_FLAG = "SIPFIRST";
- private static final String TAG = "SipAutoRegistration";
-
- @Override
- public void onCreate() {
- super.onCreate();
- registerAllProfiles(this);
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-
- private void registerAllProfiles(final Context context) {
- new Thread(new Runnable() {
- public void run() {
- SipManager sipManager = SipManager.getInstance(context);
- List<SipProfile> sipProfileList =
- SipSettings.retrieveSipListFromDirectory(
- context.getFilesDir().getAbsolutePath()
- + SipSettings.PROFILES_DIR);
- for (SipProfile profile : sipProfileList) {
- try {
- if (!profile.getAutoRegistration()) continue;
- sipManager.open(profile,
- SipSettings.INCOMING_CALL_ACTION, null);
- } catch (SipException e) {
- Log.e(TAG, "failed" + profile.getProfileName(), e);
- }
- }
- stopSelf();
- }}
- ).start();
- }
-}
diff --git a/settings/com/android/settings/sip/SipEditor.java b/settings/com/android/settings/sip/SipEditor.java
deleted file mode 100644
index 45168f6..0000000
--- a/settings/com/android/settings/sip/SipEditor.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.settings.sip;
-
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.net.sip.SipProfile;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.preference.CheckBoxPreference;
-import android.preference.EditTextPreference;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceGroup;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.Button;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-/**
- * The activity class for editing a new or existing SIP profile.
- */
-public class SipEditor extends PreferenceActivity
- implements Preference.OnPreferenceChangeListener {
- private static final int MENU_SAVE = Menu.FIRST;
- private static final int MENU_DISCARD = Menu.FIRST + 1;
-
- private static final String TAG = SipEditor.class.getSimpleName();
- private static final String KEY_PROFILE = "profile";
- private static final String NOT_SET = "<No Set>";
- private static final String SCRAMBLED = "****";
- private static final String EMPTY = "";
- private static final String DEFAULT_SIP_PORT = "5060";
- private static final String DEFAULT_PROTOCOL = "UDP";
- private static final String GET_METHOD_PREFIX = "get";
-
- private boolean mAddingProfile;
-
- enum PreferenceKey {
- ProfileName(R.string.profile_name, 0, EMPTY),
- DomainAddress(R.string.domain_address, 1, EMPTY),
- Username(R.string.username, 2, EMPTY),
- Password(R.string.password, 3, EMPTY),
- DisplayName(R.string.display_name, 4, EMPTY),
- ProxyAddress(R.string.proxy_address, 5, EMPTY),
- Port(R.string.port, 6, DEFAULT_SIP_PORT),
- Transport(R.string.transport, 7, DEFAULT_PROTOCOL),
- SendKeepAlive(R.string.send_keepalive, 8, EMPTY),
- AutoRegistration(R.string.auto_registration, 9, EMPTY);
-
- /**
- * @param key The key name of the preference.
- * @param index The index of the preference in the view.
- * @param defaultValue The default value of the preference.
- */
- PreferenceKey(int text, int index, String defaultValue) {
- this.text = text;
- this.index = index;
- this.defaultValue = defaultValue;
- }
-
- public final int text;
- public final int index;
- public final String defaultValue;
- }
-
- private Preference[] mPreferences =
- new Preference[PreferenceKey.values().length];
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- Log.v(TAG, "start profile editor");
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.sip_settings_ui);
- addPreferencesFromResource(R.xml.sip_edit);
- final SipProfile p = (SipProfile) ((savedInstanceState == null)
- ? getIntent().getParcelableExtra(SipSettings.KEY_SIP_PROFILE)
- : savedInstanceState.getParcelable(KEY_PROFILE));
-
- for (PreferenceKey key : PreferenceKey.values()) {
- mPreferences[key.index] = setupPreference(getString(key.text));
- }
- if (p == null) {
- findViewById(R.id.add_remove_account_bar)
- .setVisibility(View.GONE);
- } else {
- Button removeButton =
- (Button)findViewById(R.id.add_remove_account_button);
- removeButton.setText(getString(R.string.remove_sip_account));
- removeButton.setOnClickListener(
- new android.view.View.OnClickListener() {
- public void onClick(View v) {
- setRemovedProfileAndFinish(p);
- }
- });
- }
- loadPreferencesFromProfile(p);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- menu.add(0, MENU_SAVE, 0, R.string.sip_menu_save)
- .setIcon(android.R.drawable.ic_menu_save);
- menu.add(0, MENU_DISCARD, 0, R.string.sip_menu_discard)
- .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case MENU_SAVE:
- if (validateAndSetResult()) {
- finish();
- }
- return true;
-
- case MENU_DISCARD:
- finish();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_BACK:
- if (validateAndSetResult()) finish();
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
-
- private void setRemovedProfileAndFinish(SipProfile p) {
- try {
- Intent intent = new Intent(this, SipSettings.class);
- intent.putExtra(SipSettings.KEY_SIP_PROFILE, (Parcelable) p);
- setResult(RESULT_FIRST_USER, intent);
- finish();
- } catch (Exception e) {
- showAlert(e.getMessage());
- }
- }
-
- private void showAlert(String message) {
- new AlertDialog.Builder(this)
- .setTitle(android.R.string.dialog_alert_title)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(message)
- .setPositiveButton(R.string.alert_dialog_ok,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int w) {
- }
- })
- .show();
- }
-
- private boolean validateAndSetResult() {
- for(Preference pref : mPreferences) {
- String value = EMPTY;
- if (pref instanceof ListPreference) {
- value = ((ListPreference)pref).getValue();
- } else if (pref instanceof EditTextPreference) {
- value = ((EditTextPreference)pref).getText();
- } else if (pref instanceof CheckBoxPreference) {
- continue;
- }
- if (TextUtils.isEmpty(value) &&
- (pref != mPreferences[PreferenceKey.ProxyAddress.index])) {
- showAlert(pref.getTitle() + " "
- + getString(R.string.empty_alert));
- return false;
- }
- }
- try {
- Intent intent = new Intent(this, SipSettings.class);
- intent.putExtra(SipSettings.KEY_SIP_PROFILE,
- (Parcelable) createSipProfile());
- setResult(RESULT_OK, intent);
- return true;
- } catch (Exception e) {
- showAlert(e.getMessage());
- return false;
- }
- }
-
- private SipProfile createSipProfile() {
- try {
- return new SipProfile.Builder(
- getValue(PreferenceKey.Username),
- getValue(PreferenceKey.DomainAddress))
- .setProfileName(getValue(PreferenceKey.ProfileName))
- .setPassword(getValue(PreferenceKey.Password))
- .setOutboundProxy(getValue(PreferenceKey.ProxyAddress))
- .setProtocol(getValue(PreferenceKey.Transport))
- .setDisplayName(getValue(PreferenceKey.DisplayName))
- .setPort(Integer.parseInt(getValue(PreferenceKey.Port)))
- .setSendKeepAlive(isChecked(PreferenceKey.SendKeepAlive))
- .setAutoRegistration(
- isChecked(PreferenceKey.AutoRegistration))
- .build();
- } catch (Exception e) {
- Log.e(TAG, "Can not create new SipProfile : " + e.getMessage());
- return null;
- }
- }
-
- public boolean onPreferenceChange(Preference pref, Object newValue) {
- if (pref instanceof CheckBoxPreference) return true;
- String value = (String) newValue;
- if (value == null) value = EMPTY;
- if (pref != mPreferences[PreferenceKey.Password.index]) {
- pref.setSummary(value);
- } else {
- pref.setSummary(SCRAMBLED);
- }
- return true;
- }
-
- private void loadPreferencesFromProfile(SipProfile p) {
- if (p != null) {
- Log.v(TAG, "Edit the existing profile : " + p.getProfileName());
- try {
- Class profileClass = SipProfile.class;
- for (PreferenceKey key : PreferenceKey.values()) {
- Method meth = profileClass.getMethod(GET_METHOD_PREFIX +
- getString(key.text), (Class[])null);
- if (key == PreferenceKey.Port) {
- setValue(key,
- String.valueOf(meth.invoke(p, (Object[])null)));
- } else if (key == PreferenceKey.SendKeepAlive
- || key == PreferenceKey.AutoRegistration) {
- setCheckBox(key, ((Boolean)
- meth.invoke(p, (Object[])null)).booleanValue());
- } else {
- setValue(key, (String) meth.invoke(p, (Object[])null));
- }
- }
- } catch (Exception e) {
- Log.e(TAG, "Can not load pref from profile:" + e.getMessage());
- }
- } else {
- Log.v(TAG, "Edit a new profile");
- for (PreferenceKey key : PreferenceKey.values()) {
- Preference pref = mPreferences[key.index];
- pref.setOnPreferenceChangeListener(this);
- if (pref instanceof EditTextPreference) {
- ((EditTextPreference)pref).setText(key.defaultValue);
- } else if (pref instanceof ListPreference) {
- ((ListPreference)pref).setValue(key.defaultValue);
- } else {
- continue;
- }
- pref.setSummary(EMPTY.equals(key.defaultValue)
- ? NOT_SET : key.defaultValue);
- }
- }
- }
-
- private boolean isChecked(PreferenceKey key) {
- CheckBoxPreference pref = (CheckBoxPreference)mPreferences[key.index];
- return pref.isChecked();
- }
-
- private String getValue(PreferenceKey key) {
- Preference pref = mPreferences[key.index];
- if (pref instanceof EditTextPreference) {
- return ((EditTextPreference)pref).getText();
- } else if (pref instanceof ListPreference) {
- return ((ListPreference)pref).getValue();
- }
- throw new RuntimeException("getValue() for the preference " + key.text);
- }
-
- private void setCheckBox(PreferenceKey key, boolean checked) {
- CheckBoxPreference pref = (CheckBoxPreference) mPreferences[key.index];
- pref.setChecked(checked);
- }
-
- private void setValue(PreferenceKey key, String value) {
- Preference pref = mPreferences[key.index];
- if (pref instanceof EditTextPreference) {
- ((EditTextPreference)pref).setText(value);
- } else if (pref instanceof ListPreference) {
- ((ListPreference)pref).setValue(value);
- }
-
- if (TextUtils.isEmpty(value)) {
- value = NOT_SET;
- } else {
- if (key == PreferenceKey.Password) value = SCRAMBLED;
- }
- pref.setSummary(value);
- }
-
- private Preference setupPreference(String key) {
- Preference pref = getPreferenceScreen().findPreference(key);
- pref.setOnPreferenceChangeListener(this);
- return pref;
- }
-}
diff --git a/settings/com/android/settings/sip/SipSettings.java b/settings/com/android/settings/sip/SipSettings.java
deleted file mode 100644
index 289772e..0000000
--- a/settings/com/android/settings/sip/SipSettings.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.settings.sip;
-
-
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.net.sip.SipProfile;
-import android.net.sip.SipManager;
-import android.net.sip.SipRegistrationListener;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.preference.CheckBoxPreference;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceCategory;
-import android.preference.PreferenceScreen;
-import android.util.Log;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.widget.AdapterView.AdapterContextMenuInfo;
-import android.widget.Button;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import javax.sip.SipException;
-
-/**
- * The PreferenceActivity class for managing sip profile preferences.
- */
-public class SipSettings extends PreferenceActivity {
- static final String KEY_SIP_PROFILE = "sip_profile";
- static final String PROFILE_OBJ_FILE = ".pobj";
- static final String PROFILES_DIR = "/profiles/";
-
- private static final String PREF_AUTO_REG = "auto_reg";
- private static final String PREF_SIP_CALL_FIRST = "sip_call_first";
- private static final String PREF_SIP_LIST = "sip_account_list";
- private static final String TAG = "SipSettings";
- private static final String REGISTERED = "REGISTERED";
- private static final String UNREGISTERED = "NOT REGISTERED";
-
- public static final String INCOMING_CALL_ACTION =
- "com.android.phone.SIP_INCOMING_CALL";
-
- private static final int REQUEST_ADD_OR_EDIT_SIP_PROFILE = 1;
-
- private static final int CONTEXT_MENU_REGISTER_ID = ContextMenu.FIRST;
- private static final int CONTEXT_MENU_UNREGISTER_ID = ContextMenu.FIRST + 1;
- private static final int CONTEXT_MENU_EDIT_ID = ContextMenu.FIRST + 2;
- private static final int CONTEXT_MENU_DELETE_ID = ContextMenu.FIRST + 3;
- private static final int EXPIRY_TIME = 600;
-
- private SipManager mSipManager;
-
- private String mProfilesDirectory;
-
- private SipProfile mProfile;
-
- private PreferenceCategory mSipListContainer;
- private Map<String, SipPreference> mSipPreferenceMap;
- private List<SipProfile> mSipProfileList;
- private SharedPreferences.Editor mSettingsEditor;
-
- private class SipPreference extends Preference {
- SipProfile mProfile;
- SipPreference(Context c, SipProfile p) {
- super(c);
- setProfile(p);
- }
-
- void setProfile(SipProfile p) {
- mProfile = p;
- setTitle(p.getProfileName());
- try {
- setSummary(mSipManager.isRegistered(p.getUriString())
- ? REGISTERED : UNREGISTERED);
- } catch (SipException e) {
- Log.e(TAG, "Error!setProfileSummary:", e);
- }
- }
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.sip_settings_ui);
- addPreferencesFromResource(R.xml.sip_setting);
- mProfilesDirectory = getFilesDir().getAbsolutePath() + PROFILES_DIR;
- mSipListContainer = (PreferenceCategory) findPreference(PREF_SIP_LIST);
-
- registerForAddSipListener();
-
- // for long-press gesture on a profile preference
- registerForContextMenu(getListView());
-
- registerForGlobalSettingsListener();
-
- updateProfilesStatus();
- }
-
- private void registerForAddSipListener() {
- ((Button) findViewById(R.id.add_remove_account_button))
- .setOnClickListener(new android.view.View.OnClickListener() {
- public void onClick(View v) {
- startSipEditor(null);
- }
- });
- }
-
- public interface ClickEventCallback {
- public void handle(boolean enabled);
- }
-
- private class AutoRegistrationClickHandler implements ClickEventCallback {
- public void handle(boolean enabled) {
- registerEnabledProfiles(enabled);
- }
- }
-
- private void registerForGlobalSettingsListener() {
- mSettingsEditor = getSharedPreferences(
- SipAutoRegistration.SIP_SHARED_PREFERENCES,
- Context.MODE_WORLD_READABLE).edit();
- setCheckBoxClickEventListener(PREF_AUTO_REG,
- SipAutoRegistration.AUTOREG_FLAG,
- new AutoRegistrationClickHandler());
- setCheckBoxClickEventListener(PREF_SIP_CALL_FIRST,
- SipAutoRegistration.SIP_CALL_FIRST_FLAG,
- null);
- }
-
- private void setCheckBoxClickEventListener(String preference,
- final String flag, final ClickEventCallback clickEvent) {
- ((CheckBoxPreference) findPreference(preference))
- .setOnPreferenceClickListener(
- new OnPreferenceClickListener() {
- public boolean onPreferenceClick(Preference preference) {
- boolean enabled =
- ((CheckBoxPreference) preference).isChecked();
- mSettingsEditor.putBoolean(flag, enabled);
- mSettingsEditor.commit();
- if (clickEvent != null) clickEvent.handle(enabled);
- return true;
- }
- });
- }
-
- private void updateProfilesStatus() {
- new Thread(new Runnable() {
- public void run() {
- try {
- mSipManager = SipManager.getInstance(SipSettings.this);
- retrieveSipListFromStorage();
- } catch (Exception e) {
- Log.e(TAG, "isRegistered", e);
- }
- }
- }).start();
- }
-
- static List<SipProfile> retrieveSipListFromDirectory(
- String directory) {
- List<SipProfile> sipProfileList = Collections.synchronizedList(
- new ArrayList<SipProfile>());
-
- File root = new File(directory);
- String[] dirs = root.list();
- if (dirs == null) return sipProfileList;
- for (String dir : dirs) {
- File f = new File(
- new File(root, dir), SipSettings.PROFILE_OBJ_FILE);
- if (!f.exists()) continue;
- try {
- SipProfile p = SipSettings.deserialize(f);
- if (p == null) continue;
- if (!dir.equals(p.getProfileName())) continue;
-
- sipProfileList.add(p);
- } catch (IOException e) {
- Log.e(TAG, "retrieveProfileListFromStorage()", e);
- }
- }
- Collections.sort(sipProfileList, new Comparator<SipProfile>() {
- public int compare(SipProfile p1, SipProfile p2) {
- return p1.getProfileName().compareTo(p2.getProfileName());
- }
-
- public boolean equals(SipProfile p) {
- // not used
- return false;
- }
- });
- return sipProfileList;
- }
-
- private void retrieveSipListFromStorage() {
-
- mSipPreferenceMap = new LinkedHashMap<String, SipPreference>();
- mSipProfileList = retrieveSipListFromDirectory(mProfilesDirectory);
- mSipListContainer.removeAll();
-
- for (SipProfile p : mSipProfileList) {
- addPreferenceFor(p, true);
- }
- }
-
- private void registerEnabledProfiles(boolean enabled) {
- try {
- for (SipProfile p : mSipProfileList) {
- if (p.getAutoRegistration() == false) continue;
- if (enabled) {
- if (!mSipManager.isRegistered(p.getUriString())) {
- registerProfile(p);
- }
- } else {
- unRegisterProfile(p);
- }
- }
- } catch (SipException e) {
- Log.e(TAG, "Error!registerEnabledProfiles():", e);
- }
- }
-
- private void addPreferenceFor(SipProfile p, boolean addToContainer)
- {
- String status;
- try {
- Log.v(TAG, "addPreferenceFor profile uri" + p.getUri());
- status = mSipManager.isRegistered(p.getUriString())
- ? REGISTERED : UNREGISTERED;
- } catch (Exception e) {
- Log.e(TAG, "Cannot get status of profile" + p.getProfileName(), e);
- return;
- }
- SipPreference pref = new SipPreference(this, p);
- mSipPreferenceMap.put(p.getUriString(), pref);
- if (addToContainer) mSipListContainer.addPreference(pref);
-
- pref.setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- public boolean onPreferenceClick(Preference pref) {
- startSipEditor(((SipPreference) pref).mProfile);
- return true;
- }
- });
- }
-
- @Override
- public void onResume() {
- super.onResume();
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- unregisterForContextMenu(getListView());
- }
-
- private SipProfile getProfile(int position) {
- return ((position >= 0) ? mSipProfileList.get(position) : null);
- }
-
- private int getProfilePositionFrom(AdapterContextMenuInfo menuInfo) {
- return menuInfo.position - mSipListContainer.getOrder() - 1;
- }
-
- private void registerProfile(SipProfile profile) {
- if (profile != null) {
- try {
- mSipManager.open(profile, INCOMING_CALL_ACTION,
- createRegistrationListener());
- } catch (Exception e) {
- Log.e(TAG, "register failed", e);
- }
- }
- }
-
- private void unRegisterProfile(SipProfile profile) {
- if (profile != null) {
- try {
- mSipManager.close(profile.getUriString());
- setProfileSummary(profile, UNREGISTERED);
- } catch (Exception e) {
- Log.e(TAG, "unregister failed:" + profile.getUriString(), e);
- }
- }
- }
-
- // TODO: Use the Util class in settings.vpn instead
- private void deleteProfile(String name) {
- deleteProfile(new File(name));
- }
-
- private void deleteProfile(File file) {
- if (file.isDirectory()) {
- for (File child : file.listFiles()) deleteProfile(child);
- }
- file.delete();
- }
-
- void deleteProfile(SipProfile p) {
- mSipProfileList.remove(p);
- SipPreference pref = mSipPreferenceMap.remove(p.getUriString());
- mSipListContainer.removePreference(pref);
- deleteProfile(mProfilesDirectory + p.getProfileName());
- unRegisterProfile(p);
- }
-
- private void saveProfileToStorage(SipProfile p) throws IOException {
- if (mProfile != null) deleteProfile(mProfile);
- File f = new File(mProfilesDirectory + p.getProfileName());
- if (!f.exists()) f.mkdirs();
- ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
- new File(f, PROFILE_OBJ_FILE)));
- oos.writeObject(p);
- oos.close();
- mSipProfileList.add(p);
- addPreferenceFor(p, true);
- }
-
- @Override
- protected void onActivityResult(final int requestCode, final int resultCode,
- final Intent intent) {
- if (resultCode != RESULT_OK && resultCode != RESULT_FIRST_USER) return;
- SipProfile profile = intent.getParcelableExtra(KEY_SIP_PROFILE);
- try {
- if (resultCode == RESULT_OK) {
- Log.v(TAG, "New Profile Name:" + profile.getProfileName());
- saveProfileToStorage(profile);
- if (((CheckBoxPreference) findPreference
- (PREF_AUTO_REG)).isChecked() &&
- profile.getAutoRegistration() == true) {
- registerProfile(profile);
- }
- } else {
- Log.v(TAG, "Removed Profile Name:" + profile.getProfileName());
- deleteProfile(profile);
- }
- } catch (IOException e) {
- Log.v(TAG, "Can not handle the profile : " + e.getMessage());
- }
- }
-
- static SipProfile deserialize(File profileObjectFile) throws IOException {
- try {
- ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
- profileObjectFile));
- SipProfile p = (SipProfile) ois.readObject();
- ois.close();
- return p;
- } catch (ClassNotFoundException e) {
- Log.d(TAG, "deserialize a profile", e);
- return null;
- }
- }
-
- private void startSipEditor(final SipProfile profile) {
- mProfile = profile;
- Intent intent = new Intent(this, SipEditor.class);
- intent.putExtra(KEY_SIP_PROFILE, (Parcelable) profile);
- startActivityForResult(intent, REQUEST_ADD_OR_EDIT_SIP_PROFILE);
- }
-
- private void setProfileSummary(SipProfile profile, String message) {
- setProfileSummary(profile.getUriString(), message);
- }
-
- private void setProfileSummary(final String profileUri,
- final String message) {
- runOnUiThread(new Runnable() {
- public void run() {
- try {
- SipPreference pref = mSipPreferenceMap.get(profileUri);
- if (pref != null) {
- pref.setSummary(message);
- }
- } catch (Exception e) {
- Log.e(TAG, "setSessionSummary failed:" + e);
- }
- }
- });
- }
-
- private SipRegistrationListener createRegistrationListener() {
- return new SipRegistrationListener() {
- public void onRegistrationDone(String profileUri, long expiryTime) {
- setProfileSummary(profileUri,
- (expiryTime <= 0) ? UNREGISTERED : REGISTERED);
- }
-
- public void onRegistrationFailed(String profileUri,
- String className, String message) {
- setProfileSummary(profileUri, "Registration error: " + message);
- }
-
- public void onRegistering(String profileUri) {
- setProfileSummary(profileUri, "Registering...");
- }
- };
- }
-}
diff --git a/src/android/net/sip/BinderHelper.java b/src/android/net/sip/BinderHelper.java
deleted file mode 100644
index bd3da32..0000000
--- a/src/android/net/sip/BinderHelper.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.ConditionVariable;
-import android.os.IBinder;
-import android.os.IInterface;
-import android.os.Looper;
-import android.util.Log;
-
-// TODO: throw away this class after moving SIP classes to framework
-// This class helps to get IBinder instance of a service in a blocking call.
-// The method cannot be called in app's main thread as the ServiceConnection
-// callback will.
-class BinderHelper<T extends IInterface> {
- private Context mContext;
- private IBinder mBinder;
- private Class<T> mClass;
-
- BinderHelper(Context context, Class<T> klass) {
- mContext = context;
- mClass = klass;
- }
-
- void startService() {
- mContext.startService(new Intent(mClass.getName()));
- }
-
- void stopService() {
- mContext.stopService(new Intent(mClass.getName()));
- }
-
- IBinder getBinder() {
- // cannot call this method in app's main thread
- if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
- throw new RuntimeException(
- "This method cannot be called in app's main thread");
- }
-
- final ConditionVariable cv = new ConditionVariable();
- cv.close();
- ServiceConnection c = new ServiceConnection() {
- public synchronized void onServiceConnected(
- ComponentName className, IBinder binder) {
- Log.v("BinderHelper", "service connected!");
- mBinder = binder;
- cv.open();
- mContext.unbindService(this);
- }
-
- public void onServiceDisconnected(ComponentName className) {
- cv.open();
- mContext.unbindService(this);
- }
- };
- if (mContext.bindService(new Intent(mClass.getName()), c, 0)) {
- cv.block(4500);
- }
- return mBinder;
- }
-}
diff --git a/src/android/net/sip/ISipService.aidl b/src/android/net/sip/ISipService.aidl
deleted file mode 100644
index 6c68213..0000000
--- a/src/android/net/sip/ISipService.aidl
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-import android.net.sip.ISipSession;
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SipProfile;
-
-/**
- * {@hide}
- */
-interface ISipService {
- void open(in SipProfile localProfile);
- void open3(in SipProfile localProfile,
- String incomingCallBroadcastAction,
- in ISipSessionListener listener);
- void close(in String localProfileUri);
- boolean isOpened(String localProfileUri);
- boolean isRegistered(String localProfileUri);
- void setRegistrationListener(String localProfileUri,
- ISipSessionListener listener);
-
- ISipSession createSession(in SipProfile localProfile,
- in ISipSessionListener listener);
- ISipSession getPendingSession(String callId);
-
- SipProfile[] getListOfProfiles();
-}
diff --git a/src/android/net/sip/ISipSession.aidl b/src/android/net/sip/ISipSession.aidl
deleted file mode 100644
index fbcb056..0000000
--- a/src/android/net/sip/ISipSession.aidl
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SessionDescription;
-import android.net.sip.SipProfile;
-
-/**
- * A SIP session that is associated with a SIP dialog or a transaction
- * (e.g., registration) not within a dialog.
- * @hide
- */
-interface ISipSession {
- /**
- * Gets the IP address of the local host on which this SIP session runs.
- *
- * @return the IP address of the local host
- */
- String getLocalIp();
-
- /**
- * Gets the SIP profile that this session is associated with.
- *
- * @return the SIP profile that this session is associated with
- */
- SipProfile getLocalProfile();
-
- /**
- * Gets the SIP profile that this session is connected to. Only available
- * when the session is associated with a SIP dialog.
- *
- * @return the SIP profile that this session is connected to
- */
- SipProfile getPeerProfile();
-
- /**
- * Gets the session state. The value returned must be one of the states in
- * {@link SipSessionState}. One may convert it to {@link SipSessionState} by
- * <code>
- * Enum.valueOf(SipSessionState.class, session.getState());
- * </code>
- *
- * @return the session state
- */
- String getState();
-
- /**
- * Checks if the session is in a call.
- *
- * @return true if the session is in a call
- */
- boolean isInCall();
-
- /**
- * Gets the call ID of the session.
- *
- * @return the call ID
- */
- String getCallId();
-
-
- /**
- * Sets the listener to listen to the session events. A {@link ISipSession}
- * can only hold one listener at a time. Subsequent calls to this method
- * override the previous listener.
- *
- * @param listener to listen to the session events of this object
- */
- void setListener(in ISipSessionListener listener);
-
-
- /**
- * Performs registration to the server specified by the associated local
- * profile. The session listener is called back upon success or failure of
- * registration. The method is only valid to call when the session state is
- * in {@link SipSessionState#READY_TO_CALL}.
- *
- * @param duration duration in second before the registration expires
- * @see ISipSessionListener
- */
- void register(int duration);
-
- /**
- * Performs unregistration to the server specified by the associated local
- * profile. Unregistration is technically the same as registration with zero
- * expiration duration. The session listener is called back upon success or
- * failure of unregistration. The method is only valid to call when the
- * session state is in {@link SipSessionState#READY_TO_CALL}.
- *
- * @see ISipSessionListener
- */
- void unregister();
-
- /**
- * Initiates a call to the specified profile. The session listener is called
- * back upon defined session events. The method is only valid to call when
- * the session state is in {@link SipSessionState#READY_TO_CALL}.
- *
- * @param callee the SIP profile to make the call to
- * @param sessionDescription the session description of this call
- * @see ISipSessionListener
- */
- void makeCall(in SipProfile callee,
- in SessionDescription sessionDescription);
-
- /**
- * Answers an incoming call with the specified session description. The
- * method is only valid to call when the session state is in
- * {@link SipSessionState#INCOMING_CALL}.
- *
- * @param sessionDescription the session description to answer this call
- */
- void answerCall(in SessionDescription sessionDescription);
-
- /**
- * Ends an established call, terminates an outgoing call or rejects an
- * incoming call. The method is only valid to call when the session state is
- * in {@link SipSessionState#IN_CALL},
- * {@link SipSessionState#INCOMING_CALL},
- * {@link SipSessionState#OUTGOING_CALL} or
- * {@link SipSessionState#OUTGOING_CALL_RING_BACK}.
- */
- void endCall();
-
- /**
- * Changes the session description during a call. The method is only valid
- * to call when the session state is in {@link SipSessionState#IN_CALL}.
- *
- * @param sessionDescription the new session description
- */
- void changeCall(in SessionDescription sessionDescription);
-}
diff --git a/src/android/net/sip/ISipSessionListener.aidl b/src/android/net/sip/ISipSessionListener.aidl
deleted file mode 100644
index 8570958..0000000
--- a/src/android/net/sip/ISipSessionListener.aidl
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-import android.net.sip.ISipSession;
-import android.net.sip.SipProfile;
-
-/**
- * Listener class to listen to SIP session events.
- * @hide
- */
-interface ISipSessionListener {
- /**
- * Called when an INVITE request is sent to initiate a new call.
- *
- * @param session the session object that carries out the transaction
- */
- void onCalling(in ISipSession session);
-
- /**
- * Called when an INVITE request is received.
- *
- * @param session the session object that carries out the transaction
- * @param caller the SIP profile of the caller
- * @param sessionDescription the caller's session description
- */
- void onRinging(in ISipSession session, in SipProfile caller,
- in byte[] sessionDescription);
-
- /**
- * Called when a RINGING response is received for the INVITE request sent
- *
- * @param session the session object that carries out the transaction
- */
- void onRingingBack(in ISipSession session);
-
- /**
- * Called when the session is established.
- *
- * @param session the session object that is associated with the dialog
- * @param sessionDescription the peer's session description
- */
- void onCallEstablished(in ISipSession session,
- in byte[] sessionDescription);
-
- /**
- * Called when the session is terminated.
- *
- * @param session the session object that is associated with the dialog
- */
- void onCallEnded(in ISipSession session);
-
- /**
- * Called when the peer is busy during session initialization.
- *
- * @param session the session object that carries out the transaction
- */
- void onCallBusy(in ISipSession session);
-
- /**
- * Called when an error occurs during session initialization and
- * termination.
- *
- * @param session the session object that carries out the transaction
- * @param errorClass name of the exception class
- * @param errorMessage error message
- */
- void onError(in ISipSession session, String errorClass,
- String errorMessage);
-
- /**
- * Called when an error occurs during session modification negotiation.
- *
- * @param session the session object that carries out the transaction
- * @param errorClass name of the exception class
- * @param errorMessage error message
- */
- void onCallChangeFailed(in ISipSession session, String errorClass,
- String errorMessage);
-
- /**
- * Called when a registration request is sent.
- *
- * @param session the session object that carries out the transaction
- */
- void onRegistering(in ISipSession session);
-
- /**
- * Called when registration is successfully done.
- *
- * @param session the session object that carries out the transaction
- * @param duration duration in second before the registration expires
- */
- void onRegistrationDone(in ISipSession session, int duration);
-
- /**
- * Called when the registration fails.
- *
- * @param session the session object that carries out the transaction
- * @param errorClass name of the exception class
- * @param errorMessage error message
- */
- void onRegistrationFailed(in ISipSession session, String errorClass,
- String errorMessage);
-
- /**
- * Called when the registration gets timed out.
- *
- * @param session the session object that carries out the transaction
- */
- void onRegistrationTimeout(in ISipSession session);
-}
diff --git a/src/android/net/sip/SdpSessionDescription.java b/src/android/net/sip/SdpSessionDescription.java
deleted file mode 100644
index 0c29935..0000000
--- a/src/android/net/sip/SdpSessionDescription.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-import gov.nist.javax.sdp.SessionDescriptionImpl;
-import gov.nist.javax.sdp.fields.AttributeField;
-import gov.nist.javax.sdp.fields.ConnectionField;
-import gov.nist.javax.sdp.fields.MediaField;
-import gov.nist.javax.sdp.fields.OriginField;
-import gov.nist.javax.sdp.fields.ProtoVersionField;
-import gov.nist.javax.sdp.fields.SessionNameField;
-import gov.nist.javax.sdp.fields.TimeField;
-import gov.nist.javax.sdp.parser.SDPAnnounceParser;
-
-import android.util.Log;
-
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Vector;
-import javax.sdp.Connection;
-import javax.sdp.MediaDescription;
-import javax.sdp.SdpException;
-
-/**
- * A session description that follows SDP (Session Description Protocol).
- * Refer to <a href="http://tools.ietf.org/html/rfc4566">RFC 4566</a>.
- * @hide
- */
-public class SdpSessionDescription extends SessionDescription {
- private static final String TAG = "SDP";
- private static final String AUDIO = "audio";
- private static final String RTPMAP = "rtpmap";
- private static final String PTIME = "ptime";
- private static final String SENDONLY = "sendonly";
- private static final String RECVONLY = "recvonly";
- private static final String INACTIVE = "inactive";
-
- private SessionDescriptionImpl mSessionDescription;
-
- /**
- * The audio codec information parsed from "rtpmap".
- */
- public static class AudioCodec {
- public final int payloadType;
- public final String name;
- public final int sampleRate;
- public final int sampleCount;
-
- public AudioCodec(int payloadType, String name, int sampleRate,
- int sampleCount) {
- this.payloadType = payloadType;
- this.name = name;
- this.sampleRate = sampleRate;
- this.sampleCount = sampleCount;
- }
- }
-
- /**
- * The builder class used to create an {@link SdpSessionDescription} object.
- */
- public static class Builder {
- private SdpSessionDescription mSdp = new SdpSessionDescription();
- private SessionDescriptionImpl mSessionDescription;
-
- public Builder(String sessionName) throws SdpException {
- mSessionDescription = new SessionDescriptionImpl();
- mSdp.mSessionDescription = mSessionDescription;
- try {
- ProtoVersionField proto = new ProtoVersionField();
- proto.setVersion(0);
- mSessionDescription.addField(proto);
-
- TimeField time = new TimeField();
- time.setZero();
- mSessionDescription.addField(time);
-
- SessionNameField session = new SessionNameField();
- session.setValue(sessionName);
- mSessionDescription.addField(session);
- } catch (Exception e) {
- throwSdpException(e);
- }
- }
-
- public Builder setConnectionInfo(String networkType, String addressType,
- String addr) throws SdpException {
- try {
- ConnectionField connection = new ConnectionField();
- connection.setNetworkType(networkType);
- connection.setAddressType(addressType);
- connection.setAddress(addr);
- mSessionDescription.addField(connection);
- } catch (Exception e) {
- throwSdpException(e);
- }
- return this;
- }
-
- public Builder setOrigin(SipProfile user, long sessionId,
- long sessionVersion, String networkType, String addressType,
- String address) throws SdpException {
- try {
- OriginField origin = new OriginField();
- origin.setUsername(user.getUserName());
- origin.setSessionId(sessionId);
- origin.setSessionVersion(sessionVersion);
- origin.setAddressType(addressType);
- origin.setNetworkType(networkType);
- origin.setAddress(address);
- mSessionDescription.addField(origin);
- } catch (Exception e) {
- throwSdpException(e);
- }
- return this;
- }
-
- public Builder addMedia(String media, int port, int numPorts,
- String transport, Integer... types) throws SdpException {
- MediaField field = new MediaField();
- Vector<Integer> typeVector = new Vector<Integer>();
- Collections.addAll(typeVector, types);
- try {
- field.setMediaType(media);
- field.setMediaPort(port);
- field.setPortCount(numPorts);
- field.setProtocol(transport);
- field.setMediaFormats(typeVector);
- mSessionDescription.addField(field);
- } catch (Exception e) {
- throwSdpException(e);
- }
- return this;
- }
-
- public Builder addMediaAttribute(String type, String name, String value)
- throws SdpException {
- try {
- MediaDescription md = mSdp.getMediaDescription(type);
- if (md == null) {
- throw new SdpException("Should add media first!");
- }
- AttributeField attribute = new AttributeField();
- attribute.setName(name);
- attribute.setValueAllowNull(value);
- mSessionDescription.addField(attribute);
- } catch (Exception e) {
- throwSdpException(e);
- }
- return this;
- }
-
- public Builder addSessionAttribute(String name, String value)
- throws SdpException {
- try {
- AttributeField attribute = new AttributeField();
- attribute.setName(name);
- attribute.setValueAllowNull(value);
- mSessionDescription.addField(attribute);
- } catch (Exception e) {
- throwSdpException(e);
- }
- return this;
- }
-
- private void throwSdpException(Exception e) throws SdpException {
- if (e instanceof SdpException) {
- throw (SdpException) e;
- } else {
- throw new SdpException(e.toString(), e);
- }
- }
-
- public SdpSessionDescription build() {
- return mSdp;
- }
- }
-
- private SdpSessionDescription() {
- }
-
- /**
- * Constructor.
- *
- * @param sdpString an SDP session description to parse
- */
- public SdpSessionDescription(String sdpString) throws SdpException {
- try {
- mSessionDescription = new SDPAnnounceParser(sdpString).parse();
- } catch (ParseException e) {
- throw new SdpException(e.toString(), e);
- }
- verify();
- }
-
- /**
- * Constructor.
- *
- * @param content a raw SDP session description to parse
- */
- public SdpSessionDescription(byte[] content) throws SdpException {
- this(new String(content));
- }
-
- private void verify() throws SdpException {
- // make sure the syntax is correct over the fields we're interested in
- Vector<MediaDescription> descriptions = (Vector<MediaDescription>)
- mSessionDescription.getMediaDescriptions(false);
- for (MediaDescription md : descriptions) {
- md.getMedia().getMediaPort();
- Connection connection = md.getConnection();
- if (connection != null) connection.getAddress();
- md.getMedia().getFormats();
- }
- Connection connection = mSessionDescription.getConnection();
- if (connection != null) connection.getAddress();
- }
-
- /**
- * Gets the connection address of the media.
- *
- * @param type the media type; e.g., "AUDIO"
- * @return the media connection address of the peer
- */
- public String getPeerMediaAddress(String type) {
- try {
- MediaDescription md = getMediaDescription(type);
- Connection connection = md.getConnection();
- if (connection == null) {
- connection = mSessionDescription.getConnection();
- }
- return ((connection == null) ? null : connection.getAddress());
- } catch (SdpException e) {
- // should not occur
- return null;
- }
- }
-
- /**
- * Gets the connection port number of the media.
- *
- * @param type the media type; e.g., "AUDIO"
- * @return the media connection port number of the peer
- */
- public int getPeerMediaPort(String type) {
- try {
- MediaDescription md = getMediaDescription(type);
- return md.getMedia().getMediaPort();
- } catch (SdpException e) {
- // should not occur
- return -1;
- }
- }
-
- private boolean containsAttribute(String type, String name) {
- if (name == null) return false;
- MediaDescription md = getMediaDescription(type);
- Vector<AttributeField> v = (Vector<AttributeField>)
- md.getAttributeFields();
- for (AttributeField field : v) {
- if (name.equals(field.getAttribute().getName())) return true;
- }
- return false;
- }
-
- /**
- * Checks if the media is "sendonly".
- *
- * @param type the media type; e.g., "AUDIO"
- * @return true if the media is "sendonly"
- */
- public boolean isSendOnly(String type) {
- boolean answer = containsAttribute(type, SENDONLY);
- Log.d(TAG, " sendonly? " + answer);
- return answer;
- }
-
- /**
- * Checks if the media is "recvonly".
- *
- * @param type the media type; e.g., "AUDIO"
- * @return true if the media is "recvonly"
- */
- public boolean isReceiveOnly(String type) {
- boolean answer = containsAttribute(type, RECVONLY);
- Log.d(TAG, " recvonly? " + answer);
- return answer;
- }
-
- /**
- * Checks if the media is in sending; i.e., not "recvonly" and not
- * "inactive".
- *
- * @param type the media type; e.g., "AUDIO"
- * @return true if the media is sending
- */
- public boolean isSending(String type) {
- boolean answer = !containsAttribute(type, RECVONLY)
- && !containsAttribute(type, INACTIVE);
-
- Log.d(TAG, " sending? " + answer);
- return answer;
- }
-
- /**
- * Checks if the media is in receiving; i.e., not "sendonly" and not
- * "inactive".
- *
- * @param type the media type; e.g., "AUDIO"
- * @return true if the media is receiving
- */
- public boolean isReceiving(String type) {
- boolean answer = !containsAttribute(type, SENDONLY)
- && !containsAttribute(type, INACTIVE);
- Log.d(TAG, " receiving? " + answer);
- return answer;
- }
-
- private AudioCodec parseAudioCodec(String rtpmap, int ptime) {
- String[] ss = rtpmap.split(" ");
- int payloadType = Integer.parseInt(ss[0]);
-
- ss = ss[1].split("/");
- String name = ss[0];
- int sampleRate = Integer.parseInt(ss[1]);
- int channelCount = 1;
- if (ss.length > 2) channelCount = Integer.parseInt(ss[2]);
- int sampleCount = sampleRate / (1000 / ptime) * channelCount;
- return new AudioCodec(payloadType, name, sampleRate, sampleCount);
- }
-
- /**
- * Gets the list of audio codecs in this session description.
- *
- * @return the list of audio codecs in this session description
- */
- public List<AudioCodec> getAudioCodecs() {
- MediaDescription md = getMediaDescription(AUDIO);
- if (md == null) return new ArrayList<AudioCodec>();
-
- // FIXME: what happens if ptime is missing
- int ptime = 20;
- try {
- String value = md.getAttribute(PTIME);
- if (value != null) ptime = Integer.parseInt(value);
- } catch (Throwable t) {
- Log.w(TAG, "getCodecs(): ignored: " + t);
- }
-
- List<AudioCodec> codecs = new ArrayList<AudioCodec>();
- Vector<AttributeField> v = (Vector<AttributeField>)
- md.getAttributeFields();
- for (AttributeField field : v) {
- try {
- if (RTPMAP.equals(field.getName())) {
- AudioCodec codec = parseAudioCodec(field.getValue(), ptime);
- if (codec != null) codecs.add(codec);
- }
- } catch (Throwable t) {
- Log.w(TAG, "getCodecs(): ignored: " + t);
- }
- }
- return codecs;
- }
-
- /**
- * Gets the media description of the specified type.
- *
- * @param type the media type; e.g., "AUDIO"
- * @return the media description of the specified type
- */
- public MediaDescription getMediaDescription(String type) {
- MediaDescription[] all = getMediaDescriptions();
- if ((all == null) || (all.length == 0)) return null;
- for (MediaDescription md : all) {
- String t = md.getMedia().getMedia();
- if (t.equalsIgnoreCase(type)) return md;
- }
- return null;
- }
-
- /**
- * Gets all the media descriptions in this session description.
- *
- * @return all the media descriptions in this session description
- */
- public MediaDescription[] getMediaDescriptions() {
- try {
- Vector<MediaDescription> descriptions = (Vector<MediaDescription>)
- mSessionDescription.getMediaDescriptions(false);
- MediaDescription[] all = new MediaDescription[descriptions.size()];
- return descriptions.toArray(all);
- } catch (SdpException e) {
- Log.e(TAG, "getMediaDescriptions", e);
- }
- return null;
- }
-
- @Override
- public String getType() {
- return "sdp";
- }
-
- @Override
- public byte[] getContent() {
- return mSessionDescription.toString().getBytes();
- }
-
- @Override
- public String toString() {
- return mSessionDescription.toString();
- }
-}
diff --git a/src/android/net/sip/SessionDescription.aidl b/src/android/net/sip/SessionDescription.aidl
deleted file mode 100644
index a120d16..0000000
--- a/src/android/net/sip/SessionDescription.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-parcelable SessionDescription;
diff --git a/src/android/net/sip/SessionDescription.java b/src/android/net/sip/SessionDescription.java
deleted file mode 100644
index d476f0b..0000000
--- a/src/android/net/sip/SessionDescription.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * Abstract class of a session description.
- * @hide
- */
-public abstract class SessionDescription implements Parcelable {
- /** @hide */
- public static final Parcelable.Creator<SessionDescription> CREATOR =
- new Parcelable.Creator<SessionDescription>() {
- public SessionDescription createFromParcel(Parcel in) {
- return new SessionDescriptionImpl(in);
- }
-
- public SessionDescription[] newArray(int size) {
- return new SessionDescriptionImpl[size];
- }
- };
-
- /**
- * Gets the type of the session description; e.g., "SDP".
- *
- * @return the session description type
- */
- public abstract String getType();
-
- /**
- * Gets the raw content of the session description.
- *
- * @return the content of the session description
- */
- public abstract byte[] getContent();
-
- /** @hide */
- public void writeToParcel(Parcel out, int flags) {
- out.writeString(getType());
- out.writeByteArray(getContent());
- }
-
- /** @hide */
- public int describeContents() {
- return 0;
- }
-
- private static class SessionDescriptionImpl extends SessionDescription {
- private String mType;
- private byte[] mContent;
-
- SessionDescriptionImpl(Parcel in) {
- mType = in.readString();
- mContent = in.createByteArray();
- }
-
- @Override
- public String getType() {
- return mType;
- }
-
- @Override
- public byte[] getContent() {
- return mContent;
- }
- }
-}
diff --git a/src/android/net/sip/SipAudioCall.java b/src/android/net/sip/SipAudioCall.java
deleted file mode 100644
index abdc9d7..0000000
--- a/src/android/net/sip/SipAudioCall.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-import android.net.rtp.AudioGroup;
-import android.net.rtp.AudioStream;
-import android.os.Message;
-
-import javax.sip.SipException;
-
-/**
- * Interface for making audio calls over SIP.
- * @hide
- */
-public interface SipAudioCall {
- /** Listener class for all event callbacks. */
- public interface Listener {
- /**
- * Called when the call object is ready to make another call.
- *
- * @param call the call object that is ready to make another call
- */
- void onReadyToCall(SipAudioCall call);
-
- /**
- * Called when a request is sent out to initiate a new call.
- *
- * @param call the call object that carries out the audio call
- */
- void onCalling(SipAudioCall call);
-
- /**
- * Called when a new call comes in.
- *
- * @param call the call object that carries out the audio call
- * @param caller the SIP profile of the caller
- */
- void onRinging(SipAudioCall call, SipProfile caller);
-
- /**
- * Called when a RINGING response is received for the INVITE request sent
- *
- * @param call the call object that carries out the audio call
- */
- void onRingingBack(SipAudioCall call);
-
- /**
- * Called when the session is established.
- *
- * @param call the call object that carries out the audio call
- */
- void onCallEstablished(SipAudioCall call);
-
- /**
- * Called when the session is terminated.
- *
- * @param call the call object that carries out the audio call
- */
- void onCallEnded(SipAudioCall call);
-
- /**
- * Called when the peer is busy during session initialization.
- *
- * @param call the call object that carries out the audio call
- */
- void onCallBusy(SipAudioCall call);
-
- /**
- * Called when the call is on hold.
- *
- * @param call the call object that carries out the audio call
- */
- void onCallHeld(SipAudioCall call);
-
- /**
- * Called when an error occurs.
- *
- * @param call the call object that carries out the audio call
- * @param errorMessage error message
- */
- void onError(SipAudioCall call, String errorMessage);
- }
-
- /**
- * The adapter class for {@link SipAudioCall#Listener}. The default
- * implementation of all callback methods is no-op.
- */
- public class Adapter implements Listener {
- protected void onChanged(SipAudioCall call) {
- }
- public void onReadyToCall(SipAudioCall call) {
- onChanged(call);
- }
- public void onCalling(SipAudioCall call) {
- onChanged(call);
- }
- public void onRinging(SipAudioCall call, SipProfile caller) {
- onChanged(call);
- }
- public void onRingingBack(SipAudioCall call) {
- onChanged(call);
- }
- public void onCallEstablished(SipAudioCall call) {
- onChanged(call);
- }
- public void onCallEnded(SipAudioCall call) {
- onChanged(call);
- }
- public void onCallBusy(SipAudioCall call) {
- onChanged(call);
- }
- public void onCallHeld(SipAudioCall call) {
- onChanged(call);
- }
- public void onError(SipAudioCall call, String errorMessage) {
- onChanged(call);
- }
- }
-
- /**
- * Sets the listener to listen to the audio call events. The method calls
- * {@link #setListener(Listener, false)}.
- *
- * @param listener to listen to the audio call events of this object
- * @see #setListener(Listener, boolean)
- */
- void setListener(Listener listener);
-
- /**
- * Sets the listener to listen to the audio call events. A
- * {@link SipAudioCall} can only hold one listener at a time. Subsequent
- * calls to this method override the previous listener.
- *
- * @param listener to listen to the audio call events of this object
- * @param callbackImmediately set to true if the caller wants to be called
- * back immediately on the current state
- */
- void setListener(Listener listener, boolean callbackImmediately);
-
- /**
- * Closes this object. The object is not usable after being closed.
- */
- void close();
-
- /**
- * Initiates an audio call to the specified profile.
- *
- * @param callee the SIP profile to make the call to
- * @param sipManager the {@link SipManager} object to help make call with
- */
- void makeCall(SipProfile callee, SipManager sipManager) throws SipException;
-
- /**
- * Attaches an incoming call to this call object.
- *
- * @param session the session that receives the incoming call
- * @param sdp the session description of the incoming call
- */
- void attachCall(ISipSession session, SdpSessionDescription sdp)
- throws SipException;
-
- /** Ends a call. */
- void endCall() throws SipException;
-
- /**
- * Puts a call on hold. When succeeds,
- * {@link #Listener#onCallHeld(SipAudioCall)} is called.
- */
- void holdCall() throws SipException;
-
- /** Answers a call. */
- void answerCall() throws SipException;
-
- /**
- * Continues a call that's on hold. When succeeds,
- * {@link #Listener#onCallEstablished(SipAudioCall)} is called.
- */
- void continueCall() throws SipException;
-
- /** Puts the device to in-call mode. */
- void setInCallMode();
-
- /** Puts the device to speaker mode. */
- void setSpeakerMode();
-
- /** Toggles mute. */
- void toggleMute();
-
- /**
- * Checks if the call is on hold.
- *
- * @return true if the call is on hold
- */
- boolean isOnHold();
-
- /**
- * Checks if the call is muted.
- *
- * @return true if the call is muted
- */
- boolean isMuted();
-
- /**
- * Sends a DTMF code.
- *
- * @param code the DTMF code to send
- */
- void sendDtmf(int code);
-
- /**
- * Sends a DTMF code.
- *
- * @param code the DTMF code to send
- * @param result the result message to send when done
- */
- void sendDtmf(int code, Message result);
-
- /**
- * Gets the {@link AudioStream} object used in this call. The object
- * represents the RTP stream that carries the audio data to and from the
- * peer. The object may not be created before the call is established. And
- * it is undefined after the call ends or the {@link #close} method is
- * called.
- *
- * @return the {@link AudioStream} object or null if the RTP stream has not
- * yet been set up
- */
- AudioStream getAudioStream();
-
- /**
- * Gets the {@link AudioGroup} object which the {@link AudioStream} object
- * joins. The group object may not exist before the call is established.
- * Also, the {@code AudioStream} may change its group during a call (e.g.,
- * after the call is held/un-held). Finally, the {@code AudioGroup} object
- * returned by this method is undefined after the call ends or the
- * {@link #close} method is called.
- *
- * @return the {@link AudioGroup} object or null if the RTP stream has not
- * yet been set up
- * @see #getAudioStream
- */
- AudioGroup getAudioGroup();
-
- /**
- * Checks if the call is established.
- *
- * @return true if the call is established
- */
- boolean isInCall();
-
- /**
- * Gets the local SIP profile.
- *
- * @return the local SIP profile
- */
- SipProfile getLocalProfile();
-
- /**
- * Gets the peer's SIP profile.
- *
- * @return the peer's SIP profile
- */
- SipProfile getPeerProfile();
-
- /**
- * Gets the state of the {@link ISipSession} that carries this call.
- *
- * @return the session state
- */
- SipSessionState getState();
-
- /**
- * Gets the {@link ISipSession} that carries this call.
- *
- * @return the session object that carries this call
- */
- ISipSession getSipSession();
-
- /**
- * Enables/disables the ring-back tone.
- *
- * @param enabled true to enable; false to disable
- */
- void setRingbackToneEnabled(boolean enabled);
-
- /**
- * Enables/disables the ring tone.
- *
- * @param enabled true to enable; false to disable
- */
- void setRingtoneEnabled(boolean enabled);
-}
diff --git a/src/android/net/sip/SipManager.java b/src/android/net/sip/SipManager.java
deleted file mode 100644
index 6d48e65..0000000
--- a/src/android/net/sip/SipManager.java
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-import com.android.sip.SipAudioCallImpl;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Looper;
-import android.os.RemoteException;
-
-import java.text.ParseException;
-import javax.sip.SipException;
-
-/**
- * The class provides API for various SIP related tasks. Specifically, the API
- * allows the application to:
- * <ul>
- * <li>register a {@link SipProfile} to have the background SIP service listen
- * to incoming calls and broadcast them with registered command string. See
- * {@link #open(SipProfile, String, SipRegistrationListener)},
- * {@link #open(SipProfile)}, {@link #close(String)},
- * {@link #isOpened(String)} and {@link isRegistered(String)}. It also
- * facilitates handling of the incoming call broadcast intent. See
- * {@link #isIncomingCallIntent(Intent)}, {@link #getCallId(Intent)},
- * {@link #getOfferSessionDescription(Intent)} and
- * {@link #takeAudioCall(Context, Intent, SipAudioCall.Listener)}.</li>
- * <li>make/take SIP-based audio calls. See
- * {@link #makeAudioCall(Context, SipProfile, SipProfile, SipAudioCall.Listener)}
- * and {@link #takeAudioCall(Context, Intent, SipAudioCall.Listener}.</li>
- * <li>register/unregister with a SIP service provider. See
- * {@link #register(SipProfile, int, ISipSessionListener)} and
- * {@link #unregister(SipProfile, ISipSessionListener)}.</li>
- * <li>process SIP events directly with a {@link ISipSession} created by
- * {@link createSipSession(SipProfile, ISipSessionListener)}.</li>
- * </ul>
- * @hide
- */
-public class SipManager {
- /** @hide */
- public static final String SIP_INCOMING_CALL_ACTION =
- "com.android.phone.SIP_INCOMING_CALL";
- /** @hide */
- public static final String SIP_ADD_PHONE_ACTION =
- "com.android.phone.SIP_ADD_PHONE";
- /** @hide */
- public static final String SIP_REMOVE_PHONE_ACTION =
- "com.android.phone.SIP_REMOVE_PHONE";
- /** @hide */
- public static final String LOCAL_URI_KEY = "LOCAL SIPURI";
-
- private static final String CALL_ID_KEY = "CallID";
- private static final String OFFER_SD_KEY = "OfferSD";
-
- private ISipService mSipService;
-
- // Will be removed once the SIP service is integrated into framework
- private BinderHelper<ISipService> mBinderHelper;
-
- /**
- * Creates a manager instance and initializes the background SIP service.
- * Will be removed once the SIP service is integrated into framework.
- *
- * @param context context to start the SIP service
- * @return the manager instance
- */
- public static SipManager getInstance(final Context context) {
- final SipManager manager = new SipManager();
- // ISipService must be created from non-main thread.
- if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
- new Thread(new Runnable() {
- public void run() {
- manager.createSipService(context);
- }
- }).start();
- } else {
- manager.createSipService(context);
- }
- return manager;
- }
-
- private SipManager() {
- }
-
- private void createSipService(Context context) {
- if (mSipService != null) return;
- if (mBinderHelper == null) {
- mBinderHelper = new BinderHelper<ISipService>(
- context, ISipService.class);
- mBinderHelper.startService();
- }
- mSipService = ISipService.Stub.asInterface(mBinderHelper.getBinder());
- }
-
- /**
- * Opens the profile for making calls and/or receiving calls. Subsequent
- * SIP calls can be made through the default phone UI. The caller may also
- * make subsequent calls through
- * {@link #makeAudioCall(Context, String, String, SipAudioCall.Listener)}.
- * If the receiving-call option is enabled in the profile, the SIP service
- * will register the profile to the corresponding server periodically in
- * order to receive calls from the server.
- *
- * @param localProfile the SIP profile to make calls from
- * @throws SipException if the profile contains incorrect settings or
- * calling the SIP service results in an error
- */
- public void open(SipProfile localProfile) throws SipException {
- try {
- mSipService.open(localProfile);
- } catch (RemoteException e) {
- throw new SipException("open()", e);
- }
- }
-
- /**
- * Opens the profile for making calls and/or receiving calls. Subsequent
- * SIP calls can be made through the default phone UI. The caller may also
- * make subsequent calls through
- * {@link #makeAudioCall(Context, String, String, SipAudioCall.Listener)}.
- * If the receiving-call option is enabled in the profile, the SIP service
- * will register the profile to the corresponding server periodically in
- * order to receive calls from the server.
- *
- * @param localProfile the SIP profile to receive incoming calls for
- * @param incomingCallBroadcastAction the action to be broadcast when an
- * incoming call is received
- * @param listener to listen to registration events; can be null
- * @throws SipException if the profile contains incorrect settings or
- * calling the SIP service results in an error
- */
- public void open(SipProfile localProfile,
- String incomingCallBroadcastAction,
- SipRegistrationListener listener) throws SipException {
- try {
- mSipService.open3(localProfile, incomingCallBroadcastAction,
- createRelay(listener));
- } catch (RemoteException e) {
- throw new SipException("open()", e);
- }
- }
-
- /**
- * Sets the listener to listen to registration events. No effect if the
- * profile has not been opened to receive calls
- * (see {@link #open(SipProfile, String, SipRegistrationListener)} and
- * {@link #open(SipProfile)}).
- *
- * @param localProfileUri the URI of the profile
- * @param listener to listen to registration events; can be null
- * @throws SipException if calling the SIP service results in an error
- */
- public void setRegistrationListener(String localProfileUri,
- SipRegistrationListener listener) throws SipException {
- try {
- mSipService.setRegistrationListener(
- localProfileUri, createRelay(listener));
- } catch (RemoteException e) {
- throw new SipException("setRegistrationListener()", e);
- }
- }
-
- /**
- * Closes the specified profile to not make/receive calls. All the resources
- * that were allocated to the profile are also released.
- *
- * @param localProfileUri the URI of the profile to close
- * @throws SipException if calling the SIP service results in an error
- */
- public void close(String localProfileUri) throws SipException {
- try {
- mSipService.close(localProfileUri);
- } catch (RemoteException e) {
- throw new SipException("close()", e);
- }
- }
-
- /**
- * Checks if the specified profile is enabled to receive calls.
- *
- * @param localProfileUri the URI of the profile in question
- * @return true if the profile is enabled to receive calls
- * @throws SipException if calling the SIP service results in an error
- */
- public boolean isOpened(String localProfileUri) throws SipException {
- try {
- return mSipService.isOpened(localProfileUri);
- } catch (RemoteException e) {
- throw new SipException("isOpened()", e);
- }
- }
-
- /**
- * Checks if the specified profile is registered to the server for
- * receiving calls.
- *
- * @param localProfileUri the URI of the profile in question
- * @return true if the profile is registered to the server
- * @throws SipException if calling the SIP service results in an error
- */
- public boolean isRegistered(String localProfileUri) throws SipException {
- try {
- return mSipService.isRegistered(localProfileUri);
- } catch (RemoteException e) {
- throw new SipException("isRegistered()", e);
- }
- }
-
- /**
- * Creates a {@link SipAudioCall} to make a call.
- *
- * @param context context to create a {@link SipAudioCall} object
- * @param localProfile the SIP profile to make the call from
- * @param peerProfile the SIP profile to make the call to
- * @param listener to listen to the call events from {@link SipAudioCall};
- * can be null
- * @return a {@link SipAudioCall} object
- * @throws SipException if calling the SIP service results in an error
- */
- public SipAudioCall makeAudioCall(Context context, SipProfile localProfile,
- SipProfile peerProfile, SipAudioCall.Listener listener)
- throws SipException {
- SipAudioCall call = new SipAudioCallImpl(context, localProfile);
- call.setListener(listener);
- call.makeCall(peerProfile, this);
- return call;
- }
-
- /**
- * Creates a {@link SipAudioCall} to make a call. To use this method, one
- * must call {@link #open(SipProfile)} first.
- *
- * @param context context to create a {@link SipAudioCall} object
- * @param localProfileUri URI of the SIP profile to make the call from
- * @param peerProfileUri URI of the SIP profile to make the call to
- * @param listener to listen to the call events from {@link SipAudioCall};
- * can be null
- * @return a {@link SipAudioCall} object
- * @throws SipException if calling the SIP service results in an error
- */
- public SipAudioCall makeAudioCall(Context context, String localProfileUri,
- String peerProfileUri, SipAudioCall.Listener listener)
- throws SipException {
- try {
- return makeAudioCall(context,
- new SipProfile.Builder(localProfileUri).build(),
- new SipProfile.Builder(peerProfileUri).build(), listener);
- } catch (ParseException e) {
- throw new SipException("build SipProfile", e);
- }
- }
-
- /**
- * The method calls {@code takeAudioCall(context, incomingCallIntent,
- * listener, true}.
- *
- * @see #takeAudioCall(Context, Intent, SipAudioCall.Listener, boolean)
- */
- public SipAudioCall takeAudioCall(Context context,
- Intent incomingCallIntent, SipAudioCall.Listener listener)
- throws SipException {
- return takeAudioCall(context, incomingCallIntent, listener, true);
- }
-
- /**
- * Creates a {@link SipAudioCall} to take an incoming call. Before the call
- * is returned, the listener will receive a
- * {@link SipAudioCall#Listener.onRinging(SipAudioCall, SipProfile)}
- * callback.
- *
- * @param context context to create a {@link SipAudioCall} object
- * @param incomingCallIntent the incoming call broadcast intent
- * @param listener to listen to the call events from {@link SipAudioCall};
- * can be null
- * @return a {@link SipAudioCall} object
- * @throws SipException if calling the SIP service results in an error
- */
- public SipAudioCall takeAudioCall(Context context,
- Intent incomingCallIntent, SipAudioCall.Listener listener,
- boolean ringtoneEnabled) throws SipException {
- if (incomingCallIntent == null) return null;
-
- String callId = getCallId(incomingCallIntent);
- if (callId == null) {
- throw new SipException("Call ID missing in incoming call intent");
- }
-
- byte[] offerSd = getOfferSessionDescription(incomingCallIntent);
- if (offerSd == null) {
- throw new SipException("Session description missing in incoming "
- + "call intent");
- }
-
- try {
- SdpSessionDescription sdp = new SdpSessionDescription(offerSd);
-
- ISipSession session = mSipService.getPendingSession(callId);
- if (session == null) return null;
- SipAudioCall call = new SipAudioCallImpl(
- context, session.getLocalProfile());
- call.setRingtoneEnabled(ringtoneEnabled);
- call.attachCall(session, sdp);
- call.setListener(listener);
- return call;
- } catch (Throwable t) {
- throw new SipException("takeAudioCall()", t);
- }
- }
-
- /**
- * Checks if the intent is an incoming call broadcast intent.
- *
- * @param intent the intent in question
- * @return true if the intent is an incoming call broadcast intent
- */
- public static boolean isIncomingCallIntent(Intent intent) {
- if (intent == null) return false;
- String callId = getCallId(intent);
- byte[] offerSd = getOfferSessionDescription(intent);
- return ((callId != null) && (offerSd != null));
- }
-
- /**
- * Gets the call ID from the specified incoming call broadcast intent.
- *
- * @param incomingCallIntent the incoming call broadcast intent
- * @return the call ID or null if the intent does not contain it
- */
- public static String getCallId(Intent incomingCallIntent) {
- return incomingCallIntent.getStringExtra(CALL_ID_KEY);
- }
-
- /**
- * Gets the offer session description from the specified incoming call
- * broadcast intent.
- *
- * @param incomingCallIntent the incoming call broadcast intent
- * @return the offer session description or null if the intent does not
- * have it
- */
- public static byte[] getOfferSessionDescription(Intent incomingCallIntent) {
- return incomingCallIntent.getByteArrayExtra(OFFER_SD_KEY);
- }
-
- /**
- * Creates an incoming call broadcast intent.
- *
- * @param action the action string to broadcast
- * @param callId the call ID of the incoming call
- * @param sessionDescription the session description of the incoming call
- * @return the incoming call intent
- * @hide
- */
- public static Intent createIncomingCallBroadcast(String action,
- String callId, byte[] sessionDescription) {
- Intent intent = new Intent(action);
- intent.putExtra(CALL_ID_KEY, callId);
- intent.putExtra(OFFER_SD_KEY, sessionDescription);
- return intent;
- }
-
- /**
- * Registers the profile to the corresponding server for receiving calls.
- * {@link #open(SipProfile, String, SipRegistrationListener)} is still
- * needed to be called at least once in order for the SIP service to
- * broadcast an intent when an incoming call is received.
- *
- * @param localProfile the SIP profile to register with
- * @param expiryTime registration expiration time (in second)
- * @param listener to listen to the registration events
- * @throws SipException if calling the SIP service results in an error
- */
- public void register(SipProfile localProfile, int expiryTime,
- SipRegistrationListener listener) throws SipException {
- try {
- ISipSession session = mSipService.createSession(
- localProfile, createRelay(listener));
- session.register(expiryTime);
- } catch (RemoteException e) {
- throw new SipException("register()", e);
- }
- }
-
- /**
- * Unregisters the profile from the corresponding server for not receiving
- * further calls.
- *
- * @param localProfile the SIP profile to register with
- * @param listener to listen to the registration events
- * @throws SipException if calling the SIP service results in an error
- */
- public void unregister(SipProfile localProfile,
- SipRegistrationListener listener) throws SipException {
- try {
- ISipSession session = mSipService.createSession(
- localProfile, createRelay(listener));
- session.unregister();
- } catch (RemoteException e) {
- throw new SipException("unregister()", e);
- }
- }
-
- /**
- * Gets the {@link ISipSession} that handles the incoming call. For audio
- * calls, consider to use {@link SipAudioCall} to handle the incoming call.
- * See {@link #takeAudioCall(Context, Intent, SipAudioCall.Listener)}.
- * Note that the method may be called only once for the same intent. For
- * subsequent calls on the same intent, the method returns null.
- *
- * @param incomingCallIntent the incoming call broadcast intent
- * @return the session object that handles the incoming call
- */
- public ISipSession getSessionFor(Intent incomingCallIntent)
- throws SipException {
- try {
- String callId = getCallId(incomingCallIntent);
- return mSipService.getPendingSession(callId);
- } catch (RemoteException e) {
- throw new SipException("getSessionFor()", e);
- }
- }
-
- private static ISipSessionListener createRelay(
- SipRegistrationListener listener) {
- return ((listener == null) ? null : new ListenerRelay(listener));
- }
-
- /**
- * Creates a {@link ISipSession} with the specified profile. Use other
- * methods, if applicable, instead of interacting with {@link ISipSession}
- * directly.
- *
- * @param localProfile the SIP profile the session is associated with
- * @param listener to listen to SIP session events
- */
- public ISipSession createSipSession(SipProfile localProfile,
- ISipSessionListener listener) throws SipException {
- try {
- return mSipService.createSession(localProfile, listener);
- } catch (RemoteException e) {
- throw new SipException("createSipSession()", e);
- }
- }
-
- /**
- * Gets the list of profiles hosted by the SIP service. The user information
- * (username, password and display name) are crossed out.
- * @hide
- */
- public SipProfile[] getListOfProfiles() {
- try {
- return mSipService.getListOfProfiles();
- } catch (RemoteException e) {
- return null;
- }
- }
-
- private static class ListenerRelay extends SipSessionAdapter {
- private SipRegistrationListener mListener;
-
- // listener must not be null
- public ListenerRelay(SipRegistrationListener listener) {
- mListener = listener;
- }
-
- private String getUri(ISipSession session) {
- try {
- return session.getLocalProfile().getUriString();
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void onRegistering(ISipSession session) {
- mListener.onRegistering(getUri(session));
- }
-
- @Override
- public void onRegistrationDone(ISipSession session, int duration) {
- long expiryTime = duration;
- if (duration > 0) expiryTime += System.currentTimeMillis();
- mListener.onRegistrationDone(getUri(session), expiryTime);
- }
-
- @Override
- public void onRegistrationFailed(ISipSession session, String className,
- String message) {
- mListener.onRegistrationFailed(getUri(session), className, message);
- }
-
- @Override
- public void onRegistrationTimeout(ISipSession session) {
- mListener.onRegistrationFailed(getUri(session),
- SipException.class.getName(), "registration timed out");
- }
- }
-}
diff --git a/src/android/net/sip/SipProfile.aidl b/src/android/net/sip/SipProfile.aidl
deleted file mode 100644
index 3b6f68f..0000000
--- a/src/android/net/sip/SipProfile.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-parcelable SipProfile;
diff --git a/src/android/net/sip/SipProfile.java b/src/android/net/sip/SipProfile.java
deleted file mode 100644
index e71c293..0000000
--- a/src/android/net/sip/SipProfile.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import java.io.Serializable;
-import java.text.ParseException;
-import javax.sip.InvalidArgumentException;
-import javax.sip.ListeningPoint;
-import javax.sip.PeerUnavailableException;
-import javax.sip.SipFactory;
-import javax.sip.address.Address;
-import javax.sip.address.AddressFactory;
-import javax.sip.address.SipURI;
-import javax.sip.address.URI;
-
-/**
- * Class containing a SIP account, domain and server information.
- * @hide
- */
-public class SipProfile implements Parcelable, Serializable {
- private static final long serialVersionUID = 1L;
- private static final int DEFAULT_PORT = 5060;
- private Address mAddress;
- private String mProxyAddress;
- private String mPassword;
- private String mDomain;
- private String mProtocol = ListeningPoint.UDP;
- private String mProfileName;
- private boolean mSendKeepAlive = false;
- private boolean mAutoRegistration = true;
-
- /** @hide */
- public static final Parcelable.Creator<SipProfile> CREATOR =
- new Parcelable.Creator<SipProfile>() {
- public SipProfile createFromParcel(Parcel in) {
- return new SipProfile(in);
- }
-
- public SipProfile[] newArray(int size) {
- return new SipProfile[size];
- }
- };
-
- /**
- * Class to help create a {@link SipProfile}.
- */
- public static class Builder {
- private AddressFactory mAddressFactory;
- private SipProfile mProfile = new SipProfile();
- private SipURI mUri;
- private String mDisplayName;
- private String mProxyAddress;
-
- {
- try {
- mAddressFactory =
- SipFactory.getInstance().createAddressFactory();
- } catch (PeerUnavailableException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Constructor.
- *
- * @param uriString the URI string as "sip:<user_name>@<domain>"
- * @throws ParseException if the string is not a valid URI
- */
- public Builder(String uriString) throws ParseException {
- if (uriString == null) {
- throw new NullPointerException("uriString cannot be null");
- }
- URI uri = mAddressFactory.createURI(fix(uriString));
- if (uri instanceof SipURI) {
- mUri = (SipURI) uri;
- } else {
- throw new ParseException(uriString + " is not a SIP URI", 0);
- }
- mProfile.mDomain = mUri.getHost();
- }
-
- /**
- * Constructor.
- *
- * @param username username of the SIP account
- * @param serverDomain the SIP server domain; if the network address
- * is different from the domain, use
- * {@link #setOutboundProxy(String)} to set server address
- * @throws ParseException if the parameters are not valid
- */
- public Builder(String username, String serverDomain)
- throws ParseException {
- if ((username == null) || (serverDomain == null)) {
- throw new NullPointerException(
- "username and serverDomain cannot be null");
- }
- mUri = mAddressFactory.createSipURI(username, serverDomain);
- mProfile.mDomain = serverDomain;
- }
-
- private String fix(String uriString) {
- return (uriString.trim().toLowerCase().startsWith("sip:")
- ? uriString
- : "sip:" + uriString);
- }
-
- /**
- * Sets the name of the profile. This name is given by user.
- *
- * @param name name of the profile
- * @return this builder object
- */
- public Builder setProfileName(String name) {
- mProfile.mProfileName = name;
- return this;
- }
-
- /**
- * Sets the password of the SIP account
- *
- * @param password password of the SIP account
- * @return this builder object
- */
- public Builder setPassword(String password) {
- mUri.setUserPassword(password);
- return this;
- }
-
- /**
- * Sets the port number of the server. By default, it is 5060.
- *
- * @param port port number of the server
- * @return this builder object
- * @throws InvalidArgumentException if the port number is out of range
- */
- public Builder setPort(int port) throws InvalidArgumentException {
- mUri.setPort(port);
- return this;
- }
-
- /**
- * Sets the protocol used to connect to the SIP server. Currently,
- * only "UDP" and "TCP" are supported.
- *
- * @param protocol the protocol string
- * @return this builder object
- * @throws InvalidArgumentException if the protocol is not recognized
- */
- public Builder setProtocol(String protocol)
- throws InvalidArgumentException {
- if (protocol == null) {
- throw new NullPointerException("protocol cannot be null");
- }
- protocol = protocol.toUpperCase();
- if (!protocol.equals("UDP") && !protocol.equals("TCP")) {
- throw new InvalidArgumentException(
- "unsupported protocol: " + protocol);
- }
- mProfile.mProtocol = protocol;
- return this;
- }
-
- /**
- * Sets the outbound proxy of the SIP server.
- *
- * @param outboundProxy the network address of the outbound proxy
- * @return this builder object
- */
- public Builder setOutboundProxy(String outboundProxy) {
- mProxyAddress = outboundProxy;
- return this;
- }
-
- /**
- * Sets the display name of the user.
- *
- * @param displayName display name of the user
- * @return this builder object
- */
- public Builder setDisplayName(String displayName) {
- mDisplayName = displayName;
- return this;
- }
-
- /**
- * Sets the send keep-alive flag.
- *
- * @param flag true if sending keep-alive message is required,
- * false otherwise
- * @return this builder object
- */
- public Builder setSendKeepAlive(boolean flag) {
- mProfile.mSendKeepAlive = flag;
- return this;
- }
-
-
- /**
- * Sets the auto. registration flag.
- *
- * @param flag true if the profile will be registered automatically,
- * false otherwise
- * @return this builder object
- */
- public Builder setAutoRegistration(boolean flag) {
- mProfile.mAutoRegistration = flag;
- return this;
- }
-
- /**
- * Builds and returns the SIP profile object.
- *
- * @return the profile object created
- */
- public SipProfile build() {
- // remove password from URI
- mProfile.mPassword = mUri.getUserPassword();
- mUri.setUserPassword(null);
- try {
- mProfile.mAddress = mAddressFactory.createAddress(
- mDisplayName, mUri);
- if (!TextUtils.isEmpty(mProxyAddress)) {
- SipURI uri = (SipURI)
- mAddressFactory.createURI(fix(mProxyAddress));
- mProfile.mProxyAddress = uri.getHost();
- }
- } catch (ParseException e) {
- // must not occur
- throw new RuntimeException(e);
- }
- return mProfile;
- }
- }
-
- private SipProfile() {
- }
-
- private SipProfile(Parcel in) {
- mAddress = (Address) in.readSerializable();
- mProxyAddress = in.readString();
- mPassword = in.readString();
- mDomain = in.readString();
- mProtocol = in.readString();
- mProfileName = in.readString();
- mSendKeepAlive = (in.readInt() == 0) ? false : true;
- mAutoRegistration = (in.readInt() == 0) ? false : true;
- }
-
- /** @hide */
- public void writeToParcel(Parcel out, int flags) {
- out.writeSerializable(mAddress);
- out.writeString(mProxyAddress);
- out.writeString(mPassword);
- out.writeString(mDomain);
- out.writeString(mProtocol);
- out.writeString(mProfileName);
- out.writeInt(mSendKeepAlive ? 1 : 0);
- out.writeInt(mAutoRegistration ? 1 : 0);
- }
-
- /** @hide */
- public int describeContents() {
- return 0;
- }
-
- /**
- * Gets the SIP URI of this profile.
- *
- * @return the SIP URI of this profile
- */
- public SipURI getUri() {
- return (SipURI) mAddress.getURI();
- }
-
- /**
- * Gets the SIP URI string of this profile.
- *
- * @return the SIP URI string of this profile
- */
- public String getUriString() {
- return mAddress.getURI().toString();
- }
-
- /**
- * Gets the SIP address of this profile.
- *
- * @return the SIP address of this profile
- */
- public Address getSipAddress() {
- return mAddress;
- }
-
- /**
- * Gets the display name of the user.
- *
- * @return the display name of the user
- */
- public String getDisplayName() {
- return mAddress.getDisplayName();
- }
-
- /**
- * Gets the username.
- *
- * @return the username
- */
- public String getUserName() {
- return getUri().getUser();
- }
-
- /**
- * Gets the password.
- *
- * @return the password
- */
- public String getPassword() {
- return mPassword;
- }
-
- /**
- * Gets the SIP domain.
- *
- * @return the SIP domain
- */
- public String getSipDomain() {
- return mDomain;
- }
-
- /**
- * Gets the port number of the SIP server.
- *
- * @return the port number of the SIP server
- */
- public int getPort() {
- int port = getUri().getPort();
- return (port == -1) ? DEFAULT_PORT : port;
- }
-
- /**
- * Gets the protocol used to connect to the server.
- *
- * @return the protocol
- */
- public String getProtocol() {
- return mProtocol;
- }
-
- /**
- * Gets the network address of the server outbound proxy.
- *
- * @return the network address of the server outbound proxy
- */
- public String getProxyAddress() {
- return mProxyAddress;
- }
-
- /**
- * Gets the (user-defined) name of the profile.
- *
- * @return name of the profile
- */
- public String getProfileName() {
- return mProfileName;
- }
-
- /**
- * Gets the flag of 'Sending keep-alive'.
- *
- * @return the flag of sending SIP keep-alive messages.
- */
- public boolean getSendKeepAlive() {
- return mSendKeepAlive;
- }
-
- /**
- * Gets the flag of 'Auto Registration'.
- *
- * @return the flag of registering the profile automatically.
- */
- public boolean getAutoRegistration() {
- return mAutoRegistration;
- }
-}
diff --git a/src/android/net/sip/SipRegistrationListener.java b/src/android/net/sip/SipRegistrationListener.java
deleted file mode 100644
index 63faaf8..0000000
--- a/src/android/net/sip/SipRegistrationListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-/**
- * Listener class to listen to SIP registration events.
- * @hide
- */
-public interface SipRegistrationListener {
- /**
- * Called when a registration request is sent.
- *
- * @param localProfileUri the URI string of the SIP profile to register with
- */
- void onRegistering(String localProfileUri);
-
- /**
- * Called when registration is successfully done.
- *
- * @param localProfileUri the URI string of the SIP profile to register with
- * @param expiryTime duration in second before the registration expires
- */
- void onRegistrationDone(String localProfileUri, long expiryTime);
-
- /**
- * Called when the registration fails.
- *
- * @param localProfileUri the URI string of the SIP profile to register with
- * @param errorClass name of the exception class
- * @param errorMessage error message
- */
- void onRegistrationFailed(String localProfileUri, String errorClass,
- String errorMessage);
-}
diff --git a/src/android/net/sip/SipSessionAdapter.java b/src/android/net/sip/SipSessionAdapter.java
deleted file mode 100644
index cfb71d7..0000000
--- a/src/android/net/sip/SipSessionAdapter.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-/**
- * Adapter class for {@link ISipSessionListener}. Default implementation of all
- * callback methods is no-op.
- * @hide
- */
-public class SipSessionAdapter extends ISipSessionListener.Stub {
- public void onCalling(ISipSession session) {
- }
-
- public void onRinging(ISipSession session, SipProfile caller,
- byte[] sessionDescription) {
- }
-
- public void onRingingBack(ISipSession session) {
- }
-
- public void onCallEstablished(
- ISipSession session, byte[] sessionDescription) {
- }
-
- public void onCallEnded(ISipSession session) {
- }
-
- public void onCallBusy(ISipSession session) {
- }
-
- public void onCallChanged(ISipSession session, byte[] sessionDescription) {
- }
-
- public void onCallChangeFailed(ISipSession session, String className,
- String message) {
- }
-
- public void onError(ISipSession session, String className, String message) {
- }
-
- public void onRegistering(ISipSession session) {
- }
-
- public void onRegistrationDone(ISipSession session, int duration) {
- }
-
- public void onRegistrationFailed(ISipSession session, String className,
- String message) {
- }
-
- public void onRegistrationTimeout(ISipSession session) {
- }
-}
diff --git a/src/android/net/sip/SipSessionState.java b/src/android/net/sip/SipSessionState.java
deleted file mode 100644
index 5bab112..0000000
--- a/src/android/net/sip/SipSessionState.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package android.net.sip;
-
-/**
- * Defines {@link ISipSession} states.
- * @hide
- */
-public enum SipSessionState {
- /** When session is ready to initiate a call or transaction. */
- READY_TO_CALL,
-
- /** When the registration request is sent out. */
- REGISTERING,
-
- /** When the unregistration request is sent out. */
- DEREGISTERING,
-
- /** When an INVITE request is received. */
- INCOMING_CALL,
-
- /** When an OK response is sent for the INVITE request received. */
- INCOMING_CALL_ANSWERING,
-
- /** When an INVITE request is sent. */
- OUTGOING_CALL,
-
- /** When a RINGING response is received for the INVITE request sent. */
- OUTGOING_CALL_RING_BACK,
-
- /** When a CANCEL request is sent for the INVITE request sent. */
- OUTGOING_CALL_CANCELING,
-
- /** When a call is established. */
- IN_CALL,
-
- /** Some error occurs when making a remote call to {@link ISipSession}. */
- REMOTE_ERROR,
-
- /** When an OPTIONS request is sent. */
- PINGING;
-
- /**
- * Checks if the specified string represents the same state as this object.
- *
- * @return true if the specified string represents the same state as this
- * object
- */
- public boolean equals(String state) {
- return toString().equals(state);
- }
-}
diff --git a/src/com/android/sip/FLog.java b/src/com/android/sip/FLog.java
deleted file mode 100644
index 460d759..0000000
--- a/src/com/android/sip/FLog.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip;
-
-import android.os.SystemClock;
-import android.util.Log;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.PrintWriter;
-import java.util.Date;
-
-/**
- * A simple log-to-file utility class. Only meant for development.
- */
-class FLog {
- static File file;
- static PrintWriter writer;
-
- static {
- try {
- file = new File("/sdcard/siplog.txt");
- writer = new PrintWriter(new FileWriter(file, true));
- writer.println("-------------------------------------------------");
- writer.println("FLog started at " + new Date().toString());
- writer.flush();
- } catch (Throwable t) {
- Log.e("FLOG", "init", t);
- }
- }
-
- private static String getDate() {
- String[] ss = new Date().toString().split(" ");
- return ss[1] + " " + ss[2] + " " + ss[3];
- }
-
- private static String getTime() {
- long now = SystemClock.elapsedRealtime();
- int ms = (int) (now % 1000);
- int s = (int) (now / 1000);
- int m = s / 60;
- s %= 60;
- return String.format("%d.%d.%d", m, s, ms);
- }
-
- static synchronized void write(String type, String tag, String msg) {
- if (writer == null) return;
- try {
- writer.println(String.format("%s %s %s| %s| %s", type,
- getDate(), getTime(), tag, msg));
- writer.flush();
- } catch (Throwable t) {
- Log.e("FLOG", type, t);
- }
- }
-
- static synchronized void write(String type, String tag, String msg,
- Throwable t) {
- if (writer == null) return;
- try {
- writer.println(String.format("%s %s| %s| %s", type,
- getDate(), getTime(), tag, msg));
- t.printStackTrace(writer);
- writer.flush();
- } catch (Throwable tt) {
- Log.e("FLOG", type, tt);
- }
- }
-
- static void v(String tag, String msg) {
- Log.v(tag, msg);
- write("v", tag, msg);
- }
-
- static void d(String tag, String msg) {
- Log.d(tag, msg);
- write("d", tag, msg);
- }
-
- static void w(String tag, String msg) {
- Log.w(tag, msg);
- write("w", tag, msg);
- }
-
- static void w(String tag, String msg, Throwable t) {
- Log.w(tag, msg, t);
- write("w", tag, msg, t);
- }
-
- static void e(String tag, String msg, Throwable t) {
- Log.e(tag, msg, t);
- write("e", tag, msg, t);
- }
-}
diff --git a/src/com/android/sip/SipAudioCallImpl.java b/src/com/android/sip/SipAudioCallImpl.java
deleted file mode 100644
index 3cf1ee4..0000000
--- a/src/com/android/sip/SipAudioCallImpl.java
+++ /dev/null
@@ -1,700 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip;
-
-import gov.nist.javax.sdp.fields.SDPKeywords;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.media.ToneGenerator;
-import android.net.Uri;
-import android.net.rtp.AudioCodec;
-import android.net.rtp.AudioGroup;
-import android.net.rtp.AudioStream;
-import android.net.rtp.RtpStream;
-import android.net.sip.ISipSession;
-import android.net.sip.SdpSessionDescription;
-import android.net.sip.SessionDescription;
-import android.net.sip.SipAudioCall;
-import android.net.sip.SipManager;
-import android.net.sip.SipProfile;
-import android.net.sip.SipSessionAdapter;
-import android.net.sip.SipSessionState;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.Vibrator;
-import android.provider.Settings;
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import javax.sdp.SdpException;
-import javax.sip.SipException;
-
-/**
- * Class that handles an audio call over SIP.
- */
-public class SipAudioCallImpl extends SipSessionAdapter
- implements SipAudioCall {
- private static final String TAG = SipAudioCallImpl.class.getSimpleName();
- private static final boolean RELEASE_SOCKET = true;
- private static final boolean DONT_RELEASE_SOCKET = false;
- private static final String AUDIO = "audio";
- private static final int DTMF = 101;
-
- private Context mContext;
- private SipProfile mLocalProfile;
- private SipAudioCall.Listener mListener;
- private ISipSession mSipSession;
- private SdpSessionDescription mPeerSd;
-
- private AudioStream mRtpSession;
- private SdpSessionDescription.AudioCodec mCodec;
- private long mSessionId = -1L; // SDP session ID
- private boolean mInCall = false;
- private boolean mMuted = false;
- private boolean mHold = false;
-
- private boolean mRingbackToneEnabled = true;
- private boolean mRingtoneEnabled = true;
- private Ringtone mRingtone;
- private ToneGenerator mRingbackTone;
-
- private SipProfile mPendingCallRequest;
-
- public SipAudioCallImpl(Context context, SipProfile localProfile) {
- mContext = context;
- mLocalProfile = localProfile;
- }
-
- public void setListener(SipAudioCall.Listener listener) {
- setListener(listener, false);
- }
-
- public void setListener(SipAudioCall.Listener listener,
- boolean callbackImmediately) {
- mListener = listener;
- if ((listener == null) || !callbackImmediately) return;
- try {
- SipSessionState state = getState();
- switch (state) {
- case READY_TO_CALL:
- listener.onReadyToCall(this);
- break;
- case INCOMING_CALL:
- listener.onRinging(this, getPeerProfile(mSipSession));
- startRinging();
- break;
- case OUTGOING_CALL:
- listener.onCalling(this);
- break;
- default:
- listener.onError(this, "wrong state to attach call: " + state);
- }
- } catch (Throwable t) {
- Log.e(TAG, "setListener()", t);
- }
- }
-
- public synchronized boolean isInCall() {
- return mInCall;
- }
-
- public synchronized boolean isOnHold() {
- return mHold;
- }
-
- public void close() {
- close(true);
- }
-
- private synchronized void close(boolean closeRtp) {
- if (closeRtp) stopCall(RELEASE_SOCKET);
- stopRingbackTone();
- stopRinging();
- mSipSession = null;
- mInCall = false;
- mHold = false;
- mSessionId = -1L;
- }
-
- public synchronized SipProfile getLocalProfile() {
- return mLocalProfile;
- }
-
- public synchronized SipProfile getPeerProfile() {
- try {
- return (mSipSession == null) ? null : mSipSession.getPeerProfile();
- } catch (RemoteException e) {
- return null;
- }
- }
-
- public synchronized SipSessionState getState() {
- if (mSipSession == null) return SipSessionState.READY_TO_CALL;
- try {
- return Enum.valueOf(SipSessionState.class, mSipSession.getState());
- } catch (RemoteException e) {
- return SipSessionState.REMOTE_ERROR;
- }
- }
-
-
- public synchronized ISipSession getSipSession() {
- return mSipSession;
- }
-
- @Override
- public void onCalling(ISipSession session) {
- Log.d(TAG, "calling... " + session);
- Listener listener = mListener;
- if (listener != null) {
- try {
- listener.onCalling(SipAudioCallImpl.this);
- } catch (Throwable t) {
- Log.e(TAG, "onCalling()", t);
- }
- }
- }
-
- @Override
- public void onRingingBack(ISipSession session) {
- Log.d(TAG, "sip call ringing back: " + session);
- if (!mInCall) startRingbackTone();
- Listener listener = mListener;
- if (listener != null) {
- try {
- listener.onRingingBack(SipAudioCallImpl.this);
- } catch (Throwable t) {
- Log.e(TAG, "onRingingBack()", t);
- }
- }
- }
-
- @Override
- public synchronized void onRinging(ISipSession session,
- SipProfile peerProfile, byte[] sessionDescription) {
- try {
- if ((mSipSession == null) || !mInCall
- || !session.getCallId().equals(mSipSession.getCallId())) {
- // should not happen
- session.endCall();
- return;
- }
-
- // session changing request
- try {
- mPeerSd = new SdpSessionDescription(sessionDescription);
- answerCall();
- } catch (Throwable e) {
- Log.e(TAG, "onRinging()", e);
- session.endCall();
- }
- } catch (RemoteException e) {
- Log.e(TAG, "onRinging()", e);
- }
- }
-
- private synchronized void establishCall(byte[] sessionDescription) {
- stopRingbackTone();
- stopRinging();
- try {
- SdpSessionDescription sd =
- new SdpSessionDescription(sessionDescription);
- Log.d(TAG, "sip call established: " + sd);
- startCall(sd);
- mInCall = true;
- } catch (SdpException e) {
- Log.e(TAG, "createSessionDescription()", e);
- }
- }
-
- @Override
- public void onCallEstablished(ISipSession session,
- byte[] sessionDescription) {
- establishCall(sessionDescription);
- Listener listener = mListener;
- if (listener != null) {
- try {
- if (mHold) {
- listener.onCallHeld(SipAudioCallImpl.this);
- } else {
- listener.onCallEstablished(SipAudioCallImpl.this);
- }
- } catch (Throwable t) {
- Log.e(TAG, "onCallEstablished()", t);
- }
- }
- }
-
- @Override
- public void onCallEnded(ISipSession session) {
- Log.d(TAG, "sip call ended: " + session);
- close();
- Listener listener = mListener;
- if (listener != null) {
- try {
- listener.onCallEnded(SipAudioCallImpl.this);
- } catch (Throwable t) {
- Log.e(TAG, "onCallEnded()", t);
- }
- }
- }
-
- @Override
- public void onCallBusy(ISipSession session) {
- Log.d(TAG, "sip call busy: " + session);
- close(false);
- Listener listener = mListener;
- if (listener != null) {
- try {
- listener.onCallBusy(SipAudioCallImpl.this);
- } catch (Throwable t) {
- Log.e(TAG, "onCallBusy()", t);
- }
- }
- }
-
- @Override
- public void onCallChangeFailed(ISipSession session,
- String className, String message) {
- Log.d(TAG, "sip call change failed: " + message);
- Listener listener = mListener;
- if (listener != null) {
- try {
- listener.onError(SipAudioCallImpl.this,
- className + ": " + message);
- } catch (Throwable t) {
- Log.e(TAG, "onCallBusy()", t);
- }
- }
- }
-
- @Override
- public void onError(ISipSession session, String className,
- String message) {
- Log.d(TAG, "sip session error: " + className + ": " + message);
- synchronized (this) {
- if (!isInCall()) close(true);
- }
- Listener listener = mListener;
- if (listener != null) {
- try {
- listener.onError(SipAudioCallImpl.this,
- className + ": " + message);
- } catch (Throwable t) {
- Log.e(TAG, "onError()", t);
- }
- }
- }
-
- public synchronized void attachCall(ISipSession session,
- SdpSessionDescription sdp) throws SipException {
- mSipSession = session;
- mPeerSd = sdp;
- try {
- session.setListener(this);
- } catch (Throwable e) {
- Log.e(TAG, "attachCall()", e);
- throwSipException(e);
- }
- }
-
- public synchronized void makeCall(SipProfile peerProfile,
- SipManager sipManager) throws SipException {
- try {
- mSipSession = sipManager.createSipSession(mLocalProfile, this);
- if (mSipSession == null) {
- throw new SipException(
- "Failed to create SipSession; network available?");
- }
- mSipSession.makeCall(peerProfile, createOfferSessionDescription());
- } catch (Throwable e) {
- if (e instanceof SipException) {
- throw (SipException) e;
- } else {
- throwSipException(e);
- }
- }
- }
-
- public synchronized void endCall() throws SipException {
- try {
- stopRinging();
- if (mSipSession != null) mSipSession.endCall();
- stopCall(true);
- } catch (Throwable e) {
- throwSipException(e);
- }
- }
-
- public synchronized void holdCall() throws SipException {
- if (mHold) return;
- try {
- mSipSession.changeCall(createHoldSessionDescription());
- mHold = true;
- } catch (Throwable e) {
- throwSipException(e);
- }
-
- AudioGroup audioGroup = getAudioGroup();
- if (audioGroup != null) audioGroup.setMode(AudioGroup.MODE_ON_HOLD);
- }
-
- public synchronized void answerCall() throws SipException {
- try {
- stopRinging();
- mSipSession.answerCall(createAnswerSessionDescription());
- } catch (Throwable e) {
- Log.e(TAG, "answerCall()", e);
- throwSipException(e);
- }
- }
-
- public synchronized void continueCall() throws SipException {
- if (!mHold) return;
- try {
- mHold = false;
- mSipSession.changeCall(createContinueSessionDescription());
- } catch (Throwable e) {
- throwSipException(e);
- }
-
- AudioGroup audioGroup = getAudioGroup();
- if (audioGroup != null) audioGroup.setMode(AudioGroup.MODE_NORMAL);
- }
-
- private SessionDescription createOfferSessionDescription() {
- AudioCodec[] codecs = AudioCodec.getSystemSupportedCodecs();
- return createSdpBuilder(true, convert(codecs)).build();
- }
-
- private SessionDescription createAnswerSessionDescription() {
- try {
- // choose an acceptable media from mPeerSd to answer
- SdpSessionDescription.AudioCodec codec = getCodec(mPeerSd);
- SdpSessionDescription.Builder sdpBuilder =
- createSdpBuilder(false, codec);
- if (mPeerSd.isSendOnly(AUDIO)) {
- sdpBuilder.addMediaAttribute(AUDIO, "recvonly", (String) null);
- } else if (mPeerSd.isReceiveOnly(AUDIO)) {
- sdpBuilder.addMediaAttribute(AUDIO, "sendonly", (String) null);
- }
- return sdpBuilder.build();
- } catch (SdpException e) {
- throw new RuntimeException(e);
- }
- }
-
- private SessionDescription createHoldSessionDescription() {
- try {
- return createSdpBuilder(false, mCodec)
- .addMediaAttribute(AUDIO, "sendonly", (String) null)
- .build();
- } catch (SdpException e) {
- throw new RuntimeException(e);
- }
- }
-
- private SessionDescription createContinueSessionDescription() {
- return createSdpBuilder(true, mCodec).build();
- }
-
- private String getMediaDescription(SdpSessionDescription.AudioCodec codec) {
- return String.format("%d %s/%d", codec.payloadType, codec.name,
- codec.sampleRate);
- }
-
- private long getSessionId() {
- if (mSessionId < 0) {
- mSessionId = System.currentTimeMillis();
- }
- return mSessionId;
- }
-
- private SdpSessionDescription.Builder createSdpBuilder(
- boolean addTelephoneEvent,
- SdpSessionDescription.AudioCodec... codecs) {
- String localIp = getLocalIp();
- SdpSessionDescription.Builder sdpBuilder;
- try {
- long sessionVersion = System.currentTimeMillis();
- sdpBuilder = new SdpSessionDescription.Builder("SIP Call")
- .setOrigin(mLocalProfile, getSessionId(), sessionVersion,
- SDPKeywords.IN, SDPKeywords.IPV4, localIp)
- .setConnectionInfo(SDPKeywords.IN, SDPKeywords.IPV4,
- localIp);
- List<Integer> codecIds = new ArrayList<Integer>();
- for (SdpSessionDescription.AudioCodec codec : codecs) {
- codecIds.add(codec.payloadType);
- }
- if (addTelephoneEvent) codecIds.add(DTMF);
- sdpBuilder.addMedia(AUDIO, getLocalMediaPort(), 1, "RTP/AVP",
- codecIds.toArray(new Integer[codecIds.size()]));
- for (SdpSessionDescription.AudioCodec codec : codecs) {
- sdpBuilder.addMediaAttribute(AUDIO, "rtpmap",
- getMediaDescription(codec));
- }
- if (addTelephoneEvent) {
- sdpBuilder.addMediaAttribute(AUDIO, "rtpmap",
- DTMF + " telephone-event/8000");
- }
- // FIXME: deal with vbr codec
- sdpBuilder.addMediaAttribute(AUDIO, "ptime", "20");
- } catch (SdpException e) {
- throw new RuntimeException(e);
- }
- return sdpBuilder;
- }
-
- public synchronized void toggleMute() {
- AudioGroup audioGroup = getAudioGroup();
- if (audioGroup != null) {
- audioGroup.setMode(
- mMuted ? AudioGroup.MODE_NORMAL : AudioGroup.MODE_MUTED);
- mMuted = !mMuted;
- }
- }
-
- public synchronized boolean isMuted() {
- return mMuted;
- }
-
- public synchronized void setInCallMode() {
- ((AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE))
- .setSpeakerphoneOn(false);
- ((AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE))
- .setMode(AudioManager.MODE_NORMAL);
- }
-
- public synchronized void setSpeakerMode() {
- ((AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE))
- .setSpeakerphoneOn(true);
- }
-
- public void sendDtmf(int code) {
- sendDtmf(code, null);
- }
-
- public synchronized void sendDtmf(int code, Message result) {
- AudioGroup audioGroup = getAudioGroup();
- if ((audioGroup != null) && (mSipSession != null)
- && (SipSessionState.IN_CALL == getState())) {
- Log.v(TAG, "send DTMF: " + code);
- audioGroup.sendDtmf(code);
- }
- if (result != null) result.sendToTarget();
- }
-
- public synchronized AudioStream getAudioStream() {
- return mRtpSession;
- }
-
- public synchronized AudioGroup getAudioGroup() {
- return ((mRtpSession == null) ? null : mRtpSession.getAudioGroup());
- }
-
- private SdpSessionDescription.AudioCodec getCodec(SdpSessionDescription sd) {
- HashMap<String, AudioCodec> acceptableCodecs =
- new HashMap<String, AudioCodec>();
- for (AudioCodec codec : AudioCodec.getSystemSupportedCodecs()) {
- acceptableCodecs.put(codec.name, codec);
- }
- for (SdpSessionDescription.AudioCodec codec : sd.getAudioCodecs()) {
- AudioCodec matchedCodec = acceptableCodecs.get(codec.name);
- if (matchedCodec != null) return codec;
- }
- Log.w(TAG, "no common codec is found, use PCM/0");
- return convert(AudioCodec.ULAW);
- }
-
- private AudioCodec convert(SdpSessionDescription.AudioCodec codec) {
- AudioCodec c = AudioCodec.getSystemSupportedCodec(codec.name);
- return ((c == null) ? AudioCodec.ULAW : c);
- }
-
- private SdpSessionDescription.AudioCodec convert(AudioCodec codec) {
- return new SdpSessionDescription.AudioCodec(codec.defaultType,
- codec.name, codec.sampleRate, codec.sampleCount);
- }
-
- private SdpSessionDescription.AudioCodec[] convert(AudioCodec[] codecs) {
- SdpSessionDescription.AudioCodec[] copies =
- new SdpSessionDescription.AudioCodec[codecs.length];
- for (int i = 0, len = codecs.length; i < len; i++) {
- copies[i] = convert(codecs[i]);
- }
- return copies;
- }
-
- private void startCall(SdpSessionDescription peerSd) {
- stopCall(DONT_RELEASE_SOCKET);
-
- mPeerSd = peerSd;
- String peerMediaAddress = peerSd.getPeerMediaAddress(AUDIO);
- // TODO: handle multiple media fields
- int peerMediaPort = peerSd.getPeerMediaPort(AUDIO);
- Log.i(TAG, "start audiocall " + peerMediaAddress + ":" + peerMediaPort);
-
- int localPort = getLocalMediaPort();
- int sampleRate = 8000;
- int frameSize = sampleRate / 50; // 160
- try {
- // TODO: get sample rate from sdp
- mCodec = getCodec(peerSd);
-
- AudioStream audioStream = mRtpSession;
- audioStream.associate(InetAddress.getByName(peerMediaAddress),
- peerMediaPort);
- audioStream.setCodec(convert(mCodec), mCodec.payloadType);
- audioStream.setDtmfType(DTMF);
- Log.d(TAG, "start media: localPort=" + localPort + ", peer="
- + peerMediaAddress + ":" + peerMediaPort);
-
- audioStream.setMode(RtpStream.MODE_NORMAL);
- if (!mHold) {
- // FIXME: won't work if peer is not sending nor receiving
- if (!peerSd.isSending(AUDIO)) {
- Log.d(TAG, " not receiving");
- audioStream.setMode(RtpStream.MODE_SEND_ONLY);
- }
- if (!peerSd.isReceiving(AUDIO)) {
- Log.d(TAG, " not sending");
- audioStream.setMode(RtpStream.MODE_RECEIVE_ONLY);
- }
- }
- setInCallMode();
-
- AudioGroup audioGroup = new AudioGroup();
- audioStream.join(audioGroup);
- if (mHold) {
- audioGroup.setMode(AudioGroup.MODE_ON_HOLD);
- } else if (mMuted) {
- audioGroup.setMode(AudioGroup.MODE_MUTED);
- } else {
- audioGroup.setMode(AudioGroup.MODE_NORMAL);
- }
- } catch (Exception e) {
- Log.e(TAG, "call()", e);
- }
- }
-
- private void stopCall(boolean releaseSocket) {
- Log.d(TAG, "stop audiocall");
- if (mRtpSession != null) {
- mRtpSession.join(null);
-
- if (releaseSocket) {
- mRtpSession.release();
- mRtpSession = null;
- }
- }
- setInCallMode();
- }
-
- private int getLocalMediaPort() {
- if (mRtpSession != null) return mRtpSession.getLocalPort();
- try {
- AudioStream s = mRtpSession =
- new AudioStream(InetAddress.getByName(getLocalIp()));
- return s.getLocalPort();
- } catch (IOException e) {
- Log.w(TAG, "getLocalMediaPort(): " + e);
- throw new RuntimeException(e);
- }
- }
-
- private String getLocalIp() {
- try {
- return mSipSession.getLocalIp();
- } catch (RemoteException e) {
- // FIXME
- return "127.0.0.1";
- }
- }
-
- public synchronized void setRingbackToneEnabled(boolean enabled) {
- mRingbackToneEnabled = enabled;
- }
-
- public synchronized void setRingtoneEnabled(boolean enabled) {
- mRingtoneEnabled = enabled;
- }
-
- private void startRingbackTone() {
- if (!mRingbackToneEnabled) return;
- if (mRingbackTone == null) {
- // The volume relative to other sounds in the stream
- int toneVolume = 80;
- mRingbackTone = new ToneGenerator(
- AudioManager.STREAM_VOICE_CALL, toneVolume);
- }
- mRingbackTone.startTone(ToneGenerator.TONE_CDMA_LOW_PBX_L);
- }
-
- private void stopRingbackTone() {
- if (mRingbackTone != null) {
- mRingbackTone.stopTone();
- mRingbackTone.release();
- mRingbackTone = null;
- }
- }
-
- private void startRinging() {
- if (!mRingtoneEnabled) return;
- ((Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE))
- .vibrate(new long[] {0, 1000, 1000}, 1);
- AudioManager am = (AudioManager)
- mContext.getSystemService(Context.AUDIO_SERVICE);
- if (am.getStreamVolume(AudioManager.STREAM_RING) > 0) {
- String ringtoneUri =
- Settings.System.DEFAULT_RINGTONE_URI.toString();
- mRingtone = RingtoneManager.getRingtone(mContext,
- Uri.parse(ringtoneUri));
- mRingtone.play();
- }
- }
-
- private void stopRinging() {
- ((Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE))
- .cancel();
- if (mRingtone != null) mRingtone.stop();
- }
-
- private void throwSipException(Throwable throwable) throws SipException {
- if (throwable instanceof SipException) {
- throw (SipException) throwable;
- } else {
- throw new SipException("", throwable);
- }
- }
-
- private SipProfile getPeerProfile(ISipSession session) {
- try {
- return session.getPeerProfile();
- } catch (RemoteException e) {
- return null;
- }
- }
-}
diff --git a/src/com/android/sip/SipHelper.java b/src/com/android/sip/SipHelper.java
deleted file mode 100644
index 594857c..0000000
--- a/src/com/android/sip/SipHelper.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip;
-
-import gov.nist.javax.sip.SipStackExt;
-import gov.nist.javax.sip.clientauthutils.AccountManager;
-import gov.nist.javax.sip.clientauthutils.AuthenticationHelper;
-
-import android.net.sip.SessionDescription;
-import android.net.sip.SipProfile;
-import android.util.Log;
-
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.EventObject;
-import java.util.List;
-import javax.sip.ClientTransaction;
-import javax.sip.Dialog;
-import javax.sip.DialogTerminatedEvent;
-import javax.sip.InvalidArgumentException;
-import javax.sip.ListeningPoint;
-import javax.sip.PeerUnavailableException;
-import javax.sip.RequestEvent;
-import javax.sip.ResponseEvent;
-import javax.sip.ServerTransaction;
-import javax.sip.SipException;
-import javax.sip.SipFactory;
-import javax.sip.SipProvider;
-import javax.sip.SipStack;
-import javax.sip.Transaction;
-import javax.sip.TransactionAlreadyExistsException;
-import javax.sip.TransactionTerminatedEvent;
-import javax.sip.TransactionUnavailableException;
-import javax.sip.TransactionState;
-import javax.sip.address.Address;
-import javax.sip.address.AddressFactory;
-import javax.sip.address.SipURI;
-import javax.sip.header.CSeqHeader;
-import javax.sip.header.CallIdHeader;
-import javax.sip.header.ContactHeader;
-import javax.sip.header.FromHeader;
-import javax.sip.header.Header;
-import javax.sip.header.HeaderFactory;
-import javax.sip.header.MaxForwardsHeader;
-import javax.sip.header.ToHeader;
-import javax.sip.header.ViaHeader;
-import javax.sip.message.Message;
-import javax.sip.message.MessageFactory;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-/**
- * Helper class for holding SIP stack related classes and for various low-level
- * SIP tasks like sending messages.
- */
-class SipHelper {
- private static final String TAG = SipHelper.class.getSimpleName();
-
- private SipStack mSipStack;
- private SipProvider mSipProvider;
- private AddressFactory mAddressFactory;
- private HeaderFactory mHeaderFactory;
- private MessageFactory mMessageFactory;
-
- public SipHelper(SipStack sipStack, SipProvider sipProvider)
- throws PeerUnavailableException {
- mSipStack = sipStack;
- mSipProvider = sipProvider;
-
- SipFactory sipFactory = SipFactory.getInstance();
- mAddressFactory = sipFactory.createAddressFactory();
- mHeaderFactory = sipFactory.createHeaderFactory();
- mMessageFactory = sipFactory.createMessageFactory();
- }
-
- private FromHeader createFromHeader(SipProfile profile, String tag)
- throws ParseException {
- return mHeaderFactory.createFromHeader(profile.getSipAddress(), tag);
- }
-
- private ToHeader createToHeader(SipProfile profile) throws ParseException {
- return createToHeader(profile, null);
- }
-
- private ToHeader createToHeader(SipProfile profile, String tag)
- throws ParseException {
- return mHeaderFactory.createToHeader(profile.getSipAddress(), tag);
- }
-
- private CallIdHeader createCallIdHeader() {
- return mSipProvider.getNewCallId();
- }
-
- private CSeqHeader createCSeqHeader(String method)
- throws ParseException, InvalidArgumentException {
- long sequence = (long) (Math.random() * 10000);
- return mHeaderFactory.createCSeqHeader(sequence, method);
- }
-
- private MaxForwardsHeader createMaxForwardsHeader()
- throws InvalidArgumentException {
- return mHeaderFactory.createMaxForwardsHeader(70);
- }
-
- private MaxForwardsHeader createMaxForwardsHeader(int max)
- throws InvalidArgumentException {
- return mHeaderFactory.createMaxForwardsHeader(max);
- }
-
- private ListeningPoint getListeningPoint() throws SipException {
- ListeningPoint lp = mSipProvider.getListeningPoint(ListeningPoint.UDP);
- if (lp == null) lp = mSipProvider.getListeningPoint(ListeningPoint.TCP);
- if (lp == null) {
- ListeningPoint[] lps = mSipProvider.getListeningPoints();
- if ((lps != null) && (lps.length > 0)) lp = lps[0];
- }
- if (lp == null) {
- throw new SipException("no listening point is available");
- }
- return lp;
- }
-
- private List<ViaHeader> createViaHeaders()
- throws ParseException, SipException {
- List<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(1);
- ListeningPoint lp = getListeningPoint();
- ViaHeader viaHeader = mHeaderFactory.createViaHeader(lp.getIPAddress(),
- lp.getPort(), lp.getTransport(), null);
- viaHeader.setRPort();
- viaHeaders.add(viaHeader);
- return viaHeaders;
- }
-
- private ContactHeader createContactHeader(SipProfile profile)
- throws ParseException, SipException {
- ListeningPoint lp = getListeningPoint();
- SipURI contactURI =
- createSipUri(profile.getUserName(), profile.getProtocol(), lp);
-
- Address contactAddress = mAddressFactory.createAddress(contactURI);
- contactAddress.setDisplayName(profile.getDisplayName());
-
- return mHeaderFactory.createContactHeader(contactAddress);
- }
-
- private ContactHeader createWildcardContactHeader() {
- ContactHeader contactHeader = mHeaderFactory.createContactHeader();
- contactHeader.setWildCard();
- return contactHeader;
- }
-
- private SipURI createSipUri(String username, String transport,
- ListeningPoint lp) throws ParseException {
- SipURI uri = mAddressFactory.createSipURI(username, lp.getIPAddress());
- try {
- uri.setPort(lp.getPort());
- uri.setTransportParam(transport);
- } catch (InvalidArgumentException e) {
- throw new RuntimeException(e);
- }
- return uri;
- }
-
- public ClientTransaction sendKeepAlive(SipProfile userProfile, String tag)
- throws SipException {
- try {
- Request request = createRequest(Request.OPTIONS, userProfile, tag);
-
- ClientTransaction clientTransaction =
- mSipProvider.getNewClientTransaction(request);
- clientTransaction.sendRequest();
- return clientTransaction;
- } catch (Exception e) {
- throw new SipException("sendKeepAlive()", e);
- }
- }
-
- public ClientTransaction sendRegister(SipProfile userProfile, String tag,
- int expiry) throws SipException {
- try {
- Request request = createRequest(Request.REGISTER, userProfile, tag);
- if (expiry == 0) {
- // remove all previous registrations by wildcard
- // rfc3261#section-10.2.2
- request.addHeader(createWildcardContactHeader());
- } else {
- request.addHeader(createContactHeader(userProfile));
- }
- request.addHeader(mHeaderFactory.createExpiresHeader(expiry));
-
- ClientTransaction clientTransaction =
- mSipProvider.getNewClientTransaction(request);
- clientTransaction.sendRequest();
- return clientTransaction;
- } catch (ParseException e) {
- throw new SipException("sendRegister()", e);
- }
- }
-
- private Request createRequest(String requestType, SipProfile userProfile,
- String tag) throws ParseException, SipException {
- FromHeader fromHeader = createFromHeader(userProfile, tag);
- ToHeader toHeader = createToHeader(userProfile);
- SipURI requestURI = mAddressFactory.createSipURI("sip:"
- + userProfile.getSipDomain());
- List<ViaHeader> viaHeaders = createViaHeaders();
- CallIdHeader callIdHeader = createCallIdHeader();
- CSeqHeader cSeqHeader = createCSeqHeader(requestType);
- MaxForwardsHeader maxForwards = createMaxForwardsHeader();
- Request request = mMessageFactory.createRequest(requestURI,
- requestType, callIdHeader, cSeqHeader, fromHeader,
- toHeader, viaHeaders, maxForwards);
- Header userAgentHeader = mHeaderFactory.createHeader("User-Agent",
- "SIPAUA/0.1.001");
- request.addHeader(userAgentHeader);
- return request;
- }
-
- public ClientTransaction handleChallenge(ResponseEvent responseEvent,
- AccountManager accountManager) throws SipException {
- AuthenticationHelper authenticationHelper =
- ((SipStackExt) mSipStack).getAuthenticationHelper(
- accountManager, mHeaderFactory);
- ClientTransaction tid = responseEvent.getClientTransaction();
- ClientTransaction ct = authenticationHelper.handleChallenge(
- responseEvent.getResponse(), tid, mSipProvider, 5);
- ct.sendRequest();
- return ct;
- }
-
- public ClientTransaction sendInvite(SipProfile caller, SipProfile callee,
- SessionDescription sessionDescription, String tag)
- throws SipException {
- try {
- FromHeader fromHeader = createFromHeader(caller, tag);
- ToHeader toHeader = createToHeader(callee);
- SipURI requestURI = callee.getUri();
- List<ViaHeader> viaHeaders = createViaHeaders();
- CallIdHeader callIdHeader = createCallIdHeader();
- CSeqHeader cSeqHeader = createCSeqHeader(Request.INVITE);
- MaxForwardsHeader maxForwards = createMaxForwardsHeader();
-
- Request request = mMessageFactory.createRequest(requestURI,
- Request.INVITE, callIdHeader, cSeqHeader, fromHeader,
- toHeader, viaHeaders, maxForwards);
-
- request.addHeader(createContactHeader(caller));
- request.setContent(sessionDescription.getContent(),
- mHeaderFactory.createContentTypeHeader(
- "application", sessionDescription.getType()));
-
- ClientTransaction clientTransaction =
- mSipProvider.getNewClientTransaction(request);
- clientTransaction.sendRequest();
- return clientTransaction;
- } catch (ParseException e) {
- throw new SipException("sendInvite()", e);
- }
- }
-
- public ClientTransaction sendReinvite(Dialog dialog,
- SessionDescription sessionDescription) throws SipException {
- try {
- Request request = dialog.createRequest(Request.INVITE);
- request.setContent(sessionDescription.getContent(),
- mHeaderFactory.createContentTypeHeader(
- "application", sessionDescription.getType()));
-
- ClientTransaction clientTransaction =
- mSipProvider.getNewClientTransaction(request);
- dialog.sendRequest(clientTransaction);
- return clientTransaction;
- } catch (ParseException e) {
- throw new SipException("sendReinvite()", e);
- }
- }
-
- private ServerTransaction getServerTransaction(RequestEvent event)
- throws SipException {
- ServerTransaction transaction = event.getServerTransaction();
- if (transaction == null) {
- Request request = event.getRequest();
- return mSipProvider.getNewServerTransaction(request);
- } else {
- return transaction;
- }
- }
-
- /**
- * @param event the INVITE request event
- */
- public ServerTransaction sendRinging(RequestEvent event, String tag)
- throws SipException {
- try {
- Request request = event.getRequest();
- ServerTransaction transaction = getServerTransaction(event);
-
- Response response = mMessageFactory.createResponse(Response.RINGING,
- request);
-
- ToHeader toHeader = (ToHeader) response.getHeader(ToHeader.NAME);
- toHeader.setTag(tag);
- response.addHeader(toHeader);
- transaction.sendResponse(response);
- return transaction;
- } catch (ParseException e) {
- throw new SipException("sendRinging()", e);
- }
- }
-
- /**
- * @param event the INVITE request event
- */
- public ServerTransaction sendInviteOk(RequestEvent event,
- SipProfile localProfile, SessionDescription sessionDescription,
- ServerTransaction inviteTransaction)
- throws SipException {
- try {
- Request request = event.getRequest();
- Response response = mMessageFactory.createResponse(Response.OK,
- request);
- response.addHeader(createContactHeader(localProfile));
- response.setContent(sessionDescription.getContent(),
- mHeaderFactory.createContentTypeHeader(
- "application", sessionDescription.getType()));
-
- if (inviteTransaction == null) {
- inviteTransaction = getServerTransaction(event);
- }
- if (inviteTransaction.getState() != TransactionState.COMPLETED) {
- inviteTransaction.sendResponse(response);
- }
-
- return inviteTransaction;
- } catch (ParseException e) {
- throw new SipException("sendInviteOk()", e);
- }
- }
-
- public void sendInviteBusyHere(RequestEvent event,
- ServerTransaction inviteTransaction) throws SipException {
- try {
- Request request = event.getRequest();
- Response response = mMessageFactory.createResponse(
- Response.BUSY_HERE, request);
-
- if (inviteTransaction.getState() != TransactionState.COMPLETED) {
- inviteTransaction.sendResponse(response);
- }
- } catch (ParseException e) {
- throw new SipException("sendInviteBusyHere()", e);
- }
- }
-
- /**
- * @param event the INVITE ACK request event
- */
- public void sendInviteAck(ResponseEvent event, Dialog dialog)
- throws SipException {
- Response response = event.getResponse();
- long cseq = ((CSeqHeader) response.getHeader(CSeqHeader.NAME))
- .getSeqNumber();
- dialog.sendAck(dialog.createAck(cseq));
- }
-
- public void sendBye(Dialog dialog) throws SipException {
- Request byeRequest = dialog.createRequest(Request.BYE);
- Log.d(TAG, "send BYE: " + byeRequest);
- dialog.sendRequest(mSipProvider.getNewClientTransaction(byeRequest));
- }
-
- public void sendCancel(ClientTransaction inviteTransaction)
- throws SipException {
- Request cancelRequest = inviteTransaction.createCancel();
- mSipProvider.getNewClientTransaction(cancelRequest).sendRequest();
- }
-
- public void sendResponse(RequestEvent event, int responseCode)
- throws SipException {
- try {
- getServerTransaction(event).sendResponse(
- mMessageFactory.createResponse(
- responseCode, event.getRequest()));
- } catch (ParseException e) {
- throw new SipException("sendResponse()", e);
- }
- }
-
- public void sendInviteRequestTerminated(Request inviteRequest,
- ServerTransaction inviteTransaction) throws SipException {
- try {
- inviteTransaction.sendResponse(mMessageFactory.createResponse(
- Response.REQUEST_TERMINATED, inviteRequest));
- } catch (ParseException e) {
- throw new SipException("sendInviteRequestTerminated()", e);
- }
- }
-
- public static String getCallId(EventObject event) {
- if (event == null) return null;
- if (event instanceof RequestEvent) {
- return getCallId(((RequestEvent) event).getRequest());
- } else if (event instanceof ResponseEvent) {
- return getCallId(((ResponseEvent) event).getResponse());
- } else if (event instanceof DialogTerminatedEvent) {
- Dialog dialog = ((DialogTerminatedEvent) event).getDialog();
- return getCallId(((DialogTerminatedEvent) event).getDialog());
- } else if (event instanceof TransactionTerminatedEvent) {
- TransactionTerminatedEvent e = (TransactionTerminatedEvent) event;
- return getCallId(e.isServerTransaction()
- ? e.getServerTransaction()
- : e.getClientTransaction());
- } else {
- Object source = event.getSource();
- if (source instanceof Transaction) {
- return getCallId(((Transaction) source));
- } else if (source instanceof Dialog) {
- return getCallId((Dialog) source);
- }
- }
- return "";
- }
-
- public static String getCallId(Transaction transaction) {
- return ((transaction != null) ? getCallId(transaction.getRequest())
- : "");
- }
-
- private static String getCallId(Message message) {
- CallIdHeader callIdHeader =
- (CallIdHeader) message.getHeader(CallIdHeader.NAME);
- return callIdHeader.getCallId();
- }
-
- private static String getCallId(Dialog dialog) {
- return dialog.getCallId().getCallId();
- }
-}
diff --git a/src/com/android/sip/SipServiceImpl.java b/src/com/android/sip/SipServiceImpl.java
deleted file mode 100644
index 6e5e4f9..0000000
--- a/src/com/android/sip/SipServiceImpl.java
+++ /dev/null
@@ -1,829 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.net.sip.ISipService;
-import android.net.sip.ISipSession;
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SipManager;
-import android.net.sip.SipProfile;
-import android.net.sip.SipSessionAdapter;
-import android.net.sip.SipSessionState;
-import android.net.wifi.WifiManager;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-import javax.sip.SipException;
-
-/**
- */
-class SipServiceImpl extends ISipService.Stub {
- private static final String TAG = "SipService";
- private static final int EXPIRY_TIME = 3600;
- private static final int SHORT_EXPIRY_TIME = 10;
- private static final int MIN_EXPIRY_TIME = 60;
-
- private Context mContext;
- private String mLocalIp;
- private String mNetworkType;
- private boolean mConnected;
- private WakeupTimer mTimer;
- private WifiManager.WifiLock mWifiLock;
-
- // SipProfile URI --> group
- private Map<String, SipSessionGroupExt> mSipGroups =
- new HashMap<String, SipSessionGroupExt>();
-
- // session ID --> session
- private Map<String, ISipSession> mPendingSessions =
- new HashMap<String, ISipSession>();
-
- private ConnectivityReceiver mConnectivityReceiver;
-
- public SipServiceImpl(Context context) {
- FLog.d(TAG, " service started!");
- mContext = context;
- mConnectivityReceiver = new ConnectivityReceiver();
- context.registerReceiver(mConnectivityReceiver,
- new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
-
- mTimer = new WakeupTimer(context);
- }
-
- public synchronized SipProfile[] getListOfProfiles() {
- SipProfile[] profiles = new SipProfile[mSipGroups.size()];
- int i = 0;
- for (SipSessionGroupExt group : mSipGroups.values()) {
- profiles[i++] = group.getLocalProfile();
- }
- return profiles;
- }
-
- public void open(SipProfile localProfile) {
- if (localProfile.getAutoRegistration()) {
- openToReceiveCalls(localProfile);
- } else {
- openToMakeCalls(localProfile);
- }
- }
-
- private void openToMakeCalls(SipProfile localProfile) {
- try {
- createGroup(localProfile);
- } catch (SipException e) {
- FLog.e(TAG, "openToMakeCalls()", e);
- // TODO: how to send the exception back
- }
- }
-
- private void openToReceiveCalls(SipProfile localProfile) {
- open3(localProfile, SipManager.SIP_INCOMING_CALL_ACTION, null);
- }
-
- public synchronized void open3(SipProfile localProfile,
- String incomingCallBroadcastAction, ISipSessionListener listener) {
- if (TextUtils.isEmpty(incomingCallBroadcastAction)) {
- throw new RuntimeException(
- "empty broadcast action for incoming call");
- }
- FLog.d(TAG, "open3: " + localProfile.getUriString() + ": "
- + incomingCallBroadcastAction + ": " + listener);
- try {
- SipSessionGroupExt group = createGroup(localProfile,
- incomingCallBroadcastAction, listener);
- if (localProfile.getAutoRegistration()) {
- group.openToReceiveCalls();
- if (isWifiOn()) grabWifiLock();
- }
- } catch (SipException e) {
- FLog.e(TAG, "openToReceiveCalls()", e);
- // TODO: how to send the exception back
- }
- }
-
- public synchronized void close(String localProfileUri) {
- SipSessionGroupExt group = mSipGroups.remove(localProfileUri);
- if (group != null) {
- notifyProfileRemoved(group.getLocalProfile());
- group.closeToNotReceiveCalls();
- if (isWifiOn() && !anyOpened()) releaseWifiLock();
- }
- }
-
- public synchronized boolean isOpened(String localProfileUri) {
- SipSessionGroupExt group = mSipGroups.get(localProfileUri);
- return ((group != null) ? group.isOpened() : false);
- }
-
- public synchronized boolean isRegistered(String localProfileUri) {
- SipSessionGroupExt group = mSipGroups.get(localProfileUri);
- return ((group != null) ? group.isRegistered() : false);
- }
-
- public synchronized void setRegistrationListener(String localProfileUri,
- ISipSessionListener listener) {
- SipSessionGroupExt group = mSipGroups.get(localProfileUri);
- if (group != null) group.setListener(listener);
- }
-
- public synchronized ISipSession createSession(SipProfile localProfile,
- ISipSessionListener listener) {
- if (!mConnected) return null;
- try {
- SipSessionGroupExt group = createGroup(localProfile);
- return group.createSession(listener);
- } catch (SipException e) {
- Log.w(TAG, "createSession()", e);
- return null;
- }
- }
-
- public synchronized ISipSession getPendingSession(String callId) {
- if (callId == null) return null;
- return mPendingSessions.get(callId);
- }
-
- private String determineLocalIp() {
- try {
- DatagramSocket s = new DatagramSocket();
- s.connect(InetAddress.getByName("192.168.1.1"), 80);
- return s.getLocalAddress().getHostAddress();
- } catch (IOException e) {
- FLog.w(TAG, "determineLocalIp()", e);
- // dont do anything; there should be a connectivity change going
- return null;
- }
- }
-
- private SipSessionGroupExt createGroup(SipProfile localProfile)
- throws SipException {
- String key = localProfile.getUriString();
- SipSessionGroupExt group = mSipGroups.get(key);
- if (group == null) {
- group = new SipSessionGroupExt(localProfile, null, null);
- mSipGroups.put(key, group);
- notifyProfileAdded(localProfile);
- }
- return group;
- }
-
- private SipSessionGroupExt createGroup(SipProfile localProfile,
- String incomingCallBroadcastAction, ISipSessionListener listener)
- throws SipException {
- String key = localProfile.getUriString();
- SipSessionGroupExt group = mSipGroups.get(key);
- if (group != null) {
- group.setIncomingCallBroadcastAction(
- incomingCallBroadcastAction);
- group.setListener(listener);
- } else {
- group = new SipSessionGroupExt(localProfile,
- incomingCallBroadcastAction, listener);
- mSipGroups.put(key, group);
- notifyProfileAdded(localProfile);
- }
- return group;
- }
-
- private void notifyProfileAdded(SipProfile localProfile) {
- Log.d(TAG, "notify: profile added: " + localProfile);
- Intent intent = new Intent(SipManager.SIP_ADD_PHONE_ACTION);
- intent.putExtra(SipManager.LOCAL_URI_KEY, localProfile.getUriString());
- mContext.sendBroadcast(intent);
- }
-
- private void notifyProfileRemoved(SipProfile localProfile) {
- Log.d(TAG, "notify: profile removed: " + localProfile);
- Intent intent = new Intent(SipManager.SIP_REMOVE_PHONE_ACTION);
- intent.putExtra(SipManager.LOCAL_URI_KEY, localProfile.getUriString());
- mContext.sendBroadcast(intent);
- }
-
- private boolean anyOpened() {
- for (SipSessionGroupExt group : mSipGroups.values()) {
- if (group.isOpened()) return true;
- }
- return false;
- }
-
- private void grabWifiLock() {
- if (mWifiLock == null) {
- FLog.d(TAG, "acquire wifi lock");
- mWifiLock = ((WifiManager)
- mContext.getSystemService(Context.WIFI_SERVICE))
- .createWifiLock(WifiManager.WIFI_MODE_FULL, TAG);
- mWifiLock.acquire();
- }
- }
-
- private void releaseWifiLock() {
- if (mWifiLock != null) {
- FLog.d(TAG, "release wifi lock");
- mWifiLock.release();
- mWifiLock = null;
- }
- }
-
- private boolean isWifiOn() {
- return "WIFI".equalsIgnoreCase(mNetworkType);
- //return (mConnected && "WIFI".equalsIgnoreCase(mNetworkType));
- }
-
- private synchronized void onConnectivityChanged(
- String type, boolean connected) {
- FLog.d(TAG, "onConnectivityChanged(): "
- + mNetworkType + (mConnected? " CONNECTED" : " DISCONNECTED")
- + " --> " + type + (connected? " CONNECTED" : " DISCONNECTED"));
-
- boolean sameType = type.equals(mNetworkType);
- if (!sameType && !connected) return;
-
- boolean wasWifi = "WIFI".equalsIgnoreCase(mNetworkType);
- boolean isWifi = "WIFI".equalsIgnoreCase(type);
- boolean wifiOff = (isWifi && !connected) || (wasWifi && !sameType);
- boolean wifiOn = isWifi && connected;
- if (wifiOff) {
- releaseWifiLock();
- } else if (wifiOn) {
- if (anyOpened()) grabWifiLock();
- }
-
- try {
- boolean wasConnected = mConnected;
- mNetworkType = type;
- mConnected = connected;
-
- if (wasConnected) {
- mLocalIp = null;
- for (SipSessionGroupExt group : mSipGroups.values()) {
- group.onConnectivityChanged(false);
- }
- }
-
- if (connected) {
- mLocalIp = determineLocalIp();
- for (SipSessionGroupExt group : mSipGroups.values()) {
- group.onConnectivityChanged(true);
- }
- }
-
- } catch (SipException e) {
- FLog.e(TAG, "onConnectivityChanged()", e);
- }
- }
-
- private synchronized void addPendingSession(ISipSession session) {
- try {
- mPendingSessions.put(session.getCallId(), session);
- } catch (RemoteException e) {
- // should not happen with a local call
- Log.e(TAG, "addPendingSession()", e);
- }
- }
-
- private class SipSessionGroupExt extends SipSessionAdapter {
- private SipSessionGroup mSipGroup;
- private String mIncomingCallBroadcastAction;
- private boolean mOpened;
-
- private AutoRegistrationProcess mAutoRegistration =
- new AutoRegistrationProcess();
-
- public SipSessionGroupExt(SipProfile localProfile,
- String incomingCallBroadcastAction,
- ISipSessionListener listener) throws SipException {
- String password = localProfile.getPassword();
- SipProfile p = duplicate(localProfile);
- mSipGroup = createSipSessionGroup(mLocalIp, p, password);
- mIncomingCallBroadcastAction = incomingCallBroadcastAction;
- mAutoRegistration.setListener(listener);
- }
-
- public SipProfile getLocalProfile() {
- return mSipGroup.getLocalProfile();
- }
-
- // network connectivity is tricky because network can be disconnected
- // at any instant so need to deal with exceptions carefully even when
- // you think you are connected
- private SipSessionGroup createSipSessionGroup(String localIp,
- SipProfile localProfile, String password) throws SipException {
- try {
- return new SipSessionGroup(localIp, localProfile, password);
- } catch (IOException e) {
- // network disconnected
- FLog.w(TAG, "createSipSessionGroup(): network disconnected?");
- if (localIp != null) {
- return createSipSessionGroup(null, localProfile, password);
- } else {
- // recursive
- Log.wtf(TAG, "impossible!");
- throw new RuntimeException("createSipSessionGroup");
- }
- }
- }
-
- private SipProfile duplicate(SipProfile p) {
- try {
- return new SipProfile.Builder(p.getUserName(), p.getSipDomain())
- .setProfileName(p.getProfileName())
- .setPassword("*")
- .setPort(p.getPort())
- .setProtocol(p.getProtocol())
- .setOutboundProxy(p.getProxyAddress())
- .setSendKeepAlive(p.getSendKeepAlive())
- .setAutoRegistration(p.getAutoRegistration())
- .setDisplayName(p.getDisplayName())
- .build();
- } catch (Exception e) {
- Log.wtf(TAG, "duplicate()", e);
- throw new RuntimeException("duplicate profile", e);
- }
- }
-
- public void setListener(ISipSessionListener listener) {
- mAutoRegistration.setListener(listener);
- }
-
- public void setIncomingCallBroadcastAction(String action) {
- mIncomingCallBroadcastAction = action;
- }
-
- public void openToReceiveCalls() throws SipException {
- mOpened = true;
- if (mConnected) {
- mSipGroup.openToReceiveCalls(this);
- mAutoRegistration.start(mSipGroup);
- }
- FLog.v(TAG, " openToReceiveCalls: " + getUri() + ": "
- + mIncomingCallBroadcastAction);
- }
-
- public void onConnectivityChanged(boolean connected)
- throws SipException {
- if (connected) {
- resetGroup(mLocalIp);
- if (mOpened) openToReceiveCalls();
- } else {
- // close mSipGroup but remember mOpened
- FLog.v(TAG, " close auto reg temporarily: " + getUri() + ": "
- + mIncomingCallBroadcastAction);
- mSipGroup.close();
- mAutoRegistration.stop();
- }
- }
-
- private void resetGroup(String localIp) throws SipException {
- try {
- mSipGroup.reset(localIp);
- } catch (IOException e) {
- // network disconnected
- FLog.w(TAG, "resetGroup(): network disconnected?");
- if (localIp != null) {
- resetGroup(null); // reset w/o local IP
- } else {
- // recursive
- Log.wtf(TAG, "impossible!");
- throw new RuntimeException("resetGroup");
- }
- }
- }
-
- public void closeToNotReceiveCalls() {
- mOpened = false;
- mSipGroup.closeToNotReceiveCalls();
- mAutoRegistration.stop();
- FLog.v(TAG, " close: " + getUri() + ": "
- + mIncomingCallBroadcastAction);
- }
-
- public ISipSession createSession(ISipSessionListener listener) {
- return mSipGroup.createSession(listener);
- }
-
- @Override
- public void onRinging(ISipSession session, SipProfile caller,
- byte[] sessionDescription) {
- synchronized (SipServiceImpl.this) {
- try {
- if (!isRegistered()) {
- session.endCall();
- return;
- }
-
- // send out incoming call broadcast
- Log.d(TAG, " ringing~~ " + getUri() + ": " + caller.getUri()
- + ": " + session.getCallId());
- addPendingSession(session);
- Intent intent = SipManager.createIncomingCallBroadcast(
- mIncomingCallBroadcastAction, session.getCallId(),
- sessionDescription);
- Log.d(TAG, " send out intent: " + intent);
- mContext.sendBroadcast(intent);
- } catch (RemoteException e) {
- // should never happen with a local call
- Log.e(TAG, "processCall()", e);
- }
- }
- }
-
- @Override
- public void onError(ISipSession session, String errorClass,
- String message) {
- FLog.d(TAG, "sip session error: " + errorClass + ": " + message);
- }
-
- public boolean isOpened() {
- return mOpened;
- }
-
- public boolean isRegistered() {
- return mAutoRegistration.isRegistered();
- }
-
- private String getUri() {
- return mSipGroup.getLocalProfileUri();
- }
- }
-
- private class KeepAliveProcess implements Runnable {
- private static final String TAG = "\\KEEPALIVE/";
- private static final int INCREMENT = 15;
- private static final int MAX_RETRY = 4;
- private SipSessionGroup.SipSessionImpl mSession;
- private int interval = INCREMENT;
- private boolean maxIntervalMeasured = false;
-
- public KeepAliveProcess(SipSessionGroup.SipSessionImpl session) {
- mSession = session;
- }
-
- public void start() {
- FLog.d(TAG, "start keepalive at " + interval);
- mTimer.cancel(this);
- mTimer.set(interval * 1000, this);
- }
-
- public void run() {
- synchronized (SipServiceImpl.this) {
- keepalive();
- }
- }
-
- private void keepalive() {
- int retry = 0;
- Log.d(TAG, " ~~~ keepalive");
- mTimer.cancel(this);
- for (retry = 0; retry < MAX_RETRY; ++retry) {
- mSession.sendKeepAlive();
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- Log.e(TAG, "keepalive interrupted", e);
- return;
- }
- if (SipSessionState.READY_TO_CALL.equals(mSession.getState())) {
- break;
- }
- }
- if (retry == MAX_RETRY) {
- FLog.w(TAG, "Server didn't respond SIP OPTIONS req:" + mSession);
- return;
- }
- if (mSession.isReRegisterRequired()) {
- mSession.register(EXPIRY_TIME);
- interval -= INCREMENT;
- if (interval <= 0) interval = INCREMENT;
- FLog.d(TAG, "--- interval decrease: " + interval);
- maxIntervalMeasured = true;
- } else {
- if (!maxIntervalMeasured) interval += INCREMENT;
- FLog.d(TAG, "+++ interval increase: " + interval);
- mTimer.set(interval * 1000, this);
- }
- }
-
- public void stop() {
- mTimer.cancel(this);
- }
- }
-
- private class AutoRegistrationProcess extends SipSessionAdapter
- implements Runnable {
- private SipSessionGroup.SipSessionImpl mSession;
- private SipSessionListenerProxy mProxy = new SipSessionListenerProxy();
- private KeepAliveProcess mKeepAliveProcess;
- private int mBackoff = 1;
- private boolean mRegistered;
- private long mExpiryTime;
-
- private String getAction() {
- return toString();
- }
-
- public void start(SipSessionGroup group) {
- if (mSession == null) {
- mBackoff = 1;
- mSession = (SipSessionGroup.SipSessionImpl)
- group.createSession(this);
- // return right away if no active network connection.
- if (mSession == null) return;
-
- // start unregistration to clear up old registration at server
- // TODO: when rfc5626 is deployed, use reg-id and sip.instance
- // in registration to avoid adding duplicate entries to server
- mSession.unregister();
- FLog.v(TAG, "start AutoRegistrationProcess for "
- + mSession.getLocalProfile().getUriString());
- }
- }
-
- public void stop() {
- if (mSession == null) return;
- if (mConnected) mSession.unregister();
- mTimer.cancel(this);
- if (mKeepAliveProcess != null) {
- mKeepAliveProcess.stop();
- mKeepAliveProcess = null;
- }
- mSession = null;
- mRegistered = false;
- }
-
- private boolean isStopped() {
- return (mSession == null);
- }
-
- public void setListener(ISipSessionListener listener) {
- Log.v(TAG, "setListener(): " + listener);
- mProxy.setListener(listener);
- if (mSession == null) return;
-
- try {
- if ((mSession != null) && SipSessionState.REGISTERING.equals(
- mSession.getState())) {
- mProxy.onRegistering(mSession);
- } else if (mRegistered) {
- int duration = (int)
- (mExpiryTime - SystemClock.elapsedRealtime());
- mProxy.onRegistrationDone(mSession, duration);
- }
- } catch (Throwable t) {
- Log.w(TAG, "setListener(): " + t);
- }
- }
-
- public boolean isRegistered() {
- return mRegistered;
- }
-
- public void run() {
- FLog.d(TAG, " ~~~ registering");
- synchronized (SipServiceImpl.this) {
- if (mConnected && !isStopped()) mSession.register(EXPIRY_TIME);
- }
- }
-
- private boolean isBehindNAT(String address) {
- try {
- byte[] d = InetAddress.getByName(address).getAddress();
- if ((d[0] == 10) ||
- (((0x000000FF & ((int)d[0])) == 172) &&
- ((0x000000F0 & ((int)d[1])) == 16)) ||
- (((0x000000FF & ((int)d[0])) == 192) &&
- ((0x000000FF & ((int)d[1])) == 168))) {
- return true;
- }
- } catch (UnknownHostException e) {
- Log.e(TAG, "isBehindAT()" + address, e);
- }
- return false;
- }
-
- private void restart(int duration) {
- FLog.d(TAG, "Refresh registration " + duration + "s later.");
- mTimer.cancel(this);
- mTimer.set(duration * 1000, this);
- }
-
- private int backoffDuration() {
- int duration = SHORT_EXPIRY_TIME * mBackoff;
- if (duration > 3600) {
- duration = 3600;
- } else {
- mBackoff *= 2;
- }
- return duration;
- }
-
- @Override
- public void onRegistering(ISipSession session) {
- FLog.d(TAG, "onRegistering(): " + session + ": " + mSession);
- synchronized (SipServiceImpl.this) {
- if (!isStopped() && (session != mSession)) return;
- mRegistered = false;
- try {
- mProxy.onRegistering(session);
- } catch (Throwable t) {
- Log.w(TAG, "onRegistering()", t);
- }
- }
- }
-
- @Override
- public void onRegistrationDone(ISipSession session, int duration) {
- FLog.d(TAG, "onRegistrationDone(): " + session + ": " + mSession);
- synchronized (SipServiceImpl.this) {
- if (!isStopped() && (session != mSession)) return;
- try {
- mProxy.onRegistrationDone(session, duration);
- } catch (Throwable t) {
- Log.w(TAG, "onRegistrationDone()", t);
- }
- if (isStopped()) return;
-
- if (duration > 0) {
- mSession.clearReRegisterRequired();
- mExpiryTime = SystemClock.elapsedRealtime()
- + (duration * 1000);
-
- if (!mRegistered) {
- mRegistered = true;
- // allow some overlap to avoid call drop during renew
- duration -= MIN_EXPIRY_TIME;
- if (duration < MIN_EXPIRY_TIME) {
- duration = MIN_EXPIRY_TIME;
- }
- restart(duration);
-
- if (isBehindNAT(mLocalIp) ||
- mSession.getLocalProfile().getSendKeepAlive()) {
- if (mKeepAliveProcess == null) {
- mKeepAliveProcess =
- new KeepAliveProcess(mSession);
- }
- mKeepAliveProcess.start();
- }
- }
- } else {
- mRegistered = false;
- mExpiryTime = -1L;
- FLog.d(TAG, "Refresh registration immediately");
- run();
- }
- }
- }
-
- @Override
- public void onRegistrationFailed(ISipSession session, String className,
- String message) {
- FLog.d(TAG, "onRegistrationFailed(): " + session + ": " + mSession
- + ": " + className + ": " + message);
- synchronized (SipServiceImpl.this) {
- if (!isStopped() && (session != mSession)) return;
- try {
- mProxy.onRegistrationFailed(session, className, message);
- } catch (Throwable t) {
- Log.w(TAG, "onRegistrationFailed(): " + t);
- }
-
- if (!isStopped()) onError();
- }
- }
-
- @Override
- public void onRegistrationTimeout(ISipSession session) {
- FLog.d(TAG, "onRegistrationTimeout(): " + session + ": " + mSession);
- synchronized (SipServiceImpl.this) {
- if (!isStopped() && (session != mSession)) return;
- try {
- mProxy.onRegistrationTimeout(session);
- } catch (Throwable t) {
- Log.w(TAG, "onRegistrationTimeout(): " + t);
- }
-
- if (!isStopped()) {
- mRegistered = false;
- onError();
- }
- }
- }
-
- private void onError() {
- mRegistered = false;
- restart(backoffDuration());
- if (mKeepAliveProcess != null) {
- mKeepAliveProcess.stop();
- mKeepAliveProcess = null;
- }
- }
- }
-
- private class ConnectivityReceiver extends BroadcastReceiver {
- private Timer mTimer = new Timer();
- private MyTimerTask mTask;
-
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
- Bundle b = intent.getExtras();
- if (b != null) {
- NetworkInfo netInfo = (NetworkInfo)
- b.get(ConnectivityManager.EXTRA_NETWORK_INFO);
- String type = netInfo.getTypeName();
- NetworkInfo.State state = netInfo.getState();
- if (state == NetworkInfo.State.CONNECTED) {
- FLog.d(TAG, "Connectivity alert: CONNECTED " + type);
- onChanged(type, true);
- } else if (state == NetworkInfo.State.DISCONNECTED) {
- FLog.d(TAG, "Connectivity alert: DISCONNECTED " + type);
- onChanged(type, false);
- } else {
- Log.d(TAG, "Connectivity alert not processed: " + state
- + " " + type);
- }
- }
- }
- }
-
- private void onChanged(String type, boolean connected) {
- synchronized (SipServiceImpl.this) {
- // When turning on WIFI, it needs some time for network
- // connectivity to get stabile so we defer good news (because
- // we want to skip the interim ones) but deliver bad news
- // immediately
- if (connected) {
- if (mTask != null) mTask.cancel();
- mTask = new MyTimerTask(type, connected);
- mTimer.schedule(mTask, 3 * 1000L);
- // TODO: hold wakup lock so that we can finish change before
- // the device goes to sleep
- } else {
- if ((mTask != null) && mTask.mNetworkType.equals(type)) {
- mTask.cancel();
- }
- onConnectivityChanged(type, false);
- }
- }
- }
-
- private class MyTimerTask extends TimerTask {
- private boolean mConnected;
- private String mNetworkType;
-
- public MyTimerTask(String type, boolean connected) {
- mNetworkType = type;
- mConnected = connected;
- }
-
- @Override
- public void run() {
- synchronized (SipServiceImpl.this) {
- if (mTask != this) {
- Log.w(TAG, " unexpected task: " + mNetworkType
- + (mConnected ? " CONNECTED" : "DISCONNECTED"));
- return;
- }
- mTask = null;
- Log.v(TAG, " deliver change for " + mNetworkType
- + (mConnected ? " CONNECTED" : "DISCONNECTED"));
- onConnectivityChanged(mNetworkType, mConnected);
- }
- }
- }
- }
-
- // TODO: clean up pending SipSession(s) periodically
-}
diff --git a/src/com/android/sip/SipSessionGroup.java b/src/com/android/sip/SipSessionGroup.java
deleted file mode 100644
index 38d86f2..0000000
--- a/src/com/android/sip/SipSessionGroup.java
+++ /dev/null
@@ -1,1054 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip;
-
-import gov.nist.javax.sip.clientauthutils.AccountManager;
-import gov.nist.javax.sip.clientauthutils.UserCredentials;
-import gov.nist.javax.sip.header.SIPHeaderNames;
-import gov.nist.javax.sip.header.WWWAuthenticate;
-
-import android.net.sip.ISipSession;
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SessionDescription;
-import android.net.sip.SipProfile;
-import android.net.sip.SipSessionAdapter;
-import android.net.sip.SipSessionState;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.DatagramSocket;
-import java.text.ParseException;
-import java.util.Collection;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TooManyListenersException;
-
-import javax.sip.ClientTransaction;
-import javax.sip.Dialog;
-import javax.sip.DialogTerminatedEvent;
-import javax.sip.IOExceptionEvent;
-import javax.sip.InvalidArgumentException;
-import javax.sip.ListeningPoint;
-import javax.sip.RequestEvent;
-import javax.sip.ResponseEvent;
-import javax.sip.ServerTransaction;
-import javax.sip.SipException;
-import javax.sip.SipFactory;
-import javax.sip.SipListener;
-import javax.sip.SipProvider;
-import javax.sip.SipStack;
-import javax.sip.TimeoutEvent;
-import javax.sip.Transaction;
-import javax.sip.TransactionState;
-import javax.sip.TransactionTerminatedEvent;
-import javax.sip.address.Address;
-import javax.sip.address.SipURI;
-import javax.sip.header.CSeqHeader;
-import javax.sip.header.ExpiresHeader;
-import javax.sip.header.FromHeader;
-import javax.sip.header.MinExpiresHeader;
-import javax.sip.header.ViaHeader;
-import javax.sip.message.Message;
-import javax.sip.message.Request;
-import javax.sip.message.Response;
-
-/**
- * Manages {@link ISipSession}'s for a SIP account.
- */
-class SipSessionGroup implements SipListener {
- private static final String TAG = "SipSession";
- private static final String ANONYMOUS = "anonymous";
- private static final int EXPIRY_TIME = 3600;
-
- private static final EventObject DEREGISTER = new EventObject("Deregister");
- private static final EventObject END_CALL = new EventObject("End call");
- private static final EventObject HOLD_CALL = new EventObject("Hold call");
- private static final EventObject CONTINUE_CALL
- = new EventObject("Continue call");
-
- private final SipProfile mLocalProfile;
- private final String mPassword;
-
- private SipStack mSipStack;
- private SipHelper mSipHelper;
- private String mLastNonce;
- private int mRPort;
-
- // session that processes INVITE requests
- private SipSessionImpl mCallReceiverSession;
- private String mLocalIp;
-
- // call-id-to-SipSession map
- private Map<String, SipSessionImpl> mSessionMap =
- new HashMap<String, SipSessionImpl>();
-
- /**
- * @param myself the local profile with password crossed out
- * @param password the password of the profile
- * @throws IOException if cannot assign requested address
- */
- public SipSessionGroup(String localIp, SipProfile myself, String password)
- throws SipException, IOException {
- mLocalProfile = myself;
- mPassword = password;
- reset(localIp);
- }
-
- void reset(String localIp) throws SipException, IOException {
- mLocalIp = localIp;
- if (localIp == null) return;
-
- SipProfile myself = mLocalProfile;
- SipFactory sipFactory = SipFactory.getInstance();
- Properties properties = new Properties();
- properties.setProperty("javax.sip.STACK_NAME", getStackName());
- String outboundProxy = myself.getProxyAddress();
- if (!TextUtils.isEmpty(outboundProxy)) {
- properties.setProperty("javax.sip.OUTBOUND_PROXY", outboundProxy
- + ":" + myself.getPort() + "/" + myself.getProtocol());
- }
- SipStack stack = mSipStack = sipFactory.createSipStack(properties);
-
- try {
- SipProvider provider = stack.createSipProvider(
- stack.createListeningPoint(localIp, allocateLocalPort(),
- myself.getProtocol()));
- provider.addSipListener(this);
- mSipHelper = new SipHelper(stack, provider);
- } catch (InvalidArgumentException e) {
- throw new IOException(e.getMessage());
- } catch (TooManyListenersException e) {
- // must never happen
- throw new SipException("SipSessionGroup constructor", e);
- }
- Log.d(TAG, " start stack for " + myself.getUriString());
- stack.start();
-
- mLastNonce = null;
- mCallReceiverSession = null;
- mSessionMap.clear();
- }
-
- public SipProfile getLocalProfile() {
- return mLocalProfile;
- }
-
- public String getLocalProfileUri() {
- return mLocalProfile.getUriString();
- }
-
- private String getStackName() {
- return "stack" + System.currentTimeMillis();
- }
-
- public synchronized void close() {
- Log.d(TAG, " close stack for " + mLocalProfile.getUriString());
- mSessionMap.clear();
- closeToNotReceiveCalls();
- if (mSipStack != null) {
- mSipStack.stop();
- mSipStack = null;
- mSipHelper = null;
- }
- }
-
- public synchronized boolean isClosed() {
- return (mSipStack == null);
- }
-
- // For internal use, require listener not to block in callbacks.
- public synchronized void openToReceiveCalls(ISipSessionListener listener) {
- if (mCallReceiverSession == null) {
- mCallReceiverSession = new SipSessionCallReceiverImpl(listener);
- } else {
- mCallReceiverSession.setListener(listener);
- }
- }
-
- public synchronized void closeToNotReceiveCalls() {
- mCallReceiverSession = null;
- }
-
- public ISipSession createSession(ISipSessionListener listener) {
- return (isClosed() ? null : new SipSessionImpl(listener));
- }
-
- private static int allocateLocalPort() throws SipException {
- try {
- DatagramSocket s = new DatagramSocket();
- int localPort = s.getLocalPort();
- s.close();
- return localPort;
- } catch (IOException e) {
- throw new SipException("allocateLocalPort()", e);
- }
- }
-
- private synchronized SipSessionImpl getSipSession(EventObject event) {
- String key = SipHelper.getCallId(event);
- Log.d(TAG, " sesssion key from event: " + key);
- Log.d(TAG, " active sessions:");
- for (String k : mSessionMap.keySet()) {
- Log.d(TAG, " ..... '" + k + "': " + mSessionMap.get(k));
- }
- SipSessionImpl session = mSessionMap.get(key);
- return ((session != null) ? session : mCallReceiverSession);
- }
-
- private synchronized void addSipSession(SipSessionImpl newSession) {
- removeSipSession(newSession);
- String key = newSession.getCallId();
- Log.d(TAG, " +++++ add a session with key: '" + key + "'");
- mSessionMap.put(key, newSession);
- for (String k : mSessionMap.keySet()) {
- Log.d(TAG, " ..... " + k + ": " + mSessionMap.get(k));
- }
- }
-
- private synchronized void removeSipSession(SipSessionImpl session) {
- if (session == mCallReceiverSession) return;
- String key = session.getCallId();
- SipSessionImpl s = mSessionMap.remove(key);
- // sanity check
- if ((s != null) && (s != session)) {
- Log.w(TAG, "session " + session + " is not associated with key '"
- + key + "'");
- mSessionMap.put(key, s);
- for (Map.Entry<String, SipSessionImpl> entry
- : mSessionMap.entrySet()) {
- if (entry.getValue() == s) {
- key = entry.getKey();
- mSessionMap.remove(key);
- }
- }
- }
- Log.d(TAG, " remove session " + session + " with key '" + key + "'");
-
- for (String k : mSessionMap.keySet()) {
- Log.d(TAG, " ..... " + k + ": " + mSessionMap.get(k));
- }
- }
-
- public void processRequest(RequestEvent event) {
- process(event);
- }
-
- public void processResponse(ResponseEvent event) {
- process(event);
- }
-
- public void processIOException(IOExceptionEvent event) {
- process(event);
- }
-
- public void processTimeout(TimeoutEvent event) {
- process(event);
- }
-
- public void processTransactionTerminated(TransactionTerminatedEvent event) {
- process(event);
- }
-
- public void processDialogTerminated(DialogTerminatedEvent event) {
- process(event);
- }
-
- private synchronized void process(EventObject event) {
- SipSessionImpl session = getSipSession(event);
- try {
- if ((session != null) && session.process(event)) {
- Log.d(TAG, " ~~~~~ new state: " + session.mState);
- } else {
- Log.d(TAG, "event not processed: " + event);
- }
- } catch (Throwable e) {
- Log.e(TAG, "event process error: " + event, e);
- session.onError(e);
- }
- }
-
- private class SipSessionCallReceiverImpl extends SipSessionImpl {
- public SipSessionCallReceiverImpl(ISipSessionListener listener) {
- super(listener);
- }
-
- public boolean process(EventObject evt) throws SipException {
- Log.d(TAG, " ~~~~~ " + this + ": " + mState + ": processing "
- + log(evt));
- if (isRequestEvent(Request.INVITE, evt)) {
- RequestEvent event = (RequestEvent) evt;
- SipSessionImpl newSession = new SipSessionImpl(mProxy);
- newSession.mServerTransaction = mSipHelper.sendRinging(event,
- generateTag());
- newSession.mDialog = newSession.mServerTransaction.getDialog();
- newSession.mInviteReceived = event;
- newSession.mPeerProfile = createPeerProfile(event.getRequest());
- newSession.mState = SipSessionState.INCOMING_CALL;
- newSession.mPeerSessionDescription =
- event.getRequest().getRawContent();
- addSipSession(newSession);
- mProxy.onRinging(newSession, newSession.mPeerProfile,
- newSession.mPeerSessionDescription);
- return true;
- } else {
- return false;
- }
- }
- }
-
- class SipSessionImpl extends ISipSession.Stub {
- SipProfile mPeerProfile;
- SipSessionListenerProxy mProxy = new SipSessionListenerProxy();
- SipSessionState mState = SipSessionState.READY_TO_CALL;
- RequestEvent mInviteReceived;
- Dialog mDialog;
- ServerTransaction mServerTransaction;
- ClientTransaction mClientTransaction;
- byte[] mPeerSessionDescription;
- boolean mInCall;
- boolean mReRegisterFlag = false;
-
- public SipSessionImpl(ISipSessionListener listener) {
- setListener(listener);
- }
-
- private void reset() {
- mInCall = false;
- removeSipSession(this);
- mPeerProfile = null;
- mState = SipSessionState.READY_TO_CALL;
- mInviteReceived = null;
- mDialog = null;
- mServerTransaction = null;
- mClientTransaction = null;
- mPeerSessionDescription = null;
- }
-
- public boolean isInCall() {
- return mInCall;
- }
-
- public String getLocalIp() {
- return mLocalIp;
- }
-
- public SipProfile getLocalProfile() {
- return mLocalProfile;
- }
-
- public SipProfile getPeerProfile() {
- return mPeerProfile;
- }
-
- public String getCallId() {
- return SipHelper.getCallId(getTransaction());
- }
-
- private Transaction getTransaction() {
- if (mClientTransaction != null) return mClientTransaction;
- if (mServerTransaction != null) return mServerTransaction;
- return null;
- }
-
- public String getState() {
- return mState.toString();
- }
-
- public void setListener(ISipSessionListener listener) {
- mProxy.setListener((listener instanceof SipSessionListenerProxy)
- ? ((SipSessionListenerProxy) listener).getListener()
- : listener);
- }
-
- public void makeCall(SipProfile peerProfile,
- SessionDescription sessionDescription) {
- try {
- processCommand(
- new MakeCallCommand(peerProfile, sessionDescription));
- } catch (SipException e) {
- onError(e);
- }
- }
-
- public void answerCall(SessionDescription sessionDescription) {
- try {
- processCommand(
- new MakeCallCommand(mPeerProfile, sessionDescription));
- } catch (SipException e) {
- onError(e);
- }
- }
-
- public void endCall() {
- try {
- processCommand(END_CALL);
- } catch (SipException e) {
- onError(e);
- }
- }
-
- public void changeCall(SessionDescription sessionDescription) {
- try {
- processCommand(
- new MakeCallCommand(mPeerProfile, sessionDescription));
- } catch (SipException e) {
- onError(e);
- }
- }
-
- public void register(int duration) {
- try {
- processCommand(new RegisterCommand(duration));
- } catch (SipException e) {
- onRegistrationFailed(e);
- }
- }
-
- public void unregister() {
- try {
- processCommand(DEREGISTER);
- } catch (SipException e) {
- onRegistrationFailed(e);
- }
- }
-
- public boolean isReRegisterRequired() {
- return mReRegisterFlag;
- }
-
- public void clearReRegisterRequired() {
- mReRegisterFlag = false;
- }
-
- public void sendKeepAlive() {
- try {
- processCommand(new OptionsCommand());
- } catch (SipException e) {
- Log.e(TAG, "sendKeepAlive failed", e);
- }
- }
-
- private void processCommand(EventObject command) throws SipException {
- if (!process(command)) {
- throw new SipException("wrong state to execute: " + command);
- }
- }
-
- protected String generateTag() {
- // 32-bit randomness
- return String.valueOf((long) (Math.random() * 0x100000000L));
- }
-
- public String toString() {
- try {
- String s = super.toString();
- return s.substring(s.indexOf("@")) + ":" + mState;
- } catch (Throwable e) {
- return super.toString();
- }
- }
-
- public boolean process(EventObject evt) throws SipException {
- Log.d(TAG, " ~~~~~ " + this + ": " + mState + ": processing "
- + log(evt));
- synchronized (SipSessionGroup.this) {
- if (isClosed()) return false;
-
- Dialog dialog = null;
- if (evt instanceof RequestEvent) {
- dialog = ((RequestEvent) evt).getDialog();
- } else if (evt instanceof ResponseEvent) {
- dialog = ((ResponseEvent) evt).getDialog();
- }
- if (dialog != null) mDialog = dialog;
-
- boolean processed;
-
- switch (mState) {
- case REGISTERING:
- case DEREGISTERING:
- processed = registeringToReady(evt);
- break;
- case PINGING:
- processed = parseOptionsResult(evt);
- break;
- case READY_TO_CALL:
- processed = readyForCall(evt);
- break;
- case INCOMING_CALL:
- processed = incomingCall(evt);
- break;
- case INCOMING_CALL_ANSWERING:
- processed = incomingCallToInCall(evt);
- break;
- case OUTGOING_CALL:
- case OUTGOING_CALL_RING_BACK:
- processed = outgoingCall(evt);
- break;
- case OUTGOING_CALL_CANCELING:
- processed = outgoingCallToReady(evt);
- break;
- case IN_CALL:
- processed = inCall(evt);
- break;
- default:
- processed = false;
- }
- return (processed || processExceptions(evt));
- }
- }
-
- private boolean processExceptions(EventObject evt) throws SipException {
- if (isRequestEvent(Request.BYE, evt)) {
- // terminate the call whenever a BYE is received
- mSipHelper.sendResponse((RequestEvent) evt, Response.OK);
- endCallNormally();
- return true;
- } else if (isRequestEvent(Request.CANCEL, evt)) {
- mSipHelper.sendResponse((RequestEvent) evt,
- Response.CALL_OR_TRANSACTION_DOES_NOT_EXIST);
- return true;
- } else if (evt instanceof TransactionTerminatedEvent) {
- if (evt instanceof TimeoutEvent) {
- processTimeout((TimeoutEvent) evt);
- } else {
- // TODO: any clean up?
- }
- return true;
- } else if (evt instanceof DialogTerminatedEvent) {
- processDialogTerminated((DialogTerminatedEvent) evt);
- return true;
- }
- return false;
- }
-
- private void processDialogTerminated(DialogTerminatedEvent event) {
- if (mDialog == event.getDialog()) {
- onError(new SipException("dialog terminated"));
- } else {
- Log.d(TAG, "not the current dialog; current=" + mDialog
- + ", terminated=" + event.getDialog());
- }
- }
-
- private void processTimeout(TimeoutEvent event) {
- Log.d(TAG, "processing Timeout..." + event);
- Transaction current = event.isServerTransaction()
- ? mServerTransaction
- : mClientTransaction;
- Transaction target = event.isServerTransaction()
- ? event.getServerTransaction()
- : event.getClientTransaction();
-
- if (current != target) {
- Log.d(TAG, "not the current transaction; current=" + current
- + ", timed out=" + target);
- return;
- }
- switch (mState) {
- case REGISTERING:
- case DEREGISTERING:
- reset();
- mProxy.onRegistrationTimeout(this);
- break;
- case INCOMING_CALL:
- case INCOMING_CALL_ANSWERING:
- case OUTGOING_CALL_CANCELING:
- endCallOnError(new SipException("timed out"));
- break;
- default:
- // do nothing
- break;
- }
- }
-
- private int getExpiryTime(Response response) {
- int expires = EXPIRY_TIME;
- ExpiresHeader expiresHeader = (ExpiresHeader)
- response.getHeader(ExpiresHeader.NAME);
- if (expiresHeader != null) expires = expiresHeader.getExpires();
- expiresHeader = (ExpiresHeader)
- response.getHeader(MinExpiresHeader.NAME);
- if (expiresHeader != null) {
- expires = Math.max(expires, expiresHeader.getExpires());
- }
- return expires;
- }
-
- private boolean parseOptionsResult(EventObject evt) {
- if (expectResponse(Request.OPTIONS, evt)) {
- ResponseEvent event = (ResponseEvent) evt;
- int rPort = getRPortFromResponse(event.getResponse());
- if (rPort != -1) {
- if (mRPort == 0) mRPort = rPort;
- if (mRPort != rPort) {
- mReRegisterFlag = true;
- Log.w(TAG, String.format("rport is changed: %d <> %d",
- mRPort, rPort));
- mRPort = rPort;
- } else {
- Log.w(TAG, "rport is the same: " + rPort);
- }
- } else {
- Log.w(TAG, "peer did not respect our rport request");
- }
- reset();
- return true;
- }
- return false;
- }
-
- private int getRPortFromResponse(Response response) {
- ViaHeader viaHeader = (ViaHeader)(response.getHeader(
- SIPHeaderNames.VIA));
- return (viaHeader == null) ? -1 : viaHeader.getRPort();
- }
-
- private boolean registeringToReady(EventObject evt)
- throws SipException {
- if (expectResponse(Request.REGISTER, evt)) {
- ResponseEvent event = (ResponseEvent) evt;
- Response response = event.getResponse();
-
- int statusCode = response.getStatusCode();
- switch (statusCode) {
- case Response.OK:
- SipSessionState state = mState;
- reset();
- onRegistrationDone((state == SipSessionState.REGISTERING)
- ? getExpiryTime(((ResponseEvent) evt).getResponse())
- : -1);
- mLastNonce = null;
- return true;
- case Response.UNAUTHORIZED:
- case Response.PROXY_AUTHENTICATION_REQUIRED:
- String nonce = getNonceFromResponse(response);
- if (((nonce != null) && nonce.equals(mLastNonce)) ||
- (nonce == mLastNonce)) {
- Log.v(TAG, "Incorrect username/password");
- reset();
- onRegistrationFailed(createCallbackException(response));
- } else {
- mSipHelper.handleChallenge(event, getAccountManager());
- mLastNonce = nonce;
- }
- return true;
- default:
- if (statusCode >= 500) {
- reset();
- onRegistrationFailed(createCallbackException(response));
- return true;
- }
- }
- }
- return false;
- }
-
- private AccountManager getAccountManager() {
- return new AccountManager() {
- public UserCredentials getCredentials(ClientTransaction
- challengedTransaction, String realm) {
- return new UserCredentials() {
- public String getUserName() {
- return mLocalProfile.getUserName();
- }
-
- public String getPassword() {
- return mPassword;
- }
-
- public String getSipDomain() {
- return mLocalProfile.getSipDomain();
- }
- };
- }
- };
- }
-
- private String getNonceFromResponse(Response response) {
- WWWAuthenticate authHeader = (WWWAuthenticate)(response.getHeader(
- SIPHeaderNames.WWW_AUTHENTICATE));
- return (authHeader == null) ? null : authHeader.getNonce();
- }
-
- private boolean readyForCall(EventObject evt) throws SipException {
- // expect MakeCallCommand, RegisterCommand, DEREGISTER
- if (evt instanceof MakeCallCommand) {
- MakeCallCommand cmd = (MakeCallCommand) evt;
- mPeerProfile = cmd.getPeerProfile();
- SessionDescription sessionDescription =
- cmd.getSessionDescription();
- mClientTransaction = mSipHelper.sendInvite(mLocalProfile,
- mPeerProfile, sessionDescription, generateTag());
- mDialog = mClientTransaction.getDialog();
- addSipSession(this);
- mState = SipSessionState.OUTGOING_CALL;
- mProxy.onCalling(this);
- return true;
- } else if (evt instanceof RegisterCommand) {
- int duration = ((RegisterCommand) evt).getDuration();
- mClientTransaction = mSipHelper.sendRegister(mLocalProfile,
- generateTag(), duration);
- mDialog = mClientTransaction.getDialog();
- addSipSession(this);
- mState = SipSessionState.REGISTERING;
- mProxy.onRegistering(this);
- return true;
- } else if (DEREGISTER == evt) {
- mClientTransaction = mSipHelper.sendRegister(mLocalProfile,
- generateTag(), 0);
- mDialog = mClientTransaction.getDialog();
- addSipSession(this);
- mState = SipSessionState.DEREGISTERING;
- mProxy.onRegistering(this);
- return true;
- } else if (evt instanceof OptionsCommand) {
- mClientTransaction = mSipHelper.sendKeepAlive(mLocalProfile,
- generateTag());
- mDialog = mClientTransaction.getDialog();
- mState = SipSessionState.PINGING;
- addSipSession(this);
- return true;
- }
- return false;
- }
-
- private boolean incomingCall(EventObject evt) throws SipException {
- // expect MakeCallCommand(answering) , END_CALL cmd , Cancel
- if (evt instanceof MakeCallCommand) {
- // answer call
- mServerTransaction = mSipHelper.sendInviteOk(mInviteReceived,
- mLocalProfile,
- ((MakeCallCommand) evt).getSessionDescription(),
- mServerTransaction);
- mState = SipSessionState.INCOMING_CALL_ANSWERING;
- return true;
- } else if (END_CALL == evt) {
- mSipHelper.sendInviteBusyHere(mInviteReceived,
- mServerTransaction);
- endCallNormally();
- return true;
- } else if (isRequestEvent(Request.CANCEL, evt)) {
- RequestEvent event = (RequestEvent) evt;
- mSipHelper.sendResponse(event, Response.OK);
- mSipHelper.sendInviteRequestTerminated(
- mInviteReceived.getRequest(), mServerTransaction);
- endCallNormally();
- return true;
- }
- return false;
- }
-
- private boolean incomingCallToInCall(EventObject evt)
- throws SipException {
- // expect ACK, CANCEL request
- if (isRequestEvent(Request.ACK, evt)) {
- establishCall();
- return true;
- } else if (isRequestEvent(Request.CANCEL, evt)) {
- // http://tools.ietf.org/html/rfc3261#section-9.2
- // Final response has been sent; do nothing here.
- return true;
- }
- return false;
- }
-
- private boolean outgoingCall(EventObject evt) throws SipException {
- if (expectResponse(Request.INVITE, evt)) {
- ResponseEvent event = (ResponseEvent) evt;
- Response response = event.getResponse();
-
- int statusCode = response.getStatusCode();
- switch (statusCode) {
- case Response.RINGING:
- if (mState == SipSessionState.OUTGOING_CALL) {
- mState = SipSessionState.OUTGOING_CALL_RING_BACK;
- mProxy.onRingingBack(this);
- }
- return true;
- case Response.OK:
- mSipHelper.sendInviteAck(event, mDialog);
- mPeerSessionDescription = response.getRawContent();
- establishCall();
- return true;
- case Response.PROXY_AUTHENTICATION_REQUIRED:
- mClientTransaction = mSipHelper.handleChallenge(
- (ResponseEvent) evt, getAccountManager());
- mDialog = mClientTransaction.getDialog();
- addSipSession(this);
- return true;
- case Response.BUSY_HERE:
- reset();
- mProxy.onCallBusy(this);
- return true;
- case Response.REQUEST_PENDING:
- // TODO:
- // rfc3261#section-14.1; re-schedule invite
- return true;
- default:
- if (statusCode >= 400) {
- // error: an ack is sent automatically by the stack
- onError(createCallbackException(response));
- return true;
- } else if (statusCode >= 300) {
- // TODO: handle 3xx (redirect)
- } else {
- return true;
- }
- }
- return false;
- } else if (END_CALL == evt) {
- // RFC says that UA should not send out cancel when no
- // response comes back yet. We are cheating for not checking
- // response.
- mSipHelper.sendCancel(mClientTransaction);
- mState = SipSessionState.OUTGOING_CALL_CANCELING;
- return true;
- }
- return false;
- }
-
- private boolean outgoingCallToReady(EventObject evt)
- throws SipException {
- if (evt instanceof ResponseEvent) {
- ResponseEvent event = (ResponseEvent) evt;
- Response response = event.getResponse();
- int statusCode = response.getStatusCode();
- if (expectResponse(Request.CANCEL, evt)) {
- if (statusCode == Response.OK) {
- // do nothing; wait for REQUEST_TERMINATED
- return true;
- }
- } else if (expectResponse(Request.INVITE, evt)) {
- if (statusCode == Response.OK) {
- outgoingCall(evt); // abort Cancel
- return true;
- }
- } else {
- return false;
- }
-
- if (statusCode >= 400) {
- onError(createCallbackException(response));
- return true;
- }
- } else if (evt instanceof TransactionTerminatedEvent) {
- // rfc3261#section-14.1:
- // if re-invite gets timed out, terminate the dialog; but
- // re-invite is not reliable, just let it go and pretend
- // nothing happened.
- onError(new SipException("timed out"));
- }
- return false;
- }
-
- private boolean inCall(EventObject evt) throws SipException {
- // expect END_CALL cmd, BYE request, hold call (MakeCallCommand)
- // OK retransmission is handled in SipStack
- if (END_CALL == evt) {
- // rfc3261#section-15.1.1
- mSipHelper.sendBye(mDialog);
- endCallNormally();
- return true;
- } else if (isRequestEvent(Request.INVITE, evt)) {
- // got Re-INVITE
- RequestEvent event = mInviteReceived = (RequestEvent) evt;
- mState = SipSessionState.INCOMING_CALL;
- mPeerSessionDescription = event.getRequest().getRawContent();
- mServerTransaction = null;
- mProxy.onRinging(this, mPeerProfile, mPeerSessionDescription);
- return true;
- } else if (isRequestEvent(Request.BYE, evt)) {
- mSipHelper.sendResponse((RequestEvent) evt, Response.OK);
- endCallNormally();
- return true;
- } else if (evt instanceof MakeCallCommand) {
- // to change call
- mClientTransaction = mSipHelper.sendReinvite(mDialog,
- ((MakeCallCommand) evt).getSessionDescription());
- mState = SipSessionState.OUTGOING_CALL;
- return true;
- }
- return false;
- }
-
- private Exception createCallbackException(Response response) {
- return new SipException(String.format("Response: %s (%d)",
- response.getReasonPhrase(), response.getStatusCode()));
- }
-
- private void establishCall() {
- mState = SipSessionState.IN_CALL;
- mInCall = true;
- mProxy.onCallEstablished(this, mPeerSessionDescription);
- }
-
- private void fallbackToPreviousInCall(Throwable exception) {
- mState = SipSessionState.IN_CALL;
- mProxy.onCallChangeFailed(this, exception.getClass().getName(),
- exception.getMessage());
- }
-
- private void endCallNormally() {
- reset();
- mProxy.onCallEnded(this);
- }
-
- private void endCallOnError(Throwable exception) {
- reset();
- mProxy.onError(this, exception.getClass().getName(),
- exception.getMessage());
- }
-
- private void onError(Throwable exception) {
- if (mInCall) {
- fallbackToPreviousInCall(exception);
- } else {
- endCallOnError(exception);
- }
- }
-
- private void onRegistrationDone(int duration) {
- mProxy.onRegistrationDone(this, duration);
- }
-
- private void onRegistrationFailed(Throwable exception) {
- mProxy.onRegistrationFailed(this, exception.getClass().getName(),
- exception.getMessage());
- }
- }
-
- /**
- * @return true if the event is a request event matching the specified
- * method; false otherwise
- */
- private static boolean isRequestEvent(String method, EventObject event) {
- try {
- if (event instanceof RequestEvent) {
- RequestEvent requestEvent = (RequestEvent) event;
- return method.equals(requestEvent.getRequest().getMethod());
- }
- } catch (Throwable e) {
- }
- return false;
- }
-
- private static String getCseqMethod(Message message) {
- return ((CSeqHeader) message.getHeader(CSeqHeader.NAME)).getMethod();
- }
-
- /**
- * @return true if the event is a response event and the CSeqHeader method
- * match the given arguments; false otherwise
- */
- private static boolean expectResponse(
- String expectedMethod, EventObject evt) {
- if (evt instanceof ResponseEvent) {
- ResponseEvent event = (ResponseEvent) evt;
- Response response = event.getResponse();
- return expectedMethod.equalsIgnoreCase(getCseqMethod(response));
- }
- return false;
- }
-
- /**
- * @return true if the event is a response event and the response code and
- * CSeqHeader method match the given arguments; false otherwise
- */
- private static boolean expectResponse(
- int responseCode, String expectedMethod, EventObject evt) {
- if (evt instanceof ResponseEvent) {
- ResponseEvent event = (ResponseEvent) evt;
- Response response = event.getResponse();
- if (response.getStatusCode() == responseCode) {
- return expectedMethod.equalsIgnoreCase(getCseqMethod(response));
- }
- }
- return false;
- }
-
- private static SipProfile createPeerProfile(Request request)
- throws SipException {
- try {
- FromHeader fromHeader =
- (FromHeader) request.getHeader(FromHeader.NAME);
- Address address = fromHeader.getAddress();
- SipURI uri = (SipURI) address.getURI();
- String username = uri.getUser();
- if (username == null) username = ANONYMOUS;
- return new SipProfile.Builder(username, uri.getHost())
- .setPort(uri.getPort())
- .setDisplayName(address.getDisplayName())
- .build();
- } catch (InvalidArgumentException e) {
- throw new SipException("createPeerProfile()", e);
- } catch (ParseException e) {
- throw new SipException("createPeerProfile()", e);
- }
- }
-
- private static String log(EventObject evt) {
- if (evt instanceof RequestEvent) {
- return ((RequestEvent) evt).getRequest().toString();
- } else if (evt instanceof ResponseEvent) {
- return ((ResponseEvent) evt).getResponse().toString();
- } else {
- return evt.toString();
- }
- }
-
- private class OptionsCommand extends EventObject {
- public OptionsCommand() {
- super(SipSessionGroup.this);
- }
- }
-
- private class RegisterCommand extends EventObject {
- private int mDuration;
-
- public RegisterCommand(int duration) {
- super(SipSessionGroup.this);
- mDuration = duration;
- }
-
- public int getDuration() {
- return mDuration;
- }
- }
-
- private class MakeCallCommand extends EventObject {
- private SessionDescription mSessionDescription;
-
- public MakeCallCommand(SipProfile peerProfile,
- SessionDescription sessionDescription) {
- super(peerProfile);
- mSessionDescription = sessionDescription;
- }
-
- public SipProfile getPeerProfile() {
- return (SipProfile) getSource();
- }
-
- public SessionDescription getSessionDescription() {
- return mSessionDescription;
- }
- }
-
-}
diff --git a/src/com/android/sip/SipSessionListenerProxy.java b/src/com/android/sip/SipSessionListenerProxy.java
deleted file mode 100644
index 531e394..0000000
--- a/src/com/android/sip/SipSessionListenerProxy.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip;
-
-import android.net.sip.ISipSession;
-import android.net.sip.ISipSessionListener;
-import android.net.sip.SipProfile;
-import android.util.Log;
-
-/** Class to help safely run a callback in a different thread. */
-class SipSessionListenerProxy extends ISipSessionListener.Stub {
- private static final String TAG = "SipSession";
-
- private ISipSessionListener mListener;
-
- public void setListener(ISipSessionListener listener) {
- mListener = listener;
- }
-
- public ISipSessionListener getListener() {
- return mListener;
- }
-
- private void proxy(Runnable runnable) {
- // One thread for each calling back.
- // Note: Guarantee ordering if the issue becomes important. Currently,
- // the chance of handling two callback events at a time is none.
- new Thread(runnable).start();
- }
-
- public void onCalling(final ISipSession session) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onCalling(session);
- } catch (Throwable t) {
- Log.w(TAG, "onCalling()", t);
- }
- }
- });
- }
-
- public void onRinging(final ISipSession session, final SipProfile caller,
- final byte[] sessionDescription) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onRinging(session, caller, sessionDescription);
- } catch (Throwable t) {
- Log.w(TAG, "onRinging()", t);
- }
- }
- });
- }
-
- public void onRingingBack(final ISipSession session) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onRingingBack(session);
- } catch (Throwable t) {
- Log.w(TAG, "onRingingBack()", t);
- }
- }
- });
- }
-
- public void onCallEstablished(final ISipSession session,
- final byte[] sessionDescription) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onCallEstablished(session, sessionDescription);
- } catch (Throwable t) {
- Log.w(TAG, "onCallEstablished()", t);
- }
- }
- });
- }
-
- public void onCallEnded(final ISipSession session) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onCallEnded(session);
- } catch (Throwable t) {
- Log.w(TAG, "onCallEnded()", t);
- }
- }
- });
- }
-
- public void onCallBusy(final ISipSession session) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onCallBusy(session);
- } catch (Throwable t) {
- Log.w(TAG, "onCallBusy()", t);
- }
- }
- });
- }
-
- public void onCallChangeFailed(final ISipSession session,
- final String className, final String message) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onCallChangeFailed(session, className, message);
- } catch (Throwable t) {
- Log.w(TAG, "onCallChangeFailed()", t);
- }
- }
- });
- }
-
- public void onError(final ISipSession session, final String className,
- final String message) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onError(session, className, message);
- } catch (Throwable t) {
- Log.w(TAG, "onError()", t);
- }
- }
- });
- }
-
- public void onRegistering(final ISipSession session) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onRegistering(session);
- } catch (Throwable t) {
- Log.w(TAG, "onRegistering()", t);
- }
- }
- });
- }
-
- public void onRegistrationDone(final ISipSession session,
- final int duration) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onRegistrationDone(session, duration);
- } catch (Throwable t) {
- Log.w(TAG, "onRegistrationDone()", t);
- }
- }
- });
- }
-
- public void onRegistrationFailed(final ISipSession session,
- final String className, final String message) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onRegistrationFailed(session, className, message);
- } catch (Throwable t) {
- Log.w(TAG, "onRegistrationFailed()", t);
- }
- }
- });
- }
-
- public void onRegistrationTimeout(final ISipSession session) {
- if (mListener == null) return;
- proxy(new Runnable() {
- public void run() {
- try {
- mListener.onRegistrationTimeout(session);
- } catch (Throwable t) {
- Log.w(TAG, "onRegistrationTimeout()", t);
- }
- }
- });
- }
-}
diff --git a/src/com/android/sip/WakeupTimer.java b/src/com/android/sip/WakeupTimer.java
deleted file mode 100644
index 9c31f7a..0000000
--- a/src/com/android/sip/WakeupTimer.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.SystemClock;
-import android.util.Log;
-
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.TreeSet;
-
-/**
- * Timer that can schedule events to occur even when the device is in sleep.
- * Only used internally in this package.
- */
-class WakeupTimer extends BroadcastReceiver {
- private static final String TAG = "_SIP.WkTimer_";
- private static final String TRIGGER_TIME = "TriggerTime";
-
- private Context mContext;
- private AlarmManager mAlarmManager;
-
- // runnable --> time to execute in SystemClock
- private TreeSet<MyEvent> mEventQueue =
- new TreeSet<MyEvent>(new MyEventComparator());
-
- private PendingIntent mPendingIntent;
-
- public WakeupTimer(Context context) {
- mContext = context;
- mAlarmManager = (AlarmManager)
- context.getSystemService(Context.ALARM_SERVICE);
-
- IntentFilter filter = new IntentFilter(getAction());
- context.registerReceiver(this, filter);
- }
-
- /**
- * Stops the timer. No event can be scheduled after this method is called.
- */
- public synchronized void stop() {
- mContext.unregisterReceiver(this);
- if (mPendingIntent != null) {
- mAlarmManager.cancel(mPendingIntent);
- mPendingIntent = null;
- }
- mEventQueue.clear();
- mEventQueue = null;
- }
-
- private synchronized boolean stopped() {
- if (mEventQueue == null) {
- Log.w(TAG, "Timer stopped");
- return true;
- } else {
- return false;
- }
- }
-
- private void cancelAlarm() {
- mAlarmManager.cancel(mPendingIntent);
- mPendingIntent = null;
- }
-
- private void recalculatePeriods() {
- if (mEventQueue.isEmpty()) return;
-
- MyEvent firstEvent = mEventQueue.first();
- int minPeriod = firstEvent.mMaxPeriod;
- long minTriggerTime = firstEvent.mTriggerTime;
- for (MyEvent e : mEventQueue) {
- e.mPeriod = e.mMaxPeriod / minPeriod * minPeriod;
- int interval = (int) (e.mLastTriggerTime + e.mMaxPeriod
- - minTriggerTime);
- interval = interval / minPeriod * minPeriod;
- e.mTriggerTime = minTriggerTime + interval;
- }
- TreeSet<MyEvent> newQueue = new TreeSet<MyEvent>(
- mEventQueue.comparator());
- newQueue.addAll((Collection<MyEvent>) mEventQueue);
- mEventQueue.clear();
- mEventQueue = newQueue;
- Log.v(TAG, "queue re-calculated");
- printQueue();
- }
-
- // Determines the period and the trigger time of the new event and insert it
- // to the queue.
- private void insertEvent(MyEvent event) {
- long now = SystemClock.elapsedRealtime();
- if (mEventQueue.isEmpty()) {
- event.mTriggerTime = now + event.mPeriod;
- mEventQueue.add(event);
- return;
- }
- MyEvent firstEvent = mEventQueue.first();
- int minPeriod = firstEvent.mPeriod;
- if (minPeriod <= event.mMaxPeriod) {
- event.mPeriod = event.mMaxPeriod / minPeriod * minPeriod;
- int interval = event.mMaxPeriod;
- interval -= (int) (firstEvent.mTriggerTime - now);
- interval = interval / minPeriod * minPeriod;
- event.mTriggerTime = firstEvent.mTriggerTime + interval;
- mEventQueue.add(event);
- } else {
- long triggerTime = now + event.mPeriod;
- if (firstEvent.mTriggerTime < triggerTime) {
- event.mTriggerTime = firstEvent.mTriggerTime;
- event.mLastTriggerTime -= event.mPeriod;
- } else {
- event.mTriggerTime = triggerTime;
- }
- mEventQueue.add(event);
- recalculatePeriods();
- }
- }
-
- /**
- * Sets a periodic timer.
- *
- * @param period the timer period; in milli-second
- * @param callback is called back when the timer goes off; the same callback
- * can be specified in multiple timer events
- */
- public synchronized void set(int period, Runnable callback) {
- if (stopped()) return;
-
- long now = SystemClock.elapsedRealtime();
- MyEvent event = new MyEvent(period, callback, now);
- insertEvent(event);
-
- if (mEventQueue.first() == event) {
- if (mEventQueue.size() > 1) cancelAlarm();
- scheduleNext();
- }
-
- long triggerTime = event.mTriggerTime;
- Log.v(TAG, " add event " + event + " scheduled at "
- + showTime(triggerTime) + " at " + showTime(now)
- + ", #events=" + mEventQueue.size());
- printQueue();
- }
-
- /**
- * Cancels all the timer events with the specified callback.
- *
- * @param callback the callback
- */
- public synchronized void cancel(Runnable callback) {
- if (stopped() || mEventQueue.isEmpty()) return;
- Log.d(TAG, "cancel:" + callback);
-
- MyEvent firstEvent = mEventQueue.first();
- for (Iterator<MyEvent> iter = mEventQueue.iterator();
- iter.hasNext();) {
- MyEvent event = iter.next();
- if (event.mCallback == callback) {
- iter.remove();
- Log.d(TAG, " cancel found:" + event);
- }
- }
- if (mEventQueue.isEmpty()) {
- cancelAlarm();
- } else if (mEventQueue.first() != firstEvent) {
- cancelAlarm();
- firstEvent = mEventQueue.first();
- firstEvent.mPeriod = firstEvent.mMaxPeriod;
- firstEvent.mTriggerTime = firstEvent.mLastTriggerTime
- + firstEvent.mPeriod;
- recalculatePeriods();
- scheduleNext();
- }
- Log.d(TAG, "after cancel:");
- printQueue();
- }
-
- private void scheduleNext() {
- if (stopped() || mEventQueue.isEmpty()) return;
-
- if (mPendingIntent != null) {
- throw new RuntimeException("pendingIntent is not null!");
- }
-
- MyEvent event = mEventQueue.first();
- Intent intent = new Intent(getAction());
- intent.putExtra(TRIGGER_TIME, event.mTriggerTime);
- PendingIntent pendingIntent = mPendingIntent =
- PendingIntent.getBroadcast(mContext, 0, intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
- mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- event.mTriggerTime, pendingIntent);
- }
-
- @Override
- public synchronized void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (getAction().equals(action)
- && intent.getExtras().containsKey(TRIGGER_TIME)) {
- mPendingIntent = null;
- long triggerTime = intent.getLongExtra(TRIGGER_TIME, -1L);
- execute(triggerTime);
- } else {
- Log.d(TAG, "unrecognized intent: " + intent);
- }
- }
-
- private void printQueue() {
- int count = 0;
- for (MyEvent event : mEventQueue) {
- Log.d(TAG, " " + event + ": scheduled at "
- + showTime(event.mTriggerTime) + ": last at "
- + showTime(event.mLastTriggerTime));
- if (++count >= 5) break;
- }
- if (mEventQueue.size() > count) {
- Log.d(TAG, " .....");
- } else if (count == 0) {
- Log.d(TAG, " <empty>");
- }
- }
-
- private void execute(long triggerTime) {
- Log.d(TAG, "time's up, triggerTime = " + showTime(triggerTime) + ": "
- + mEventQueue.size());
- if (stopped() || mEventQueue.isEmpty()) return;
-
- for (MyEvent event : mEventQueue) {
- if (event.mTriggerTime != triggerTime) break;
- Log.d(TAG, "execute " + event);
-
- event.mLastTriggerTime = event.mTriggerTime;
- event.mTriggerTime += event.mPeriod;
-
- // run the callback in a new thread to prevent deadlock
- new Thread(event.mCallback).start();
- }
- Log.d(TAG, "after timeout execution");
- printQueue();
- scheduleNext();
- }
-
- private String getAction() {
- return toString();
- }
-
- private static class MyEvent {
- int mPeriod;
- int mMaxPeriod;
- long mTriggerTime;
- long mLastTriggerTime;
- Runnable mCallback;
-
- MyEvent(int period, Runnable callback, long now) {
- mPeriod = mMaxPeriod = period;
- mCallback = callback;
- mLastTriggerTime = now;
- }
-
- @Override
- public String toString() {
- String s = super.toString();
- s = s.substring(s.indexOf("@"));
- return s + ":" + (mPeriod / 1000) + ":" + (mMaxPeriod / 1000) + ":"
- + toString(mCallback);
- }
-
- private String toString(Object o) {
- String s = o.toString();
- int index = s.indexOf("$");
- if (index > 0) s = s.substring(index + 1);
- return s;
- }
- }
-
- private static class MyEventComparator implements Comparator<MyEvent> {
- public int compare(MyEvent e1, MyEvent e2) {
- if (e1 == e2) return 0;
- int diff = e1.mMaxPeriod - e2.mMaxPeriod;
- if (diff == 0) diff = -1;
- return diff;
- }
-
- public boolean equals(Object that) {
- return (this == that);
- }
- }
-
- private static String showTime(long time) {
- int ms = (int) (time % 1000);
- int s = (int) (time / 1000);
- int m = s / 60;
- s %= 60;
- return String.format("%d.%d.%d", m, s, ms);
- }
-}
diff --git a/src/com/android/sip/media/Decoder.java b/src/com/android/sip/media/Decoder.java
deleted file mode 100644
index a45b299..0000000
--- a/src/com/android/sip/media/Decoder.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.media;
-
-import java.io.IOException;
-
-public interface Decoder {
- int getSampleCount(int frameSize);
-
- /**
- * Decodes from the encoded data array.
- *
- * @param result the decoded result array
- * @param src encoded data
- * @param count valid data length in src
- * @param offset offset of data bytes in src
- */
- int decode(short[] result, byte[] src, int count, int offset)
- throws IOException;
-}
diff --git a/src/com/android/sip/media/Encoder.java b/src/com/android/sip/media/Encoder.java
deleted file mode 100644
index c8107ee..0000000
--- a/src/com/android/sip/media/Encoder.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.media;
-
-public interface Encoder {
- int getSampleCount(int frameSize);
-
- /**
- * Encodes the sample data.
- *
- * @param src sample data
- * @param count valid data length in src
- * @param result the encoded result array
- * @param offset offset of data bytes in result
- */
- int encode(short[] src, int count, byte[] result, int offset);
-}
diff --git a/src/com/android/sip/media/G711ACodec.java b/src/com/android/sip/media/G711ACodec.java
deleted file mode 100644
index 8ae4b59..0000000
--- a/src/com/android/sip/media/G711ACodec.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.media;
-
-/**
- * G.711 codec. This class provides a-law conversion.
- */
-public class G711ACodec implements Encoder, Decoder {
- // s0000000wxyz...s000wxyz
- // s0000001wxyz...s001wxyz
- // s000001wxyza...s010wxyz
- // s00001wxyzab...s011wxyz
- // s0001wxyzabc...s100wxyz
- // s001wxyzabcd...s101wxyz
- // s01wxyzabcde...s110wxyz
- // s1wxyzabcdef...s111wxyz
-
- private static byte[] table12to8 = new byte[4096];
- private static short[] table8to16 = new short[256];
-
- static {
- // b12 --> b8
- for (int m = 0; m < 16; m++) {
- int v = m ^ 0x55;
- table12to8[m] = (byte) v;
- table12to8[4095 - m] = (byte) (v + 128);
- }
- for (int p = 1, q = 0x10; p <= 0x40; p <<= 1, q+=0x10) {
- for (int i = 0, j = (p << 4); i < 16; i++, j += p) {
- int v = (i + q) ^ 0x55;
- byte value1 = (byte) v;
- byte value2 = (byte) (v + 128);
- for (int m = j, e = j + p; m < e; m++) {
- table12to8[m] = value1;
- table12to8[4095 - m] = value2;
- }
- }
- }
-
- // b8 --> b16
- for (int m = 0; m < 16; m++) {
- int v = m << 4;
- table8to16[m ^ 0x55] = (short) v;
- table8to16[(m + 128) ^ 0x55] = (short) (65536 - v);
- }
- for (int q = 1; q <= 7; q++) {
- for (int i = 0, m = (q << 4); i < 16; i++, m++) {
- int v = (i + 0x10) << (q + 3);
- table8to16[m ^ 0x55] = (short) v;
- table8to16[(m + 128) ^ 0x55] = (short) (65536 - v);
- }
- }
- }
-
- public int decode(short[] b16, byte[] b8, int count, int offset) {
- for (int i = 0, j = offset; i < count; i++, j++) {
- b16[i] = table8to16[b8[j] & 0xff];
- }
- return count;
- }
-
- public int encode(short[] b16, int count, byte[] b8, int offset) {
-
- for (int i = 0, j = offset; i < count; i++, j++) {
- b8[j] = table12to8[(b16[i] & 0xffff) >> 4];
- }
- return count;
- }
-
- public int getSampleCount(int frameSize) {
- return frameSize;
- }
-}
diff --git a/src/com/android/sip/media/G711UCodec.java b/src/com/android/sip/media/G711UCodec.java
deleted file mode 100644
index 3cf9c3b..0000000
--- a/src/com/android/sip/media/G711UCodec.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.media;
-
-/**
- * G.711 codec. This class provides u-law conversion.
- */
-public class G711UCodec implements Encoder, Decoder {
- // s00000001wxyz...s000wxyz
- // s0000001wxyza...s001wxyz
- // s000001wxyzab...s010wxyz
- // s00001wxyzabc...s011wxyz
- // s0001wxyzabcd...s100wxyz
- // s001wxyzabcde...s101wxyz
- // s01wxyzabcdef...s110wxyz
- // s1wxyzabcdefg...s111wxyz
-
- private static byte[] table13to8 = new byte[8192];
- private static short[] table8to16 = new short[256];
-
- static {
- // b13 --> b8
- for (int p = 1, q = 0; p <= 0x80; p <<= 1, q+=0x10) {
- for (int i = 0, j = (p << 4) - 0x10; i < 16; i++, j += p) {
- int v = (i + q) ^ 0x7F;
- byte value1 = (byte) v;
- byte value2 = (byte) (v + 128);
- for (int m = j, e = j + p; m < e; m++) {
- table13to8[m] = value1;
- table13to8[8191 - m] = value2;
- }
- }
- }
-
- // b8 --> b16
- for (int q = 0; q <= 7; q++) {
- for (int i = 0, m = (q << 4); i < 16; i++, m++) {
- int v = (((i + 0x10) << q) - 0x10) << 3;
- table8to16[m ^ 0x7F] = (short) v;
- table8to16[(m ^ 0x7F) + 128] = (short) (65536 - v);
- }
- }
- }
-
- public int decode(short[] b16, byte[] b8, int count, int offset) {
- for (int i = 0, j = offset; i < count; i++, j++) {
- b16[i] = table8to16[b8[j] & 0xFF];
- }
- return count;
- }
-
- public int encode(short[] b16, int count, byte[] b8, int offset) {
-
- for (int i = 0, j = offset; i < count; i++, j++) {
- b8[j] = table13to8[(b16[i] >> 4) & 0x1FFF];
- }
- return count;
- }
-
- public int getSampleCount(int frameSize) {
- return frameSize;
- }
-}
diff --git a/src/com/android/sip/media/RtpAudioSession.java b/src/com/android/sip/media/RtpAudioSession.java
deleted file mode 100644
index 46a14e8..0000000
--- a/src/com/android/sip/media/RtpAudioSession.java
+++ /dev/null
@@ -1,668 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.media;
-
-import android.media.AudioFormat;
-import android.media.AudioManager;
-import android.media.AudioRecord;
-import android.media.AudioTrack;
-import android.media.MediaRecorder;
-import android.os.Process;
-import android.util.Log;
-
-import java.io.IOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-class RtpAudioSession implements RtpSession {
- private static final String TAG = RtpAudioSession.class.getSimpleName();
- private static final int AUDIO_SAMPLE_RATE = 8000;
- private static final int MAX_ALLOWABLE_LATENCY = 500; // ms
-
- private RecordTask mRecordTask;
- private PlayTask mPlayTask;
-
- private DatagramSocket mSocket;
- private boolean mSendDtmf = false;
- private int mCodecId;
-
- private NoiseGenerator mNoiseGenerator = new NoiseGenerator();
-
- RtpAudioSession(int codecId) {
- mCodecId = codecId;
- }
-
- void set(int remoteSampleRate, DatagramSocket socket) {
- mSocket = socket;
- int localFrameSize = AUDIO_SAMPLE_RATE / 50; // 50 frames / sec
- mRecordTask = new RecordTask(AUDIO_SAMPLE_RATE, localFrameSize);
- mPlayTask = new PlayTask(remoteSampleRate, localFrameSize);
- }
-
- public int getCodecId() {
- return mCodecId;
- }
-
- public int getSampleRate() {
- return AUDIO_SAMPLE_RATE;
- }
-
- public String getName() {
- switch (mCodecId) {
- case 8: return "PCMA";
- default: return "PCMU";
- }
- }
-
- public void startSending() {
- mRecordTask.start();
- }
-
- public void startReceiving() {
- mPlayTask.start();
- }
-
- public synchronized void stop() {
- mRecordTask.stop();
- mPlayTask.stop();
- Log.v(TAG, "stop RtpSession: measured volume = "
- + mNoiseGenerator.mMeasuredVolume);
- // wait until player is stopped
- for (int i = 20; (i > 0) && !mPlayTask.isStopped(); i--) {
- Log.v(TAG, " wait for player to stop...");
- try {
- wait(20);
- } catch (InterruptedException e) {
- // ignored
- }
- }
- }
-
- public void toggleMute() {
- if (mRecordTask != null) mRecordTask.toggleMute();
- }
-
- public boolean isMuted() {
- return ((mRecordTask != null) ? mRecordTask.isMuted() : false);
- }
-
- public void sendDtmf() {
- mSendDtmf = true;
- }
-
- private class PlayTask implements Runnable {
- private int mSampleRate;
- private int mFrameSize;
- private AudioPlayer mPlayer;
- private boolean mRunning;
-
- PlayTask(int sampleRate, int frameSize) {
- mSampleRate = sampleRate;
- mFrameSize = frameSize;
- }
-
- void start() {
- if (mRunning) return;
- mRunning = true;
- new Thread(this).start();
- }
-
- void stop() {
- mRunning = false;
- }
-
- boolean isStopped() {
- return (mPlayer == null)
- || (mPlayer.getPlayState() == AudioTrack.PLAYSTATE_STOPPED);
- }
-
- public void run() {
- Decoder decoder = RtpFactory.createDecoder(mCodecId);
- int playBufferSize = decoder.getSampleCount(mFrameSize);
- short[] playBuffer = new short[playBufferSize];
-
- RtpReceiver receiver = new RtpReceiver(mFrameSize);
- byte[] buffer = receiver.getBuffer();
- int offset = receiver.getPayloadOffset();
-
- int minBufferSize = AudioTrack.getMinBufferSize(mSampleRate,
- AudioFormat.CHANNEL_CONFIGURATION_MONO,
- AudioFormat.ENCODING_PCM_16BIT) * 6;
- minBufferSize = Math.max(minBufferSize, playBufferSize);
- int bufferHighMark = minBufferSize / 2 * 8 / 10;
- Log.d(TAG, " play buffer = " + minBufferSize + ", high water mark="
- + bufferHighMark);
- AudioTrack aplayer = new AudioTrack(AudioManager.STREAM_MUSIC,
- mSampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
- AudioFormat.ENCODING_PCM_16BIT, minBufferSize,
- AudioTrack.MODE_STREAM);
- AudioPlayer player = mPlayer =
- new AudioPlayer(aplayer, minBufferSize, mFrameSize);
-
- Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO);
- player.play();
- int playState = player.getPlayState();
- long receiveCount = 0;
- long cyclePeriod = mFrameSize * 1000L / mSampleRate;
- long cycleStart = 0;
- int seqNo = 0;
- int packetLossCount = 0;
- int bytesDropped = 0;
-
- player.flush();
- int writeHead = player.getPlaybackHeadPosition();
-
- // start measurement after first packet arrival
- try {
- receiver.receive();
- Log.d(TAG, "received first packet");
- } catch (IOException e) {
- Log.e(TAG, "receive error; stop player", e);
- player.stop();
- player.release();
- return;
- }
- cycleStart = System.currentTimeMillis();
- seqNo = receiver.getSequenceNumber();
-
- long startTime = System.currentTimeMillis();
- long virtualClock = startTime;
- float delta = 0f;
-
- while (mRunning) {
- try {
- int count = receiver.receive();
- int decodeCount = decoder.decode(
- playBuffer, buffer, count, offset);
- mNoiseGenerator.measureVolume(playBuffer, 0, decodeCount);
- if (playState == AudioTrack.PLAYSTATE_STOPPED) {
- player.play();
- playState = player.getPlayState();
- }
-
- receiveCount ++;
- int sn = receiver.getSequenceNumber();
- int lossCount = sn - seqNo - 1;
- if (lossCount > 0) {
- packetLossCount += lossCount;
- virtualClock += lossCount * cyclePeriod;
- }
- virtualClock += cyclePeriod;
- long now = System.currentTimeMillis();
- long late = now - virtualClock;
- if ((late < 0) || (late > 1000)) {
- if (late > 1000) {
- Log.d(TAG, " large delay detected: " + late
- + ", been muted?");
- }
- virtualClock = now;
- late = 0;
- delta = 0;
- } else {
- delta = delta * 0.96f + late * 0.04f;
- if (delta > MAX_ALLOWABLE_LATENCY) {
- delta = MAX_ALLOWABLE_LATENCY;
- }
- late -= (long) delta;
- }
-
- if (late > 200) {
- // drop
- bytesDropped += decodeCount;
- if (LogRateLimiter.allowLogging(now)) {
- Log.d(TAG, " drop " + sn + ":" + decodeCount
- + ", late: " + late + ", d=" + delta);
- }
- cycleStart = now;
- seqNo = sn;
- continue;
- }
- int buffered = writeHead - player.getPlaybackHeadPosition();
- if (buffered > bufferHighMark) {
- player.flush();
- buffered = 0;
- writeHead = player.getPlaybackHeadPosition();
- if (LogRateLimiter.allowLogging(now)) {
- Log.d(TAG, " ~~~ flush: set writeHead to "
- + writeHead);
- }
- }
-
- writeHead += player.write(playBuffer, 0, decodeCount);
-
- cycleStart = now;
- seqNo = sn;
- } catch (IOException e) {
- Log.w(TAG, "network disconnected; playback stopped", e);
- player.stop();
- playState = player.getPlayState();
- }
- }
- Log.d(TAG, " receiveCount = " + receiveCount);
- Log.d(TAG, " # packets lost =" + packetLossCount);
- Log.d(TAG, " bytes dropped =" + bytesDropped);
- Log.d(TAG, "stop sound playing...");
- player.stop();
- player.flush();
- player.release();
- }
- }
-
- private class RecordTask implements Runnable {
- private int mSampleRate;
- private int mFrameSize;
- private boolean mRunning;
- private boolean mMuted = false;
-
- RecordTask(int sampleRate, int frameSize) {
- mSampleRate = sampleRate;
- mFrameSize = frameSize;
- }
-
- void start() {
- if (mRunning) return;
- mRunning = true;
- new Thread(this).start();
- }
-
- void stop() {
- mRunning = false;
- }
-
- void toggleMute() {
- mMuted = !mMuted;
- }
-
- boolean isMuted() {
- return mMuted;
- }
-
- private void adjustMicGain(short[] buf, int len, int factor) {
- int i,j;
- for (i = 0; i < len; i++) {
- j = buf[i];
- if (j > 32768/factor) {
- buf[i] = 32767;
- } else if (j < -(32768/factor)) {
- buf[i] = -32767;
- } else {
- buf[i] = (short)(factor*j);
- }
- }
- }
-
- public void run() {
- Encoder encoder = RtpFactory.createEncoder(mCodecId);
- int recordBufferSize = encoder.getSampleCount(mFrameSize);
- short[] recordBuffer = new short[recordBufferSize];
- RtpSender sender = new RtpSender(mFrameSize);
- byte[] buffer = sender.getBuffer();
- int offset = sender.getPayloadOffset();
-
- int bufferSize = AudioRecord.getMinBufferSize(mSampleRate,
- AudioFormat.CHANNEL_CONFIGURATION_MONO,
- AudioFormat.ENCODING_PCM_16BIT) * 3 / 2;
-
- AudioRecord recorder = new AudioRecord(
- MediaRecorder.AudioSource.MIC, mSampleRate,
- AudioFormat.CHANNEL_CONFIGURATION_MONO,
- AudioFormat.ENCODING_PCM_16BIT, bufferSize);
-
- recorder.startRecording();
- Log.d(TAG, "start sound recording..." + recorder.getState());
-
- // skip the first read, kick off read pipeline
- recorder.read(recordBuffer, 0, recordBufferSize);
-
- long sendCount = 0;
- long startTime = System.currentTimeMillis();
-
- while (mRunning) {
- int count = recorder.read(recordBuffer, 0, recordBufferSize);
- if (mMuted) continue;
-
- // TODO: remove the mic gain if the issue is fixed on Passion.
- adjustMicGain(recordBuffer, count, 16);
-
- int encodeCount =
- encoder.encode(recordBuffer, count, buffer, offset);
- try {
- sender.send(encodeCount);
- if (mSendDtmf) {
- recorder.stop();
- sender.sendDtmf();
- mSendDtmf = false;
- recorder.startRecording();
- }
- } catch (IOException e) {
- if (mRunning) Log.e(TAG, "send error, stop sending", e);
- break;
- }
-
- sendCount ++;
- }
- long now = System.currentTimeMillis();
- Log.d(TAG, " sendCount = " + sendCount);
- Log.d(TAG, " avg send cycle ="
- + ((double) (now - startTime) / sendCount));
- Log.d(TAG, "stop sound recording...");
- recorder.stop();
- mMuted = false;
- }
- }
-
- private class RtpReceiver {
- RtpPacket mPacket;
- DatagramPacket mDatagram;
-
- RtpReceiver(int size) {
- byte[] buffer = new byte[size + 12];
- mPacket = new RtpPacket(buffer);
- mPacket.setPayloadType(mCodecId);
- mDatagram = new DatagramPacket(buffer, buffer.length);
- }
-
- byte[] getBuffer() {
- return mPacket.getRawPacket();
- }
-
- int getPayloadOffset() {
- return 12;
- }
-
- // return received payload size
- int receive() throws IOException {
- DatagramPacket datagram = mDatagram;
- mSocket.receive(datagram);
- return datagram.getLength() - 12;
- }
-
- InetAddress getRemoteAddress() {
- return mDatagram.getAddress();
- }
-
- int getRemotePort() {
- return mDatagram.getPort();
- }
-
- int getSequenceNumber() {
- return mPacket.getSequenceNumber();
- }
- }
-
- private class RtpSender extends RtpReceiver {
- private int mSequence = 0;
- private long mTimeStamp = 0;
-
- RtpSender(int size) {
- super(size);
- }
-
- void sendDtmf() throws IOException {
- byte[] buffer = getBuffer();
-
- RtpPacket packet = mPacket;
- packet.setPayloadType(101);
- packet.setPayloadLength(4);
-
- mTimeStamp += 160;
- packet.setTimestamp(mTimeStamp);
- DatagramPacket datagram = mDatagram;
- datagram.setLength(packet.getPacketLength());
- int duration = 480;
- buffer[12] = 1;
- buffer[13] = 0;
- buffer[14] = (byte)(duration >> 8);
- buffer[15] = (byte)duration;
- for (int i = 0; i < 3; i++) {
- packet.setSequenceNumber(mSequence++);
- mSocket.send(datagram);
- try {
- Thread.sleep(20);
- } catch (Exception e) {
- }
- }
- mTimeStamp += 480;
- packet.setTimestamp(mTimeStamp);
- buffer[12] = 1;
- buffer[13] = (byte)0x80;
- buffer[14] = (byte)(duration >> 8);
- buffer[15] = (byte)duration;
- for (int i = 0; i < 3; i++) {
- packet.setSequenceNumber(mSequence++);
- mSocket.send(datagram);
- }
- }
-
- void send(int count) throws IOException {
- mTimeStamp += count;
- RtpPacket packet = mPacket;
- packet.setSequenceNumber(mSequence++);
- packet.setPayloadType(mCodecId);
- packet.setTimestamp(mTimeStamp);
- packet.setPayloadLength(count);
-
- DatagramPacket datagram = mDatagram;
- datagram.setLength(packet.getPacketLength());
- mSocket.send(datagram);
- }
- }
-
- private class NoiseGenerator {
- private static final int AMP = 1000;
- private static final int TURN_DOWN_RATE = 80;
- private static final int NOISE_LENGTH = 160;
-
- private short[] mNoiseBuffer = new short[NOISE_LENGTH];
- private int mMeasuredVolume = 0;
-
- short[] makeNoise() {
- final int len = NOISE_LENGTH;
- short volume = (short) (mMeasuredVolume / TURN_DOWN_RATE / AMP);
- double volume2 = volume * 2.0;
- int m = 8;
- for (int i = 0; i < len; i+=m) {
- short v = (short) (Math.random() * volume2);
- v -= volume;
- for (int j = 0, k = i; (j < m) && (k < len); j++, k++) {
- mNoiseBuffer[k] = v;
- }
- }
- return mNoiseBuffer;
- }
-
- void measureVolume(short[] audioData, int offset, int count) {
- for (int i = 0, j = offset; i < count; i++, j++) {
- mMeasuredVolume = (mMeasuredVolume * 9
- + Math.abs((int) audioData[j]) * AMP) / 10;
- }
- }
-
- int getNoiseLength() {
- return mNoiseBuffer.length;
- }
- }
-
- // Use another thread to play back to avoid playback blocks network
- // receiving thread
- private class AudioPlayer implements Runnable,
- AudioTrack.OnPlaybackPositionUpdateListener {
- private short[] mBuffer;
- private int mStartMarker;
- private int mEndMarker;
- private AudioTrack mTrack;
- private int mFrameSize;
- private int mOffset;
- private boolean mIsPlaying = false;
- private boolean mNotificationStarted = false;
-
- AudioPlayer(AudioTrack track, int bufferSize, int frameSize) {
- mTrack = track;
- mBuffer = new short[bufferSize];
- mFrameSize = frameSize;
- }
-
- synchronized int write(short[] buffer, int offset, int count) {
- int bufferSize = mBuffer.length;
- while (getBufferedDataSize() + count > bufferSize) {
- try {
- wait();
- } catch (Exception e) {
- //
- }
- }
-
- int end = mEndMarker % bufferSize;
- if (end + count > bufferSize) {
- int partialSize = bufferSize - end;
- System.arraycopy(buffer, offset, mBuffer, end, partialSize);
- System.arraycopy(buffer, offset + partialSize, mBuffer, 0,
- count - partialSize);
- } else {
- System.arraycopy(buffer, 0, mBuffer, end, count);
- }
- mEndMarker += count;
-
- return count;
- }
-
- synchronized void flush() {
- mEndMarker = mStartMarker;
- notify();
- }
-
- int getBufferedDataSize() {
- return mEndMarker - mStartMarker;
- }
-
- synchronized void play() {
- if (!mIsPlaying) {
- mTrack.setPositionNotificationPeriod(mFrameSize);
- mTrack.setPlaybackPositionUpdateListener(this);
- mIsPlaying = true;
- mTrack.play();
- mOffset = mTrack.getPlaybackHeadPosition();
-
- // start initial noise feed, to kick off periodic notification
- new Thread(this).start();
- }
- }
-
- synchronized void stop() {
- mIsPlaying = false;
- mTrack.stop();
- mTrack.flush();
- mTrack.setPlaybackPositionUpdateListener(null);
- }
-
- synchronized void release() {
- mTrack.release();
- }
-
- public synchronized void run() {
- Log.d(TAG, "start initial noise feed");
- int count = 0;
- long waitTime = mNoiseGenerator.getNoiseLength() / 8; // ms
- while (!mNotificationStarted && mIsPlaying) {
- feedNoise();
- count++;
- try {
- this.wait(waitTime);
- } catch (InterruptedException e) {
- Log.e(TAG, "initial noise feed error: " + e);
- break;
- }
- }
- Log.d(TAG, "stop initial noise feed: " + count);
- }
-
- int getPlaybackHeadPosition() {
- return mStartMarker;
- }
-
- int getPlayState() {
- return mTrack.getPlayState();
- }
-
- int getState() {
- return mTrack.getState();
- }
-
- // callback
- public void onMarkerReached(AudioTrack track) {
- }
-
- // callback
- public synchronized void onPeriodicNotification(AudioTrack track) {
- if (!mNotificationStarted) {
- mNotificationStarted = true;
- Log.d(TAG, " ~~~ notification callback started");
- } else if (!mIsPlaying) {
- Log.d(TAG, " ~x~ notification callback quit");
- return;
- }
- try {
- writeToTrack();
- } catch (IllegalStateException e) {
- Log.e(TAG, "writeToTrack()", e);
- }
- }
-
- private void feedNoise() {
- short[] noiseBuffer = mNoiseGenerator.makeNoise();
- mOffset += mTrack.write(noiseBuffer, 0, noiseBuffer.length);
- }
-
- private synchronized void writeToTrack() {
- if (mStartMarker == mEndMarker) {
- int head = mTrack.getPlaybackHeadPosition() - mOffset;
- if ((mStartMarker - head) <= 320) feedNoise();
- return;
- }
-
- int count = mFrameSize;
- if (count < getBufferedDataSize()) count = getBufferedDataSize();
-
- int bufferSize = mBuffer.length;
- int start = mStartMarker % bufferSize;
- if ((start + count) <= bufferSize) {
- mStartMarker += mTrack.write(mBuffer, start, count);
- } else {
- int partialSize = bufferSize - start;
- mStartMarker += mTrack.write(mBuffer, start, partialSize);
- mStartMarker += mTrack.write(mBuffer, 0, count - partialSize);
- }
- notify();
- }
- }
-
- private static class LogRateLimiter {
- private static final long MIN_TIME = 1000;
- private static long mLastTime;
-
- private static boolean allowLogging(long now) {
- if ((now - mLastTime) < MIN_TIME) {
- return false;
- } else {
- mLastTime = now;
- return true;
- }
- }
- }
-}
diff --git a/src/com/android/sip/media/RtpFactory.java b/src/com/android/sip/media/RtpFactory.java
deleted file mode 100644
index 431896e..0000000
--- a/src/com/android/sip/media/RtpFactory.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.media;
-
-import android.util.Log;
-
-import java.net.DatagramSocket;
-
-public class RtpFactory {
- public static RtpSession[] getSystemSupportedAudioSessions() {
- return new RtpSession[] {
- new RtpAudioSession(0), new RtpAudioSession(8)};
- }
-
- // returns null if codecId is not supported by the system
- public static RtpSession createAudioSession(int codecId) {
- return create(codecId);
- }
-
- public static RtpSession createAudioSession(
- int codecId, int remoteSampleRate, DatagramSocket socket) {
- RtpAudioSession s = create(codecId);
- if (s == null) return null;
- s.set(remoteSampleRate, socket);
- return s;
- }
-
- private static RtpAudioSession create(int codecId) {
- for (RtpSession s : getSystemSupportedAudioSessions()) {
- if (s.getCodecId() == codecId) {
- return new RtpAudioSession(codecId);
- }
- }
- return null;
- }
-
- static Encoder createEncoder(int id) {
- switch (id) {
- case 8:
- return new G711ACodec();
- default:
- return new G711UCodec();
- }
- }
-
- static Decoder createDecoder(int id) {
- switch (id) {
- case 8:
- return new G711ACodec();
- default:
- return new G711UCodec();
- }
- }
-}
diff --git a/src/com/android/sip/media/RtpPacket.java b/src/com/android/sip/media/RtpPacket.java
deleted file mode 100644
index 4b4e81a..0000000
--- a/src/com/android/sip/media/RtpPacket.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.media;
-
-import java.util.Random;
-
-/**
- * RtpPacket implements a RTP packet.
- */
-public class RtpPacket {
- private static Random sRandom = new Random();
-
- // |0 0 1 2 |
- // |0.......8.......6.......4.......|
- // |V PXC MT Seqnum (16) |
- // |................................|
- // |Timestamp (32) |
- // | |
- // |................................|
- // | SSRC (32) |
- // | |
- // |................................|
- // | CSRC list (16 items x 32 bits) |
- // | |
- // |................................|
- // V: version, 2 bits
- // P: padding, 1 bit
- // X: extension, 1 bit
- // C: CSRC count, 4 bits
- // M: marker, 1 bit
- // T: payload type: 7 bits
-
- private byte[] packet; // RTP header + payload
- private int packetLength;
-
- public RtpPacket(byte[] buffer) {
- packet = buffer;
- setVersion(2);
- setPayloadType(0x0F);
- setSequenceNumber(sRandom.nextInt());
- setSscr(sRandom.nextLong());
- }
-
- /** Returns the RTP packet in raw bytes. */
- public byte[] getRawPacket() {
- return packet;
- }
-
- public int getPacketLength() {
- return packetLength;
- }
-
- public int getHeaderLength() {
- return (12 + 4 * getCscrCount());
- }
-
- public int getPayloadLength() {
- return (packetLength - getHeaderLength());
- }
-
- public void setPayloadLength(int length) {
- packetLength = getHeaderLength() + length;
- }
-
- public int getVersion() {
- return ((packet[0] >> 6) & 0x03);
- }
-
- public void setVersion(int v) {
- if (v > 3) throw new RuntimeException("illegal version: " + v);
- packet[0] = (byte) ((packet[0] & 0x3F) | ((v & 0x03) << 6));
- }
-
- int getCscrCount() {
- return (packet[0] & 0x0F);
- }
-
- public int getPayloadType() {
- return (packet[1] & 0x7F);
- }
-
- public void setPayloadType(int pt) {
- packet[1] = (byte) ((packet[1] & 0x80) | (pt & 0x7F));
- }
-
- public int getSequenceNumber() {
- return (int) get(2, 2);
- }
-
- public void setSequenceNumber(int sn) {
- set((long) sn, 2, 2);
- }
-
- public long getTimestamp() {
- return get(4, 4);
- }
-
- public void setTimestamp(long timestamp) {
- set(timestamp, 4, 4);
- }
-
- void setSscr(long ssrc) {
- set(ssrc, 8, 4);
- }
-
- private long get(int begin, int length) {
- long n = 0;
- for (int i = begin, end = i + length; i < end; i++) {
- n = (n << 8) | ((long) packet[i] & 0xFF);
- }
- return n;
- }
-
- private void set(long n, int begin, int length) {
- for (int i = begin + length - 1; i >= begin; i--) {
- packet[i] = (byte) (n & 0x0FFL);
- n >>= 8;
- }
- }
-}
diff --git a/src/com/android/sip/media/RtpSession.java b/src/com/android/sip/media/RtpSession.java
deleted file mode 100644
index 067f46a..0000000
--- a/src/com/android/sip/media/RtpSession.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 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.
- */
-
-package com.android.sip.media;
-
-import java.io.IOException;
-import java.net.DatagramSocket;
-
-public interface RtpSession {
- int getCodecId();
- String getName();
- int getSampleRate();
- void startSending();
- void startReceiving();
- void stop();
- void toggleMute();
- boolean isMuted();
- void sendDtmf();
-}