From 2ca4318cc1ee57dda907ba2069bd61d162b1baef Mon Sep 17 00:00:00 2001 From: Eric Erfanian Date: Thu, 31 Aug 2017 06:57:16 -0700 Subject: Update Dialer source to latest internal Google revision. Previously, Android's Dialer app was developed in an internal Google source control system and only exported to public during AOSP drops. The Dialer team is now switching to a public development model similar to the telephony team. This CL represents all internal Google changes that were committed to Dialer between the public O release and today's tip of tree on internal master. This CL squashes those changes into a single commit. In subsequent changes, changes will be exported on a per-commit basis. Test: make, flash install, run Merged-In: I45270eaa8ce732d71a1bd84b08c7fa0e99af3160 Change-Id: I529aaeb88535b9533c0ae4ef4e6c1222d4e0f1c8 PiperOrigin-RevId: 167068436 --- Android.mk | 392 +-- AndroidManifest.xml | 10 +- .../quantum_ic_bluetooth_audio_white_24.png | Bin 0 -> 438 bytes .../quantum_ic_check_circle_googblue_24.png | Bin 407 -> 0 bytes .../drawable-hdpi/quantum_ic_close_white_24.png | Bin 221 -> 176 bytes .../drawable-hdpi/quantum_ic_forward_white_24.png | Bin 139 -> 0 bytes .../drawable-hdpi/quantum_ic_grade_white_24.png | Bin 370 -> 352 bytes .../drawable-hdpi/quantum_ic_headset_white_24.png | Bin 0 -> 350 bytes .../drawable-hdpi/quantum_ic_image_white_24.png | Bin 261 -> 246 bytes .../drawable-hdpi/quantum_ic_mic_off_white_24.png | Bin 0 -> 428 bytes .../quantum_ic_network_wifi_white_24.png | Bin 427 -> 0 bytes .../quantum_ic_phone_in_talk_white_24.png | Bin 0 -> 483 bytes .../quantum_ic_phone_in_talk_white_36.png | Bin 0 -> 704 bytes .../drawable-hdpi/quantum_ic_report_grey600_24.png | Bin 0 -> 197 bytes .../drawable-hdpi/quantum_ic_report_white_18.png | Bin 212 -> 0 bytes .../quantum_ic_bluetooth_audio_white_24.png | Bin 0 -> 297 bytes .../quantum_ic_check_circle_googblue_24.png | Bin 278 -> 0 bytes .../drawable-mdpi/quantum_ic_close_white_24.png | Bin 175 -> 139 bytes .../drawable-mdpi/quantum_ic_forward_white_24.png | Bin 117 -> 0 bytes .../drawable-mdpi/quantum_ic_grade_white_24.png | Bin 271 -> 259 bytes .../drawable-mdpi/quantum_ic_headset_white_24.png | Bin 0 -> 238 bytes .../drawable-mdpi/quantum_ic_image_white_24.png | Bin 185 -> 174 bytes .../drawable-mdpi/quantum_ic_mic_off_white_24.png | Bin 0 -> 288 bytes .../quantum_ic_network_wifi_white_24.png | Bin 299 -> 0 bytes .../quantum_ic_phone_in_talk_white_24.png | Bin 0 -> 325 bytes .../quantum_ic_phone_in_talk_white_36.png | Bin 0 -> 483 bytes .../drawable-mdpi/quantum_ic_report_grey600_24.png | Bin 0 -> 150 bytes .../drawable-mdpi/quantum_ic_report_white_18.png | Bin 163 -> 0 bytes .../quantum_ic_bluetooth_audio_white_24.png | Bin 0 -> 515 bytes .../quantum_ic_check_circle_googblue_24.png | Bin 490 -> 0 bytes .../drawable-xhdpi/quantum_ic_close_white_24.png | Bin 257 -> 204 bytes .../drawable-xhdpi/quantum_ic_forward_white_24.png | Bin 159 -> 0 bytes .../drawable-xhdpi/quantum_ic_grade_white_24.png | Bin 479 -> 455 bytes .../drawable-xhdpi/quantum_ic_headset_white_24.png | Bin 0 -> 433 bytes .../drawable-xhdpi/quantum_ic_image_white_24.png | Bin 304 -> 292 bytes .../drawable-xhdpi/quantum_ic_mic_off_white_24.png | Bin 0 -> 484 bytes .../quantum_ic_network_wifi_white_24.png | Bin 538 -> 0 bytes .../quantum_ic_phone_in_talk_white_24.png | Bin 0 -> 601 bytes .../quantum_ic_phone_in_talk_white_36.png | Bin 0 -> 882 bytes .../quantum_ic_report_grey600_24.png | Bin 0 -> 211 bytes .../drawable-xhdpi/quantum_ic_report_white_18.png | Bin 240 -> 0 bytes .../quantum_ic_bluetooth_audio_white_24.png | Bin 0 -> 778 bytes .../quantum_ic_check_circle_googblue_24.png | Bin 717 -> 0 bytes .../drawable-xxhdpi/quantum_ic_close_white_24.png | Bin 347 -> 260 bytes .../quantum_ic_forward_white_24.png | Bin 204 -> 0 bytes .../drawable-xxhdpi/quantum_ic_grade_white_24.png | Bin 676 -> 657 bytes .../quantum_ic_headset_white_24.png | Bin 0 -> 610 bytes .../drawable-xxhdpi/quantum_ic_image_white_24.png | Bin 450 -> 409 bytes .../quantum_ic_mic_off_white_24.png | Bin 0 -> 713 bytes .../quantum_ic_network_wifi_white_24.png | Bin 786 -> 0 bytes .../quantum_ic_phone_in_talk_white_24.png | Bin 0 -> 882 bytes .../quantum_ic_phone_in_talk_white_36.png | Bin 0 -> 1342 bytes .../quantum_ic_report_grey600_24.png | Bin 0 -> 276 bytes .../drawable-xxhdpi/quantum_ic_report_white_18.png | Bin 312 -> 0 bytes .../quantum_ic_bluetooth_audio_white_24.png | Bin 0 -> 945 bytes .../quantum_ic_check_circle_googblue_24.png | Bin 1017 -> 0 bytes .../drawable-xxxhdpi/quantum_ic_close_white_24.png | Bin 436 -> 314 bytes .../quantum_ic_forward_white_24.png | Bin 236 -> 0 bytes .../drawable-xxxhdpi/quantum_ic_grade_white_24.png | Bin 887 -> 861 bytes .../quantum_ic_headset_white_24.png | Bin 0 -> 838 bytes .../drawable-xxxhdpi/quantum_ic_image_white_24.png | Bin 570 -> 519 bytes .../quantum_ic_mic_off_white_24.png | Bin 0 -> 902 bytes .../quantum_ic_network_wifi_white_24.png | Bin 1043 -> 0 bytes .../quantum_ic_phone_in_talk_white_24.png | Bin 0 -> 1162 bytes .../quantum_ic_phone_in_talk_white_36.png | Bin 0 -> 1729 bytes .../quantum_ic_report_grey600_24.png | Bin 0 -> 366 bytes .../quantum_ic_report_white_18.png | Bin 340 -> 0 bytes .../drawable/quantum_ic_arrow_back_vd_theme_24.xml | 10 + .../res/drawable/quantum_ic_block_vd_theme_24.xml | 10 + .../drawable/quantum_ic_call_end_vd_theme_24.xml | 10 + .../res/drawable/quantum_ic_call_vd_theme_24.xml | 10 + .../res/drawable/quantum_ic_close_vd_theme_24.xml | 10 + .../drawable/quantum_ic_enterprise_vd_theme_24.xml | 4 +- .../res/drawable/quantum_ic_hd_vd_theme_24.xml | 2 +- .../drawable/quantum_ic_history_vd_theme_24.xml | 10 + .../drawable/quantum_ic_language_vd_theme_24.xml | 10 + .../drawable/quantum_ic_message_vd_theme_24.xml | 10 + .../drawable/quantum_ic_more_vert_vd_theme_24.xml | 10 + .../drawable/quantum_ic_person_add_vd_theme_24.xml | 10 + .../res/drawable/quantum_ic_search_vd_theme_24.xml | 10 + .../drawable/quantum_ic_videocam_vd_theme_24.xml | 10 + java/com/android/contacts/common/Bindings.java | 52 - .../android/contacts/common/ClipboardUtils.java | 2 - .../contacts/common/ContactPhotoManager.java | 511 ---- .../contacts/common/ContactPhotoManagerImpl.java | 1262 ---------- .../contacts/common/ContactPresenceIconUtil.java | 3 +- .../android/contacts/common/ContactStatusUtil.java | 2 - .../com/android/contacts/common/ContactsUtils.java | 185 +- java/com/android/contacts/common/GeoUtil.java | 55 - .../android/contacts/common/MoreContactUtils.java | 36 - .../common/bindings/ContactsCommonBindings.java | 25 - .../bindings/ContactsCommonBindingsFactory.java | 24 - .../bindings/ContactsCommonBindingsStub.java | 27 - .../contacts/common/compat/ContactsCompat.java | 16 - .../contacts/common/compat/PhoneAccountCompat.java | 55 +- .../common/compat/PhoneNumberUtilsCompat.java | 132 +- .../common/compat/TelephonyManagerCompat.java | 239 -- .../compat/telecom/TelecomManagerCompat.java | 287 +-- .../database/NoNullCursorAsyncQueryHandler.java | 31 + .../contacts/common/dialog/CallSubjectDialog.java | 14 +- .../common/extensions/PhoneDirectoryExtender.java | 10 + .../extensions/PhoneDirectoryExtenderAccessor.java | 6 + .../extensions/PhoneDirectoryExtenderStub.java | 13 + .../contacts/common/format/FormatUtils.java | 181 -- .../contacts/common/format/TextHighlighter.java | 55 +- .../common/format/testing/SpannedTestUtils.java | 85 - .../common/lettertiles/LetterTileDrawable.java | 409 ---- .../common/list/ContactEntryListAdapter.java | 62 +- .../common/list/ContactEntryListFragment.java | 22 +- .../contacts/common/list/ContactListAdapter.java | 2 +- .../common/list/ContactListFilterController.java | 8 +- .../contacts/common/list/ContactListItemView.java | 218 +- .../contacts/common/list/ContactTileView.java | 24 +- .../common/list/PhoneNumberListAdapter.java | 83 +- .../common/list/PhoneNumberPickerFragment.java | 73 +- .../contacts/common/list/ViewPagerTabs.java | 29 +- .../contacts/common/location/CountryDetector.java | 221 -- .../common/location/UpdateCountryService.java | 104 - .../contacts/common/model/ContactLoader.java | 4 +- .../contacts/common/model/account/AccountType.java | 3 +- .../common/model/account/BaseAccountType.java | 4 +- .../common/preference/ContactsPreferences.java | 28 +- .../contacts/common/res/color/popup_menu_color.xml | 20 - .../common/res/drawable-hdpi/ic_ab_search.png | Bin 1115 -> 0 bytes .../res/drawable-hdpi/ic_arrow_back_24dp.png | Bin 612 -> 0 bytes .../res/drawable-hdpi/ic_business_white_120dp.png | Bin 2477 -> 0 bytes .../common/res/drawable-hdpi/ic_call_24dp.png | Bin 340 -> 0 bytes .../common/res/drawable-hdpi/ic_close_dk.png | Bin 609 -> 0 bytes .../common/res/drawable-hdpi/ic_create_24dp.png | Bin 370 -> 0 bytes .../res/drawable-hdpi/ic_group_white_24dp.png | Bin 389 -> 0 bytes .../ic_history_white_drawable_24dp.png | Bin 525 -> 0 bytes .../res/drawable-hdpi/ic_info_outline_24dp.png | Bin 485 -> 0 bytes .../common/res/drawable-hdpi/ic_menu_back.png | Bin 799 -> 0 bytes .../common/res/drawable-hdpi/ic_menu_group_dk.png | Bin 1954 -> 0 bytes .../common/res/drawable-hdpi/ic_menu_group_lt.png | Bin 1922 -> 0 bytes .../res/drawable-hdpi/ic_menu_overflow_lt.png | Bin 220 -> 0 bytes .../common/res/drawable-hdpi/ic_menu_person_dk.png | Bin 1439 -> 0 bytes .../common/res/drawable-hdpi/ic_menu_person_lt.png | Bin 1416 -> 0 bytes .../ic_menu_remove_field_holo_light.png | Bin 515 -> 0 bytes .../common/res/drawable-hdpi/ic_menu_star_dk.png | Bin 1438 -> 0 bytes .../res/drawable-hdpi/ic_menu_star_holo_light.png | Bin 1211 -> 0 bytes .../common/res/drawable-hdpi/ic_menu_star_lt.png | Bin 1414 -> 0 bytes .../common/res/drawable-hdpi/ic_person_24dp.png | Bin 273 -> 0 bytes .../common/res/drawable-hdpi/ic_rx_videocam.png | Bin 413 -> 0 bytes .../common/res/drawable-hdpi/ic_tx_videocam.png | Bin 370 -> 0 bytes .../common/res/drawable-hdpi/ic_videocam.png | Bin 269 -> 0 bytes .../res/drawable-hdpi/ic_voicemail_avatar.png | Bin 2856 -> 0 bytes .../res/drawable-hdpi/list_activated_holo.9.png | Bin 154 -> 0 bytes .../res/drawable-hdpi/list_background_holo.9.png | Bin 224 -> 0 bytes .../res/drawable-hdpi/list_focused_holo.9.png | Bin 235 -> 0 bytes .../list_longpressed_holo_light.9.png | Bin 158 -> 0 bytes .../drawable-hdpi/list_pressed_holo_light.9.png | Bin 159 -> 0 bytes .../list_section_divider_holo_custom.9.png | Bin 205 -> 0 bytes .../common/res/drawable-hdpi/list_title_holo.9.png | Bin 267 -> 0 bytes .../drawable-ldrtl-hdpi/list_focused_holo.9.png | Bin 234 -> 0 bytes .../list_section_divider_holo_custom.9.png | Bin 191 -> 0 bytes .../res/drawable-ldrtl-hdpi/list_title_holo.9.png | Bin 258 -> 0 bytes .../drawable-ldrtl-mdpi/list_focused_holo.9.png | Bin 234 -> 0 bytes .../list_section_divider_holo_custom.9.png | Bin 180 -> 0 bytes .../res/drawable-ldrtl-mdpi/list_title_holo.9.png | Bin 186 -> 0 bytes .../list_activated_holo.9.png | Bin 1666 -> 0 bytes .../list_activated_holo.9.png | Bin 1034 -> 0 bytes .../list_activated_holo.9.png | Bin 2486 -> 0 bytes .../drawable-ldrtl-xhdpi/list_focused_holo.9.png | Bin 234 -> 0 bytes .../list_section_divider_holo_custom.9.png | Bin 196 -> 0 bytes .../res/drawable-ldrtl-xhdpi/list_title_holo.9.png | Bin 255 -> 0 bytes .../res/drawable-mdpi/list_activated_holo.9.png | Bin 151 -> 0 bytes .../res/drawable-mdpi/list_focused_holo.9.png | Bin 235 -> 0 bytes .../list_longpressed_holo_light.9.png | Bin 155 -> 0 bytes .../drawable-mdpi/list_pressed_holo_light.9.png | Bin 158 -> 0 bytes .../list_section_divider_holo_custom.9.png | Bin 198 -> 0 bytes .../list_activated_holo.9.png | Bin 1659 -> 0 bytes .../list_activated_holo.9.png | Bin 1005 -> 0 bytes .../list_activated_holo.9.png | Bin 2478 -> 0 bytes .../res/drawable-xhdpi/list_activated_holo.9.png | Bin 158 -> 0 bytes .../res/drawable-xhdpi/list_focused_holo.9.png | Bin 235 -> 0 bytes .../list_longpressed_holo_light.9.png | Bin 162 -> 0 bytes .../drawable-xhdpi/list_pressed_holo_light.9.png | Bin 163 -> 0 bytes .../list_section_divider_holo_custom.9.png | Bin 210 -> 0 bytes .../res/drawable-xxhdpi/list_activated_holo.9.png | Bin 1140 -> 0 bytes .../res/drawable-xxhdpi/list_focused_holo.9.png | Bin 1147 -> 0 bytes .../list_longpressed_holo_light.9.png | Bin 1051 -> 0 bytes .../drawable-xxhdpi/list_pressed_holo_light.9.png | Bin 1051 -> 0 bytes .../contacts/common/res/drawable/ic_back_arrow.xml | 20 - .../common/res/drawable/ic_call_and_share.xml | 22 - .../contacts/common/res/drawable/ic_more_vert.xml | 9 - .../res/drawable/ic_person_add_tinted_24dp.xml | 20 - .../common/res/drawable/ic_search_add_contact.xml | 20 - .../common/res/drawable/ic_search_video_call.xml | 22 - .../common/res/drawable/ic_work_profile.xml | 34 +- ...t_selector_background_transition_holo_light.xml | 20 - .../res/layout/account_selector_list_item.xml | 57 - .../account_selector_list_item_condensed.xml | 56 - .../common/res/layout/call_subject_history.xml | 33 - .../common/res/layout/dialog_call_subject.xml | 2 +- .../contacts/common/res/layout/list_separator.xml | 27 - .../common/res/layout/search_bar_expanded.xml | 4 +- .../contacts/common/res/values-af/strings.xml | 110 +- .../contacts/common/res/values-am/strings.xml | 110 +- .../contacts/common/res/values-ar/strings.xml | 114 +- .../contacts/common/res/values-az/strings.xml | 110 +- .../common/res/values-b+sr+Latn/strings.xml | 111 +- .../contacts/common/res/values-be/strings.xml | 112 +- .../contacts/common/res/values-bg/strings.xml | 110 +- .../contacts/common/res/values-bn/strings.xml | 110 +- .../contacts/common/res/values-bs/strings.xml | 129 +- .../contacts/common/res/values-ca/strings.xml | 110 +- .../contacts/common/res/values-cs/strings.xml | 112 +- .../contacts/common/res/values-da/strings.xml | 110 +- .../contacts/common/res/values-de/strings.xml | 112 +- .../contacts/common/res/values-el/strings.xml | 110 +- .../contacts/common/res/values-en-rAU/strings.xml | 110 +- .../contacts/common/res/values-en-rGB/strings.xml | 110 +- .../contacts/common/res/values-en-rIN/strings.xml | 110 +- .../contacts/common/res/values-es-rUS/strings.xml | 110 +- .../contacts/common/res/values-es/strings.xml | 110 +- .../contacts/common/res/values-et/strings.xml | 110 +- .../contacts/common/res/values-eu/strings.xml | 110 +- .../contacts/common/res/values-fa/strings.xml | 110 +- .../contacts/common/res/values-fi/strings.xml | 110 +- .../contacts/common/res/values-fr-rCA/strings.xml | 110 +- .../contacts/common/res/values-fr/strings.xml | 110 +- .../contacts/common/res/values-gl/strings.xml | 114 +- .../contacts/common/res/values-gu/strings.xml | 110 +- .../contacts/common/res/values-hi/strings.xml | 112 +- .../contacts/common/res/values-hr/strings.xml | 111 +- .../contacts/common/res/values-hu/strings.xml | 110 +- .../contacts/common/res/values-hy/strings.xml | 110 +- .../contacts/common/res/values-in/strings.xml | 110 +- .../contacts/common/res/values-is/strings.xml | 110 +- .../contacts/common/res/values-it/strings.xml | 110 +- .../contacts/common/res/values-iw/strings.xml | 112 +- .../common/res/values-ja/donottranslate_config.xml | 19 +- .../contacts/common/res/values-ja/strings.xml | 110 +- .../contacts/common/res/values-ka/strings.xml | 110 +- .../contacts/common/res/values-kk/strings.xml | 110 +- .../contacts/common/res/values-km/strings.xml | 110 +- .../contacts/common/res/values-kn/strings.xml | 110 +- .../contacts/common/res/values-ko/strings.xml | 110 +- .../contacts/common/res/values-ky/strings.xml | 110 +- .../contacts/common/res/values-lo/strings.xml | 110 +- .../contacts/common/res/values-lt/strings.xml | 112 +- .../contacts/common/res/values-lv/strings.xml | 111 +- .../contacts/common/res/values-mk/strings.xml | 110 +- .../contacts/common/res/values-ml/strings.xml | 110 +- .../contacts/common/res/values-mn/strings.xml | 110 +- .../contacts/common/res/values-mr/strings.xml | 118 +- .../contacts/common/res/values-ms/strings.xml | 110 +- .../contacts/common/res/values-my/strings.xml | 110 +- .../contacts/common/res/values-nb/strings.xml | 110 +- .../contacts/common/res/values-ne/strings.xml | 110 +- .../contacts/common/res/values-nl/strings.xml | 110 +- .../contacts/common/res/values-no/strings.xml | 110 +- .../contacts/common/res/values-pa/strings.xml | 110 +- .../contacts/common/res/values-pl/strings.xml | 112 +- .../contacts/common/res/values-pt-rBR/strings.xml | 110 +- .../contacts/common/res/values-pt-rPT/strings.xml | 112 +- .../contacts/common/res/values-pt/strings.xml | 110 +- .../contacts/common/res/values-ro/strings.xml | 111 +- .../contacts/common/res/values-ru/strings.xml | 112 +- .../contacts/common/res/values-si/strings.xml | 110 +- .../contacts/common/res/values-sk/strings.xml | 112 +- .../contacts/common/res/values-sl/strings.xml | 112 +- .../contacts/common/res/values-sq/strings.xml | 110 +- .../contacts/common/res/values-sr/strings.xml | 111 +- .../contacts/common/res/values-sv/strings.xml | 110 +- .../contacts/common/res/values-sw/strings.xml | 110 +- .../contacts/common/res/values-sw600dp/dimens.xml | 3 - .../contacts/common/res/values-ta/strings.xml | 110 +- .../contacts/common/res/values-te/strings.xml | 110 +- .../contacts/common/res/values-th/strings.xml | 110 +- .../contacts/common/res/values-tl/strings.xml | 110 +- .../contacts/common/res/values-tr/strings.xml | 110 +- .../contacts/common/res/values-uk/strings.xml | 112 +- .../contacts/common/res/values-ur/strings.xml | 110 +- .../contacts/common/res/values-uz/strings.xml | 112 +- .../contacts/common/res/values-vi/strings.xml | 110 +- .../contacts/common/res/values-zh-rCN/strings.xml | 110 +- .../contacts/common/res/values-zh-rHK/strings.xml | 112 +- .../contacts/common/res/values-zh-rTW/strings.xml | 110 +- .../contacts/common/res/values-zu/strings.xml | 110 +- .../android/contacts/common/res/values/colors.xml | 61 - .../android/contacts/common/res/values/dimens.xml | 63 +- .../common/res/values/donottranslate_config.xml | 54 - .../com/android/contacts/common/res/values/ids.xml | 1 + .../contacts/common/res/values/integers.xml | 4 - .../android/contacts/common/res/values/strings.xml | 391 +-- .../android/contacts/common/res/values/styles.xml | 1 - .../contacts/common/util/AccountFilterUtil.java | 42 - .../android/contacts/common/util/BitmapUtil.java | 167 -- .../contacts/common/util/ContactDisplayUtils.java | 12 +- .../android/contacts/common/util/DateUtils.java | 241 -- .../common/util/MaterialColorMapUtils.java | 8 - .../contacts/common/util/NameConverter.java | 242 -- .../android/contacts/common/util/StopWatch.java | 28 +- .../common/util/TelephonyManagerUtils.java | 9 - .../contacts/common/util/TrafficStatsTags.java | 22 - .../com/android/contacts/common/util/UriUtils.java | 90 - java/com/android/dialer/about/AndroidManifest.xml | 2 +- java/com/android/dialer/about/Licenses.java | 2 +- .../dialer/about/res/layout/dummy_placeholder.xml | 21 - java/com/android/dialer/about/res/raw/keep.xml | 1 - .../about/res/raw/third_party_license_metadata | 70 +- .../dialer/about/res/raw/third_party_licenses | 2487 ++++++++++++++------ java/com/android/dialer/app/AndroidManifest.xml | 1 + java/com/android/dialer/app/Bindings.java | 28 - java/com/android/dialer/app/DialtactsActivity.java | 246 +- .../android/dialer/app/SpecialCharSequenceMgr.java | 495 ---- .../dialer/app/bindings/DialerBindings.java | 25 - .../dialer/app/bindings/DialerBindingsFactory.java | 26 - .../dialer/app/bindings/DialerBindingsStub.java | 48 - .../dialer/app/calllog/CallLogActivity.java | 55 +- .../android/dialer/app/calllog/CallLogAdapter.java | 447 +++- .../dialer/app/calllog/CallLogAsyncTaskUtil.java | 10 +- .../dialer/app/calllog/CallLogFragment.java | 155 +- .../app/calllog/CallLogListItemViewHolder.java | 303 ++- .../calllog/CallLogNotificationsQueryHelper.java | 92 +- .../app/calllog/CallLogNotificationsService.java | 164 +- .../dialer/app/calllog/CallLogReceiver.java | 4 +- .../dialer/app/calllog/ClearCallLogDialog.java | 128 +- .../app/calllog/DefaultVoicemailNotifier.java | 446 ---- .../app/calllog/DialerQuickContactBadge.java | 63 + .../android/dialer/app/calllog/IntentProvider.java | 7 +- .../app/calllog/LegacyVoicemailNotifier.java | 156 ++ .../dialer/app/calllog/MissedCallNotifier.java | 115 +- .../dialer/app/calllog/PhoneAccountHandles.java | 62 - .../dialer/app/calllog/PhoneCallDetailsHelper.java | 34 +- .../dialer/app/calllog/PhoneCallDetailsViews.java | 10 + .../calllog/VisualVoicemailCallLogFragment.java | 59 +- .../app/calllog/VisualVoicemailNotifier.java | 271 +++ .../app/calllog/VisualVoicemailUpdateTask.java | 168 ++ .../dialer/app/calllog/VoicemailQueryHandler.java | 44 +- .../app/calllog/calllogcache/CallLogCache.java | 75 +- .../calllog/calllogcache/CallLogCacheLollipop.java | 74 - .../calllogcache/CallLogCacheLollipopMr1.java | 116 - .../dialer/app/contactinfo/ContactInfoCache.java | 12 +- .../dialer/app/contactinfo/ContactPhotoLoader.java | 2 +- .../dialer/app/dialpad/DialpadFragment.java | 1687 ------------- .../app/dialpad/PseudoEmergencyAnimator.java | 161 -- .../dialer/app/dialpad/SmartDialCursorLoader.java | 183 -- .../app/dialpad/UnicodeDialerKeyListener.java | 56 - .../app/filterednumber/BlockedNumbersAdapter.java | 2 +- .../app/filterednumber/BlockedNumbersFragment.java | 2 +- .../dialer/app/filterednumber/NumbersAdapter.java | 11 +- .../filterednumber/ViewNumbersToImportAdapter.java | 2 +- .../app/legacybindings/DialerLegacyBindings.java | 2 + .../legacybindings/DialerLegacyBindingsStub.java | 4 + .../dialer/app/list/AllContactsFragment.java | 20 +- .../app/list/DialerPhoneNumberListAdapter.java | 34 +- .../android/dialer/app/list/DialerViewPager.java | 55 + .../dialer/app/list/DialtactsPagerAdapter.java | 31 +- .../com/android/dialer/app/list/ListsFragment.java | 44 +- .../dialer/app/list/OldSpeedDialFragment.java | 31 +- .../dialer/app/list/PhoneFavoriteListView.java | 19 +- .../app/list/PhoneFavoriteSquareTileView.java | 4 + .../dialer/app/list/PhoneFavoriteTileView.java | 72 +- .../dialer/app/list/PhoneFavoritesTileAdapter.java | 82 +- .../dialer/app/list/RegularSearchFragment.java | 63 +- java/com/android/dialer/app/list/RemoveView.java | 2 +- .../android/dialer/app/list/SearchFragment.java | 29 +- .../app/list/SmartDialNumberListAdapter.java | 10 +- .../dialer/app/list/SmartDialSearchFragment.java | 22 +- .../app/manifests/activities/AndroidManifest.xml | 4 +- .../app/res/drawable-hdpi/empty_contacts.png | Bin 2461 -> 0 bytes .../res/drawable-hdpi/ic_archive_white_24dp.png | Bin 247 -> 0 bytes .../app/res/drawable-hdpi/ic_check_mark_48dp.png | Bin 0 -> 749 bytes .../res/drawable-hdpi/ic_check_mark_blue_24dp.png | Bin 0 -> 408 bytes .../app/res/drawable-hdpi/ic_content_copy_24dp.png | Bin 203 -> 0 bytes .../app/res/drawable-hdpi/ic_delete_24dp.png | Bin 242 -> 0 bytes .../res/drawable-hdpi/ic_dialer_fork_add_call.png | Bin 1649 -> 0 bytes .../drawable-hdpi/ic_dialer_fork_current_call.png | Bin 2305 -> 0 bytes .../res/drawable-hdpi/ic_dialer_fork_tt_keypad.png | Bin 2419 -> 0 bytes .../ic_empty_check_mark_white_24dp.png | Bin 0 -> 375 bytes .../dialer/app/res/drawable-hdpi/ic_grade_24dp.png | Bin 370 -> 0 bytes .../app/res/drawable-hdpi/ic_more_vert_24dp.png | Bin 134 -> 0 bytes .../dialer/app/res/drawable-hdpi/ic_pause_24dp.png | Bin 105 -> 0 bytes .../app/res/drawable-hdpi/ic_people_24dp.png | Bin 299 -> 0 bytes .../app/res/drawable-hdpi/ic_play_arrow_24dp.png | Bin 195 -> 0 bytes .../app/res/drawable-hdpi/ic_results_phone.png | Bin 1084 -> 0 bytes .../app/res/drawable-hdpi/ic_schedule_24dp.png | Bin 575 -> 0 bytes .../app/res/drawable-hdpi/ic_share_white_24dp.png | Bin 397 -> 0 bytes .../app/res/drawable-hdpi/ic_vm_sound_off_dis.png | Bin 1339 -> 0 bytes .../app/res/drawable-hdpi/ic_vm_sound_off_dk.png | Bin 1337 -> 0 bytes .../app/res/drawable-hdpi/ic_vm_sound_on_dis.png | Bin 1755 -> 0 bytes .../app/res/drawable-hdpi/ic_vm_sound_on_dk.png | Bin 1750 -> 0 bytes .../app/res/drawable-hdpi/ic_voicemail_24dp.png | Bin 478 -> 0 bytes .../app/res/drawable-hdpi/ic_volume_down_24dp.png | Bin 186 -> 0 bytes .../app/res/drawable-hdpi/ic_volume_up_24dp.png | Bin 365 -> 0 bytes .../app/res/drawable-mdpi/empty_contacts.png | Bin 1778 -> 0 bytes .../app/res/drawable-mdpi/ic_check_mark_48dp.png | Bin 0 -> 526 bytes .../res/drawable-mdpi/ic_dialer_fork_add_call.png | Bin 1309 -> 0 bytes .../drawable-mdpi/ic_dialer_fork_current_call.png | Bin 1581 -> 0 bytes .../res/drawable-mdpi/ic_dialer_fork_tt_keypad.png | Bin 1586 -> 0 bytes .../app/res/drawable-mdpi/ic_results_phone.png | Bin 801 -> 0 bytes .../app/res/drawable-mdpi/ic_vm_sound_off_dis.png | Bin 948 -> 0 bytes .../app/res/drawable-mdpi/ic_vm_sound_off_dk.png | Bin 945 -> 0 bytes .../app/res/drawable-mdpi/ic_vm_sound_on_dis.png | Bin 1166 -> 0 bytes .../app/res/drawable-mdpi/ic_vm_sound_on_dk.png | Bin 1192 -> 0 bytes .../app/res/drawable-xhdpi/empty_contacts.png | Bin 3352 -> 0 bytes .../app/res/drawable-xhdpi/ic_check_mark_48dp.png | Bin 0 -> 981 bytes .../res/drawable-xhdpi/ic_dialer_fork_add_call.png | Bin 2150 -> 0 bytes .../drawable-xhdpi/ic_dialer_fork_current_call.png | Bin 3154 -> 0 bytes .../drawable-xhdpi/ic_dialer_fork_tt_keypad.png | Bin 3298 -> 0 bytes .../app/res/drawable-xhdpi/ic_results_phone.png | Bin 1376 -> 0 bytes .../app/res/drawable-xhdpi/ic_vm_sound_off_dis.png | Bin 1794 -> 0 bytes .../app/res/drawable-xhdpi/ic_vm_sound_off_dk.png | Bin 1794 -> 0 bytes .../app/res/drawable-xhdpi/ic_vm_sound_on_dis.png | Bin 2354 -> 0 bytes .../app/res/drawable-xhdpi/ic_vm_sound_on_dk.png | Bin 2339 -> 0 bytes .../app/res/drawable-xxhdpi/empty_contacts.png | Bin 3686 -> 0 bytes .../app/res/drawable-xxhdpi/ic_check_mark_48dp.png | Bin 0 -> 1443 bytes .../drawable-xxhdpi/ic_dialer_fork_add_call.png | Bin 2583 -> 0 bytes .../ic_dialer_fork_current_call.png | Bin 3622 -> 0 bytes .../drawable-xxhdpi/ic_dialer_fork_tt_keypad.png | Bin 3229 -> 0 bytes .../app/res/drawable-xxhdpi/ic_results_phone.png | Bin 2090 -> 0 bytes .../res/drawable-xxhdpi/ic_vm_sound_off_dis.png | Bin 2316 -> 0 bytes .../app/res/drawable-xxhdpi/ic_vm_sound_off_dk.png | Bin 2319 -> 0 bytes .../app/res/drawable-xxhdpi/ic_vm_sound_on_dis.png | Bin 2878 -> 0 bytes .../app/res/drawable-xxhdpi/ic_vm_sound_on_dk.png | Bin 2879 -> 0 bytes .../app/res/drawable-xxxhdpi/empty_contacts.png | Bin 5204 -> 0 bytes .../res/drawable-xxxhdpi/ic_check_mark_48dp.png | Bin 0 -> 1893 bytes .../app/res/drawable-xxxhdpi/ic_results_phone.png | Bin 2281 -> 0 bytes .../app/res/drawable/background_dial_holo_dark.xml | 22 - .../dialer/app/res/drawable/ic_search_phone.xml | 20 - .../app/res/drawable/ic_speakerphone_off.xml | 20 - .../dialer/app/res/drawable/ic_speakerphone_on.xml | 20 - .../dialer/app/res/drawable/shadow_fade_left.xml | 24 - .../dialer/app/res/drawable/shadow_fade_up.xml | 24 - .../app/res/layout-land/dialpad_fragment.xml | 82 - .../empty_content_view_dialpad_search.xml | 6 +- .../account_filter_header_for_phone_favorite.xml | 47 - .../app/res/layout/action_mode_close_button.xml | 31 + .../app/res/layout/all_contacts_activity.xml | 26 - .../app/res/layout/all_contacts_fragment.xml | 2 +- .../dialer/app/res/layout/call_log_activity.xml | 39 +- .../dialer/app/res/layout/call_log_fragment.xml | 35 +- .../dialer/app/res/layout/call_log_list_item.xml | 35 +- .../app/res/layout/call_log_list_item_actions.xml | 7 +- .../app/res/layout/dialpad_chooser_list_item.xml | 38 - .../dialer/app/res/layout/dialpad_fragment.xml | 71 - .../dialer/app/res/layout/empty_content_view.xml | 54 - .../layout/empty_content_view_dialpad_search.xml | 6 +- .../dialer/app/res/layout/keyguard_preview.xml | 6 +- .../dialer/app/res/layout/lists_fragment.xml | 104 +- .../dialer/app/res/layout/search_edittext.xml | 2 +- .../dialer/app/res/layout/speed_dial_fragment.xml | 2 +- .../dialer/app/res/menu/dialpad_options.xml | 30 - .../dialer/app/res/menu/dialtacts_options.xml | 3 + .../android/dialer/app/res/values-af/strings.xml | 96 +- .../android/dialer/app/res/values-am/strings.xml | 96 +- .../android/dialer/app/res/values-ar/strings.xml | 104 +- .../android/dialer/app/res/values-az/strings.xml | 96 +- .../dialer/app/res/values-b+sr+Latn/strings.xml | 98 +- .../android/dialer/app/res/values-be/strings.xml | 100 +- .../android/dialer/app/res/values-bg/strings.xml | 96 +- .../android/dialer/app/res/values-bn/strings.xml | 96 +- .../android/dialer/app/res/values-bs/strings.xml | 106 +- .../android/dialer/app/res/values-ca/strings.xml | 100 +- .../android/dialer/app/res/values-cs/strings.xml | 100 +- .../android/dialer/app/res/values-da/strings.xml | 96 +- .../android/dialer/app/res/values-de/strings.xml | 96 +- .../android/dialer/app/res/values-el/strings.xml | 98 +- .../dialer/app/res/values-en-rAU/strings.xml | 96 +- .../dialer/app/res/values-en-rGB/strings.xml | 96 +- .../dialer/app/res/values-en-rIN/strings.xml | 96 +- .../dialer/app/res/values-es-rUS/strings.xml | 96 +- .../android/dialer/app/res/values-es/strings.xml | 98 +- .../android/dialer/app/res/values-et/strings.xml | 96 +- .../android/dialer/app/res/values-eu/strings.xml | 96 +- .../android/dialer/app/res/values-fa/strings.xml | 96 +- .../android/dialer/app/res/values-fi/strings.xml | 96 +- .../dialer/app/res/values-fr-rCA/strings.xml | 96 +- .../android/dialer/app/res/values-fr/strings.xml | 96 +- .../android/dialer/app/res/values-gl/strings.xml | 96 +- .../android/dialer/app/res/values-gu/strings.xml | 96 +- .../android/dialer/app/res/values-hi/strings.xml | 96 +- .../android/dialer/app/res/values-hr/strings.xml | 98 +- .../android/dialer/app/res/values-hu/strings.xml | 96 +- .../android/dialer/app/res/values-hy/strings.xml | 96 +- .../android/dialer/app/res/values-in/strings.xml | 96 +- .../android/dialer/app/res/values-is/strings.xml | 96 +- .../android/dialer/app/res/values-it/strings.xml | 98 +- .../android/dialer/app/res/values-iw/strings.xml | 100 +- .../android/dialer/app/res/values-ja/strings.xml | 96 +- .../android/dialer/app/res/values-ka/strings.xml | 96 +- .../android/dialer/app/res/values-kk/strings.xml | 96 +- .../android/dialer/app/res/values-km/strings.xml | 96 +- .../android/dialer/app/res/values-kn/strings.xml | 96 +- .../android/dialer/app/res/values-ko/strings.xml | 96 +- .../android/dialer/app/res/values-ky/strings.xml | 96 +- .../android/dialer/app/res/values-lo/strings.xml | 96 +- .../android/dialer/app/res/values-lt/strings.xml | 100 +- .../android/dialer/app/res/values-lv/strings.xml | 98 +- .../android/dialer/app/res/values-mk/strings.xml | 96 +- .../android/dialer/app/res/values-ml/strings.xml | 96 +- .../android/dialer/app/res/values-mn/strings.xml | 96 +- .../android/dialer/app/res/values-mr/strings.xml | 96 +- .../android/dialer/app/res/values-ms/strings.xml | 96 +- .../android/dialer/app/res/values-my/strings.xml | 96 +- .../android/dialer/app/res/values-nb/strings.xml | 96 +- .../android/dialer/app/res/values-ne/strings.xml | 96 +- .../android/dialer/app/res/values-nl/strings.xml | 96 +- .../android/dialer/app/res/values-no/strings.xml | 96 +- .../android/dialer/app/res/values-pa/strings.xml | 96 +- .../android/dialer/app/res/values-pl/strings.xml | 100 +- .../dialer/app/res/values-pt-rBR/strings.xml | 98 +- .../dialer/app/res/values-pt-rPT/strings.xml | 98 +- .../android/dialer/app/res/values-pt/strings.xml | 98 +- .../android/dialer/app/res/values-ro/strings.xml | 98 +- .../android/dialer/app/res/values-ru/strings.xml | 100 +- .../android/dialer/app/res/values-si/strings.xml | 96 +- .../android/dialer/app/res/values-sk/strings.xml | 100 +- .../android/dialer/app/res/values-sl/strings.xml | 100 +- .../android/dialer/app/res/values-sq/strings.xml | 96 +- .../android/dialer/app/res/values-sr/strings.xml | 98 +- .../android/dialer/app/res/values-sv/strings.xml | 96 +- .../android/dialer/app/res/values-sw/strings.xml | 96 +- .../android/dialer/app/res/values-ta/strings.xml | 96 +- .../android/dialer/app/res/values-te/strings.xml | 96 +- .../android/dialer/app/res/values-th/strings.xml | 98 +- .../android/dialer/app/res/values-tl/strings.xml | 96 +- .../android/dialer/app/res/values-tr/strings.xml | 96 +- .../android/dialer/app/res/values-uk/strings.xml | 100 +- .../android/dialer/app/res/values-ur/strings.xml | 96 +- .../android/dialer/app/res/values-uz/strings.xml | 102 +- .../android/dialer/app/res/values-vi/strings.xml | 96 +- .../dialer/app/res/values-zh-rCN/strings.xml | 96 +- .../dialer/app/res/values-zh-rHK/strings.xml | 96 +- .../dialer/app/res/values-zh-rTW/strings.xml | 96 +- .../android/dialer/app/res/values-zu/strings.xml | 96 +- .../dialer/app/res/values/animation_constants.xml | 11 - java/com/android/dialer/app/res/values/colors.xml | 30 +- java/com/android/dialer/app/res/values/dimens.xml | 57 +- .../app/res/values/donottranslate_config.xml | 37 - java/com/android/dialer/app/res/values/strings.xml | 383 +-- java/com/android/dialer/app/res/values/styles.xml | 39 +- java/com/android/dialer/app/res/xml/file_paths.xml | 3 +- java/com/android/dialer/app/res/xml/searchable.xml | 22 - .../android/dialer/app/res/xml/sound_settings.xml | 4 +- .../app/settings/AppCompatPreferenceActivity.java | 5 - .../app/settings/DialerSettingsActivity.java | 17 +- .../dialer/app/settings/SoundSettingsFragment.java | 10 +- .../LegacyVoicemailNotificationReceiver.java | 95 +- .../app/voicemail/VoicemailAudioManager.java | 1 + .../app/voicemail/VoicemailErrorManager.java | 2 +- .../app/voicemail/VoicemailPlaybackLayout.java | 2 +- .../app/voicemail/VoicemailPlaybackPresenter.java | 17 +- .../error/OmtpVoicemailMessageCreator.java | 25 + .../app/voicemail/error/VoicemailErrorAlert.java | 8 + .../app/voicemail/error/VoicemailErrorMessage.java | 11 + .../error/VoicemailErrorMessageCreator.java | 9 + .../error/VoicemailStatusCorruptionHandler.java | 6 +- .../app/voicemail/error/VoicemailStatusWorker.java | 72 + .../error/VoicemailTosMessageCreator.java | 347 +++ .../error/Vvm3VoicemailMessageCreator.java | 173 +- .../app/voicemail/error/res/drawable/shadow.xml | 20 + .../error/res/drawable/voicemail_tos_image.png | Bin 0 -> 43527 bytes .../error/res/layout/voicemail_tos_fragment.xml | 39 +- .../app/voicemail/error/res/values-af/strings.xml | 18 +- .../app/voicemail/error/res/values-am/strings.xml | 18 +- .../app/voicemail/error/res/values-ar/strings.xml | 22 +- .../app/voicemail/error/res/values-az/strings.xml | 18 +- .../error/res/values-b+sr+Latn/strings.xml | 18 +- .../app/voicemail/error/res/values-be/strings.xml | 18 +- .../app/voicemail/error/res/values-bg/strings.xml | 18 +- .../app/voicemail/error/res/values-bn/strings.xml | 18 +- .../app/voicemail/error/res/values-bs/strings.xml | 18 +- .../app/voicemail/error/res/values-ca/strings.xml | 20 +- .../app/voicemail/error/res/values-cs/strings.xml | 18 +- .../app/voicemail/error/res/values-da/strings.xml | 18 +- .../app/voicemail/error/res/values-de/strings.xml | 18 +- .../app/voicemail/error/res/values-el/strings.xml | 18 +- .../voicemail/error/res/values-en-rAU/strings.xml | 18 +- .../voicemail/error/res/values-en-rGB/strings.xml | 18 +- .../voicemail/error/res/values-en-rIN/strings.xml | 18 +- .../voicemail/error/res/values-es-rUS/strings.xml | 18 +- .../app/voicemail/error/res/values-es/strings.xml | 18 +- .../app/voicemail/error/res/values-et/strings.xml | 18 +- .../app/voicemail/error/res/values-eu/strings.xml | 18 +- .../app/voicemail/error/res/values-fa/strings.xml | 18 +- .../app/voicemail/error/res/values-fi/strings.xml | 18 +- .../voicemail/error/res/values-fr-rCA/strings.xml | 18 +- .../app/voicemail/error/res/values-fr/strings.xml | 18 +- .../app/voicemail/error/res/values-gl/strings.xml | 18 +- .../app/voicemail/error/res/values-gu/strings.xml | 18 +- .../app/voicemail/error/res/values-hi/strings.xml | 20 +- .../app/voicemail/error/res/values-hr/strings.xml | 18 +- .../app/voicemail/error/res/values-hu/strings.xml | 18 +- .../app/voicemail/error/res/values-hy/strings.xml | 18 +- .../app/voicemail/error/res/values-in/strings.xml | 18 +- .../app/voicemail/error/res/values-is/strings.xml | 18 +- .../app/voicemail/error/res/values-it/strings.xml | 18 +- .../app/voicemail/error/res/values-iw/strings.xml | 18 +- .../app/voicemail/error/res/values-ja/strings.xml | 18 +- .../app/voicemail/error/res/values-ka/strings.xml | 18 +- .../app/voicemail/error/res/values-kk/strings.xml | 18 +- .../app/voicemail/error/res/values-km/strings.xml | 18 +- .../app/voicemail/error/res/values-kn/strings.xml | 18 +- .../app/voicemail/error/res/values-ko/strings.xml | 18 +- .../app/voicemail/error/res/values-ky/strings.xml | 18 +- .../app/voicemail/error/res/values-lo/strings.xml | 18 +- .../app/voicemail/error/res/values-lt/strings.xml | 18 +- .../app/voicemail/error/res/values-lv/strings.xml | 18 +- .../app/voicemail/error/res/values-mk/strings.xml | 20 +- .../app/voicemail/error/res/values-ml/strings.xml | 18 +- .../app/voicemail/error/res/values-mn/strings.xml | 18 +- .../app/voicemail/error/res/values-mr/strings.xml | 28 +- .../app/voicemail/error/res/values-ms/strings.xml | 18 +- .../app/voicemail/error/res/values-my/strings.xml | 18 +- .../app/voicemail/error/res/values-nb/strings.xml | 18 +- .../app/voicemail/error/res/values-ne/strings.xml | 18 +- .../app/voicemail/error/res/values-nl/strings.xml | 18 +- .../app/voicemail/error/res/values-no/strings.xml | 18 +- .../app/voicemail/error/res/values-pa/strings.xml | 18 +- .../app/voicemail/error/res/values-pl/strings.xml | 18 +- .../voicemail/error/res/values-pt-rBR/strings.xml | 18 +- .../voicemail/error/res/values-pt-rPT/strings.xml | 18 +- .../app/voicemail/error/res/values-pt/strings.xml | 18 +- .../app/voicemail/error/res/values-ro/strings.xml | 18 +- .../app/voicemail/error/res/values-ru/strings.xml | 18 +- .../app/voicemail/error/res/values-si/strings.xml | 18 +- .../app/voicemail/error/res/values-sk/strings.xml | 18 +- .../app/voicemail/error/res/values-sl/strings.xml | 18 +- .../app/voicemail/error/res/values-sq/strings.xml | 18 +- .../app/voicemail/error/res/values-sr/strings.xml | 18 +- .../app/voicemail/error/res/values-sv/strings.xml | 18 +- .../app/voicemail/error/res/values-sw/strings.xml | 20 +- .../app/voicemail/error/res/values-ta/strings.xml | 18 +- .../app/voicemail/error/res/values-te/strings.xml | 18 +- .../app/voicemail/error/res/values-th/strings.xml | 18 +- .../app/voicemail/error/res/values-tl/strings.xml | 18 +- .../app/voicemail/error/res/values-tr/strings.xml | 18 +- .../app/voicemail/error/res/values-uk/strings.xml | 18 +- .../app/voicemail/error/res/values-ur/strings.xml | 18 +- .../app/voicemail/error/res/values-uz/strings.xml | 18 +- .../app/voicemail/error/res/values-vi/strings.xml | 18 +- .../voicemail/error/res/values-zh-rCN/strings.xml | 18 +- .../voicemail/error/res/values-zh-rHK/strings.xml | 18 +- .../voicemail/error/res/values-zh-rTW/strings.xml | 18 +- .../app/voicemail/error/res/values-zu/strings.xml | 18 +- .../app/voicemail/error/res/values/dimens.xml | 29 +- .../app/voicemail/error/res/values/strings.xml | 45 +- .../app/voicemail/error/res/values/styles.xml | 37 +- .../app/widget/DialpadSearchEmptyContentView.java | 1 + .../dialer/app/widget/EmptyContentView.java | 121 - .../dialer/app/widget/SearchEditTextLayout.java | 22 +- java/com/android/dialer/backup/AndroidManifest.xml | 19 +- .../android/dialer/backup/DialerBackupAgent.java | 281 --- .../android/dialer/backup/DialerBackupUtils.java | 363 --- .../dialer/backup/DialerPersistentBackupAgent.java | 91 + .../dialer/backup/proto/voicemail_info.proto | 30 - .../binary/aosp/AospDialerRootComponent.java | 8 + .../dialer/binary/aosp/testing/AndroidManifest.xml | 24 + .../dialer/binary/aosp/testing/TestActivity.java | 25 + .../basecomponent/BaseDialerRootComponent.java | 12 + .../dialer/binary/common/DialerApplication.java | 19 +- .../dialer/binary/google/AndroidManifest.xml | 112 + .../binary/google/GoogleStubDialerApplication.java | 37 + .../google/GoogleStubDialerRootComponent.java | 56 + .../blocking/FilteredNumberAsyncQueryHandler.java | 6 +- .../dialer/blocking/FilteredNumberCompat.java | 9 +- .../dialer/blocking/FilteredNumbersUtil.java | 18 +- .../blocking/res/drawable-hdpi/ic_block_24dp.png | Bin 478 -> 0 bytes .../blocking/res/drawable-hdpi/ic_report_24dp.png | Bin 240 -> 0 bytes .../res/drawable-hdpi/ic_report_white_36dp.png | Bin 312 -> 0 bytes .../dialer/blocking/res/values-hu/strings.xml | 2 +- .../buildtype/bugfood/BuildTypeAccessorImpl.java | 30 + .../buildtype/dogfood/BuildTypeAccessorImpl.java | 30 + .../buildtype/fishfood/BuildTypeAccessorImpl.java | 30 + .../buildtype/test/BuildTypeAccessorImpl.java | 30 + .../dialer/callcomposer/AndroidManifest.xml | 2 +- .../dialer/callcomposer/CallComposerActivity.java | 295 ++- .../callcomposer/CameraComposerFragment.java | 44 +- .../callcomposer/CopyAndResizeImageWorker.java | 29 +- .../dialer/callcomposer/GalleryCursorLoader.java | 12 +- .../callcomposer/MessageComposerFragment.java | 36 +- .../dialer/callcomposer/camera/CameraManager.java | 146 +- .../callcomposer/camera/ImagePersistTask.java | 145 -- .../callcomposer/camera/ImagePersistWorker.java | 153 ++ .../camera/camerafocus/FocusOverlayManager.java | 2 +- .../callcomposer/camera/exif/ExifInterface.java | 2 +- .../callcomposer/camera/exif/ExifParser.java | 2 +- .../dialer/callcomposer/camera/exif/ExifTag.java | 2 +- .../cameraui/res/layout/camera_view.xml | 19 +- .../cameraui/res/values-af/strings.xml | 29 +- .../cameraui/res/values-am/strings.xml | 29 +- .../cameraui/res/values-ar/strings.xml | 29 +- .../cameraui/res/values-az/strings.xml | 29 +- .../cameraui/res/values-b+sr+Latn/strings.xml | 29 +- .../cameraui/res/values-be/strings.xml | 29 +- .../cameraui/res/values-bg/strings.xml | 29 +- .../cameraui/res/values-bn/strings.xml | 29 +- .../cameraui/res/values-bs/strings.xml | 29 +- .../cameraui/res/values-ca/strings.xml | 29 +- .../cameraui/res/values-cs/strings.xml | 29 +- .../cameraui/res/values-da/strings.xml | 29 +- .../cameraui/res/values-de/strings.xml | 29 +- .../cameraui/res/values-el/strings.xml | 29 +- .../cameraui/res/values-en-rAU/strings.xml | 29 +- .../cameraui/res/values-en-rGB/strings.xml | 29 +- .../cameraui/res/values-en-rIN/strings.xml | 29 +- .../cameraui/res/values-es-rUS/strings.xml | 29 +- .../cameraui/res/values-es/strings.xml | 29 +- .../cameraui/res/values-et/strings.xml | 29 +- .../cameraui/res/values-eu/strings.xml | 29 +- .../cameraui/res/values-fa/strings.xml | 29 +- .../cameraui/res/values-fi/strings.xml | 29 +- .../cameraui/res/values-fr-rCA/strings.xml | 29 +- .../cameraui/res/values-fr/strings.xml | 29 +- .../cameraui/res/values-gl/strings.xml | 29 +- .../cameraui/res/values-gu/strings.xml | 29 +- .../cameraui/res/values-hi/strings.xml | 29 +- .../cameraui/res/values-hr/strings.xml | 29 +- .../cameraui/res/values-hu/strings.xml | 29 +- .../cameraui/res/values-hy/strings.xml | 29 +- .../cameraui/res/values-in/strings.xml | 29 +- .../cameraui/res/values-is/strings.xml | 29 +- .../cameraui/res/values-it/strings.xml | 29 +- .../cameraui/res/values-iw/strings.xml | 29 +- .../cameraui/res/values-ja/strings.xml | 29 +- .../cameraui/res/values-ka/strings.xml | 29 +- .../cameraui/res/values-kk/strings.xml | 29 +- .../cameraui/res/values-km/strings.xml | 29 +- .../cameraui/res/values-kn/strings.xml | 29 +- .../cameraui/res/values-ko/strings.xml | 29 +- .../cameraui/res/values-ky/strings.xml | 29 +- .../cameraui/res/values-lo/strings.xml | 29 +- .../cameraui/res/values-lt/strings.xml | 29 +- .../cameraui/res/values-lv/strings.xml | 29 +- .../cameraui/res/values-mk/strings.xml | 29 +- .../cameraui/res/values-ml/strings.xml | 29 +- .../cameraui/res/values-mn/strings.xml | 29 +- .../cameraui/res/values-mr/strings.xml | 29 +- .../cameraui/res/values-ms/strings.xml | 29 +- .../cameraui/res/values-my/strings.xml | 29 +- .../cameraui/res/values-nb/strings.xml | 29 +- .../cameraui/res/values-ne/strings.xml | 29 +- .../cameraui/res/values-nl/strings.xml | 29 +- .../cameraui/res/values-no/strings.xml | 29 +- .../cameraui/res/values-pa/strings.xml | 29 +- .../cameraui/res/values-pl/strings.xml | 29 +- .../cameraui/res/values-pt-rBR/strings.xml | 29 +- .../cameraui/res/values-pt-rPT/strings.xml | 29 +- .../cameraui/res/values-pt/strings.xml | 29 +- .../cameraui/res/values-ro/strings.xml | 29 +- .../cameraui/res/values-ru/strings.xml | 29 +- .../cameraui/res/values-si/strings.xml | 29 +- .../cameraui/res/values-sk/strings.xml | 29 +- .../cameraui/res/values-sl/strings.xml | 29 +- .../cameraui/res/values-sq/strings.xml | 29 +- .../cameraui/res/values-sr/strings.xml | 29 +- .../cameraui/res/values-sv/strings.xml | 29 +- .../cameraui/res/values-sw/strings.xml | 29 +- .../cameraui/res/values-ta/strings.xml | 29 +- .../cameraui/res/values-te/strings.xml | 29 +- .../cameraui/res/values-th/strings.xml | 29 +- .../cameraui/res/values-tl/strings.xml | 29 +- .../cameraui/res/values-tr/strings.xml | 29 +- .../cameraui/res/values-uk/strings.xml | 29 +- .../cameraui/res/values-ur/strings.xml | 29 +- .../cameraui/res/values-uz/strings.xml | 29 +- .../cameraui/res/values-vi/strings.xml | 29 +- .../cameraui/res/values-zh-rCN/strings.xml | 29 +- .../cameraui/res/values-zh-rHK/strings.xml | 29 +- .../cameraui/res/values-zh-rTW/strings.xml | 29 +- .../cameraui/res/values-zu/strings.xml | 29 +- .../callcomposer/cameraui/res/values/dimens.xml | 2 +- .../callcomposer/cameraui/res/values/strings.xml | 33 +- .../callcomposer/proto/call_composer_contact.proto | 18 - .../res/layout/call_composer_activity.xml | 47 +- .../res/layout/fragment_message_composer.xml | 3 +- .../dialer/callcomposer/res/values-af/strings.xml | 7 +- .../dialer/callcomposer/res/values-am/strings.xml | 7 +- .../dialer/callcomposer/res/values-ar/strings.xml | 7 +- .../dialer/callcomposer/res/values-az/strings.xml | 7 +- .../callcomposer/res/values-b+sr+Latn/strings.xml | 7 +- .../dialer/callcomposer/res/values-be/strings.xml | 7 +- .../dialer/callcomposer/res/values-bg/strings.xml | 7 +- .../dialer/callcomposer/res/values-bn/strings.xml | 7 +- .../dialer/callcomposer/res/values-bs/strings.xml | 7 +- .../dialer/callcomposer/res/values-ca/strings.xml | 11 +- .../dialer/callcomposer/res/values-cs/strings.xml | 7 +- .../dialer/callcomposer/res/values-da/strings.xml | 7 +- .../dialer/callcomposer/res/values-de/strings.xml | 7 +- .../dialer/callcomposer/res/values-el/strings.xml | 7 +- .../callcomposer/res/values-en-rAU/strings.xml | 7 +- .../callcomposer/res/values-en-rGB/strings.xml | 7 +- .../callcomposer/res/values-en-rIN/strings.xml | 7 +- .../callcomposer/res/values-es-rUS/strings.xml | 7 +- .../dialer/callcomposer/res/values-es/strings.xml | 7 +- .../dialer/callcomposer/res/values-et/strings.xml | 7 +- .../dialer/callcomposer/res/values-eu/strings.xml | 7 +- .../dialer/callcomposer/res/values-fa/strings.xml | 7 +- .../dialer/callcomposer/res/values-fi/strings.xml | 7 +- .../callcomposer/res/values-fr-rCA/strings.xml | 7 +- .../dialer/callcomposer/res/values-fr/strings.xml | 7 +- .../dialer/callcomposer/res/values-gl/strings.xml | 7 +- .../dialer/callcomposer/res/values-gu/strings.xml | 7 +- .../dialer/callcomposer/res/values-hi/strings.xml | 7 +- .../dialer/callcomposer/res/values-hr/strings.xml | 7 +- .../dialer/callcomposer/res/values-hu/strings.xml | 7 +- .../dialer/callcomposer/res/values-hy/strings.xml | 7 +- .../dialer/callcomposer/res/values-in/strings.xml | 7 +- .../dialer/callcomposer/res/values-is/strings.xml | 7 +- .../dialer/callcomposer/res/values-it/strings.xml | 7 +- .../dialer/callcomposer/res/values-iw/strings.xml | 7 +- .../dialer/callcomposer/res/values-ja/strings.xml | 7 +- .../dialer/callcomposer/res/values-ka/strings.xml | 7 +- .../dialer/callcomposer/res/values-kk/strings.xml | 7 +- .../dialer/callcomposer/res/values-km/strings.xml | 7 +- .../dialer/callcomposer/res/values-kn/strings.xml | 7 +- .../dialer/callcomposer/res/values-ko/strings.xml | 7 +- .../dialer/callcomposer/res/values-ky/strings.xml | 7 +- .../dialer/callcomposer/res/values-lo/strings.xml | 7 +- .../dialer/callcomposer/res/values-lt/strings.xml | 7 +- .../dialer/callcomposer/res/values-lv/strings.xml | 7 +- .../dialer/callcomposer/res/values-mk/strings.xml | 7 +- .../dialer/callcomposer/res/values-ml/strings.xml | 7 +- .../dialer/callcomposer/res/values-mn/strings.xml | 7 +- .../dialer/callcomposer/res/values-mr/strings.xml | 7 +- .../dialer/callcomposer/res/values-ms/strings.xml | 7 +- .../dialer/callcomposer/res/values-my/strings.xml | 7 +- .../dialer/callcomposer/res/values-nb/strings.xml | 7 +- .../dialer/callcomposer/res/values-ne/strings.xml | 7 +- .../dialer/callcomposer/res/values-nl/strings.xml | 7 +- .../dialer/callcomposer/res/values-no/strings.xml | 7 +- .../dialer/callcomposer/res/values-pa/strings.xml | 7 +- .../dialer/callcomposer/res/values-pl/strings.xml | 7 +- .../callcomposer/res/values-pt-rBR/strings.xml | 7 +- .../callcomposer/res/values-pt-rPT/strings.xml | 7 +- .../dialer/callcomposer/res/values-pt/strings.xml | 7 +- .../dialer/callcomposer/res/values-ro/strings.xml | 7 +- .../dialer/callcomposer/res/values-ru/strings.xml | 7 +- .../dialer/callcomposer/res/values-si/strings.xml | 7 +- .../dialer/callcomposer/res/values-sk/strings.xml | 7 +- .../dialer/callcomposer/res/values-sl/strings.xml | 7 +- .../dialer/callcomposer/res/values-sq/strings.xml | 7 +- .../dialer/callcomposer/res/values-sr/strings.xml | 7 +- .../dialer/callcomposer/res/values-sv/strings.xml | 7 +- .../dialer/callcomposer/res/values-sw/strings.xml | 9 +- .../dialer/callcomposer/res/values-ta/strings.xml | 7 +- .../dialer/callcomposer/res/values-te/strings.xml | 7 +- .../dialer/callcomposer/res/values-th/strings.xml | 7 +- .../dialer/callcomposer/res/values-tl/strings.xml | 7 +- .../dialer/callcomposer/res/values-tr/strings.xml | 7 +- .../dialer/callcomposer/res/values-uk/strings.xml | 7 +- .../dialer/callcomposer/res/values-ur/strings.xml | 7 +- .../dialer/callcomposer/res/values-uz/strings.xml | 7 +- .../dialer/callcomposer/res/values-vi/strings.xml | 7 +- .../callcomposer/res/values-zh-rCN/strings.xml | 7 +- .../callcomposer/res/values-zh-rHK/strings.xml | 7 +- .../callcomposer/res/values-zh-rTW/strings.xml | 7 +- .../dialer/callcomposer/res/values-zu/strings.xml | 7 +- .../dialer/callcomposer/res/values/colors.xml | 1 - .../dialer/callcomposer/res/values/dimens.xml | 16 +- .../dialer/callcomposer/res/values/strings.xml | 17 +- .../dialer/callcomposer/res/values/styles.xml | 5 +- .../dialer/callcomposer/util/BitmapResizer.java | 35 +- .../android/dialer/calldetails/AndroidManifest.xml | 10 +- .../dialer/calldetails/CallDetailsActivity.java | 162 +- .../dialer/calldetails/CallDetailsAdapter.java | 33 +- .../calldetails/CallDetailsEntryViewHolder.java | 23 +- .../calldetails/CallDetailsFooterViewHolder.java | 32 +- .../calldetails/CallDetailsHeaderViewHolder.java | 34 +- .../dialer/calldetails/ReportDialogFragment.java | 165 ++ .../calldetails/proto/call_details_entries.proto | 2 + .../calldetails/res/layout/call_details_footer.xml | 9 + .../res/layout/caller_id_report_dialog.xml | 35 + .../calldetails/res/layout/contact_container.xml | 19 +- .../dialer/calldetails/res/values-af/strings.xml | 6 +- .../dialer/calldetails/res/values-am/strings.xml | 6 +- .../dialer/calldetails/res/values-ar/strings.xml | 6 +- .../dialer/calldetails/res/values-az/strings.xml | 6 +- .../calldetails/res/values-b+sr+Latn/strings.xml | 6 +- .../dialer/calldetails/res/values-be/strings.xml | 6 +- .../dialer/calldetails/res/values-bg/strings.xml | 6 +- .../dialer/calldetails/res/values-bn/strings.xml | 6 +- .../dialer/calldetails/res/values-bs/strings.xml | 6 +- .../dialer/calldetails/res/values-ca/strings.xml | 6 +- .../dialer/calldetails/res/values-cs/strings.xml | 6 +- .../dialer/calldetails/res/values-da/strings.xml | 6 +- .../dialer/calldetails/res/values-de/strings.xml | 6 +- .../dialer/calldetails/res/values-el/strings.xml | 6 +- .../calldetails/res/values-en-rAU/strings.xml | 6 +- .../calldetails/res/values-en-rGB/strings.xml | 6 +- .../calldetails/res/values-en-rIN/strings.xml | 6 +- .../calldetails/res/values-es-rUS/strings.xml | 6 +- .../dialer/calldetails/res/values-es/strings.xml | 6 +- .../dialer/calldetails/res/values-et/strings.xml | 6 +- .../dialer/calldetails/res/values-eu/strings.xml | 6 +- .../dialer/calldetails/res/values-fa/strings.xml | 6 +- .../dialer/calldetails/res/values-fi/strings.xml | 6 +- .../calldetails/res/values-fr-rCA/strings.xml | 6 +- .../dialer/calldetails/res/values-fr/strings.xml | 6 +- .../dialer/calldetails/res/values-gl/strings.xml | 6 +- .../dialer/calldetails/res/values-gu/strings.xml | 6 +- .../dialer/calldetails/res/values-hi/strings.xml | 6 +- .../dialer/calldetails/res/values-hr/strings.xml | 6 +- .../dialer/calldetails/res/values-hu/strings.xml | 6 +- .../dialer/calldetails/res/values-hy/strings.xml | 6 +- .../dialer/calldetails/res/values-in/strings.xml | 6 +- .../dialer/calldetails/res/values-is/strings.xml | 6 +- .../dialer/calldetails/res/values-it/strings.xml | 6 +- .../dialer/calldetails/res/values-iw/strings.xml | 6 +- .../dialer/calldetails/res/values-ja/strings.xml | 6 +- .../dialer/calldetails/res/values-ka/strings.xml | 6 +- .../dialer/calldetails/res/values-kk/strings.xml | 6 +- .../dialer/calldetails/res/values-km/strings.xml | 6 +- .../dialer/calldetails/res/values-kn/strings.xml | 6 +- .../dialer/calldetails/res/values-ko/strings.xml | 6 +- .../dialer/calldetails/res/values-ky/strings.xml | 6 +- .../dialer/calldetails/res/values-lo/strings.xml | 6 +- .../dialer/calldetails/res/values-lt/strings.xml | 6 +- .../dialer/calldetails/res/values-lv/strings.xml | 6 +- .../dialer/calldetails/res/values-mk/strings.xml | 6 +- .../dialer/calldetails/res/values-ml/strings.xml | 6 +- .../dialer/calldetails/res/values-mn/strings.xml | 6 +- .../dialer/calldetails/res/values-mr/strings.xml | 6 +- .../dialer/calldetails/res/values-ms/strings.xml | 6 +- .../dialer/calldetails/res/values-my/strings.xml | 6 +- .../dialer/calldetails/res/values-nb/strings.xml | 6 +- .../dialer/calldetails/res/values-ne/strings.xml | 6 +- .../dialer/calldetails/res/values-nl/strings.xml | 6 +- .../dialer/calldetails/res/values-no/strings.xml | 6 +- .../dialer/calldetails/res/values-pa/strings.xml | 6 +- .../dialer/calldetails/res/values-pl/strings.xml | 6 +- .../calldetails/res/values-pt-rBR/strings.xml | 6 +- .../calldetails/res/values-pt-rPT/strings.xml | 6 +- .../dialer/calldetails/res/values-pt/strings.xml | 6 +- .../dialer/calldetails/res/values-ro/strings.xml | 6 +- .../dialer/calldetails/res/values-ru/strings.xml | 6 +- .../dialer/calldetails/res/values-si/strings.xml | 6 +- .../dialer/calldetails/res/values-sk/strings.xml | 6 +- .../dialer/calldetails/res/values-sl/strings.xml | 6 +- .../dialer/calldetails/res/values-sq/strings.xml | 6 +- .../dialer/calldetails/res/values-sr/strings.xml | 6 +- .../dialer/calldetails/res/values-sv/strings.xml | 6 +- .../dialer/calldetails/res/values-sw/strings.xml | 6 +- .../dialer/calldetails/res/values-ta/strings.xml | 6 +- .../dialer/calldetails/res/values-te/strings.xml | 6 +- .../dialer/calldetails/res/values-th/strings.xml | 6 +- .../dialer/calldetails/res/values-tl/strings.xml | 6 +- .../dialer/calldetails/res/values-tr/strings.xml | 6 +- .../dialer/calldetails/res/values-uk/strings.xml | 6 +- .../dialer/calldetails/res/values-ur/strings.xml | 6 +- .../dialer/calldetails/res/values-uz/strings.xml | 8 +- .../dialer/calldetails/res/values-vi/strings.xml | 6 +- .../calldetails/res/values-zh-rCN/strings.xml | 6 +- .../calldetails/res/values-zh-rHK/strings.xml | 6 +- .../calldetails/res/values-zh-rTW/strings.xml | 6 +- .../dialer/calldetails/res/values-zu/strings.xml | 6 +- .../dialer/calldetails/res/values/dimens.xml | 4 - .../dialer/calldetails/res/values/strings.xml | 19 +- .../dialer/calldetails/res/values/styles.xml | 18 - .../dialer/callintent/CallIntentBuilder.java | 78 +- .../dialer/callintent/CallIntentParser.java | 22 +- .../dialer/callintent/call_initiation_type.proto | 4 + .../dialer/callintent/call_specific_app_data.proto | 27 + .../callintent/speed_dial_contact_type.proto | 21 + .../android/dialer/calllog/CallLogComponent.java | 2 + .../android/dialer/calllog/CallLogFramework.java | 24 +- java/com/android/dialer/calllog/CallLogModule.java | 8 +- java/com/android/dialer/calllog/DataSources.java | 31 - .../calllog/RefreshAnnotatedCallLogWorker.java | 123 +- .../dialer/calllog/database/AndroidManifest.xml | 28 + .../dialer/calllog/database/AnnotatedCallLog.java | 53 - .../database/AnnotatedCallLogContentProvider.java | 333 +++ .../database/AnnotatedCallLogDatabaseHelper.java | 64 +- .../calllog/database/CallLogDatabaseComponent.java | 40 + .../dialer/calllog/database/CallLogMutations.java | 58 - .../android/dialer/calllog/database/Coalescer.java | 194 ++ .../dialer/calllog/database/MutationApplier.java | 105 + .../calllog/database/annotated_call_log.proto | 15 + .../contract/AnnotatedCallLogContract.java | 259 ++ .../calllog/datasources/CallLogDataSource.java | 67 +- .../calllog/datasources/CallLogMutations.java | 110 + .../dialer/calllog/datasources/DataSources.java | 30 + .../datasources/contacts/ContactsDataSource.java | 24 +- .../systemcalllog/SystemCallLogDataSource.java | 359 ++- .../calllog/datasources/util/RowCombiner.java | 73 + .../android/dialer/calllog/ui/AndroidManifest.xml | 2 +- .../calllog/ui/AnnotatedCallLogCursorLoader.java | 48 - .../ui/CoalescedAnnotatedCallLogCursorLoader.java | 151 ++ .../dialer/calllog/ui/HeaderViewHolder.java | 36 + .../dialer/calllog/ui/NewCallLogAdapter.java | 155 ++ .../dialer/calllog/ui/NewCallLogFragment.java | 110 +- .../dialer/calllog/ui/NewCallLogViewHolder.java | 175 ++ .../calllog/ui/res/layout/new_call_log_entry.xml | 100 +- .../ui/res/layout/new_call_log_fragment.xml | 7 +- .../calllog/ui/res/layout/new_call_log_header.xml | 29 + .../dialer/calllog/ui/res/values-af/strings.xml | 24 + .../dialer/calllog/ui/res/values-am/strings.xml | 24 + .../dialer/calllog/ui/res/values-ar/strings.xml | 24 + .../dialer/calllog/ui/res/values-az/strings.xml | 24 + .../calllog/ui/res/values-b+sr+Latn/strings.xml | 24 + .../dialer/calllog/ui/res/values-be/strings.xml | 24 + .../dialer/calllog/ui/res/values-bg/strings.xml | 24 + .../dialer/calllog/ui/res/values-bn/strings.xml | 24 + .../dialer/calllog/ui/res/values-bs/strings.xml | 24 + .../dialer/calllog/ui/res/values-ca/strings.xml | 24 + .../dialer/calllog/ui/res/values-cs/strings.xml | 24 + .../dialer/calllog/ui/res/values-da/strings.xml | 24 + .../dialer/calllog/ui/res/values-de/strings.xml | 24 + .../dialer/calllog/ui/res/values-el/strings.xml | 24 + .../calllog/ui/res/values-en-rAU/strings.xml | 24 + .../calllog/ui/res/values-en-rGB/strings.xml | 24 + .../calllog/ui/res/values-en-rIN/strings.xml | 24 + .../calllog/ui/res/values-es-rUS/strings.xml | 24 + .../dialer/calllog/ui/res/values-es/strings.xml | 24 + .../dialer/calllog/ui/res/values-et/strings.xml | 24 + .../dialer/calllog/ui/res/values-eu/strings.xml | 24 + .../dialer/calllog/ui/res/values-fa/strings.xml | 24 + .../dialer/calllog/ui/res/values-fi/strings.xml | 24 + .../calllog/ui/res/values-fr-rCA/strings.xml | 24 + .../dialer/calllog/ui/res/values-fr/strings.xml | 24 + .../dialer/calllog/ui/res/values-gl/strings.xml | 24 + .../dialer/calllog/ui/res/values-gu/strings.xml | 24 + .../dialer/calllog/ui/res/values-hi/strings.xml | 24 + .../dialer/calllog/ui/res/values-hr/strings.xml | 24 + .../dialer/calllog/ui/res/values-hu/strings.xml | 24 + .../dialer/calllog/ui/res/values-hy/strings.xml | 24 + .../dialer/calllog/ui/res/values-in/strings.xml | 24 + .../dialer/calllog/ui/res/values-is/strings.xml | 24 + .../dialer/calllog/ui/res/values-it/strings.xml | 24 + .../dialer/calllog/ui/res/values-iw/strings.xml | 24 + .../dialer/calllog/ui/res/values-ja/strings.xml | 24 + .../dialer/calllog/ui/res/values-ka/strings.xml | 24 + .../dialer/calllog/ui/res/values-kk/strings.xml | 24 + .../dialer/calllog/ui/res/values-km/strings.xml | 24 + .../dialer/calllog/ui/res/values-kn/strings.xml | 24 + .../dialer/calllog/ui/res/values-ko/strings.xml | 24 + .../dialer/calllog/ui/res/values-ky/strings.xml | 24 + .../dialer/calllog/ui/res/values-lo/strings.xml | 24 + .../dialer/calllog/ui/res/values-lt/strings.xml | 24 + .../dialer/calllog/ui/res/values-lv/strings.xml | 24 + .../dialer/calllog/ui/res/values-mk/strings.xml | 24 + .../dialer/calllog/ui/res/values-ml/strings.xml | 24 + .../dialer/calllog/ui/res/values-mn/strings.xml | 24 + .../dialer/calllog/ui/res/values-mr/strings.xml | 24 + .../dialer/calllog/ui/res/values-ms/strings.xml | 24 + .../dialer/calllog/ui/res/values-my/strings.xml | 24 + .../dialer/calllog/ui/res/values-nb/strings.xml | 24 + .../dialer/calllog/ui/res/values-ne/strings.xml | 24 + .../dialer/calllog/ui/res/values-nl/strings.xml | 24 + .../dialer/calllog/ui/res/values-no/strings.xml | 24 + .../dialer/calllog/ui/res/values-pa/strings.xml | 24 + .../dialer/calllog/ui/res/values-pl/strings.xml | 24 + .../calllog/ui/res/values-pt-rBR/strings.xml | 24 + .../calllog/ui/res/values-pt-rPT/strings.xml | 24 + .../dialer/calllog/ui/res/values-pt/strings.xml | 24 + .../dialer/calllog/ui/res/values-ro/strings.xml | 24 + .../dialer/calllog/ui/res/values-ru/strings.xml | 24 + .../dialer/calllog/ui/res/values-si/strings.xml | 24 + .../dialer/calllog/ui/res/values-sk/strings.xml | 24 + .../dialer/calllog/ui/res/values-sl/strings.xml | 24 + .../dialer/calllog/ui/res/values-sq/strings.xml | 24 + .../dialer/calllog/ui/res/values-sr/strings.xml | 24 + .../dialer/calllog/ui/res/values-sv/strings.xml | 24 + .../dialer/calllog/ui/res/values-sw/strings.xml | 24 + .../dialer/calllog/ui/res/values-ta/strings.xml | 24 + .../dialer/calllog/ui/res/values-te/strings.xml | 24 + .../dialer/calllog/ui/res/values-th/strings.xml | 24 + .../dialer/calllog/ui/res/values-tl/strings.xml | 24 + .../dialer/calllog/ui/res/values-tr/strings.xml | 24 + .../dialer/calllog/ui/res/values-uk/strings.xml | 24 + .../dialer/calllog/ui/res/values-ur/strings.xml | 24 + .../dialer/calllog/ui/res/values-uz/strings.xml | 24 + .../dialer/calllog/ui/res/values-vi/strings.xml | 24 + .../calllog/ui/res/values-zh-rCN/strings.xml | 24 + .../calllog/ui/res/values-zh-rHK/strings.xml | 24 + .../calllog/ui/res/values-zh-rTW/strings.xml | 24 + .../dialer/calllog/ui/res/values-zu/strings.xml | 24 + .../dialer/calllog/ui/res/values/dimens.xml | 28 + .../dialer/calllog/ui/res/values/strings.xml | 32 + .../dialer/calllog/ui/res/values/styles.xml | 28 + .../dialer/calllogutils/CallEntryFormatter.java | 158 -- .../android/dialer/calllogutils/CallLogDates.java | 166 ++ .../dialer/calllogutils/CallLogDurations.java | 127 + .../dialer/calllogutils/CallTypeHelper.java | 28 +- .../dialer/calllogutils/PhoneCallDetails.java | 3 + .../dialer/calllogutils/res/values-af/strings.xml | 1 + .../dialer/calllogutils/res/values-am/strings.xml | 5 +- .../dialer/calllogutils/res/values-ar/strings.xml | 1 + .../dialer/calllogutils/res/values-az/strings.xml | 5 +- .../calllogutils/res/values-b+sr+Latn/strings.xml | 1 + .../dialer/calllogutils/res/values-be/strings.xml | 1 + .../dialer/calllogutils/res/values-bg/strings.xml | 1 + .../dialer/calllogutils/res/values-bn/strings.xml | 1 + .../dialer/calllogutils/res/values-bs/strings.xml | 1 + .../dialer/calllogutils/res/values-ca/strings.xml | 1 + .../dialer/calllogutils/res/values-cs/strings.xml | 1 + .../dialer/calllogutils/res/values-da/strings.xml | 5 +- .../dialer/calllogutils/res/values-de/strings.xml | 5 +- .../dialer/calllogutils/res/values-el/strings.xml | 1 + .../calllogutils/res/values-en-rAU/strings.xml | 1 + .../calllogutils/res/values-en-rGB/strings.xml | 1 + .../calllogutils/res/values-en-rIN/strings.xml | 1 + .../calllogutils/res/values-es-rUS/strings.xml | 1 + .../dialer/calllogutils/res/values-es/strings.xml | 1 + .../dialer/calllogutils/res/values-et/strings.xml | 1 + .../dialer/calllogutils/res/values-eu/strings.xml | 3 +- .../dialer/calllogutils/res/values-fa/strings.xml | 1 + .../dialer/calllogutils/res/values-fi/strings.xml | 1 + .../calllogutils/res/values-fr-rCA/strings.xml | 1 + .../dialer/calllogutils/res/values-fr/strings.xml | 1 + .../dialer/calllogutils/res/values-gl/strings.xml | 1 + .../dialer/calllogutils/res/values-gu/strings.xml | 1 + .../dialer/calllogutils/res/values-hi/strings.xml | 5 +- .../dialer/calllogutils/res/values-hr/strings.xml | 1 + .../dialer/calllogutils/res/values-hu/strings.xml | 1 + .../dialer/calllogutils/res/values-hy/strings.xml | 1 + .../dialer/calllogutils/res/values-in/strings.xml | 1 + .../dialer/calllogutils/res/values-is/strings.xml | 1 + .../dialer/calllogutils/res/values-it/strings.xml | 1 + .../dialer/calllogutils/res/values-iw/strings.xml | 3 +- .../dialer/calllogutils/res/values-ja/strings.xml | 1 + .../dialer/calllogutils/res/values-ka/strings.xml | 1 + .../dialer/calllogutils/res/values-kk/strings.xml | 1 + .../dialer/calllogutils/res/values-km/strings.xml | 1 + .../dialer/calllogutils/res/values-kn/strings.xml | 1 + .../dialer/calllogutils/res/values-ko/strings.xml | 1 + .../dialer/calllogutils/res/values-ky/strings.xml | 3 +- .../dialer/calllogutils/res/values-lo/strings.xml | 1 + .../dialer/calllogutils/res/values-lt/strings.xml | 1 + .../dialer/calllogutils/res/values-lv/strings.xml | 3 +- .../dialer/calllogutils/res/values-mk/strings.xml | 1 + .../dialer/calllogutils/res/values-ml/strings.xml | 3 +- .../dialer/calllogutils/res/values-mn/strings.xml | 1 + .../dialer/calllogutils/res/values-mr/strings.xml | 5 +- .../dialer/calllogutils/res/values-ms/strings.xml | 1 + .../dialer/calllogutils/res/values-my/strings.xml | 1 + .../dialer/calllogutils/res/values-nb/strings.xml | 5 +- .../dialer/calllogutils/res/values-ne/strings.xml | 1 + .../dialer/calllogutils/res/values-nl/strings.xml | 5 +- .../dialer/calllogutils/res/values-no/strings.xml | 5 +- .../dialer/calllogutils/res/values-pa/strings.xml | 1 + .../dialer/calllogutils/res/values-pl/strings.xml | 1 + .../calllogutils/res/values-pt-rBR/strings.xml | 5 +- .../calllogutils/res/values-pt-rPT/strings.xml | 9 +- .../dialer/calllogutils/res/values-pt/strings.xml | 5 +- .../dialer/calllogutils/res/values-ro/strings.xml | 1 + .../dialer/calllogutils/res/values-ru/strings.xml | 1 + .../dialer/calllogutils/res/values-si/strings.xml | 1 + .../dialer/calllogutils/res/values-sk/strings.xml | 1 + .../dialer/calllogutils/res/values-sl/strings.xml | 1 + .../dialer/calllogutils/res/values-sq/strings.xml | 1 + .../dialer/calllogutils/res/values-sr/strings.xml | 1 + .../dialer/calllogutils/res/values-sv/strings.xml | 1 + .../dialer/calllogutils/res/values-sw/strings.xml | 5 +- .../dialer/calllogutils/res/values-ta/strings.xml | 1 + .../dialer/calllogutils/res/values-te/strings.xml | 1 + .../dialer/calllogutils/res/values-th/strings.xml | 1 + .../dialer/calllogutils/res/values-tl/strings.xml | 1 + .../dialer/calllogutils/res/values-tr/strings.xml | 5 +- .../dialer/calllogutils/res/values-uk/strings.xml | 1 + .../dialer/calllogutils/res/values-ur/strings.xml | 5 +- .../dialer/calllogutils/res/values-uz/strings.xml | 1 + .../dialer/calllogutils/res/values-vi/strings.xml | 1 + .../calllogutils/res/values-zh-rCN/strings.xml | 1 + .../calllogutils/res/values-zh-rHK/strings.xml | 1 + .../calllogutils/res/values-zh-rTW/strings.xml | 1 + .../dialer/calllogutils/res/values-zu/strings.xml | 1 + .../dialer/calllogutils/res/values/strings.xml | 3 + java/com/android/dialer/common/AndroidManifest.xml | 15 + java/com/android/dialer/common/Assert.java | 9 +- java/com/android/dialer/common/ConfigProvider.java | 27 - .../dialer/common/ConfigProviderBindings.java | 76 - .../dialer/common/ConfigProviderFactory.java | 26 - java/com/android/dialer/common/FragmentUtils.java | 38 + .../concurrent/DefaultDialerExecutorFactory.java | 121 +- .../dialer/common/concurrent/DialerExecutor.java | 10 + .../common/concurrent/DialerExecutorComponent.java | 39 + .../common/concurrent/DialerExecutorModule.java | 28 + .../dialer/common/concurrent/DialerExecutors.java | 27 + .../common/concurrent/DialerUiTaskFragment.java | 120 +- .../common/concurrent/FallibleAsyncTask.java | 2 + .../dialer/common/concurrent/ThreadUtil.java | 5 + .../android/dialer/common/database/Selection.java | 260 ++ .../dialer/common/res/values-af/strings.xml | 16 + .../dialer/common/res/values-am/strings.xml | 16 + .../dialer/common/res/values-ar/strings.xml | 16 + .../dialer/common/res/values-az/strings.xml | 16 + .../dialer/common/res/values-b+sr+Latn/strings.xml | 16 + .../dialer/common/res/values-be/strings.xml | 16 + .../dialer/common/res/values-bg/strings.xml | 16 + .../dialer/common/res/values-bn/strings.xml | 16 + .../dialer/common/res/values-bs/strings.xml | 16 + .../dialer/common/res/values-ca/strings.xml | 16 + .../dialer/common/res/values-cs/strings.xml | 16 + .../dialer/common/res/values-da/strings.xml | 16 + .../dialer/common/res/values-de/strings.xml | 16 + .../dialer/common/res/values-el/strings.xml | 16 + .../dialer/common/res/values-en-rAU/strings.xml | 16 + .../dialer/common/res/values-en-rGB/strings.xml | 16 + .../dialer/common/res/values-en-rIN/strings.xml | 16 + .../dialer/common/res/values-es-rUS/strings.xml | 16 + .../dialer/common/res/values-es/strings.xml | 16 + .../dialer/common/res/values-et/strings.xml | 16 + .../dialer/common/res/values-eu/strings.xml | 16 + .../dialer/common/res/values-fa/strings.xml | 16 + .../dialer/common/res/values-fi/strings.xml | 16 + .../dialer/common/res/values-fr-rCA/strings.xml | 16 + .../dialer/common/res/values-fr/strings.xml | 16 + .../dialer/common/res/values-gl/strings.xml | 16 + .../dialer/common/res/values-gu/strings.xml | 16 + .../dialer/common/res/values-hi/strings.xml | 16 + .../dialer/common/res/values-hr/strings.xml | 16 + .../dialer/common/res/values-hu/strings.xml | 16 + .../dialer/common/res/values-hy/strings.xml | 16 + .../dialer/common/res/values-in/strings.xml | 16 + .../dialer/common/res/values-is/strings.xml | 16 + .../dialer/common/res/values-it/strings.xml | 16 + .../dialer/common/res/values-iw/strings.xml | 16 + .../dialer/common/res/values-ja/strings.xml | 16 + .../dialer/common/res/values-ka/strings.xml | 16 + .../dialer/common/res/values-kk/strings.xml | 16 + .../dialer/common/res/values-km/strings.xml | 16 + .../dialer/common/res/values-kn/strings.xml | 16 + .../dialer/common/res/values-ko/strings.xml | 16 + .../dialer/common/res/values-ky/strings.xml | 16 + .../dialer/common/res/values-lo/strings.xml | 16 + .../dialer/common/res/values-lt/strings.xml | 16 + .../dialer/common/res/values-lv/strings.xml | 16 + .../dialer/common/res/values-mk/strings.xml | 16 + .../dialer/common/res/values-ml/strings.xml | 16 + .../dialer/common/res/values-mn/strings.xml | 16 + .../dialer/common/res/values-mr/strings.xml | 16 + .../dialer/common/res/values-ms/strings.xml | 16 + .../dialer/common/res/values-my/strings.xml | 16 + .../dialer/common/res/values-nb/strings.xml | 16 + .../dialer/common/res/values-ne/strings.xml | 16 + .../dialer/common/res/values-nl/strings.xml | 16 + .../dialer/common/res/values-no/strings.xml | 16 + .../dialer/common/res/values-pa/strings.xml | 16 + .../dialer/common/res/values-pl/strings.xml | 16 + .../dialer/common/res/values-pt-rBR/strings.xml | 16 + .../dialer/common/res/values-pt-rPT/strings.xml | 16 + .../dialer/common/res/values-pt/strings.xml | 16 + .../dialer/common/res/values-ro/strings.xml | 16 + .../dialer/common/res/values-ru/strings.xml | 16 + .../dialer/common/res/values-si/strings.xml | 16 + .../dialer/common/res/values-sk/strings.xml | 16 + .../dialer/common/res/values-sl/strings.xml | 16 + .../dialer/common/res/values-sq/strings.xml | 16 + .../dialer/common/res/values-sr/strings.xml | 16 + .../dialer/common/res/values-sv/strings.xml | 16 + .../dialer/common/res/values-sw/strings.xml | 16 + .../dialer/common/res/values-ta/strings.xml | 16 + .../dialer/common/res/values-te/strings.xml | 16 + .../dialer/common/res/values-th/strings.xml | 16 + .../dialer/common/res/values-tl/strings.xml | 16 + .../dialer/common/res/values-tr/strings.xml | 16 + .../dialer/common/res/values-uk/strings.xml | 16 + .../dialer/common/res/values-ur/strings.xml | 16 + .../dialer/common/res/values-uz/strings.xml | 16 + .../dialer/common/res/values-vi/strings.xml | 16 + .../dialer/common/res/values-zh-rCN/strings.xml | 16 + .../dialer/common/res/values-zh-rHK/strings.xml | 16 + .../dialer/common/res/values-zh-rTW/strings.xml | 16 + .../dialer/common/res/values-zu/strings.xml | 16 + .../android/dialer/common/res/values/config.xml | 4 - .../android/dialer/common/res/values/strings.xml | 15 + java/com/android/dialer/compat/CompatUtils.java | 167 +- .../compat/telephony/TelephonyManagerCompat.java | 200 ++ .../dialer/configprovider/AndroidManifest.xml | 23 + .../dialer/configprovider/ConfigProvider.java | 27 + .../configprovider/ConfigProviderBindings.java | 68 + .../configprovider/ConfigProviderComponent.java | 41 + .../configprovider/SharedPrefConfigProvider.java | 120 + .../SharedPrefConfigProviderModule.java | 30 + .../dialer/constants/ActivityRequestCodes.java | 41 + java/com/android/dialer/constants/Constants.java | 6 + .../android/dialer/constants/ScheduledJobIds.java | 2 + .../android/dialer/constants/TrafficStatsTags.java | 33 + .../dialer/constants/aospdialer/ConstantsImpl.java | 12 + .../constants/googledialer/ConstantsImpl.java | 61 + .../dialer/contactactions/AndroidManifest.xml | 16 + .../contactactions/ContactActionBottomSheet.java | 136 ++ .../dialer/contactactions/ContactActionModule.java | 38 + .../dialer/contactactions/DividerModule.java | 41 + .../dialer/contactactions/IntentModule.java | 75 + .../contactactions/res/layout/contact_layout.xml | 53 + .../contactactions/res/layout/divider_layout.xml | 23 + .../contactactions/res/layout/module_layout.xml | 40 + .../contactactions/res/layout/sheet_layout.xml | 24 + .../dialer/contactactions/res/values/dimens.xml | 20 + .../dialer/contactphoto/AndroidManifest.xml | 18 + .../android/dialer/contactphoto/BitmapUtil.java | 141 ++ .../dialer/contactphoto/ContactPhotoManager.java | 511 ++++ .../contactphoto/ContactPhotoManagerImpl.java | 1266 ++++++++++ .../dialer/contactphoto/res/values-af/strings.xml | 21 + .../dialer/contactphoto/res/values-am/strings.xml | 21 + .../dialer/contactphoto/res/values-ar/strings.xml | 21 + .../dialer/contactphoto/res/values-az/strings.xml | 21 + .../contactphoto/res/values-b+sr+Latn/strings.xml | 21 + .../dialer/contactphoto/res/values-be/strings.xml | 21 + .../dialer/contactphoto/res/values-bg/strings.xml | 21 + .../dialer/contactphoto/res/values-bn/strings.xml | 21 + .../dialer/contactphoto/res/values-bs/strings.xml | 21 + .../dialer/contactphoto/res/values-ca/strings.xml | 21 + .../dialer/contactphoto/res/values-cs/strings.xml | 21 + .../dialer/contactphoto/res/values-da/strings.xml | 21 + .../dialer/contactphoto/res/values-de/strings.xml | 21 + .../dialer/contactphoto/res/values-el/strings.xml | 21 + .../contactphoto/res/values-en-rAU/strings.xml | 21 + .../contactphoto/res/values-en-rGB/strings.xml | 21 + .../contactphoto/res/values-en-rIN/strings.xml | 21 + .../contactphoto/res/values-es-rUS/strings.xml | 21 + .../dialer/contactphoto/res/values-es/strings.xml | 21 + .../dialer/contactphoto/res/values-et/strings.xml | 21 + .../dialer/contactphoto/res/values-eu/strings.xml | 21 + .../dialer/contactphoto/res/values-fa/strings.xml | 21 + .../dialer/contactphoto/res/values-fi/strings.xml | 21 + .../contactphoto/res/values-fr-rCA/strings.xml | 21 + .../dialer/contactphoto/res/values-fr/strings.xml | 21 + .../dialer/contactphoto/res/values-gl/strings.xml | 21 + .../dialer/contactphoto/res/values-gu/strings.xml | 21 + .../dialer/contactphoto/res/values-hi/strings.xml | 21 + .../dialer/contactphoto/res/values-hr/strings.xml | 21 + .../dialer/contactphoto/res/values-hu/strings.xml | 21 + .../dialer/contactphoto/res/values-hy/strings.xml | 21 + .../dialer/contactphoto/res/values-in/strings.xml | 21 + .../dialer/contactphoto/res/values-is/strings.xml | 21 + .../dialer/contactphoto/res/values-it/strings.xml | 21 + .../dialer/contactphoto/res/values-iw/strings.xml | 21 + .../dialer/contactphoto/res/values-ja/strings.xml | 21 + .../dialer/contactphoto/res/values-ka/strings.xml | 21 + .../dialer/contactphoto/res/values-kk/strings.xml | 21 + .../dialer/contactphoto/res/values-km/strings.xml | 21 + .../dialer/contactphoto/res/values-kn/strings.xml | 21 + .../dialer/contactphoto/res/values-ko/strings.xml | 21 + .../dialer/contactphoto/res/values-ky/strings.xml | 21 + .../dialer/contactphoto/res/values-lo/strings.xml | 21 + .../dialer/contactphoto/res/values-lt/strings.xml | 21 + .../dialer/contactphoto/res/values-lv/strings.xml | 21 + .../dialer/contactphoto/res/values-mk/strings.xml | 21 + .../dialer/contactphoto/res/values-ml/strings.xml | 21 + .../dialer/contactphoto/res/values-mn/strings.xml | 21 + .../dialer/contactphoto/res/values-mr/strings.xml | 21 + .../dialer/contactphoto/res/values-ms/strings.xml | 21 + .../dialer/contactphoto/res/values-my/strings.xml | 21 + .../dialer/contactphoto/res/values-nb/strings.xml | 21 + .../dialer/contactphoto/res/values-ne/strings.xml | 21 + .../dialer/contactphoto/res/values-nl/strings.xml | 21 + .../dialer/contactphoto/res/values-no/strings.xml | 21 + .../dialer/contactphoto/res/values-pa/strings.xml | 21 + .../dialer/contactphoto/res/values-pl/strings.xml | 21 + .../contactphoto/res/values-pt-rBR/strings.xml | 21 + .../contactphoto/res/values-pt-rPT/strings.xml | 21 + .../dialer/contactphoto/res/values-pt/strings.xml | 21 + .../dialer/contactphoto/res/values-ro/strings.xml | 21 + .../dialer/contactphoto/res/values-ru/strings.xml | 21 + .../dialer/contactphoto/res/values-si/strings.xml | 21 + .../dialer/contactphoto/res/values-sk/strings.xml | 21 + .../dialer/contactphoto/res/values-sl/strings.xml | 21 + .../dialer/contactphoto/res/values-sq/strings.xml | 21 + .../dialer/contactphoto/res/values-sr/strings.xml | 21 + .../dialer/contactphoto/res/values-sv/strings.xml | 21 + .../dialer/contactphoto/res/values-sw/strings.xml | 21 + .../dialer/contactphoto/res/values-ta/strings.xml | 21 + .../dialer/contactphoto/res/values-te/strings.xml | 21 + .../dialer/contactphoto/res/values-th/strings.xml | 21 + .../dialer/contactphoto/res/values-tl/strings.xml | 21 + .../dialer/contactphoto/res/values-tr/strings.xml | 21 + .../dialer/contactphoto/res/values-uk/strings.xml | 21 + .../dialer/contactphoto/res/values-ur/strings.xml | 21 + .../dialer/contactphoto/res/values-uz/strings.xml | 21 + .../dialer/contactphoto/res/values-vi/strings.xml | 21 + .../contactphoto/res/values-zh-rCN/strings.xml | 21 + .../contactphoto/res/values-zh-rHK/strings.xml | 21 + .../contactphoto/res/values-zh-rTW/strings.xml | 21 + .../dialer/contactphoto/res/values-zu/strings.xml | 21 + .../dialer/contactphoto/res/values/dimens.xml | 19 + .../dialer/contactphoto/res/values/strings.xml | 24 + .../contactsfragment/AddContactViewHolder.java | 42 + .../dialer/contactsfragment/ContactViewHolder.java | 38 +- .../dialer/contactsfragment/ContactsAdapter.java | 123 +- .../contactsfragment/ContactsCursorLoader.java | 29 +- .../dialer/contactsfragment/ContactsFragment.java | 227 +- .../dialer/contactsfragment/FastScroller.java | 131 ++ .../fast_scroller_container_background.xml | 28 + .../res/drawable/fast_scroller_scroll_bar.xml | 32 + .../res/layout/add_contact_row.xml | 50 + .../contactsfragment/res/layout/contact_row.xml | 6 +- .../res/layout/fragment_contacts.xml | 41 +- .../dialer/contactsfragment/res/values/dimens.xml | 9 +- .../dialer/database/CallLogQueryHandler.java | 14 + .../dialer/database/DialerDatabaseHelper.java | 357 ++- .../dialer/database/VoicemailStatusQuery.java | 2 +- .../dialer/databasepopulator/AndroidManifest.xml | 18 + .../dialer/databasepopulator/CallLogPopulator.java | 168 ++ .../databasepopulator/ContactsPopulator.java | 356 +++ .../databasepopulator/VoicemailPopulator.java | 164 ++ .../dialer/dialercontact/dialer_contact.proto | 27 + .../dialer/dialpadview/DialpadFragment.java | 1720 ++++++++++++++ .../android/dialer/dialpadview/DialpadView.java | 9 +- .../dialpadview/PseudoEmergencyAnimator.java | 142 ++ .../dialer/dialpadview/SmartDialCursorLoader.java | 183 ++ .../dialer/dialpadview/SpecialCharSequenceMgr.java | 497 ++++ .../dialpadview/UnicodeDialerKeyListener.java | 56 + .../res/drawable-hdpi/ic_close_black_24dp.png | Bin 207 -> 0 bytes .../res/drawable-hdpi/ic_dialer_fork_add_call.png | Bin 0 -> 1649 bytes .../drawable-hdpi/ic_dialer_fork_current_call.png | Bin 0 -> 2305 bytes .../res/drawable-hdpi/ic_dialer_fork_tt_keypad.png | Bin 0 -> 2419 bytes .../res/drawable-hdpi/ic_dialpad_delete.png | Bin 805 -> 0 bytes .../res/drawable-hdpi/ic_dialpad_voicemail.png | Bin 623 -> 0 bytes .../res/drawable-hdpi/ic_overflow_menu.png | Bin 503 -> 0 bytes .../res/drawable-mdpi/ic_dialer_fork_add_call.png | Bin 0 -> 1309 bytes .../drawable-mdpi/ic_dialer_fork_current_call.png | Bin 0 -> 1581 bytes .../res/drawable-mdpi/ic_dialer_fork_tt_keypad.png | Bin 0 -> 1586 bytes .../res/drawable-xhdpi/ic_dialer_fork_add_call.png | Bin 0 -> 2150 bytes .../drawable-xhdpi/ic_dialer_fork_current_call.png | Bin 0 -> 3154 bytes .../drawable-xhdpi/ic_dialer_fork_tt_keypad.png | Bin 0 -> 3298 bytes .../drawable-xxhdpi/ic_dialer_fork_add_call.png | Bin 0 -> 2583 bytes .../ic_dialer_fork_current_call.png | Bin 0 -> 3622 bytes .../drawable-xxhdpi/ic_dialer_fork_tt_keypad.png | Bin 0 -> 3229 bytes .../dialpadview/res/drawable/dialpad_scrim.xml | 7 - .../dialpadview/res/drawable/ic_wifi_calling.xml | 29 + .../dialpadview/res/drawable/shadow_fade_left.xml | 24 + .../dialpadview/res/drawable/shadow_fade_up.xml | 24 + .../res/layout-land/dialpad_fragment.xml | 82 + .../res/layout-land/dialpad_key_one.xml | 2 +- .../res/layout/dialpad_chooser_list_item.xml | 38 + .../dialpadview/res/layout/dialpad_fragment.xml | 72 + .../dialpadview/res/layout/dialpad_key_one.xml | 6 +- .../res/layout/dialpad_view_unthemed.xml | 201 +- .../dialpadview/res/menu/dialpad_options.xml | 30 + .../dialer/dialpadview/res/values-af/strings.xml | 14 + .../dialer/dialpadview/res/values-am/strings.xml | 14 + .../dialer/dialpadview/res/values-ar/strings.xml | 14 + .../dialer/dialpadview/res/values-az/strings.xml | 14 + .../dialpadview/res/values-b+sr+Latn/strings.xml | 14 + .../dialer/dialpadview/res/values-be/strings.xml | 14 + .../dialer/dialpadview/res/values-bg/strings.xml | 14 + .../dialer/dialpadview/res/values-bn/strings.xml | 14 + .../dialer/dialpadview/res/values-bs/strings.xml | 14 + .../dialer/dialpadview/res/values-ca/strings.xml | 14 + .../dialer/dialpadview/res/values-cs/strings.xml | 14 + .../dialer/dialpadview/res/values-da/strings.xml | 14 + .../dialer/dialpadview/res/values-de/strings.xml | 14 + .../dialer/dialpadview/res/values-el/strings.xml | 14 + .../dialpadview/res/values-en-rAU/strings.xml | 14 + .../dialpadview/res/values-en-rGB/strings.xml | 14 + .../dialpadview/res/values-en-rIN/strings.xml | 14 + .../dialpadview/res/values-es-rUS/strings.xml | 14 + .../dialer/dialpadview/res/values-es/strings.xml | 14 + .../dialer/dialpadview/res/values-et/strings.xml | 14 + .../dialer/dialpadview/res/values-eu/strings.xml | 14 + .../dialer/dialpadview/res/values-fa/strings.xml | 14 + .../dialer/dialpadview/res/values-fi/strings.xml | 14 + .../dialpadview/res/values-fr-rCA/strings.xml | 14 + .../dialer/dialpadview/res/values-fr/strings.xml | 14 + .../dialer/dialpadview/res/values-gl/strings.xml | 14 + .../dialer/dialpadview/res/values-gu/strings.xml | 14 + .../dialer/dialpadview/res/values-hi/strings.xml | 14 + .../dialer/dialpadview/res/values-hr/strings.xml | 14 + .../dialer/dialpadview/res/values-hu/strings.xml | 14 + .../dialer/dialpadview/res/values-hy/strings.xml | 14 + .../dialer/dialpadview/res/values-in/strings.xml | 14 + .../dialer/dialpadview/res/values-is/strings.xml | 14 + .../dialer/dialpadview/res/values-it/strings.xml | 14 + .../dialer/dialpadview/res/values-iw/strings.xml | 14 + .../dialer/dialpadview/res/values-ja/strings.xml | 14 + .../dialer/dialpadview/res/values-ka/strings.xml | 14 + .../dialer/dialpadview/res/values-kk/strings.xml | 14 + .../dialer/dialpadview/res/values-km/strings.xml | 14 + .../dialer/dialpadview/res/values-kn/strings.xml | 14 + .../dialer/dialpadview/res/values-ko/strings.xml | 14 + .../dialer/dialpadview/res/values-ky/strings.xml | 14 + .../dialer/dialpadview/res/values-lo/strings.xml | 14 + .../dialer/dialpadview/res/values-lt/strings.xml | 14 + .../dialer/dialpadview/res/values-lv/strings.xml | 14 + .../dialer/dialpadview/res/values-mk/strings.xml | 14 + .../dialer/dialpadview/res/values-ml/strings.xml | 14 + .../dialer/dialpadview/res/values-mn/strings.xml | 14 + .../dialer/dialpadview/res/values-mr/strings.xml | 14 + .../dialer/dialpadview/res/values-ms/strings.xml | 14 + .../dialer/dialpadview/res/values-my/strings.xml | 14 + .../dialer/dialpadview/res/values-nb/strings.xml | 14 + .../dialer/dialpadview/res/values-ne/strings.xml | 14 + .../dialer/dialpadview/res/values-nl/strings.xml | 14 + .../dialer/dialpadview/res/values-no/strings.xml | 14 + .../dialer/dialpadview/res/values-pa/strings.xml | 14 + .../dialer/dialpadview/res/values-pl/strings.xml | 14 + .../dialpadview/res/values-pt-rBR/strings.xml | 14 + .../dialpadview/res/values-pt-rPT/strings.xml | 14 + .../dialer/dialpadview/res/values-pt/strings.xml | 14 + .../dialer/dialpadview/res/values-ro/strings.xml | 14 + .../dialer/dialpadview/res/values-ru/strings.xml | 14 + .../dialer/dialpadview/res/values-si/strings.xml | 14 + .../dialer/dialpadview/res/values-sk/strings.xml | 14 + .../dialer/dialpadview/res/values-sl/strings.xml | 14 + .../dialer/dialpadview/res/values-sq/strings.xml | 14 + .../dialer/dialpadview/res/values-sr/strings.xml | 14 + .../dialer/dialpadview/res/values-sv/strings.xml | 14 + .../dialer/dialpadview/res/values-sw/strings.xml | 14 + .../dialer/dialpadview/res/values-ta/strings.xml | 14 + .../dialer/dialpadview/res/values-te/strings.xml | 14 + .../dialer/dialpadview/res/values-th/strings.xml | 14 + .../dialer/dialpadview/res/values-tl/strings.xml | 14 + .../dialer/dialpadview/res/values-tr/strings.xml | 14 + .../dialer/dialpadview/res/values-uk/strings.xml | 14 + .../dialer/dialpadview/res/values-ur/strings.xml | 14 + .../dialer/dialpadview/res/values-uz/strings.xml | 14 + .../dialer/dialpadview/res/values-vi/strings.xml | 14 + .../dialpadview/res/values-zh-rCN/strings.xml | 14 + .../dialpadview/res/values-zh-rHK/strings.xml | 14 + .../dialpadview/res/values-zh-rTW/strings.xml | 14 + .../dialer/dialpadview/res/values-zu/strings.xml | 14 + .../dialer/dialpadview/res/values/colors.xml | 2 - .../dialer/dialpadview/res/values/dimens.xml | 11 +- .../dialer/dialpadview/res/values/strings.xml | 59 +- .../enrichedcall/EnrichedCallCapabilities.java | 53 +- .../dialer/enrichedcall/EnrichedCallManager.java | 76 +- .../enrichedcall/FuzzyPhoneNumberMatcher.java | 50 +- java/com/android/dialer/enrichedcall/Session.java | 25 +- .../enrichedcall/extensions/StateExtension.java | 18 +- .../historyquery/proto/history_result.proto | 1 + .../enrichedcall/simulator/AndroidManifest.xml | 26 + .../simulator/EnrichedCallSimulatorActivity.java | 110 + .../enrichedcall/simulator/SessionViewHolder.java | 37 + .../enrichedcall/simulator/SessionsAdapter.java | 51 + .../layout/enriched_call_simulator_activity.xml | 38 + .../simulator/res/layout/session_view_holder.xml | 23 + .../simulator/res/values-af/strings.xml | 20 + .../simulator/res/values-am/strings.xml | 20 + .../simulator/res/values-ar/strings.xml | 20 + .../simulator/res/values-az/strings.xml | 20 + .../simulator/res/values-b+sr+Latn/strings.xml | 20 + .../simulator/res/values-be/strings.xml | 20 + .../simulator/res/values-bg/strings.xml | 20 + .../simulator/res/values-bn/strings.xml | 20 + .../simulator/res/values-bs/strings.xml | 20 + .../simulator/res/values-ca/strings.xml | 20 + .../simulator/res/values-cs/strings.xml | 20 + .../simulator/res/values-da/strings.xml | 20 + .../simulator/res/values-de/strings.xml | 20 + .../simulator/res/values-el/strings.xml | 20 + .../simulator/res/values-en-rAU/strings.xml | 20 + .../simulator/res/values-en-rGB/strings.xml | 20 + .../simulator/res/values-en-rIN/strings.xml | 20 + .../simulator/res/values-es-rUS/strings.xml | 20 + .../simulator/res/values-es/strings.xml | 20 + .../simulator/res/values-et/strings.xml | 20 + .../simulator/res/values-eu/strings.xml | 20 + .../simulator/res/values-fa/strings.xml | 20 + .../simulator/res/values-fi/strings.xml | 20 + .../simulator/res/values-fr-rCA/strings.xml | 20 + .../simulator/res/values-fr/strings.xml | 20 + .../simulator/res/values-gl/strings.xml | 20 + .../simulator/res/values-gu/strings.xml | 20 + .../simulator/res/values-hi/strings.xml | 20 + .../simulator/res/values-hr/strings.xml | 20 + .../simulator/res/values-hu/strings.xml | 20 + .../simulator/res/values-hy/strings.xml | 20 + .../simulator/res/values-in/strings.xml | 20 + .../simulator/res/values-is/strings.xml | 20 + .../simulator/res/values-it/strings.xml | 20 + .../simulator/res/values-iw/strings.xml | 20 + .../simulator/res/values-ja/strings.xml | 20 + .../simulator/res/values-ka/strings.xml | 20 + .../simulator/res/values-kk/strings.xml | 20 + .../simulator/res/values-km/strings.xml | 20 + .../simulator/res/values-kn/strings.xml | 20 + .../simulator/res/values-ko/strings.xml | 20 + .../simulator/res/values-ky/strings.xml | 20 + .../simulator/res/values-lo/strings.xml | 20 + .../simulator/res/values-lt/strings.xml | 20 + .../simulator/res/values-lv/strings.xml | 20 + .../simulator/res/values-mk/strings.xml | 20 + .../simulator/res/values-ml/strings.xml | 20 + .../simulator/res/values-mn/strings.xml | 20 + .../simulator/res/values-mr/strings.xml | 20 + .../simulator/res/values-ms/strings.xml | 20 + .../simulator/res/values-my/strings.xml | 20 + .../simulator/res/values-nb/strings.xml | 20 + .../simulator/res/values-ne/strings.xml | 20 + .../simulator/res/values-nl/strings.xml | 20 + .../simulator/res/values-no/strings.xml | 20 + .../simulator/res/values-pa/strings.xml | 20 + .../simulator/res/values-pl/strings.xml | 20 + .../simulator/res/values-pt-rBR/strings.xml | 20 + .../simulator/res/values-pt-rPT/strings.xml | 20 + .../simulator/res/values-pt/strings.xml | 20 + .../simulator/res/values-ro/strings.xml | 20 + .../simulator/res/values-ru/strings.xml | 20 + .../simulator/res/values-si/strings.xml | 20 + .../simulator/res/values-sk/strings.xml | 20 + .../simulator/res/values-sl/strings.xml | 20 + .../simulator/res/values-sq/strings.xml | 20 + .../simulator/res/values-sr/strings.xml | 20 + .../simulator/res/values-sv/strings.xml | 20 + .../simulator/res/values-sw/strings.xml | 20 + .../simulator/res/values-ta/strings.xml | 20 + .../simulator/res/values-te/strings.xml | 20 + .../simulator/res/values-th/strings.xml | 20 + .../simulator/res/values-tl/strings.xml | 20 + .../simulator/res/values-tr/strings.xml | 20 + .../simulator/res/values-uk/strings.xml | 20 + .../simulator/res/values-ur/strings.xml | 20 + .../simulator/res/values-uz/strings.xml | 20 + .../simulator/res/values-vi/strings.xml | 20 + .../simulator/res/values-zh-rCN/strings.xml | 20 + .../simulator/res/values-zh-rHK/strings.xml | 20 + .../simulator/res/values-zh-rTW/strings.xml | 20 + .../simulator/res/values-zu/strings.xml | 20 + .../enrichedcall/simulator/res/values/strings.xml | 21 + .../enrichedcall/stub/EnrichedCallManagerStub.java | 32 + .../videoshare/VideoShareListener.java | 1 + .../enrichedcall/videoshare/VideoShareSession.java | 39 + java/com/android/dialer/function/Supplier.java | 23 + .../android/dialer/inject/ApplicationContext.java | 22 + java/com/android/dialer/inject/ContextModule.java | 7 +- .../interactions/PhoneNumberInteraction.java | 42 +- .../res/layout/phone_disambig_item.xml | 0 .../dialer/interactions/res/values-bs/strings.xml | 4 +- .../dialer/interactions/res/values-uz/strings.xml | 2 +- .../android/dialer/lettertile/AndroidManifest.xml | 18 + .../dialer/lettertile/LetterTileDrawable.java | 439 ++++ .../dialer/lettertile/res/values/colors.xml | 40 + .../dialer/lettertile/res/values/dimens.xml | 20 + .../android/dialer/lightbringer/Lightbringer.java | 31 +- .../dialer/lightbringer/stub/LightbringerStub.java | 75 +- .../android/dialer/location/CountryDetector.java | 12 +- java/com/android/dialer/location/GeoUtil.java | 18 - .../android/dialer/logging/LoggingBindings.java | 25 +- .../dialer/logging/LoggingBindingsStub.java | 24 + .../dialer/logging/contact_lookup_result.proto | 42 +- .../android/dialer/logging/contact_source.proto | 3 + .../android/dialer/logging/dialer_impression.proto | 178 +- .../android/dialer/logging/interaction_event.proto | 22 + .../dialer/logging/people_api_lookup_error.proto | 19 + .../dialer/logging/reporting_location.proto | 3 + java/com/android/dialer/logging/screen_event.proto | 3 + java/com/android/dialer/logging/ui_action.proto | 45 + java/com/android/dialer/main/Main.java | 27 + java/com/android/dialer/main/MainComponent.java | 39 + .../android/dialer/main/impl/AndroidManifest.xml | 110 + .../com/android/dialer/main/impl/MainActivity.java | 95 + java/com/android/dialer/main/impl/MainImpl.java | 90 + java/com/android/dialer/main/impl/MainModule.java | 30 + .../android/dialer/main/impl/MainPagerAdapter.java | 84 + .../com/android/dialer/main/impl/StubFragment.java | 35 + .../res/drawable-xxxhdpi/nui_launcher_icon.png | Bin 0 -> 5554 bytes .../dialer/main/impl/res/layout/main_activity.xml | 68 + .../dialer/main/impl/res/layout/stub_fragment.xml | 27 + .../dialer/main/impl/res/menu/main_menu.xml | 47 + .../dialer/main/impl/res/values-af/strings.xml | 32 + .../dialer/main/impl/res/values-am/strings.xml | 32 + .../dialer/main/impl/res/values-ar/strings.xml | 32 + .../dialer/main/impl/res/values-az/strings.xml | 32 + .../main/impl/res/values-b+sr+Latn/strings.xml | 32 + .../dialer/main/impl/res/values-be/strings.xml | 32 + .../dialer/main/impl/res/values-bg/strings.xml | 32 + .../dialer/main/impl/res/values-bn/strings.xml | 32 + .../dialer/main/impl/res/values-bs/strings.xml | 32 + .../dialer/main/impl/res/values-ca/strings.xml | 32 + .../dialer/main/impl/res/values-cs/strings.xml | 32 + .../dialer/main/impl/res/values-da/strings.xml | 32 + .../dialer/main/impl/res/values-de/strings.xml | 32 + .../dialer/main/impl/res/values-el/strings.xml | 32 + .../dialer/main/impl/res/values-en-rAU/strings.xml | 32 + .../dialer/main/impl/res/values-en-rGB/strings.xml | 32 + .../dialer/main/impl/res/values-en-rIN/strings.xml | 32 + .../dialer/main/impl/res/values-es-rUS/strings.xml | 32 + .../dialer/main/impl/res/values-es/strings.xml | 32 + .../dialer/main/impl/res/values-et/strings.xml | 32 + .../dialer/main/impl/res/values-eu/strings.xml | 32 + .../dialer/main/impl/res/values-fa/strings.xml | 32 + .../dialer/main/impl/res/values-fi/strings.xml | 32 + .../dialer/main/impl/res/values-fr-rCA/strings.xml | 32 + .../dialer/main/impl/res/values-fr/strings.xml | 32 + .../dialer/main/impl/res/values-gl/strings.xml | 32 + .../dialer/main/impl/res/values-gu/strings.xml | 32 + .../dialer/main/impl/res/values-hi/strings.xml | 32 + .../dialer/main/impl/res/values-hr/strings.xml | 32 + .../dialer/main/impl/res/values-hu/strings.xml | 32 + .../dialer/main/impl/res/values-hy/strings.xml | 32 + .../dialer/main/impl/res/values-in/strings.xml | 32 + .../dialer/main/impl/res/values-is/strings.xml | 32 + .../dialer/main/impl/res/values-it/strings.xml | 32 + .../dialer/main/impl/res/values-iw/strings.xml | 32 + .../dialer/main/impl/res/values-ja/strings.xml | 32 + .../dialer/main/impl/res/values-ka/strings.xml | 32 + .../dialer/main/impl/res/values-kk/strings.xml | 32 + .../dialer/main/impl/res/values-km/strings.xml | 32 + .../dialer/main/impl/res/values-kn/strings.xml | 32 + .../dialer/main/impl/res/values-ko/strings.xml | 32 + .../dialer/main/impl/res/values-ky/strings.xml | 32 + .../dialer/main/impl/res/values-lo/strings.xml | 32 + .../dialer/main/impl/res/values-lt/strings.xml | 32 + .../dialer/main/impl/res/values-lv/strings.xml | 32 + .../dialer/main/impl/res/values-mk/strings.xml | 32 + .../dialer/main/impl/res/values-ml/strings.xml | 32 + .../dialer/main/impl/res/values-mn/strings.xml | 32 + .../dialer/main/impl/res/values-mr/strings.xml | 32 + .../dialer/main/impl/res/values-ms/strings.xml | 32 + .../dialer/main/impl/res/values-my/strings.xml | 32 + .../dialer/main/impl/res/values-nb/strings.xml | 32 + .../dialer/main/impl/res/values-ne/strings.xml | 32 + .../dialer/main/impl/res/values-nl/strings.xml | 32 + .../dialer/main/impl/res/values-no/strings.xml | 32 + .../dialer/main/impl/res/values-pa/strings.xml | 32 + .../dialer/main/impl/res/values-pl/strings.xml | 32 + .../dialer/main/impl/res/values-pt-rBR/strings.xml | 32 + .../dialer/main/impl/res/values-pt-rPT/strings.xml | 32 + .../dialer/main/impl/res/values-pt/strings.xml | 32 + .../dialer/main/impl/res/values-ro/strings.xml | 32 + .../dialer/main/impl/res/values-ru/strings.xml | 32 + .../dialer/main/impl/res/values-si/strings.xml | 32 + .../dialer/main/impl/res/values-sk/strings.xml | 32 + .../dialer/main/impl/res/values-sl/strings.xml | 32 + .../dialer/main/impl/res/values-sq/strings.xml | 32 + .../dialer/main/impl/res/values-sr/strings.xml | 32 + .../dialer/main/impl/res/values-sv/strings.xml | 32 + .../dialer/main/impl/res/values-sw/strings.xml | 32 + .../dialer/main/impl/res/values-ta/strings.xml | 32 + .../dialer/main/impl/res/values-te/strings.xml | 32 + .../dialer/main/impl/res/values-th/strings.xml | 32 + .../dialer/main/impl/res/values-tl/strings.xml | 32 + .../dialer/main/impl/res/values-tr/strings.xml | 32 + .../dialer/main/impl/res/values-uk/strings.xml | 32 + .../dialer/main/impl/res/values-ur/strings.xml | 32 + .../dialer/main/impl/res/values-uz/strings.xml | 32 + .../dialer/main/impl/res/values-vi/strings.xml | 32 + .../dialer/main/impl/res/values-zh-rCN/strings.xml | 32 + .../dialer/main/impl/res/values-zh-rHK/strings.xml | 32 + .../dialer/main/impl/res/values-zh-rTW/strings.xml | 32 + .../dialer/main/impl/res/values-zu/strings.xml | 32 + .../dialer/main/impl/res/values/strings.xml | 49 + .../android/dialer/main/impl/res/values/styles.xml | 28 + .../android/dialer/multimedia/MultimediaData.java | 6 + .../dialer/notification/AndroidManifest.xml | 16 +- .../notification/DialerNotificationManager.java | 125 + .../notification/GroupedNotificationUtil.java | 66 - .../dialer/notification/NotificationChannelId.java | 41 + .../notification/NotificationChannelManager.java | 456 +--- .../notification/NotificationManagerUtils.java | 41 + .../dialer/notification/NotificationThrottler.java | 126 + .../notification/PackageUpdatedReceiver.java | 37 - .../dialer/notification/VoicemailChannelUtils.java | 217 ++ .../dialer/notification/res/values-af/strings.xml | 1 - .../dialer/notification/res/values-am/strings.xml | 1 - .../dialer/notification/res/values-ar/strings.xml | 1 - .../dialer/notification/res/values-az/strings.xml | 1 - .../notification/res/values-b+sr+Latn/strings.xml | 1 - .../dialer/notification/res/values-be/strings.xml | 1 - .../dialer/notification/res/values-bg/strings.xml | 1 - .../dialer/notification/res/values-bn/strings.xml | 1 - .../dialer/notification/res/values-bs/strings.xml | 1 - .../dialer/notification/res/values-ca/strings.xml | 1 - .../dialer/notification/res/values-cs/strings.xml | 1 - .../dialer/notification/res/values-da/strings.xml | 1 - .../dialer/notification/res/values-de/strings.xml | 1 - .../dialer/notification/res/values-el/strings.xml | 1 - .../notification/res/values-en-rAU/strings.xml | 1 - .../notification/res/values-en-rGB/strings.xml | 1 - .../notification/res/values-en-rIN/strings.xml | 1 - .../notification/res/values-es-rUS/strings.xml | 1 - .../dialer/notification/res/values-es/strings.xml | 1 - .../dialer/notification/res/values-et/strings.xml | 1 - .../dialer/notification/res/values-eu/strings.xml | 1 - .../dialer/notification/res/values-fa/strings.xml | 1 - .../dialer/notification/res/values-fi/strings.xml | 1 - .../notification/res/values-fr-rCA/strings.xml | 1 - .../dialer/notification/res/values-fr/strings.xml | 1 - .../dialer/notification/res/values-gl/strings.xml | 1 - .../dialer/notification/res/values-gu/strings.xml | 1 - .../dialer/notification/res/values-hi/strings.xml | 1 - .../dialer/notification/res/values-hr/strings.xml | 1 - .../dialer/notification/res/values-hu/strings.xml | 1 - .../dialer/notification/res/values-hy/strings.xml | 1 - .../dialer/notification/res/values-in/strings.xml | 1 - .../dialer/notification/res/values-is/strings.xml | 1 - .../dialer/notification/res/values-it/strings.xml | 1 - .../dialer/notification/res/values-iw/strings.xml | 1 - .../dialer/notification/res/values-ja/strings.xml | 1 - .../dialer/notification/res/values-ka/strings.xml | 1 - .../dialer/notification/res/values-kk/strings.xml | 1 - .../dialer/notification/res/values-km/strings.xml | 1 - .../dialer/notification/res/values-kn/strings.xml | 1 - .../dialer/notification/res/values-ko/strings.xml | 1 - .../dialer/notification/res/values-ky/strings.xml | 1 - .../dialer/notification/res/values-lo/strings.xml | 1 - .../dialer/notification/res/values-lt/strings.xml | 1 - .../dialer/notification/res/values-lv/strings.xml | 1 - .../dialer/notification/res/values-mk/strings.xml | 1 - .../dialer/notification/res/values-ml/strings.xml | 1 - .../dialer/notification/res/values-mn/strings.xml | 1 - .../dialer/notification/res/values-mr/strings.xml | 1 - .../dialer/notification/res/values-ms/strings.xml | 1 - .../dialer/notification/res/values-my/strings.xml | 1 - .../dialer/notification/res/values-nb/strings.xml | 1 - .../dialer/notification/res/values-ne/strings.xml | 1 - .../dialer/notification/res/values-nl/strings.xml | 1 - .../dialer/notification/res/values-no/strings.xml | 1 - .../dialer/notification/res/values-pa/strings.xml | 1 - .../dialer/notification/res/values-pl/strings.xml | 1 - .../notification/res/values-pt-rBR/strings.xml | 1 - .../notification/res/values-pt-rPT/strings.xml | 1 - .../dialer/notification/res/values-pt/strings.xml | 1 - .../dialer/notification/res/values-ro/strings.xml | 1 - .../dialer/notification/res/values-ru/strings.xml | 1 - .../dialer/notification/res/values-si/strings.xml | 1 - .../dialer/notification/res/values-sk/strings.xml | 1 - .../dialer/notification/res/values-sl/strings.xml | 1 - .../dialer/notification/res/values-sq/strings.xml | 1 - .../dialer/notification/res/values-sr/strings.xml | 1 - .../dialer/notification/res/values-sv/strings.xml | 1 - .../dialer/notification/res/values-sw/strings.xml | 1 - .../dialer/notification/res/values-ta/strings.xml | 1 - .../dialer/notification/res/values-te/strings.xml | 1 - .../dialer/notification/res/values-th/strings.xml | 1 - .../dialer/notification/res/values-tl/strings.xml | 1 - .../dialer/notification/res/values-tr/strings.xml | 1 - .../dialer/notification/res/values-uk/strings.xml | 1 - .../dialer/notification/res/values-ur/strings.xml | 1 - .../dialer/notification/res/values-uz/strings.xml | 1 - .../dialer/notification/res/values-vi/strings.xml | 1 - .../notification/res/values-zh-rCN/strings.xml | 1 - .../notification/res/values-zh-rHK/strings.xml | 1 - .../notification/res/values-zh-rTW/strings.xml | 1 - .../dialer/notification/res/values-zu/strings.xml | 1 - .../android/dialer/notification/res/values/ids.xml | 27 - .../dialer/notification/res/values/strings.xml | 1 - .../android/dialer/oem/CequintCallerIdManager.java | 100 +- .../dialer/oem/MotorolaHiddenMenuKeySequence.java | 4 +- java/com/android/dialer/oem/MotorolaUtils.java | 27 +- .../res/values-mcc310-mnc000/motorola_config.xml | 17 +- .../res/values-mcc310-mnc120/motorola_config.xml | 17 +- .../res/values-mcc311-mnc490/motorola_config.xml | 17 +- .../res/values-mcc311-mnc870/motorola_config.xml | 17 +- .../res/values-mcc312-mnc530/motorola_config.xml | 17 +- .../res/values-mcc316-mnc010/motorola_config.xml | 17 +- .../dialer/oem/res/values/motorola_config.xml | 19 +- .../android/dialer/p13n/inference/P13nRanking.java | 2 +- .../performancereport/PerformanceReport.java | 160 ++ .../persistentlog/PersistentLogFileHandler.java | 61 +- .../dialer/persistentlog/PersistentLogger.java | 15 +- .../CachedNumberLookupService.java | 2 + .../dialer/phonenumbercache/CallLogQuery.java | 18 + .../dialer/phonenumbercache/ContactInfo.java | 6 +- .../dialer/phonenumbercache/ContactInfoHelper.java | 37 +- .../phonenumbergeoutil/PhoneNumberGeoUtil.java | 24 + .../PhoneNumberGeoUtilComponent.java | 39 + .../impl/PhoneNumberGeoUtilImpl.java | 77 + .../impl/PhoneNumberGeoUtilModule.java | 31 + .../stub/PhoneNumberGeoUtilStub.java | 32 + .../stub/StubPhoneNumberGeoUtilModule.java | 30 + .../android/dialer/phonenumberproto/Converter.java | 120 + .../phonenumberproto/DialerPhoneNumberUtil.java | 108 + .../phonenumberproto/dialer_phone_number.proto | 173 ++ .../dialer/phonenumberutil/PhoneNumberHelper.java | 46 +- .../android/dialer/postcall/AndroidManifest.xml | 7 +- java/com/android/dialer/postcall/PostCall.java | 60 +- .../postcall/res/layout/post_call_activity.xml | 23 +- java/com/android/dialer/protos/ProtoParsers.java | 145 +- java/com/android/dialer/searchfragment/README.md | 62 + .../searchfragment/common/AndroidManifest.xml | 16 + .../dialer/searchfragment/common/Projections.java | 52 + .../searchfragment/common/QueryBoldingUtil.java | 151 ++ .../searchfragment/common/QueryFilteringUtil.java | 167 ++ .../searchfragment/common/RowClickListener.java | 43 + .../dialer/searchfragment/common/SearchCursor.java | 38 + .../common/res/layout/search_contact_row.xml | 69 + .../searchfragment/common/res/values/dimens.xml | 22 + .../dialer/searchfragment/cp2/AndroidManifest.xml | 16 + .../searchfragment/cp2/ContactFilterCursor.java | 393 ++++ .../cp2/SearchContactViewHolder.java | 299 +++ .../searchfragment/cp2/SearchContactsCursor.java | 64 + .../cp2/SearchContactsCursorLoader.java | 52 + .../searchfragment/cp2/res/values-af/strings.xml | 21 + .../searchfragment/cp2/res/values-am/strings.xml | 21 + .../searchfragment/cp2/res/values-ar/strings.xml | 21 + .../searchfragment/cp2/res/values-az/strings.xml | 21 + .../cp2/res/values-b+sr+Latn/strings.xml | 21 + .../searchfragment/cp2/res/values-be/strings.xml | 21 + .../searchfragment/cp2/res/values-bg/strings.xml | 21 + .../searchfragment/cp2/res/values-bn/strings.xml | 21 + .../searchfragment/cp2/res/values-bs/strings.xml | 21 + .../searchfragment/cp2/res/values-ca/strings.xml | 21 + .../searchfragment/cp2/res/values-cs/strings.xml | 21 + .../searchfragment/cp2/res/values-da/strings.xml | 21 + .../searchfragment/cp2/res/values-de/strings.xml | 21 + .../searchfragment/cp2/res/values-el/strings.xml | 21 + .../cp2/res/values-en-rAU/strings.xml | 21 + .../cp2/res/values-en-rGB/strings.xml | 21 + .../cp2/res/values-en-rIN/strings.xml | 21 + .../cp2/res/values-es-rUS/strings.xml | 21 + .../searchfragment/cp2/res/values-es/strings.xml | 21 + .../searchfragment/cp2/res/values-et/strings.xml | 21 + .../searchfragment/cp2/res/values-eu/strings.xml | 21 + .../searchfragment/cp2/res/values-fa/strings.xml | 21 + .../searchfragment/cp2/res/values-fi/strings.xml | 21 + .../cp2/res/values-fr-rCA/strings.xml | 21 + .../searchfragment/cp2/res/values-fr/strings.xml | 21 + .../searchfragment/cp2/res/values-gl/strings.xml | 21 + .../searchfragment/cp2/res/values-gu/strings.xml | 21 + .../searchfragment/cp2/res/values-hi/strings.xml | 21 + .../searchfragment/cp2/res/values-hr/strings.xml | 21 + .../searchfragment/cp2/res/values-hu/strings.xml | 21 + .../searchfragment/cp2/res/values-hy/strings.xml | 21 + .../searchfragment/cp2/res/values-in/strings.xml | 21 + .../searchfragment/cp2/res/values-is/strings.xml | 21 + .../searchfragment/cp2/res/values-it/strings.xml | 21 + .../searchfragment/cp2/res/values-iw/strings.xml | 21 + .../searchfragment/cp2/res/values-ja/strings.xml | 21 + .../searchfragment/cp2/res/values-ka/strings.xml | 21 + .../searchfragment/cp2/res/values-kk/strings.xml | 21 + .../searchfragment/cp2/res/values-km/strings.xml | 21 + .../searchfragment/cp2/res/values-kn/strings.xml | 21 + .../searchfragment/cp2/res/values-ko/strings.xml | 21 + .../searchfragment/cp2/res/values-ky/strings.xml | 21 + .../searchfragment/cp2/res/values-lo/strings.xml | 21 + .../searchfragment/cp2/res/values-lt/strings.xml | 21 + .../searchfragment/cp2/res/values-lv/strings.xml | 21 + .../searchfragment/cp2/res/values-mk/strings.xml | 21 + .../searchfragment/cp2/res/values-ml/strings.xml | 21 + .../searchfragment/cp2/res/values-mn/strings.xml | 21 + .../searchfragment/cp2/res/values-mr/strings.xml | 21 + .../searchfragment/cp2/res/values-ms/strings.xml | 21 + .../searchfragment/cp2/res/values-my/strings.xml | 21 + .../searchfragment/cp2/res/values-nb/strings.xml | 21 + .../searchfragment/cp2/res/values-ne/strings.xml | 21 + .../searchfragment/cp2/res/values-nl/strings.xml | 21 + .../searchfragment/cp2/res/values-no/strings.xml | 21 + .../searchfragment/cp2/res/values-pa/strings.xml | 21 + .../searchfragment/cp2/res/values-pl/strings.xml | 21 + .../cp2/res/values-pt-rBR/strings.xml | 21 + .../cp2/res/values-pt-rPT/strings.xml | 21 + .../searchfragment/cp2/res/values-pt/strings.xml | 21 + .../searchfragment/cp2/res/values-ro/strings.xml | 21 + .../searchfragment/cp2/res/values-ru/strings.xml | 21 + .../searchfragment/cp2/res/values-si/strings.xml | 21 + .../searchfragment/cp2/res/values-sk/strings.xml | 21 + .../searchfragment/cp2/res/values-sl/strings.xml | 21 + .../searchfragment/cp2/res/values-sq/strings.xml | 21 + .../searchfragment/cp2/res/values-sr/strings.xml | 21 + .../searchfragment/cp2/res/values-sv/strings.xml | 21 + .../searchfragment/cp2/res/values-sw/strings.xml | 21 + .../searchfragment/cp2/res/values-ta/strings.xml | 21 + .../searchfragment/cp2/res/values-te/strings.xml | 21 + .../searchfragment/cp2/res/values-th/strings.xml | 21 + .../searchfragment/cp2/res/values-tl/strings.xml | 21 + .../searchfragment/cp2/res/values-tr/strings.xml | 21 + .../searchfragment/cp2/res/values-uk/strings.xml | 21 + .../searchfragment/cp2/res/values-ur/strings.xml | 21 + .../searchfragment/cp2/res/values-uz/strings.xml | 21 + .../searchfragment/cp2/res/values-vi/strings.xml | 21 + .../cp2/res/values-zh-rCN/strings.xml | 21 + .../cp2/res/values-zh-rHK/strings.xml | 21 + .../cp2/res/values-zh-rTW/strings.xml | 21 + .../searchfragment/cp2/res/values-zu/strings.xml | 21 + .../searchfragment/cp2/res/values/strings.xml | 20 + .../dialer/searchfragment/list/AndroidManifest.xml | 16 + .../searchfragment/list/HeaderViewHolder.java | 36 + .../searchfragment/list/NewSearchFragment.java | 300 +++ .../dialer/searchfragment/list/SearchAdapter.java | 179 ++ .../searchfragment/list/SearchCursorManager.java | 246 ++ .../list/res/layout/fragment_search.xml | 34 + .../list/res/layout/header_layout.xml | 23 + .../searchfragment/list/res/values-af/strings.xml | 21 + .../searchfragment/list/res/values-am/strings.xml | 21 + .../searchfragment/list/res/values-ar/strings.xml | 21 + .../searchfragment/list/res/values-az/strings.xml | 21 + .../list/res/values-b+sr+Latn/strings.xml | 21 + .../searchfragment/list/res/values-be/strings.xml | 21 + .../searchfragment/list/res/values-bg/strings.xml | 21 + .../searchfragment/list/res/values-bn/strings.xml | 21 + .../searchfragment/list/res/values-bs/strings.xml | 21 + .../searchfragment/list/res/values-ca/strings.xml | 21 + .../searchfragment/list/res/values-cs/strings.xml | 21 + .../searchfragment/list/res/values-da/strings.xml | 21 + .../searchfragment/list/res/values-de/strings.xml | 21 + .../searchfragment/list/res/values-el/strings.xml | 21 + .../list/res/values-en-rAU/strings.xml | 21 + .../list/res/values-en-rGB/strings.xml | 21 + .../list/res/values-en-rIN/strings.xml | 21 + .../list/res/values-es-rUS/strings.xml | 21 + .../searchfragment/list/res/values-es/strings.xml | 21 + .../searchfragment/list/res/values-et/strings.xml | 21 + .../searchfragment/list/res/values-eu/strings.xml | 21 + .../searchfragment/list/res/values-fa/strings.xml | 21 + .../searchfragment/list/res/values-fi/strings.xml | 21 + .../list/res/values-fr-rCA/strings.xml | 21 + .../searchfragment/list/res/values-fr/strings.xml | 21 + .../searchfragment/list/res/values-gl/strings.xml | 21 + .../searchfragment/list/res/values-gu/strings.xml | 21 + .../searchfragment/list/res/values-hi/strings.xml | 21 + .../searchfragment/list/res/values-hr/strings.xml | 21 + .../searchfragment/list/res/values-hu/strings.xml | 21 + .../searchfragment/list/res/values-hy/strings.xml | 21 + .../searchfragment/list/res/values-in/strings.xml | 21 + .../searchfragment/list/res/values-is/strings.xml | 21 + .../searchfragment/list/res/values-it/strings.xml | 21 + .../searchfragment/list/res/values-iw/strings.xml | 21 + .../searchfragment/list/res/values-ja/strings.xml | 21 + .../searchfragment/list/res/values-ka/strings.xml | 21 + .../searchfragment/list/res/values-kk/strings.xml | 21 + .../searchfragment/list/res/values-km/strings.xml | 21 + .../searchfragment/list/res/values-kn/strings.xml | 21 + .../searchfragment/list/res/values-ko/strings.xml | 21 + .../searchfragment/list/res/values-ky/strings.xml | 21 + .../searchfragment/list/res/values-lo/strings.xml | 21 + .../searchfragment/list/res/values-lt/strings.xml | 21 + .../searchfragment/list/res/values-lv/strings.xml | 21 + .../searchfragment/list/res/values-mk/strings.xml | 21 + .../searchfragment/list/res/values-ml/strings.xml | 21 + .../searchfragment/list/res/values-mn/strings.xml | 21 + .../searchfragment/list/res/values-mr/strings.xml | 22 + .../searchfragment/list/res/values-ms/strings.xml | 21 + .../searchfragment/list/res/values-my/strings.xml | 21 + .../searchfragment/list/res/values-nb/strings.xml | 21 + .../searchfragment/list/res/values-ne/strings.xml | 21 + .../searchfragment/list/res/values-nl/strings.xml | 21 + .../searchfragment/list/res/values-no/strings.xml | 21 + .../searchfragment/list/res/values-pa/strings.xml | 21 + .../searchfragment/list/res/values-pl/strings.xml | 21 + .../list/res/values-pt-rBR/strings.xml | 21 + .../list/res/values-pt-rPT/strings.xml | 21 + .../searchfragment/list/res/values-pt/strings.xml | 21 + .../searchfragment/list/res/values-ro/strings.xml | 21 + .../searchfragment/list/res/values-ru/strings.xml | 21 + .../searchfragment/list/res/values-si/strings.xml | 21 + .../searchfragment/list/res/values-sk/strings.xml | 21 + .../searchfragment/list/res/values-sl/strings.xml | 21 + .../searchfragment/list/res/values-sq/strings.xml | 21 + .../searchfragment/list/res/values-sr/strings.xml | 21 + .../searchfragment/list/res/values-sv/strings.xml | 21 + .../searchfragment/list/res/values-sw/strings.xml | 21 + .../searchfragment/list/res/values-ta/strings.xml | 21 + .../searchfragment/list/res/values-te/strings.xml | 21 + .../searchfragment/list/res/values-th/strings.xml | 21 + .../searchfragment/list/res/values-tl/strings.xml | 21 + .../searchfragment/list/res/values-tr/strings.xml | 21 + .../searchfragment/list/res/values-uk/strings.xml | 21 + .../searchfragment/list/res/values-ur/strings.xml | 21 + .../searchfragment/list/res/values-uz/strings.xml | 21 + .../searchfragment/list/res/values-vi/strings.xml | 21 + .../list/res/values-zh-rCN/strings.xml | 21 + .../list/res/values-zh-rHK/strings.xml | 21 + .../list/res/values-zh-rTW/strings.xml | 21 + .../searchfragment/list/res/values-zu/strings.xml | 21 + .../searchfragment/list/res/values/strings.xml | 20 + .../nearbyplaces/AndroidManifest.xml | 16 + .../nearbyplaces/NearbyPlaceViewHolder.java | 90 + .../nearbyplaces/NearbyPlacesCursor.java | 64 + .../nearbyplaces/NearbyPlacesCursorLoader.java | 49 + .../nearbyplaces/res/values-af/strings.xml | 21 + .../nearbyplaces/res/values-am/strings.xml | 21 + .../nearbyplaces/res/values-ar/strings.xml | 21 + .../nearbyplaces/res/values-az/strings.xml | 21 + .../nearbyplaces/res/values-b+sr+Latn/strings.xml | 21 + .../nearbyplaces/res/values-be/strings.xml | 21 + .../nearbyplaces/res/values-bg/strings.xml | 21 + .../nearbyplaces/res/values-bn/strings.xml | 21 + .../nearbyplaces/res/values-bs/strings.xml | 21 + .../nearbyplaces/res/values-ca/strings.xml | 21 + .../nearbyplaces/res/values-cs/strings.xml | 21 + .../nearbyplaces/res/values-da/strings.xml | 21 + .../nearbyplaces/res/values-de/strings.xml | 21 + .../nearbyplaces/res/values-el/strings.xml | 21 + .../nearbyplaces/res/values-en-rAU/strings.xml | 21 + .../nearbyplaces/res/values-en-rGB/strings.xml | 21 + .../nearbyplaces/res/values-en-rIN/strings.xml | 21 + .../nearbyplaces/res/values-es-rUS/strings.xml | 21 + .../nearbyplaces/res/values-es/strings.xml | 21 + .../nearbyplaces/res/values-et/strings.xml | 21 + .../nearbyplaces/res/values-eu/strings.xml | 21 + .../nearbyplaces/res/values-fa/strings.xml | 21 + .../nearbyplaces/res/values-fi/strings.xml | 21 + .../nearbyplaces/res/values-fr-rCA/strings.xml | 21 + .../nearbyplaces/res/values-fr/strings.xml | 21 + .../nearbyplaces/res/values-gl/strings.xml | 21 + .../nearbyplaces/res/values-gu/strings.xml | 21 + .../nearbyplaces/res/values-hi/strings.xml | 21 + .../nearbyplaces/res/values-hr/strings.xml | 21 + .../nearbyplaces/res/values-hu/strings.xml | 21 + .../nearbyplaces/res/values-hy/strings.xml | 21 + .../nearbyplaces/res/values-in/strings.xml | 21 + .../nearbyplaces/res/values-is/strings.xml | 21 + .../nearbyplaces/res/values-it/strings.xml | 21 + .../nearbyplaces/res/values-iw/strings.xml | 21 + .../nearbyplaces/res/values-ja/strings.xml | 21 + .../nearbyplaces/res/values-ka/strings.xml | 21 + .../nearbyplaces/res/values-kk/strings.xml | 21 + .../nearbyplaces/res/values-km/strings.xml | 21 + .../nearbyplaces/res/values-kn/strings.xml | 21 + .../nearbyplaces/res/values-ko/strings.xml | 21 + .../nearbyplaces/res/values-ky/strings.xml | 21 + .../nearbyplaces/res/values-lo/strings.xml | 21 + .../nearbyplaces/res/values-lt/strings.xml | 21 + .../nearbyplaces/res/values-lv/strings.xml | 21 + .../nearbyplaces/res/values-mk/strings.xml | 21 + .../nearbyplaces/res/values-ml/strings.xml | 21 + .../nearbyplaces/res/values-mn/strings.xml | 21 + .../nearbyplaces/res/values-mr/strings.xml | 21 + .../nearbyplaces/res/values-ms/strings.xml | 21 + .../nearbyplaces/res/values-my/strings.xml | 21 + .../nearbyplaces/res/values-nb/strings.xml | 21 + .../nearbyplaces/res/values-ne/strings.xml | 21 + .../nearbyplaces/res/values-nl/strings.xml | 21 + .../nearbyplaces/res/values-no/strings.xml | 21 + .../nearbyplaces/res/values-pa/strings.xml | 21 + .../nearbyplaces/res/values-pl/strings.xml | 21 + .../nearbyplaces/res/values-pt-rBR/strings.xml | 21 + .../nearbyplaces/res/values-pt-rPT/strings.xml | 21 + .../nearbyplaces/res/values-pt/strings.xml | 21 + .../nearbyplaces/res/values-ro/strings.xml | 21 + .../nearbyplaces/res/values-ru/strings.xml | 21 + .../nearbyplaces/res/values-si/strings.xml | 21 + .../nearbyplaces/res/values-sk/strings.xml | 21 + .../nearbyplaces/res/values-sl/strings.xml | 21 + .../nearbyplaces/res/values-sq/strings.xml | 21 + .../nearbyplaces/res/values-sr/strings.xml | 21 + .../nearbyplaces/res/values-sv/strings.xml | 21 + .../nearbyplaces/res/values-sw/strings.xml | 21 + .../nearbyplaces/res/values-ta/strings.xml | 21 + .../nearbyplaces/res/values-te/strings.xml | 21 + .../nearbyplaces/res/values-th/strings.xml | 21 + .../nearbyplaces/res/values-tl/strings.xml | 21 + .../nearbyplaces/res/values-tr/strings.xml | 21 + .../nearbyplaces/res/values-uk/strings.xml | 21 + .../nearbyplaces/res/values-ur/strings.xml | 21 + .../nearbyplaces/res/values-uz/strings.xml | 21 + .../nearbyplaces/res/values-vi/strings.xml | 21 + .../nearbyplaces/res/values-zh-rCN/strings.xml | 21 + .../nearbyplaces/res/values-zh-rHK/strings.xml | 21 + .../nearbyplaces/res/values-zh-rTW/strings.xml | 21 + .../nearbyplaces/res/values-zu/strings.xml | 21 + .../nearbyplaces/res/values/strings.xml | 20 + .../searchfragment/remote/AndroidManifest.xml | 16 + .../remote/RemoteContactViewHolder.java | 133 ++ .../remote/RemoteContactsCursor.java | 105 + .../remote/RemoteContactsCursorLoader.java | 106 + .../remote/RemoteDirectoriesCursorLoader.java | 77 + .../remote/res/values-af/strings.xml | 21 + .../remote/res/values-am/strings.xml | 21 + .../remote/res/values-ar/strings.xml | 21 + .../remote/res/values-az/strings.xml | 21 + .../remote/res/values-b+sr+Latn/strings.xml | 21 + .../remote/res/values-be/strings.xml | 21 + .../remote/res/values-bg/strings.xml | 21 + .../remote/res/values-bn/strings.xml | 21 + .../remote/res/values-bs/strings.xml | 21 + .../remote/res/values-ca/strings.xml | 21 + .../remote/res/values-cs/strings.xml | 21 + .../remote/res/values-da/strings.xml | 21 + .../remote/res/values-de/strings.xml | 21 + .../remote/res/values-el/strings.xml | 21 + .../remote/res/values-en-rAU/strings.xml | 21 + .../remote/res/values-en-rGB/strings.xml | 21 + .../remote/res/values-en-rIN/strings.xml | 21 + .../remote/res/values-es-rUS/strings.xml | 21 + .../remote/res/values-es/strings.xml | 21 + .../remote/res/values-et/strings.xml | 21 + .../remote/res/values-eu/strings.xml | 21 + .../remote/res/values-fa/strings.xml | 21 + .../remote/res/values-fi/strings.xml | 21 + .../remote/res/values-fr-rCA/strings.xml | 21 + .../remote/res/values-fr/strings.xml | 21 + .../remote/res/values-gl/strings.xml | 21 + .../remote/res/values-gu/strings.xml | 21 + .../remote/res/values-hi/strings.xml | 21 + .../remote/res/values-hr/strings.xml | 21 + .../remote/res/values-hu/strings.xml | 21 + .../remote/res/values-hy/strings.xml | 21 + .../remote/res/values-in/strings.xml | 21 + .../remote/res/values-is/strings.xml | 21 + .../remote/res/values-it/strings.xml | 21 + .../remote/res/values-iw/strings.xml | 21 + .../remote/res/values-ja/strings.xml | 21 + .../remote/res/values-ka/strings.xml | 21 + .../remote/res/values-kk/strings.xml | 21 + .../remote/res/values-km/strings.xml | 21 + .../remote/res/values-kn/strings.xml | 21 + .../remote/res/values-ko/strings.xml | 21 + .../remote/res/values-ky/strings.xml | 21 + .../remote/res/values-lo/strings.xml | 21 + .../remote/res/values-lt/strings.xml | 21 + .../remote/res/values-lv/strings.xml | 21 + .../remote/res/values-mk/strings.xml | 21 + .../remote/res/values-ml/strings.xml | 21 + .../remote/res/values-mn/strings.xml | 21 + .../remote/res/values-mr/strings.xml | 21 + .../remote/res/values-ms/strings.xml | 21 + .../remote/res/values-my/strings.xml | 21 + .../remote/res/values-nb/strings.xml | 21 + .../remote/res/values-ne/strings.xml | 21 + .../remote/res/values-nl/strings.xml | 21 + .../remote/res/values-no/strings.xml | 21 + .../remote/res/values-pa/strings.xml | 21 + .../remote/res/values-pl/strings.xml | 21 + .../remote/res/values-pt-rBR/strings.xml | 21 + .../remote/res/values-pt-rPT/strings.xml | 21 + .../remote/res/values-pt/strings.xml | 21 + .../remote/res/values-ro/strings.xml | 21 + .../remote/res/values-ru/strings.xml | 21 + .../remote/res/values-si/strings.xml | 21 + .../remote/res/values-sk/strings.xml | 21 + .../remote/res/values-sl/strings.xml | 21 + .../remote/res/values-sq/strings.xml | 21 + .../remote/res/values-sr/strings.xml | 21 + .../remote/res/values-sv/strings.xml | 21 + .../remote/res/values-sw/strings.xml | 21 + .../remote/res/values-ta/strings.xml | 21 + .../remote/res/values-te/strings.xml | 21 + .../remote/res/values-th/strings.xml | 21 + .../remote/res/values-tl/strings.xml | 21 + .../remote/res/values-tr/strings.xml | 21 + .../remote/res/values-uk/strings.xml | 21 + .../remote/res/values-ur/strings.xml | 21 + .../remote/res/values-uz/strings.xml | 21 + .../remote/res/values-vi/strings.xml | 21 + .../remote/res/values-zh-rCN/strings.xml | 21 + .../remote/res/values-zh-rHK/strings.xml | 21 + .../remote/res/values-zh-rTW/strings.xml | 21 + .../remote/res/values-zu/strings.xml | 21 + .../searchfragment/remote/res/values/strings.xml | 20 + .../searchfragment/testing/TestSearchCursor.java | 47 + .../android/dialer/shortcuts/AndroidManifest.xml | 2 +- .../dialer/shortcuts/CallContactActivity.java | 1 + java/com/android/dialer/shortcuts/IconFactory.java | 39 +- .../dialer/shortcuts/ShortcutRefresher.java | 31 +- java/com/android/dialer/shortcuts/Shortcuts.java | 2 +- .../ic_shortcut_add_contact.xml | 21 + .../res/drawable/ic_add_contact_foreground.xml | 23 + .../android/dialer/shortcuts/res/values/dimens.xml | 1 + .../dialer/shortcuts/res/values/strings.xml | 6 +- .../simulator/impl/SimulatorActionProvider.java | 41 +- .../dialer/simulator/impl/SimulatorCallLog.java | 139 -- .../simulator/impl/SimulatorConnectionService.java | 108 +- .../dialer/simulator/impl/SimulatorContacts.java | 319 --- .../simulator/impl/SimulatorMissedCallCreator.java | 87 + .../simulator/impl/SimulatorNotifications.java | 118 + .../simulator/impl/SimulatorSpamCallCreator.java | 151 ++ .../dialer/simulator/impl/SimulatorVoiceCall.java | 17 +- .../dialer/simulator/impl/SimulatorVoicemail.java | 154 -- .../android/dialer/smartdial/SmartDialPrefix.java | 3 +- .../dialer/speeddial/SpeedDialFragment.java | 4 +- .../android/dialer/storage/DeviceProtected.java | 22 + .../android/dialer/storage/StorageComponent.java | 40 + java/com/android/dialer/storage/StorageModule.java | 46 + .../dialer/strictmode/DialerStrictMode.java | 147 ++ .../android/dialer/strictmode/StrictModeUtils.java | 120 + java/com/android/dialer/telecom/TelecomUtil.java | 110 +- .../dialer/theme/res/animator/button_elevation.xml | 21 - .../theme/res/drawable-hdpi/ic_block_24dp.png | Bin 478 -> 0 bytes .../android/dialer/theme/res/values-af/strings.xml | 1 + .../android/dialer/theme/res/values-am/strings.xml | 1 + .../android/dialer/theme/res/values-ar/strings.xml | 1 + .../android/dialer/theme/res/values-az/strings.xml | 1 + .../dialer/theme/res/values-b+sr+Latn/strings.xml | 1 + .../android/dialer/theme/res/values-be/strings.xml | 1 + .../android/dialer/theme/res/values-bg/strings.xml | 1 + .../android/dialer/theme/res/values-bn/strings.xml | 1 + .../android/dialer/theme/res/values-bs/strings.xml | 1 + .../android/dialer/theme/res/values-ca/strings.xml | 1 + .../android/dialer/theme/res/values-cs/strings.xml | 1 + .../android/dialer/theme/res/values-da/strings.xml | 1 + .../android/dialer/theme/res/values-de/strings.xml | 1 + .../android/dialer/theme/res/values-el/strings.xml | 1 + .../dialer/theme/res/values-en-rAU/strings.xml | 1 + .../dialer/theme/res/values-en-rGB/strings.xml | 1 + .../dialer/theme/res/values-en-rIN/strings.xml | 1 + .../dialer/theme/res/values-es-rUS/strings.xml | 1 + .../android/dialer/theme/res/values-es/strings.xml | 1 + .../android/dialer/theme/res/values-et/strings.xml | 1 + .../android/dialer/theme/res/values-eu/strings.xml | 1 + .../android/dialer/theme/res/values-fa/strings.xml | 1 + .../android/dialer/theme/res/values-fi/strings.xml | 1 + .../dialer/theme/res/values-fr-rCA/strings.xml | 1 + .../android/dialer/theme/res/values-fr/strings.xml | 1 + .../android/dialer/theme/res/values-gl/strings.xml | 1 + .../android/dialer/theme/res/values-gu/strings.xml | 1 + .../android/dialer/theme/res/values-hi/strings.xml | 1 + .../android/dialer/theme/res/values-hr/strings.xml | 1 + .../android/dialer/theme/res/values-hu/strings.xml | 1 + .../android/dialer/theme/res/values-hy/strings.xml | 1 + .../android/dialer/theme/res/values-in/strings.xml | 1 + .../android/dialer/theme/res/values-is/strings.xml | 1 + .../android/dialer/theme/res/values-it/strings.xml | 1 + .../android/dialer/theme/res/values-iw/strings.xml | 1 + .../android/dialer/theme/res/values-ja/strings.xml | 1 + .../android/dialer/theme/res/values-ka/strings.xml | 1 + .../android/dialer/theme/res/values-kk/strings.xml | 1 + .../android/dialer/theme/res/values-km/strings.xml | 1 + .../android/dialer/theme/res/values-kn/strings.xml | 1 + .../android/dialer/theme/res/values-ko/strings.xml | 1 + .../android/dialer/theme/res/values-ky/strings.xml | 1 + .../android/dialer/theme/res/values-lo/strings.xml | 1 + .../android/dialer/theme/res/values-lt/strings.xml | 1 + .../android/dialer/theme/res/values-lv/strings.xml | 1 + .../android/dialer/theme/res/values-mk/strings.xml | 1 + .../android/dialer/theme/res/values-ml/strings.xml | 1 + .../android/dialer/theme/res/values-mn/strings.xml | 1 + .../android/dialer/theme/res/values-mr/strings.xml | 1 + .../android/dialer/theme/res/values-ms/strings.xml | 1 + .../android/dialer/theme/res/values-my/strings.xml | 1 + .../android/dialer/theme/res/values-nb/strings.xml | 1 + .../android/dialer/theme/res/values-ne/strings.xml | 1 + .../android/dialer/theme/res/values-nl/strings.xml | 1 + .../android/dialer/theme/res/values-no/strings.xml | 1 + .../android/dialer/theme/res/values-pa/strings.xml | 1 + .../android/dialer/theme/res/values-pl/strings.xml | 1 + .../dialer/theme/res/values-pt-rBR/strings.xml | 1 + .../dialer/theme/res/values-pt-rPT/strings.xml | 1 + .../android/dialer/theme/res/values-pt/strings.xml | 1 + .../android/dialer/theme/res/values-ro/strings.xml | 1 + .../android/dialer/theme/res/values-ru/strings.xml | 1 + .../android/dialer/theme/res/values-si/strings.xml | 1 + .../android/dialer/theme/res/values-sk/strings.xml | 1 + .../android/dialer/theme/res/values-sl/strings.xml | 1 + .../android/dialer/theme/res/values-sq/strings.xml | 1 + .../android/dialer/theme/res/values-sr/strings.xml | 1 + .../android/dialer/theme/res/values-sv/strings.xml | 1 + .../android/dialer/theme/res/values-sw/strings.xml | 1 + .../android/dialer/theme/res/values-ta/strings.xml | 1 + .../android/dialer/theme/res/values-te/strings.xml | 1 + .../android/dialer/theme/res/values-th/strings.xml | 1 + .../android/dialer/theme/res/values-tl/strings.xml | 1 + .../android/dialer/theme/res/values-tr/strings.xml | 1 + .../android/dialer/theme/res/values-uk/strings.xml | 1 + .../android/dialer/theme/res/values-ur/strings.xml | 1 + .../android/dialer/theme/res/values-uz/strings.xml | 1 + .../android/dialer/theme/res/values-vi/strings.xml | 1 + .../dialer/theme/res/values-zh-rCN/strings.xml | 1 + .../dialer/theme/res/values-zh-rHK/strings.xml | 1 + .../dialer/theme/res/values-zh-rTW/strings.xml | 1 + .../android/dialer/theme/res/values-zu/strings.xml | 1 + .../com/android/dialer/theme/res/values/colors.xml | 1 - .../com/android/dialer/theme/res/values/dimens.xml | 19 +- .../android/dialer/theme/res/values/strings.xml | 3 + .../com/android/dialer/theme/res/values/themes.xml | 43 + java/com/android/dialer/time/Clock.java | 23 + java/com/android/dialer/util/CallUtil.java | 22 +- java/com/android/dialer/util/DialerUtils.java | 14 +- java/com/android/dialer/util/IntentUtil.java | 3 +- java/com/android/dialer/util/PermissionsUtil.java | 86 + java/com/android/dialer/util/UriUtils.java | 92 + .../android/dialer/util/res/values-af/strings.xml | 1 + .../android/dialer/util/res/values-am/strings.xml | 1 + .../android/dialer/util/res/values-ar/strings.xml | 1 + .../android/dialer/util/res/values-az/strings.xml | 1 + .../dialer/util/res/values-b+sr+Latn/strings.xml | 1 + .../android/dialer/util/res/values-be/strings.xml | 1 + .../android/dialer/util/res/values-bg/strings.xml | 1 + .../android/dialer/util/res/values-bn/strings.xml | 1 + .../android/dialer/util/res/values-bs/strings.xml | 1 + .../android/dialer/util/res/values-ca/strings.xml | 1 + .../android/dialer/util/res/values-cs/strings.xml | 1 + .../android/dialer/util/res/values-da/strings.xml | 1 + .../android/dialer/util/res/values-de/strings.xml | 1 + .../android/dialer/util/res/values-el/strings.xml | 1 + .../dialer/util/res/values-en-rAU/strings.xml | 1 + .../dialer/util/res/values-en-rGB/strings.xml | 1 + .../dialer/util/res/values-en-rIN/strings.xml | 1 + .../dialer/util/res/values-es-rUS/strings.xml | 1 + .../android/dialer/util/res/values-es/strings.xml | 1 + .../android/dialer/util/res/values-et/strings.xml | 1 + .../android/dialer/util/res/values-eu/strings.xml | 1 + .../android/dialer/util/res/values-fa/strings.xml | 1 + .../android/dialer/util/res/values-fi/strings.xml | 1 + .../dialer/util/res/values-fr-rCA/strings.xml | 1 + .../android/dialer/util/res/values-fr/strings.xml | 1 + .../android/dialer/util/res/values-gl/strings.xml | 1 + .../android/dialer/util/res/values-gu/strings.xml | 1 + .../android/dialer/util/res/values-hi/strings.xml | 1 + .../android/dialer/util/res/values-hr/strings.xml | 1 + .../android/dialer/util/res/values-hu/strings.xml | 1 + .../android/dialer/util/res/values-hy/strings.xml | 1 + .../android/dialer/util/res/values-in/strings.xml | 1 + .../android/dialer/util/res/values-is/strings.xml | 1 + .../android/dialer/util/res/values-it/strings.xml | 1 + .../android/dialer/util/res/values-iw/strings.xml | 1 + .../android/dialer/util/res/values-ja/strings.xml | 1 + .../android/dialer/util/res/values-ka/strings.xml | 1 + .../android/dialer/util/res/values-kk/strings.xml | 1 + .../android/dialer/util/res/values-km/strings.xml | 1 + .../android/dialer/util/res/values-kn/strings.xml | 1 + .../android/dialer/util/res/values-ko/strings.xml | 1 + .../android/dialer/util/res/values-ky/strings.xml | 1 + .../android/dialer/util/res/values-lo/strings.xml | 1 + .../android/dialer/util/res/values-lt/strings.xml | 1 + .../android/dialer/util/res/values-lv/strings.xml | 1 + .../android/dialer/util/res/values-mk/strings.xml | 1 + .../android/dialer/util/res/values-ml/strings.xml | 1 + .../android/dialer/util/res/values-mn/strings.xml | 1 + .../android/dialer/util/res/values-mr/strings.xml | 1 + .../android/dialer/util/res/values-ms/strings.xml | 1 + .../android/dialer/util/res/values-my/strings.xml | 1 + .../android/dialer/util/res/values-nb/strings.xml | 1 + .../android/dialer/util/res/values-ne/strings.xml | 1 + .../android/dialer/util/res/values-nl/strings.xml | 1 + .../android/dialer/util/res/values-no/strings.xml | 1 + .../android/dialer/util/res/values-pa/strings.xml | 1 + .../android/dialer/util/res/values-pl/strings.xml | 1 + .../dialer/util/res/values-pt-rBR/strings.xml | 1 + .../dialer/util/res/values-pt-rPT/strings.xml | 1 + .../android/dialer/util/res/values-pt/strings.xml | 1 + .../android/dialer/util/res/values-ro/strings.xml | 1 + .../android/dialer/util/res/values-ru/strings.xml | 1 + .../android/dialer/util/res/values-si/strings.xml | 1 + .../android/dialer/util/res/values-sk/strings.xml | 1 + .../android/dialer/util/res/values-sl/strings.xml | 1 + .../android/dialer/util/res/values-sq/strings.xml | 1 + .../android/dialer/util/res/values-sr/strings.xml | 1 + .../android/dialer/util/res/values-sv/strings.xml | 1 + .../android/dialer/util/res/values-sw/strings.xml | 1 + .../android/dialer/util/res/values-ta/strings.xml | 1 + .../android/dialer/util/res/values-te/strings.xml | 1 + .../android/dialer/util/res/values-th/strings.xml | 1 + .../android/dialer/util/res/values-tl/strings.xml | 1 + .../android/dialer/util/res/values-tr/strings.xml | 1 + .../android/dialer/util/res/values-uk/strings.xml | 1 + .../android/dialer/util/res/values-ur/strings.xml | 1 + .../android/dialer/util/res/values-uz/strings.xml | 1 + .../android/dialer/util/res/values-vi/strings.xml | 1 + .../dialer/util/res/values-zh-rCN/strings.xml | 1 + .../dialer/util/res/values-zh-rHK/strings.xml | 1 + .../dialer/util/res/values-zh-rTW/strings.xml | 1 + .../android/dialer/util/res/values-zu/strings.xml | 1 + .../com/android/dialer/util/res/values/strings.xml | 2 + .../dialer/voicemail/listui/AndroidManifest.xml | 16 + .../dialer/voicemail/listui/VoicemailFragment.java | 35 + .../listui/res/layout/voicemail_fragment.xml | 28 + .../voicemail/listui/res/values-af/strings.xml | 20 + .../voicemail/listui/res/values-am/strings.xml | 20 + .../voicemail/listui/res/values-ar/strings.xml | 20 + .../voicemail/listui/res/values-az/strings.xml | 20 + .../listui/res/values-b+sr+Latn/strings.xml | 20 + .../voicemail/listui/res/values-be/strings.xml | 20 + .../voicemail/listui/res/values-bg/strings.xml | 20 + .../voicemail/listui/res/values-bn/strings.xml | 20 + .../voicemail/listui/res/values-bs/strings.xml | 20 + .../voicemail/listui/res/values-ca/strings.xml | 20 + .../voicemail/listui/res/values-cs/strings.xml | 20 + .../voicemail/listui/res/values-da/strings.xml | 20 + .../voicemail/listui/res/values-de/strings.xml | 20 + .../voicemail/listui/res/values-el/strings.xml | 20 + .../voicemail/listui/res/values-en-rAU/strings.xml | 20 + .../voicemail/listui/res/values-en-rGB/strings.xml | 20 + .../voicemail/listui/res/values-en-rIN/strings.xml | 20 + .../voicemail/listui/res/values-es-rUS/strings.xml | 20 + .../voicemail/listui/res/values-es/strings.xml | 20 + .../voicemail/listui/res/values-et/strings.xml | 20 + .../voicemail/listui/res/values-eu/strings.xml | 20 + .../voicemail/listui/res/values-fa/strings.xml | 20 + .../voicemail/listui/res/values-fi/strings.xml | 20 + .../voicemail/listui/res/values-fr-rCA/strings.xml | 20 + .../voicemail/listui/res/values-fr/strings.xml | 20 + .../voicemail/listui/res/values-gl/strings.xml | 20 + .../voicemail/listui/res/values-gu/strings.xml | 20 + .../voicemail/listui/res/values-hi/strings.xml | 20 + .../voicemail/listui/res/values-hr/strings.xml | 20 + .../voicemail/listui/res/values-hu/strings.xml | 20 + .../voicemail/listui/res/values-hy/strings.xml | 20 + .../voicemail/listui/res/values-in/strings.xml | 20 + .../voicemail/listui/res/values-is/strings.xml | 20 + .../voicemail/listui/res/values-it/strings.xml | 20 + .../voicemail/listui/res/values-iw/strings.xml | 20 + .../voicemail/listui/res/values-ja/strings.xml | 20 + .../voicemail/listui/res/values-ka/strings.xml | 20 + .../voicemail/listui/res/values-kk/strings.xml | 20 + .../voicemail/listui/res/values-km/strings.xml | 20 + .../voicemail/listui/res/values-kn/strings.xml | 20 + .../voicemail/listui/res/values-ko/strings.xml | 20 + .../voicemail/listui/res/values-ky/strings.xml | 20 + .../voicemail/listui/res/values-lo/strings.xml | 20 + .../voicemail/listui/res/values-lt/strings.xml | 20 + .../voicemail/listui/res/values-lv/strings.xml | 20 + .../voicemail/listui/res/values-mk/strings.xml | 20 + .../voicemail/listui/res/values-ml/strings.xml | 20 + .../voicemail/listui/res/values-mn/strings.xml | 20 + .../voicemail/listui/res/values-mr/strings.xml | 20 + .../voicemail/listui/res/values-ms/strings.xml | 20 + .../voicemail/listui/res/values-my/strings.xml | 20 + .../voicemail/listui/res/values-nb/strings.xml | 20 + .../voicemail/listui/res/values-ne/strings.xml | 20 + .../voicemail/listui/res/values-nl/strings.xml | 20 + .../voicemail/listui/res/values-no/strings.xml | 20 + .../voicemail/listui/res/values-pa/strings.xml | 20 + .../voicemail/listui/res/values-pl/strings.xml | 20 + .../voicemail/listui/res/values-pt-rBR/strings.xml | 20 + .../voicemail/listui/res/values-pt-rPT/strings.xml | 20 + .../voicemail/listui/res/values-pt/strings.xml | 20 + .../voicemail/listui/res/values-ro/strings.xml | 20 + .../voicemail/listui/res/values-ru/strings.xml | 20 + .../voicemail/listui/res/values-si/strings.xml | 20 + .../voicemail/listui/res/values-sk/strings.xml | 20 + .../voicemail/listui/res/values-sl/strings.xml | 20 + .../voicemail/listui/res/values-sq/strings.xml | 20 + .../voicemail/listui/res/values-sr/strings.xml | 20 + .../voicemail/listui/res/values-sv/strings.xml | 20 + .../voicemail/listui/res/values-sw/strings.xml | 20 + .../voicemail/listui/res/values-ta/strings.xml | 20 + .../voicemail/listui/res/values-te/strings.xml | 20 + .../voicemail/listui/res/values-th/strings.xml | 20 + .../voicemail/listui/res/values-tl/strings.xml | 20 + .../voicemail/listui/res/values-tr/strings.xml | 20 + .../voicemail/listui/res/values-uk/strings.xml | 20 + .../voicemail/listui/res/values-ur/strings.xml | 20 + .../voicemail/listui/res/values-uz/strings.xml | 20 + .../voicemail/listui/res/values-vi/strings.xml | 20 + .../voicemail/listui/res/values-zh-rCN/strings.xml | 20 + .../voicemail/listui/res/values-zh-rHK/strings.xml | 20 + .../voicemail/listui/res/values-zh-rTW/strings.xml | 20 + .../voicemail/listui/res/values-zu/strings.xml | 20 + .../dialer/voicemail/listui/res/values/strings.xml | 19 + .../VisualVoicemailEnabledChecker.java | 4 +- .../voicemailstatus/VoicemailStatusHelper.java | 20 +- .../voicemailstatus/res/values-af/strings.xml | 26 - .../voicemailstatus/res/values-am/strings.xml | 26 - .../voicemailstatus/res/values-ar/strings.xml | 26 - .../voicemailstatus/res/values-az/strings.xml | 26 - .../res/values-b+sr+Latn/strings.xml | 26 - .../voicemailstatus/res/values-be/strings.xml | 26 - .../voicemailstatus/res/values-bg/strings.xml | 26 - .../voicemailstatus/res/values-bn/strings.xml | 26 - .../voicemailstatus/res/values-bs/strings.xml | 26 - .../voicemailstatus/res/values-ca/strings.xml | 26 - .../voicemailstatus/res/values-cs/strings.xml | 26 - .../voicemailstatus/res/values-da/strings.xml | 26 - .../voicemailstatus/res/values-de/strings.xml | 26 - .../voicemailstatus/res/values-el/strings.xml | 26 - .../voicemailstatus/res/values-en-rAU/strings.xml | 26 - .../voicemailstatus/res/values-en-rGB/strings.xml | 26 - .../voicemailstatus/res/values-en-rIN/strings.xml | 26 - .../voicemailstatus/res/values-es-rUS/strings.xml | 26 - .../voicemailstatus/res/values-es/strings.xml | 26 - .../voicemailstatus/res/values-et/strings.xml | 26 - .../voicemailstatus/res/values-eu/strings.xml | 26 - .../voicemailstatus/res/values-fa/strings.xml | 26 - .../voicemailstatus/res/values-fi/strings.xml | 26 - .../voicemailstatus/res/values-fr-rCA/strings.xml | 26 - .../voicemailstatus/res/values-fr/strings.xml | 26 - .../voicemailstatus/res/values-gl/strings.xml | 26 - .../voicemailstatus/res/values-gu/strings.xml | 26 - .../voicemailstatus/res/values-hi/strings.xml | 26 - .../voicemailstatus/res/values-hr/strings.xml | 26 - .../voicemailstatus/res/values-hu/strings.xml | 26 - .../voicemailstatus/res/values-hy/strings.xml | 26 - .../voicemailstatus/res/values-in/strings.xml | 26 - .../voicemailstatus/res/values-is/strings.xml | 26 - .../voicemailstatus/res/values-it/strings.xml | 26 - .../voicemailstatus/res/values-iw/strings.xml | 26 - .../voicemailstatus/res/values-ja/strings.xml | 26 - .../voicemailstatus/res/values-ka/strings.xml | 26 - .../voicemailstatus/res/values-kk/strings.xml | 26 - .../voicemailstatus/res/values-km/strings.xml | 26 - .../voicemailstatus/res/values-kn/strings.xml | 26 - .../voicemailstatus/res/values-ko/strings.xml | 26 - .../voicemailstatus/res/values-ky/strings.xml | 26 - .../voicemailstatus/res/values-lo/strings.xml | 26 - .../voicemailstatus/res/values-lt/strings.xml | 26 - .../voicemailstatus/res/values-lv/strings.xml | 26 - .../voicemailstatus/res/values-mk/strings.xml | 26 - .../voicemailstatus/res/values-ml/strings.xml | 26 - .../voicemailstatus/res/values-mn/strings.xml | 26 - .../voicemailstatus/res/values-mr/strings.xml | 26 - .../voicemailstatus/res/values-ms/strings.xml | 26 - .../voicemailstatus/res/values-my/strings.xml | 26 - .../voicemailstatus/res/values-nb/strings.xml | 26 - .../voicemailstatus/res/values-ne/strings.xml | 26 - .../voicemailstatus/res/values-nl/strings.xml | 26 - .../voicemailstatus/res/values-no/strings.xml | 26 - .../voicemailstatus/res/values-pa/strings.xml | 26 - .../voicemailstatus/res/values-pl/strings.xml | 26 - .../voicemailstatus/res/values-pt-rBR/strings.xml | 26 - .../voicemailstatus/res/values-pt-rPT/strings.xml | 26 - .../voicemailstatus/res/values-pt/strings.xml | 26 - .../voicemailstatus/res/values-ro/strings.xml | 26 - .../voicemailstatus/res/values-ru/strings.xml | 26 - .../voicemailstatus/res/values-si/strings.xml | 26 - .../voicemailstatus/res/values-sk/strings.xml | 26 - .../voicemailstatus/res/values-sl/strings.xml | 26 - .../voicemailstatus/res/values-sq/strings.xml | 26 - .../voicemailstatus/res/values-sr/strings.xml | 26 - .../voicemailstatus/res/values-sv/strings.xml | 26 - .../voicemailstatus/res/values-sw/strings.xml | 26 - .../voicemailstatus/res/values-ta/strings.xml | 26 - .../voicemailstatus/res/values-te/strings.xml | 26 - .../voicemailstatus/res/values-th/strings.xml | 26 - .../voicemailstatus/res/values-tl/strings.xml | 26 - .../voicemailstatus/res/values-tr/strings.xml | 26 - .../voicemailstatus/res/values-uk/strings.xml | 26 - .../voicemailstatus/res/values-ur/strings.xml | 26 - .../voicemailstatus/res/values-uz/strings.xml | 26 - .../voicemailstatus/res/values-vi/strings.xml | 26 - .../voicemailstatus/res/values-zh-rCN/strings.xml | 26 - .../voicemailstatus/res/values-zh-rHK/strings.xml | 26 - .../voicemailstatus/res/values-zh-rTW/strings.xml | 26 - .../voicemailstatus/res/values-zu/strings.xml | 26 - .../dialer/voicemailstatus/res/values/strings.xml | 41 - java/com/android/dialer/widget/DialerToolbar.java | 5 + .../android/dialer/widget/EmptyContentView.java | 127 + .../android/dialer/widget/LockableViewPager.java | 50 + .../com/android/dialer/widget/MessageFragment.java | 28 +- .../widget/res/drawable-hdpi/empty_contacts.png | Bin 0 -> 2461 bytes .../widget/res/drawable-mdpi/empty_contacts.png | Bin 0 -> 1778 bytes .../widget/res/drawable-xhdpi/empty_contacts.png | Bin 0 -> 3352 bytes .../widget/res/drawable-xxhdpi/empty_contacts.png | Bin 0 -> 3686 bytes .../widget/res/drawable-xxxhdpi/empty_contacts.png | Bin 0 -> 5204 bytes .../widget/res/layout-land/empty_content_view.xml | 56 + .../dialer/widget/res/layout/dialer_toolbar.xml | 8 +- .../widget/res/layout/empty_content_view.xml | 54 + .../dialer/widget/res/layout/fragment_message.xml | 34 +- .../dialer/widget/res/values-af/strings.xml | 21 + .../dialer/widget/res/values-am/strings.xml | 21 + .../dialer/widget/res/values-ar/strings.xml | 21 + .../dialer/widget/res/values-az/strings.xml | 21 + .../dialer/widget/res/values-b+sr+Latn/strings.xml | 21 + .../dialer/widget/res/values-be/strings.xml | 21 + .../dialer/widget/res/values-bg/strings.xml | 21 + .../dialer/widget/res/values-bn/strings.xml | 21 + .../dialer/widget/res/values-bs/strings.xml | 21 + .../dialer/widget/res/values-ca/strings.xml | 21 + .../dialer/widget/res/values-cs/strings.xml | 21 + .../dialer/widget/res/values-da/strings.xml | 21 + .../dialer/widget/res/values-de/strings.xml | 21 + .../dialer/widget/res/values-el/strings.xml | 21 + .../dialer/widget/res/values-en-rAU/strings.xml | 21 + .../dialer/widget/res/values-en-rGB/strings.xml | 21 + .../dialer/widget/res/values-en-rIN/strings.xml | 21 + .../dialer/widget/res/values-es-rUS/strings.xml | 21 + .../dialer/widget/res/values-es/strings.xml | 21 + .../dialer/widget/res/values-et/strings.xml | 21 + .../dialer/widget/res/values-eu/strings.xml | 21 + .../dialer/widget/res/values-fa/strings.xml | 21 + .../dialer/widget/res/values-fi/strings.xml | 21 + .../dialer/widget/res/values-fr-rCA/strings.xml | 21 + .../dialer/widget/res/values-fr/strings.xml | 21 + .../dialer/widget/res/values-gl/strings.xml | 21 + .../dialer/widget/res/values-gu/strings.xml | 21 + .../dialer/widget/res/values-hi/strings.xml | 21 + .../dialer/widget/res/values-hr/strings.xml | 21 + .../dialer/widget/res/values-hu/strings.xml | 21 + .../dialer/widget/res/values-hy/strings.xml | 21 + .../dialer/widget/res/values-in/strings.xml | 21 + .../dialer/widget/res/values-is/strings.xml | 21 + .../dialer/widget/res/values-it/strings.xml | 21 + .../dialer/widget/res/values-iw/strings.xml | 21 + .../dialer/widget/res/values-ja/strings.xml | 21 + .../dialer/widget/res/values-ka/strings.xml | 21 + .../dialer/widget/res/values-kk/strings.xml | 21 + .../dialer/widget/res/values-km/strings.xml | 21 + .../dialer/widget/res/values-kn/strings.xml | 21 + .../dialer/widget/res/values-ko/strings.xml | 21 + .../dialer/widget/res/values-ky/strings.xml | 21 + .../dialer/widget/res/values-lo/strings.xml | 21 + .../dialer/widget/res/values-lt/strings.xml | 21 + .../dialer/widget/res/values-lv/strings.xml | 21 + .../dialer/widget/res/values-mk/strings.xml | 21 + .../dialer/widget/res/values-ml/strings.xml | 21 + .../dialer/widget/res/values-mn/strings.xml | 21 + .../dialer/widget/res/values-mr/strings.xml | 21 + .../dialer/widget/res/values-ms/strings.xml | 21 + .../dialer/widget/res/values-my/strings.xml | 21 + .../dialer/widget/res/values-nb/strings.xml | 21 + .../dialer/widget/res/values-ne/strings.xml | 21 + .../dialer/widget/res/values-nl/strings.xml | 21 + .../dialer/widget/res/values-no/strings.xml | 21 + .../dialer/widget/res/values-pa/strings.xml | 21 + .../dialer/widget/res/values-pl/strings.xml | 21 + .../dialer/widget/res/values-pt-rBR/strings.xml | 21 + .../dialer/widget/res/values-pt-rPT/strings.xml | 21 + .../dialer/widget/res/values-pt/strings.xml | 21 + .../dialer/widget/res/values-ro/strings.xml | 21 + .../dialer/widget/res/values-ru/strings.xml | 21 + .../dialer/widget/res/values-si/strings.xml | 21 + .../dialer/widget/res/values-sk/strings.xml | 21 + .../dialer/widget/res/values-sl/strings.xml | 21 + .../dialer/widget/res/values-sq/strings.xml | 21 + .../dialer/widget/res/values-sr/strings.xml | 21 + .../dialer/widget/res/values-sv/strings.xml | 21 + .../dialer/widget/res/values-sw/strings.xml | 21 + .../dialer/widget/res/values-ta/strings.xml | 21 + .../dialer/widget/res/values-te/strings.xml | 21 + .../dialer/widget/res/values-th/strings.xml | 21 + .../dialer/widget/res/values-tl/strings.xml | 21 + .../dialer/widget/res/values-tr/strings.xml | 21 + .../dialer/widget/res/values-uk/strings.xml | 21 + .../dialer/widget/res/values-ur/strings.xml | 21 + .../dialer/widget/res/values-uz/strings.xml | 21 + .../dialer/widget/res/values-vi/strings.xml | 21 + .../dialer/widget/res/values-zh-rCN/strings.xml | 21 + .../dialer/widget/res/values-zh-rHK/strings.xml | 21 + .../dialer/widget/res/values-zh-rTW/strings.xml | 21 + .../dialer/widget/res/values-zu/strings.xml | 21 + .../android/dialer/widget/res/values/colors.xml | 4 + .../android/dialer/widget/res/values/dimens.xml | 5 +- .../android/dialer/widget/res/values/strings.xml | 30 + .../dialershared/bubble/AndroidManifest.xml | 22 + java/com/android/dialershared/bubble/Bubble.java | 879 +++++++ .../android/dialershared/bubble/BubbleInfo.java | 123 + .../dialershared/bubble/ChangeOnScreenBounds.java | 191 ++ .../dialershared/bubble/CheckableImageButton.java | 101 + .../android/dialershared/bubble/MoveHandler.java | 280 +++ .../android/dialershared/bubble/WindowRoot.java | 74 + .../dialershared/bubble/g3doc/INTEGRATION.md | 69 + .../bubble/g3doc/images/bubble_collapsed.png | Bin 0 -> 60187 bytes .../bubble/g3doc/images/bubble_expanded.png | Bin 0 -> 79674 bytes .../bubble/g3doc/images/bubble_state.png | Bin 0 -> 83470 bytes .../bubble/g3doc/images/bubble_text.png | Bin 0 -> 65641 bytes .../bubble/res/color/bubble_checkable_mask.xml | 21 + .../bubble/res/color/bubble_icon_tint_states.xml | 21 + .../res/drawable/bubble_background_pill_ltr.xml | 23 + .../res/drawable/bubble_background_pill_rtl.xml | 23 + .../drawable/bubble_ripple_checkable_circle.xml | 30 + .../bubble/res/drawable/bubble_ripple_circle.xml | 26 + .../dialershared/bubble/res/layout/bubble_base.xml | 127 + .../dialershared/bubble/res/values/colors.xml | 20 + .../dialershared/bubble/res/values/values.xml | 25 + java/com/android/incallui/AndroidManifest.xml | 109 +- .../android/incallui/AnswerScreenPresenter.java | 59 +- .../incallui/AnswerScreenPresenterStub.java | 11 + .../incallui/AudioRouteSelectorActivity.java | 47 + java/com/android/incallui/CallButtonPresenter.java | 56 +- java/com/android/incallui/CallCardPresenter.java | 138 +- java/com/android/incallui/CallerInfo.java | 1 - .../com/android/incallui/CallerInfoAsyncQuery.java | 3 +- java/com/android/incallui/CallerInfoUtils.java | 7 + .../incallui/ConferenceManagerFragment.java | 2 +- .../incallui/ConferenceParticipantListAdapter.java | 4 +- java/com/android/incallui/ContactInfoCache.java | 68 +- java/com/android/incallui/ContactsAsyncHelper.java | 197 +- java/com/android/incallui/DialpadFragment.java | 13 +- .../com/android/incallui/ExternalCallNotifier.java | 126 +- java/com/android/incallui/InCallActivity.java | 70 +- .../com/android/incallui/InCallActivityCommon.java | 57 +- java/com/android/incallui/InCallPresenter.java | 205 +- java/com/android/incallui/InCallServiceImpl.java | 28 +- java/com/android/incallui/ProximitySensor.java | 5 +- .../incallui/ReturnToCallActionReceiver.java | 132 ++ .../android/incallui/ReturnToCallController.java | 257 ++ java/com/android/incallui/StatusBarNotifier.java | 183 +- java/com/android/incallui/VideoCallPresenter.java | 26 +- .../com/android/incallui/VideoPauseController.java | 7 +- .../incallui/answer/impl/AnswerFragment.java | 20 +- .../android/incallui/answer/impl/PillDrawable.java | 43 - .../impl/answermethod/res/drawable/call_answer.xml | 19 - .../res/layout/swipe_up_down_method.xml | 3 + .../answer/impl/answermethod/res/values/values.xml | 2 - .../classifier/HumanInteractionClassifier.java | 2 +- .../incallui/answer/impl/hint/AnswerHint.java | 2 +- .../answer/impl/hint/AnswerHintFactory.java | 34 +- .../answer/impl/hint/PawImageLoaderImpl.java | 25 +- .../answer/impl/hint/PawSecretCodeListener.java | 54 +- .../impl/res/anim/incoming_unlocked_icon_entry.xml | 19 - .../impl/res/anim/incoming_unlocked_text_entry.xml | 9 - .../incallui/answer/impl/res/values-af/strings.xml | 20 +- .../incallui/answer/impl/res/values-am/strings.xml | 20 +- .../incallui/answer/impl/res/values-ar/strings.xml | 20 +- .../incallui/answer/impl/res/values-az/strings.xml | 20 +- .../answer/impl/res/values-b+sr+Latn/strings.xml | 20 +- .../incallui/answer/impl/res/values-be/strings.xml | 20 +- .../incallui/answer/impl/res/values-bg/strings.xml | 20 +- .../incallui/answer/impl/res/values-bn/strings.xml | 20 +- .../incallui/answer/impl/res/values-bs/strings.xml | 20 +- .../incallui/answer/impl/res/values-ca/strings.xml | 20 +- .../incallui/answer/impl/res/values-cs/strings.xml | 20 +- .../incallui/answer/impl/res/values-da/strings.xml | 20 +- .../incallui/answer/impl/res/values-de/strings.xml | 20 +- .../incallui/answer/impl/res/values-el/strings.xml | 20 +- .../answer/impl/res/values-en-rAU/strings.xml | 20 +- .../answer/impl/res/values-en-rGB/strings.xml | 20 +- .../answer/impl/res/values-en-rIN/strings.xml | 20 +- .../answer/impl/res/values-es-rUS/strings.xml | 20 +- .../incallui/answer/impl/res/values-es/strings.xml | 20 +- .../incallui/answer/impl/res/values-et/strings.xml | 20 +- .../incallui/answer/impl/res/values-eu/strings.xml | 20 +- .../incallui/answer/impl/res/values-fa/strings.xml | 20 +- .../incallui/answer/impl/res/values-fi/strings.xml | 20 +- .../answer/impl/res/values-fr-rCA/strings.xml | 20 +- .../incallui/answer/impl/res/values-fr/strings.xml | 20 +- .../incallui/answer/impl/res/values-gl/strings.xml | 20 +- .../incallui/answer/impl/res/values-gu/strings.xml | 20 +- .../incallui/answer/impl/res/values-hi/strings.xml | 20 +- .../incallui/answer/impl/res/values-hr/strings.xml | 20 +- .../incallui/answer/impl/res/values-hu/strings.xml | 20 +- .../incallui/answer/impl/res/values-hy/strings.xml | 20 +- .../incallui/answer/impl/res/values-in/strings.xml | 20 +- .../incallui/answer/impl/res/values-is/strings.xml | 20 +- .../incallui/answer/impl/res/values-it/strings.xml | 20 +- .../incallui/answer/impl/res/values-iw/strings.xml | 20 +- .../incallui/answer/impl/res/values-ja/strings.xml | 20 +- .../incallui/answer/impl/res/values-ka/strings.xml | 20 +- .../incallui/answer/impl/res/values-kk/strings.xml | 20 +- .../incallui/answer/impl/res/values-km/strings.xml | 20 +- .../incallui/answer/impl/res/values-kn/strings.xml | 20 +- .../incallui/answer/impl/res/values-ko/strings.xml | 20 +- .../incallui/answer/impl/res/values-ky/strings.xml | 20 +- .../incallui/answer/impl/res/values-lo/strings.xml | 20 +- .../incallui/answer/impl/res/values-lt/strings.xml | 20 +- .../incallui/answer/impl/res/values-lv/strings.xml | 20 +- .../incallui/answer/impl/res/values-mk/strings.xml | 20 +- .../incallui/answer/impl/res/values-ml/strings.xml | 20 +- .../incallui/answer/impl/res/values-mn/strings.xml | 20 +- .../incallui/answer/impl/res/values-mr/strings.xml | 20 +- .../incallui/answer/impl/res/values-ms/strings.xml | 20 +- .../incallui/answer/impl/res/values-my/strings.xml | 20 +- .../incallui/answer/impl/res/values-nb/strings.xml | 20 +- .../incallui/answer/impl/res/values-ne/strings.xml | 20 +- .../incallui/answer/impl/res/values-nl/strings.xml | 20 +- .../incallui/answer/impl/res/values-no/strings.xml | 20 +- .../incallui/answer/impl/res/values-pa/strings.xml | 20 +- .../incallui/answer/impl/res/values-pl/strings.xml | 20 +- .../answer/impl/res/values-pt-rBR/strings.xml | 20 +- .../answer/impl/res/values-pt-rPT/strings.xml | 20 +- .../incallui/answer/impl/res/values-pt/strings.xml | 20 +- .../incallui/answer/impl/res/values-ro/strings.xml | 20 +- .../incallui/answer/impl/res/values-ru/strings.xml | 20 +- .../incallui/answer/impl/res/values-si/strings.xml | 20 +- .../incallui/answer/impl/res/values-sk/strings.xml | 20 +- .../incallui/answer/impl/res/values-sl/strings.xml | 20 +- .../incallui/answer/impl/res/values-sq/strings.xml | 20 +- .../incallui/answer/impl/res/values-sr/strings.xml | 20 +- .../incallui/answer/impl/res/values-sv/strings.xml | 20 +- .../incallui/answer/impl/res/values-sw/strings.xml | 20 +- .../incallui/answer/impl/res/values-ta/strings.xml | 20 +- .../incallui/answer/impl/res/values-te/strings.xml | 20 +- .../incallui/answer/impl/res/values-th/strings.xml | 20 +- .../incallui/answer/impl/res/values-tl/strings.xml | 20 +- .../incallui/answer/impl/res/values-tr/strings.xml | 20 +- .../incallui/answer/impl/res/values-uk/strings.xml | 20 +- .../incallui/answer/impl/res/values-ur/strings.xml | 20 +- .../incallui/answer/impl/res/values-uz/strings.xml | 20 +- .../incallui/answer/impl/res/values-vi/strings.xml | 20 +- .../answer/impl/res/values-zh-rCN/strings.xml | 20 +- .../answer/impl/res/values-zh-rHK/strings.xml | 20 +- .../answer/impl/res/values-zh-rTW/strings.xml | 20 +- .../incallui/answer/impl/res/values-zu/strings.xml | 20 +- .../incallui/answer/impl/res/values/attrs.xml | 3 - .../incallui/answer/impl/res/values/strings.xml | 19 +- .../incallui/answer/protocol/AnswerScreen.java | 2 + .../answer/protocol/AnswerScreenDelegate.java | 7 + .../AnswerProximitySensor.java | 7 +- .../incallui/audiomode/AudioModeProvider.java | 45 + .../AudioRouteSelectorDialogFragment.java | 11 + .../autoresizetext/AutoResizeTextView.java | 2 +- .../incallui/bindings/InCallUiBindings.java | 9 - .../incallui/bindings/InCallUiBindingsStub.java | 38 - java/com/android/incallui/call/CallList.java | 48 +- java/com/android/incallui/call/DialerCall.java | 203 +- .../android/incallui/call/DialerCallListener.java | 2 + .../android/incallui/call/ExternalCallList.java | 6 +- java/com/android/incallui/call/TelecomAdapter.java | 12 +- .../incallui/calllocation/impl/AndroidManifest.xml | 1 + .../calllocation/impl/DownloadMapImageTask.java | 3 +- .../incallui/calllocation/impl/LocationHelper.java | 7 + .../calllocation/impl/LocationUrlBuilder.java | 2 +- .../calllocation/impl/ReverseGeocodeTask.java | 1 + .../calllocation/impl/TrafficStatsTags.java | 29 - .../incallui/callpending/AndroidManifest.xml | 32 + .../incallui/callpending/CallPendingActivity.java | 356 +++ .../res/layout/pending_incall_screen.xml | 22 + .../incallui/commontheme/res/anim/blinking.xml | 10 - .../drawable-hdpi/ic_phone_audio_white_36dp.png | Bin 1010 -> 0 bytes .../drawable-mdpi/ic_phone_audio_white_36dp.png | Bin 682 -> 0 bytes .../drawable-xhdpi/ic_phone_audio_white_36dp.png | Bin 1362 -> 0 bytes .../drawable-xxhdpi/ic_phone_audio_white_36dp.png | Bin 2259 -> 0 bytes .../drawable-xxxhdpi/ic_phone_audio_white_36dp.png | Bin 3156 -> 0 bytes .../incallui/commontheme/res/values-af/strings.xml | 18 + .../incallui/commontheme/res/values-am/strings.xml | 18 + .../incallui/commontheme/res/values-ar/strings.xml | 18 + .../incallui/commontheme/res/values-az/strings.xml | 18 + .../commontheme/res/values-b+sr+Latn/strings.xml | 18 + .../incallui/commontheme/res/values-be/strings.xml | 18 + .../incallui/commontheme/res/values-bg/strings.xml | 18 + .../incallui/commontheme/res/values-bn/strings.xml | 18 + .../incallui/commontheme/res/values-bs/strings.xml | 18 + .../incallui/commontheme/res/values-ca/strings.xml | 18 + .../incallui/commontheme/res/values-cs/strings.xml | 18 + .../incallui/commontheme/res/values-da/strings.xml | 18 + .../incallui/commontheme/res/values-de/strings.xml | 18 + .../incallui/commontheme/res/values-el/strings.xml | 18 + .../commontheme/res/values-en-rAU/strings.xml | 18 + .../commontheme/res/values-en-rGB/strings.xml | 18 + .../commontheme/res/values-en-rIN/strings.xml | 18 + .../commontheme/res/values-es-rUS/strings.xml | 18 + .../incallui/commontheme/res/values-es/strings.xml | 18 + .../incallui/commontheme/res/values-et/strings.xml | 18 + .../incallui/commontheme/res/values-eu/strings.xml | 18 + .../incallui/commontheme/res/values-fa/strings.xml | 18 + .../incallui/commontheme/res/values-fi/strings.xml | 18 + .../commontheme/res/values-fr-rCA/strings.xml | 18 + .../incallui/commontheme/res/values-fr/strings.xml | 18 + .../incallui/commontheme/res/values-gl/strings.xml | 18 + .../incallui/commontheme/res/values-gu/strings.xml | 18 + .../incallui/commontheme/res/values-hi/strings.xml | 18 + .../incallui/commontheme/res/values-hr/strings.xml | 18 + .../incallui/commontheme/res/values-hu/strings.xml | 18 + .../incallui/commontheme/res/values-hy/strings.xml | 18 + .../incallui/commontheme/res/values-in/strings.xml | 18 + .../incallui/commontheme/res/values-is/strings.xml | 18 + .../incallui/commontheme/res/values-it/strings.xml | 18 + .../incallui/commontheme/res/values-iw/strings.xml | 18 + .../incallui/commontheme/res/values-ja/strings.xml | 18 + .../incallui/commontheme/res/values-ka/strings.xml | 18 + .../incallui/commontheme/res/values-kk/strings.xml | 18 + .../incallui/commontheme/res/values-km/strings.xml | 18 + .../incallui/commontheme/res/values-kn/strings.xml | 18 + .../incallui/commontheme/res/values-ko/strings.xml | 18 + .../incallui/commontheme/res/values-ky/strings.xml | 18 + .../incallui/commontheme/res/values-lo/strings.xml | 18 + .../incallui/commontheme/res/values-lt/strings.xml | 18 + .../incallui/commontheme/res/values-lv/strings.xml | 18 + .../incallui/commontheme/res/values-mk/strings.xml | 18 + .../incallui/commontheme/res/values-ml/strings.xml | 18 + .../incallui/commontheme/res/values-mn/strings.xml | 18 + .../incallui/commontheme/res/values-mr/strings.xml | 18 + .../incallui/commontheme/res/values-ms/strings.xml | 18 + .../incallui/commontheme/res/values-my/strings.xml | 18 + .../incallui/commontheme/res/values-nb/strings.xml | 18 + .../incallui/commontheme/res/values-ne/strings.xml | 18 + .../incallui/commontheme/res/values-nl/strings.xml | 18 + .../incallui/commontheme/res/values-no/strings.xml | 18 + .../incallui/commontheme/res/values-pa/strings.xml | 18 + .../incallui/commontheme/res/values-pl/strings.xml | 18 + .../commontheme/res/values-pt-rBR/strings.xml | 18 + .../commontheme/res/values-pt-rPT/strings.xml | 18 + .../incallui/commontheme/res/values-pt/strings.xml | 18 + .../incallui/commontheme/res/values-ro/strings.xml | 18 + .../incallui/commontheme/res/values-ru/strings.xml | 18 + .../incallui/commontheme/res/values-si/strings.xml | 18 + .../incallui/commontheme/res/values-sk/strings.xml | 18 + .../incallui/commontheme/res/values-sl/strings.xml | 18 + .../incallui/commontheme/res/values-sq/strings.xml | 18 + .../incallui/commontheme/res/values-sr/strings.xml | 18 + .../incallui/commontheme/res/values-sv/strings.xml | 18 + .../incallui/commontheme/res/values-sw/strings.xml | 18 + .../incallui/commontheme/res/values-ta/strings.xml | 18 + .../incallui/commontheme/res/values-te/strings.xml | 18 + .../incallui/commontheme/res/values-th/strings.xml | 18 + .../incallui/commontheme/res/values-tl/strings.xml | 18 + .../incallui/commontheme/res/values-tr/strings.xml | 18 + .../incallui/commontheme/res/values-uk/strings.xml | 18 + .../incallui/commontheme/res/values-ur/strings.xml | 18 + .../incallui/commontheme/res/values-uz/strings.xml | 18 + .../incallui/commontheme/res/values-vi/strings.xml | 18 + .../commontheme/res/values-zh-rCN/strings.xml | 18 + .../commontheme/res/values-zh-rHK/strings.xml | 18 + .../commontheme/res/values-zh-rTW/strings.xml | 18 + .../incallui/commontheme/res/values-zu/strings.xml | 18 + .../incallui/commontheme/res/values/colors.xml | 21 +- .../incallui/commontheme/res/values/strings.xml | 22 + .../incallui/commontheme/res/values/styles.xml | 10 +- .../android/incallui/contactgrid/BottomRow.java | 14 +- .../incallui/contactgrid/ContactGridManager.java | 53 +- java/com/android/incallui/contactgrid/TopRow.java | 54 +- .../res/layout/incall_contactgrid_bottom_row.xml | 19 + .../incallui/contactgrid/res/values-af/strings.xml | 18 + .../incallui/contactgrid/res/values-am/strings.xml | 18 + .../incallui/contactgrid/res/values-ar/strings.xml | 18 + .../incallui/contactgrid/res/values-az/strings.xml | 18 + .../contactgrid/res/values-b+sr+Latn/strings.xml | 18 + .../incallui/contactgrid/res/values-be/strings.xml | 18 + .../incallui/contactgrid/res/values-bg/strings.xml | 18 + .../incallui/contactgrid/res/values-bn/strings.xml | 18 + .../incallui/contactgrid/res/values-bs/strings.xml | 18 + .../incallui/contactgrid/res/values-ca/strings.xml | 18 + .../incallui/contactgrid/res/values-cs/strings.xml | 18 + .../incallui/contactgrid/res/values-da/strings.xml | 18 + .../incallui/contactgrid/res/values-de/strings.xml | 18 + .../incallui/contactgrid/res/values-el/strings.xml | 18 + .../contactgrid/res/values-en-rAU/strings.xml | 18 + .../contactgrid/res/values-en-rGB/strings.xml | 18 + .../contactgrid/res/values-en-rIN/strings.xml | 18 + .../contactgrid/res/values-es-rUS/strings.xml | 18 + .../incallui/contactgrid/res/values-es/strings.xml | 18 + .../incallui/contactgrid/res/values-et/strings.xml | 18 + .../incallui/contactgrid/res/values-eu/strings.xml | 18 + .../incallui/contactgrid/res/values-fa/strings.xml | 18 + .../incallui/contactgrid/res/values-fi/strings.xml | 18 + .../contactgrid/res/values-fr-rCA/strings.xml | 18 + .../incallui/contactgrid/res/values-fr/strings.xml | 18 + .../incallui/contactgrid/res/values-gl/strings.xml | 18 + .../incallui/contactgrid/res/values-gu/strings.xml | 18 + .../incallui/contactgrid/res/values-hi/strings.xml | 18 + .../incallui/contactgrid/res/values-hr/strings.xml | 18 + .../incallui/contactgrid/res/values-hu/strings.xml | 18 + .../incallui/contactgrid/res/values-hy/strings.xml | 18 + .../incallui/contactgrid/res/values-in/strings.xml | 18 + .../incallui/contactgrid/res/values-is/strings.xml | 18 + .../incallui/contactgrid/res/values-it/strings.xml | 18 + .../incallui/contactgrid/res/values-iw/strings.xml | 18 + .../incallui/contactgrid/res/values-ja/strings.xml | 18 + .../incallui/contactgrid/res/values-ka/strings.xml | 18 + .../incallui/contactgrid/res/values-kk/strings.xml | 18 + .../incallui/contactgrid/res/values-km/strings.xml | 18 + .../incallui/contactgrid/res/values-kn/strings.xml | 18 + .../incallui/contactgrid/res/values-ko/strings.xml | 18 + .../incallui/contactgrid/res/values-ky/strings.xml | 18 + .../incallui/contactgrid/res/values-lo/strings.xml | 18 + .../incallui/contactgrid/res/values-lt/strings.xml | 18 + .../incallui/contactgrid/res/values-lv/strings.xml | 18 + .../incallui/contactgrid/res/values-mk/strings.xml | 18 + .../incallui/contactgrid/res/values-ml/strings.xml | 18 + .../incallui/contactgrid/res/values-mn/strings.xml | 18 + .../incallui/contactgrid/res/values-mr/strings.xml | 18 + .../incallui/contactgrid/res/values-ms/strings.xml | 18 + .../incallui/contactgrid/res/values-my/strings.xml | 18 + .../incallui/contactgrid/res/values-nb/strings.xml | 18 + .../incallui/contactgrid/res/values-ne/strings.xml | 18 + .../incallui/contactgrid/res/values-nl/strings.xml | 18 + .../incallui/contactgrid/res/values-no/strings.xml | 18 + .../incallui/contactgrid/res/values-pa/strings.xml | 18 + .../incallui/contactgrid/res/values-pl/strings.xml | 18 + .../contactgrid/res/values-pt-rBR/strings.xml | 18 + .../contactgrid/res/values-pt-rPT/strings.xml | 18 + .../incallui/contactgrid/res/values-pt/strings.xml | 18 + .../incallui/contactgrid/res/values-ro/strings.xml | 18 + .../incallui/contactgrid/res/values-ru/strings.xml | 18 + .../incallui/contactgrid/res/values-si/strings.xml | 18 + .../incallui/contactgrid/res/values-sk/strings.xml | 18 + .../incallui/contactgrid/res/values-sl/strings.xml | 18 + .../incallui/contactgrid/res/values-sq/strings.xml | 18 + .../incallui/contactgrid/res/values-sr/strings.xml | 18 + .../incallui/contactgrid/res/values-sv/strings.xml | 18 + .../incallui/contactgrid/res/values-sw/strings.xml | 18 + .../incallui/contactgrid/res/values-ta/strings.xml | 18 + .../incallui/contactgrid/res/values-te/strings.xml | 18 + .../incallui/contactgrid/res/values-th/strings.xml | 18 + .../incallui/contactgrid/res/values-tl/strings.xml | 18 + .../incallui/contactgrid/res/values-tr/strings.xml | 18 + .../incallui/contactgrid/res/values-uk/strings.xml | 18 + .../incallui/contactgrid/res/values-ur/strings.xml | 18 + .../incallui/contactgrid/res/values-uz/strings.xml | 24 +- .../incallui/contactgrid/res/values-vi/strings.xml | 18 + .../contactgrid/res/values-zh-rCN/strings.xml | 18 + .../contactgrid/res/values-zh-rHK/strings.xml | 18 + .../contactgrid/res/values-zh-rTW/strings.xml | 18 + .../incallui/contactgrid/res/values-zu/strings.xml | 18 + .../incallui/contactgrid/res/values/strings.xml | 21 + .../incallui/disconnectdialog/AndroidManifest.xml | 19 + .../disconnectdialog/DefaultErrorDialog.java | 50 + .../disconnectdialog/DisconnectDialog.java | 32 + .../disconnectdialog/DisconnectMessage.java | 66 + .../disconnectdialog/EnableWifiCallingPrompt.java | 75 + .../VideoCallNotAvailablePrompt.java | 76 + .../disconnectdialog/res/values-af/strings.xml | 24 + .../disconnectdialog/res/values-am/strings.xml | 24 + .../disconnectdialog/res/values-ar/strings.xml | 24 + .../disconnectdialog/res/values-az/strings.xml | 24 + .../res/values-b+sr+Latn/strings.xml | 24 + .../disconnectdialog/res/values-be/strings.xml | 24 + .../disconnectdialog/res/values-bg/strings.xml | 24 + .../disconnectdialog/res/values-bn/strings.xml | 24 + .../disconnectdialog/res/values-bs/strings.xml | 24 + .../disconnectdialog/res/values-ca/strings.xml | 24 + .../disconnectdialog/res/values-cs/strings.xml | 24 + .../disconnectdialog/res/values-da/strings.xml | 24 + .../disconnectdialog/res/values-de/strings.xml | 24 + .../disconnectdialog/res/values-el/strings.xml | 24 + .../disconnectdialog/res/values-en-rAU/strings.xml | 24 + .../disconnectdialog/res/values-en-rGB/strings.xml | 24 + .../disconnectdialog/res/values-en-rIN/strings.xml | 24 + .../disconnectdialog/res/values-es-rUS/strings.xml | 24 + .../disconnectdialog/res/values-es/strings.xml | 24 + .../disconnectdialog/res/values-et/strings.xml | 24 + .../disconnectdialog/res/values-eu/strings.xml | 24 + .../disconnectdialog/res/values-fa/strings.xml | 24 + .../disconnectdialog/res/values-fi/strings.xml | 24 + .../disconnectdialog/res/values-fr-rCA/strings.xml | 24 + .../disconnectdialog/res/values-fr/strings.xml | 24 + .../disconnectdialog/res/values-gl/strings.xml | 24 + .../disconnectdialog/res/values-gu/strings.xml | 24 + .../disconnectdialog/res/values-hi/strings.xml | 24 + .../disconnectdialog/res/values-hr/strings.xml | 24 + .../disconnectdialog/res/values-hu/strings.xml | 24 + .../disconnectdialog/res/values-hy/strings.xml | 24 + .../disconnectdialog/res/values-in/strings.xml | 24 + .../disconnectdialog/res/values-is/strings.xml | 24 + .../disconnectdialog/res/values-it/strings.xml | 24 + .../disconnectdialog/res/values-iw/strings.xml | 24 + .../disconnectdialog/res/values-ja/strings.xml | 24 + .../disconnectdialog/res/values-ka/strings.xml | 24 + .../disconnectdialog/res/values-kk/strings.xml | 24 + .../disconnectdialog/res/values-km/strings.xml | 24 + .../disconnectdialog/res/values-kn/strings.xml | 24 + .../disconnectdialog/res/values-ko/strings.xml | 24 + .../disconnectdialog/res/values-ky/strings.xml | 24 + .../disconnectdialog/res/values-lo/strings.xml | 24 + .../disconnectdialog/res/values-lt/strings.xml | 24 + .../disconnectdialog/res/values-lv/strings.xml | 24 + .../disconnectdialog/res/values-mk/strings.xml | 24 + .../disconnectdialog/res/values-ml/strings.xml | 24 + .../disconnectdialog/res/values-mn/strings.xml | 24 + .../disconnectdialog/res/values-mr/strings.xml | 24 + .../disconnectdialog/res/values-ms/strings.xml | 24 + .../disconnectdialog/res/values-my/strings.xml | 24 + .../disconnectdialog/res/values-nb/strings.xml | 24 + .../disconnectdialog/res/values-ne/strings.xml | 24 + .../disconnectdialog/res/values-nl/strings.xml | 24 + .../disconnectdialog/res/values-no/strings.xml | 24 + .../disconnectdialog/res/values-pa/strings.xml | 24 + .../disconnectdialog/res/values-pl/strings.xml | 24 + .../disconnectdialog/res/values-pt-rBR/strings.xml | 24 + .../disconnectdialog/res/values-pt-rPT/strings.xml | 24 + .../disconnectdialog/res/values-pt/strings.xml | 24 + .../disconnectdialog/res/values-ro/strings.xml | 24 + .../disconnectdialog/res/values-ru/strings.xml | 24 + .../disconnectdialog/res/values-si/strings.xml | 24 + .../disconnectdialog/res/values-sk/strings.xml | 24 + .../disconnectdialog/res/values-sl/strings.xml | 24 + .../disconnectdialog/res/values-sq/strings.xml | 24 + .../disconnectdialog/res/values-sr/strings.xml | 24 + .../disconnectdialog/res/values-sv/strings.xml | 24 + .../disconnectdialog/res/values-sw/strings.xml | 24 + .../disconnectdialog/res/values-ta/strings.xml | 24 + .../disconnectdialog/res/values-te/strings.xml | 24 + .../disconnectdialog/res/values-th/strings.xml | 24 + .../disconnectdialog/res/values-tl/strings.xml | 24 + .../disconnectdialog/res/values-tr/strings.xml | 24 + .../disconnectdialog/res/values-uk/strings.xml | 24 + .../disconnectdialog/res/values-ur/strings.xml | 24 + .../disconnectdialog/res/values-uz/strings.xml | 24 + .../disconnectdialog/res/values-vi/strings.xml | 24 + .../disconnectdialog/res/values-zh-rCN/strings.xml | 24 + .../disconnectdialog/res/values-zh-rHK/strings.xml | 24 + .../disconnectdialog/res/values-zh-rTW/strings.xml | 24 + .../disconnectdialog/res/values-zu/strings.xml | 24 + .../disconnectdialog/res/values/strings.xml | 32 + .../incallui/incall/impl/ButtonChooser.java | 18 + .../incallui/incall/impl/ButtonChooserFactory.java | 21 +- .../incallui/incall/impl/ButtonController.java | 39 +- .../incallui/incall/impl/InCallFragment.java | 34 +- .../incallui/incall/impl/InCallPagerAdapter.java | 33 +- .../incallui/incall/impl/LockableViewPager.java | 46 - .../incallui/incall/impl/MappedButtonConfig.java | 17 +- .../impl/res/drawable/incall_ic_add_call.xml | 4 - .../incall/impl/res/drawable/incall_ic_dialpad.xml | 4 - .../incall/impl/res/drawable/incall_ic_manage.xml | 4 - .../incall/impl/res/drawable/incall_ic_merge.xml | 4 - .../incall/impl/res/drawable/incall_ic_pause.xml | 4 - .../impl/res/drawable/tab_indicator_default.xml | 12 - .../impl/res/drawable/tab_indicator_selected.xml | 12 - .../incall/impl/res/drawable/tab_selector.xml | 6 - .../res/layout/call_composer_data_fragment.xml | 15 - .../incall/impl/res/layout/frag_incall_voice.xml | 17 +- .../incallui/incall/impl/res/values-af/strings.xml | 19 +- .../incallui/incall/impl/res/values-am/strings.xml | 19 +- .../incallui/incall/impl/res/values-ar/strings.xml | 19 +- .../incallui/incall/impl/res/values-az/strings.xml | 19 +- .../incall/impl/res/values-b+sr+Latn/strings.xml | 19 +- .../incallui/incall/impl/res/values-be/strings.xml | 19 +- .../incallui/incall/impl/res/values-bg/strings.xml | 19 +- .../incallui/incall/impl/res/values-bn/strings.xml | 19 +- .../incallui/incall/impl/res/values-bs/strings.xml | 19 +- .../incallui/incall/impl/res/values-ca/strings.xml | 19 +- .../incallui/incall/impl/res/values-cs/strings.xml | 19 +- .../incallui/incall/impl/res/values-da/strings.xml | 19 +- .../incallui/incall/impl/res/values-de/strings.xml | 19 +- .../incallui/incall/impl/res/values-el/strings.xml | 19 +- .../incall/impl/res/values-en-rAU/strings.xml | 19 +- .../incall/impl/res/values-en-rGB/strings.xml | 19 +- .../incall/impl/res/values-en-rIN/strings.xml | 19 +- .../incall/impl/res/values-es-rUS/strings.xml | 19 +- .../incallui/incall/impl/res/values-es/strings.xml | 19 +- .../incallui/incall/impl/res/values-et/strings.xml | 19 +- .../incallui/incall/impl/res/values-eu/strings.xml | 19 +- .../incallui/incall/impl/res/values-fa/strings.xml | 19 +- .../incallui/incall/impl/res/values-fi/strings.xml | 19 +- .../incall/impl/res/values-fr-rCA/strings.xml | 19 +- .../incallui/incall/impl/res/values-fr/strings.xml | 19 +- .../incallui/incall/impl/res/values-gl/strings.xml | 19 +- .../incallui/incall/impl/res/values-gu/strings.xml | 19 +- .../incall/impl/res/values-h385dp/dimens.xml | 16 +- .../incall/impl/res/values-h580dp/dimens.xml | 4 - .../incall/impl/res/values-h580dp/styles.xml | 24 - .../incall/impl/res/values-h600dp/dimens.xml | 20 + .../incall/impl/res/values-h650dp/styles.xml | 24 + .../incallui/incall/impl/res/values-hi/strings.xml | 19 +- .../incallui/incall/impl/res/values-hr/strings.xml | 19 +- .../incallui/incall/impl/res/values-hu/strings.xml | 19 +- .../incallui/incall/impl/res/values-hy/strings.xml | 19 +- .../incallui/incall/impl/res/values-in/strings.xml | 19 +- .../incallui/incall/impl/res/values-is/strings.xml | 19 +- .../incallui/incall/impl/res/values-it/strings.xml | 19 +- .../incallui/incall/impl/res/values-iw/strings.xml | 19 +- .../incallui/incall/impl/res/values-ja/strings.xml | 19 +- .../incallui/incall/impl/res/values-ka/strings.xml | 19 +- .../incallui/incall/impl/res/values-kk/strings.xml | 19 +- .../incallui/incall/impl/res/values-km/strings.xml | 19 +- .../incallui/incall/impl/res/values-kn/strings.xml | 19 +- .../incallui/incall/impl/res/values-ko/strings.xml | 19 +- .../incallui/incall/impl/res/values-ky/strings.xml | 19 +- .../incallui/incall/impl/res/values-lo/strings.xml | 19 +- .../incallui/incall/impl/res/values-lt/strings.xml | 19 +- .../incallui/incall/impl/res/values-lv/strings.xml | 19 +- .../incallui/incall/impl/res/values-mk/strings.xml | 19 +- .../incallui/incall/impl/res/values-ml/strings.xml | 19 +- .../incallui/incall/impl/res/values-mn/strings.xml | 19 +- .../incallui/incall/impl/res/values-mr/strings.xml | 19 +- .../incallui/incall/impl/res/values-ms/strings.xml | 19 +- .../incallui/incall/impl/res/values-my/strings.xml | 19 +- .../incallui/incall/impl/res/values-nb/strings.xml | 19 +- .../incallui/incall/impl/res/values-ne/strings.xml | 19 +- .../incallui/incall/impl/res/values-nl/strings.xml | 19 +- .../incallui/incall/impl/res/values-no/strings.xml | 19 +- .../incallui/incall/impl/res/values-pa/strings.xml | 19 +- .../incallui/incall/impl/res/values-pl/strings.xml | 19 +- .../incall/impl/res/values-pt-rBR/strings.xml | 19 +- .../incall/impl/res/values-pt-rPT/strings.xml | 19 +- .../incallui/incall/impl/res/values-pt/strings.xml | 19 +- .../incallui/incall/impl/res/values-ro/strings.xml | 19 +- .../incallui/incall/impl/res/values-ru/strings.xml | 19 +- .../incallui/incall/impl/res/values-si/strings.xml | 19 +- .../incallui/incall/impl/res/values-sk/strings.xml | 19 +- .../incallui/incall/impl/res/values-sl/strings.xml | 19 +- .../incallui/incall/impl/res/values-sq/strings.xml | 19 +- .../incallui/incall/impl/res/values-sr/strings.xml | 19 +- .../incallui/incall/impl/res/values-sv/strings.xml | 19 +- .../incallui/incall/impl/res/values-sw/strings.xml | 19 +- .../incallui/incall/impl/res/values-ta/strings.xml | 19 +- .../incallui/incall/impl/res/values-te/strings.xml | 19 +- .../incallui/incall/impl/res/values-th/strings.xml | 19 +- .../incallui/incall/impl/res/values-tl/strings.xml | 19 +- .../incallui/incall/impl/res/values-tr/strings.xml | 19 +- .../incallui/incall/impl/res/values-uk/strings.xml | 19 +- .../incallui/incall/impl/res/values-ur/strings.xml | 19 +- .../incallui/incall/impl/res/values-uz/strings.xml | 21 +- .../incallui/incall/impl/res/values-vi/strings.xml | 19 +- .../impl/res/values-w260dp-h520dp/dimens.xml | 7 - .../impl/res/values-w260dp-h580dp/dimens.xml | 22 + .../impl/res/values-w300dp-h540dp/dimens.xml | 5 - .../impl/res/values-w300dp-h620dp/dimens.xml | 20 + .../incall/impl/res/values-zh-rCN/strings.xml | 19 +- .../incall/impl/res/values-zh-rHK/strings.xml | 19 +- .../incall/impl/res/values-zh-rTW/strings.xml | 19 +- .../incallui/incall/impl/res/values-zu/strings.xml | 19 +- .../incallui/incall/impl/res/values/dimens.xml | 18 +- .../incallui/incall/impl/res/values/strings.xml | 28 +- .../incall/protocol/InCallScreenDelegate.java | 4 - .../incallui/incall/protocol/PrimaryCallState.java | 50 +- .../incallui/incall/protocol/PrimaryInfo.java | 9 +- .../android/incallui/maps/impl/AndroidManifest.xml | 1 + .../incallui/res/anim/activity_open_enter.xml | 43 - .../incallui/res/anim/activity_open_exit.xml | 31 - .../android/incallui/res/anim/decelerate_cubic.xml | 21 - .../android/incallui/res/anim/decelerate_quint.xml | 21 - .../android/incallui/res/anim/on_going_call.xml | 31 - .../android/incallui/res/color/ota_title_color.xml | 21 - .../res/drawable-hdpi/ic_block_grey600_24dp.png | Bin 518 -> 0 bytes .../res/drawable-hdpi/ic_call_end_white_24dp.png | Bin 454 -> 0 bytes .../res/drawable-hdpi/ic_close_grey600_24dp.png | Bin 225 -> 0 bytes .../drawable-hdpi/ic_location_on_white_24dp.png | Bin 371 -> 0 bytes .../drawable-hdpi/ic_person_add_grey600_24dp.png | Bin 300 -> 0 bytes .../res/drawable-hdpi/ic_question_mark.png | Bin 845 -> 0 bytes .../res/drawable-hdpi/ic_schedule_white_24dp.png | Bin 575 -> 0 bytes .../incallui/res/drawable-hdpi/img_business.png | Bin 3311 -> 0 bytes .../incallui/res/drawable-hdpi/img_conference.png | Bin 7037 -> 0 bytes .../incallui/res/drawable-hdpi/img_no_image.png | Bin 5362 -> 0 bytes .../incallui/res/drawable-hdpi/img_phone.png | Bin 6157 -> 0 bytes .../res/drawable-mdpi/ic_block_grey600_24dp.png | Bin 348 -> 0 bytes .../res/drawable-mdpi/ic_call_end_white_24dp.png | Bin 315 -> 0 bytes .../res/drawable-mdpi/ic_close_grey600_24dp.png | Bin 178 -> 0 bytes .../drawable-mdpi/ic_location_on_white_24dp.png | Bin 265 -> 0 bytes .../drawable-mdpi/ic_person_add_grey600_24dp.png | Bin 211 -> 0 bytes .../res/drawable-mdpi/ic_question_mark.png | Bin 569 -> 0 bytes .../res/drawable-mdpi/ic_schedule_white_24dp.png | Bin 377 -> 0 bytes .../incallui/res/drawable-mdpi/img_business.png | Bin 2240 -> 0 bytes .../incallui/res/drawable-mdpi/img_conference.png | Bin 4629 -> 0 bytes .../incallui/res/drawable-mdpi/img_no_image.png | Bin 3509 -> 0 bytes .../incallui/res/drawable-mdpi/img_phone.png | Bin 3798 -> 0 bytes .../res/drawable-xhdpi/ic_block_grey600_24dp.png | Bin 690 -> 0 bytes .../res/drawable-xhdpi/ic_call_end_white_24dp.png | Bin 534 -> 0 bytes .../res/drawable-xhdpi/ic_close_grey600_24dp.png | Bin 261 -> 0 bytes .../drawable-xhdpi/ic_location_on_white_24dp.png | Bin 456 -> 0 bytes .../drawable-xhdpi/ic_person_add_grey600_24dp.png | Bin 341 -> 0 bytes .../res/drawable-xhdpi/ic_question_mark.png | Bin 1094 -> 0 bytes .../res/drawable-xhdpi/ic_schedule_white_24dp.png | Bin 737 -> 0 bytes .../incallui/res/drawable-xhdpi/img_business.png | Bin 4759 -> 0 bytes .../incallui/res/drawable-xhdpi/img_conference.png | Bin 9517 -> 0 bytes .../incallui/res/drawable-xhdpi/img_no_image.png | Bin 7369 -> 0 bytes .../incallui/res/drawable-xhdpi/img_phone.png | Bin 8189 -> 0 bytes .../res/drawable-xxhdpi/ic_block_grey600_24dp.png | Bin 1029 -> 0 bytes .../res/drawable-xxhdpi/ic_call_end_white_24dp.png | Bin 736 -> 0 bytes .../res/drawable-xxhdpi/ic_close_grey600_24dp.png | Bin 353 -> 0 bytes .../drawable-xxhdpi/ic_location_on_white_24dp.png | Bin 675 -> 0 bytes .../drawable-xxhdpi/ic_person_add_grey600_24dp.png | Bin 485 -> 0 bytes .../res/drawable-xxhdpi/ic_question_mark.png | Bin 1686 -> 0 bytes .../res/drawable-xxhdpi/ic_schedule_white_24dp.png | Bin 1107 -> 0 bytes .../incallui/res/drawable-xxhdpi/img_business.png | Bin 6499 -> 0 bytes .../res/drawable-xxhdpi/img_conference.png | Bin 16306 -> 0 bytes .../incallui/res/drawable-xxhdpi/img_no_image.png | Bin 9850 -> 0 bytes .../incallui/res/drawable-xxhdpi/img_phone.png | Bin 10848 -> 0 bytes .../res/drawable-xxxhdpi/ic_block_grey600_24dp.png | Bin 1353 -> 0 bytes .../drawable-xxxhdpi/ic_call_end_white_24dp.png | Bin 929 -> 0 bytes .../res/drawable-xxxhdpi/ic_close_grey600_24dp.png | Bin 444 -> 0 bytes .../drawable-xxxhdpi/ic_location_on_white_24dp.png | Bin 869 -> 0 bytes .../ic_person_add_grey600_24dp.png | Bin 638 -> 0 bytes .../res/drawable-xxxhdpi/ic_question_mark.png | Bin 2304 -> 0 bytes .../drawable-xxxhdpi/ic_schedule_white_24dp.png | Bin 1478 -> 0 bytes .../incallui/res/drawable-xxxhdpi/img_business.png | Bin 10730 -> 0 bytes .../res/drawable-xxxhdpi/img_conference.png | Bin 19584 -> 0 bytes .../incallui/res/drawable-xxxhdpi/img_no_image.png | Bin 16251 -> 0 bytes .../incallui/res/drawable-xxxhdpi/img_phone.png | Bin 18635 -> 0 bytes .../res/drawable/img_conference_automirrored.xml | 21 - .../res/drawable/img_no_image_automirrored.xml | 21 - .../incallui/res/drawable/on_going_call.xml | 47 + .../res/drawable/spam_notification_icon.xml | 34 - .../res/drawable/unknown_notification_icon.xml | 34 - .../incallui/res/layout/caller_in_conference.xml | 2 +- .../com/android/incallui/res/values-af/strings.xml | 80 +- .../com/android/incallui/res/values-am/strings.xml | 80 +- .../com/android/incallui/res/values-ar/strings.xml | 80 +- .../com/android/incallui/res/values-az/strings.xml | 80 +- .../incallui/res/values-b+sr+Latn/strings.xml | 80 +- .../com/android/incallui/res/values-be/strings.xml | 80 +- .../com/android/incallui/res/values-bg/strings.xml | 80 +- .../com/android/incallui/res/values-bn/strings.xml | 80 +- .../com/android/incallui/res/values-bs/strings.xml | 80 +- .../com/android/incallui/res/values-ca/strings.xml | 80 +- .../com/android/incallui/res/values-cs/strings.xml | 80 +- .../com/android/incallui/res/values-da/strings.xml | 80 +- .../com/android/incallui/res/values-de/strings.xml | 80 +- .../com/android/incallui/res/values-el/strings.xml | 80 +- .../android/incallui/res/values-en-rAU/strings.xml | 82 +- .../android/incallui/res/values-en-rGB/strings.xml | 82 +- .../android/incallui/res/values-en-rIN/strings.xml | 82 +- .../android/incallui/res/values-es-rUS/strings.xml | 80 +- .../com/android/incallui/res/values-es/strings.xml | 80 +- .../com/android/incallui/res/values-et/strings.xml | 80 +- .../com/android/incallui/res/values-eu/strings.xml | 80 +- .../com/android/incallui/res/values-fa/strings.xml | 80 +- .../com/android/incallui/res/values-fi/strings.xml | 80 +- .../android/incallui/res/values-fr-rCA/strings.xml | 80 +- .../com/android/incallui/res/values-fr/strings.xml | 80 +- .../com/android/incallui/res/values-gl/strings.xml | 80 +- .../com/android/incallui/res/values-gu/strings.xml | 80 +- .../com/android/incallui/res/values-hi/strings.xml | 80 +- .../com/android/incallui/res/values-hr/strings.xml | 80 +- .../com/android/incallui/res/values-hu/strings.xml | 80 +- .../com/android/incallui/res/values-hy/strings.xml | 80 +- .../com/android/incallui/res/values-in/strings.xml | 80 +- .../com/android/incallui/res/values-is/strings.xml | 80 +- .../com/android/incallui/res/values-it/strings.xml | 80 +- .../com/android/incallui/res/values-iw/strings.xml | 80 +- .../com/android/incallui/res/values-ja/strings.xml | 80 +- .../com/android/incallui/res/values-ka/strings.xml | 80 +- .../com/android/incallui/res/values-kk/strings.xml | 80 +- .../com/android/incallui/res/values-km/strings.xml | 80 +- .../com/android/incallui/res/values-kn/strings.xml | 80 +- .../com/android/incallui/res/values-ko/strings.xml | 80 +- .../com/android/incallui/res/values-ky/strings.xml | 80 +- .../com/android/incallui/res/values-lo/strings.xml | 80 +- .../com/android/incallui/res/values-lt/strings.xml | 82 +- .../com/android/incallui/res/values-lv/strings.xml | 80 +- .../res/values-mcc262-mnc01-af/strings.xml | 24 + .../res/values-mcc262-mnc01-am/strings.xml | 24 + .../res/values-mcc262-mnc01-ar/strings.xml | 24 + .../res/values-mcc262-mnc01-az/strings.xml | 24 + .../res/values-mcc262-mnc01-b+sr+Latn/strings.xml | 24 + .../res/values-mcc262-mnc01-be/strings.xml | 24 + .../res/values-mcc262-mnc01-bg/strings.xml | 24 + .../res/values-mcc262-mnc01-bn/strings.xml | 24 + .../res/values-mcc262-mnc01-bs/strings.xml | 24 + .../res/values-mcc262-mnc01-ca/strings.xml | 24 + .../res/values-mcc262-mnc01-cs/strings.xml | 24 + .../res/values-mcc262-mnc01-da/strings.xml | 24 + .../res/values-mcc262-mnc01-de/strings.xml | 24 + .../res/values-mcc262-mnc01-el/strings.xml | 24 + .../res/values-mcc262-mnc01-en-rAU/strings.xml | 24 + .../res/values-mcc262-mnc01-en-rGB/strings.xml | 24 + .../res/values-mcc262-mnc01-en-rIN/strings.xml | 24 + .../res/values-mcc262-mnc01-es-rUS/strings.xml | 24 + .../res/values-mcc262-mnc01-es/strings.xml | 24 + .../res/values-mcc262-mnc01-et/strings.xml | 24 + .../res/values-mcc262-mnc01-eu/strings.xml | 24 + .../res/values-mcc262-mnc01-fa/strings.xml | 24 + .../res/values-mcc262-mnc01-fi/strings.xml | 24 + .../res/values-mcc262-mnc01-fr-rCA/strings.xml | 24 + .../res/values-mcc262-mnc01-fr/strings.xml | 24 + .../res/values-mcc262-mnc01-gl/strings.xml | 24 + .../res/values-mcc262-mnc01-gu/strings.xml | 24 + .../res/values-mcc262-mnc01-hi/strings.xml | 24 + .../res/values-mcc262-mnc01-hr/strings.xml | 24 + .../res/values-mcc262-mnc01-hu/strings.xml | 24 + .../res/values-mcc262-mnc01-hy/strings.xml | 24 + .../res/values-mcc262-mnc01-in/strings.xml | 24 + .../res/values-mcc262-mnc01-is/strings.xml | 24 + .../res/values-mcc262-mnc01-it/strings.xml | 24 + .../res/values-mcc262-mnc01-iw/strings.xml | 24 + .../res/values-mcc262-mnc01-ja/strings.xml | 24 + .../res/values-mcc262-mnc01-ka/strings.xml | 24 + .../res/values-mcc262-mnc01-kk/strings.xml | 24 + .../res/values-mcc262-mnc01-km/strings.xml | 24 + .../res/values-mcc262-mnc01-kn/strings.xml | 24 + .../res/values-mcc262-mnc01-ko/strings.xml | 24 + .../res/values-mcc262-mnc01-ky/strings.xml | 24 + .../res/values-mcc262-mnc01-lo/strings.xml | 24 + .../res/values-mcc262-mnc01-lt/strings.xml | 24 + .../res/values-mcc262-mnc01-lv/strings.xml | 24 + .../res/values-mcc262-mnc01-mk/strings.xml | 24 + .../res/values-mcc262-mnc01-ml/strings.xml | 24 + .../res/values-mcc262-mnc01-mn/strings.xml | 24 + .../res/values-mcc262-mnc01-mr/strings.xml | 24 + .../res/values-mcc262-mnc01-ms/strings.xml | 24 + .../res/values-mcc262-mnc01-my/strings.xml | 24 + .../res/values-mcc262-mnc01-nb/strings.xml | 24 + .../res/values-mcc262-mnc01-ne/strings.xml | 24 + .../res/values-mcc262-mnc01-nl/strings.xml | 24 + .../res/values-mcc262-mnc01-no/strings.xml | 24 + .../res/values-mcc262-mnc01-pa/strings.xml | 24 + .../res/values-mcc262-mnc01-pl/strings.xml | 24 + .../res/values-mcc262-mnc01-pt-rBR/strings.xml | 24 + .../res/values-mcc262-mnc01-pt-rPT/strings.xml | 24 + .../res/values-mcc262-mnc01-pt/strings.xml | 24 + .../res/values-mcc262-mnc01-ro/strings.xml | 24 + .../res/values-mcc262-mnc01-ru/strings.xml | 24 + .../res/values-mcc262-mnc01-si/strings.xml | 24 + .../res/values-mcc262-mnc01-sk/strings.xml | 24 + .../res/values-mcc262-mnc01-sl/strings.xml | 24 + .../res/values-mcc262-mnc01-sq/strings.xml | 24 + .../res/values-mcc262-mnc01-sr/strings.xml | 24 + .../res/values-mcc262-mnc01-sv/strings.xml | 24 + .../res/values-mcc262-mnc01-sw/strings.xml | 24 + .../res/values-mcc262-mnc01-ta/strings.xml | 24 + .../res/values-mcc262-mnc01-te/strings.xml | 24 + .../res/values-mcc262-mnc01-th/strings.xml | 24 + .../res/values-mcc262-mnc01-tl/strings.xml | 24 + .../res/values-mcc262-mnc01-tr/strings.xml | 24 + .../res/values-mcc262-mnc01-uk/strings.xml | 24 + .../res/values-mcc262-mnc01-ur/strings.xml | 24 + .../res/values-mcc262-mnc01-uz/strings.xml | 24 + .../res/values-mcc262-mnc01-vi/strings.xml | 24 + .../res/values-mcc262-mnc01-zh-rCN/strings.xml | 24 + .../res/values-mcc262-mnc01-zh-rHK/strings.xml | 24 + .../res/values-mcc262-mnc01-zh-rTW/strings.xml | 24 + .../res/values-mcc262-mnc01-zu/strings.xml | 24 + .../incallui/res/values-mcc262-mnc01/strings.xml | 24 + .../res/values-mcc262-mnc02-af/strings.xml | 22 + .../res/values-mcc262-mnc02-am/strings.xml | 22 + .../res/values-mcc262-mnc02-ar/strings.xml | 22 + .../res/values-mcc262-mnc02-az/strings.xml | 22 + .../res/values-mcc262-mnc02-b+sr+Latn/strings.xml | 22 + .../res/values-mcc262-mnc02-be/strings.xml | 22 + .../res/values-mcc262-mnc02-bg/strings.xml | 22 + .../res/values-mcc262-mnc02-bn/strings.xml | 22 + .../res/values-mcc262-mnc02-bs/strings.xml | 22 + .../res/values-mcc262-mnc02-ca/strings.xml | 22 + .../res/values-mcc262-mnc02-cs/strings.xml | 22 + .../res/values-mcc262-mnc02-da/strings.xml | 22 + .../res/values-mcc262-mnc02-de/strings.xml | 22 + .../res/values-mcc262-mnc02-el/strings.xml | 22 + .../res/values-mcc262-mnc02-en-rAU/strings.xml | 22 + .../res/values-mcc262-mnc02-en-rGB/strings.xml | 22 + .../res/values-mcc262-mnc02-en-rIN/strings.xml | 22 + .../res/values-mcc262-mnc02-es-rUS/strings.xml | 22 + .../res/values-mcc262-mnc02-es/strings.xml | 22 + .../res/values-mcc262-mnc02-et/strings.xml | 22 + .../res/values-mcc262-mnc02-eu/strings.xml | 22 + .../res/values-mcc262-mnc02-fa/strings.xml | 22 + .../res/values-mcc262-mnc02-fi/strings.xml | 22 + .../res/values-mcc262-mnc02-fr-rCA/strings.xml | 22 + .../res/values-mcc262-mnc02-fr/strings.xml | 22 + .../res/values-mcc262-mnc02-gl/strings.xml | 22 + .../res/values-mcc262-mnc02-gu/strings.xml | 22 + .../res/values-mcc262-mnc02-hi/strings.xml | 22 + .../res/values-mcc262-mnc02-hr/strings.xml | 22 + .../res/values-mcc262-mnc02-hu/strings.xml | 22 + .../res/values-mcc262-mnc02-hy/strings.xml | 22 + .../res/values-mcc262-mnc02-in/strings.xml | 22 + .../res/values-mcc262-mnc02-is/strings.xml | 22 + .../res/values-mcc262-mnc02-it/strings.xml | 22 + .../res/values-mcc262-mnc02-iw/strings.xml | 22 + .../res/values-mcc262-mnc02-ja/strings.xml | 22 + .../res/values-mcc262-mnc02-ka/strings.xml | 22 + .../res/values-mcc262-mnc02-kk/strings.xml | 22 + .../res/values-mcc262-mnc02-km/strings.xml | 22 + .../res/values-mcc262-mnc02-kn/strings.xml | 22 + .../res/values-mcc262-mnc02-ko/strings.xml | 22 + .../res/values-mcc262-mnc02-ky/strings.xml | 22 + .../res/values-mcc262-mnc02-lo/strings.xml | 22 + .../res/values-mcc262-mnc02-lt/strings.xml | 22 + .../res/values-mcc262-mnc02-lv/strings.xml | 22 + .../res/values-mcc262-mnc02-mk/strings.xml | 22 + .../res/values-mcc262-mnc02-ml/strings.xml | 22 + .../res/values-mcc262-mnc02-mn/strings.xml | 22 + .../res/values-mcc262-mnc02-mr/strings.xml | 22 + .../res/values-mcc262-mnc02-ms/strings.xml | 22 + .../res/values-mcc262-mnc02-my/strings.xml | 22 + .../res/values-mcc262-mnc02-nb/strings.xml | 22 + .../res/values-mcc262-mnc02-ne/strings.xml | 22 + .../res/values-mcc262-mnc02-nl/strings.xml | 22 + .../res/values-mcc262-mnc02-no/strings.xml | 22 + .../res/values-mcc262-mnc02-pa/strings.xml | 22 + .../res/values-mcc262-mnc02-pl/strings.xml | 22 + .../res/values-mcc262-mnc02-pt-rBR/strings.xml | 22 + .../res/values-mcc262-mnc02-pt-rPT/strings.xml | 22 + .../res/values-mcc262-mnc02-pt/strings.xml | 22 + .../res/values-mcc262-mnc02-ro/strings.xml | 22 + .../res/values-mcc262-mnc02-ru/strings.xml | 22 + .../res/values-mcc262-mnc02-si/strings.xml | 22 + .../res/values-mcc262-mnc02-sk/strings.xml | 22 + .../res/values-mcc262-mnc02-sl/strings.xml | 22 + .../res/values-mcc262-mnc02-sq/strings.xml | 22 + .../res/values-mcc262-mnc02-sr/strings.xml | 22 + .../res/values-mcc262-mnc02-sv/strings.xml | 22 + .../res/values-mcc262-mnc02-sw/strings.xml | 22 + .../res/values-mcc262-mnc02-ta/strings.xml | 22 + .../res/values-mcc262-mnc02-te/strings.xml | 22 + .../res/values-mcc262-mnc02-th/strings.xml | 22 + .../res/values-mcc262-mnc02-tl/strings.xml | 22 + .../res/values-mcc262-mnc02-tr/strings.xml | 22 + .../res/values-mcc262-mnc02-uk/strings.xml | 22 + .../res/values-mcc262-mnc02-ur/strings.xml | 22 + .../res/values-mcc262-mnc02-uz/strings.xml | 22 + .../res/values-mcc262-mnc02-vi/strings.xml | 22 + .../res/values-mcc262-mnc02-zh-rCN/strings.xml | 22 + .../res/values-mcc262-mnc02-zh-rHK/strings.xml | 22 + .../res/values-mcc262-mnc02-zh-rTW/strings.xml | 22 + .../res/values-mcc262-mnc02-zu/strings.xml | 22 + .../incallui/res/values-mcc262-mnc02/strings.xml | 25 + .../com/android/incallui/res/values-mk/strings.xml | 80 +- .../com/android/incallui/res/values-ml/strings.xml | 80 +- .../com/android/incallui/res/values-mn/strings.xml | 80 +- .../com/android/incallui/res/values-mr/strings.xml | 80 +- .../com/android/incallui/res/values-ms/strings.xml | 82 +- .../com/android/incallui/res/values-my/strings.xml | 80 +- .../com/android/incallui/res/values-nb/strings.xml | 80 +- .../com/android/incallui/res/values-ne/strings.xml | 80 +- .../com/android/incallui/res/values-nl/strings.xml | 82 +- .../com/android/incallui/res/values-no/strings.xml | 80 +- .../com/android/incallui/res/values-pa/strings.xml | 80 +- .../com/android/incallui/res/values-pl/strings.xml | 80 +- .../android/incallui/res/values-pt-rBR/strings.xml | 80 +- .../android/incallui/res/values-pt-rPT/strings.xml | 80 +- .../com/android/incallui/res/values-pt/strings.xml | 80 +- .../com/android/incallui/res/values-ro/strings.xml | 80 +- .../com/android/incallui/res/values-ru/strings.xml | 80 +- .../com/android/incallui/res/values-si/strings.xml | 80 +- .../com/android/incallui/res/values-sk/strings.xml | 80 +- .../com/android/incallui/res/values-sl/strings.xml | 80 +- .../com/android/incallui/res/values-sq/strings.xml | 80 +- .../com/android/incallui/res/values-sr/strings.xml | 80 +- .../com/android/incallui/res/values-sv/strings.xml | 80 +- .../com/android/incallui/res/values-sw/strings.xml | 80 +- .../com/android/incallui/res/values-ta/strings.xml | 80 +- .../com/android/incallui/res/values-te/strings.xml | 80 +- .../com/android/incallui/res/values-th/strings.xml | 80 +- .../com/android/incallui/res/values-tl/strings.xml | 80 +- .../com/android/incallui/res/values-tr/strings.xml | 80 +- .../com/android/incallui/res/values-uk/strings.xml | 80 +- .../com/android/incallui/res/values-ur/strings.xml | 80 +- .../com/android/incallui/res/values-uz/strings.xml | 86 +- .../com/android/incallui/res/values-vi/strings.xml | 80 +- .../android/incallui/res/values-zh-rCN/strings.xml | 80 +- .../android/incallui/res/values-zh-rHK/strings.xml | 80 +- .../android/incallui/res/values-zh-rTW/strings.xml | 80 +- .../com/android/incallui/res/values-zu/strings.xml | 80 +- .../incallui/res/values/animation_constants.xml | 19 - java/com/android/incallui/res/values/colors.xml | 20 - java/com/android/incallui/res/values/dimens.xml | 30 +- java/com/android/incallui/res/values/strings.xml | 208 +- java/com/android/incallui/res/values/styles.xml | 11 +- .../incallui/sessiondata/MultimediaFragment.java | 17 +- .../res/layout/fragment_composer_image.xml | 6 +- .../res/layout/fragment_composer_text.xml | 23 +- java/com/android/incallui/spam/AndroidManifest.xml | 41 + .../incallui/spam/NumberInCallHistoryTask.java | 107 - .../incallui/spam/SpamCallListListener.java | 186 +- .../incallui/spam/SpamNotificationActivity.java | 16 +- .../incallui/spam/SpamNotificationService.java | 13 +- .../spam/res/drawable/spam_notification_icon.xml | 34 + .../incallui/spam/res/values-af/strings.xml | 36 + .../incallui/spam/res/values-am/strings.xml | 36 + .../incallui/spam/res/values-ar/strings.xml | 36 + .../incallui/spam/res/values-az/strings.xml | 36 + .../incallui/spam/res/values-b+sr+Latn/strings.xml | 36 + .../incallui/spam/res/values-be/strings.xml | 36 + .../incallui/spam/res/values-bg/strings.xml | 36 + .../incallui/spam/res/values-bn/strings.xml | 36 + .../incallui/spam/res/values-bs/strings.xml | 36 + .../incallui/spam/res/values-ca/strings.xml | 36 + .../incallui/spam/res/values-cs/strings.xml | 36 + .../incallui/spam/res/values-da/strings.xml | 36 + .../incallui/spam/res/values-de/strings.xml | 36 + .../incallui/spam/res/values-el/strings.xml | 36 + .../incallui/spam/res/values-en-rAU/strings.xml | 36 + .../incallui/spam/res/values-en-rGB/strings.xml | 36 + .../incallui/spam/res/values-en-rIN/strings.xml | 36 + .../incallui/spam/res/values-es-rUS/strings.xml | 36 + .../incallui/spam/res/values-es/strings.xml | 36 + .../incallui/spam/res/values-et/strings.xml | 36 + .../incallui/spam/res/values-eu/strings.xml | 36 + .../incallui/spam/res/values-fa/strings.xml | 36 + .../incallui/spam/res/values-fi/strings.xml | 36 + .../incallui/spam/res/values-fr-rCA/strings.xml | 36 + .../incallui/spam/res/values-fr/strings.xml | 36 + .../incallui/spam/res/values-gl/strings.xml | 36 + .../incallui/spam/res/values-gu/strings.xml | 36 + .../incallui/spam/res/values-hi/strings.xml | 36 + .../incallui/spam/res/values-hr/strings.xml | 36 + .../incallui/spam/res/values-hu/strings.xml | 36 + .../incallui/spam/res/values-hy/strings.xml | 36 + .../incallui/spam/res/values-in/strings.xml | 36 + .../incallui/spam/res/values-is/strings.xml | 36 + .../incallui/spam/res/values-it/strings.xml | 36 + .../incallui/spam/res/values-iw/strings.xml | 36 + .../incallui/spam/res/values-ja/strings.xml | 36 + .../incallui/spam/res/values-ka/strings.xml | 36 + .../incallui/spam/res/values-kk/strings.xml | 36 + .../incallui/spam/res/values-km/strings.xml | 36 + .../incallui/spam/res/values-kn/strings.xml | 36 + .../incallui/spam/res/values-ko/strings.xml | 36 + .../incallui/spam/res/values-ky/strings.xml | 36 + .../incallui/spam/res/values-lo/strings.xml | 36 + .../incallui/spam/res/values-lt/strings.xml | 36 + .../incallui/spam/res/values-lv/strings.xml | 36 + .../incallui/spam/res/values-mk/strings.xml | 36 + .../incallui/spam/res/values-ml/strings.xml | 36 + .../incallui/spam/res/values-mn/strings.xml | 36 + .../incallui/spam/res/values-mr/strings.xml | 36 + .../incallui/spam/res/values-ms/strings.xml | 36 + .../incallui/spam/res/values-my/strings.xml | 36 + .../incallui/spam/res/values-nb/strings.xml | 36 + .../incallui/spam/res/values-ne/strings.xml | 36 + .../incallui/spam/res/values-nl/strings.xml | 36 + .../incallui/spam/res/values-no/strings.xml | 36 + .../incallui/spam/res/values-pa/strings.xml | 36 + .../incallui/spam/res/values-pl/strings.xml | 36 + .../incallui/spam/res/values-pt-rBR/strings.xml | 36 + .../incallui/spam/res/values-pt-rPT/strings.xml | 36 + .../incallui/spam/res/values-pt/strings.xml | 36 + .../incallui/spam/res/values-ro/strings.xml | 36 + .../incallui/spam/res/values-ru/strings.xml | 36 + .../incallui/spam/res/values-si/strings.xml | 36 + .../incallui/spam/res/values-sk/strings.xml | 36 + .../incallui/spam/res/values-sl/strings.xml | 36 + .../incallui/spam/res/values-sq/strings.xml | 36 + .../incallui/spam/res/values-sr/strings.xml | 36 + .../incallui/spam/res/values-sv/strings.xml | 36 + .../incallui/spam/res/values-sw/strings.xml | 36 + .../incallui/spam/res/values-ta/strings.xml | 36 + .../incallui/spam/res/values-te/strings.xml | 36 + .../incallui/spam/res/values-th/strings.xml | 36 + .../incallui/spam/res/values-tl/strings.xml | 36 + .../incallui/spam/res/values-tr/strings.xml | 36 + .../incallui/spam/res/values-uk/strings.xml | 36 + .../incallui/spam/res/values-ur/strings.xml | 36 + .../incallui/spam/res/values-uz/strings.xml | 36 + .../incallui/spam/res/values-vi/strings.xml | 36 + .../incallui/spam/res/values-zh-rCN/strings.xml | 36 + .../incallui/spam/res/values-zh-rHK/strings.xml | 36 + .../incallui/spam/res/values-zh-rTW/strings.xml | 36 + .../incallui/spam/res/values-zu/strings.xml | 36 + .../android/incallui/spam/res/values/strings.xml | 54 + .../speakerbuttonlogic/AndroidManifest.xml | 18 + .../speakerbuttonlogic/SpeakerButtonInfo.java | 91 + .../video/impl/CameraPermissionDialogFragment.java | 67 - .../video/impl/SpeakerButtonController.java | 2 +- .../video/impl/SurfaceViewVideoCallFragment.java | 33 +- .../incallui/video/impl/VideoCallFragment.java | 187 +- .../video_button_bg_checked_disabled.png | Bin 3304 -> 0 bytes .../res/drawable-hdpi/video_button_bg_disabled.png | Bin 4022 -> 0 bytes .../video_button_bg_checked_disabled.png | Bin 1715 -> 0 bytes .../res/drawable-mdpi/video_button_bg_disabled.png | Bin 1990 -> 0 bytes .../video_button_bg_checked_disabled.png | Bin 4957 -> 0 bytes .../drawable-xhdpi/video_button_bg_disabled.png | Bin 6054 -> 0 bytes .../video_button_bg_checked_disabled.png | Bin 8611 -> 0 bytes .../drawable-xxhdpi/video_button_bg_disabled.png | Bin 10736 -> 0 bytes .../impl/res/layout/frag_videocall_surfaceview.xml | 33 +- .../incallui/video/impl/res/values-af/strings.xml | 20 +- .../incallui/video/impl/res/values-am/strings.xml | 20 +- .../incallui/video/impl/res/values-ar/strings.xml | 20 +- .../incallui/video/impl/res/values-az/strings.xml | 20 +- .../video/impl/res/values-b+sr+Latn/strings.xml | 20 +- .../incallui/video/impl/res/values-be/strings.xml | 20 +- .../incallui/video/impl/res/values-bg/strings.xml | 20 +- .../incallui/video/impl/res/values-bn/strings.xml | 20 +- .../incallui/video/impl/res/values-bs/strings.xml | 20 +- .../incallui/video/impl/res/values-ca/strings.xml | 20 +- .../incallui/video/impl/res/values-cs/strings.xml | 20 +- .../incallui/video/impl/res/values-da/strings.xml | 20 +- .../incallui/video/impl/res/values-de/strings.xml | 20 +- .../incallui/video/impl/res/values-el/strings.xml | 20 +- .../video/impl/res/values-en-rAU/strings.xml | 20 +- .../video/impl/res/values-en-rGB/strings.xml | 20 +- .../video/impl/res/values-en-rIN/strings.xml | 20 +- .../video/impl/res/values-es-rUS/strings.xml | 20 +- .../incallui/video/impl/res/values-es/strings.xml | 20 +- .../incallui/video/impl/res/values-et/strings.xml | 20 +- .../incallui/video/impl/res/values-eu/strings.xml | 20 +- .../incallui/video/impl/res/values-fa/strings.xml | 20 +- .../incallui/video/impl/res/values-fi/strings.xml | 20 +- .../video/impl/res/values-fr-rCA/strings.xml | 20 +- .../incallui/video/impl/res/values-fr/strings.xml | 20 +- .../incallui/video/impl/res/values-gl/strings.xml | 20 +- .../incallui/video/impl/res/values-gu/strings.xml | 20 +- .../video/impl/res/values-h580dp/dimens.xml | 2 +- .../incallui/video/impl/res/values-hi/strings.xml | 20 +- .../incallui/video/impl/res/values-hr/strings.xml | 20 +- .../incallui/video/impl/res/values-hu/strings.xml | 20 +- .../incallui/video/impl/res/values-hy/strings.xml | 20 +- .../incallui/video/impl/res/values-in/strings.xml | 20 +- .../incallui/video/impl/res/values-is/strings.xml | 20 +- .../incallui/video/impl/res/values-it/strings.xml | 20 +- .../incallui/video/impl/res/values-iw/strings.xml | 20 +- .../incallui/video/impl/res/values-ja/strings.xml | 20 +- .../incallui/video/impl/res/values-ka/strings.xml | 20 +- .../incallui/video/impl/res/values-kk/strings.xml | 20 +- .../incallui/video/impl/res/values-km/strings.xml | 20 +- .../incallui/video/impl/res/values-kn/strings.xml | 20 +- .../incallui/video/impl/res/values-ko/strings.xml | 20 +- .../incallui/video/impl/res/values-ky/strings.xml | 20 +- .../incallui/video/impl/res/values-land/dimens.xml | 2 +- .../incallui/video/impl/res/values-land/styles.xml | 3 +- .../incallui/video/impl/res/values-lo/strings.xml | 20 +- .../incallui/video/impl/res/values-lt/strings.xml | 20 +- .../incallui/video/impl/res/values-lv/strings.xml | 20 +- .../incallui/video/impl/res/values-mk/strings.xml | 20 +- .../incallui/video/impl/res/values-ml/strings.xml | 20 +- .../incallui/video/impl/res/values-mn/strings.xml | 20 +- .../incallui/video/impl/res/values-mr/strings.xml | 20 +- .../incallui/video/impl/res/values-ms/strings.xml | 20 +- .../incallui/video/impl/res/values-my/strings.xml | 20 +- .../incallui/video/impl/res/values-nb/strings.xml | 20 +- .../incallui/video/impl/res/values-ne/strings.xml | 20 +- .../incallui/video/impl/res/values-nl/strings.xml | 20 +- .../incallui/video/impl/res/values-no/strings.xml | 20 +- .../incallui/video/impl/res/values-pa/strings.xml | 20 +- .../incallui/video/impl/res/values-pl/strings.xml | 20 +- .../video/impl/res/values-pt-rBR/strings.xml | 20 +- .../video/impl/res/values-pt-rPT/strings.xml | 20 +- .../incallui/video/impl/res/values-pt/strings.xml | 20 +- .../incallui/video/impl/res/values-ro/strings.xml | 20 +- .../incallui/video/impl/res/values-ru/strings.xml | 20 +- .../incallui/video/impl/res/values-si/strings.xml | 20 +- .../incallui/video/impl/res/values-sk/strings.xml | 20 +- .../incallui/video/impl/res/values-sl/strings.xml | 20 +- .../incallui/video/impl/res/values-sq/strings.xml | 20 +- .../incallui/video/impl/res/values-sr/strings.xml | 20 +- .../incallui/video/impl/res/values-sv/strings.xml | 20 +- .../incallui/video/impl/res/values-sw/strings.xml | 20 +- .../incallui/video/impl/res/values-ta/strings.xml | 20 +- .../incallui/video/impl/res/values-te/strings.xml | 20 +- .../incallui/video/impl/res/values-th/strings.xml | 20 +- .../incallui/video/impl/res/values-tl/strings.xml | 20 +- .../incallui/video/impl/res/values-tr/strings.xml | 20 +- .../incallui/video/impl/res/values-uk/strings.xml | 20 +- .../incallui/video/impl/res/values-ur/strings.xml | 20 +- .../incallui/video/impl/res/values-uz/strings.xml | 20 +- .../incallui/video/impl/res/values-vi/strings.xml | 20 +- .../video/impl/res/values-w460dp/dimens.xml | 2 +- .../video/impl/res/values-zh-rCN/strings.xml | 20 +- .../video/impl/res/values-zh-rHK/strings.xml | 20 +- .../video/impl/res/values-zh-rTW/strings.xml | 20 +- .../incallui/video/impl/res/values-zu/strings.xml | 20 +- .../incallui/video/impl/res/values/dimens.xml | 2 +- .../incallui/video/impl/res/values/strings.xml | 28 +- .../incallui/video/impl/res/values/styles.xml | 3 +- .../video/protocol/VideoCallScreenDelegate.java | 2 +- .../bindings/VideoSurfaceBindings.java | 8 +- .../videosurface/impl/VideoSurfaceTextureImpl.java | 14 +- java/com/android/incallui/videotech/VideoTech.java | 14 +- .../incallui/videotech/empty/EmptyVideoTech.java | 9 +- .../videotech/ims/ImsVideoCallCallback.java | 7 + .../incallui/videotech/ims/ImsVideoTech.java | 122 +- .../videotech/lightbringer/LightbringerTech.java | 59 +- .../incallui/videotech/utils/VideoUtils.java | 20 +- java/com/android/incallui/wifi/AndroidManifest.xml | 3 - .../incallui/wifi/EnableWifiCallingPrompt.java | 82 - .../incallui/wifi/res/values-af/strings.xml | 5 - .../incallui/wifi/res/values-am/strings.xml | 5 - .../incallui/wifi/res/values-ar/strings.xml | 5 - .../incallui/wifi/res/values-az/strings.xml | 5 - .../incallui/wifi/res/values-b+sr+Latn/strings.xml | 5 - .../incallui/wifi/res/values-be/strings.xml | 5 - .../incallui/wifi/res/values-bg/strings.xml | 5 - .../incallui/wifi/res/values-bn/strings.xml | 5 - .../incallui/wifi/res/values-bs/strings.xml | 5 - .../incallui/wifi/res/values-ca/strings.xml | 5 - .../incallui/wifi/res/values-cs/strings.xml | 5 - .../incallui/wifi/res/values-da/strings.xml | 5 - .../incallui/wifi/res/values-de/strings.xml | 5 - .../incallui/wifi/res/values-el/strings.xml | 5 - .../incallui/wifi/res/values-en-rAU/strings.xml | 5 - .../incallui/wifi/res/values-en-rGB/strings.xml | 5 - .../incallui/wifi/res/values-en-rIN/strings.xml | 5 - .../incallui/wifi/res/values-es-rUS/strings.xml | 5 - .../incallui/wifi/res/values-es/strings.xml | 5 - .../incallui/wifi/res/values-et/strings.xml | 5 - .../incallui/wifi/res/values-eu/strings.xml | 5 - .../incallui/wifi/res/values-fa/strings.xml | 5 - .../incallui/wifi/res/values-fi/strings.xml | 5 - .../incallui/wifi/res/values-fr-rCA/strings.xml | 5 - .../incallui/wifi/res/values-fr/strings.xml | 5 - .../incallui/wifi/res/values-gl/strings.xml | 5 - .../incallui/wifi/res/values-gu/strings.xml | 5 - .../incallui/wifi/res/values-hi/strings.xml | 5 - .../incallui/wifi/res/values-hr/strings.xml | 5 - .../incallui/wifi/res/values-hu/strings.xml | 5 - .../incallui/wifi/res/values-hy/strings.xml | 5 - .../incallui/wifi/res/values-in/strings.xml | 5 - .../incallui/wifi/res/values-is/strings.xml | 5 - .../incallui/wifi/res/values-it/strings.xml | 5 - .../incallui/wifi/res/values-iw/strings.xml | 5 - .../incallui/wifi/res/values-ja/strings.xml | 5 - .../incallui/wifi/res/values-ka/strings.xml | 5 - .../incallui/wifi/res/values-kk/strings.xml | 5 - .../incallui/wifi/res/values-km/strings.xml | 5 - .../incallui/wifi/res/values-kn/strings.xml | 5 - .../incallui/wifi/res/values-ko/strings.xml | 5 - .../incallui/wifi/res/values-ky/strings.xml | 5 - .../incallui/wifi/res/values-lo/strings.xml | 5 - .../incallui/wifi/res/values-lt/strings.xml | 5 - .../incallui/wifi/res/values-lv/strings.xml | 5 - .../incallui/wifi/res/values-mk/strings.xml | 5 - .../incallui/wifi/res/values-ml/strings.xml | 5 - .../incallui/wifi/res/values-mn/strings.xml | 5 - .../incallui/wifi/res/values-mr/strings.xml | 5 - .../incallui/wifi/res/values-ms/strings.xml | 5 - .../incallui/wifi/res/values-my/strings.xml | 5 - .../incallui/wifi/res/values-nb/strings.xml | 5 - .../incallui/wifi/res/values-ne/strings.xml | 5 - .../incallui/wifi/res/values-nl/strings.xml | 5 - .../incallui/wifi/res/values-no/strings.xml | 5 - .../incallui/wifi/res/values-pa/strings.xml | 5 - .../incallui/wifi/res/values-pl/strings.xml | 5 - .../incallui/wifi/res/values-pt-rBR/strings.xml | 5 - .../incallui/wifi/res/values-pt-rPT/strings.xml | 5 - .../incallui/wifi/res/values-pt/strings.xml | 5 - .../incallui/wifi/res/values-ro/strings.xml | 5 - .../incallui/wifi/res/values-ru/strings.xml | 5 - .../incallui/wifi/res/values-si/strings.xml | 5 - .../incallui/wifi/res/values-sk/strings.xml | 5 - .../incallui/wifi/res/values-sl/strings.xml | 5 - .../incallui/wifi/res/values-sq/strings.xml | 5 - .../incallui/wifi/res/values-sr/strings.xml | 5 - .../incallui/wifi/res/values-sv/strings.xml | 5 - .../incallui/wifi/res/values-sw/strings.xml | 5 - .../incallui/wifi/res/values-ta/strings.xml | 5 - .../incallui/wifi/res/values-te/strings.xml | 5 - .../incallui/wifi/res/values-th/strings.xml | 5 - .../incallui/wifi/res/values-tl/strings.xml | 5 - .../incallui/wifi/res/values-tr/strings.xml | 5 - .../incallui/wifi/res/values-uk/strings.xml | 5 - .../incallui/wifi/res/values-ur/strings.xml | 5 - .../incallui/wifi/res/values-uz/strings.xml | 5 - .../incallui/wifi/res/values-vi/strings.xml | 5 - .../incallui/wifi/res/values-zh-rCN/strings.xml | 5 - .../incallui/wifi/res/values-zh-rHK/strings.xml | 5 - .../incallui/wifi/res/values-zh-rTW/strings.xml | 5 - .../incallui/wifi/res/values-zu/strings.xml | 5 - .../android/incallui/wifi/res/values/strings.xml | 9 - java/com/android/voicemail/AndroidManifest.xml | 53 + java/com/android/voicemail/VoicemailClient.java | 34 + .../voicemail/VoicemailPowerCycleReceiver.java | 38 + .../voicemail/VoicemailSecretCodeReceiver.java | 36 + .../com/android/voicemail/impl/ActivationTask.java | 3 +- .../com/android/voicemail/impl/AndroidManifest.xml | 25 +- .../impl/DeviceProvisionedJobService.java | 33 +- java/com/android/voicemail/impl/OmtpConstants.java | 37 +- java/com/android/voicemail/impl/OmtpReceiver.java | 105 - java/com/android/voicemail/impl/OmtpService.java | 52 +- .../voicemail/impl/OmtpVvmCarrierConfigHelper.java | 56 +- .../voicemail/impl/PackageReplacedReceiver.java | 43 + .../voicemail/impl/SubscriptionInfoHelper.java | 70 - .../voicemail/impl/TelephonyManagerStub.java | 40 - .../voicemail/impl/TelephonyVvmConfigManager.java | 2 +- .../voicemail/impl/VoicemailBootReceiver.java | 31 - .../voicemail/impl/VoicemailClientImpl.java | 38 +- .../voicemail/impl/VoicemailClientReceiver.java | 6 + .../android/voicemail/impl/VoicemailModule.java | 3 +- .../android/voicemail/impl/VoicemailStatus.java | 3 +- .../impl/VoicemailTranscriptionServiceGrpc.java | 390 +++ .../voicemail/impl/VvmPackageInstallReceiver.java | 80 - .../voicemail/impl/VvmPhoneStateListener.java | 5 +- .../voicemail/impl/configui/AndroidManifest.xml | 25 + .../impl/configui/ConfigOverrideFragment.java | 178 ++ .../impl/configui/VoicemailSecretCodeActivity.java | 58 + .../impl/configui/res/values-af/strings.xml | 19 + .../impl/configui/res/values-am/strings.xml | 19 + .../impl/configui/res/values-ar/strings.xml | 19 + .../impl/configui/res/values-az/strings.xml | 19 + .../impl/configui/res/values-b+sr+Latn/strings.xml | 19 + .../impl/configui/res/values-be/strings.xml | 19 + .../impl/configui/res/values-bg/strings.xml | 19 + .../impl/configui/res/values-bn/strings.xml | 19 + .../impl/configui/res/values-bs/strings.xml | 19 + .../impl/configui/res/values-ca/strings.xml | 19 + .../impl/configui/res/values-cs/strings.xml | 19 + .../impl/configui/res/values-da/strings.xml | 19 + .../impl/configui/res/values-de/strings.xml | 19 + .../impl/configui/res/values-el/strings.xml | 19 + .../impl/configui/res/values-en-rAU/strings.xml | 19 + .../impl/configui/res/values-en-rGB/strings.xml | 19 + .../impl/configui/res/values-en-rIN/strings.xml | 19 + .../impl/configui/res/values-es-rUS/strings.xml | 19 + .../impl/configui/res/values-es/strings.xml | 19 + .../impl/configui/res/values-et/strings.xml | 19 + .../impl/configui/res/values-eu/strings.xml | 19 + .../impl/configui/res/values-fa/strings.xml | 19 + .../impl/configui/res/values-fi/strings.xml | 19 + .../impl/configui/res/values-fr-rCA/strings.xml | 19 + .../impl/configui/res/values-fr/strings.xml | 19 + .../impl/configui/res/values-gl/strings.xml | 19 + .../impl/configui/res/values-gu/strings.xml | 19 + .../impl/configui/res/values-hi/strings.xml | 19 + .../impl/configui/res/values-hr/strings.xml | 19 + .../impl/configui/res/values-hu/strings.xml | 19 + .../impl/configui/res/values-hy/strings.xml | 19 + .../impl/configui/res/values-in/strings.xml | 19 + .../impl/configui/res/values-is/strings.xml | 19 + .../impl/configui/res/values-it/strings.xml | 19 + .../impl/configui/res/values-iw/strings.xml | 19 + .../impl/configui/res/values-ja/strings.xml | 19 + .../impl/configui/res/values-ka/strings.xml | 19 + .../impl/configui/res/values-kk/strings.xml | 19 + .../impl/configui/res/values-km/strings.xml | 19 + .../impl/configui/res/values-kn/strings.xml | 19 + .../impl/configui/res/values-ko/strings.xml | 19 + .../impl/configui/res/values-ky/strings.xml | 19 + .../impl/configui/res/values-lo/strings.xml | 19 + .../impl/configui/res/values-lt/strings.xml | 19 + .../impl/configui/res/values-lv/strings.xml | 19 + .../impl/configui/res/values-mk/strings.xml | 19 + .../impl/configui/res/values-ml/strings.xml | 19 + .../impl/configui/res/values-mn/strings.xml | 19 + .../impl/configui/res/values-mr/strings.xml | 19 + .../impl/configui/res/values-ms/strings.xml | 19 + .../impl/configui/res/values-my/strings.xml | 19 + .../impl/configui/res/values-nb/strings.xml | 19 + .../impl/configui/res/values-ne/strings.xml | 19 + .../impl/configui/res/values-nl/strings.xml | 19 + .../impl/configui/res/values-no/strings.xml | 19 + .../impl/configui/res/values-pa/strings.xml | 19 + .../impl/configui/res/values-pl/strings.xml | 19 + .../impl/configui/res/values-pt-rBR/strings.xml | 19 + .../impl/configui/res/values-pt-rPT/strings.xml | 19 + .../impl/configui/res/values-pt/strings.xml | 19 + .../impl/configui/res/values-ro/strings.xml | 19 + .../impl/configui/res/values-ru/strings.xml | 19 + .../impl/configui/res/values-si/strings.xml | 19 + .../impl/configui/res/values-sk/strings.xml | 19 + .../impl/configui/res/values-sl/strings.xml | 19 + .../impl/configui/res/values-sq/strings.xml | 19 + .../impl/configui/res/values-sr/strings.xml | 19 + .../impl/configui/res/values-sv/strings.xml | 19 + .../impl/configui/res/values-sw/strings.xml | 19 + .../impl/configui/res/values-ta/strings.xml | 19 + .../impl/configui/res/values-te/strings.xml | 19 + .../impl/configui/res/values-th/strings.xml | 19 + .../impl/configui/res/values-tl/strings.xml | 19 + .../impl/configui/res/values-tr/strings.xml | 19 + .../impl/configui/res/values-uk/strings.xml | 19 + .../impl/configui/res/values-ur/strings.xml | 19 + .../impl/configui/res/values-uz/strings.xml | 19 + .../impl/configui/res/values-vi/strings.xml | 19 + .../impl/configui/res/values-zh-rCN/strings.xml | 19 + .../impl/configui/res/values-zh-rHK/strings.xml | 19 + .../impl/configui/res/values-zh-rTW/strings.xml | 19 + .../impl/configui/res/values-zu/strings.xml | 19 + .../voicemail/impl/configui/res/values/strings.xml | 21 + .../impl/configui/res/xml/vvm_config_override.xml | 76 + .../impl/fetch/VoicemailFetchedCallback.java | 18 +- .../android/voicemail/impl/imap/ImapHelper.java | 19 +- .../android/voicemail/impl/mail/MailTransport.java | 5 + java/com/android/voicemail/impl/mail/Message.java | 4 + .../voicemail/impl/mail/internet/MimeHeader.java | 1 + .../voicemail/impl/mail/internet/MimeMessage.java | 24 + .../impl/mail/store/imap/ImapConstants.java | 2 +- java/com/android/voicemail/impl/proguard.flags | 4 + .../voicemail/impl/protocol/OmtpProtocol.java | 2 +- .../voicemail/impl/protocol/Vvm3Subscriber.java | 2 +- .../voicemail/impl/res/values-af/strings.xml | 2 - .../voicemail/impl/res/values-am/strings.xml | 2 - .../voicemail/impl/res/values-ar/strings.xml | 4 +- .../voicemail/impl/res/values-az/strings.xml | 2 - .../impl/res/values-b+sr+Latn/strings.xml | 2 - .../voicemail/impl/res/values-be/strings.xml | 2 - .../voicemail/impl/res/values-bg/strings.xml | 2 - .../voicemail/impl/res/values-bn/strings.xml | 2 - .../voicemail/impl/res/values-bs/strings.xml | 2 - .../voicemail/impl/res/values-ca/strings.xml | 2 - .../voicemail/impl/res/values-cs/strings.xml | 2 - .../voicemail/impl/res/values-da/strings.xml | 2 - .../voicemail/impl/res/values-de/strings.xml | 2 - .../voicemail/impl/res/values-el/strings.xml | 2 - .../voicemail/impl/res/values-en-rAU/strings.xml | 2 - .../voicemail/impl/res/values-en-rGB/strings.xml | 2 - .../voicemail/impl/res/values-en-rIN/strings.xml | 2 - .../voicemail/impl/res/values-es-rUS/strings.xml | 2 - .../voicemail/impl/res/values-es/strings.xml | 2 - .../voicemail/impl/res/values-et/strings.xml | 2 - .../voicemail/impl/res/values-eu/strings.xml | 2 - .../voicemail/impl/res/values-fa/strings.xml | 2 - .../voicemail/impl/res/values-fi/strings.xml | 2 - .../voicemail/impl/res/values-fr-rCA/strings.xml | 2 - .../voicemail/impl/res/values-fr/strings.xml | 2 - .../voicemail/impl/res/values-gl/strings.xml | 2 - .../voicemail/impl/res/values-gu/strings.xml | 2 - .../voicemail/impl/res/values-hi/strings.xml | 2 - .../voicemail/impl/res/values-hr/strings.xml | 2 - .../voicemail/impl/res/values-hu/strings.xml | 2 - .../voicemail/impl/res/values-hy/strings.xml | 2 - .../voicemail/impl/res/values-in/strings.xml | 2 - .../voicemail/impl/res/values-is/strings.xml | 2 - .../voicemail/impl/res/values-it/strings.xml | 2 - .../voicemail/impl/res/values-iw/strings.xml | 2 - .../voicemail/impl/res/values-ja/strings.xml | 2 - .../voicemail/impl/res/values-ka/strings.xml | 2 - .../voicemail/impl/res/values-kk/strings.xml | 2 - .../voicemail/impl/res/values-km/strings.xml | 2 - .../voicemail/impl/res/values-kn/strings.xml | 2 - .../voicemail/impl/res/values-ko/strings.xml | 2 - .../voicemail/impl/res/values-ky/strings.xml | 2 - .../voicemail/impl/res/values-lo/strings.xml | 2 - .../voicemail/impl/res/values-lt/strings.xml | 2 - .../voicemail/impl/res/values-lv/strings.xml | 2 - .../voicemail/impl/res/values-mk/strings.xml | 2 - .../voicemail/impl/res/values-ml/strings.xml | 2 - .../voicemail/impl/res/values-mn/strings.xml | 2 - .../voicemail/impl/res/values-mr/strings.xml | 4 +- .../voicemail/impl/res/values-ms/strings.xml | 2 - .../voicemail/impl/res/values-my/strings.xml | 2 - .../voicemail/impl/res/values-nb/strings.xml | 2 - .../voicemail/impl/res/values-ne/strings.xml | 2 - .../voicemail/impl/res/values-nl/strings.xml | 2 - .../voicemail/impl/res/values-no/strings.xml | 2 - .../voicemail/impl/res/values-pa/strings.xml | 2 - .../voicemail/impl/res/values-pl/strings.xml | 2 - .../voicemail/impl/res/values-pt-rBR/strings.xml | 2 - .../voicemail/impl/res/values-pt-rPT/strings.xml | 2 - .../voicemail/impl/res/values-pt/strings.xml | 2 - .../voicemail/impl/res/values-ro/strings.xml | 2 - .../voicemail/impl/res/values-ru/strings.xml | 2 - .../voicemail/impl/res/values-si/strings.xml | 2 - .../voicemail/impl/res/values-sk/strings.xml | 2 - .../voicemail/impl/res/values-sl/strings.xml | 2 - .../voicemail/impl/res/values-sq/strings.xml | 2 - .../voicemail/impl/res/values-sr/strings.xml | 2 - .../voicemail/impl/res/values-sv/strings.xml | 2 - .../voicemail/impl/res/values-sw/strings.xml | 2 - .../voicemail/impl/res/values-ta/strings.xml | 2 - .../voicemail/impl/res/values-te/strings.xml | 2 - .../voicemail/impl/res/values-th/strings.xml | 2 - .../voicemail/impl/res/values-tl/strings.xml | 2 - .../voicemail/impl/res/values-tr/strings.xml | 2 - .../voicemail/impl/res/values-uk/strings.xml | 2 - .../voicemail/impl/res/values-ur/strings.xml | 2 - .../voicemail/impl/res/values-uz/strings.xml | 2 - .../voicemail/impl/res/values-vi/strings.xml | 2 - .../voicemail/impl/res/values-zh-rCN/strings.xml | 2 - .../voicemail/impl/res/values-zh-rHK/strings.xml | 2 - .../voicemail/impl/res/values-zh-rTW/strings.xml | 2 - .../voicemail/impl/res/values-zu/strings.xml | 2 - .../android/voicemail/impl/res/values/strings.xml | 9 +- .../voicemail/impl/scheduling/TaskExecutor.java | 10 +- .../impl/scheduling/TaskSchedulerJobService.java | 4 +- .../impl/scheduling/TaskSchedulerService.java | 400 ---- .../impl/settings/VoicemailSettingsFragment.java | 18 +- .../voicemail/impl/sms/LegacyModeSmsHandler.java | 1 + .../voicemail/impl/sms/OmtpMessageReceiver.java | 7 +- .../voicemail/impl/sms/OmtpMessageSender.java | 6 + .../voicemail/impl/sync/OmtpVvmSyncReceiver.java | 2 +- .../voicemail/impl/sync/OmtpVvmSyncService.java | 131 +- .../android/voicemail/impl/sync/SyncOneTask.java | 7 +- java/com/android/voicemail/impl/sync/SyncTask.java | 9 +- .../android/voicemail/impl/sync/UploadTask.java | 6 +- .../voicemail/impl/sync/VoicemailsQueryHelper.java | 11 - .../voicemail/impl/sync/VvmAccountManager.java | 61 +- .../impl/sync/VvmNetworkRequestCallback.java | 2 +- .../transcribe/TranscriptionBackfillService.java | 85 + .../transcribe/TranscriptionConfigProvider.java | 90 + .../impl/transcribe/TranscriptionDbHelper.java | 137 ++ .../impl/transcribe/TranscriptionService.java | 223 ++ .../impl/transcribe/TranscriptionTask.java | 225 ++ .../impl/transcribe/TranscriptionTaskAsync.java | 123 + .../impl/transcribe/TranscriptionTaskSync.java | 69 + .../voicemail/impl/transcribe/VoicemailCompat.java | 59 + .../grpc/GetTranscriptResponseAsync.java | 102 + .../impl/transcribe/grpc/TranscriptionClient.java | 61 + .../grpc/TranscriptionClientFactory.java | 196 ++ .../transcribe/grpc/TranscriptionResponse.java | 53 + .../grpc/TranscriptionResponseAsync.java | 53 + .../transcribe/grpc/TranscriptionResponseSync.java | 43 + .../transcribe/grpc/voicemail_transcription.proto | 133 ++ java/com/android/voicemail/permissions.xml | 21 - .../voicemail/stub/StubVoicemailClient.java | 21 + 4081 files changed, 81405 insertions(+), 45961 deletions(-) create mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_bluetooth_audio_white_24.png delete mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_check_circle_googblue_24.png delete mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_forward_white_24.png create mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_headset_white_24.png create mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_mic_off_white_24.png delete mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_network_wifi_white_24.png create mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_phone_in_talk_white_24.png create mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_phone_in_talk_white_36.png create mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_report_grey600_24.png delete mode 100644 assets/quantum/res/drawable-hdpi/quantum_ic_report_white_18.png create mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_bluetooth_audio_white_24.png delete mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_check_circle_googblue_24.png delete mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_forward_white_24.png create mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_headset_white_24.png create mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_mic_off_white_24.png delete mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_network_wifi_white_24.png create mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_phone_in_talk_white_24.png create mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_phone_in_talk_white_36.png create mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_report_grey600_24.png delete mode 100644 assets/quantum/res/drawable-mdpi/quantum_ic_report_white_18.png create mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_bluetooth_audio_white_24.png delete mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_check_circle_googblue_24.png delete mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_forward_white_24.png create mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_headset_white_24.png create mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_mic_off_white_24.png delete mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_network_wifi_white_24.png create mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_phone_in_talk_white_24.png create mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_phone_in_talk_white_36.png create mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_report_grey600_24.png delete mode 100644 assets/quantum/res/drawable-xhdpi/quantum_ic_report_white_18.png create mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_bluetooth_audio_white_24.png delete mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_check_circle_googblue_24.png delete mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_forward_white_24.png create mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_headset_white_24.png create mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_mic_off_white_24.png delete mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_network_wifi_white_24.png create mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_phone_in_talk_white_24.png create mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_phone_in_talk_white_36.png create mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_report_grey600_24.png delete mode 100644 assets/quantum/res/drawable-xxhdpi/quantum_ic_report_white_18.png create mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_bluetooth_audio_white_24.png delete mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_check_circle_googblue_24.png delete mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_forward_white_24.png create mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_headset_white_24.png create mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_mic_off_white_24.png delete mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_network_wifi_white_24.png create mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_phone_in_talk_white_24.png create mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_phone_in_talk_white_36.png create mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_report_grey600_24.png delete mode 100644 assets/quantum/res/drawable-xxxhdpi/quantum_ic_report_white_18.png create mode 100644 assets/quantum/res/drawable/quantum_ic_arrow_back_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_block_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_call_end_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_call_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_close_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_history_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_language_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_message_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_more_vert_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_person_add_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_search_vd_theme_24.xml create mode 100644 assets/quantum/res/drawable/quantum_ic_videocam_vd_theme_24.xml delete mode 100644 java/com/android/contacts/common/Bindings.java delete mode 100644 java/com/android/contacts/common/ContactPhotoManager.java delete mode 100644 java/com/android/contacts/common/ContactPhotoManagerImpl.java delete mode 100644 java/com/android/contacts/common/GeoUtil.java delete mode 100644 java/com/android/contacts/common/bindings/ContactsCommonBindings.java delete mode 100644 java/com/android/contacts/common/bindings/ContactsCommonBindingsFactory.java delete mode 100644 java/com/android/contacts/common/bindings/ContactsCommonBindingsStub.java delete mode 100644 java/com/android/contacts/common/compat/TelephonyManagerCompat.java delete mode 100644 java/com/android/contacts/common/format/FormatUtils.java delete mode 100644 java/com/android/contacts/common/format/testing/SpannedTestUtils.java delete mode 100644 java/com/android/contacts/common/lettertiles/LetterTileDrawable.java delete mode 100644 java/com/android/contacts/common/location/CountryDetector.java delete mode 100644 java/com/android/contacts/common/location/UpdateCountryService.java delete mode 100644 java/com/android/contacts/common/res/color/popup_menu_color.xml delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_ab_search.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_arrow_back_24dp.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_business_white_120dp.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_call_24dp.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_close_dk.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_create_24dp.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_group_white_24dp.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_history_white_drawable_24dp.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_info_outline_24dp.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_back.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_group_dk.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_group_lt.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_overflow_lt.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_person_dk.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_person_lt.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_remove_field_holo_light.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_dk.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_holo_light.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_lt.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_person_24dp.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_rx_videocam.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_tx_videocam.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_videocam.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/ic_voicemail_avatar.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/list_background_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/list_focused_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/list_longpressed_holo_light.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/list_pressed_holo_light.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/list_section_divider_holo_custom.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-hdpi/list_title_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_focused_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_section_divider_holo_custom.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_title_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_focused_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_section_divider_holo_custom.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_title_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-hdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-mdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-xhdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_focused_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_section_divider_holo_custom.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_title_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-mdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-mdpi/list_focused_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-mdpi/list_longpressed_holo_light.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-mdpi/list_pressed_holo_light.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-mdpi/list_section_divider_holo_custom.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-sw600dp-hdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-sw600dp-mdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-sw600dp-xhdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-xhdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-xhdpi/list_focused_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-xhdpi/list_longpressed_holo_light.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-xhdpi/list_pressed_holo_light.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-xhdpi/list_section_divider_holo_custom.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-xxhdpi/list_activated_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-xxhdpi/list_focused_holo.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-xxhdpi/list_longpressed_holo_light.9.png delete mode 100644 java/com/android/contacts/common/res/drawable-xxhdpi/list_pressed_holo_light.9.png delete mode 100644 java/com/android/contacts/common/res/drawable/ic_back_arrow.xml delete mode 100644 java/com/android/contacts/common/res/drawable/ic_call_and_share.xml delete mode 100644 java/com/android/contacts/common/res/drawable/ic_more_vert.xml delete mode 100644 java/com/android/contacts/common/res/drawable/ic_person_add_tinted_24dp.xml delete mode 100644 java/com/android/contacts/common/res/drawable/ic_search_add_contact.xml delete mode 100644 java/com/android/contacts/common/res/drawable/ic_search_video_call.xml delete mode 100644 java/com/android/contacts/common/res/drawable/list_selector_background_transition_holo_light.xml delete mode 100644 java/com/android/contacts/common/res/layout/account_selector_list_item.xml delete mode 100644 java/com/android/contacts/common/res/layout/account_selector_list_item_condensed.xml delete mode 100644 java/com/android/contacts/common/res/layout/call_subject_history.xml delete mode 100644 java/com/android/contacts/common/res/layout/list_separator.xml delete mode 100644 java/com/android/contacts/common/util/BitmapUtil.java delete mode 100644 java/com/android/contacts/common/util/NameConverter.java delete mode 100644 java/com/android/contacts/common/util/TrafficStatsTags.java delete mode 100644 java/com/android/contacts/common/util/UriUtils.java delete mode 100644 java/com/android/dialer/about/res/layout/dummy_placeholder.xml mode change 100644 => 100755 java/com/android/dialer/about/res/raw/third_party_license_metadata mode change 100644 => 100755 java/com/android/dialer/about/res/raw/third_party_licenses delete mode 100644 java/com/android/dialer/app/SpecialCharSequenceMgr.java delete mode 100644 java/com/android/dialer/app/bindings/DialerBindings.java delete mode 100644 java/com/android/dialer/app/bindings/DialerBindingsFactory.java delete mode 100644 java/com/android/dialer/app/bindings/DialerBindingsStub.java delete mode 100644 java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java create mode 100644 java/com/android/dialer/app/calllog/DialerQuickContactBadge.java create mode 100644 java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java delete mode 100644 java/com/android/dialer/app/calllog/PhoneAccountHandles.java create mode 100644 java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java create mode 100644 java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java delete mode 100644 java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipop.java delete mode 100644 java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipopMr1.java delete mode 100644 java/com/android/dialer/app/dialpad/DialpadFragment.java delete mode 100644 java/com/android/dialer/app/dialpad/PseudoEmergencyAnimator.java delete mode 100644 java/com/android/dialer/app/dialpad/SmartDialCursorLoader.java delete mode 100644 java/com/android/dialer/app/dialpad/UnicodeDialerKeyListener.java create mode 100644 java/com/android/dialer/app/list/DialerViewPager.java delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/empty_contacts.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_archive_white_24dp.png create mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_check_mark_48dp.png create mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_check_mark_blue_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_content_copy_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_delete_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_add_call.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_current_call.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png create mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_empty_check_mark_white_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_grade_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_more_vert_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_pause_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_people_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_play_arrow_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_results_phone.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_schedule_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_share_white_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dis.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dk.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dis.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dk.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_voicemail_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_volume_down_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-hdpi/ic_volume_up_24dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-mdpi/empty_contacts.png create mode 100644 java/com/android/dialer/app/res/drawable-mdpi/ic_check_mark_48dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-mdpi/ic_dialer_fork_add_call.png delete mode 100644 java/com/android/dialer/app/res/drawable-mdpi/ic_dialer_fork_current_call.png delete mode 100644 java/com/android/dialer/app/res/drawable-mdpi/ic_dialer_fork_tt_keypad.png delete mode 100644 java/com/android/dialer/app/res/drawable-mdpi/ic_results_phone.png delete mode 100644 java/com/android/dialer/app/res/drawable-mdpi/ic_vm_sound_off_dis.png delete mode 100644 java/com/android/dialer/app/res/drawable-mdpi/ic_vm_sound_off_dk.png delete mode 100644 java/com/android/dialer/app/res/drawable-mdpi/ic_vm_sound_on_dis.png delete mode 100644 java/com/android/dialer/app/res/drawable-mdpi/ic_vm_sound_on_dk.png delete mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/empty_contacts.png create mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/ic_check_mark_48dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/ic_dialer_fork_add_call.png delete mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/ic_dialer_fork_current_call.png delete mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/ic_dialer_fork_tt_keypad.png delete mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/ic_results_phone.png delete mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/ic_vm_sound_off_dis.png delete mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/ic_vm_sound_off_dk.png delete mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/ic_vm_sound_on_dis.png delete mode 100644 java/com/android/dialer/app/res/drawable-xhdpi/ic_vm_sound_on_dk.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/empty_contacts.png create mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/ic_check_mark_48dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/ic_dialer_fork_add_call.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/ic_dialer_fork_current_call.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/ic_dialer_fork_tt_keypad.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/ic_results_phone.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/ic_vm_sound_off_dis.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/ic_vm_sound_off_dk.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/ic_vm_sound_on_dis.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxhdpi/ic_vm_sound_on_dk.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxxhdpi/empty_contacts.png create mode 100644 java/com/android/dialer/app/res/drawable-xxxhdpi/ic_check_mark_48dp.png delete mode 100644 java/com/android/dialer/app/res/drawable-xxxhdpi/ic_results_phone.png delete mode 100644 java/com/android/dialer/app/res/drawable/background_dial_holo_dark.xml delete mode 100644 java/com/android/dialer/app/res/drawable/ic_search_phone.xml delete mode 100644 java/com/android/dialer/app/res/drawable/ic_speakerphone_off.xml delete mode 100644 java/com/android/dialer/app/res/drawable/ic_speakerphone_on.xml delete mode 100644 java/com/android/dialer/app/res/drawable/shadow_fade_left.xml delete mode 100644 java/com/android/dialer/app/res/drawable/shadow_fade_up.xml delete mode 100644 java/com/android/dialer/app/res/layout-land/dialpad_fragment.xml delete mode 100644 java/com/android/dialer/app/res/layout/account_filter_header_for_phone_favorite.xml create mode 100644 java/com/android/dialer/app/res/layout/action_mode_close_button.xml delete mode 100644 java/com/android/dialer/app/res/layout/all_contacts_activity.xml delete mode 100644 java/com/android/dialer/app/res/layout/dialpad_chooser_list_item.xml delete mode 100644 java/com/android/dialer/app/res/layout/dialpad_fragment.xml delete mode 100644 java/com/android/dialer/app/res/layout/empty_content_view.xml delete mode 100644 java/com/android/dialer/app/res/menu/dialpad_options.xml delete mode 100644 java/com/android/dialer/app/res/values/donottranslate_config.xml delete mode 100644 java/com/android/dialer/app/res/xml/searchable.xml create mode 100644 java/com/android/dialer/app/voicemail/error/VoicemailStatusWorker.java create mode 100644 java/com/android/dialer/app/voicemail/error/VoicemailTosMessageCreator.java create mode 100644 java/com/android/dialer/app/voicemail/error/res/drawable/shadow.xml create mode 100644 java/com/android/dialer/app/voicemail/error/res/drawable/voicemail_tos_image.png delete mode 100644 java/com/android/dialer/app/widget/EmptyContentView.java delete mode 100644 java/com/android/dialer/backup/DialerBackupAgent.java delete mode 100644 java/com/android/dialer/backup/DialerBackupUtils.java create mode 100644 java/com/android/dialer/backup/DialerPersistentBackupAgent.java delete mode 100644 java/com/android/dialer/backup/proto/voicemail_info.proto create mode 100644 java/com/android/dialer/binary/aosp/testing/AndroidManifest.xml create mode 100644 java/com/android/dialer/binary/aosp/testing/TestActivity.java create mode 100644 java/com/android/dialer/binary/google/AndroidManifest.xml create mode 100644 java/com/android/dialer/binary/google/GoogleStubDialerApplication.java create mode 100644 java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java delete mode 100644 java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png delete mode 100644 java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png delete mode 100644 java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png create mode 100644 java/com/android/dialer/buildtype/bugfood/BuildTypeAccessorImpl.java create mode 100644 java/com/android/dialer/buildtype/dogfood/BuildTypeAccessorImpl.java create mode 100644 java/com/android/dialer/buildtype/fishfood/BuildTypeAccessorImpl.java create mode 100644 java/com/android/dialer/buildtype/test/BuildTypeAccessorImpl.java delete mode 100644 java/com/android/dialer/callcomposer/camera/ImagePersistTask.java create mode 100644 java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java delete mode 100644 java/com/android/dialer/callcomposer/proto/call_composer_contact.proto create mode 100644 java/com/android/dialer/calldetails/ReportDialogFragment.java create mode 100644 java/com/android/dialer/calldetails/res/layout/caller_id_report_dialog.xml create mode 100644 java/com/android/dialer/callintent/speed_dial_contact_type.proto delete mode 100644 java/com/android/dialer/calllog/DataSources.java create mode 100644 java/com/android/dialer/calllog/database/AndroidManifest.xml delete mode 100644 java/com/android/dialer/calllog/database/AnnotatedCallLog.java create mode 100644 java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java create mode 100644 java/com/android/dialer/calllog/database/CallLogDatabaseComponent.java delete mode 100644 java/com/android/dialer/calllog/database/CallLogMutations.java create mode 100644 java/com/android/dialer/calllog/database/Coalescer.java create mode 100644 java/com/android/dialer/calllog/database/MutationApplier.java create mode 100644 java/com/android/dialer/calllog/database/annotated_call_log.proto create mode 100644 java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java create mode 100644 java/com/android/dialer/calllog/datasources/CallLogMutations.java create mode 100644 java/com/android/dialer/calllog/datasources/DataSources.java create mode 100644 java/com/android/dialer/calllog/datasources/util/RowCombiner.java delete mode 100644 java/com/android/dialer/calllog/ui/AnnotatedCallLogCursorLoader.java create mode 100644 java/com/android/dialer/calllog/ui/CoalescedAnnotatedCallLogCursorLoader.java create mode 100644 java/com/android/dialer/calllog/ui/HeaderViewHolder.java create mode 100644 java/com/android/dialer/calllog/ui/NewCallLogAdapter.java create mode 100644 java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java create mode 100644 java/com/android/dialer/calllog/ui/res/layout/new_call_log_header.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-af/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-am/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ar/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-az/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-be/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-bg/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-bn/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-bs/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ca/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-cs/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-da/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-de/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-el/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-en-rAU/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-en-rGB/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-en-rIN/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-es-rUS/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-es/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-et/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-eu/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-fa/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-fi/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-fr/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-gl/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-gu/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-hi/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-hr/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-hu/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-hy/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-in/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-is/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-it/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-iw/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ja/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ka/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-kk/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-km/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-kn/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ko/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ky/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-lo/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-lt/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-lv/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-mk/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ml/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-mn/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-mr/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ms/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-my/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-nb/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ne/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-nl/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-no/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-pa/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-pl/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-pt/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ro/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ru/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-si/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-sk/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-sl/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-sq/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-sr/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-sv/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-sw/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ta/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-te/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-th/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-tl/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-tr/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-uk/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-ur/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-uz/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-vi/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values-zu/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values/dimens.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values/strings.xml create mode 100644 java/com/android/dialer/calllog/ui/res/values/styles.xml delete mode 100644 java/com/android/dialer/calllogutils/CallEntryFormatter.java create mode 100644 java/com/android/dialer/calllogutils/CallLogDates.java create mode 100644 java/com/android/dialer/calllogutils/CallLogDurations.java delete mode 100644 java/com/android/dialer/common/ConfigProvider.java delete mode 100644 java/com/android/dialer/common/ConfigProviderBindings.java delete mode 100644 java/com/android/dialer/common/ConfigProviderFactory.java create mode 100644 java/com/android/dialer/common/concurrent/DialerExecutorComponent.java create mode 100644 java/com/android/dialer/common/concurrent/DialerExecutorModule.java create mode 100644 java/com/android/dialer/common/database/Selection.java delete mode 100644 java/com/android/dialer/common/res/values/config.xml create mode 100644 java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java create mode 100644 java/com/android/dialer/configprovider/AndroidManifest.xml create mode 100644 java/com/android/dialer/configprovider/ConfigProvider.java create mode 100644 java/com/android/dialer/configprovider/ConfigProviderBindings.java create mode 100644 java/com/android/dialer/configprovider/ConfigProviderComponent.java create mode 100644 java/com/android/dialer/configprovider/SharedPrefConfigProvider.java create mode 100644 java/com/android/dialer/configprovider/SharedPrefConfigProviderModule.java create mode 100644 java/com/android/dialer/constants/ActivityRequestCodes.java create mode 100644 java/com/android/dialer/constants/TrafficStatsTags.java create mode 100644 java/com/android/dialer/constants/googledialer/ConstantsImpl.java create mode 100644 java/com/android/dialer/contactactions/AndroidManifest.xml create mode 100644 java/com/android/dialer/contactactions/ContactActionBottomSheet.java create mode 100644 java/com/android/dialer/contactactions/ContactActionModule.java create mode 100644 java/com/android/dialer/contactactions/DividerModule.java create mode 100644 java/com/android/dialer/contactactions/IntentModule.java create mode 100644 java/com/android/dialer/contactactions/res/layout/contact_layout.xml create mode 100644 java/com/android/dialer/contactactions/res/layout/divider_layout.xml create mode 100644 java/com/android/dialer/contactactions/res/layout/module_layout.xml create mode 100644 java/com/android/dialer/contactactions/res/layout/sheet_layout.xml create mode 100644 java/com/android/dialer/contactactions/res/values/dimens.xml create mode 100644 java/com/android/dialer/contactphoto/AndroidManifest.xml create mode 100644 java/com/android/dialer/contactphoto/BitmapUtil.java create mode 100644 java/com/android/dialer/contactphoto/ContactPhotoManager.java create mode 100644 java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java create mode 100644 java/com/android/dialer/contactphoto/res/values-af/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-am/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ar/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-az/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-be/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-bg/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-bn/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-bs/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ca/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-cs/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-da/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-de/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-el/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-en-rAU/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-en-rGB/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-en-rIN/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-es-rUS/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-es/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-et/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-eu/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-fa/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-fi/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-fr/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-gl/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-gu/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-hi/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-hr/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-hu/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-hy/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-in/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-is/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-it/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-iw/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ja/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ka/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-kk/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-km/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-kn/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ko/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ky/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-lo/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-lt/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-lv/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-mk/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ml/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-mn/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-mr/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ms/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-my/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-nb/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ne/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-nl/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-no/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-pa/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-pl/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-pt/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ro/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ru/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-si/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-sk/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-sl/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-sq/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-sr/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-sv/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-sw/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ta/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-te/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-th/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-tl/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-tr/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-uk/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-ur/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-uz/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-vi/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values-zu/strings.xml create mode 100644 java/com/android/dialer/contactphoto/res/values/dimens.xml create mode 100644 java/com/android/dialer/contactphoto/res/values/strings.xml create mode 100644 java/com/android/dialer/contactsfragment/AddContactViewHolder.java create mode 100644 java/com/android/dialer/contactsfragment/FastScroller.java create mode 100644 java/com/android/dialer/contactsfragment/res/drawable/fast_scroller_container_background.xml create mode 100644 java/com/android/dialer/contactsfragment/res/drawable/fast_scroller_scroll_bar.xml create mode 100644 java/com/android/dialer/contactsfragment/res/layout/add_contact_row.xml create mode 100644 java/com/android/dialer/databasepopulator/AndroidManifest.xml create mode 100644 java/com/android/dialer/databasepopulator/CallLogPopulator.java create mode 100644 java/com/android/dialer/databasepopulator/ContactsPopulator.java create mode 100644 java/com/android/dialer/databasepopulator/VoicemailPopulator.java create mode 100644 java/com/android/dialer/dialercontact/dialer_contact.proto create mode 100644 java/com/android/dialer/dialpadview/DialpadFragment.java create mode 100644 java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java create mode 100644 java/com/android/dialer/dialpadview/SmartDialCursorLoader.java create mode 100644 java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java create mode 100644 java/com/android/dialer/dialpadview/UnicodeDialerKeyListener.java delete mode 100644 java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_close_black_24dp.png create mode 100755 java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_add_call.png create mode 100755 java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_current_call.png create mode 100755 java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png delete mode 100644 java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_delete.png delete mode 100644 java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_voicemail.png delete mode 100644 java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_overflow_menu.png create mode 100644 java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_add_call.png create mode 100644 java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_current_call.png create mode 100644 java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_tt_keypad.png create mode 100644 java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_add_call.png create mode 100644 java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_current_call.png create mode 100644 java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_tt_keypad.png create mode 100644 java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_add_call.png create mode 100644 java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_current_call.png create mode 100644 java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_tt_keypad.png delete mode 100644 java/com/android/dialer/dialpadview/res/drawable/dialpad_scrim.xml create mode 100644 java/com/android/dialer/dialpadview/res/drawable/ic_wifi_calling.xml create mode 100644 java/com/android/dialer/dialpadview/res/drawable/shadow_fade_left.xml create mode 100644 java/com/android/dialer/dialpadview/res/drawable/shadow_fade_up.xml create mode 100644 java/com/android/dialer/dialpadview/res/layout-land/dialpad_fragment.xml create mode 100644 java/com/android/dialer/dialpadview/res/layout/dialpad_chooser_list_item.xml create mode 100644 java/com/android/dialer/dialpadview/res/layout/dialpad_fragment.xml create mode 100644 java/com/android/dialer/dialpadview/res/menu/dialpad_options.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/AndroidManifest.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/EnrichedCallSimulatorActivity.java create mode 100644 java/com/android/dialer/enrichedcall/simulator/SessionViewHolder.java create mode 100644 java/com/android/dialer/enrichedcall/simulator/SessionsAdapter.java create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/layout/enriched_call_simulator_activity.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/layout/session_view_holder.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-af/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-am/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ar/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-az/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-be/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-bg/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-bn/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-bs/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ca/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-cs/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-da/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-de/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-el/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-en-rAU/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-en-rGB/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-en-rIN/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-es-rUS/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-es/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-et/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-eu/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-fa/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-fi/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-fr/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-gl/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-gu/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-hi/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-hr/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-hu/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-hy/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-in/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-is/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-it/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-iw/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ja/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ka/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-kk/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-km/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-kn/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ko/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ky/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-lo/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-lt/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-lv/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-mk/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ml/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-mn/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-mr/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ms/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-my/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-nb/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ne/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-nl/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-no/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-pa/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-pl/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-pt/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ro/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ru/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-si/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-sk/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-sl/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-sq/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-sr/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-sv/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-sw/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ta/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-te/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-th/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-tl/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-tr/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-uk/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-ur/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-uz/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-vi/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values-zu/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/simulator/res/values/strings.xml create mode 100644 java/com/android/dialer/enrichedcall/videoshare/VideoShareSession.java create mode 100644 java/com/android/dialer/function/Supplier.java create mode 100644 java/com/android/dialer/inject/ApplicationContext.java mode change 100644 => 100755 java/com/android/dialer/interactions/res/layout/phone_disambig_item.xml create mode 100644 java/com/android/dialer/lettertile/AndroidManifest.xml create mode 100644 java/com/android/dialer/lettertile/LetterTileDrawable.java create mode 100644 java/com/android/dialer/lettertile/res/values/colors.xml create mode 100644 java/com/android/dialer/lettertile/res/values/dimens.xml create mode 100644 java/com/android/dialer/logging/people_api_lookup_error.proto create mode 100644 java/com/android/dialer/logging/ui_action.proto create mode 100644 java/com/android/dialer/main/Main.java create mode 100644 java/com/android/dialer/main/MainComponent.java create mode 100644 java/com/android/dialer/main/impl/AndroidManifest.xml create mode 100644 java/com/android/dialer/main/impl/MainActivity.java create mode 100644 java/com/android/dialer/main/impl/MainImpl.java create mode 100644 java/com/android/dialer/main/impl/MainModule.java create mode 100644 java/com/android/dialer/main/impl/MainPagerAdapter.java create mode 100644 java/com/android/dialer/main/impl/StubFragment.java create mode 100644 java/com/android/dialer/main/impl/res/drawable-xxxhdpi/nui_launcher_icon.png create mode 100644 java/com/android/dialer/main/impl/res/layout/main_activity.xml create mode 100644 java/com/android/dialer/main/impl/res/layout/stub_fragment.xml create mode 100644 java/com/android/dialer/main/impl/res/menu/main_menu.xml create mode 100644 java/com/android/dialer/main/impl/res/values-af/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-am/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ar/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-az/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-be/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-bg/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-bn/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-bs/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ca/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-cs/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-da/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-de/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-el/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-en-rAU/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-en-rGB/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-en-rIN/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-es-rUS/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-es/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-et/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-eu/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-fa/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-fi/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-fr/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-gl/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-gu/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-hi/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-hr/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-hu/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-hy/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-in/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-is/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-it/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-iw/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ja/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ka/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-kk/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-km/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-kn/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ko/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ky/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-lo/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-lt/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-lv/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-mk/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ml/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-mn/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-mr/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ms/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-my/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-nb/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ne/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-nl/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-no/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-pa/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-pl/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-pt/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ro/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ru/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-si/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-sk/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-sl/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-sq/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-sr/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-sv/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-sw/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ta/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-te/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-th/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-tl/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-tr/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-uk/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-ur/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-uz/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-vi/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values-zu/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values/strings.xml create mode 100644 java/com/android/dialer/main/impl/res/values/styles.xml create mode 100644 java/com/android/dialer/notification/DialerNotificationManager.java delete mode 100644 java/com/android/dialer/notification/GroupedNotificationUtil.java create mode 100644 java/com/android/dialer/notification/NotificationChannelId.java create mode 100644 java/com/android/dialer/notification/NotificationManagerUtils.java create mode 100644 java/com/android/dialer/notification/NotificationThrottler.java delete mode 100644 java/com/android/dialer/notification/PackageUpdatedReceiver.java create mode 100644 java/com/android/dialer/notification/VoicemailChannelUtils.java delete mode 100644 java/com/android/dialer/notification/res/values/ids.xml create mode 100644 java/com/android/dialer/performancereport/PerformanceReport.java create mode 100644 java/com/android/dialer/phonenumbergeoutil/PhoneNumberGeoUtil.java create mode 100644 java/com/android/dialer/phonenumbergeoutil/PhoneNumberGeoUtilComponent.java create mode 100644 java/com/android/dialer/phonenumbergeoutil/impl/PhoneNumberGeoUtilImpl.java create mode 100644 java/com/android/dialer/phonenumbergeoutil/impl/PhoneNumberGeoUtilModule.java create mode 100644 java/com/android/dialer/phonenumbergeoutil/stub/PhoneNumberGeoUtilStub.java create mode 100644 java/com/android/dialer/phonenumbergeoutil/stub/StubPhoneNumberGeoUtilModule.java create mode 100644 java/com/android/dialer/phonenumberproto/Converter.java create mode 100644 java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java create mode 100644 java/com/android/dialer/phonenumberproto/dialer_phone_number.proto create mode 100644 java/com/android/dialer/searchfragment/README.md create mode 100644 java/com/android/dialer/searchfragment/common/AndroidManifest.xml create mode 100644 java/com/android/dialer/searchfragment/common/Projections.java create mode 100644 java/com/android/dialer/searchfragment/common/QueryBoldingUtil.java create mode 100644 java/com/android/dialer/searchfragment/common/QueryFilteringUtil.java create mode 100644 java/com/android/dialer/searchfragment/common/RowClickListener.java create mode 100644 java/com/android/dialer/searchfragment/common/SearchCursor.java create mode 100644 java/com/android/dialer/searchfragment/common/res/layout/search_contact_row.xml create mode 100644 java/com/android/dialer/searchfragment/common/res/values/dimens.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/AndroidManifest.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/ContactFilterCursor.java create mode 100644 java/com/android/dialer/searchfragment/cp2/SearchContactViewHolder.java create mode 100644 java/com/android/dialer/searchfragment/cp2/SearchContactsCursor.java create mode 100644 java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-af/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-am/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ar/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-az/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-be/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-bg/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-bn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-bs/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ca/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-cs/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-da/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-de/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-el/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-en-rAU/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-en-rGB/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-en-rIN/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-es-rUS/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-es/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-et/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-eu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-fa/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-fi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-fr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-gl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-gu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-hi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-hr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-hu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-hy/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-in/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-is/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-it/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-iw/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ja/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ka/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-kk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-km/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-kn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ko/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ky/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-lo/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-lt/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-lv/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-mk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ml/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-mn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-mr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ms/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-my/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-nb/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ne/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-nl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-no/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-pa/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-pl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-pt/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ro/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ru/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-si/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-sk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-sl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-sq/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-sr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-sv/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-sw/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ta/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-te/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-th/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-tl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-tr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-uk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-ur/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-uz/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-vi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values-zu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/cp2/res/values/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/AndroidManifest.xml create mode 100644 java/com/android/dialer/searchfragment/list/HeaderViewHolder.java create mode 100644 java/com/android/dialer/searchfragment/list/NewSearchFragment.java create mode 100644 java/com/android/dialer/searchfragment/list/SearchAdapter.java create mode 100644 java/com/android/dialer/searchfragment/list/SearchCursorManager.java create mode 100644 java/com/android/dialer/searchfragment/list/res/layout/fragment_search.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/layout/header_layout.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-af/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-am/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ar/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-az/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-be/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-bg/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-bn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-bs/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ca/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-cs/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-da/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-de/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-el/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-en-rAU/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-en-rGB/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-en-rIN/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-es-rUS/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-es/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-et/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-eu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-fa/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-fi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-fr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-gl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-gu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-hi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-hr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-hu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-hy/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-in/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-is/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-it/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-iw/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ja/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ka/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-kk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-km/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-kn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ko/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ky/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-lo/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-lt/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-lv/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-mk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ml/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-mn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-mr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ms/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-my/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-nb/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ne/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-nl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-no/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-pa/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-pl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-pt/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ro/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ru/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-si/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-sk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-sl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-sq/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-sr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-sv/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-sw/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ta/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-te/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-th/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-tl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-tr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-uk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-ur/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-uz/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-vi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values-zu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/list/res/values/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/AndroidManifest.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlaceViewHolder.java create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlacesCursor.java create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlacesCursorLoader.java create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-af/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-am/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ar/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-az/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-be/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-bg/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-bn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-bs/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ca/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-cs/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-da/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-de/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-el/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rAU/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rGB/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rIN/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-es-rUS/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-es/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-et/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-eu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-fa/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-fi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-fr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-gl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-gu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-hi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-hr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-hu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-hy/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-in/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-is/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-it/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-iw/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ja/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ka/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-kk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-km/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-kn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ko/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ky/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-lo/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-lt/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-lv/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-mk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ml/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-mn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-mr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ms/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-my/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-nb/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ne/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-nl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-no/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-pa/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-pl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ro/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ru/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-si/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-sk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-sl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-sq/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-sr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-sv/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-sw/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ta/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-te/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-th/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-tl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-tr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-uk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-ur/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-uz/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-vi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values-zu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/res/values/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/AndroidManifest.xml create mode 100644 java/com/android/dialer/searchfragment/remote/RemoteContactViewHolder.java create mode 100644 java/com/android/dialer/searchfragment/remote/RemoteContactsCursor.java create mode 100644 java/com/android/dialer/searchfragment/remote/RemoteContactsCursorLoader.java create mode 100644 java/com/android/dialer/searchfragment/remote/RemoteDirectoriesCursorLoader.java create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-af/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-am/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ar/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-az/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-be/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-bg/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-bn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-bs/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ca/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-cs/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-da/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-de/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-el/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-en-rAU/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-en-rGB/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-en-rIN/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-es-rUS/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-es/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-et/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-eu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-fa/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-fi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-fr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-gl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-gu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-hi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-hr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-hu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-hy/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-in/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-is/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-it/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-iw/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ja/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ka/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-kk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-km/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-kn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ko/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ky/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-lo/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-lt/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-lv/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-mk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ml/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-mn/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-mr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ms/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-my/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-nb/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ne/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-nl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-no/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-pa/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-pl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-pt/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ro/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ru/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-si/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-sk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-sl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-sq/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-sr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-sv/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-sw/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ta/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-te/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-th/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-tl/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-tr/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-uk/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-ur/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-uz/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-vi/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values-zu/strings.xml create mode 100644 java/com/android/dialer/searchfragment/remote/res/values/strings.xml create mode 100644 java/com/android/dialer/searchfragment/testing/TestSearchCursor.java create mode 100644 java/com/android/dialer/shortcuts/res/drawable-anydpi-v26/ic_shortcut_add_contact.xml create mode 100644 java/com/android/dialer/shortcuts/res/drawable/ic_add_contact_foreground.xml delete mode 100644 java/com/android/dialer/simulator/impl/SimulatorCallLog.java delete mode 100644 java/com/android/dialer/simulator/impl/SimulatorContacts.java create mode 100644 java/com/android/dialer/simulator/impl/SimulatorMissedCallCreator.java create mode 100644 java/com/android/dialer/simulator/impl/SimulatorNotifications.java create mode 100644 java/com/android/dialer/simulator/impl/SimulatorSpamCallCreator.java delete mode 100644 java/com/android/dialer/simulator/impl/SimulatorVoicemail.java create mode 100644 java/com/android/dialer/storage/DeviceProtected.java create mode 100644 java/com/android/dialer/storage/StorageComponent.java create mode 100644 java/com/android/dialer/storage/StorageModule.java create mode 100644 java/com/android/dialer/strictmode/DialerStrictMode.java create mode 100644 java/com/android/dialer/strictmode/StrictModeUtils.java delete mode 100644 java/com/android/dialer/theme/res/animator/button_elevation.xml delete mode 100644 java/com/android/dialer/theme/res/drawable-hdpi/ic_block_24dp.png create mode 100644 java/com/android/dialer/time/Clock.java create mode 100644 java/com/android/dialer/util/UriUtils.java create mode 100644 java/com/android/dialer/voicemail/listui/AndroidManifest.xml create mode 100644 java/com/android/dialer/voicemail/listui/VoicemailFragment.java create mode 100644 java/com/android/dialer/voicemail/listui/res/layout/voicemail_fragment.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-af/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-am/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ar/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-az/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-be/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-bg/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-bn/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-bs/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ca/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-cs/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-da/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-de/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-el/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-en-rAU/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-en-rGB/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-en-rIN/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-es-rUS/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-es/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-et/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-eu/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-fa/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-fi/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-fr/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-gl/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-gu/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-hi/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-hr/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-hu/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-hy/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-in/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-is/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-it/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-iw/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ja/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ka/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-kk/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-km/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-kn/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ko/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ky/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-lo/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-lt/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-lv/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-mk/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ml/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-mn/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-mr/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ms/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-my/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-nb/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ne/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-nl/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-no/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-pa/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-pl/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-pt/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ro/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ru/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-si/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-sk/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-sl/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-sq/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-sr/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-sv/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-sw/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ta/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-te/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-th/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-tl/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-tr/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-uk/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-ur/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-uz/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-vi/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values-zu/strings.xml create mode 100644 java/com/android/dialer/voicemail/listui/res/values/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-af/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-am/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ar/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-az/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-b+sr+Latn/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-be/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-bg/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-bn/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-bs/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ca/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-cs/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-da/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-de/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-el/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-en-rAU/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-en-rGB/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-en-rIN/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-es-rUS/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-es/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-et/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-eu/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-fa/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-fi/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-fr-rCA/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-fr/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-gl/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-gu/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-hi/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-hr/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-hu/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-hy/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-in/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-is/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-it/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-iw/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ja/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ka/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-kk/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-km/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-kn/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ko/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ky/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-lo/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-lt/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-lv/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-mk/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ml/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-mn/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-mr/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ms/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-my/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-nb/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ne/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-nl/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-no/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-pa/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-pl/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-pt-rBR/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-pt-rPT/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-pt/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ro/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ru/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-si/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-sk/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-sl/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-sq/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-sr/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-sv/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-sw/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ta/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-te/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-th/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-tl/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-tr/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-uk/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-ur/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-uz/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-vi/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-zh-rCN/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-zh-rHK/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-zh-rTW/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values-zu/strings.xml delete mode 100644 java/com/android/dialer/voicemailstatus/res/values/strings.xml create mode 100644 java/com/android/dialer/widget/EmptyContentView.java create mode 100644 java/com/android/dialer/widget/LockableViewPager.java create mode 100644 java/com/android/dialer/widget/res/drawable-hdpi/empty_contacts.png create mode 100644 java/com/android/dialer/widget/res/drawable-mdpi/empty_contacts.png create mode 100644 java/com/android/dialer/widget/res/drawable-xhdpi/empty_contacts.png create mode 100644 java/com/android/dialer/widget/res/drawable-xxhdpi/empty_contacts.png create mode 100644 java/com/android/dialer/widget/res/drawable-xxxhdpi/empty_contacts.png create mode 100644 java/com/android/dialer/widget/res/layout-land/empty_content_view.xml create mode 100644 java/com/android/dialer/widget/res/layout/empty_content_view.xml create mode 100644 java/com/android/dialer/widget/res/values/colors.xml create mode 100644 java/com/android/dialershared/bubble/AndroidManifest.xml create mode 100644 java/com/android/dialershared/bubble/Bubble.java create mode 100644 java/com/android/dialershared/bubble/BubbleInfo.java create mode 100644 java/com/android/dialershared/bubble/ChangeOnScreenBounds.java create mode 100644 java/com/android/dialershared/bubble/CheckableImageButton.java create mode 100644 java/com/android/dialershared/bubble/MoveHandler.java create mode 100644 java/com/android/dialershared/bubble/WindowRoot.java create mode 100644 java/com/android/dialershared/bubble/g3doc/INTEGRATION.md create mode 100644 java/com/android/dialershared/bubble/g3doc/images/bubble_collapsed.png create mode 100644 java/com/android/dialershared/bubble/g3doc/images/bubble_expanded.png create mode 100644 java/com/android/dialershared/bubble/g3doc/images/bubble_state.png create mode 100644 java/com/android/dialershared/bubble/g3doc/images/bubble_text.png create mode 100644 java/com/android/dialershared/bubble/res/color/bubble_checkable_mask.xml create mode 100644 java/com/android/dialershared/bubble/res/color/bubble_icon_tint_states.xml create mode 100644 java/com/android/dialershared/bubble/res/drawable/bubble_background_pill_ltr.xml create mode 100644 java/com/android/dialershared/bubble/res/drawable/bubble_background_pill_rtl.xml create mode 100644 java/com/android/dialershared/bubble/res/drawable/bubble_ripple_checkable_circle.xml create mode 100644 java/com/android/dialershared/bubble/res/drawable/bubble_ripple_circle.xml create mode 100644 java/com/android/dialershared/bubble/res/layout/bubble_base.xml create mode 100644 java/com/android/dialershared/bubble/res/values/colors.xml create mode 100644 java/com/android/dialershared/bubble/res/values/values.xml create mode 100644 java/com/android/incallui/AudioRouteSelectorActivity.java create mode 100644 java/com/android/incallui/ReturnToCallActionReceiver.java create mode 100644 java/com/android/incallui/ReturnToCallController.java delete mode 100644 java/com/android/incallui/answer/impl/PillDrawable.java delete mode 100644 java/com/android/incallui/answer/impl/answermethod/res/drawable/call_answer.xml delete mode 100644 java/com/android/incallui/answer/impl/res/anim/incoming_unlocked_icon_entry.xml delete mode 100644 java/com/android/incallui/answer/impl/res/anim/incoming_unlocked_text_entry.xml delete mode 100644 java/com/android/incallui/calllocation/impl/TrafficStatsTags.java create mode 100644 java/com/android/incallui/callpending/AndroidManifest.xml create mode 100644 java/com/android/incallui/callpending/CallPendingActivity.java create mode 100644 java/com/android/incallui/callpending/res/layout/pending_incall_screen.xml delete mode 100644 java/com/android/incallui/commontheme/res/anim/blinking.xml delete mode 100644 java/com/android/incallui/commontheme/res/drawable-hdpi/ic_phone_audio_white_36dp.png delete mode 100644 java/com/android/incallui/commontheme/res/drawable-mdpi/ic_phone_audio_white_36dp.png delete mode 100644 java/com/android/incallui/commontheme/res/drawable-xhdpi/ic_phone_audio_white_36dp.png delete mode 100644 java/com/android/incallui/commontheme/res/drawable-xxhdpi/ic_phone_audio_white_36dp.png delete mode 100644 java/com/android/incallui/commontheme/res/drawable-xxxhdpi/ic_phone_audio_white_36dp.png create mode 100644 java/com/android/incallui/disconnectdialog/AndroidManifest.xml create mode 100644 java/com/android/incallui/disconnectdialog/DefaultErrorDialog.java create mode 100644 java/com/android/incallui/disconnectdialog/DisconnectDialog.java create mode 100644 java/com/android/incallui/disconnectdialog/DisconnectMessage.java create mode 100644 java/com/android/incallui/disconnectdialog/EnableWifiCallingPrompt.java create mode 100644 java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java create mode 100644 java/com/android/incallui/disconnectdialog/res/values-af/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-am/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ar/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-az/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-be/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-bg/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-bn/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-bs/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ca/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-cs/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-da/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-de/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-el/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-en-rAU/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-en-rGB/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-en-rIN/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-es-rUS/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-es/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-et/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-eu/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-fa/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-fi/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-fr/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-gl/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-gu/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-hi/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-hr/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-hu/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-hy/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-in/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-is/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-it/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-iw/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ja/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ka/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-kk/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-km/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-kn/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ko/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ky/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-lo/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-lt/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-lv/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-mk/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ml/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-mn/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-mr/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ms/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-my/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-nb/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ne/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-nl/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-no/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-pa/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-pl/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-pt/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ro/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ru/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-si/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-sk/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-sl/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-sq/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-sr/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-sv/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-sw/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ta/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-te/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-th/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-tl/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-tr/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-uk/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-ur/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-uz/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-vi/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values-zu/strings.xml create mode 100644 java/com/android/incallui/disconnectdialog/res/values/strings.xml delete mode 100644 java/com/android/incallui/incall/impl/LockableViewPager.java delete mode 100644 java/com/android/incallui/incall/impl/res/drawable/incall_ic_add_call.xml delete mode 100644 java/com/android/incallui/incall/impl/res/drawable/incall_ic_dialpad.xml delete mode 100644 java/com/android/incallui/incall/impl/res/drawable/incall_ic_manage.xml delete mode 100644 java/com/android/incallui/incall/impl/res/drawable/incall_ic_merge.xml delete mode 100644 java/com/android/incallui/incall/impl/res/drawable/incall_ic_pause.xml delete mode 100644 java/com/android/incallui/incall/impl/res/drawable/tab_indicator_default.xml delete mode 100644 java/com/android/incallui/incall/impl/res/drawable/tab_indicator_selected.xml delete mode 100644 java/com/android/incallui/incall/impl/res/drawable/tab_selector.xml delete mode 100644 java/com/android/incallui/incall/impl/res/layout/call_composer_data_fragment.xml delete mode 100644 java/com/android/incallui/incall/impl/res/values-h580dp/dimens.xml delete mode 100644 java/com/android/incallui/incall/impl/res/values-h580dp/styles.xml create mode 100644 java/com/android/incallui/incall/impl/res/values-h600dp/dimens.xml create mode 100644 java/com/android/incallui/incall/impl/res/values-h650dp/styles.xml delete mode 100644 java/com/android/incallui/incall/impl/res/values-w260dp-h520dp/dimens.xml create mode 100644 java/com/android/incallui/incall/impl/res/values-w260dp-h580dp/dimens.xml delete mode 100644 java/com/android/incallui/incall/impl/res/values-w300dp-h540dp/dimens.xml create mode 100644 java/com/android/incallui/incall/impl/res/values-w300dp-h620dp/dimens.xml delete mode 100644 java/com/android/incallui/res/anim/activity_open_enter.xml delete mode 100644 java/com/android/incallui/res/anim/activity_open_exit.xml delete mode 100644 java/com/android/incallui/res/anim/decelerate_cubic.xml delete mode 100644 java/com/android/incallui/res/anim/decelerate_quint.xml delete mode 100644 java/com/android/incallui/res/anim/on_going_call.xml delete mode 100644 java/com/android/incallui/res/color/ota_title_color.xml delete mode 100644 java/com/android/incallui/res/drawable-hdpi/ic_block_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/ic_call_end_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/ic_close_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/ic_location_on_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/ic_person_add_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/ic_question_mark.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/ic_schedule_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/img_business.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/img_conference.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/img_no_image.png delete mode 100644 java/com/android/incallui/res/drawable-hdpi/img_phone.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/ic_block_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/ic_call_end_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/ic_close_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/ic_location_on_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/ic_person_add_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/ic_question_mark.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/ic_schedule_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/img_business.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/img_conference.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/img_no_image.png delete mode 100644 java/com/android/incallui/res/drawable-mdpi/img_phone.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/ic_block_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/ic_call_end_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/ic_close_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/ic_location_on_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/ic_person_add_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/ic_question_mark.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/ic_schedule_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/img_business.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/img_conference.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/img_no_image.png delete mode 100644 java/com/android/incallui/res/drawable-xhdpi/img_phone.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/ic_block_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/ic_call_end_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/ic_close_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/ic_location_on_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/ic_person_add_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/ic_question_mark.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/ic_schedule_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/img_business.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/img_conference.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/img_no_image.png delete mode 100644 java/com/android/incallui/res/drawable-xxhdpi/img_phone.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/ic_block_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/ic_call_end_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/ic_close_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/ic_location_on_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/ic_person_add_grey600_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/ic_question_mark.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/ic_schedule_white_24dp.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/img_business.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/img_conference.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/img_no_image.png delete mode 100644 java/com/android/incallui/res/drawable-xxxhdpi/img_phone.png delete mode 100644 java/com/android/incallui/res/drawable/img_conference_automirrored.xml delete mode 100644 java/com/android/incallui/res/drawable/img_no_image_automirrored.xml create mode 100644 java/com/android/incallui/res/drawable/on_going_call.xml delete mode 100644 java/com/android/incallui/res/drawable/spam_notification_icon.xml delete mode 100644 java/com/android/incallui/res/drawable/unknown_notification_icon.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-af/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-am/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ar/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-az/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-b+sr+Latn/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-be/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-bg/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-bn/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-bs/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ca/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-cs/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-da/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-de/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-el/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-en-rAU/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-en-rGB/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-en-rIN/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-es-rUS/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-es/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-et/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-eu/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-fa/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-fi/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-fr-rCA/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-fr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-gl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-gu/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-hi/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-hr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-hu/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-hy/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-in/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-is/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-it/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-iw/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ja/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ka/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-kk/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-km/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-kn/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ko/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ky/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-lo/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-lt/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-lv/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-mk/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ml/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-mn/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-mr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ms/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-my/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-nb/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ne/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-nl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-no/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-pa/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-pl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-pt-rBR/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-pt-rPT/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-pt/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ro/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ru/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-si/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-sk/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-sl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-sq/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-sr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-sv/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-sw/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ta/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-te/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-th/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-tl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-tr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-uk/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-ur/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-uz/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-vi/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-zh-rCN/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-zh-rHK/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-zh-rTW/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01-zu/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc01/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-af/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-am/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ar/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-az/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-b+sr+Latn/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-be/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-bg/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-bn/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-bs/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ca/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-cs/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-da/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-de/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-el/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-en-rAU/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-en-rGB/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-en-rIN/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-es-rUS/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-es/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-et/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-eu/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-fa/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-fi/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-fr-rCA/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-fr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-gl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-gu/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-hi/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-hr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-hu/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-hy/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-in/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-is/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-it/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-iw/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ja/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ka/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-kk/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-km/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-kn/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ko/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ky/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-lo/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-lt/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-lv/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-mk/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ml/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-mn/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-mr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ms/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-my/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-nb/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ne/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-nl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-no/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-pa/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-pl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-pt-rBR/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-pt-rPT/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-pt/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ro/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ru/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-si/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-sk/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-sl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-sq/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-sr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-sv/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-sw/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ta/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-te/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-th/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-tl/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-tr/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-uk/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-ur/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-uz/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-vi/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-zh-rCN/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-zh-rHK/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-zh-rTW/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02-zu/strings.xml create mode 100644 java/com/android/incallui/res/values-mcc262-mnc02/strings.xml delete mode 100644 java/com/android/incallui/res/values/animation_constants.xml create mode 100644 java/com/android/incallui/spam/AndroidManifest.xml delete mode 100644 java/com/android/incallui/spam/NumberInCallHistoryTask.java create mode 100644 java/com/android/incallui/spam/res/drawable/spam_notification_icon.xml create mode 100644 java/com/android/incallui/spam/res/values-af/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-am/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ar/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-az/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-be/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-bg/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-bn/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-bs/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ca/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-cs/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-da/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-de/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-el/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-en-rAU/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-en-rGB/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-en-rIN/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-es-rUS/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-es/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-et/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-eu/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-fa/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-fi/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-fr/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-gl/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-gu/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-hi/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-hr/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-hu/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-hy/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-in/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-is/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-it/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-iw/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ja/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ka/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-kk/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-km/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-kn/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ko/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ky/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-lo/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-lt/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-lv/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-mk/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ml/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-mn/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-mr/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ms/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-my/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-nb/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ne/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-nl/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-no/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-pa/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-pl/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-pt/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ro/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ru/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-si/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-sk/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-sl/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-sq/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-sr/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-sv/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-sw/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ta/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-te/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-th/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-tl/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-tr/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-uk/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-ur/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-uz/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-vi/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/incallui/spam/res/values-zu/strings.xml create mode 100644 java/com/android/incallui/spam/res/values/strings.xml create mode 100644 java/com/android/incallui/speakerbuttonlogic/AndroidManifest.xml create mode 100644 java/com/android/incallui/speakerbuttonlogic/SpeakerButtonInfo.java delete mode 100644 java/com/android/incallui/video/impl/CameraPermissionDialogFragment.java delete mode 100644 java/com/android/incallui/video/impl/res/drawable-hdpi/video_button_bg_checked_disabled.png delete mode 100644 java/com/android/incallui/video/impl/res/drawable-hdpi/video_button_bg_disabled.png delete mode 100644 java/com/android/incallui/video/impl/res/drawable-mdpi/video_button_bg_checked_disabled.png delete mode 100644 java/com/android/incallui/video/impl/res/drawable-mdpi/video_button_bg_disabled.png delete mode 100644 java/com/android/incallui/video/impl/res/drawable-xhdpi/video_button_bg_checked_disabled.png delete mode 100644 java/com/android/incallui/video/impl/res/drawable-xhdpi/video_button_bg_disabled.png delete mode 100644 java/com/android/incallui/video/impl/res/drawable-xxhdpi/video_button_bg_checked_disabled.png delete mode 100644 java/com/android/incallui/video/impl/res/drawable-xxhdpi/video_button_bg_disabled.png delete mode 100644 java/com/android/incallui/wifi/AndroidManifest.xml delete mode 100644 java/com/android/incallui/wifi/EnableWifiCallingPrompt.java delete mode 100644 java/com/android/incallui/wifi/res/values-af/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-am/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ar/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-az/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-b+sr+Latn/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-be/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-bg/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-bn/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-bs/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ca/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-cs/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-da/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-de/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-el/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-en-rAU/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-en-rGB/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-en-rIN/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-es-rUS/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-es/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-et/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-eu/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-fa/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-fi/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-fr-rCA/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-fr/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-gl/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-gu/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-hi/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-hr/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-hu/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-hy/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-in/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-is/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-it/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-iw/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ja/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ka/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-kk/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-km/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-kn/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ko/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ky/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-lo/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-lt/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-lv/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-mk/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ml/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-mn/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-mr/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ms/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-my/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-nb/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ne/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-nl/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-no/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-pa/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-pl/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-pt-rBR/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-pt-rPT/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-pt/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ro/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ru/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-si/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-sk/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-sl/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-sq/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-sr/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-sv/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-sw/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ta/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-te/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-th/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-tl/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-tr/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-uk/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-ur/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-uz/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-vi/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-zh-rCN/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-zh-rHK/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-zh-rTW/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values-zu/strings.xml delete mode 100644 java/com/android/incallui/wifi/res/values/strings.xml create mode 100644 java/com/android/voicemail/AndroidManifest.xml create mode 100644 java/com/android/voicemail/VoicemailPowerCycleReceiver.java create mode 100644 java/com/android/voicemail/VoicemailSecretCodeReceiver.java delete mode 100644 java/com/android/voicemail/impl/OmtpReceiver.java create mode 100644 java/com/android/voicemail/impl/PackageReplacedReceiver.java delete mode 100644 java/com/android/voicemail/impl/SubscriptionInfoHelper.java delete mode 100644 java/com/android/voicemail/impl/TelephonyManagerStub.java delete mode 100644 java/com/android/voicemail/impl/VoicemailBootReceiver.java create mode 100644 java/com/android/voicemail/impl/VoicemailTranscriptionServiceGrpc.java delete mode 100644 java/com/android/voicemail/impl/VvmPackageInstallReceiver.java create mode 100644 java/com/android/voicemail/impl/configui/AndroidManifest.xml create mode 100644 java/com/android/voicemail/impl/configui/ConfigOverrideFragment.java create mode 100644 java/com/android/voicemail/impl/configui/VoicemailSecretCodeActivity.java create mode 100644 java/com/android/voicemail/impl/configui/res/values-af/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-am/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ar/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-az/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-b+sr+Latn/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-be/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-bg/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-bn/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-bs/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ca/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-cs/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-da/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-de/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-el/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-en-rAU/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-en-rGB/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-en-rIN/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-es-rUS/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-es/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-et/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-eu/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-fa/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-fi/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-fr-rCA/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-fr/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-gl/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-gu/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-hi/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-hr/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-hu/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-hy/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-in/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-is/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-it/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-iw/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ja/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ka/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-kk/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-km/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-kn/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ko/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ky/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-lo/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-lt/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-lv/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-mk/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ml/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-mn/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-mr/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ms/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-my/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-nb/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ne/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-nl/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-no/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-pa/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-pl/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-pt-rBR/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-pt-rPT/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-pt/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ro/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ru/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-si/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-sk/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-sl/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-sq/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-sr/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-sv/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-sw/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ta/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-te/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-th/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-tl/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-tr/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-uk/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-ur/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-uz/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-vi/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-zh-rCN/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-zh-rHK/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-zh-rTW/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values-zu/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/values/strings.xml create mode 100644 java/com/android/voicemail/impl/configui/res/xml/vvm_config_override.xml create mode 100644 java/com/android/voicemail/impl/proguard.flags delete mode 100644 java/com/android/voicemail/impl/scheduling/TaskSchedulerService.java create mode 100644 java/com/android/voicemail/impl/transcribe/TranscriptionBackfillService.java create mode 100644 java/com/android/voicemail/impl/transcribe/TranscriptionConfigProvider.java create mode 100644 java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java create mode 100644 java/com/android/voicemail/impl/transcribe/TranscriptionService.java create mode 100644 java/com/android/voicemail/impl/transcribe/TranscriptionTask.java create mode 100644 java/com/android/voicemail/impl/transcribe/TranscriptionTaskAsync.java create mode 100644 java/com/android/voicemail/impl/transcribe/TranscriptionTaskSync.java create mode 100644 java/com/android/voicemail/impl/transcribe/VoicemailCompat.java create mode 100644 java/com/android/voicemail/impl/transcribe/grpc/GetTranscriptResponseAsync.java create mode 100644 java/com/android/voicemail/impl/transcribe/grpc/TranscriptionClient.java create mode 100644 java/com/android/voicemail/impl/transcribe/grpc/TranscriptionClientFactory.java create mode 100644 java/com/android/voicemail/impl/transcribe/grpc/TranscriptionResponse.java create mode 100644 java/com/android/voicemail/impl/transcribe/grpc/TranscriptionResponseAsync.java create mode 100644 java/com/android/voicemail/impl/transcribe/grpc/TranscriptionResponseSync.java create mode 100644 java/com/android/voicemail/impl/transcribe/grpc/voicemail_transcription.proto delete mode 100644 java/com/android/voicemail/permissions.xml diff --git a/Android.mk b/Android.mk index fd38fd353..357fdff44 100644 --- a/Android.mk +++ b/Android.mk @@ -1,18 +1,17 @@ # Local modifications: -# * removed com.google.android.backup.api_key. This should be added to -# the manifest in the top level directory. # * removed com.google.android.geo.API_KEY key. This should be added to # the manifest files in java/com/android/incallui/calllocation/impl/ # and /java/com/android/incallui/maps/impl/ +# * b/62417801 modify translation string naming convention: +# $ find . -type d | grep 262 | rename 's/(values)\-([a-zA-Z\+\-]+)\-(mcc262-mnc01)/$1-$3-$2/' +# * b/37077388 temporarily disable proguard with javac +# * b/62875795 include manually generated GRPC service class: +# $ protoc --plugin=protoc-gen-grpc-java=prebuilts/tools/common/m2/repository/io/grpc/protoc-gen-grpc-java/1.0.3/protoc-gen-grpc-java-1.0.3-linux-x86_64.exe \ +# --grpc-java_out=lite:"packages/apps/Dialer/java/com/android/voicemail/impl/" \ +# --proto_path="packages/apps/Dialer/java/com/android/voicemail/impl/transcribe/grpc/" "packages/apps/Dialer/java/com/android/voicemail/impl/transcribe/grpc/voicemail_transcription.proto" LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) -ifeq ($(TARGET_BUILD_APPS),) -support_library_root_dir := frameworks/support -else -support_library_root_dir := prebuilts/sdk/current/support -endif - # The base directory for Dialer sources. BASE_DIR := java/com/android @@ -20,6 +19,7 @@ BASE_DIR := java/com/android SRC_DIRS := \ $(BASE_DIR)/contacts/common \ $(BASE_DIR)/dialer \ + $(BASE_DIR)/dialershared \ $(BASE_DIR)/incallui \ $(BASE_DIR)/voicemail @@ -39,196 +39,153 @@ EXCLUDE_FILES := \ $(BASE_DIR)/incallui/calllocation/impl/TrafficStatsTags.java \ $(BASE_DIR)/incallui/maps/impl/MapsImpl.java \ $(BASE_DIR)/incallui/maps/impl/MapsModule.java \ - $(BASE_DIR)/incallui/maps/impl/StaticMapFragment.java + $(BASE_DIR)/incallui/maps/impl/StaticMapFragment.java \ # Exclude testing only class, not used anywhere here EXCLUDE_FILES += \ $(BASE_DIR)/contacts/common/format/testing/SpannedTestUtils.java +# Exclude build variants for now +EXCLUDE_FILES += \ + $(BASE_DIR)/dialer/buildtype/bugfood/BuildTypeAccessorImpl.java \ + $(BASE_DIR)/dialer/buildtype/dogfood/BuildTypeAccessorImpl.java \ + $(BASE_DIR)/dialer/buildtype/fishfood/BuildTypeAccessorImpl.java \ + $(BASE_DIR)/dialer/buildtype/test/BuildTypeAccessorImpl.java \ + $(BASE_DIR)/dialer/constants/googledialer/ConstantsImpl.java \ + $(BASE_DIR)/dialer/binary/google/GoogleStubDialerRootComponent.java \ + $(BASE_DIR)/dialer/binary/google/GoogleStubDialerApplication.java \ + +EXCLUDE_RESOURCE_DIRECTORIES := \ + java/com/android/incallui/maps/impl/res \ + # All Dialers resources. -# find . -type d -name "res" | uniq | sort -RES_DIRS := \ - assets/product/res \ - assets/quantum/res \ - $(BASE_DIR)/contacts/common/res \ - $(BASE_DIR)/dialer/about/res \ - $(BASE_DIR)/dialer/app/res \ - $(BASE_DIR)/dialer/app/voicemail/error/res \ - $(BASE_DIR)/dialer/blocking/res \ - $(BASE_DIR)/dialer/callcomposer/camera/camerafocus/res \ - $(BASE_DIR)/dialer/callcomposer/cameraui/res \ - $(BASE_DIR)/dialer/callcomposer/res \ - $(BASE_DIR)/dialer/calldetails/res \ - $(BASE_DIR)/dialer/calllog/ui/res \ - $(BASE_DIR)/dialer/calllogutils/res \ - $(BASE_DIR)/dialer/common/res \ - $(BASE_DIR)/dialer/contactsfragment/res \ - $(BASE_DIR)/dialer/dialpadview/res \ - $(BASE_DIR)/dialer/interactions/res \ - $(BASE_DIR)/dialer/notification/res \ - $(BASE_DIR)/dialer/oem/res \ - $(BASE_DIR)/dialer/phonenumberutil/res \ - $(BASE_DIR)/dialer/postcall/res \ - $(BASE_DIR)/dialer/shortcuts/res \ - $(BASE_DIR)/dialer/speeddial/res \ - $(BASE_DIR)/dialer/theme/res \ - $(BASE_DIR)/dialer/util/res \ - $(BASE_DIR)/dialer/voicemailstatus/res \ - $(BASE_DIR)/dialer/widget/res \ - $(BASE_DIR)/incallui/answer/impl/affordance/res \ - $(BASE_DIR)/incallui/answer/impl/answermethod/res \ - $(BASE_DIR)/incallui/answer/impl/hint/res \ - $(BASE_DIR)/incallui/answer/impl/res \ - $(BASE_DIR)/incallui/audioroute/res \ - $(BASE_DIR)/incallui/autoresizetext/res \ - $(BASE_DIR)/incallui/calllocation/impl/res \ - $(BASE_DIR)/incallui/commontheme/res \ - $(BASE_DIR)/incallui/contactgrid/res \ - $(BASE_DIR)/incallui/hold/res \ - $(BASE_DIR)/incallui/incall/impl/res \ - $(BASE_DIR)/incallui/res \ - $(BASE_DIR)/incallui/sessiondata/res \ - $(BASE_DIR)/incallui/telecomeventui/res \ - $(BASE_DIR)/incallui/video/impl/res \ - $(BASE_DIR)/incallui/video/protocol/res \ - $(BASE_DIR)/incallui/wifi/res \ - $(BASE_DIR)/voicemail/impl/res \ +RES_DIRS := $(call all-subdir-named-dirs,res,.) +RES_DIRS := $(filter-out $(EXCLUDE_RESOURCE_DIRECTORIES),$(RES_DIRS)) +EXCLUDE_MANIFESTS := \ + $(BASE_DIR)/dialer/binary/aosp/testing/AndroidManifest.xml \ + $(BASE_DIR)/dialer/binary/google/AndroidManifest.xml \ + $(BASE_DIR)/incallui/calllocation/impl/AndroidManifest.xml \ + $(BASE_DIR)/incallui/maps/impl/AndroidManifest.xml \ # Dialer manifest files to merge. -# find . -type f -name "AndroidManifest.xml" | uniq | sort -DIALER_MANIFEST_FILES += \ - $(BASE_DIR)/contacts/common/AndroidManifest.xml \ - $(BASE_DIR)/dialer/about/AndroidManifest.xml \ - $(BASE_DIR)/dialer/app/AndroidManifest.xml \ - $(BASE_DIR)/dialer/app/manifests/activities/AndroidManifest.xml \ - $(BASE_DIR)/dialer/app/voicemail/error/AndroidManifest.xml \ - $(BASE_DIR)/dialer/backup/AndroidManifest.xml \ - $(BASE_DIR)/dialer/blocking/AndroidManifest.xml \ - $(BASE_DIR)/dialer/callcomposer/AndroidManifest.xml \ - $(BASE_DIR)/dialer/callcomposer/camera/AndroidManifest.xml \ - $(BASE_DIR)/dialer/callcomposer/camera/camerafocus/AndroidManifest.xml \ - $(BASE_DIR)/dialer/callcomposer/cameraui/AndroidManifest.xml \ - $(BASE_DIR)/dialer/calldetails/AndroidManifest.xml \ - $(BASE_DIR)/dialer/calllog/ui/AndroidManifest.xml \ - $(BASE_DIR)/dialer/calllogutils/AndroidManifest.xml \ - $(BASE_DIR)/dialer/common/AndroidManifest.xml \ - $(BASE_DIR)/dialer/contactsfragment/AndroidManifest.xml \ - $(BASE_DIR)/dialer/dialpadview/AndroidManifest.xml \ - $(BASE_DIR)/dialer/interactions/AndroidManifest.xml \ - $(BASE_DIR)/dialer/notification/AndroidManifest.xml \ - $(BASE_DIR)/dialer/oem/AndroidManifest.xml \ - $(BASE_DIR)/dialer/phonenumberutil/AndroidManifest.xml \ - $(BASE_DIR)/dialer/postcall/AndroidManifest.xml \ - $(BASE_DIR)/dialer/shortcuts/AndroidManifest.xml \ - $(BASE_DIR)/dialer/simulator/impl/AndroidManifest.xml \ - $(BASE_DIR)/dialer/speeddial/AndroidManifest.xml \ - $(BASE_DIR)/dialer/theme/AndroidManifest.xml \ - $(BASE_DIR)/dialer/util/AndroidManifest.xml \ - $(BASE_DIR)/dialer/voicemailstatus/AndroidManifest.xml \ - $(BASE_DIR)/dialer/widget/AndroidManifest.xml \ - $(BASE_DIR)/incallui/AndroidManifest.xml \ - $(BASE_DIR)/incallui/answer/impl/affordance/AndroidManifest.xml \ - $(BASE_DIR)/incallui/answer/impl/AndroidManifest.xml \ - $(BASE_DIR)/incallui/answer/impl/answermethod/AndroidManifest.xml \ - $(BASE_DIR)/incallui/answer/impl/hint/AndroidManifest.xml \ - $(BASE_DIR)/incallui/audioroute/AndroidManifest.xml \ - $(BASE_DIR)/incallui/autoresizetext/AndroidManifest.xml \ - $(BASE_DIR)/incallui/commontheme/AndroidManifest.xml \ - $(BASE_DIR)/incallui/contactgrid/AndroidManifest.xml \ - $(BASE_DIR)/incallui/hold/AndroidManifest.xml \ - $(BASE_DIR)/incallui/incall/impl/AndroidManifest.xml \ - $(BASE_DIR)/incallui/sessiondata/AndroidManifest.xml \ - $(BASE_DIR)/incallui/telecomeventui/AndroidManifest.xml \ - $(BASE_DIR)/incallui/video/impl/AndroidManifest.xml \ - $(BASE_DIR)/incallui/video/protocol/AndroidManifest.xml \ - $(BASE_DIR)/incallui/wifi/AndroidManifest.xml \ - $(BASE_DIR)/voicemail/impl/AndroidManifest.xml \ - $(BASE_DIR)/voicemail/permissions.xml \ - +DIALER_MANIFEST_FILES := $(call all-named-files-under,AndroidManifest.xml,.) +DIALER_MANIFEST_FILES := $(filter-out $(EXCLUDE_MANIFESTS),$(DIALER_MANIFEST_FILES)) # Merge all manifest files. LOCAL_FULL_LIBS_MANIFEST_FILES := \ $(addprefix $(LOCAL_PATH)/, $(DIALER_MANIFEST_FILES)) + LOCAL_SRC_FILES := $(call all-java-files-under, $(SRC_DIRS)) -LOCAL_SRC_FILES := $(filter-out $(EXCLUDE_FILES),$(LOCAL_SRC_FILES)) LOCAL_SRC_FILES += $(call all-proto-files-under, $(SRC_DIRS)) +LOCAL_SRC_FILES := $(filter-out $(EXCLUDE_FILES),$(LOCAL_SRC_FILES)) + LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH) -LOCAL_RESOURCE_DIR := \ - $(addprefix $(LOCAL_PATH)/, $(RES_DIRS)) \ - $(support_library_root_dir)/design/res \ - $(support_library_root_dir)/transition/res \ - $(support_library_root_dir)/v7/appcompat/res \ - $(support_library_root_dir)/v7/cardview/res \ - $(support_library_root_dir)/v7/recyclerview/res +LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(RES_DIRS)) + +EXCLUDE_EXTRA_PACKAGES := \ + com.android.dialer.binary.aosp.testing \ + com.android.dialer.binary.google \ + com.android.incallui.calllocation.impl \ + com.android.incallui.maps.impl \ # We specify each package explicitly to glob resource files. +# find . -type f -name "AndroidManifest.xml" | uniq | sort | cut -c 8- | rev | cut -c 21- | rev | sed 's/\//./g' | sed 's/$/ \\/' LOCAL_AAPT_FLAGS := \ + com.android.contacts.common \ + com.android.dialer.about \ + com.android.dialer.app \ + com.android.dialer.app.manifests.activities \ + com.android.dialer.app.voicemail.error \ + com.android.dialer.backup \ + com.android.dialer.binary.aosp.testing \ + com.android.dialer.binary.google \ + com.android.dialer.blocking \ + com.android.dialer.callcomposer \ + com.android.dialer.callcomposer.camera \ + com.android.dialer.callcomposer.camera.camerafocus \ + com.android.dialer.callcomposer.cameraui \ + com.android.dialer.calldetails \ + com.android.dialer.calllog.database \ + com.android.dialer.calllog.ui \ + com.android.dialer.calllogutils \ + com.android.dialer.common \ + com.android.dialer.configprovider \ + com.android.dialer.contactactions \ + com.android.dialer.contactphoto \ + com.android.dialer.contactsfragment \ + com.android.dialer.databasepopulator \ + com.android.dialer.dialpadview \ + com.android.dialer.enrichedcall.simulator \ + com.android.dialer.interactions \ + com.android.dialer.lettertile \ + com.android.dialer.location \ + com.android.dialer.main.impl \ + com.android.dialer.notification \ + com.android.dialer.oem \ + com.android.dialer.phonenumberutil \ + com.android.dialer.postcall \ + com.android.dialer.searchfragment.common \ + com.android.dialer.searchfragment.cp2 \ + com.android.dialer.searchfragment.list \ + com.android.dialer.searchfragment.nearbyplaces \ + com.android.dialer.searchfragment.remote \ + com.android.dialershared.bubble \ + com.android.dialer.shortcuts \ + com.android.dialer.simulator.impl \ + com.android.dialer.speeddial \ + com.android.dialer.theme \ + com.android.dialer.util \ + com.android.dialer.voicemail.listui \ + com.android.dialer.voicemailstatus \ + com.android.dialer.widget \ + com.android.incallui \ + com.android.incallui.answer.impl.affordance \ + com.android.incallui.answer.impl \ + com.android.incallui.answer.impl.answermethod \ + com.android.incallui.answer.impl.hint \ + com.android.incallui.audioroute \ + com.android.incallui.autoresizetext \ + com.android.incallui.calllocation.impl \ + com.android.incallui.callpending \ + com.android.incallui.commontheme \ + com.android.incallui.contactgrid \ + com.android.incallui.disconnectdialog \ + com.android.incallui.hold \ + com.android.incallui.incall.impl \ + com.android.incallui.maps.impl \ + com.android.incallui.sessiondata \ + com.android.incallui.spam \ + com.android.incallui.speakerbuttonlogic \ + com.android.incallui.telecomeventui \ + com.android.incallui.video.impl \ + com.android.incallui.video.protocol \ + com.android.voicemail \ + com.android.voicemail.impl \ + com.android.voicemail.impl.configui \ + +LOCAL_AAPT_FLAGS := $(filter-out $(EXCLUDE_EXTRA_PACKAGES),$(LOCAL_AAPT_FLAGS)) +LOCAL_AAPT_FLAGS := $(addprefix --extra-packages , $(LOCAL_AAPT_FLAGS)) +LOCAL_AAPT_FLAGS += \ --auto-add-overlay \ - --extra-packages com.android.contacts.common \ - --extra-packages com.android.dialer.about \ - --extra-packages com.android.dialer.app \ - --extra-packages com.android.dialer.app.voicemail.error \ - --extra-packages com.android.dialer.blocking \ - --extra-packages com.android.dialer.callcomposer \ - --extra-packages com.android.dialer.callcomposer \ - --extra-packages com.android.dialer.callcomposer.camera \ - --extra-packages com.android.dialer.callcomposer.camera.camerafocus \ - --extra-packages com.android.dialer.callcomposer.cameraui \ - --extra-packages com.android.dialer.calldetails \ - --extra-packages com.android.dialer.calllog.ui \ - --extra-packages com.android.dialer.calllogutils \ - --extra-packages com.android.dialer.common \ - --extra-packages com.android.dialer.contactsfragment \ - --extra-packages com.android.dialer.dialpadview \ - --extra-packages com.android.dialer.interactions \ - --extra-packages com.android.dialer.notification \ - --extra-packages com.android.dialer.oem \ - --extra-packages com.android.dialer.phonenumberutil \ - --extra-packages com.android.dialer.postcall \ - --extra-packages com.android.dialer.shortcuts \ - --extra-packages com.android.dialer.speeddial \ - --extra-packages com.android.dialer.theme \ - --extra-packages com.android.dialer.util \ - --extra-packages com.android.dialer.voicemailstatus \ - --extra-packages com.android.dialer.widget \ - --extra-packages com.android.incallui \ - --extra-packages com.android.incallui.answer.impl \ - --extra-packages com.android.incallui.answer.impl.affordance \ - --extra-packages com.android.incallui.answer.impl.affordance \ - --extra-packages com.android.incallui.answer.impl.answermethod \ - --extra-packages com.android.incallui.answer.impl.hint \ - --extra-packages com.android.incallui.audioroute \ - --extra-packages com.android.incallui.autoresizetext \ - --extra-packages com.android.incallui.calllocation \ - --extra-packages com.android.incallui.calllocation.impl \ - --extra-packages com.android.incallui.commontheme \ - --extra-packages com.android.incallui.contactgrid \ - --extra-packages com.android.incallui.hold \ - --extra-packages com.android.incallui.incall.impl \ - --extra-packages com.android.incallui.maps.impl \ - --extra-packages com.android.incallui.sessiondata \ - --extra-packages com.android.incallui.telecomeventui \ - --extra-packages com.android.incallui.video \ - --extra-packages com.android.incallui.video.impl \ - --extra-packages com.android.incallui.wifi \ - --extra-packages com.android.phone.common \ - --extra-packages com.android.voicemail \ - --extra-packages com.android.voicemail.impl \ - --extra-packages com.android.voicemail.impl.fetch \ - --extra-packages com.android.voicemail.impl.settings \ - --extra-packages com.android.voicemail.settings \ - --extra-packages me.leolin.shortcutbadger + --extra-packages me.leolin.shortcutbadger \ LOCAL_STATIC_JAVA_LIBRARIES := \ android-common \ + android-support-dynamic-animation \ com.android.vcard \ dialer-commons-io-target \ dialer-dagger2-target \ dialer-disklrucache-target \ dialer-gifdecoder-target \ dialer-glide-target \ + dialer-grpc-all-target \ + dialer-grpc-context-target \ + dialer-grpc-core-target \ + dialer-grpc-okhttp-target \ + dialer-grpc-protobuf-lite-target \ + dialer-grpc-stub-target \ dialer-guava-target \ dialer-javax-annotation-api-target \ dialer-javax-inject-target \ @@ -238,8 +195,10 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ jsr305 \ libphonenumber \ volley \ + libbackup \ LOCAL_STATIC_ANDROID_LIBRARIES := \ + android-support-core-ui \ android-support-design \ android-support-transition \ android-support-v13 \ @@ -249,18 +208,18 @@ LOCAL_STATIC_ANDROID_LIBRARIES := \ android-support-v7-recyclerview \ LOCAL_JAVA_LIBRARIES := \ - org.apache.http.legacy \ dialer-auto-value \ + org.apache.http.legacy \ # Libraries needed by the compiler (JACK) to generate code. PROCESSOR_LIBRARIES_TARGET := \ - dialer-dagger2-compiler \ + dialer-auto-value \ dialer-dagger2 \ + dialer-dagger2-compiler \ dialer-dagger2-producers \ dialer-guava \ dialer-javax-annotation-api \ dialer-javax-inject \ - dialer-auto-value \ # Resolve the jar paths. PROCESSOR_JARS := $(call java-lib-deps, $(PROCESSOR_LIBRARIES_TARGET)) @@ -270,20 +229,24 @@ LOCAL_ADDITIONAL_DEPENDENCIES += $(PROCESSOR_JARS) LOCAL_JACK_FLAGS += --processorpath $(call normalize-path-list,$(PROCESSOR_JARS)) LOCAL_JAVACFLAGS += -processorpath $(call normalize-path-list,$(PROCESSOR_JARS)) + +# Begin Bug: 37077388 +LOCAL_DX_FLAGS := --multi-dex +LOCAL_JACK_FLAGS := --multi-dex native + +LOCAL_PROGUARD_ENABLED := disabled +ifdef LOCAL_JACK_ENABLED + + # Proguard includes -LOCAL_PROGUARD_FLAG_FILES := \ - java/com/android/dialer/common/proguard.flags \ - java/com/android/dialer/proguard/proguard_base.flags \ - java/com/android/dialer/proguard/proguard.flags \ - java/com/android/dialer/proguard/proguard_release.flags \ - java/com/android/incallui/answer/impl/proguard.flags +LOCAL_PROGUARD_FLAG_FILES := $(call all-named-files-under,proguard.*flags,$(SRC_DIRS)) LOCAL_PROGUARD_ENABLED := custom -ifdef LOCAL_JACK_ENABLED -# Bug: 37077388 LOCAL_PROGUARD_ENABLED += optimization endif +# End Bug: 37077388 + LOCAL_SDK_VERSION := system_current LOCAL_MODULE_TAGS := optional LOCAL_PACKAGE_NAME := Dialer @@ -304,15 +267,22 @@ RES_DIRS := DIALER_MANIFEST_FILES := PROCESSOR_LIBRARIES_TARGET := PROCESSOR_JARS := +EXCLUDE_MANIFESTS := +EXCLUDE_EXTRA_PACKAGES := # Create references to prebuilt libraries. include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \ - dialer-dagger2-compiler:../../../prebuilts/tools/common/m2/repository/com/google/dagger/dagger-compiler/2.7/dagger-compiler-2.7$(COMMON_JAVA_PACKAGE_SUFFIX) \ dialer-auto-value:../../../prebuilts/tools/common/m2/repository/com/google/auto/value/auto-value/1.3/auto-value-1.3$(COMMON_JAVA_PACKAGE_SUFFIX) \ + dialer-dagger2-compiler:../../../prebuilts/tools/common/m2/repository/com/google/dagger/dagger-compiler/2.7/dagger-compiler-2.7$(COMMON_JAVA_PACKAGE_SUFFIX) \ dialer-dagger2:../../../prebuilts/tools/common/m2/repository/com/google/dagger/dagger/2.7/dagger-2.7$(COMMON_JAVA_PACKAGE_SUFFIX) \ dialer-dagger2-producers:../../../prebuilts/tools/common/m2/repository/com/google/dagger/dagger-producers/2.7/dagger-producers-2.7$(COMMON_JAVA_PACKAGE_SUFFIX) \ + dialer-grpc-all:../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-all/1.0.3/grpc-all-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) \ + dialer-grpc-core:../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-core/1.0.3/grpc-core-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) \ + dialer-grpc-okhttp:../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-okhttp/1.0.3/grpc-okhttp-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) \ + dialer-grpc-protobuf-lite:../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-protobuf-lite/1.0.3/grpc-protobuf-lite-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) \ + dialer-grpc-stub:../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-stub/1.0.3/grpc-stub-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) \ dialer-guava:../../../prebuilts/tools/common/m2/repository/com/google/guava/guava/20.0/guava-20.0$(COMMON_JAVA_PACKAGE_SUFFIX) \ dialer-javax-annotation-api:../../../prebuilts/tools/common/m2/repository/javax/annotation/javax.annotation-api/1.2/javax.annotation-api-1.2$(COMMON_JAVA_PACKAGE_SUFFIX) \ dialer-javax-inject:../../../prebuilts/tools/common/m2/repository/javax/inject/javax.inject/1/javax.inject-1$(COMMON_JAVA_PACKAGE_SUFFIX) @@ -346,7 +316,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_MODULE := dialer-disklrucache-target LOCAL_SDK_VERSION := current -LOCAL_SRC_FILES := ../../../prebuilts/maven_repo/bumptech/com/github/bumptech/glide/disklrucache/1.0.0-SNAPSHOT/disklrucache-1.0.0-SNAPSHOT$(COMMON_JAVA_PACKAGE_SUFFIX) +LOCAL_SRC_FILES := ../../../prebuilts/maven_repo/bumptech/com/github/bumptech/glide/disklrucache/1.0.0-SNAPSHOT/disklrucache-1.0.0-SNAPSHOT$(COMMON_JAVA_PACKAGE_SUFFIX) LOCAL_UNINSTALLABLE_MODULE := true include $(BUILD_PREBUILT) @@ -432,3 +402,63 @@ LOCAL_UNINSTALLABLE_MODULE := true include $(BUILD_PREBUILT) include $(CLEAR_VARS) + +LOCAL_MODULE_CLASS := JAVA_LIBRARIES +LOCAL_MODULE := dialer-grpc-core-target +LOCAL_SDK_VERSION := current +LOCAL_SRC_FILES := ../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-core/1.0.3/grpc-core-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) +LOCAL_UNINSTALLABLE_MODULE := true + +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) + +LOCAL_MODULE_CLASS := JAVA_LIBRARIES +LOCAL_MODULE := dialer-grpc-okhttp-target +LOCAL_SDK_VERSION := current +LOCAL_SRC_FILES := ../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-okhttp/1.0.3/grpc-okhttp-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) +LOCAL_UNINSTALLABLE_MODULE := true + +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) + +LOCAL_MODULE_CLASS := JAVA_LIBRARIES +LOCAL_MODULE := dialer-grpc-protobuf-lite-target +LOCAL_SDK_VERSION := current +LOCAL_SRC_FILES := ../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-protobuf-lite/1.0.3/grpc-protobuf-lite-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) +LOCAL_UNINSTALLABLE_MODULE := true + +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) + +LOCAL_MODULE_CLASS := JAVA_LIBRARIES +LOCAL_MODULE := dialer-grpc-stub-target +LOCAL_SDK_VERSION := current +LOCAL_SRC_FILES := ../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-stub/1.0.3/grpc-stub-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) +LOCAL_UNINSTALLABLE_MODULE := true + +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) + +LOCAL_MODULE_CLASS := JAVA_LIBRARIES +LOCAL_MODULE := dialer-grpc-all-target +LOCAL_SDK_VERSION := current +LOCAL_SRC_FILES := ../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-all/1.0.3/grpc-all-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) +LOCAL_UNINSTALLABLE_MODULE := true + +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) + +LOCAL_MODULE_CLASS := JAVA_LIBRARIES +LOCAL_MODULE := dialer-grpc-context-target +LOCAL_SDK_VERSION := current +LOCAL_SRC_FILES := ../../../prebuilts/tools/common/m2/repository/io/grpc/grpc-context/1.0.3/grpc-context-1.0.3$(COMMON_JAVA_PACKAGE_SUFFIX) +LOCAL_UNINSTALLABLE_MODULE := true + +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c04f8bec9..b508401ca 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -16,8 +16,8 @@ + android:versionCode="170000" + android:versionName="13.0"> + - - - - - \ No newline at end of file diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_ab_search.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_ab_search.png deleted file mode 100644 index d86b2195a..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_ab_search.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_arrow_back_24dp.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_arrow_back_24dp.png deleted file mode 100644 index ddbb2c459..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_arrow_back_24dp.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_business_white_120dp.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_business_white_120dp.png deleted file mode 100644 index d5942dcad..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_business_white_120dp.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_call_24dp.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_call_24dp.png deleted file mode 100644 index 4dc506515..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_call_24dp.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_close_dk.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_close_dk.png deleted file mode 100644 index 969552935..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_close_dk.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_create_24dp.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_create_24dp.png deleted file mode 100644 index 540ab4dee..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_create_24dp.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_group_white_24dp.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_group_white_24dp.png deleted file mode 100644 index 017e4bbf7..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_group_white_24dp.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_history_white_drawable_24dp.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_history_white_drawable_24dp.png deleted file mode 100644 index 703d30b92..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_history_white_drawable_24dp.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_info_outline_24dp.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_info_outline_24dp.png deleted file mode 100644 index c7b1113cf..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_info_outline_24dp.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_back.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_back.png deleted file mode 100644 index deb3a6dc1..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_back.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_group_dk.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_group_dk.png deleted file mode 100644 index 06bd18fbb..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_group_dk.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_group_lt.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_group_lt.png deleted file mode 100644 index d829d11e2..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_group_lt.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_overflow_lt.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_overflow_lt.png deleted file mode 100644 index 1ba12950c..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_overflow_lt.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_person_dk.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_person_dk.png deleted file mode 100644 index 5ff3ac574..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_person_dk.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_person_lt.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_person_lt.png deleted file mode 100644 index b4ebfc7b2..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_person_lt.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_remove_field_holo_light.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_remove_field_holo_light.png deleted file mode 100644 index 03fd2fb10..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_remove_field_holo_light.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_dk.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_dk.png deleted file mode 100644 index e8cb0f5fe..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_dk.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_holo_light.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_holo_light.png deleted file mode 100644 index 45137967c..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_holo_light.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_lt.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_lt.png deleted file mode 100644 index 1c9bb81fa..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_menu_star_lt.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_person_24dp.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_person_24dp.png deleted file mode 100644 index 56708b0ba..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_person_24dp.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_rx_videocam.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_rx_videocam.png deleted file mode 100644 index ccdda6701..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_rx_videocam.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_tx_videocam.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_tx_videocam.png deleted file mode 100644 index 603ddc895..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_tx_videocam.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_videocam.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_videocam.png deleted file mode 100644 index 97905c9f5..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_videocam.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/ic_voicemail_avatar.png b/java/com/android/contacts/common/res/drawable-hdpi/ic_voicemail_avatar.png deleted file mode 100644 index 2121878ae..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/ic_voicemail_avatar.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-hdpi/list_activated_holo.9.png deleted file mode 100644 index 4ea7afa00..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/list_background_holo.9.png b/java/com/android/contacts/common/res/drawable-hdpi/list_background_holo.9.png deleted file mode 100644 index cddf9be75..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/list_background_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/list_focused_holo.9.png b/java/com/android/contacts/common/res/drawable-hdpi/list_focused_holo.9.png deleted file mode 100644 index 86578be45..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/list_focused_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/list_longpressed_holo_light.9.png b/java/com/android/contacts/common/res/drawable-hdpi/list_longpressed_holo_light.9.png deleted file mode 100644 index e9afcc924..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/list_longpressed_holo_light.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/list_pressed_holo_light.9.png b/java/com/android/contacts/common/res/drawable-hdpi/list_pressed_holo_light.9.png deleted file mode 100644 index 2054530ed..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/list_pressed_holo_light.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/list_section_divider_holo_custom.9.png b/java/com/android/contacts/common/res/drawable-hdpi/list_section_divider_holo_custom.9.png deleted file mode 100644 index a0f17568e..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/list_section_divider_holo_custom.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-hdpi/list_title_holo.9.png b/java/com/android/contacts/common/res/drawable-hdpi/list_title_holo.9.png deleted file mode 100644 index ae937176e..000000000 Binary files a/java/com/android/contacts/common/res/drawable-hdpi/list_title_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_focused_holo.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_focused_holo.9.png deleted file mode 100644 index 4139942d6..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_focused_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_section_divider_holo_custom.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_section_divider_holo_custom.9.png deleted file mode 100644 index 569d28f54..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_section_divider_holo_custom.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_title_holo.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_title_holo.9.png deleted file mode 100644 index 5ec4c96a7..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-hdpi/list_title_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_focused_holo.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_focused_holo.9.png deleted file mode 100644 index 4139942d6..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_focused_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_section_divider_holo_custom.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_section_divider_holo_custom.9.png deleted file mode 100644 index 065ff62ce..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_section_divider_holo_custom.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_title_holo.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_title_holo.9.png deleted file mode 100644 index 013d5e711..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-mdpi/list_title_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-hdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-hdpi/list_activated_holo.9.png deleted file mode 100644 index 947f03cec..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-hdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-mdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-mdpi/list_activated_holo.9.png deleted file mode 100644 index 6d09d7278..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-mdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-xhdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-xhdpi/list_activated_holo.9.png deleted file mode 100644 index 63c7456f0..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-sw600dp-xhdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_focused_holo.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_focused_holo.9.png deleted file mode 100644 index 4139942d6..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_focused_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_section_divider_holo_custom.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_section_divider_holo_custom.9.png deleted file mode 100644 index af5855420..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_section_divider_holo_custom.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_title_holo.9.png b/java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_title_holo.9.png deleted file mode 100644 index cb801ac1b..000000000 Binary files a/java/com/android/contacts/common/res/drawable-ldrtl-xhdpi/list_title_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-mdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-mdpi/list_activated_holo.9.png deleted file mode 100644 index 3bf8e0362..000000000 Binary files a/java/com/android/contacts/common/res/drawable-mdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-mdpi/list_focused_holo.9.png b/java/com/android/contacts/common/res/drawable-mdpi/list_focused_holo.9.png deleted file mode 100644 index 86578be45..000000000 Binary files a/java/com/android/contacts/common/res/drawable-mdpi/list_focused_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-mdpi/list_longpressed_holo_light.9.png b/java/com/android/contacts/common/res/drawable-mdpi/list_longpressed_holo_light.9.png deleted file mode 100644 index 3226ab760..000000000 Binary files a/java/com/android/contacts/common/res/drawable-mdpi/list_longpressed_holo_light.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-mdpi/list_pressed_holo_light.9.png b/java/com/android/contacts/common/res/drawable-mdpi/list_pressed_holo_light.9.png deleted file mode 100644 index 061904c42..000000000 Binary files a/java/com/android/contacts/common/res/drawable-mdpi/list_pressed_holo_light.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-mdpi/list_section_divider_holo_custom.9.png b/java/com/android/contacts/common/res/drawable-mdpi/list_section_divider_holo_custom.9.png deleted file mode 100644 index 1d9371de0..000000000 Binary files a/java/com/android/contacts/common/res/drawable-mdpi/list_section_divider_holo_custom.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-sw600dp-hdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-sw600dp-hdpi/list_activated_holo.9.png deleted file mode 100644 index 046b24a96..000000000 Binary files a/java/com/android/contacts/common/res/drawable-sw600dp-hdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-sw600dp-mdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-sw600dp-mdpi/list_activated_holo.9.png deleted file mode 100644 index 1ff337370..000000000 Binary files a/java/com/android/contacts/common/res/drawable-sw600dp-mdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-sw600dp-xhdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-sw600dp-xhdpi/list_activated_holo.9.png deleted file mode 100644 index 2eb7c7ebc..000000000 Binary files a/java/com/android/contacts/common/res/drawable-sw600dp-xhdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-xhdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-xhdpi/list_activated_holo.9.png deleted file mode 100644 index eda10e612..000000000 Binary files a/java/com/android/contacts/common/res/drawable-xhdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-xhdpi/list_focused_holo.9.png b/java/com/android/contacts/common/res/drawable-xhdpi/list_focused_holo.9.png deleted file mode 100644 index 86578be45..000000000 Binary files a/java/com/android/contacts/common/res/drawable-xhdpi/list_focused_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-xhdpi/list_longpressed_holo_light.9.png b/java/com/android/contacts/common/res/drawable-xhdpi/list_longpressed_holo_light.9.png deleted file mode 100644 index 5532e88c2..000000000 Binary files a/java/com/android/contacts/common/res/drawable-xhdpi/list_longpressed_holo_light.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-xhdpi/list_pressed_holo_light.9.png b/java/com/android/contacts/common/res/drawable-xhdpi/list_pressed_holo_light.9.png deleted file mode 100644 index f4af92657..000000000 Binary files a/java/com/android/contacts/common/res/drawable-xhdpi/list_pressed_holo_light.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-xhdpi/list_section_divider_holo_custom.9.png b/java/com/android/contacts/common/res/drawable-xhdpi/list_section_divider_holo_custom.9.png deleted file mode 100644 index 8fb0636cf..000000000 Binary files a/java/com/android/contacts/common/res/drawable-xhdpi/list_section_divider_holo_custom.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-xxhdpi/list_activated_holo.9.png b/java/com/android/contacts/common/res/drawable-xxhdpi/list_activated_holo.9.png deleted file mode 100644 index 52c00ddcd..000000000 Binary files a/java/com/android/contacts/common/res/drawable-xxhdpi/list_activated_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-xxhdpi/list_focused_holo.9.png b/java/com/android/contacts/common/res/drawable-xxhdpi/list_focused_holo.9.png deleted file mode 100644 index 3e4ca684e..000000000 Binary files a/java/com/android/contacts/common/res/drawable-xxhdpi/list_focused_holo.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-xxhdpi/list_longpressed_holo_light.9.png b/java/com/android/contacts/common/res/drawable-xxhdpi/list_longpressed_holo_light.9.png deleted file mode 100644 index 230d649bf..000000000 Binary files a/java/com/android/contacts/common/res/drawable-xxhdpi/list_longpressed_holo_light.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable-xxhdpi/list_pressed_holo_light.9.png b/java/com/android/contacts/common/res/drawable-xxhdpi/list_pressed_holo_light.9.png deleted file mode 100644 index 1352a1702..000000000 Binary files a/java/com/android/contacts/common/res/drawable-xxhdpi/list_pressed_holo_light.9.png and /dev/null differ diff --git a/java/com/android/contacts/common/res/drawable/ic_back_arrow.xml b/java/com/android/contacts/common/res/drawable/ic_back_arrow.xml deleted file mode 100644 index ecf704e8e..000000000 --- a/java/com/android/contacts/common/res/drawable/ic_back_arrow.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - \ No newline at end of file diff --git a/java/com/android/contacts/common/res/drawable/ic_call_and_share.xml b/java/com/android/contacts/common/res/drawable/ic_call_and_share.xml deleted file mode 100644 index be0cdd358..000000000 --- a/java/com/android/contacts/common/res/drawable/ic_call_and_share.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/java/com/android/contacts/common/res/drawable/ic_more_vert.xml b/java/com/android/contacts/common/res/drawable/ic_more_vert.xml deleted file mode 100644 index fcc3d9e4f..000000000 --- a/java/com/android/contacts/common/res/drawable/ic_more_vert.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/java/com/android/contacts/common/res/drawable/ic_person_add_tinted_24dp.xml b/java/com/android/contacts/common/res/drawable/ic_person_add_tinted_24dp.xml deleted file mode 100644 index c2538cfd1..000000000 --- a/java/com/android/contacts/common/res/drawable/ic_person_add_tinted_24dp.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/java/com/android/contacts/common/res/drawable/ic_search_add_contact.xml b/java/com/android/contacts/common/res/drawable/ic_search_add_contact.xml deleted file mode 100644 index 476212d24..000000000 --- a/java/com/android/contacts/common/res/drawable/ic_search_add_contact.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - diff --git a/java/com/android/contacts/common/res/drawable/ic_search_video_call.xml b/java/com/android/contacts/common/res/drawable/ic_search_video_call.xml deleted file mode 100644 index 0fe0367e1..000000000 --- a/java/com/android/contacts/common/res/drawable/ic_search_video_call.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - diff --git a/java/com/android/contacts/common/res/drawable/ic_work_profile.xml b/java/com/android/contacts/common/res/drawable/ic_work_profile.xml index fc21100c0..445288595 100644 --- a/java/com/android/contacts/common/res/drawable/ic_work_profile.xml +++ b/java/com/android/contacts/common/res/drawable/ic_work_profile.xml @@ -1,16 +1,26 @@ - + + android:width="16dp" + android:height="16dp" + android:viewportWidth="16.0" + android:viewportHeight="16.0"> - - + diff --git a/java/com/android/contacts/common/res/drawable/list_selector_background_transition_holo_light.xml b/java/com/android/contacts/common/res/drawable/list_selector_background_transition_holo_light.xml deleted file mode 100644 index 35fff99c2..000000000 --- a/java/com/android/contacts/common/res/drawable/list_selector_background_transition_holo_light.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/java/com/android/contacts/common/res/layout/account_selector_list_item.xml b/java/com/android/contacts/common/res/layout/account_selector_list_item.xml deleted file mode 100644 index 587626e8d..000000000 --- a/java/com/android/contacts/common/res/layout/account_selector_list_item.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - diff --git a/java/com/android/contacts/common/res/layout/account_selector_list_item_condensed.xml b/java/com/android/contacts/common/res/layout/account_selector_list_item_condensed.xml deleted file mode 100644 index 33821166e..000000000 --- a/java/com/android/contacts/common/res/layout/account_selector_list_item_condensed.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - diff --git a/java/com/android/contacts/common/res/layout/call_subject_history.xml b/java/com/android/contacts/common/res/layout/call_subject_history.xml deleted file mode 100644 index 733f1d8b6..000000000 --- a/java/com/android/contacts/common/res/layout/call_subject_history.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/java/com/android/contacts/common/res/layout/dialog_call_subject.xml b/java/com/android/contacts/common/res/layout/dialog_call_subject.xml index a33b2ac85..df8e8d299 100644 --- a/java/com/android/contacts/common/res/layout/dialog_call_subject.xml +++ b/java/com/android/contacts/common/res/layout/dialog_call_subject.xml @@ -129,7 +129,7 @@ android:layout_height="25dp" android:layout_alignParentStart="true" android:layout_centerVertical="true" - android:src="@drawable/quantum_ic_history_white_24" + android:src="@drawable/quantum_ic_history_vd_theme_24" android:tint="@color/call_subject_history_icon"/> - - diff --git a/java/com/android/contacts/common/res/layout/search_bar_expanded.xml b/java/com/android/contacts/common/res/layout/search_bar_expanded.xml index fa16083e2..7192eb030 100644 --- a/java/com/android/contacts/common/res/layout/search_bar_expanded.xml +++ b/java/com/android/contacts/common/res/layout/search_bar_expanded.xml @@ -29,7 +29,7 @@ android:layout_margin="@dimen/search_box_navigation_icon_margin" android:background="?attr/selectableItemBackgroundBorderless" android:contentDescription="@string/action_menu_back_from_search" - android:src="@drawable/ic_back_arrow" + android:src="@drawable/quantum_ic_arrow_back_vd_theme_24" android:tint="@color/contactscommon_actionbar_background_color"/> diff --git a/java/com/android/contacts/common/res/values-af/strings.xml b/java/com/android/contacts/common/res/values-af/strings.xml index 52e612da9..5d8121889 100644 --- a/java/com/android/contacts/common/res/values-af/strings.xml +++ b/java/com/android/contacts/common/res/values-af/strings.xml @@ -18,7 +18,6 @@ "Teks gekopieer" - "Kopieer na knipbord" "Bel %s" "Bel huis" "Bel selfoon" @@ -40,7 +39,6 @@ "Bel werkroeper" "Bel %s" "Bel MMS" - "%s (Bel)" "SMS %s" "SMS huis" "SMS selfoon" @@ -62,7 +60,6 @@ "SMS werkroeper" "SMS %s" "SMS MMS" - "%s (Boodskap)" "Vee gereeld-gekontaktes uit?" "Jy gaan die gereeld gekontak-lys in die Kontakte- en Foon-program uitvee en e-posprogramme dwing om jou adresvoorkeure van nuuts af te leer." "Vee tans gereeld-gekontaktes uit..." @@ -70,22 +67,14 @@ "Weg" "Besig" "Kontakte" + "Topvoorgestel" "Ander" "Gids" "Werkgids" "Alle kontakte" + "Voorstelle" "Ek" - "Soek tans…" - "Meer as %d gevind." - "Geen kontakte nie" - - %d gevind - 1 gevind - - "Vinnige kontak vir %1$s" "(Geen naam nie)" - "Gereeld gebel" - "Gereeld gekontak" "Bekyk kontak" "Alle kontakte met foonnommers" "Werkprofielkontakte" @@ -125,8 +114,6 @@ "E-pos %s" "E-pos" "Straat" - "Posbus" - "Buurt" "Stad" "Staat" "Poskode" @@ -144,103 +131,19 @@ "Klets met ICQ" "Klets met Jabber" "Klets" - "vee uit" - "Vou naamvelde uit of in" - "Vou fonetiese naamvelde uit of in" "Alle kontakte" - "Klaar" - "Kanselleer" "Kontakte in %s" "Kontakte in gepasmaakte aansig" "Enkel kontak" - "Stoor ingevoerde kontakte in:" - "Voer van SIM-kaart af in" - "Voer in vanaf SIM ^1^2" - "Voer in vanaf SIM %1$s" - "Voer in vanaf .vcf-lêer" - "Kanselleer invoer van %s?" - "Kanselleer uitvoer van %s?" - "Kon nie vCard invoer/uitvoer kanselleer nie" - "Onbekende fout." - "Kon nie \"%s\" oopmaak nie: %s." - "Kon nie die uitvoerder aktiveer nie: \"%s\"." - "Daar is geen uitvoerbare kontak nie." - "Jy het \'n vereiste toestemming gedeaktiveer." - "\'n Fout het voorgekom tydens uitvoer: \"%s\"." - "Vereiste lêernaam is te lank (\"%s\")." - "I/U-fout" - "Nie genoeg geheue nie. Die lêer is dalk te groot." - "Kon nie vCard ontleed nie weens onverwagte rede." - "Die formaat word nie ondersteun nie." - "Kon nie meta-inligting van gegewe vCard-lêer(s) versamel nie." - "Een of meer lêers kon nie ingevoer word nie (%s)." - "Klaar met uitvoer van %s." - "Het kontakte klaar uitgevoer." - "Kontakte is klaar uitgevoer; klik die kennisgewing om kontakte te deel." - "Tik om kontakte te deel." - "Uitvoer van %s is gekanselleer." - "Voer kontakdata uit" - "Kontakdata word tans uitgevoer." - "Kon nie databasis-inligting kry nie" - "Daar is geen kontakte om uit te voer nie. As jy kontakte op jou toestel het, sal sommige dataverskaffers dalk nie toelaat dat die toestel se kontakte uitgevoer word nie." - "Die vCard-opsteller het nie behoorlik begin nie." - "Kon nie uitvoer nie" - "Die kontakdata is nie uitgevoer nie.\nRede: \"%s\"" - "Voer tans %s in" - "Kon nie vCard-data lees nie" - "Lees van vCard-data gekanselleer" - "Klaar met invoer van vCard %s" - "Invoer van %s gekanselleer" - "%s sal binnekort ingevoer word." - "Die lêer sal binnekort ingevoer word." - "vCard invoerversoek is verwerp. Probeer asseblief later weer." - "%s sal binnekort uitgevoer word." - "Die lêer sal binnekort uitgevoer word." - "Kontakte sal binnekort uitgevoer word." - "vCard uitvoerversoek is verwerp. Probeer asseblief later weer." - "kontak" - "Kas tans vCard(s) na die plaaslike tydelike berging. Die werklike invoer sal binnekort begin." - "Kon nie vCard invoer nie." - "Kontak ontvang via NFC" - "Voer kontakte uit?" - "Kas tans" - "Voer %s%s tans in: %s" - "Voer uit na .vcf-lêer" "Sorteer volgens" "Voornaam" "Van" "Naamformaat" "Voornaam eerste" "Van eerste" - "Verstekrekening vir nuwe kontakte" - "Sinkroniseer kontakmetadata" - "Meer oor Kontakte" - "Instellings" - "Deel sigbare kontakte" - "Kon nie sigbare kontakte deel nie." - "Deel gunstelingkontakte" - "Deel alle kontakte" - "Kon nie kontakte deel nie." - "Voer kontakte in/uit" - "Voer kontakte in" - "Hierdie kontak kan nie gedeel word nie." - "Daar is geen kontakte om te deel nie." - "Soek" - "Vind kontakte" - "Gunstelinge" - "Geen kontakte nie." - "Geen sigbare kontakte nie." - "Geen gunstelinge nie" - "Geen kontakte in %s nie" "Vee dikwels-gebruiktes uit" - "Kies SIM-kaart" - "Bestuur rekeninge" - "Voer in/uit" - "via %1$s" - "%1$s via %2$s" "hou op soek" "Vee soektog uit" - "Opsies vir wys van kontakte" "Rekening" "Gebruik dit altyd vir oproepe" "Bel met" @@ -248,19 +151,12 @@ "Tik \'n nota om saam met oproep te stuur …" "STUUR EN BEL" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s-oortjie" %1$s-oortjie %2$d ongelese items. %1$s-oortjie %2$d ongelese item. - "Bouweergawe" - "Oopbronlisensies" - "Lisensiebesonderhede van oopbronsagteware" - "Privaatheidsbeleid" - "Diensbepalings" - "Oopbronlisensies" - "Kon nie die URL oopmaak nie." "Video-oproep" "Deel en bel" diff --git a/java/com/android/contacts/common/res/values-am/strings.xml b/java/com/android/contacts/common/res/values-am/strings.xml index 0283fbb0a..71399fab6 100644 --- a/java/com/android/contacts/common/res/values-am/strings.xml +++ b/java/com/android/contacts/common/res/values-am/strings.xml @@ -18,7 +18,6 @@ "ፅሁፍ ገልብጧል" - "ወደ ቅንጥብ ሰሌዳ ገልብጥ" "ለ%s ይደውሉ" "ለቤት ይደውሉ" "ለተንቀሳቃሽ ስልክ ይደውሉ" @@ -40,7 +39,6 @@ "ለየሥራ ጥሪ ምልክት ማድረጊያ ይደውሉ" "ለ%s ይደውሉ" "ለኤም ኤም ኤስ ይደውሉ" - "%s (ጥሪ)" "ለ%s ጽሑፍ ይላኩ" "ለቤት ጽሑፍ ይላኩ" "ለተንቀሳቃሽ ስልክ ጽሑፍ ይላኩ" @@ -62,7 +60,6 @@ "ለሥራ ምልክት ማድረጊያ ጽሑፍ ይላኩ" "ለ%s ጽሑፍ ይላኩ" "ለኤም ኤም ኤስ ጽሑፍ ይላኩ" - "%s (መልዕክት)" "በተደጋጋሚ የተገኙ ይጽዱ?" "በእውቂያዎች እና በስልክ መተግበሪያዎች ውስጥ በተደጋጋሚ ያገኟቸውን ዝርዝር አጽድተው የኢሜይል መተግበሪያዎች ምርጫዎችዎን ከባዶ ተነስተው እንዲያውቁ ያስገድዱዋቸዋል።" "በተደጋጋሚ የተገኙትን በማጽዳት ላይ…" @@ -70,22 +67,14 @@ "ወጣ ብሏል" "ተይዟል" "እውቅያዎች" + "በብዛት የተጠቆሙ" "ሌላ" "ማውጫ" "የሥራ ስልክ ማውጫ" "ሁሉም እውቅያዎች" + "ጥቆማዎች" "እኔ" - "በመፈለግ ላይ…" - "ከ%d በላይ ተገኝተዋል።" - "እውቅያዎች የሉም" - - %d ተገኝቷል - %d ተገኝተዋል - - "ለ%1$s ፈጣን ዕውቂያ" "(ስም የለም)" - "በተደጋጋሚ የተደወለለት/ላት" - "በተደጋጋሚ የተገኙ" "ዕውቂያ ተመልከት" "የስልክ ቁጥር ያላቸው ሁሉም ዕውቂያዎች" "የሥራ መገለጫ ዕውቂያዎች" @@ -125,8 +114,6 @@ "ለ%s ኢሜይል ይላኩ" "ኢሜይል" "መንገድ" - "የፖስታ ሣጥን ቁጥር" - "ሰፈር" "ከተማ" "ግዛት" "ዚፕ ኮድ" @@ -144,103 +131,19 @@ "ICQን በመጠቀም ይወያዩ" "Jabberን በመጠቀም 271448" "ውይይት" - "ሰርዝ" - "የስም መስኮችን ይዘርጉ ወይም ይሰብስቡ" - "የድምፀ ልሳን ስም መስኮችን ይዘርጉ ወይም ይሰብስቡ" "ሁሉም ዕውቂያዎች" - "ተከናውኗል" - "ይቅር" "በ%s ውስጥ ያሉ ዕውቂያዎች" "እውቂያዎች በብጁ እይታ" "ነጠላ እውቂያ" - "እንዲመጡ የተደረጉ እውቂያዎችን አስቀምጥ ወደ፦" - "ከሲም ካርድ ያስመጡ" - "ከSIM አስመጣ ^1 - ^2" - "ከSIM አስመጣ %1$s" - "ከ .vcf ፋይል አስመጣ" - "የ%s ወደ ውስጥ ማስመጣት ይቅር?" - "የ%s ወደ ውጭ መላክ ይቅር?" - "vCard ማስመጣት/ወደ ውጪ ይቅር ማለት አልተቻለም" - "ያልታወቀ ስህተት።" - %s»ን መክፈት አልተቻለም፦ %s።" - "ይህንን ላኪ መጀመር አልተቻለም፦ «%s»" - "ምንም ወደ ውጭ መላክ የሚችል ዕውቂያ የለም።" - "አንድ የሚያስፈልግ ፍቃድ አሰናክለዋል።" - "ወደ ውጪ በሚላክበት ጊዜ ስህተት ተከስቷል፦ %s" - "የተጠየቀው ፋይል ስም በጣም ረጅም ነው («%s»)።" - "የግብዓት/ውጽዓት ስህተት" - "በቂ ማህደረ ትውስታ የለም። ፋይሉ በጣም ትልቅ ሊሆን ይችላል።" - "ባልተጠበቀ ምክንያት vCard መተንተን አልተቻለም።" - "ቅርፀቱ አይደገፍም።" - "የተሰጠው(ጡት) vCard ፋይል(ሎች) ዲበ ውሂብ መረጃ መሰብሰብ አልተቻለም።" - "አንድ ወይም ከዚያ በላይ ፋይሎች ማስመጣት አልተቻለም (%s)።" - "%sን ወደ ውጪ መላክ ተጠናቅቋል።" - "እውቂያዎችን ወደ ውጪ መላክ ተጠናቅቋል።" - "እውቂያዎችን ወደ ውጭ መላክ ተጠናቅቋል፣ እውቂያዎችን ለማጋራት ማሳወቂያውን ጠቅ ያድርጉ።" - "እውቂያዎችን ለማጋራት መታ ያድርጉ።" - "%sን ወደ ውጪ መላክ ተሰርዟል።" - "የዕውቂያ ውሂብ ወደ ውጪ በመላክ ላይ" - "የእውቂያ ውሂብ ወደ ውጭ በመላክ ላይ።" - "ውሂብ ጎታ መረጃን ማግኘት አልተቻለም።" - "ወደ ውጭ ሊላኩ የሚችሉ እውቂያዎች የሉም። በመሳሪያዎ ላይ እውቂያዎች ካሉዎ፣ የተወሰኑ ውሂብ አቅራቢዎች እውቂያዎችዎ ከመሳሪያው ወደ ውጪ እንዲላኩ ላይፈቅዱ ይችላሉ።" - "የvCard አቀናባሪው በትክክል አልጀመረም።" - "ወደ ውጭ መላክ አልተቻለም" - "የዕውቅያ ውሂቡ ወደ ውጭ አልተላከም።\nምክንያት፦«%s»" - "%sን በማስመጣት ላይ" - "የvCard ውሂቡን ማንበብ አልተቻለም" - "የvCard ውሂብ ማንበብ ተሰርዟል" - "የ%s vCard ማስመጣት ተጠናቅቋል" - "የ%s ማስመጣት ተሰርዟል" - "%s ከትንሽ ጊዜ በኋላ ይመጣል።" - "ፋይሉ ከትንሽ ጊዜ በኋላ ይመጣል።" - "የvCard ማስመጣት ጥያቄ ተቀባይነት አላገኘም። ትንሽ ቆይተው ይሞክሩ።" - "%s ከትንሽ ጊዜ በኋላ ወደ ውጪ ይላካል።" - "ፋይሉ ትንሽ ቆይቶ ወደ ውጪ ይላካል።" - "እውቂያዎች በቅርቡ ወደ ውጭ ይላካሉ።" - "የvCard ወደ ውጪ መላክ ጥያቄ ተቀባይነት አላገኘም። ትንሽ ቆይተው ይሞከሩ።" - "እውቂያ" - "vCard(s) ወደ ጊዜያዊ ማከማቻ በመሸጎጥ ላይ ነው። ትክክለኛው ማስመጣቱ በቅርቡ ይጀምራል።" - "vCardን ማስመጣት አልተቻለም።" - "በNFC የደረሱ ዕውቂያዎች" - "እውቅያዎች ይላኩ?" - "በመሸጎጥ ላይ" - "%s/%sን በማስመጣት ላይ፦ %s" - "ወደ የ .vcf ፋይል ላክ" "ደርድር በ" "የመጀመሪያ ስም" "የመጨረሻ ስም" "የስም ቅርጸት" "የመጀመሪያ ስም መጀመሪያ" "የመጨረሻ ስም መጀመሪያ" - "ለአዲስ እውቂያዎች ነባሪ መለያ" - "የእውቂያ ዲበ ውሂብን አሥምር" - "ስለዕውቂያዎች" - "ቅንብሮች" - "የሚታዩ እውቂያዎችን አጋራ" - "የሚታዩ እውቂያዎችን ማጋራት አልተሳካም።" - "ተወዳጅ እውቂያዎችን አጋራ" - "ሁሉንም እውቂያዎች አጋራ" - "እውቂያዎችን ማጋራት አልተሳካም።" - "ዕውቂያዎች ያስመጡ/ይላኩ" - "እውቅያዎችን ከውጭ አስመጣ" - "ይህ ዕውቂያ ሊጋራ አይችልም።" - "ምንም የሚጋሩ እውቂያዎች የሉም።" - "ፈልግ" - "ዕውቂያዎችን ያግኙ" - "ተወዳጆች" - "ምንም ዕውቂያዎች የሉም።" - "ምንም የሚታዩ ዕውቂያዎች የሉም።" - "ምንም ተወዳጆች የሉም" - "በ%s ውስጥ ምንም ዕውቂያዎች የሉም" "ተደጋጋሚዎችን አጽዳ" - "ሲም ካርድ ይምረጡ" - "መለያዎች አቀናብር" - "ያስመጡ/ወደ ውጪ ይላኩ" - "በ%1$s በኩል" - "%1$s%2$s በኩል" "መፈለግ አቁም" "ፍለጋን አጽዳ" - "የእውቂያ ማሳያ አማራጮች" "መለያ" "ለጥሪዎች ሁልጊዜ ይህንን ተጠቀም" "ይደውሉ ከዚህ ጋር" @@ -248,19 +151,12 @@ "ከጥሪ ጋር ለመላክ የማስታወሻ ጽሑፍ ይተይቡ ..." "ላክ እና ደውል" "%1$s / %2$s" - "%1$s%2$s" + "%1$s%2$s" "የ%1$s ትር።" %1$s ትር። %2$d ያልተነበቡ ንጥሎች። %1$s ትር። %2$d ያልተነበቡ ንጥሎች። - "የግንብ ሥሪት" - "የክፍት ምንጭ ፍቃዶች" - "ለነፃ ምንጭ ሶፍትዌሮች የፈቃድ ዝርዝሮች" - "የግላዊነት መመሪያ" - "የአገልግሎት ውል" - "የክፍት ምንጭ ፈቃዶች" - "ዩ አር ኤሉን ለመክፈት አልተሳካም።" "የቪዲዮ ጥሪ" "ያጋሩ እና ይደውሉ" diff --git a/java/com/android/contacts/common/res/values-ar/strings.xml b/java/com/android/contacts/common/res/values-ar/strings.xml index a3862fe09..fba65e313 100644 --- a/java/com/android/contacts/common/res/values-ar/strings.xml +++ b/java/com/android/contacts/common/res/values-ar/strings.xml @@ -18,7 +18,6 @@ "تم نسخ النص" - "نسخ إلى الحافظة" "الاتصال بـ %s" "الاتصال بهاتف منزلي" "الاتصال بالجوال" @@ -40,7 +39,6 @@ "الاتصال بجهاز نداء العمل" "الاتصال بـ %s" "اتصال بهاتف رسائل الوسائط المتعددة" - "%s (اتصال)" "إرسال رسالة نصية إلى %s" "إرسال رسالة نصية إلى هاتف منزلي" "إرسال رسالة نصية إلى جوال" @@ -62,7 +60,6 @@ "إرسال رسالة نصية إلى جهاز نداء العمل" "إرسال رسالة نصية إلى %s" "إرسال رسالة نصية إلى هاتف رسائل الوسائط المتعددة" - "%s (رسالة)" "محو قائمة من يتم الاتصال بهم كثيرًا؟" "ستمحو قائمة من يتم الاتصال بهم كثيرًا في تطبيقي جهات الاتصال والهاتف، وستفرض على تطبيقات البريد الإلكتروني التعرف على تفضيلات توجيه الرسائل من البداية." "جارٍ محو قائمة المُتصل بهم كثيرًا…" @@ -70,26 +67,14 @@ "بالخارج" "مشغول" "جهات الاتصال" + "أهم المقترحات" "غير ذلك" "الدليل" "دليل العمل" "جميع جهات الاتصال" + "الاقتراحات" "أنا" - "جارِ البحث…" - "تم العثور على أكثر من %d من جهات الاتصال." - "ليست هناك جهات اتصال" - - %d - لا توجد أية جهة اتصال - %d جهتا اتصال موجودتان - %d جهات اتصال موجودة - %d جهة اتصال موجودة - %d من جهات الاتصال موجودة - توجد جهة اتصال واحدة - - "اتصال سريع لـ %1$s" "(بلا اسم)" - "الأكثر اتصالاً" - "يتم الاتصال بها بشكل متكرر" "عرض جهة الاتصال" "جميع جهات الاتصال التي لها أرقام هواتف" "جهات الاتصال للملف الشخصي للعمل" @@ -129,8 +114,6 @@ "البريد الإلكتروني %s" "إرسال رسالة إلكترونية" "الشارع" - "صندوق البريد" - "منطقة مجاورة" "المدينة" "الولاية" "الرمز البريدي" @@ -148,103 +131,19 @@ "‏الدردشة باستخدام ICQ" "‏الدردشة باستخدام Jabber" "دردشة" - "حذف" - "توسيع أو تصغير حقول الاسم" - "توسيع أو تصغير حقول الاسم الصوتي" "كل جهات الاتصال" - "تم" - "إلغاء" "جهات الاتصال في %s" "جهات الاتصال في عرض مخصص" "جهة اتصال واحدة" - "حفظ جهات الاتصال المستوردة إلى:" - "‏استيراد من شريحة SIM" - "‏استيراد من شريحة SIM ^1 - ^2" - "‏استيراد من شريحة SIM %1$s" - "‏الاستيراد من ملف vcf." - "هل تريد إلغاء استيراد %s؟" - "هل تريد إلغاء تصدير %s؟" - "‏تعذر إلغاء استيراد/تصدير vCard" - "خطأ غير معروف." - "تعذر فتح \"%s\": %s." - "تعذر بدء المُصدر: \"%s\"." - "ليست هناك جهة اتصال قابلة للتصدير." - "لقد عطلت إذنًا مطلوبًا." - "حدث خطأ أثناء التصدير: \"%s\"." - "اسم الملف المطلوب أطول مما يجب (%s)." - "‏خطأ I/O" - "الذاكرة غير كافية. ربما يكون الملف أكبر مما يجب." - "‏تعذر تحليل vCard لسبب غير متوقع." - "التنسيق غير معتمد." - "‏تعذر جمع معلومات وصفية حول ملفات vCard المحددة." - "‏تعذر استيراد ملف أو أكثر (%s)." - "تم الانتهاء من تصدير %s." - "تم الانتهاء من تصدير جهات الاتصال." - "تم الانتهاء من تصدير جهات الاتصال، انقر على الإشعار لمشاركة جهات الاتصال." - "انقر لمشاركة جهات الاتصال." - "تم إلغاء تصدير %s." - "تصدير بيانات جهة الاتصال" - "يجري تصدير بيانات جهات الاتصال." - "تعذر الحصول على معلومات قاعدة البيانات." - "ليست هناك أية جهات اتصال قابلة للتصدير. إذا كانت لديك جهات اتصال على جهازك، فإن بعض موفري البيانات لا يسمحون بتصدير جهات الاتصال من الجهاز." - "‏لم يبدأ مؤلف vCard بشكل صحيح." - "تعذر التصدير" - "لم يتم تصدير بيانات جهة الاتصال.\nالسبب: \"%s\"" - "جارٍ استيراد %s" - "‏تعذرت قراءة بيانات vCard" - "‏تم إلغاء قراءة بيانات vCard" - "‏تم الانتهاء من استيراد ملف vCard %s" - "تم إلغاء استيراد %s" - "سيتم استيراد %s بعد قليل." - "سيتم استيراد الملف بعد قليل." - "‏تم رفض طلب استيراد vCard. أعد المحاولة لاحقًا." - "سيتم تصدير %s بعد قليل." - "سيتم تصدير الملف بعد قليل." - "سيتم تصدير جهات الاتصال قريبًا." - "‏تم رفض طلب تصدير vCard. أعد المحاولة لاحقًا." - "جهة اتصال" - "‏يجري تخزين ملفات vCard مؤقتًا على وحدة تخزين مؤقتة محلية. سيبدأ الاستيراد الفعلي قريبًا." - "‏تعذر استيراد vCard." - "‏استلام ج اتص.NFC" - "تصدير جهات الاتصال؟" - "تخزين مؤقت" - "جارٍ استيراد %s/%s: %s" - "‏تصدير إلى ملف vcf." "ترتيب بحسب" "الاسم الأول" "اسم العائلة" "تنسيق الاسم" "الاسم الأول أولاً" "اسم العائلة أوّلًا" - "الحساب الافتراضي لجهات الاتصال الجديدة" - "مزامنة البيانات الوصفية لجهات الاتصال" - "حول جهات الاتصال" - "الإعدادات" - "مشاركة جهات الاتصال المرئية" - "أخفقت مشاركة جهات الاتصال المرئية." - "مشاركة جهات الاتصال المفضلة" - "مشاركة جميع جهات الاتصال" - "أخفقت مشاركة جهات الاتصال." - "استيراد/تصدير جهات اتصال" - "استيراد جهات الاتصال" - "لا يمكن مشاركة جهة الاتصال هذه." - "ليست هناك جهات اتصال لمشاركتها." - "بحث" - "البحث عن جهات اتصال" - "المفضلة" - "ليست هناك جهات اتصال." - "ليست هناك جهات اتصال مرئية." - "ليست هناك مفضلة" - "ليست هناك جهات اتصال في %s" "محو قائمة من يتصل بهم كثيرًا" - "‏تحديد شريحة SIM" - "إدارة الحسابات" - "استيراد/تصدير" - "عبر %1$s" - "%1$s عبر %2$s" "إيقاف البحث" "محو البحث" - "خيارات عرض جهات الاتصال" "الحساب" "استخدام هذا للمكالمات دائمًا" "الاتصال باستخدام" @@ -252,7 +151,7 @@ "اكتب ملاحظة لإرسالها مع المكالمة ..." "إرسال واتصال" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "علامة تبويب %1$s." %1$s علامة تبويب. %2$d عناصر غير مقروءة. @@ -262,13 +161,6 @@ %1$s علامة تبويب. %2$d عناصر غير مقروءة. %1$s علامة تبويب. عنصر واحد (%2$d) غير مقروء. - "نسخة الإصدار" - "تراخيص البرامج مفتوحة المصدر" - "تفاصيل الترخيص للبرامج مفتوحة المصدر" - "سياسة الخصوصية" - "بنود الخدمة" - "تراخيص البرامج مفتوحة المصدر" - "‏فشل فتح عنوان URL." "مكالمة فيديو" "المشاركة والاتصال" diff --git a/java/com/android/contacts/common/res/values-az/strings.xml b/java/com/android/contacts/common/res/values-az/strings.xml index 943377127..ed0c6a433 100644 --- a/java/com/android/contacts/common/res/values-az/strings.xml +++ b/java/com/android/contacts/common/res/values-az/strings.xml @@ -18,7 +18,6 @@ "Mətn kopyalandı" - "Panoya kopyalayın" "Zəng %s" "Ev zəngi" "Mobil zəng" @@ -40,7 +39,6 @@ "İş peycerinə zəng" "Zəng %s" "MMS zəngi" - "%s (Zəng)" "Mətn %s" "Ev mətni" "Mobil mətn" @@ -62,7 +60,6 @@ "İş peyceri nömrəsinə mesaj" "Mətn %s" "MMS nömrəsinə mesaj" - "%s (Mesaj)" "Tez-tez ünsiyyət qurulanlar silinsin?" "Əlaqələr və Telefon proqramlarında tez-tez əlaqə saxlanılanların siyahısını siləcəksiniz və fraqmentdən ünvanlama seçimlərinizi öyrənmək üçün e-poçt proqramlarını məcbur edəcəksiniz." "Tez-tez ünsiyyət qurulanlar silinir..." @@ -70,22 +67,14 @@ "Kənar" "Məşğul" "Kontaktlar" + "Ən yaxşı Təkliflər" "Digər" "Kataloq" "İş kataloqu" "Bütün kontaktlar" + "Təkliflər" "Mən" - "Axtarılır..." - "%d ədəddən çox tapılıb." - "Kontakt yoxdur" - - %d tapıldı - 1 tapıldı - - "%1$s üçün tez kontakt" "(ad yoxdur)" - "Tez-tez zəng edilən" - "Tez-tez əlaqə saxlanılan" "Kontakta baxın" "Telefon nömrələri olan bütün kontaktlar" "İş profili kontaktları" @@ -125,8 +114,6 @@ "E-poçt %s" "E-poçt" "Küçə" - "PO Box" - "Qonşuluq" "Şəhər" "Dövlət" "Poçt indeksi" @@ -144,103 +131,19 @@ "ICQ üzərindən çat" "Jabber üzərindən çat" "Çat" - "sil" - "Ad sahələrini genişləndirin və yığcamlaşdırın" - "Fonetik ad sahələrini genişləndirin və ya yığcamlaşdırın" "Bütün kontaktlar" - "Tamam" - "Ləğv et" "%s adındakı kontaktlar" "Fərdi baxışdan kontakt" "Tək kontakt" - "İmport olunan kontaktları yadda saxlayın:" - "SIM kartdan import edin" - "SIM-dən import edin: ^1 - ^2" - "SIM-dən import edin: %1$s" - ".vcf fayldan import edin" - "%s importu ləğv olunsun?" - "%s eksportu ləğv edilsin?" - "Vizit kart importunu/eksportunu ləğv etmək mümkün olmadı" - "Naməlum xəta." - "\"%s\" açmaq olmadı: %s." - "Eksportçunu başlatmaq olmadı: \"%s\"." - "Eksport edilə bilən heç bir kontakt yoxdur" - "Tələb olunan icazəni deaktiv etmisiniz." - "Eksport zamanı xəta baş verdi: \"%s\"." - "Tələb olunan fayl adı çox uzundur (\"%s\")" - "I/O xəta" - "Yetərli qədər yaddaş yoxdur. Fayl çox böyük ola bilər.." - "Gözlənilməyən səbəbə görə vizit kart təhlil edilə bilmədi." - "Format dəstəklənmir." - "Verilmiş vizit kartların meta məlumatları toplana bilmədi." - "Bir və daha çox fayl İmport edilə bilməz (%s)." - "%s eksportu bitdi" - "Kontaktların eksportu tamamlandı." - "Kontaktların eksportu tamamlandı, kontaktları paylaşmaq üçün bildirişə tıklayın." - "Kontaktları paylaşmaq üçün toxunun." - "%s eksportu ləğv edildi" - "Kontakt datası eksport olunur" - "Kontakt datası eksport olunur." - "Verilənlər bazası məlumatları əldə oluna bilmədi." - "Eksport edilə bilən kontakt yoxdur. Əgər cihazınızda kontakt varsa, bəzi data provayderləri kontaktların cihazdan eksport olunmasına icazə verməyə bilər." - "Vizit kart tərtibçisi düzgün başlamadı." - "Eksport edilə bilmədi" - "Kontakt datası eksport edilmədi.\nSəbəb: \"%s\"" - "%s import edilir" - "Vizit kart datası oxuna bilmədi" - "Vizit kart datasının oxunması ləğv edildi" - "%s vizit kart İmportu qurtardı" - "%s importu ləğv edildi" - "%s tezliklə import olunacaq." - "Bu fayl tezliklə import ediləcək." - "Vizit kart import sorğusu rədd edildi. Yenidən cəhd edin." - "%s tezliklə eksport ediləcək." - "Fayl az sonra eksport ediləcək." - "Kontaktlar tezliklə eksport ediləcək." - "Vizit kart eksport sorğusu rədd edildi. Daha sonra cəhd edin." - "kontakt" - "Vizit kart yerli müvəqqəti yaddaşa keşlənir. Hazırkı import tezliklə başlayacaq." - "Vizit kart import edilə bilmədi." - "Kontakt NFC üzərindən alınıb" - "Kontaktlar eksport olunsun?" - "Keşləndirilir" - "İmport edilir: %s/%s: %s" - ".vcf fayldan eksport edin" "Bunlardan biri üzrə sırala" "Ad" "Soyad" "Ad formatı" "Ad ilk yazılsın" "Soyad ilk yazılsın" - "Yeni kontaktlar üçün defolt hesab" - "Sinxronizasiya kontakt metadatası" - "Kontaktlar Haqqında" - "Ayarlar" - "Görünən kontaktları paylaşın" - "Görünən kontaktları paylaşmaq olmadı" - "Sevdiyiniz kontaktları paylaşın" - "Bütün kontaktları paylaşın" - "Kontaktları paylaşmaq uğursuz oldu." - "Kontaktları import/eksport edin" - "Kontaktları import edin" - "Bu kontakt paylaşıla bilməz." - "Bölüşmək üçün kontakt yoxdur." - "Axtarış" - "Kontaktlar tapın" - "Seçilmişlər" - "Kontakt yoxdur." - "Görünən kontakt yoxdur." - "Favoritlər yoxdur." - "%s daxilində kontakt yoxdur" "Müntəzəmləri təmizləyin" - "SIM kart seçin" - "Hesabları idarə edin" - "İmport/eksport" - "%1$s vasitəsilə" - "%2$s vasitəsilə %1$s" "axtarışı dayandırın" "Axtarışı təmizləyin" - "Kontakt göstərilmə seçimləri" "Hesab" "Həmişə bu zənglər üçün istifadə edin" "Çağrı üçün SIM:" @@ -248,19 +151,12 @@ "Zəng ilə göndərmək üçün qeyd yazın..." "GÖNDƏRİN VƏ ZƏNG EDİN" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s tabel." %1$s tabel. %2$d oxunmamış element. %1$s tabel. %2$d oxunmamış element. - "Quruluş versiyası" - "Açıq mənbə lisenziyaları" - "Açıq mənbə proqramı üçün lisenziya detalları" - "Məxfilik siyasəti" - "Xidmət şərtləri" - "Açıq mənbə lisenziyaları" - "Linki açmaq alınmadı." "Video zəng" "Paylaşın və zəng edin" diff --git a/java/com/android/contacts/common/res/values-b+sr+Latn/strings.xml b/java/com/android/contacts/common/res/values-b+sr+Latn/strings.xml index fc99567f1..ffc042532 100644 --- a/java/com/android/contacts/common/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/contacts/common/res/values-b+sr+Latn/strings.xml @@ -18,7 +18,6 @@ "Tekst je kopiran" - "Kopiraj u priv. memoriju" "Pozovi %s" "Pozovi kućni telefon" "Pozovi mobilni telefon" @@ -40,7 +39,6 @@ "Pozovi poslovni pejdžer" "Pozovi %s" "Pozovi broj za MMS" - "%s (pozovi)" "Pošalji SMS na %s" "Pošalji SMS na kućni telefon" "Pošalji SMS na mobilni telefon" @@ -62,7 +60,6 @@ "Pošalji SMS na poslovni pejdžer" "Pošalji SMS na %s" "Pošalji SMS na broj za MMS" - "%s (pošalji SMS)" "Brišete često kontaktirane?" "Obrisaćete listu često kontaktiranih u aplikacijama Kontakti i Telefon, pa će imejl aplikacije morati ponovo da prikupe informacije o adresiranju." "Brisanje često kontaktiranih..." @@ -70,23 +67,14 @@ "Odsutan/na" "Zauzet/a" "Kontakti" + "Najpopularniji predlozi" "Drugo" "Direktorijum" "Direktorijum za Work" "Svi kontakti" + "Predlozi" "Ja" - "Pretražuje se…" - "Pronađeno je više od %d." - "Nema kontakata" - - Pronađen je %d - Pronađena su %d - Pronađeno je %d - - "Brzi kontakt za korisnika %1$s" "(Nema imena)" - "Često pozivani" - "Često kontaktirani" "Prikaži kontakt" "Svi kontakti sa brojevima telefona" "Kontakti sa profila za Work" @@ -126,8 +114,6 @@ "Pošalji imejl na %s" "Pošalji imejl" "Ulica" - "Poštanski fah" - "Kraj" "Grad" "Država" "Poštanski broj" @@ -145,103 +131,19 @@ "Započni ćaskanje preko ICQ-a" "Započni ćaskanje preko Jabber-a" "Ćaskanje" - "izbriši" - "Proširivanje ili skupljanje polja za nazive" - "Proširi ili skupi polja za fonetsko ime" "Svi kontakti" - "Gotovo" - "Otkaži" "Kontakti u grupi %s" "Kontakti u prilagođenom prikazu" "Pojedinačni kontakt" - "Sačuvajte uvezene kontakte na:" - "Uvezi sa SIM kartice" - "Uvoz sa SIM kartice ^1^2" - "Uvoz sa SIM kartice %1$s" - "Uvezi iz .vcf datoteke" - "Želite li da otkažete uvoz datoteke %s?" - "Želite li da otkažete izvoz datoteke %s?" - "Nije moguće otkazati vCard uvoz/izvoz" - "Nepoznata greška." - "Nismo uspeli da otvorimo datoteku „%s“: %s." - "Nije moguće pokrenuti program za izvoz: „%s“" - "Nema kontakata za izvoz." - "Onemogućili ste obaveznu dozvolu." - "Došlo je do greške pri izvozu: „%s“" - "Zahtevani naziv datoteke je predugačak („%s“)." - "U/I greška" - "Nema dovoljno memorije. Datoteka je možda prevelika." - "Iz neočekivanog razloga nije moguće raščlaniti vCard datoteku." - "Format nije podržan." - "Nije moguće prikupiti metapodatke navedenih vCard datoteka." - "Nije moguć uvoz jedne ili više datoteka (%s)." - "Izvoz datoteke %s je završen." - "Izvoz kontakata je završen." - "Izvoz kontakata je završen. Kliknite na obaveštenje da biste ih delili." - "Dodirnite da biste delili kontakte." - "Izvoz datoteke %s je otkazan." - "Izvoz podataka o kontaktima je u toku" - "Podaci o kontaktima se izvoze." - "Preuzimanje informacija iz baze podataka nije moguće." - "Nema kontakata za izvoz. Ako imate kontakte na uređaju, neki dobavljači podataka možda ne dozvoljavaju izvoz kontakata sa uređaja." - "Program za izradu vCard datoteka se nije ispravno pokrenuo." - "Izvoz nije moguć" - "Podaci o kontaktima nizu izvezeni.\nRazlog: „%s“" - "Uvoz kontakta %s" - "Čitanje vCard podataka nije moguće" - "Čitanje vCard podataka je otkazano" - "Uvoz vCard datoteke %s je završen" - "Uvoz datoteke %s je otkazan" - "Datoteka %s će uskoro biti uvezena." - "Datoteka će uskoro biti uvezena." - "Zahtev za uvoz vCard datoteke je odbijen. Probajte ponovo kasnije." - "Datoteka %s će uskoro biti izvezena." - "Datoteka će uskoro biti izvezena." - "Kontakti će uskoro biti izvezeni." - "Zahtev za izvoz vCard datoteke je odbijen. Probajte ponovo kasnije." - "kontakt" - "Keširanje vCard datoteka u lokalnu privremenu memoriju. Uvoz će uskoro započeti." - "Uvoz vCard datoteke nije moguć." - "Kontakt preko NFC-a" - "Želite li da izvezete kontakte?" - "Keširanje" - "Uvozimo %s/%s: %s" - "Izvezi u .vcf datoteku" "Sortiraj prema" "Imenu" "Prezimenu" "Format imena i prezimena" "Prvo ime" "Prvo prezime" - "Podrazumevani nalog za nove kontakte" - "Sinhronizujte metapodatke kontakata" - "O Kontaktima" - "Podešavanja" - "Deli vidljive kontakte" - "Nije uspelo deljenje vidljivih kontakata." - "Deli omiljene kontakte" - "Deli sve kontakte" - "Deljenje kontakata nije uspelo." - "Uvoz/izvoz kontakata" - "Uvezi kontakte" - "Ovaj kontakt ne može da se deli." - "Nema kontakata za deljenje." - "Pretraži" - "Pronađite kontakte" - "Omiljeno" - "Nema kontakata." - "Nema vidljivih kontakata." - "Nema omiljenih" - "Nema kontakata u grupi %s" "Obriši često kontaktirane" - "Izaberite SIM karticu" - "Upravljaj nalozima" - "Uvezi/izvezi" - "preko %1$s" - "%1$s preko %2$s" "zaustavljanje pretraživanja" "Brisanje pretrage" - "Opcije prikazivanja kontakata" "Nalog" "Uvek koristi ovo za pozive" "Pozovi pomoću" @@ -249,20 +151,13 @@ "Unesite belešku koju ćete poslati uz poziv..." "POŠALJI I POZOVI" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Kartica %1$s." Kartica %1$s. %2$d nepročitana stavka. Kartica %1$s. %2$d nepročitane stavke. Kartica %1$s. %2$d nepročitanih stavki. - "Verzija" - "Licence otvorenog koda" - "Detalji licence za softver otvorenog koda" - "Politika privatnosti" - "Uslovi korišćenja usluge" - "Licence otvorenog koda" - "Otvaranje URL-a nije uspelo." "Video poziv" "Deli i pozovi" diff --git a/java/com/android/contacts/common/res/values-be/strings.xml b/java/com/android/contacts/common/res/values-be/strings.xml index a9652a1c1..2fab8a32d 100644 --- a/java/com/android/contacts/common/res/values-be/strings.xml +++ b/java/com/android/contacts/common/res/values-be/strings.xml @@ -18,7 +18,6 @@ "Тэкст скапіяваны" - "Скапіраваць у буфер абмену" "Выклікаць %s" "Патэлефанаваць на хатні нумар" "Патэлефанаваць на нумар мабільнага тэлефона" @@ -40,7 +39,6 @@ "Патэлефанаваць на працоўны пэйджар" "Выклікаць %s" "Выклікаць MMS" - "%s (Выклік)" "Напiсаць тэкставае паведамленне %s" "Напiсаць тэкставае паведамленне на хатні тэлефон" "Напiсаць тэкставае паведамленне на мабільны нумар тэлефона" @@ -62,7 +60,6 @@ "Напiсаць тэкставае паведамленне на працоўны пэйджар" "Напiсаць тэкставае паведамленне %s" "Тэкставае паведамленне MMS" - "%s (Паведамленне)" "Выдалiць частыя кантакты?" "Вы выдалiце найчасцей ужываныя кантакты ў праграмах Кантакты i Тэлефон i прымусiце праграмы па працы з электроннай поштай вывучыць вашы налады адрасацыi з нуля." "Выдаленне частых кантактаў..." @@ -70,24 +67,14 @@ "Адсутнічае" "Заняты" "Кантакты" + "Лепшыя прапановы" "Іншае" "Дырэкторыя" "Працоўны каталог" "Усе кантакты" + "Прапановы" "Я" - "Пошук..." - "Знойдзена вынікаў: больш за %d." - "Няма кантактаў" - - Знойдзены %d - Знойдзена %d - Знойдзена %d - Знойдзена %d - - "Хуткі кантакт для карыстальніка \"%1$s\"" "(Без назвы)" - "Часта выкліканыя" - "Часта выкарыстаныя кантакты" "Прагледзець кантакт" "Усе кантакты з нумарамі тэлефонаў" "Кантакты працоўнага профілю" @@ -127,8 +114,6 @@ "Адправiць лiст на адрас: %s" "Электронная пошта" "Вуліца" - "Паштовая скрыня" - "Наваколле" "Горад" "Шт" "Паштовы індэкс" @@ -146,103 +131,19 @@ "Чат праз ICQ" "Чат у Jabber" "Гутарка" - "выдаліць" - "Разгарнуць ці згарнуць назвы палёў" - "Разгарнуць ці згарнуць палі вымаўлення імён" "Усе кантакты" - "Гатова" - "Адмяніць" "Кантакты карыстальнiка %s" "Кантакты ў карыстальнiцкiм выглядзе" "Адзіночны кантакт" - "Захаваць імпартаваныя кантакты ў:" - "Імпарт з SIM-карты" - "Імпарт з SIM-карты ^1 - ^2" - "Імпарт з SIM-карты SIM %1$s" - "Імпартаваць з файла .vcf" - "Адмянiць iмпарт файла \"%s\"?" - "Адмянiць экспарт файла \"%s\"?" - "Немагчыма адмяніць імпарт/экспарт vCard" - "Невядомая памылка." - "Немагчыма адкрыць файл \"%s\": %s." - "Не атрымалася запусцiць экспарцёр: \"%s\"." - "Няма кантактаў для экспарту." - "Вы адключылі дазвол, які патрабуецца." - "Памылка экспарту: \"%s\"." - "Патрабаванае імя файла (\"%s\") занадта доўгае." - "Памылка ўводу/вываду" - "Недастаткова памяці (магчыма, занадта вялікі файл)" - "Па нечаканай прычыне немагчыма разабраць файл vCard." - "Фармат не падтрымліваецца." - "Немагчыма сабраць мета-інфармацыю з гэтых файлаў vCard." - "Адзін або некалькі файлаў не могуць быць імпартаваныя (%s)." - "Экспарт файла \"%s\" завершаны." - "Экспартаванне кантактаў завершана." - "Экспартаванне кантактаў завершана, націсніце на апавяшчэнне, каб абагуліць кантакты." - "Дакраніцеся, каб абагуліць кантакты." - "Экспарт файла \"%s\" адменены." - "Экспарт дадзеных кантакта" - "Даныя кантакта экспартуюцца." - "Немагчыма атрымаць інфармацыю з базы дадзеных." - "Няма кантактаў, якія можна экспартаваць. Калі ў вас ёсць кантакты на прыладзе, некаторыя пастаўшчыкі даных могуць не дазваляць экспарт кантактаў з прылады." - "Памылка запуску складальнiка файлаў vCard." - "Не атрымалася экспартаваць" - "Памылка экспарта кантактных дадзеных. \nПрычына: \"%s\"" - "Імпарт дадзеных карыстальнiка: %s" - "Немагчыма прачытаць дадзеныя vCard" - "Адменена чытанне дадзеных з vCard" - "Заканчэнне імпартавання vCard \"%s\"" - "Імпарт файла \"%s\" адменены" - "Файл \"%s\" будзе імпартаваны ў бліжэйшы час." - "Файл будзе імпартаваны ў бліжэйшы час." - "Запыт экспарту vCard адхілены. Паспрабуйце пазней." - "Файл \"%s\" будзе экспартаваны ў бліжэйшы час." - "Файл хутка будзе экспартаваны." - "Кантакты хутка будуць экспартаваны." - "Запыт экспарту vCard адхілены. Паспрабуйце пазней." - "кантакт" - "Кэшуе файлы vCard у лакальнае часовае сховішча. Фактычны імпарт пачнецца ў бліжэйшы час." - "Немагчыма імпартаваць vCard." - "Кантакт атрыманы праз NFC" - "Экспартаваць кантакты?" - "Кэшаванне" - "Імпарт %s/%s: %s" - "Экспартаваць у файл .vcf" "Сартаваць па" "Імені" "Прозвішчы" "Фармат імя" "Спачатку імя" "Спачатку прозвішча" - "Стандартны ўліковы запіс для новых кантактаў" - "Сінхранізаваць метаданыя пра кантакты" - "Аб Кантактах" - "Налады" - "Адкрыць бачныя кантакты" - "Спроба абагуліць бачныя кантакты няўдалая." - "Абагуліць улюбёныя кантакты" - "Абагуліць усе кантакты" - "Не атрымалася абагуліць кантакты." - "Імпарт/экспарт кантактаў" - "Імпартаваць кантакты" - "Немагчыма падзялiцца гэтым кантактам." - "Няма кантактаў, якія можна абагуліць." - "Пошук" - "Знайсці кантакты" - "Любімыя" - "Кантактаў няма." - "Няма бачных кантактаў." - "Няма абраных" - "Няма кантакта \"%s\" у групе" "Выдалiць частыя кантакты" - "Выбраць SIM-карту" - "Кіраваць уліковымі запісамі" - "Імпарт/экспарт" - "праз %1$s" - "%1$s праз %2$s" "спыніць пошук" "Ачысціць пошук" - "Параметры адлюстравання кантактаў" "Уліковы запіс" "Заўсёды выкарыст. гэта для выклікаў" "Выклікаць праз" @@ -250,7 +151,7 @@ "Увесці нататку для адпраўкі з выклікам…" "АДПРАВІЦЬ І ВЫКЛІКАЦЬ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Укладка %1$s." Укладка %1$s. %2$d непрачытаны элемент. @@ -258,13 +159,6 @@ Укладка %1$s. %2$d непрачытаных элементаў. Укладка %1$s. %2$d непрачытанага элемента. - "Версія зборкі" - "Ліцэнзіі ПЗ з адкрытым зыходным кодам" - "Звесткі аб ліцэнзіі на праграмнае забеспячэнне з адкрытым зыходным кодам" - "Палітыка прыватнасці" - "Умовы абслугоўвання" - "Ліцэнзіі ПЗ з адкрытым зыходным кодам" - "Не ўдалося адкрыць URL." "Відэавыклік" "Абагуліць і выклікаць" diff --git a/java/com/android/contacts/common/res/values-bg/strings.xml b/java/com/android/contacts/common/res/values-bg/strings.xml index 0b57eb6a5..2a1f2a603 100644 --- a/java/com/android/contacts/common/res/values-bg/strings.xml +++ b/java/com/android/contacts/common/res/values-bg/strings.xml @@ -18,7 +18,6 @@ "Текстът бе копиран" - "Копиране в буфера" "Обаждане на %s" "Обаждане на домашен" "Обаждане на мобилен" @@ -40,7 +39,6 @@ "Обаждане на служебен пейджър" "Обаждане на %s" "Обаждане на MMS" - "%s (обаждане)" "Изпращане на SMS на %s" "Изпращaне на SMS на домашен" "Изпращане на SMS на мобилен" @@ -62,7 +60,6 @@ "Изпращане на SMS на служебен пейджър" "Изпращане на SMS на %s" "Изпращане на SMS на MMS" - "%s (изпращане на съобщение)" "Да се изчистят ли често търсените?" "Ще изчистите списъка с често търсените в приложенията Контакти и Телефон и ще принудите приложенията за имейл да научат предпочитанията ви за адресите, започвайки отначало." "Често търсените се изчистват…" @@ -70,22 +67,14 @@ "Отсъства" "Зает/а" "Контакти" + "Водещи предложения" "Други" "Директория" "Служебен указател" "Всички контакти" + "Предложения" "Аз" - "Търси се…" - "Намерени са повече от %d." - "Няма контакти" - - Намерени са %d - Намерен е 1 - - "Бърз контакт за %1$s" "(Няма име)" - "Чести обаждания" - "Често търсени" "Преглед на контакта" "Всички контакти с телефонни номера" "Контакти в служебния потребителски профил" @@ -125,8 +114,6 @@ "Изпращане на имейл до %s" "Изпращане на имейл" "Улица" - "Пощенска кутия" - "Квартал" "Град" "Щат" "Пощенски код" @@ -144,103 +131,19 @@ "Чат по ICQ" "Чат по Jabber" "Чат" - "изтриване" - "Разгъване или свиване на полетата с името" - "Разгъване или свиване на полетата за фонетични имена" "Всички контакти" - "Готово" - "Отказ" "Контакти във: %s" "Контакти в персонал. изглед" "Един контакт" - "Запазване на импортираните контакти във:" - "Импортиране от SIM карта" - "Импортиране от SIM картата „^1“ – ^2" - "Импортиране от SIM картата „%1$s“" - "Импортиране от .vcf файл" - "Да се анулира ли импортирането на „%s“?" - "Да се анулира ли експортирането на „%s“?" - "Импорт./експорт. не можа да се анулира" - "Неизвестна грешка." - "„%s“ не можа да се отвори: %s." - "Експортирането не можа да започне: %s." - "Няма контакт, позволяващ експортиране." - "Деактивирахте задължително разрешение." - "При експортирането възникна грешка: %s." - "Поисканото име на файла е твърде дълго („%s“)." - "I/O грешка" - "Няма достатъчно памет. Файлът може да е твърде голям." - "vCard не можа да се анализира по неочаквана причина." - "Форматът не се поддържа." - "Метаинформацията от даден/и vCard файл/ове не можа да бъде събрана." - "Един или повече файла не можаха да бъдат импортирани (%s)." - "Експортирането на „%s“ завърши." - "Експортирането на контактите завърши." - "Експортирането на контактите завърши. Кликнете върху известието, за да ги споделите." - "Докоснете, за да споделите контактите." - "Експортирането на „%s“ е анулирано." - "Експортиране на данни за контакти" - "Данните за контактите се експортират." - "Информацията за базата от данни не можа да бъде получена." - "Няма контакти, позволяващи експортиране. Ако на устройството си имате контакти, е възможно някои доставчици на данни да не позволяват експортирането им извън него." - "Създателят на vCard не се стартира правилно." - "Не се експортираха" - "Данните за контакта не бяха експортирани.\nПричина: %s" - "%s се импортира" - "Данните от vCard не бяха прочетени" - "Четенето на данни от vCard е анулирано" - "Импортирането на vCard файла „%s“ завърши" - "Импортирането на „%s“ е анулирано" - "„%s“ ще се импортира скоро." - "Файлът ще се импортира скоро." - "Заявката за импортиране на vCard бе отхвърлена. Опитайте отново по-късно." - "„%s“ ще се експортира скоро." - "Файлът ще се експортира скоро." - "Контактите ще бъдат експортирани скоро." - "Заявката за експортиране на vCard бе отхвърлена. Опитайте отново по-късно." - "контакт" - "vCard се кешира/т във временно локално хранилище. Самото импортиране ще започне скоро." - "vCard не можа да се импортира." - "Контакти от КБП" - "Да се експортират ли контактите?" - "Кешира се" - "Импортира се %s/%s: %s" - "Експортиране като .vcf файл" "Сортиране по" "Собствено име" "Фамилно име" "Формат на името" "Първо собственото име" "Първо фамилното име" - "Стандартен профил за новите контакти" - "Синхронизиране на метаданните за контактите" - "Всичко за Контакти" - "Настройки" - "Споделяне на видимите контакти" - "Споделянето на видимите контакти не бе успешно." - "Споделяне на любимите контакти" - "Споделяне на всички контакти" - "Споделянето на контактите не бе успешно." - "Импортиране/eкспортиране на контакти" - "Импортиране на контактите" - "Този контакт не може да бъде споделен." - "Няма контакти за споделяне." - "Търсене" - "Намиране на контакти" - "Любими" - "Няма контакти." - "Няма видими контакти." - "Няма любими" - "Няма контакти във: %s" "Изчистване на често търсените" - "Избиране на SIM карта" - "Управление на профилите" - "Импортиране/Експортиране" - "чрез %1$s" - "%1$s чрез %2$s" "спиране на търсенето" "Изчистване на търсенето" - "Опции за показване на контактите" "Профил" "Винаги да се използва за обаждания" "Обаждане чрез" @@ -248,19 +151,12 @@ "Напишете придружаваща бележка, която ще се изпрати при извършване на обаждането..." "ИЗПРАЩАНЕ И ОБАЖДАНЕ" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Раздел „%1$s“." Раздел „%1$s“. %2$d непрочетени елемента. Раздел „%1$s“. %2$d непрочетен елемент. - "Версия" - "Лицензи за отворен код" - "Подробности за лиценза на софтуера с отворен код" - "Декларация за поверителност" - "Общи условия" - "Лицензи за отворен код" - "Отварянето на URL адреса не бе успешно." "Видеообаждане" "Споделяне и обаждане" diff --git a/java/com/android/contacts/common/res/values-bn/strings.xml b/java/com/android/contacts/common/res/values-bn/strings.xml index 8e783d129..49d6f5b3c 100644 --- a/java/com/android/contacts/common/res/values-bn/strings.xml +++ b/java/com/android/contacts/common/res/values-bn/strings.xml @@ -18,7 +18,6 @@ "পাঠ্য অনুলিপি হয়েছে" - "ক্লিপবোর্ডে কপি করুন" "%s এ কল করুন" "বাড়ির নম্বরে কল করুন" "মোবাইল নম্বরে কল করুন" @@ -40,7 +39,6 @@ "অফিসের পেজার নম্বরে কল করুন" "%s এ কল করুন" "MMS নম্বরে কল করুন" - "%s (কল)" "%s নম্বরে পাঠ্য বার্তা পাঠান" "ঘরের ফোন নম্বরে পাঠ্য বার্তা পাঠান" "মোবাইল নম্বরে পাঠ্য বার্তা পাঠান" @@ -62,7 +60,6 @@ "কর্মক্ষেত্রের পেজারে পাঠ্য বার্তা পাঠান" "%s নম্বরে পাঠ্য বার্তা পাঠান" "MMS ফোন নম্বরে পাঠ্য বার্তা পাঠান" - "%s (বার্তা)" "ঘন ঘন যোগাযোগ করা হয়েছে এমন পরিচিতিগুলিকে সাফ করবেন?" "পরিচিতি এবং ফোন অ্যাপ্লিকেশানগুলি থেকে আপনি ঘন ঘন যোগাযোগ করা পরিচিতির তালিকা সাফ করবেন, এবং ইমেল অ্যাপ্লিকেশানগুলিকে আবার শুরু থেকে আপনার ঠিকানা অভিরুচি জানতে বাধ্য করবেন৷" "ঘন ঘন যোগাযোগ করা পরিচিতিগুলিকে সাফ করা হচ্ছে…" @@ -70,22 +67,14 @@ "অন্যত্র" "ব্যস্ত" "পরিচিতিগুলি" + "শীর্ষস্থানীয় প্রস্তাবনা" "অন্যান্য" "ডিরেক্টরি" "কাজের সংগ্রহ" "সকল পরিচিতি" + "প্রস্তাবনাগুলি" "আমি" - "অনুসন্ধান করছে..." - "%dটির থেকে বেশি খুঁজে পাওয়া গিয়েছে৷" - "কোনো পরিচিতি নেই" - - %dটি খুঁজে পাওয়া গেছে - %dটি খুঁজে পাওয়া গেছে - - "%1$s এর জন্য দ্রুত পরিচিতি" "(কোনও নাম নেই)" - "ঘন ঘন কল করা হয়েছে" - "ঘন ঘন যোগাযোগ করা হয়েছে" "পরিচিতি দেখুন" "ফোন নম্বর সহ সমস্ত পরিচিতি" "কর্মস্থলের প্রোফাইলের পরিচিতিগুলি" @@ -125,8 +114,6 @@ "%s এ ইমেল করুন" "ইমেল করুন" "রাস্তা" - "পোস্ট বক্স" - "নিকটবর্তী অঞ্চল" "শহর" "রাজ্য" "পিন কোড" @@ -144,103 +131,19 @@ "ICQ ব্যবহার করে চ্যাট করুন" "Jabber ব্যবহার করে চ্যাট করুন" "চ্যাট করুন" - "মুছুন" - "নামের ক্ষেত্রটিকে প্রসারিত বা সঙ্কুচিত করুন" - "ফোনেটিক নামের ক্ষেত্রটিকে প্রসারিত বা সঙ্কুচিত করুন" "সকল পরিচিতি" - "সম্পন্ন হয়েছে" - "বাতিল করুন" "%s এ পরিচিতিগুলি" "কাস্টম দৃশ্যে পরিচিতিগুলি" "একক পরিচিতি" - "আমদানি করা পরিচিতিগুলি এতে সংরক্ষণ করুন:" - "সিম কার্ড থেকে আমদানি করুন" - "^1 সিম থেকে আমদানি করুন - ^2" - "%1$s সিম থেকে আমদানি করুন" - ".vcf ফাইল থেকে আমদানি করুন" - "%s এর আমদানি বাতিল করবেন?" - "%s এর রপ্তানি বাতিল করবেন?" - "vCard এর আমদানি/রপ্তানি বাতিল করা যায়নি" - "অজানা ত্রুটি৷" - "\"%s\" খোলা গেল না: %s৷" - "রপ্তানিকারক শুরু করা যায়নি: \"%s\"৷" - "রপ্তানিযোগ্য কোনো পরিচিতি নেই৷" - "আপনি একটি প্রয়োজনীয় অনুমতি অক্ষম করেছেন৷" - "রপ্তানির সময় একটি ত্রুটি ঘটেছে: \" %s \"৷" - "প্রয়োজনীয় ফাইলের নামটি (\"%s\") অত্যন্ত দীর্ঘ৷" - "I/O ত্রুটি" - "যথেষ্ট মেমরি নেই৷ ফাইলটি খুব বড় হতে পারে৷" - "একটি অপ্রত্যাশিত কারণে vCard পার্জ করা যায়নি৷" - "এই ফর্ম্যাটটি সমর্থিত নয়৷" - "প্রদত্ত vCard ফাইলের(গুলির) মেটা তথ্য সংগ্রহ করা যায়নি৷" - "একটি বা একাধিক (%s) ফাইল আমদানি করা যাবে না৷" - "%s রপ্তানি করা সম্পন্ন হয়েছে৷" - "পরিচিতি রপ্তানি করা সম্পন্ন হয়েছে৷" - "পরিচিতিগুলি রপ্তানি করা হয়েছে, পরিচিতিগুলিকে শেয়ার করতে বিজ্ঞপ্তিটিতে ক্লিক করুন৷" - "পরিচিতিগুলিকে শেয়ার করতে আলতো চাপ দিন৷" - "%s রপ্তানি করা বাতিল হয়েছে৷" - "পরিচিতির তথ্য রপ্তানি করা হচ্ছে" - "পরিচিতির ডেটা রপ্তানি করা হচ্ছে৷" - "ডেটাবেসের তথ্য পাওয়া যায়নি৷" - "এখানে রপ্তানিযোগ্য কোনো পরিচিতি নেই৷ আপনার ডিভাইসে পরিচিতি থাকলে, কিছু ডেটা সরবরাহকারী আপনার ডিভাইস থেকে সেই পরিচিতিগুলিকে রপ্তানি করার অনুমতি নাও করতে পারে৷" - "vCard কম্পোজার সঠিকভাবে শুরু করা হয়নি৷" - "রপ্তানি করা যায়নি" - "পরিচিতির তথ্য রপ্তানি করা যায়নি৷\nকারণ: \"%s\"" - "%s আমদানি করা হচ্ছে" - "vCard ডেটা পড়া যায়নি" - "vCard ডেটা পড়া বাতিল করা হয়েছে" - "vCard %s আমদানি করা সমাপ্ত হয়েছে" - "%s আমদানি করা বাতিল করা হয়েছে" - "%s শীঘ্রই আমদানি করা হবে৷" - "ফাইলটি শীঘ্রই আমদানি করা হবে৷" - "vCard আমদানি করার অনুরোধ প্রত্যাখ্যাত হয়েছে৷ পরে আবার চেষ্টা করুন৷" - "%s শীঘ্রই রপ্তানি করা হবে৷" - "ফাইলটি শীঘ্রই রপ্তানি করা হবে৷" - "পরিচিতিগুলি শীঘ্রই রপ্তানি করা হবে৷" - "vCard রপ্তানি করার অনুরোধ প্রত্যাখ্যাত হয়েছে৷ পরে আবার চেষ্টা করুন৷" - "পরিচিতি" - "স্থানীয় অস্থায়ী সংগ্রহস্থলে vCard(গুলি)কে ক্যাশ করা হচ্ছে৷ প্রকৃত আমদানি শীঘ্রই শুরু হবে৷" - "vCard আমদানি করতে পারা যায় নি৷" - "NFC এর মাধ্যমে পরিচিতি প্রাপ্ত হয়েছে" - "পরিচিতিগুলি রপ্তানি করবেন?" - "ক্যাশ করা হচ্ছে" - "আমদানি করা হচ্ছে, %s/%s: %s" - ".vcf ফাইলে রপ্তানি করুন" "এই অনুসারে বাছুন" "প্রথম নাম" "পদবি" "নামের বিন্যাস" "প্রথমে প্রথম নামটি" "প্রথমে উপাধি" - "নতুন পরিচিতিগুলির জন্য ডিফল্ট অ্যাকাউন্ট" - "পরিচিতির মেটাডাটা সিঙ্ক করুন" - "পরিচিতি সম্পর্কিত" - "সেটিংস" - "দৃশ্যমান পরিচিতিগুলিকে শেয়ার করুন" - "দৃশ্যমান পরিচিতিগুলি শেয়ার করতে ব্যর্থ হয়েছে৷" - "পছন্দসই পরিচিতিগুলি শেয়ার করুন" - "সকল পরিচিতি শেয়ার করুন" - "পরিচিতিগুলিকে শেয়ার করতে ব্যর্থ হয়েছে৷" - "পরিচিতিগুলি আমদানি/রপ্তানি করুন" - "পরিচিতিগুলি আমদানি করুন" - "এই পরিচিতিটিকে শেয়ার করা যাবে না৷" - "শেয়ার করার জন্য কোনো পরিচিতি নেই৷" - "অনুসন্ধান" - "পরিচিতিগুলি খুঁজুন" - "পছন্দগুলি" - "কোনো পরিচিতি নেই৷" - "কোনো দৃশ্যমান পরিচিতি নেই৷" - "কোনো পছন্দসই নেই" - "%s এ কোনো পরিচিতি নেই" "পুনরাবৃত্তি সাফ করুন" - "সিম কার্ড নির্বাচন করুন" - "অ্যাকাউন্টগুলি পরিচালনা করুন" - "আমদানি/রপ্তানি" - "%1$s এর মাধ্যমে" - "%2$s এর মাধ্যমে %1$s" "অনুসন্ধান বন্ধ করুন" "অনুসন্ধান সাফ করুন" - "পরিচিতি প্রদর্শনের বিকল্পগুলি" "অ্যাকাউন্ট" "কলের জন্য সবসময় এটি ব্যবহার করুন" "এর মাধ্যমে কল করুন" @@ -248,19 +151,12 @@ "কলের সাথে পাঠানোর জন্য একটি নোট লিখুন ..." "পাঠান এবং কল করুন" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ট্যাব৷" %1$s ট্যাব৷ %2$dটি অপঠিত আইটেম৷ %1$s ট্যাব৷ %2$dটি অপঠিত আইটেম৷ - "বিল্ডের সংস্করণ" - "মুক্ত উৎস লাইসেন্সগুলি" - "ওপেন সোর্স সফ্টওয়্যারের লাইসেন্স বিবরণ" - "গোপনীয়তা নীতি" - "পরিষেবার শর্তাবলী" - "মুক্ত উৎস লাইসেন্সগুলি" - "url খুলতে ব্যর্থ হয়েছে৷" "ভিডিও কল" "শেয়ার এবং কল করুন" diff --git a/java/com/android/contacts/common/res/values-bs/strings.xml b/java/com/android/contacts/common/res/values-bs/strings.xml index 278f6a8d0..b0d1deb65 100644 --- a/java/com/android/contacts/common/res/values-bs/strings.xml +++ b/java/com/android/contacts/common/res/values-bs/strings.xml @@ -18,7 +18,6 @@ "Tekst je kopiran" - "Kopiraj u međumemoriju" "Pozovi %s" "Pozovi kuću" "Pozovi mobitel" @@ -40,7 +39,6 @@ "Pozovi poslovni pejdžer" "Pozovi %s" "Pozovi MMS" - "%s (Poziv)" "Pošalji tekstualnu poruku na %s" "Pošalji tekstualnu poruku na kućni broj" "Pošalji tekstualnu poruku na mobilni" @@ -62,7 +60,6 @@ "Pošalji tekstualnu poruku na poslovni pejdžer" "Pošalji tekstualnu poruku %s" "Pošalji tekstualnu poruku na MMS broj" - "%s (Poruka)" "Obrisati često kontaktirane osobe?" "Obrisat ćete listu često kontaktiranih osoba u aplikaciji Kontakti i Aplikaciji za telefon, pa će aplikacije za e-poštu morati ispočetka učiti vaše postavke adresa." "Brisanje često kontaktiranih osoba…" @@ -70,23 +67,14 @@ "Odsutan" "Zauzeto" "Kontakti" + "Najbolji prijedlozi" "Ostalo" "Imenik" "Poslovni imenik" "Svi kontakti" + "Prijedlozi" "Ja" - "Pretraživanje…" - "Pronađeno je više od %d." - "Nema kontakata" - - %d kontakt pronađen - %d kontakta pronađena - %d kontakata pronađeno - - "Brzi kontakt za %1$s" "(Bez imena)" - "Često pozivane osobe" - "Često kontaktirane osobe" "Prikaži kontakt" "Svi kontakti s brojevima telefona" "Kontakti radnog profila" @@ -126,8 +114,6 @@ "E-pošta %s" "E-pošta" "Ulica" - "Poštanski pretinac" - "Naselje" "Grad" "Država" "Poštanski broj" @@ -136,112 +122,28 @@ "Prikaži poslovnu adresu" "Prikaži adresu" "Prikaži adresu %s" - "Ćaskanje putem aplikacije AIM" - "Ćaskanje putem aplikacije Windows Live" - "Ćaskanje putem aplikacije Yahoo" - "Ćaskanje putem aplikacije Skype" - "Ćaskanje putem aplikacije QQ" - "Ćaskanje putem aplikacije Google Talk" - "Ćaskanje putem aplikacije ICQ" - "Ćaskanje putem aplikacije Jabber" - "Ćaskanje" - "izbriši" - "Proširi ili skupi polja za imena" - "Proširi ili skupi polja za fonetska imena" + "Chat putem aplikacije AIM" + "Chat putem aplikacije Windows Live" + "Chat putem aplikacije Yahoo" + "Chat putem aplikacije Skype" + "Chat putem aplikacije QQ" + "Chat putem aplikacije Google Talk" + "Chat putem aplikacije ICQ" + "Chat putem aplikacije Jabber" + "Chat" "Svi kontakti" - "Gotovo" - "Otkaži" "Kontakti na računu %s" "Kontakti u prilagođenom prikazu" "Jedan kontakt" - "Sačuvaj uvezene kontakte na karticu:" - "Uvezi sa SIM kartice" - "Uvezi sa SIM kartice ^1 - ^2" - "Uvezi sa SIM kartice %1$s" - "Uvezi iz .vcf fajla" - "Otkazati uvoz fajla %s?" - "Otkazati izvoz fajla %s?" - "Nemoguće otkazati uvoz/izvoz vCard fajla" - "Nepoznata greška." - "Nije moguće otvoriti \"%s\": %s." - "Nije moguće pokrenuti program za izvoz: \"%s\"." - "Nema sadržaja za izvoz." - "Onemogućili ste potrebnu dozvolu." - "Došlo je do greške prilikom izvoza: \"%s\"." - "Zahtijevano ime fajla je predugo (\"%s\")." - "I/O greška" - "Nema dovoljno memorije. Možda je fajl prevelik." - "Nije moguće raščlaniti vCard fajl iz neočekivanog razloga." - "Format nije podržan." - "Nije moguće otvoriti metapodatke vCard fajl(ov)a." - "Nije moguće uvesti jedan ili više fajlova (%s)." - "Izvoz fajla %s je završen." - "Izvoz kontakata je završen." - "Izvoz kontakata je završen. Kliknite obavještenje da podijelite kontakte." - "Dodirnite da podijelite kontakte." - "Izvoz fajla %s je otkazan." - "Izvoz podataka kontakta u toku" - "Podaci kontakta se izvoze." - "Nije moguće preuzeti informacije iz baze podataka." - "Nema kontakata koji se mogu izvoziti. Ako imate kontakte na uređaju, neki dobavljači podataka možda ne dozvoljavaju izvoz kontakata s tableta." - "Program za izradu kartica vCard nije pravilno pokrenut." - "Izvoz nije uspio" - "Podaci kontakta nisu izvezeni.\nRazlog: \"%s\"" - "Uvozi se kontakt %s" - "Čitanje podataka vCard nije uspjelo" - "Čitanje vCard podataka je otkazano" - "Završen uvoz vCard fajla %s" - "Uvoz fajla %s je otkazan" - "Fajl %s će uskoro biti uvezen." - "Fajl će uskoro biti uvezen." - "Zahtjev za uvoz vCard fajla je odbijen. Pokušajte ponovo kasnije." - "Fajl %s će će uskoro biti izvezen." - "Fajl će uskoro biti izvezen." - "Kontakti će uskoro biti izvezeni." - "Zahtjev za izvoz vCard fajla je odbijen. Pokušajte ponovo kasnije." - "kontakt" - "Spremanje vCard fajlova u lokalnu privremenu pohranu. Uvoz će započeti uskoro." - "Uvoz vCard kartice nije uspio." - "Kontakt preko NFC-a" - "Izvesti kontakte?" - "Spremanje u privremenu pohranu u toku" - "Uvozi se %s/%s: %s" - "Izvezi u .vcf fajl" "Poredaj po" "Ime" "Prezime" "Format imena" "Ime prvo" "Prezime prvo" - "Zadani račun za nove kontakte" - "Sinhroniziraj metapodatke kontakata" - "O Kontaktima" - "Postavke" - "Podijeli vidljive kontakte" - "Dijeljenje vidljivih kontakata nije uspjelo." - "Dijeli omiljene kontakte" - "Dijeli sve kontakte" - "Dijeljenje kontakata nije uspjelo." - "Uvoz/izvoz kontakata" - "Uvezi kontakte" - "Ovaj kontakt se ne može podijeliti." - "Nema kontakata za dijeljenje." - "Traži" - "Pronađi kontakte" - "Favoriti" - "Nema kontakata." - "Nema vidljivih kontakata." - "Nema favorita" - "Nema kontakata u %s" "Obriši često kontaktirane" - "Odaberite SIM karticu" - "Upravljaj računima" - "Uvoz/izvoz" - "putem %1$s" - "%1$s putem %2$s" "zaustavi pretraživanje" "Obriši pretragu" - "Opcije prikaza kontakata" "Račun" "Uvijek koristi ovu karticu za pozive" "Poziv putem" @@ -249,20 +151,13 @@ "Upišite bilješku koja će se poslati uz poziv ..." "POŠALJI I POZOVI" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Kartica %1$s." Kartica %1$s. %2$d nepročitana stavka. Kartica %1$s. %2$d nepročitane stavke. Kartica %1$s. %2$d nepročitanih stavki. - "Međuverzija aplikacije" - "Licence otvorenog koda" - "Detalji o licenci za Open source softver" - "Pravila o privatnosti" - "Uslovi pružanja usluge" - "Licence otvorenog koda" - "Otvaranje URL-a nije uspjelo." "Videopoziv" "Podijeli i pozovi" diff --git a/java/com/android/contacts/common/res/values-ca/strings.xml b/java/com/android/contacts/common/res/values-ca/strings.xml index ad31a01b6..f34bd1f48 100644 --- a/java/com/android/contacts/common/res/values-ca/strings.xml +++ b/java/com/android/contacts/common/res/values-ca/strings.xml @@ -18,7 +18,6 @@ "Text copiat" - "Copia al porta-retalls" "Truca al %s" "Truca a casa" "Truca al mòbil" @@ -40,7 +39,6 @@ "Truca al cercapersones de la feina" "Truca al %s" "Truca al número MMS" - "%s (truca-li)" "Envia SMS al %s" "Envia un SMS a casa" "Envia un SMS al mòbil" @@ -62,7 +60,6 @@ "Envia un SMS al cercapersones de la feina" "Envia un SMS a %s" "Envia un MMS" - "%s (envia-li un missatge)" "Vols esborrar els contactes freqüents?" "S\'esborrarà la llista de contactes més freqüents a les aplicacions Contactes i Telèfon i es forçarà les aplicacions de correu electrònic a obtenir informació nova sobre les teves preferències pel que fa a adreces." "S\'estan esborrant contactes freq..." @@ -70,22 +67,14 @@ "Absent" "Ocupat" "Contactes" + "Suggeriments principals" "Altres" "Directori" "Directori de la feina" "Tots els contactes" + "Suggeriments" "Jo" - "S\'està cercant…" - "Se n\'han trobat més de %d." - "No hi ha cap contacte" - - %d contactes trobats - 1 contacte trobat - - "Contacte ràpid per a %1$s" "(Sense nom)" - "Usuaris a qui es truca sovint" - "Contactes freqüents" "Visualitza el contacte" "Tots els contactes que tenen números de telèfon" "Contactes del perfil professional" @@ -125,8 +114,6 @@ "Envia un correu electrònic a %s" "Correu electrònic" "Carrer" - "Apartat postal" - "Barri" "Ciutat" "Estat" "Codi postal" @@ -144,103 +131,19 @@ "Xateja amb ICQ" "Xateja amb Jabber" "Xat" - "suprimeix" - "Desplega o replega els camps de nom" - "Desplega o replega els camps de nom fonètic" "Tots els contactes" - "Fet" - "Cancel·la" "Contactes a %s" "Contactes en visualització personalitzada" "Un sol contacte" - "Desa els contactes importats a:" - "Importa de la targeta SIM" - "Importa des de la targeta SIM ^1 (^2)" - "Importa des de la targeta SIM %1$s" - "Importa d\'un fitxer .vcf" - "Vols cancel·lar la importació de %s?" - "Vols cancel·lar l\'exportació de %s?" - "No es pot cancel·lar la imp./exp. vCard" - "S\'ha produït un error desconegut." - "%s no s\'ha pogut obrir: %s." - "No s\'ha pogut iniciar l\'exportador: \"%s\"." - "No hi ha cap contacte que es pugui exportar." - "Has desactivat un permís obligatori." - "S\'ha produït un error durant l\'exportació: \"%s\"." - "El nom de fitxer obligatori és massa llarg (\"%s\")." - "Error d\'E/S" - "No hi ha prou memòria. És possible que el fitxer sigui massa gran." - "No s\'ha pogut analitzar la vCard a causa d\'un motiu inesperat." - "No s\'admet aquest format." - "No s\'ha pogut recopilar metainformació dels fitxers de la vCard." - "No s\'ha pogut importar un dels fitxers com a mínim (%s)." - "Exportació de %s finalitzada." - "S\'han acabat d\'exportar els contactes." - "S\'han acabat d\'exportar els contactes; fes clic a la notificació per compartir-los." - "Toca per compartir els contactes." - "S\'ha cancel·lat l\'exportació de: %s." - "S\'estan exportant les dades de contacte" - "S\'estan exportant les dades de contacte." - "No s\'ha pogut obtenir informació de la base de dades." - "No hi ha cap contacte que es pugui exportar. Si en tens algun al dispositiu, és possible que hi hagi proveïdors de dades que no permetin que els contactes s\'exportin des d\'aquest dispositiu." - "No s\'ha iniciat correctament el creador de vCard." - "Error en exportar" - "No s\'han exportat les dades de contacte.\nMotiu: \"%s\"" - "S\'està important %s" - "No s\'han pogut llegir les dades de vCard" - "Lectura de dades de vCard cancel·lada" - "Importació de vCard %s finalitzada" - "S\'ha cancel·lat la importació de: %s" - "%s s\'importarà d\'aquí a poc." - "D\'aquí a poc s\'importarà el fitxer." - "S\'ha rebutjat la sol·licitud per importar la vCard. Torna-ho a provar més tard." - "%s s\'exportarà en breu." - "El fitxer s\'exportarà en breu." - "Aviat s\'exportaran els contactes." - "S\'ha rebutjat la sol·licitud per exportar la vCard. Torna-ho a provar més tard." - "contacte" - "S\'estan desant les vCard a l\'emmagatzematge temporal local. La importació real començarà aviat." - "No s\'ha pogut importar la vCard." - "Contac. reb. NFC" - "Vols exportar els contactes?" - "Desament a la memòria cau" - "S\'estan important %s de %s: %s" - "Exporta a un fitxer .vcf" "Ordena per" "Nom" "Cognoms" "Format del nom" "Primer el nom" "Primer els cognoms" - "Compte predeterminat per als contactes nous" - "Sincronitza les metadades dels contactes" - "Sobre Contactes" - "Configuració" - "Comparteix contactes visibles" - "Error en compartir els contactes visibles." - "Comparteix els contactes preferits" - "Comparteix tots els contactes" - "No s\'han pogut compartir els contactes." - "Importa/exporta contactes" - "Importa contactes" - "No es pot compartir aquest contacte." - "No hi ha cap contacte per compartir." - "Cerca" - "Cerca contactes" - "Preferits" - "No hi ha cap contacte." - "No hi ha cap contacte visible." - "Sense preferits" - "No hi ha cap contacte a %s" "Esborra contactes freqüents" - "Selecció d\'una targeta SIM" - "Gestiona els comptes" - "Importa/exporta" - "mitjançant %1$s" - "%1$s mitjançant %2$s" "Atura la cerca." "Esborra la cerca" - "Opcions de visualització de contactes" "Compte" "Utilitza sempre per a les trucades" "Truca mitjançant" @@ -248,19 +151,12 @@ "Escriu una nota per enviar-la juntament amb la trucada..." "ENVIA I TRUCA" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Pestanya %1$s" Pestanya %1$s: %2$d elements no llegits Pestanya %1$s: %2$d element no llegit - "Versió de la compilació" - "Llicències de codi obert" - "Detalls de la llicència del programari lliure" - "Política de privadesa" - "Condicions del servei" - "Llicències de programari lliure" - "No s\'ha pogut obrir l\'URL." "Videotrucada" "Comparteix i truca" diff --git a/java/com/android/contacts/common/res/values-cs/strings.xml b/java/com/android/contacts/common/res/values-cs/strings.xml index ab54be93a..dcad84603 100644 --- a/java/com/android/contacts/common/res/values-cs/strings.xml +++ b/java/com/android/contacts/common/res/values-cs/strings.xml @@ -18,7 +18,6 @@ "Text zkopírován" - "Zkopírovat do schránky" "Volat číslo %s" "Volat domů" "Volat mobil" @@ -40,7 +39,6 @@ "Volat na pracovní pager" "Volat kontakt %s" "Volat MMS" - "%s (Zavolat)" "Poslat SMS na číslo %s" "Poslat SMS domů" "Poslat SMS na mobil" @@ -62,7 +60,6 @@ "Poslat SMS na pracovní pager" "Poslat SMS na kontakt %s" "Poslat SMS na číslo MMS" - "%s (Poslat zprávu)" "Vymazat často kontaktované osoby?" "Vymažete seznam často kontaktovaných osob v aplikacích Kontakty a Telefon a e-mailové aplikace budou muset nastavení adresátů vytvořit znovu." "Mazání často kontaktovaných osob..." @@ -70,24 +67,14 @@ "Pryč" "Nemám čas" "Kontakty" + "Hlavní návrhy" "Ostatní" "Adresář" "Pracovní adresář" "Všechny kontakty" + "Návrhy" "Já" - "Vyhledávání..." - "Nalezeno více kontaktů než %d." - "Žádné kontakty" - - Nalezeny %d kontakty - Nalezeno %d kontaktu - Nalezeno %d kontaktů - Nalezen 1 kontakt - - "Rychlý kontakt %1$s" "(Žádné jméno)" - "Často volané" - "Často používané" "Zobrazit kontakt" "Kontakty s telefonními čísly" "Kontakty z pracovního profilu" @@ -127,8 +114,6 @@ "E-mail %s" "E-mail" "Ulice" - "Číslo poštovní schránky" - "Čtvrť" "Město" "Stát" "PSČ" @@ -146,103 +131,19 @@ "Chatovat pomocí ICQ" "Chatovat pomocí Jabberu" "Chat" - "smazat" - "Rozbalit nebo sbalit pole jména" - "Rozbalí nebo sbalí pole s fonetickým přepisem jména" "Všechny kontakty" - "Hotovo" - "Zrušit" "Kontakty v účtu %s" "Kontakty ve vlastním zobrazení" "Jeden kontakt" - "Účet k uložení importovaných kontaktů:" - "Importovat ze SIM karty" - "Importovat ze SIM karty ^1^2" - "Importovat ze SIM karty %1$s" - "Importovat ze souboru VCF" - "Zrušit import souboru %s?" - "Zrušit export souboru %s?" - "Import/export vizitky vCard nelze zrušit" - "Neznámá chyba." - "Soubor %s nelze otevřít: %s" - "Nelze spustit nástroj pro export: %s." - "Žádný kontakt nelze exportovat." - "Zakázali jste požadované oprávnění." - "Při exportu došlo k chybě: %s." - "Požadovaný název souboru (%s) je příliš dlouhý." - "Chyba I/O" - "Není k dispozici dostatek paměti. Soubor může být příliš velký." - "Analýza souboru vCard se z neočekávaných důvodů nezdařila." - "Formát není podporován." - "Informace o metadatech daných souborů vCard se nepodařilo shromáždit." - "Jeden nebo více souborů se nepodařilo importovat (%s)." - "Export souboru %s byl dokončen." - "Exportování kontaktů bylo dokončeno." - "Export kontaktů byl dokončen. Klepnutím na oznámení je můžete sdílet." - "Klepnutím můžete sdílet kontakty." - "Export souboru %s byl zrušen." - "Export dat kontaktů" - "Probíhá export dat kontaktů." - "Nepodařilo se získat informace o databázi." - "Není možné exportovat žádné kontakty. Pokud v zařízení opravdu máte uložené kontakty, je možné, že některý poskytovatel datových služeb zakázal jejich export mimo zařízení." - "Editor souboru vCard nebyl správně spuštěn." - "Export se nezdařil" - "Data kontaktů nebyla exportována.\nDůvod: %s" - "Probíhá import: %s" - "Nepodařilo se přečíst údaje vizitky vCard." - "Čtení dat souboru vCard bylo zrušeno" - "Import souboru vCard (%s) byl dokončen" - "Import souboru %s byl zrušen." - "Soubor %s bude za okamžik importován." - "Soubor bude zakrátko importován." - "Požadavek na import souborů vCard byl zamítnut. Zkuste to prosím později." - "Soubor %s bude za okamžik exportován." - "Soubor bude brzy exportován." - "Kontakty budou brzy exportovány." - "Požadavek na export souborů vCard byl zamítnut. Zkuste to prosím později." - "kontakt" - "Načítání souboru vCard do mezipaměti místního dočasného úložiště. Vlastní import bude zahájen v krátké době." - "Soubor vCard se nepodařilo importovat." - "Kontakt přijatý prostřednictvím komunikace NFC" - "Exportovat kontakty?" - "Ukládání do mezipaměti" - "Probíhá import: %s/%s: %s" - "Exportovat do souboru VCF" "Seřadit podle" "Jméno" "Příjmení" "Formát jména" "Nejprve jméno" "Nejprve příjmení" - "Výchozí účet pro nové kontakty" - "Synchronizovat metadata kontaktů" - "Informace o kontaktech" - "Nastavení" - "Sdílet viditelné kontakty" - "Sdílení viditelných kontaktů se nezdařilo." - "Sdílet oblíbené kontakty" - "Sdílet všechny kontakty" - "Kontakty se nepodařilo sdílet." - "Importovat nebo exportovat kontakty" - "Importovat kontakty" - "Tento kontakt nelze sdílet." - "Nejsou dostupné žádné kontakty ke sdílení." - "Hledat" - "Najít kontakty" - "Oblíbené" - "Žádné kontakty." - "Žádné kontakty nejsou viditelné." - "Žádné oblíbené položky" - "Žádné kontakty v položce %s" "Vymazat často kontaktované" - "Vybrat SIM kartu" - "Správa účtů" - "Importovat/Exportovat" - "prostřednictvím zdroje %1$s" - "%1$s prostřednictvím zdroje %2$s" "zastavit vyhledávání" "Vymazat vyhledávání" - "Možnosti zobrazení kontaktů" "Účet" "Vždy používat pro hovory" "Volat pomocí" @@ -250,7 +151,7 @@ "Zadejte poznámku, která se odešle pomocí volání…" "ODESLAT A ZAVOLAT" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Karta %1$s." Karta %1$s. %2$d nepřečtené položky. @@ -258,13 +159,6 @@ Karta %1$s. %2$d nepřečtených položek. Karta %1$s. %2$d nepřečtená položka. - "Verze sestavení" - "Licence open source" - "Podrobnosti o licenci pro software s otevřeným zdrojovým kódem" - "Zásady ochrany soukromí" - "Smluvní podmínky" - "Licence open source" - "Adresu URL se nepodařilo otevřít." "Videohovor" "Sdílet a zavolat" diff --git a/java/com/android/contacts/common/res/values-da/strings.xml b/java/com/android/contacts/common/res/values-da/strings.xml index 965d04a73..fdc72194a 100644 --- a/java/com/android/contacts/common/res/values-da/strings.xml +++ b/java/com/android/contacts/common/res/values-da/strings.xml @@ -18,7 +18,6 @@ "Kopieret tekst" - "Kopier til udklipsholder" "Ring til %s" "Ring hjem" "Ring til mobil" @@ -40,7 +39,6 @@ "Ring til personsøger på arbejdet" "Ring til %s" "Ring til mms" - "%s (ring op)" "Send sms til %s" "Send sms til hjem" "Send sms til mobil" @@ -62,7 +60,6 @@ "Send sms til personsøger på arbejdet" "Send sms til %s" "Send sms til mms" - "%s (send besked)" "Vil du rydde de ofte kontaktede?" "Hvis du gør dette, rydder du listen over personer, som du ofte kontakter, i appene Kontaktpersoner og Opkald. Du vil samtidig tvinge e-mailapps til at lære dine adressepræferencer fra bunden." "Ofte kontaktede personer ryddes…" @@ -70,22 +67,14 @@ "Ikke til stede" "Optaget" "Kontakter" + "Populære forslag" "Andre" "Indeks" "Indeks for arbejde" "Alle kontakter" + "Forslag" "Mig" - "Søger..." - "Der er fundet mere end %d." - "Ingen kontaktpersoner" - - %d blev fundet - %d blev fundet - - "Hurtig kontakt til %1$s" "(Intet navn)" - "Ofte ringet til" - "Ofte kontaktet" "Se kontaktperson" "Alle kontaktpersoner med telefonnumre" "Kontaktpersoner for arbejdsprofil" @@ -125,8 +114,6 @@ "Send e-mail til %s" "Send e-mail" "Gade" - "Postboks" - "Nabolag" "By" "Stat" "Postnummer" @@ -144,103 +131,19 @@ "Chat ved hjælp af ICQ" "Chat ved hjælp af Jabber" "Chat" - "slet" - "Udvid eller skjul navnefelter" - "Udvid eller skjul felter til fonetiske navne" "Alle kontaktpersoner" - "Afslut" - "Annuller" "Kontaktpersoner i %s" "Kontakter i tilpasset visning" "Enkelt kontaktperson" - "Gem importerede kontaktpersoner på:" - "Importér fra SIM-kort" - "Importér fra SIM ^1^2" - "Importér fra SIM %1$s" - "Importér fra .vcf-fil" - "Vil du annullere importen af %s?" - "Vil du annullere eksporten af %s?" - "Import/eksport af vCard kunne ikke annulleres" - "Ukendt fejl." - "\"%s\" kan ikke åbnes: %s." - "Eksportfunktionen kunne ikke startes: \"%s\"" - "Der er ingen kontaktpersoner, der kan eksporteres." - "Du har deaktiveret en påkrævet tilladelse." - "Der opstod en fejl under eksporten: \"%s\"." - "Det krævede filnavn er for langt (\"%s\")." - "I/O-fejl" - "Ikke nok hukommelse. Filen kan være for stor." - "vCard kunne ikke parses af uventede årsager." - "Formatet understøttes ikke." - "Metaoplysninger om de angivne vCard-filer kunne ikke hentes." - "En eller flere filer kunne ikke importeres (%s)." - "%s er eksporteret." - "Kontaktpersoner blev eksporteret." - "Kontaktpersonerne blev eksporteret. Klik på underretningen for at dele kontaktpersonerne." - "Tryk for at dele kontaktpersoner." - "Eksport af %s er annulleret." - "Eksporterer kontaktdata" - "Kontaktoplysningerne eksporteres." - "Databaseoplysningerne kunne ikke hentes." - "Der er ingen kontaktpersoner, der kan eksporteres. Hvis du har kontaktpersoner på din enhed, tillader nogle dataudbydere muligvis ikke, at kontaktpersonerne eksporteres fra enheden." - "Oprettelsen af vCard startede ikke korrekt." - "Eksport ikke mulig" - "Kontaktdataene blev ikke eksporteret.\nÅrsag: \"%s\"" - "Importerer %s" - "Dataene på dette vCard kunne ikke læses" - "Læsning af vCard-data blev annulleret" - "Import af vCard afsluttet %s" - "Import af %s blev annulleret" - "%s importeres om et øjeblik." - "Filen importeres inden længe." - "Anmodningen om import af vCard blev afvist. Prøv igen senere." - "%s eksporteres om et øjeblik." - "Filen eksporteres om et øjeblik." - "Kontaktpersonerne eksporteres om lidt." - "Anmodningen om eksport af vCard blev afvist. Prøv igen senere." - "kontaktperson" - "Cachelagrer vCard-fil(er) til lokalt midlertidigt lager. Den egentlige import starter snart." - "vCard kunne ikke importeres." - "Kontakt via NFC" - "Eksportér kontaktpersoner?" - "Cachelagrer" - "Importerer %s/%s: %s" - "Eksportér til .vcf-fil" "Sortér efter" "Fornavn" "Efternavn" "Navneformat" "Fornavn først" "Efternavn først" - "Standardkonto til nye kontaktpersoner" - "Synkroniser metadata for kontaktpersoner" - "Om Kontaktpersoner" - "Indstillinger" - "Del synlige kontaktpersoner" - "Det lykkedes ikke at dele synlige kontaktpersoner." - "Del foretrukne kontaktpersoner" - "Del alle kontaktpersoner" - "Kontaktpersonerne kunne ikke deles." - "Importér/eksportér kontaktpersoner" - "Importer kontaktpersoner" - "Denne kontaktperson kan ikke deles." - "Der er ingen kontaktpersoner, der kan deles." - "Søg" - "Find kontaktpersoner" - "Foretrukne" - "Der er ingen kontaktpersoner." - "Ingen synlige kontaktpersoner." - "Der er ingen favoritter" - "Ingen kontaktpersoner i %s" "Ryd hyppige" - "Vælg SIM-kort" - "Administrer konti" - "Importér/eksportér" - "via %1$s" - "%1$s via %2$s" "stop søgning" "Ryd søgning" - "Indstillinger for visning af kontaktpersoner" "Konto" "Brug altid ved opkald" "Ring med" @@ -248,19 +151,12 @@ "Indtast en note, som skal sendes ved opkald..." "SEND OG RING" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Fanen %1$s." Fanen %1$s. %2$d ulæst element. Fanen %1$s. %2$d ulæste elementer. - "Build-version" - "Open source-licenser" - "Licensoplysninger til open source-software" - "Privatlivspolitik" - "Servicevilkår" - "Open source-licenser" - "Webadressen kunne ikke åbnes." "Videoopkald" "Del og ring" diff --git a/java/com/android/contacts/common/res/values-de/strings.xml b/java/com/android/contacts/common/res/values-de/strings.xml index 60c5e6806..65d4c5586 100644 --- a/java/com/android/contacts/common/res/values-de/strings.xml +++ b/java/com/android/contacts/common/res/values-de/strings.xml @@ -18,7 +18,6 @@ "Text kopiert" - "In Zwischenablage kopieren" "%s anrufen" "Private Nummer anrufen" "Mobilfunknummer anrufen" @@ -40,7 +39,6 @@ "Pager (geschäftlich) anrufen" "%s anrufen" "MMS anrufen" - "%s (Anruf)" "SMS an %s senden" "SMS an private Nummer senden" "SMS an Mobilfunknummer senden" @@ -62,7 +60,6 @@ "SMS an Pager (geschäftlich) senden" "SMS an %s senden" "SMS an MMS senden" - "%s (Nachricht)" "Liste \"Häufig kontaktiert\" löschen?" "Du löschst die Liste \"Häufig kontaktiert\" in den Apps \"Kontakte\" und \"Telefon\" und bewirkst so ein Zurücksetzen deiner Adresseinstellungen für E-Mail-Apps." "\"Häufig kontaktiert\" wird gelöscht…" @@ -70,22 +67,14 @@ "Abwesend" "Beschäftigt" "Kontakte" + "Top-Vorschläge" "Andere" "Verzeichnis" "Verzeichnis geschäftlicher Kontakte" "Alle Kontakte" + "Vorschläge" "Ich" - "Suche läuft..." - "Mehr als %d Kontakte gefunden" - "Keine Kontakte" - - %d gefunden - 1 gefunden - - "Schnellkontakt für %1$s" "(Kein Name)" - "Häufig angerufen" - "Häufig kontaktiert" "Kontakt ansehen" "Alle Kontakte mit Telefonnummern" "Arbeitsprofilkontakte" @@ -125,14 +114,12 @@ "E-Mail an %s" "E-Mail" "Straße" - "Postfach" - "Stadtteil" "Stadt" "Bundesland" "Postleitzahl" "Land" "Privatadresse ansehen" - "Geschäftsadresse ansehen" + "Arbeitsadresse ansehen" "Adresse ansehen" "%s-Adresse ansehen" "Über AIM chatten" @@ -144,103 +131,19 @@ "Über ICQ chatten" "Über Jabber chatten" "Chat" - "löschen" - "Namensfelder minimieren oder maximieren" - "Felder für phonetische Namen maximieren oder minimieren" "Alle Kontakte" - "Fertig" - "Abbrechen" "Kontakte in %s" "Kontakte in benutzerdef. Ansicht" "Einzelner Kontakt" - "Importierte Kontakte speichern unter:" - "Von SIM-Karte importieren" - "Von SIM ^1^2 importieren" - "Von SIM %1$s importieren" - "Aus VCF-Datei importieren" - "Import von %s abbrechen?" - "Export von %s abbrechen?" - "vCard-Import/-Export nicht abgebrochen" - "Unbekannter Fehler" - "\"%s\" konnte nicht geöffnet werden. Grund: %s." - "Exportprogramm konnte nicht gestartet werden. Grund: %s." - "Es ist kein exportierbarer Kontakt vorhanden." - "Du hast eine erforderliche Berechtigung deaktiviert." - "Beim Export ist ein Fehler aufgetreten: \"%s\"." - "Erforderlicher Dateiname ist zu lang (%s)." - "E/A-Fehler" - "Nicht genügend Speicherplatz. Die Datei ist möglicherweise zu groß." - "Die vCard konnte aus einem unerwarteten Grund nicht geparst werden." - "Das Format wird nicht unterstützt." - "Abrufen der Metadaten aus angegebenen vCards nicht möglich" - "Eine oder mehrere Dateien können nicht importiert werden (%s)." - "Export von %s abgeschlossen" - "Kontakte wurden exportiert" - "Das Exportieren der Kontakte ist abgeschlossen. Klicke auf die Benachrichtigung, um die Kontakte freizugeben." - "Zum Teilen der Kontakte tippen." - "Export von %s abgebrochen" - "Kontaktdaten werden exportiert..." - "Die Kontaktdaten werden gerade exportiert." - "Datenbankinformationen konnten nicht abgerufen werden." - "Es sind keine exportierbaren Kontakte vorhanden. Falls sich Kontakte auf deinem Gerät befinden, ist das Exportieren der Kontakte eventuell durch den Datenanbieter gesperrt." - "Das Programm zum Erstellen der vCard wurde nicht richtig gestartet." - "Export nicht möglich" - "Die Kontaktdaten wurden nicht exportiert.\nGrund: %s" - "%s wird importiert..." - "Lesen der vCard-Daten nicht möglich" - "Lesen von vCard-Daten abgebrochen" - "Import der vCard %s abgeschlossen" - "Import von %s abgebrochen" - "%s wird in Kürze importiert." - "Die Datei wird in Kürze importiert." - "Die vCard-Importanfrage wurde abgelehnt. Bitte versuche es später erneut." - "%s wird in Kürze exportiert." - "Die Datei wird in Kürze exportiert." - "Die Kontakte werden in Kürze exportiert." - "Die vCard-Exportanfrage wurde abgelehnt. Bitte versuche es später erneut." - "Kontakt" - "Caching der vCard(s) in lokalen temporären Speicher wird durchgeführt. Der eigentliche Import beginnt gleich." - "Importieren der vCard nicht möglich" - "Kontakt per NFC erhalten" - "Kontakte exportieren?" - "Caching läuft..." - "Import von %s/%s: %s" - "In VCF-Datei exportieren" "Sortieren nach" "Vorname" "Nachname" "Namensformat" "Vorname zuerst" "Nachname zuerst" - "Standardkonto für neue Kontakte" - "Kontakt-Metadaten synchronisieren" - "Über \"Kontakte\"" - "Einstellungen" - "Sichtbare Kontakte teilen" - "Die sichtbaren Kontakte konnten nicht geteilt werden." - "Lieblingskontakte teilen" - "Alle Kontakte teilen" - "Kontakte konnten nicht geteilt werden." - "Kontakte importieren/exportieren" - "Kontakte importieren" - "Dieser Kontakt kann nicht geteilt werden." - "Keine Kontakte zum Teilen vorhanden." - "Suchen" - "Kontakte suchen" - "Favoriten" - "Keine Kontakte." - "Keine sichtbaren Kontakte" - "Keine Favoriten" - "Keine Kontakte in %s" "\"Häufig kontaktiert\" löschen" - "SIM-Karte auswählen" - "Konten verwalten" - "Importieren/Exportieren" - "über %1$s" - "%1$s über %2$s" "Suche beenden" "Suche zurücksetzen" - "Anzeigeoptionen für Kontakte" "Konto" "Diese SIM für alle Anrufe verwenden" "Anrufen mit" @@ -248,19 +151,12 @@ "Notiz eingeben, die beim Anrufen gesendet wird..." "SENDEN UND ANRUFEN" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Tab \"%1$s\"." Tab \"%1$s\". %2$d ungelesene Elemente. Tab \"%1$s\". %2$d ungelesenes Element. - "Build-Version" - "Open-Source-Lizenzen" - "Lizenzdetails für Open-Source-Software" - "Datenschutzerklärung" - "Nutzungsbedingungen" - "Open-Source-Lizenzen" - "Die URL konnte nicht geöffnet werden." "Videoanruf" "Teilen und anrufen" diff --git a/java/com/android/contacts/common/res/values-el/strings.xml b/java/com/android/contacts/common/res/values-el/strings.xml index 9af3bc55a..655bb3ab1 100644 --- a/java/com/android/contacts/common/res/values-el/strings.xml +++ b/java/com/android/contacts/common/res/values-el/strings.xml @@ -18,7 +18,6 @@ "Το κείμενο αντιγράφηκε" - "Αντιγραφή στο πρόχειρο" "Κλήση %s" "Κλήση οικίας" "Κλήση κινητής συσκευής" @@ -40,7 +39,6 @@ "Κλήση βομβητή εργασίας" "Κλήση %s" "Κλήση MMS" - "%s (Κλήση)" "Αποστολή μηνύματος κειμένου προς %s" "Αποστολή μηνύματος κειμένου προς οικία" "Αποστολή μηνύματος κειμένου προς κινητή συσκευή" @@ -62,7 +60,6 @@ "Αποστολή μηνύματος κειμένου προς βομβητή εργασίας" "Αποστολή μηνύματος προς %s" "Αποστολή μηνύματος κειμένου ως MMS" - "%s (Μήνυμα)" "Διαγραφή ατόμων με συχνή επικοινωνία;" "Θα διαγράψετε τη λίστα συχνών επαφών στις εφαρμογές Επαφές και Τηλέφωνο και θα επιβάλλετε στις εφαρμογές ηλεκτρονικού ταχυδρομείου να μάθουν τις προτιμήσεις διευθύνσεών σας από την αρχή," "Διαγρ. ατόμων με συχνή επικοινωνία…" @@ -70,22 +67,14 @@ "Μη διαθέσιμος" "Απασχολημένος" "Επαφές" + "Κορυφαίες προτάσεις" "Άλλο" "Κατάλογος" "Κατάλογος εργασίας" "Όλες οι επαφές" + "Προτάσεις" "Εγώ" - "Αναζήτηση..." - "Βρέθηκαν περισσότερα από %d." - "Δεν υπάρχουν επαφές" - - Βρέθηκαν %d - Βρέθηκε 1 - - "Γρήγορη επαφή για %1$s" "(Χωρίς όνομα)" - "Συχνές κλήσεις" - "Συχνή επικοινωνία" "Προβολή επαφής" "Όλες οι επαφές με αριθμούς τηλεφώνου" "Επαφές προφίλ εργασίας" @@ -125,8 +114,6 @@ "Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου προς %s" "Μήνυμα ηλεκτρονικού ταχυδρομείου" "Οδός" - "Ταχυδρομική θυρίδα" - "Γειτονιά" "Πόλη" "Πολιτεία" "Ταχυδρομικός κώδικας" @@ -144,103 +131,19 @@ "Συζήτηση μέσω ICQ" "Συζήτηση μέσω Jabber" "Συζήτηση" - "διαγραφή" - "Ανάπτυξη ή σύμπτυξη πεδίων ονομάτων" - "Ανάπτυξη ή σύμπτυξη πεδίων φωνητικού ονόματος" "Όλες οι επαφές" - "Τέλος" - "Ακύρωση" "Επαφές στο %s" "Επαφές σε προσ/νη προβολή" "Μία επαφή" - "Αποθήκευση επαφών που εισήχθησαν σε:" - "Εισαγωγή από κάρτα SIM" - "Εισαγωγή από κάρτα SIM ^1 - ^2" - "Εισαγωγή από κάρτα SIM %1$s" - "Εισαγωγή από αρχείο .vcf" - "Ακύρωση της εισαγωγής του αρχείου %s;" - "Ακύρωση της εξαγωγής του αρχείου %s;" - "Αδύνατη ακύρωση εισαγωγής/εξαγωγής vCard" - "Άγνωστο σφάλμα." - "Δεν ήταν δυνατό το άνοιγμα του αρχείου \"%s\": %s." - "Δεν ήταν δυνατή η έναρξη του προγράμματος εξαγωγής: \"%s\"." - "Δεν υπάρχει επαφή με δυνατότητα εξαγωγής." - "Απενεργοποιήσατε μια απαιτούμενη άδεια." - "Προέκυψε κάποιο σφάλμα κατά την εξαγωγή: \"%s\"." - "Το απαιτούμενο όνομα αρχείου είναι πάρα πολύ μεγάλο (\"%s\")." - "Σφάλμα I/O" - "Δεν υπάρχει αρκετή μνήμη. Το αρχείο ενδέχεται να είναι πάρα πολύ μεγάλο." - "Δεν ήταν δυνατή η ανάλυση της κάρτας vCard λόγω μη αναμενόμενης αιτίας." - "Η μορφή δεν υποστηρίζεται." - "Δεν ήταν δυνατή η συλλογή πληροφοριών μεταδεδομένων των καρτών vCard." - "Δεν ήταν δυνατή η εισαγωγή ενός ή περισσότερων αρχείων (%s)." - "Η εξαγωγή του αρχείου %s ολοκληρώθηκε." - "Ολοκλήρωση εξαγωγής επαφών." - "Ολοκληρώθηκε η εξαγωγή των επαφών. Κάντε κλικ στην ειδοποίηση για να μοιραστείτε επαφές." - "Πατήστε για να μοιραστείτε επαφές." - "Η εξαγωγή του αρχείου %s ακυρώθηκε." - "Εξαγωγή δεδομένων επαφών" - "Γίνεται εξαγωγή των δεδομένων επαφών." - "Δεν ήταν δυνατή η λήψη πληροφοριών βάσης δεδομένων." - "Δεν υπάρχουν επαφές προς εξαγωγή. Αν υπάρχουν επαφές στη συσκευή σας, ορισμένοι πάροχοι δεδομένων ενδέχεται να μην επιτρέψουν την εξαγωγή επαφών από τη συσκευή." - "Η έναρξη της vCard δεν ήταν σωστή." - "Αδυναμία εξαγωγής" - "Δεν έγινε εξαγωγή των δεδομένων επαφής.\nΑιτία: \"%s\"" - "Εισαγωγή %s" - "Αδύνατη η ανάγνωση δεδομένων vCard" - "Ακύρωση ανάγνωσης δεδομένων vCard" - "Η εισαγωγή του αρχείου %s vCard έχει ολοκληρωθεί" - "Η εισαγωγή του αρχείου %s έχει ακυρωθεί" - "Η εισαγωγή του αρχείου %s θα γίνει σύντομα." - "Η εισαγωγή του αρχείου θα γίνει σύντομα." - "Το αίτημα εισαγωγής vCard απορρίφθηκε. Δοκιμάστε ξανά αργότερα." - "Η εξαγωγή του αρχείου %s θα γίνει σύντομα." - "Η εξαγωγή του αρχείου θα γίνει σύντομα." - "Σε λίγο θα ξεκινήσει η εξαγωγή επαφών." - "Το αίτημα εξαγωγής vCard απορρίφθηκε. Δοκιμάστε ξανά αργότερα." - "επαφή" - "Αλλαγή vCard σε τοπικό χώρο προσωρινής αποθήκευσης. Η εισαγωγή θα ξεκινήσει σύντομα." - "Δεν ήταν δυνατή η εισαγωγή κάρτας vCard." - "Λήψη επαφής μέσω ΕΚΠ" - "Εξαγωγή επαφών;" - "Προσωρινή αποθήκευση" - "Εισαγωγή %s/%s: %s" - "Εξαγωγή σε αρχείο .vcf" "Ταξινόμηση κατά" "Όνομα" "Επώνυμο" "Μορφή ονόματος" "Πρώτα το όνομα" "Πρώτα το επώνυμο" - "Προεπιλεγμένος λογαριασμός για νέες επαφές" - "Συγχρονισμός μεταδεδομένων επαφής" - "Σχετικά με τις Επαφές" - "Ρυθμίσεις" - "Κοινοποίηση ορατών επαφών" - "Η κοινοποίηση των ορατών επαφών απέτυχε." - "Κοινοποίηση αγαπημένων επαφών" - "Κοινή χρήση όλων των επαφών" - "Αποτυχία κοινής χρήσης επαφών." - "Εισαγωγή/Εξαγωγή επαφών" - "Εισαγωγή επαφών" - "Δεν είναι δυνατή η κοινή χρήση αυτής της επαφής." - "Δεν υπάρχουν επαφές για κοινοποίηση." - "Αναζήτηση" - "Εύρεση επαφών" - "Αγαπ." - "Δεν υπάρχουν επαφές." - "Δεν υπάρχουν ορατές επαφές." - "Δεν υπάρχουν αγαπημένα" - "Δεν υπάρχουν επαφές στο %s" "Διαγραφή ατόμ. με συχνή επικ." - "Επιλογή κάρτας SIM" - "Διαχείριση λογαριασμών" - "Εισαγωγή/Εξαγωγή" - "μέσω %1$s" - "%1$s μέσω %2$s" "τέλος αναζήτησης" "Διαγραφή αναζητήσεων" - "Επιλογές εμφάνισης επαφών" "Λογαριασμός" "Χρήση πάντα για κλήσεις" "Κλήση με" @@ -248,19 +151,12 @@ "Πληκτρολογήστε μια σημείωση για αποστολή με την κλήση…" "ΑΠΟΣΤΟΛΗ ΚΑΙ ΚΛΗΣΗ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Καρτέλα %1$s." Καρτέλα %1$s. %2$d μη αναγνωσμένα στοιχεία. Καρτέλα %1$s. %2$d μη αναγνωσμένο στοιχείο. - "Έκδοση build" - "Άδειες λογισμικού ανοικτού κώδικα" - "Λεπτομέρειες άδειας λογισμικού ανοιχτού κώδικα" - "Πολιτική απορρήτου" - "Όροι Παροχής Υπηρεσιών" - "Άδειες λογισμικού ανοικτού κώδικα" - "Αποτυχία ανοίγματος url." "Βιντεοκλήση" "Κοινοποίηση και κλήση" diff --git a/java/com/android/contacts/common/res/values-en-rAU/strings.xml b/java/com/android/contacts/common/res/values-en-rAU/strings.xml index 996c6ee18..b6b2a2918 100644 --- a/java/com/android/contacts/common/res/values-en-rAU/strings.xml +++ b/java/com/android/contacts/common/res/values-en-rAU/strings.xml @@ -18,7 +18,6 @@ "Text copied" - "Copy to clipboard" "Call %s" "Call home" "Call mobile" @@ -40,7 +39,6 @@ "Call work pager" "Call %s" "Call MMS" - "%s (Call)" "Text %s" "Text home" "Text mobile" @@ -62,7 +60,6 @@ "Text work pager" "Text %s" "Text MMS" - "%s (Message)" "Clear frequently contacted?" "You\'ll clear the frequently contacted list in the Contacts and Phone apps, and force email apps to learn your addressing preferences from scratch." "Clearing frequently contacted…" @@ -70,22 +67,14 @@ "Away" "Busy" "Contacts" + "Top suggested" "Other" "Directory" "Work directory" "All contacts" + "Suggestions" "Me" - "Searching…" - "More than %d found." - "No contacts" - - %d found - 1 found - - "Quick contact for %1$s" "(No name)" - "Frequently called" - "Frequently contacted" "View contact" "All contacts with phone numbers" "Work profile contacts" @@ -125,8 +114,6 @@ "Email %s" "Email" "Street" - "PO box" - "Neighbourhood" "City" "County" "Postcode" @@ -144,103 +131,19 @@ "Chat using ICQ" "Chat using Jabber" "Chat" - "delete" - "Expand or collapse name fields" - "Expand or collapse phonetic name fields" "All contacts" - "Done" - "Cancel" "Contacts in %s" "Contacts in customised view" "Single contact" - "Save imported contacts to:" - "Import from SIM card" - "Import from SIM ^1 - ^2" - "Import from SIM %1$s" - "Import from .vcf file" - "Cancel import of %s?" - "Cancel export of %s?" - "Couldn\'t cancel vCard import/export" - "Unknown error." - "Couldn\'t open \"%s\": %s." - "Couldn\'t start the exporter: \"%s\"." - "There is no exportable contact." - "You have disabled a required permission." - "An error occurred during export: \"%s\"." - "Required filename is too long (\"%s\")." - "I/O error" - "Not enough memory. The file may be too large." - "Couldn\'t parse vCard for an unexpected reason." - "The format isn\'t supported." - "Couldn\'t collect meta information of given vCard file(s)." - "One or more files couldn\'t be imported (%s)." - "Finished exporting %s." - "Finished exporting contacts." - "Finished exporting contacts. Please click the notification to share contacts." - "Tap to share contacts." - "Exporting %s cancelled." - "Exporting contact data" - "Contact data is being exported." - "Couldn\'t get database information." - "There are no exportable contacts. If you do have contacts on your device, some data providers may not allow the contacts to be exported from the device." - "The vCard composer didn\'t start properly." - "Couldn\'t export" - "The contact data wasn\'t exported.\nReason: \"%s\"" - "Importing %s" - "Couldn\'t read vCard data" - "Reading vCard data cancelled" - "Finished importing vCard %s" - "Importing %s cancelled" - "%s will be imported shortly." - "The file will be imported shortly." - "vCard import request was rejected. Try again later." - "%s will be exported shortly." - "The file will be exported shortly." - "Contacts will be exported shortly." - "vCard export request was rejected. Try again later." - "contact" - "Caching vCard(s) to local temporary storage. The actual import will start soon." - "Couldn\'t import vCard." - "Contact received over NFC" - "Export contacts?" - "Caching" - "Importing %s/%s: %s" - "Export to .vcf file" "Sort by" "First name" "Surname" "Name format" "First name first" "Surname first" - "Default account for new contacts" - "Sync contact metadata" - "About Contacts" - "Settings" - "Share visible contacts" - "Failed to share visible contacts." - "Share favourite contacts" - "Share all contacts" - "Failed to share contacts." - "Import/Export contacts" - "Import contacts" - "This contact cannot be shared." - "There are no contacts to share." - "Search" - "Find contacts" - "Favourites" - "No contacts." - "No visible contacts." - "No favourites" - "No contacts in %s" "Clear frequents" - "Select SIM card" - "Manage accounts" - "Import/export" - "via %1$s" - "%1$s via %2$s" "stop searching" "Clear search" - "Contact display options" "Account" "Always use this for calls" "Call with" @@ -248,19 +151,12 @@ "Type a note to send with call ..." "SEND & CALL" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s tab." %1$s tab. %2$d unread items. %1$s tab. %2$d unread item. - "Build version" - "Open-source licences" - "Licence details for open-source software" - "Privacy Policy" - "Terms of Service" - "Open-source licences" - "Failed to open the URL." "Video call" "Share and call" diff --git a/java/com/android/contacts/common/res/values-en-rGB/strings.xml b/java/com/android/contacts/common/res/values-en-rGB/strings.xml index 996c6ee18..b6b2a2918 100644 --- a/java/com/android/contacts/common/res/values-en-rGB/strings.xml +++ b/java/com/android/contacts/common/res/values-en-rGB/strings.xml @@ -18,7 +18,6 @@ "Text copied" - "Copy to clipboard" "Call %s" "Call home" "Call mobile" @@ -40,7 +39,6 @@ "Call work pager" "Call %s" "Call MMS" - "%s (Call)" "Text %s" "Text home" "Text mobile" @@ -62,7 +60,6 @@ "Text work pager" "Text %s" "Text MMS" - "%s (Message)" "Clear frequently contacted?" "You\'ll clear the frequently contacted list in the Contacts and Phone apps, and force email apps to learn your addressing preferences from scratch." "Clearing frequently contacted…" @@ -70,22 +67,14 @@ "Away" "Busy" "Contacts" + "Top suggested" "Other" "Directory" "Work directory" "All contacts" + "Suggestions" "Me" - "Searching…" - "More than %d found." - "No contacts" - - %d found - 1 found - - "Quick contact for %1$s" "(No name)" - "Frequently called" - "Frequently contacted" "View contact" "All contacts with phone numbers" "Work profile contacts" @@ -125,8 +114,6 @@ "Email %s" "Email" "Street" - "PO box" - "Neighbourhood" "City" "County" "Postcode" @@ -144,103 +131,19 @@ "Chat using ICQ" "Chat using Jabber" "Chat" - "delete" - "Expand or collapse name fields" - "Expand or collapse phonetic name fields" "All contacts" - "Done" - "Cancel" "Contacts in %s" "Contacts in customised view" "Single contact" - "Save imported contacts to:" - "Import from SIM card" - "Import from SIM ^1 - ^2" - "Import from SIM %1$s" - "Import from .vcf file" - "Cancel import of %s?" - "Cancel export of %s?" - "Couldn\'t cancel vCard import/export" - "Unknown error." - "Couldn\'t open \"%s\": %s." - "Couldn\'t start the exporter: \"%s\"." - "There is no exportable contact." - "You have disabled a required permission." - "An error occurred during export: \"%s\"." - "Required filename is too long (\"%s\")." - "I/O error" - "Not enough memory. The file may be too large." - "Couldn\'t parse vCard for an unexpected reason." - "The format isn\'t supported." - "Couldn\'t collect meta information of given vCard file(s)." - "One or more files couldn\'t be imported (%s)." - "Finished exporting %s." - "Finished exporting contacts." - "Finished exporting contacts. Please click the notification to share contacts." - "Tap to share contacts." - "Exporting %s cancelled." - "Exporting contact data" - "Contact data is being exported." - "Couldn\'t get database information." - "There are no exportable contacts. If you do have contacts on your device, some data providers may not allow the contacts to be exported from the device." - "The vCard composer didn\'t start properly." - "Couldn\'t export" - "The contact data wasn\'t exported.\nReason: \"%s\"" - "Importing %s" - "Couldn\'t read vCard data" - "Reading vCard data cancelled" - "Finished importing vCard %s" - "Importing %s cancelled" - "%s will be imported shortly." - "The file will be imported shortly." - "vCard import request was rejected. Try again later." - "%s will be exported shortly." - "The file will be exported shortly." - "Contacts will be exported shortly." - "vCard export request was rejected. Try again later." - "contact" - "Caching vCard(s) to local temporary storage. The actual import will start soon." - "Couldn\'t import vCard." - "Contact received over NFC" - "Export contacts?" - "Caching" - "Importing %s/%s: %s" - "Export to .vcf file" "Sort by" "First name" "Surname" "Name format" "First name first" "Surname first" - "Default account for new contacts" - "Sync contact metadata" - "About Contacts" - "Settings" - "Share visible contacts" - "Failed to share visible contacts." - "Share favourite contacts" - "Share all contacts" - "Failed to share contacts." - "Import/Export contacts" - "Import contacts" - "This contact cannot be shared." - "There are no contacts to share." - "Search" - "Find contacts" - "Favourites" - "No contacts." - "No visible contacts." - "No favourites" - "No contacts in %s" "Clear frequents" - "Select SIM card" - "Manage accounts" - "Import/export" - "via %1$s" - "%1$s via %2$s" "stop searching" "Clear search" - "Contact display options" "Account" "Always use this for calls" "Call with" @@ -248,19 +151,12 @@ "Type a note to send with call ..." "SEND & CALL" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s tab." %1$s tab. %2$d unread items. %1$s tab. %2$d unread item. - "Build version" - "Open-source licences" - "Licence details for open-source software" - "Privacy Policy" - "Terms of Service" - "Open-source licences" - "Failed to open the URL." "Video call" "Share and call" diff --git a/java/com/android/contacts/common/res/values-en-rIN/strings.xml b/java/com/android/contacts/common/res/values-en-rIN/strings.xml index 996c6ee18..b6b2a2918 100644 --- a/java/com/android/contacts/common/res/values-en-rIN/strings.xml +++ b/java/com/android/contacts/common/res/values-en-rIN/strings.xml @@ -18,7 +18,6 @@ "Text copied" - "Copy to clipboard" "Call %s" "Call home" "Call mobile" @@ -40,7 +39,6 @@ "Call work pager" "Call %s" "Call MMS" - "%s (Call)" "Text %s" "Text home" "Text mobile" @@ -62,7 +60,6 @@ "Text work pager" "Text %s" "Text MMS" - "%s (Message)" "Clear frequently contacted?" "You\'ll clear the frequently contacted list in the Contacts and Phone apps, and force email apps to learn your addressing preferences from scratch." "Clearing frequently contacted…" @@ -70,22 +67,14 @@ "Away" "Busy" "Contacts" + "Top suggested" "Other" "Directory" "Work directory" "All contacts" + "Suggestions" "Me" - "Searching…" - "More than %d found." - "No contacts" - - %d found - 1 found - - "Quick contact for %1$s" "(No name)" - "Frequently called" - "Frequently contacted" "View contact" "All contacts with phone numbers" "Work profile contacts" @@ -125,8 +114,6 @@ "Email %s" "Email" "Street" - "PO box" - "Neighbourhood" "City" "County" "Postcode" @@ -144,103 +131,19 @@ "Chat using ICQ" "Chat using Jabber" "Chat" - "delete" - "Expand or collapse name fields" - "Expand or collapse phonetic name fields" "All contacts" - "Done" - "Cancel" "Contacts in %s" "Contacts in customised view" "Single contact" - "Save imported contacts to:" - "Import from SIM card" - "Import from SIM ^1 - ^2" - "Import from SIM %1$s" - "Import from .vcf file" - "Cancel import of %s?" - "Cancel export of %s?" - "Couldn\'t cancel vCard import/export" - "Unknown error." - "Couldn\'t open \"%s\": %s." - "Couldn\'t start the exporter: \"%s\"." - "There is no exportable contact." - "You have disabled a required permission." - "An error occurred during export: \"%s\"." - "Required filename is too long (\"%s\")." - "I/O error" - "Not enough memory. The file may be too large." - "Couldn\'t parse vCard for an unexpected reason." - "The format isn\'t supported." - "Couldn\'t collect meta information of given vCard file(s)." - "One or more files couldn\'t be imported (%s)." - "Finished exporting %s." - "Finished exporting contacts." - "Finished exporting contacts. Please click the notification to share contacts." - "Tap to share contacts." - "Exporting %s cancelled." - "Exporting contact data" - "Contact data is being exported." - "Couldn\'t get database information." - "There are no exportable contacts. If you do have contacts on your device, some data providers may not allow the contacts to be exported from the device." - "The vCard composer didn\'t start properly." - "Couldn\'t export" - "The contact data wasn\'t exported.\nReason: \"%s\"" - "Importing %s" - "Couldn\'t read vCard data" - "Reading vCard data cancelled" - "Finished importing vCard %s" - "Importing %s cancelled" - "%s will be imported shortly." - "The file will be imported shortly." - "vCard import request was rejected. Try again later." - "%s will be exported shortly." - "The file will be exported shortly." - "Contacts will be exported shortly." - "vCard export request was rejected. Try again later." - "contact" - "Caching vCard(s) to local temporary storage. The actual import will start soon." - "Couldn\'t import vCard." - "Contact received over NFC" - "Export contacts?" - "Caching" - "Importing %s/%s: %s" - "Export to .vcf file" "Sort by" "First name" "Surname" "Name format" "First name first" "Surname first" - "Default account for new contacts" - "Sync contact metadata" - "About Contacts" - "Settings" - "Share visible contacts" - "Failed to share visible contacts." - "Share favourite contacts" - "Share all contacts" - "Failed to share contacts." - "Import/Export contacts" - "Import contacts" - "This contact cannot be shared." - "There are no contacts to share." - "Search" - "Find contacts" - "Favourites" - "No contacts." - "No visible contacts." - "No favourites" - "No contacts in %s" "Clear frequents" - "Select SIM card" - "Manage accounts" - "Import/export" - "via %1$s" - "%1$s via %2$s" "stop searching" "Clear search" - "Contact display options" "Account" "Always use this for calls" "Call with" @@ -248,19 +151,12 @@ "Type a note to send with call ..." "SEND & CALL" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s tab." %1$s tab. %2$d unread items. %1$s tab. %2$d unread item. - "Build version" - "Open-source licences" - "Licence details for open-source software" - "Privacy Policy" - "Terms of Service" - "Open-source licences" - "Failed to open the URL." "Video call" "Share and call" diff --git a/java/com/android/contacts/common/res/values-es-rUS/strings.xml b/java/com/android/contacts/common/res/values-es-rUS/strings.xml index acb563cab..947451419 100644 --- a/java/com/android/contacts/common/res/values-es-rUS/strings.xml +++ b/java/com/android/contacts/common/res/values-es-rUS/strings.xml @@ -18,7 +18,6 @@ "Texto copiado" - "Copiar en el portapapeles" "Llamar a %s" "Llamar a casa" "Llamar al móvil" @@ -40,7 +39,6 @@ "Llamar al localizador del trabajo" "Llamar a %s" "Llamar a MMS" - "%s (Llamar)" "Enviar SMS a %s" "Enviar SMS a casa" "Enviar SMS al móvil" @@ -62,7 +60,6 @@ "Enviar SMS al localizador del trabajo" "Enviar SMS a %s" "Enviar SMS a MMS" - "%s (Enviar mensaje)" "¿Borrar contactos frecuentes?" "Borrarás la lista de personas con las que te pones en contacto frecuentemente de las aplicaciones Contactos y Teléfono. Además, tus aplicaciones de correo deberán establecer tus preferencias nuevamente." "Borrando contactos frecuentes…" @@ -70,22 +67,14 @@ "Ausente" "Ocupado" "Contactos" + "Principales lugares sugeridos" "Otros" "Directorio" "Directorio del trabajo" "Todos los contactos" + "Sugerencias" "Yo" - "Buscando..." - "Más de %d encontrados" - "No hay contactos" - - Se encontraron %d - Se encontró 1 - - "Contacto rápido para %1$s" "(Sin nombre)" - "Llamados con frecuencia" - "Contactados con frecuencia" "Ver contacto" "Todos los contactos con número de teléfono" "Contactos del perfil de trabajo" @@ -125,8 +114,6 @@ "Enviar correo a %s" "Enviar correo a" "Calle" - "Apartado postal" - "Barrio" "Ciudad" "Estado" "Código postal" @@ -144,103 +131,19 @@ "Chat mediante ICQ" "Chat mediante Jabber" "Chat" - "eliminar" - "Expandir o contraer campos de nombre" - "Expandir o contraer campos de nombre fonético" "Todos los contactos" - "Finalizado" - "Cancelar" "Contactos en %s" "Contactos en vista personalizada" "Contacto único" - "Guardar los contactos que se importaron en:" - "Importar desde tarjeta SIM" - "Importar desde SIM ^1 (^2)" - "Importar desde SIM %1$s" - "Importar desde archivo .vcf" - "¿Deseas cancelar la importación de %s?" - "¿Deseas cancelar la exportación de %s?" - "No se canceló impor./expor. de vCard." - "Error desconocido" - "No se pudo abrir \"%s\": %s." - "No se pudo iniciar el exportador (\"%s\")." - "No hay contactos para exportar." - "Inhabilitaste un permiso necesario." - "Se produjo un error durante la exportación (\"%s\")." - "El nombre de archivo obligatorio es demasiado largo (\"%s\")." - "Error de E/S" - "Memoria insuficiente (es probable que el archivo sea muy grande)." - "No se pudo analizar el archivo vCard debido a un error inesperado." - "El formato no se admite." - "No se pudieron recopilar los metadatos de los archivos vCard proporcionados." - "No se pudieron importar uno o más archivos (%s)." - "Exportación de %s finalizada" - "Finalizó la exportación de contactos" - "Se completó la exportación de los contactos. Haz clic en la notificación para compartirlos." - "Presiona para compartir contactos." - "Se canceló la exportación de %s" - "Exportando datos de contacto" - "Se están exportando los datos de contacto." - "No se pudo obtener la información de la base de datos." - "No hay contactos exportables. Si tienes contactos en el dispositivo, es posible que algunos proveedores de datos no permitan la exportación de contactos desde el dispositivo." - "El compositor de la vCard no se inició correctamente." - "No se pudo exportar" - "No se exportaron los datos del contacto.\nMotivo: \"%s\"" - "Importando %s" - "No se pudieron leer los datos de vCard" - "Se canceló la lectura de datos de vCard" - "Finalizó la importación de vCard %s" - "Se canceló la importación de %s" - "%s se importará en breve." - "El archivo se importará en breve." - "Se rechazó la solicitud de importación de vCard. Vuelve a intentarlo más tarde." - "%s se exportará en breve." - "El archivo se exportará en breve." - "Los contactos se exportarán en breve." - "Se rechazó la solicitud de exportación de vCard. Vuelve a intentarlo más tarde." - "contactar" - "Almacenando vCard(s) en caché local temporal. La importación comenzará pronto." - "No se pudo importar el archivo de vCard." - "Se recibió el contacto por NFC." - "¿Exportar contactos?" - "Almacenando en caché" - "Importando %s de %s: %s" - "Exportar a archivo .vcf" "Ordenar por" "Nombre" "Apellido" "Formato del nombre" "Nombre primero" "Apellido primero" - "Cuenta predeterminada para los contactos nuevos" - "Sincronizar metadatos de contactos" - "Acerca de los Contactos" - "Configuración" - "Compartir contactos visibles" - "Se produjo un error al compartir los contactos visibles." - "Compartir contactos favoritos" - "Compartir todos los contactos" - "No se pudieron compartir los contactos." - "Importar/exportar contactos" - "Importar contactos" - "No es posible compartir este contacto." - "No hay contactos para compartir." - "Buscar" - "Buscar contactos" - "Favoritos" - "No hay contactos." - "No hay contactos visibles." - "No hay favoritos" - "No hay contactos en %s." "Borrar contactos frecuentes" - "Seleccionar tarjeta SIM" - "Administrar tus cuentas" - "Importar/exportar" - "a través de %1$s" - "%1$s a través de %2$s" "detener la búsqueda" "Borrar la búsqueda" - "Opciones de visualización de contactos" "Cuenta" "Usar siempre para llamadas" "Llamar con" @@ -248,19 +151,12 @@ "Escribe una nota para enviar con la llamada…" "ENVIAR Y LLAMAR" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Pestaña %1$s." Pestaña %1$s. %2$d elementos no leídos. Pestaña %1$s. %2$d elemento no leído. - "Versión de la compilación" - "Licencias de código abierto" - "Detalles de la licencia de software de código abierto" - "Política de privacidad" - "Condiciones del servicio" - "Licencias de código abierto" - "No se pudo abrir la url." "Videollamada" "Compartir y llamar" diff --git a/java/com/android/contacts/common/res/values-es/strings.xml b/java/com/android/contacts/common/res/values-es/strings.xml index def7a447c..ec5dc5f2e 100644 --- a/java/com/android/contacts/common/res/values-es/strings.xml +++ b/java/com/android/contacts/common/res/values-es/strings.xml @@ -18,7 +18,6 @@ "Texto copiado" - "Copiar en el portapapeles" "Llamar a %s" "Llamar a casa" "Llamar al móvil" @@ -40,7 +39,6 @@ "Llamar al busca del trabajo" "Llamar al %s" "Llamar a MMS" - "%s (Llamar)" "Enviar SMS a %s" "Enviar SMS a casa" "Enviar SMS al móvil" @@ -62,7 +60,6 @@ "Enviar SMS al busca del trabajo" "Enviar SMS al %s" "Enviar SMS a MMS" - "%s (Enviar SMS)" "¿Borrar contactos frecuentes?" "Vas a borrar la lista de contactos frecuentes de las aplicaciones Contactos y Teléfono y obligarás a las aplicaciones de correo electrónico a que memoricen tus preferencias de nuevo." "Borrando contactos frecuentes…" @@ -70,22 +67,14 @@ "Ausente" "Ocupado" "Contactos" + "Sugerencias principales" "Otro" "Directorio" "Directorio de trabajo" "Todos los contactos" + "Sugerencias" "Yo" - "Buscando..." - "Se han encontrado más de %d contactos." - "No hay contactos." - - %d encontrados - 1 encontrado - - "Contacto rápido de %1$s" "(Sin nombre)" - "Más llamados" - "Contactos frecuentes" "Ver contacto" "Todos los contactos con número" "Contactos del perfil de trabajo" @@ -125,8 +114,6 @@ "Enviar correo a %s" "Enviar correo" "Calle" - "Apartado postal" - "Vecindario" "Ciudad" "Estado" "Código postal" @@ -144,103 +131,19 @@ "Chatear con ICQ" "Chatear con Jabber" "Chat" - "eliminar" - "Ampliar o contraer campos de nombre" - "Mostrar u ocultar campos de nombre fonéticos" "Todos los contactos" - "Listo" - "Cancelar" "Contactos en %s" "Contactos en vista personalizada" "Contacto único" - "Guardar contactos importados en:" - "Importar contactos de la tarjeta SIM" - "Importar de SIM ^1 - ^2" - "Importar de SIM %1$s" - "Importar de archivo .vcf" - "¿Quieres cancelar la importación de %s?" - "¿Quieres cancelar la exportación de %s?" - "Error al cancelar la importación/exportación de vCard" - "Error desconocido" - "No se ha podido abrir el archivo \"%s\" (%s)." - "No se ha podido iniciar el exportador (\"%s\")." - "No hay contactos que exportar." - "Has inhabilitado un permiso necesario." - "Se ha producido un error durante la exportación (\"%s\")." - "El nombre de archivo obligatorio es demasiado largo (\"%s\")." - "Error de E/S" - "No hay suficiente espacio de memoria (el archivo puede ser demasiado grande)." - "No se ha podido analizar el archivo vCard debido a un error inesperado." - "Formato no admitido" - "No se han podido recuperar los metadatos de los archivos vCard." - "No se ha podido importar uno o más archivos (%s)." - "Exportación de %s finalizada" - "Los contactos se han exportado." - "Los contactos se han exportado; haz clic en la notificación para compartirlos." - "Toca para compartir contactos." - "Se ha cancelado la exportación de %s." - "Exportando datos de contacto..." - "Se están exportando los datos de los contactos." - "No se ha podido obtener información de la base de datos." - "No hay contactos que exportar. Si tienes contactos en el dispositivo, es posible que el proveedor de datos no permita que se exporten los contactos del dispositivo." - "El redactor de vCard no se ha iniciado correctamente." - "Error al exportar" - "No se han exportado los datos de contacto(\nmotivo: \"%s\")." - "Importando %s..." - "Error al leer los datos de vCard" - "Lectura de datos de vCard cancelada" - "Importación de %s de vCard finalizada" - "Se ha cancelado la importación de %s." - "%s se importará en breve." - "El archivo se importará en breve." - "Se ha rechazado la solicitud de importación de vCard. Inténtalo de nuevo más tarde." - "%s se exportará en breve." - "El archivo se exportará en breve." - "Los contactos se van a exportar en breve." - "Se ha rechazado la solicitud de exportación de vCard. Inténtalo de nuevo más tarde." - "contacto" - "Se están almacenando los archivos vCard en la caché. La importación empezará pronto." - "Error al importar el archivo vCard" - "Contacto recibido por NFC" - "¿Exportar contactos?" - "Almacenando en caché..." - "Importando %s de %s: %s" - "Exportar a archivo .vcf" "Ordenar por" "Nombre" "Apellido" "Formato del nombre" "Nombre primero" "Apellido primero" - "Cuenta predeterminada para nuevos contactos" - "Sincronizar metadatos de contactos" - "Información sobre Contactos" - "Ajustes" - "Compartir contactos visibles" - "No ha sido posible compartir los contactos visibles." - "Compartir contactos favoritos" - "Compartir todos los contactos" - "Error al compartir contactos" - "Importar/exportar contactos" - "Importar contactos" - "Este contacto no se puede compartir." - "No hay contactos que compartir." - "Buscar" - "Buscar contactos" - "Favoritos" - "No hay contactos." - "No hay contactos visibles." - "No hay favoritos" - "Ningún contacto en %s" "Borrar frecuentes" - "Seleccionar tarjeta SIM" - "Administrar cuentas" - "Importar/exportar" - "a través de %1$s" - "%1$s a través de %2$s" "dejar de buscar" "Borrar la búsqueda" - "Opciones para mostrar contactos" "Cuenta" "Usar siempre esta para llamadas" "Llamar con" @@ -248,19 +151,12 @@ "Escribe una nota para enviarla con la llamada..." "ENVIAR Y LLAMAR" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Pestaña %1$s." Pestaña %1$s. %2$d elementos no leídos. Pestaña %1$s. %2$d elemento no leído. - "Versión de la compilación" - "Licencias de código abierto" - "Detalles de las licencias de software libre" - "Política de Privacidad" - "Condiciones de Servicio" - "Licencias de código abierto" - "No se ha podido abrir la URL." "Videollamada" "Compartir y llamar" diff --git a/java/com/android/contacts/common/res/values-et/strings.xml b/java/com/android/contacts/common/res/values-et/strings.xml index c80d54214..74c2d1afc 100644 --- a/java/com/android/contacts/common/res/values-et/strings.xml +++ b/java/com/android/contacts/common/res/values-et/strings.xml @@ -18,7 +18,6 @@ "Tekst on kopeeritud" - "Kopeeri lõikelauale" "Helista numbrile %s" "Helista kodutelefoninumbrile" "Helista mobiilinumbrile" @@ -40,7 +39,6 @@ "Helista tööpiiparinumbrile" "Helista numbrile %s" "Helista MMS-i numbrile" - "%s (helistamine)" "Saada sõnum numbrile %s" "Saada sõnum kodutelefoninumbrile" "Saada sõnum mobiilinumbrile" @@ -62,7 +60,6 @@ "Saada sõnum tööpiiparinumbrile" "Saada sõnum numbrile %s" "Saada sõnum MMS-i numbrile" - "%s (sõnum)" "Kas kustutada sagedased kontaktid?" "Kustutate rakendustes Kontaktid ja Telefon sagedaste kontaktide loendi, mistõttu meilirakendused peavad teie adresseerimiseelistused uuesti omandama." "Saged. kontaktide kustutamine ..." @@ -70,22 +67,14 @@ "Eemal" "Hõivatud" "Kontaktid" + "Populaarsed soovitused" "Muu" "Kataloog" "Töökontaktide kataloog" "Kõik kontaktid" + "Soovitused" "Mina" - "Otsimine ..." - "Leitud rohkem kui %d." - "Kontaktid puuduvad" - - Leiti %d - Leiti 1 - - "Kiirkontakt: %1$s" "(Nimi puudub)" - "Sageli valitud üksus" - "Sageli valitud kontaktisikud" "Kuva kontakt" "Kõik telefoninumbritega kontaktid" "Tööprofiili kontaktid" @@ -125,8 +114,6 @@ "Saada meilisõnum aadressile %s" "Meilimine" "Tänav" - "Postkast" - "Naabruskond" "Linn" "Osariik" "Sihtnumber" @@ -144,103 +131,19 @@ "Vestlus ICQ-d kasutades" "Vestlus Jabberit kasutades" "Vestlus" - "kustutamine" - "Nimeväljade laiendamine või ahendamine" - "Foneetiliste nimede väljade laiendamine või ahendamine" "Kõik kontaktid" - "Valmis" - "Tühista" "Konto %s kontaktid" "Kontaktid kohandatud vaates" "Üks kontakt" - "Salvestage imporditud kontaktid kontole:" - "Impordi SIM-kaardilt" - "Importimine SIM-kaardilt ^1^2" - "Importimine SIM-kaardilt %1$s" - "Importimine VCF-failist" - "Kas tühistada faili %s importimine?" - "Kas tühistada faili %s eksportimine?" - "vCardi impordi/ekspordi tühist. ebaõnn." - "Tundmatu viga." - "Faili „%s” ei saa avada: %s." - "Eksportijat ei saa käivitada: „%s”." - "Eksporditavad kontaktid puuduvad." - "Olete nõutud loa keelanud." - "Viga eksportimisel: „%s”." - "Kohustuslik failinimi on liiga pikk („%s”)." - "I/O viga" - "Pole piisavalt mälu. Fail võib olla liiga suur." - "Ootamatul põhjusel vCardi sõelumine ebaõnnestus." - "Vormingut ei toetata." - "vCardi faili(de) metaandmete kogumine ebaõnnestus." - "Vähemalt ühe faili importimine ebaõnnestus (%s)." - "Faili %s eksportimine on lõpetatud." - "Kontaktide eksportimine on lõpetatud." - "Kontaktide eksportimine lõpetati. Kontaktide jagamiseks klõpsake märguandel." - "Puudutage kontaktide jagamiseks." - "Faili %s eksportimine tühistati." - "Kontaktandmete eksportimine" - "Kontaktandmed eksporditakse." - "Andmebaasiteabe hankimine ebaõnnestus." - "Eksporditavaid kontakte pole. Kui teil siiski on seadmes kontakte, ei pruugi mõned andmesidepakkujad kontaktide eksportimist seadmest lubada." - "vCardi helilooja ei käivitunud korralikult." - "Eksport ebaõnnestus" - "Kontaktandmeid ei eksporditud.\nPõhjus: „%s”" - "Importimine: %s" - "vCardi andmete lugemine ebaõnnestus" - "vCardi andmete lugemine tühistati" - "vCardi faili %s importimine lõpetatud" - "Faili %s importimine tühistati" - "Fail %s imporditakse peagi." - "Fail imporditakse peagi." - "vCardi importimistaotlus lükati tagasi. Proovige hiljem uuesti." - "Fail %s eksporditakse peagi." - "Fail eksporditakse peagi." - "Kontaktid eksporditakse peagi." - "vCardi eksportimistaotlus lükati tagasi. Proovige hiljem uuesti." - "kontakt" - "vCardi(de) vahemälustamine kohalikku ajutisse mäluruumi. Tegelik importimine algab peagi." - "vCardi importimine ebaõnnestus." - "Kontakt saadud NFC kaudu" - "Eksportida kontakt?" - "Vahemällu salvestamine" - "Importimine: %s/%s%s" - "Eksportimine VCF-faili" "Sortimisalus" "Eesnimi" "Perekonnanimi" "Nimevorming" "Eesnimi enne" "Perekonnanimi enne" - "Vaikekonto uute kontaktide jaoks" - "Sünkrooni kontakti metaandmed" - "Teave rakenduse Kontaktid kohta" - "Seaded" - "Jaga nähtavaid kontakte" - "Nähtavate kontaktide jagamine ebaõnnestus." - "Jaga lemmikkontakte" - "Jaga kõiki kontakte" - "Kontaktide jagamine ebaõnnestus." - "Kontaktide import/eksport" - "Impordi kontaktid" - "Seda kontakti ei saa jagada." - "Jagamiseks ei ole ühtki kontakti." - "Otsing" - "Otsige kontakte" - "Lemmikud" - "Kontaktid puuduvad." - "Nähtavaid kontakte pole." - "Lemmikuid pole" - "Grupis %s pole kontakte" "Sagedaste kustutamine" - "SIM-kaardi valimine" - "Kontode haldamine" - "Impordi/ekspordi" - "allika %1$s kaudu" - "%1$s allika %2$s kaudu" "otsimise peatamine" "Otsingu kustutamine" - "Kontaktide kuvavalikud" "Konto" "Kasuta helistamiseks alati seda" "Helistamine kontoga" @@ -248,19 +151,12 @@ "Sisestage märkus, mis koos kõnega saata ..." "SAADA JA HELISTA" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Vahekaart %1$s." Vahekaart %1$s. %2$d lugemata üksust. Vahekaart %1$s. %2$d lugemata üksus. - "Järguversioon" - "Avatud lähtekoodi litsentsid" - "Avatud lähtekoodiga tarkvara litsentsi üksikasjad" - "Privaatsuseeskirjad" - "Teenusetingimused" - "Avatud lähtekoodi litsentsid" - "URL-i avamine ebaõnnestus." "Videokõne" "Jagamine ja helistamine" diff --git a/java/com/android/contacts/common/res/values-eu/strings.xml b/java/com/android/contacts/common/res/values-eu/strings.xml index 868d668b5..631aaff38 100644 --- a/java/com/android/contacts/common/res/values-eu/strings.xml +++ b/java/com/android/contacts/common/res/values-eu/strings.xml @@ -18,7 +18,6 @@ "Testua kopiatu da" - "Kopiatu arbelean" "Deitu %s zenbakira" "Deitu etxera" "Deitu mugikorrera" @@ -40,7 +39,6 @@ "Deitu laneko bilagailura" "Deitu %s zenbakira" "Deitu MMS zenbakira" - "%s (deitu)" "Bidali testu-mezua honi: %s" "Bidali testu-mezua etxera" "Bidali testu-mezua mugikorrera" @@ -62,7 +60,6 @@ "Bidali testu-mezua laneko bilagailura" "Bidali testu-mezua honi: %s" "Bidali testu-mezua MMS zenbakira" - "%s (bidali SMS mezua)" "Sarri erabilitako kontaktuak garbitu?" "Kontaktuak eta Telefonoa aplikazioetako sarri erabilitako kontaktuen zerrenda garbituko duzu; beraz, posta elektronikoaren aplikazioek helbideen hobespenak hutsetik ikasi beharko dituzte." "Sarri erabilitako kontaktuak garbitzen…" @@ -70,22 +67,14 @@ "Kanpoan" "Okupatuta" "Kontaktuak" + "Iradokizun garrantzitsuenak" "Beste bat" "Direktorioa" "Laneko kontaktuak" "Kontaktu guztiak" + "Iradokizunak" "Ni" - "Bilatzen…" - "%d baino gehiago aurkitu dira." - "Ez dago kontakturik" - - %d aurkitu dira - 1 aurkitu da - - "Honen kontaktu bizkorra: %1$s" "(Izenik ez)" - "Sarri deitutakoak" - "Sarri kontaktatutakoak" "Ikusi kontaktua" "Telefono-zenbakiak dituzten kontaktu guztiak" "Laneko profileko kontaktuak" @@ -125,8 +114,6 @@ "Bidali mezu elektronikoa %s helbidera" "Bidali mezu elektronikoa" "Kalea" - "Posta-kutxa" - "Auzoa" "Hiria" "Estatua" "Posta-kodea" @@ -144,103 +131,19 @@ "Txateatu ICQ bidez" "Txateatu Jabber bidez" "Txateatu" - "ezabatu" - "Zabaldu edo tolestu izenen eremuak" - "Zabaldu edo tolestu izen fonetikoen eremuak" "Kontaktu guztiak" - "Eginda" - "Utzi" "Kontu honetako kontaktuak: %s" "Ikuspegi pertsonalizatuko kontaktuak" "Kontaktu bakarra" - "Gorde inportatutako kontaktuak hemen:" - "Inportatu SIM txarteletik" - "Inportatu SIM honetatik: ^1 - ^2" - "Inportatu SIM honetatik: %1$s" - "Inportatu .vcf fitxategitik" - "%s fitxategiaren inportazioa utzi?" - "%s fitxategiaren esportazioa utzi?" - "Ezin da vCard inportazioa/esportazioa utzi" - "Errore ezezaguna." - "Ezin izan da ireki \"%s\". Arrazoia: %s." - "Ezin izan da esportatzailea hasi. Arrazoia: \"%s\"." - "Ez dago esporta daitekeen kontakturik." - "Desgaitu egin duzu beharrezko baimena." - "Errore bat gertatu da esportatu bitartean. Arrazoia: \"%s\"." - "Beharrezko fitxategi-izena luzeegia (\"%s\")." - "Sarrera- edo irteera-errorea" - "Ez dago nahikoa memoria. Baliteke fitxategia handiegia izatea." - "Ezin izan da vCard analizatu ustekabeko arrazoiren batengatik." - "Formatua ez da bateragarria." - "Ezin izan da emandako vCard txartelaren fitxategien meta-informazioa bildu." - "Ezin izan da fitxategi bat edo gehiago inportatu (%s)." - "Amaitu da %s esportatzen." - "Esportatu dira kontaktuak." - "Esportatu dira kontaktuak. Haiek partekatzeko, sakatu jakinarazpena." - "Sakatu kontaktuak partekatzeko." - "%s fitxategia esportatzeari utzi zaio." - "Kontaktatzeko datuak esportatzen" - "Kontaktuen datuak esportatzen ari gara." - "Ezin izan da datu-baseko informazioa lortu." - "Ez dago esporta daitekeen kontakturik. Gailuan kontaktuak badituzu, baliteke datu-hornitzaile batzuek kontaktuak gailutik esportatzen ez uztea." - "vCard txartelen idazlea ez da behar bezala hasi." - "Ezin da esportatu" - "Ez dira kontaktuaren datuak esportatu.\nArrazoia: \"%s\"" - "%s inportatzen" - "Ezin izan dira vCard datuak irakurri" - "vCard datuen irakurketa utzi da" - "%s vCard fitxategia inportatzen bukatu da" - "%s fitxategiaren inportazioa utzi da" - "%s fitxategia laster inportatuko da." - "Fitxategia laster inportatuko da." - "vCard fitxategia inportatzeko eskaera ukatu da. Saiatu geroago." - "%s fitxategia laster esportatuko da." - "Laster esportatuko da fitxategia." - "Laster esportatuko dira kontaktuak." - "vCard fitxategia esportatzeko eskaera ukatu da. Saiatu berriro geroago." - "kontaktua" - "vCard-ak aldi baterako biltegi lokalaren cachean gordetzen ari dira. Inportazioa bera laster hasiko da." - "Ezin izan da vCard fitxategia inportatu." - "NFC bidez jasotako kontaktua" - "Kontaktuak esportatu?" - "Cachean gordetzen" - "%s/%s inportatzen: %s" - "Esportatu .vcf fitxategira" "Ordenatzeko irizpidea" "Izena" "Abizena" "Izenaren formatua" "Izena lehenengo" "Abizena lehenengo" - "Kontaktu berriak gordetzeko kontu lehenetsia" - "Sinkronizatu kontaktuen metadatuak" - "Kontaktuak zerbitzuari buruz" - "Ezarpenak" - "Partekatu ikusgai dauden kontaktuak" - "Ezin izan dira partekatu ikusgai dauden kontaktuak." - "Partekatu gogoko kontaktuak" - "Partekatu kontaktu guztiak" - "Ezin izan dira partekatu kontaktuak." - "Inportatu/Esportatu kontaktuak" - "Inportatu kontaktuak" - "Ezin da kontaktua partekatu." - "Ez dago parteka daitekeen kontakturik." - "Bilatu" - "Bilatu kontaktuak" - "Gogokoak" - "Ez dago kontakturik." - "Ez dago ikusgai dagoen kontakturik." - "Ez dago gogokorik" - "Ez dago kontakturik hemen: %s" "Garbitu sarri erabilitakoak" - "Hautatu SIM txartela" - "Kudeatu kontuak" - "Inportatu/Esportatu" - "%1$s bidez" - "%1$s, %2$s bidez" "gelditu bilaketa" "Garbitu bilaketa" - "Kontaktuak bistaratzeko aukerak" "Kontua" "Erabili beti hau deietarako" "Deitu kontu honekin:" @@ -248,19 +151,12 @@ "Idatzi deiarekin batera bidali beharreko oharra…" "BIDALI ETA DEITU" "%1$s/%2$s" - "%1$s%2$s" + "%1$s: %2$s" "%1$s fitxa." %1$s fitxa. Irakurri gabeko %2$d elementu. %1$s fitxa. Irakurri gabeko %2$d elementu. - "Konpilazioaren bertsioa" - "Kode irekiko lizentziak" - "Kode irekiko softwarerako lizentziaren xehetasunak" - "Pribatutasun-gidalerroak" - "Zerbitzu-baldintzak" - "Kode irekiko lizentziak" - "Ezin izan da ireki URLa." "Bideo-deia" "Partekatu eta deitu" diff --git a/java/com/android/contacts/common/res/values-fa/strings.xml b/java/com/android/contacts/common/res/values-fa/strings.xml index dda10647c..b3dd1704f 100644 --- a/java/com/android/contacts/common/res/values-fa/strings.xml +++ b/java/com/android/contacts/common/res/values-fa/strings.xml @@ -18,7 +18,6 @@ "متن کپی شده" - "کپی در بریده‌دان" "تماس با %s" "تماس با منزل" "تماس با تلفن همراه" @@ -40,7 +39,6 @@ "تماس با پی‌جوی محل کار" "تماس با %s" "تماس با فراپیام" - "%s (تماس)" "ارسال پیامک به %s" "ارسال پیامک به تلفن منزل" "ارسال پیامک به تلفن همراه" @@ -62,7 +60,6 @@ "ارسال پیامک به پی‌جوی محل کار" "ارسال پیامک به %s" "ارسال پیامک به خدمات پیام چندرسانه‌ای" - "%s (پیام)" "مکرراً تماس‌گرفته‌ها پاک شود؟" "فهرست افرادی را که مکرر با آن‌ها تماس گرفته‌اید در برنامه‌های «مخاطبین» و «تلفن» پاک خواهید کرد و برنامه‌های رایانامه مجبور می‌شوند که تنظیمات برگزیده آدرس‌دهی شما را از اول یاد بگیرند." "درحال پاک کردن مکرراً تماس‌گرفته…" @@ -70,22 +67,14 @@ "غایب" "مشغول" "مخاطبین" + "پیشنهادهای برتر" "سایر موارد" "فهرست" "فهرست کار" "همه مخاطبین" + "پیشنهادها" "من" - "در حال جستجو…" - "بیش از %d مورد یافت شد." - "مخاطبی موجود نیست" - - %d مورد پیدا شد - %d مورد پیدا شد - - "تماس سریع برای %1$s" "(بدون نام)" - "بیشتر تماس‌ گرفته شده" - "مکرراً تماس‌گرفته" "مشاهده مخاطب" "همه مخاطبین دارای شماره تلفن" "مخاطبین نمایه کاری" @@ -125,8 +114,6 @@ "رایانامه به %s" "رایانامه" "خیابان" - "صندوق پستی" - "محله" "شهر" "ایالت" "کد پستی" @@ -144,103 +131,19 @@ "‏گپ با استفاده از ICQ" "‏گپ با استفاده از Jabber" "گپ" - "حذف" - "بزرگ یا کوچک کردن قسمت‌های نام" - "بزرگ یا کوچک کردن فیلدهای نام آوایی" "همه مخاطبین" - "تمام" - "لغو" "مخاطبین در %s" "مخاطبین در نمای سفارشی" "مخاطب تکی" - "ذخیره مخاطب‌های وارد شده در:" - "وارد کردن از سیم کارت" - "وارد کردن از سیم‌کارت ^1 - ^2" - "وارد کردن از سیم کارت %1$s" - "‏وارد کردن از فایل ‎.vcf" - "وارد کردن %s لغو شود؟" - "صادر کردن به %s لغو شود؟" - "وارد/صادرکردن کارت ویزیت لغو نمی‌شود" - "خطای ناشناس." - "\"%s\" باز نشد: %s." - "صادر کننده راه‌اندازی نشد: \"%s\"." - "هیچ مخاطب قابل صدوری موجود نیست." - "یک مجوز الزامی را غیرفعال کرده‌اید." - "خطایی در هنگام صادر کردن روی داد: \"%s\"" - "نام فایل خیلی طولانی است (\"%s\")." - "خطای ورودی/خروجی" - "حافظه کافی نیست. ممکن است فایل بسیار بزرگ باشد." - "تفسیر کارت ویزیت به دلیل پیش‌بینی نشده‌ای ممکن نیست." - "قالب پشتیبانی نمی‌شود." - "نمی‌توان اطلاعات متای فایل(های) کارت ویزیت داده شده را جمع‌آوری کرد." - "‏نمی‌توان یک یا چند فایل را وارد کرد (%s)." - "صادر کردن %s پایان یافت." - "صادرکردن مخاطبین تمام شد." - "مخاطبین صادر شدند؛ برای اشتراک‌گذاری مخاطبین، روی اعلان کلیک کنید." - "برای اشتراک‌گذاری مخاطبین ضربه بزنید." - "صادر کردن %s لغو شد." - "صدور اطلاعات مخاطب" - "داده‌های مخاطب در حال صادر شدن است." - "نمی‌توان اطلاعات پایگاه داده را دریافت کرد." - "هیچ مخاطب قابل صدوری وجود ندارد. اگر در دستگاهتان مخاطبینی دارید، بعضی از ارائه‌دهندگان داده ممکن است اجازه ندهند مخاطبین را از دستگاه صادر کنید." - "سازنده فایل کارت ویزیت به درستی اجرا نشد." - "صادر نمی‌شود" - "‏داده‎های مخاطب صادر نشد.\nعلت: «%s»" - "وارد کردن %s" - "خواندن داده‌های کارت ویزیت ممکن نیست" - "خواندن داده کارت ویزیت لغو شد" - "وارد کردن کارت ویزیت %s پایان یافت" - "واردکردن %s لغو شد" - "%s به زودی وارد می‌شود." - "فایل پس از مدت کوتاهی وارد می‌شود." - "درخواست وارد کردن کارت ویزیت رد شد. لطفاً بعداً امتحان کنید." - "%s به زودی صادر می‌شود." - "فایل به‌زودی منقضی می‌شود." - "مخاطبین به‌زودی صادر می‌شوند." - "درخواست صدور کارت ویزیت رد شد. لطفاً بعداً امتحان کنید." - "مخاطب" - "در حال ذخیره کارت‌(های) ویزیت در حافظه موقت محلی است. وارد کردن واقعی به زودی آغاز خواهد شد." - "وارد کردن کارت ویزیت انجام نشد." - "‏دریافت مخاطب باNFC" - "مخاطبین صادر شوند؟" - "در حال ذخیره در حافظهٔ پنهان" - "وارد کردن %s%s: %s" - "‏صادر کردن به فایل ‎.vcf" "مرتب‌سازی براساس" "نام" "نام خانوادگی" "قالب نام" "ابتدا نام" "ابتدا نام خانوادگی" - "حساب پیش‌فرض برای مخاطبین جدید" - "همگام‌سازی فراداده مخاطب" - "درباره مخاطبین" - "تنظیمات" - "اشتراک‌گذاری مخاطبین قابل مشاهده" - "مخاطبین قابل مشاهده به اشتراک گذاشته نشدند." - "اشتراک‌گذاری مخاطبین موردعلاقه" - "اشتراک‌گذاری همه مخاطبین" - "مخاطبین به اشتراک گذاشته نشدند." - "وارد کردن/صادر کردن مخاطبین" - "وارد کردن مخاطبین" - "این مخاطب قابل اشتراک‌گذاری نیست." - "مخاطبی برای اشتراک‌گذاری وجود ندارد." - "جستجو" - "پیدا کردن مخاطبین" - "موارد دلخواه" - "مخاطبی موجود نیست." - "مخاطب قابل مشاهده‌ای موجود نیست." - "مورد دلخواهی ندارید" - "هیچ مخاطبی در %s موجود نیست" "پاک کردن مکرراً تماس‌گرفته" - "انتخاب سیم‌کارت" - "مدیریت حساب‌ها" - "وارد کردن/صادر کردن" - "از طریق %1$s" - "%1$s از طریق %2$s" "توقف جستجو" "پاک کردن جستجو" - "گزینه‌های نمایش تماس" "حساب" "همیشه این سیم برای تماس‌ استفاده شود" "تماس با" @@ -248,19 +151,12 @@ "یادداشتی بنویسید که همراه تماس ارسال شود…" "ارسال و تماس" "%1$s / ‏%2$s" - "%1$s%2$s" + "%1$s %2$s" "برگه «%1$s»." برگه «%1$s». %2$d مورد خوانده‌نشده. برگه «%1$s». %2$d مورد خوانده‌نشده. - "نسخه ساخت" - "مجوزهای منبع آزاد" - "جزئیات مجوز برای نرم‌افزار منبع آزاد" - "خط‌مشی رازداری" - "شرایط خدمات" - "مجوزهای منبع آزاد" - "نشانی وب باز نشد." "تماس ویدیویی" "اشتراک‌گذاری و تماس" diff --git a/java/com/android/contacts/common/res/values-fi/strings.xml b/java/com/android/contacts/common/res/values-fi/strings.xml index b8065b2bf..6a2a8bf7e 100644 --- a/java/com/android/contacts/common/res/values-fi/strings.xml +++ b/java/com/android/contacts/common/res/values-fi/strings.xml @@ -18,7 +18,6 @@ "Teksti kopioitu" - "Kopioi leikepöydälle" "Soita: %s" "Soita kotinumeroon" "Soita matkapuhelimeen" @@ -40,7 +39,6 @@ "Soita hakulaitteeseen (työ)" "Soita: %s" "Soita MMS-numeroon" - "%s (soita)" "Lähetä tekstiviesti: %s" "Lähetä tekstiviesti kotinumeroon" "Lähetä tekstiviesti matkapuhelimeen" @@ -62,7 +60,6 @@ "Lähetä tekstiviesti hakulaitteeseen (työ)" "Lähetä tekstiviesti: %s" "Lähetä tekstiviesti MMS-numeroon" - "%s (lähetä viesti)" "Tyhjennetäänkö usein käytetyt?" "Toiminto tyhjentää Yhteystiedot- ja Puhelin-sovellusten usein käytettyjen kontaktien luettelon. Lisäksi sähköpostisovellukset pakotetaan opettelemaan osoiteasetuksesi uudestaan." "Tyhjennetään usein käytetyt..." @@ -70,22 +67,14 @@ "Poissa" "Varattu" "Yhteystiedot" + "Kiinnostavimmat ehdotukset" "Muu" "Osoitekirja" "Työhakemisto" "Kaikki yhteystiedot" + "Ehdotukset" "Minä" - "Haetaan…" - "Löytyi yli %d yhteystietoa." - "Ei kontakteja" - - %d löytyi - 1 löytyi - - "Pikayhteys henkilöön %1$s" "(Ei nimeä)" - "Soitettu usein" - "Usein käytetyt" "Näytä yhteystieto" "Kaikki kontaktit, joilla on puhelinnumero" "Työprofiilin yhteystiedot" @@ -125,8 +114,6 @@ "Lähetä sähköpostia osoitteeseen %s" "Lähetä sähköpostia" "Katu" - "Postilokero" - "Kaupunginosa" "Kaupunki" "Osavaltio/alue" "Postinumero" @@ -144,103 +131,19 @@ "Keskustele ICQ:n avulla" "Keskustele Jabberin avulla" "Keskustelu" - "poista" - "Laajenna tai tiivistä nimikentät" - "Laajenna tai tiivistä foneettiset nimikentät" "Yhteystiedot" - "Valmis" - "Peruuta" "Yhteystiedot tilissä %s" "Muokatun näkymän yhteystiedot" "Yksi yhteystieto" - "Tallenna tuodut yhteystiedot kohteeseen" - "Tuo SIM-kortilta" - "Tuo SIM-kortilta ^1 - ^2" - "Tuo SIM-kortilta %1$s" - "Tuo .vcf-tiedostosta" - "Peruutetaanko kohteen %s tuonti?" - "Peruutetaanko kohteen %s vienti?" - "vCardin tuonnin/viennin peruutus epäonn." - "Tuntematon virhe." - "Tiedostoa %s ei voi avata: %s." - "Vientiohjelman käynnistys epäonnistui: %s" - "Ei vietäviä yhteystietoja." - "Olet poistanut käytöstä tarvittavan käyttöoikeuden." - "Virhe viennin aikana: %s." - "Tarvittava tiedostonimi on liian pitkä (%s)" - "I/O-virhe" - "Muisti ei riitä. Tiedosto voi olla liian suuri." - "vCardia ei voi jäsentää odottamattomasta syystä." - "Muotoa ei tueta." - "Annettujen vCard-tiedostojen sisällönkuvaustietojen noutaminen epäonnistui." - "Ainakin yhden tiedoston tuominen epäonnistui (%s)." - "Kohde %s on viety." - "Yhteystiedot on viety." - "Yhteystiedot vietiin. Jaa yhteystiedot klikkaamalla ilmoitusta." - "Jaa yhteystiedot napauttamalla." - "Kohteen %s vienti peruutettiin." - "Viedään yhteystietoja" - "Yhteystietoja viedään." - "Tietokannan tietojen hakeminen epäonnistui." - "Vietäviä yhteystietoja ei ole. Jos laitteessasi on yhteystietoja, tietojen tarjoaja on saattanut estää niiden viemisen puhelimesta." - "vCard-luonti ei käynnistynyt oikein." - "Vieminen epäonnistui" - "Yhteystietoja ei viety.\nSyy: %s" - "Tuodaan kohdetta %s" - "vCard-tietojen lukeminen epäonnistui" - "vCard-tietojen lukeminen peruutettiin" - "vCard %s on tuotu" - "Kohteen %s tuonti peruutettiin" - "%s tuodaan pian." - "Tiedosto tuodaan pian." - "vCard-tuontipyyntö hylättiin. Yritä myöhemmin uudelleen." - "%s viedään pian." - "Tiedosto viedään pian." - "Yhteystiedot viedään hetken kuluttua." - "vCard-vientipyyntö hylättiin. Yritä myöhemmin uudelleen." - "yhteystieto" - "Lisätään vCard-tietojen välimuistiversiot paikalliseen väliaikaistallennustilaan. Tuonti alkaa pian." - "vCard-tietojen tuominen epäonnistui." - "Yht. saatu (NFC)" - "Viedäänkö yhteystietoja?" - "Vie välimuistiin" - "Tuodaan %s/%s: %s" - "Vie .vcf-tiedostoon" "Lajitteluperuste" "Etunimi" "Sukunimi" "Nimen muoto" "Etunimi ensin" "Sukunimi ensin" - "Uusien yhteystietojen oletustili" - "Synkronoi yhteystietojen kuvaustiedot" - "Tietoja Yhteystiedoista" - "Asetukset" - "Jaa näkyvät yhteystiedot" - "Näkyvien yhteystietojen jakaminen epäonnistui." - "Jaa suosikkiyhteystiedot" - "Jaa kaikki yhteystiedot" - "Yhteystietojen jakaminen epäonnistui." - "Tuo/vie yhteystietoja" - "Tuo yhteystietoja" - "Yhteystieto ei jaettavissa" - "Jaettavia yhteystietoja ei ole." - "Haku" - "Etsi yhteystietoja" - "Suosikit" - "Ei yhteystietoja." - "Ei näkyviä yhteystietoja." - "Ei suosikkeja" - "Ei yhteystietoja ryhmässä %s" "Tyhjennä usein käytetyt" - "Valitse SIM-kortti" - "Hallinnoi tilejä" - "Tuo/vie" - "lähteestä %1$s" - "%1$s lähteestä %2$s" "lopeta hakeminen" "Tyhjennä haku" - "Yhteystietojen näyttöasetukset" "Tili" "Käytä kaikille puheluille" "Valitse puhelinoperaattori:" @@ -248,19 +151,12 @@ "Kirjoita muistiinpano lähetettäväksi puhelun kanssa…" "LÄHETÄ JA SOITA" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s-välilehti." %1$s-välilehti. %2$d lukematonta kohdetta. %1$s-välilehti. %2$d lukematon kohde. - "Koontiversio" - "Avoimen lähdekoodin käyttöluvat" - "Avoimen lähdekoodin ohjelmiston käyttöluvan tiedot" - "Tietosuojakäytäntö" - "Käyttöehdot" - "Avoimen lähdekoodin käyttöluvat" - "URL-osoitteen avaus epäonnistui." "Videopuhelu" "Jaa ja soita" diff --git a/java/com/android/contacts/common/res/values-fr-rCA/strings.xml b/java/com/android/contacts/common/res/values-fr-rCA/strings.xml index 82f549292..63a0917e0 100644 --- a/java/com/android/contacts/common/res/values-fr-rCA/strings.xml +++ b/java/com/android/contacts/common/res/values-fr-rCA/strings.xml @@ -18,7 +18,6 @@ "Texte copié." - "Copier dans le presse-papiers" "Appeler le %s" "Appeler le numéro de téléphone du domicile" "Appeler le numéro de téléphone mobile" @@ -40,7 +39,6 @@ "Appeler le téléavertisseur professionnel" "Appeler le %s" "Appeler le numéro de téléphone MMS" - "%s (Appel)" "Envoyer un SMS au %s" "Envoyer un SMS au numéro de téléphone du domicile" "Envoyer un SMS au numéro de téléphone mobile" @@ -62,7 +60,6 @@ "Envoyer un SMS au téléavertisseur professionnel" "Envoyer un SMS au %s" "Envoyer un SMS au numéro de téléph MMS" - "%s (Message)" "Effacer les contacts fréquents?" "Cette opération efface la liste des personnes avec qui vous communiquez le plus souvent dans les applications Contacts et Téléphone, et forcera les applications de courriel à mémoriser de nouveau les adresses que vous utilisez le plus." "Suppression des contacts fréquents…" @@ -70,22 +67,14 @@ "Absent" "Occupé(e)" "Contacts" + "Meilleures suggestions" "Autre" "Répertoire" "Annuaire professionnel" "Tous les contacts" + "Suggestions" "Moi" - "Recherche en cours…" - "Plus de %d contacts ont été trouvés." - "Aucun contact" - - %d contact trouvé - %d contacts trouvés - - "Lien rapide vers %1$s" "(Sans nom)" - "Appels fréquents" - "Contacts fréquents" "Afficher le contact" "Tous les contacts disposant d\'un numéro de téléphone" "Contacts du profil professionnel" @@ -125,8 +114,6 @@ "Envoyer un courriel à %s" "Envoyer un courriel" "Rue" - "Case postale" - "Quartier" "Ville" "État/province" "Code postal" @@ -144,103 +131,19 @@ "Clavarder via ICQ" "Clavarder via Jabber" "Clavarder" - "supprimer" - "Développer ou réduire les champs de nom" - "Développer ou réduire les champs de noms phonétiques" "Tous les contacts" - "Terminé" - "Annuler" "Contacts du compte \"%s\"" "Contacts en affichage personnalisé" "Contact" - "Enregistrer les contacts importés ici :" - "Importer depuis la carte SIM" - "Importer de la carte SIM ^1 - ^2" - "Importer de la carte SIM %1$s" - "Importer d\'un fichier .vcf" - "Annuler l\'importation du fichier %s?" - "Annuler l\'exportation du fichier %s?" - "Impossible annuler import./export. vCard" - "Erreur inconnue." - "Impossible d\'ouvrir le fichier « %s » : %s." - "Impossible de démarrer le programme d\'exportation pour la raison suivante : %s." - "Aucun contact ne peut être exporté." - "Vous avez désactivé une autorisation obligatoire." - "Une erreur s\'est produite lors de l\'exportation : %s." - "Le nom de fichier requis est trop long (\"%s\")." - "Erreur d\'E/S." - "Mémoire insuffisante. Le fichier est peut-être trop volumineux." - "Impossible d\'analyser le fichier vCard pour une raison inattendue." - "Le format n\'est pas compatible." - "Impossible de collecter des métadonnées contenues dans le ou les fichiers vCard." - "Impossible d\'importer un ou plusieurs fichiers (%s)." - "Exportation du fichier %s terminée" - "Les contacts ont été exportés" - "Les contacts ont été exportés. Cliquez sur la notification pour les partager." - "Touchez ici pour partager des contacts." - "Exportation du fichier %s annulée" - "Exportation des données des contacts en cours" - "Les données des contacts sont en cours d\'exportation." - "Impossible d\'obtenir les informations concernant la base de données." - "Aucun contact ne peut être exporté. Si des contacts sont enregistrés sur votre appareil, il est possible qu\'un fournisseur de données n\'autorise pas l\'exportation de contacts à partir de l\'appareil." - "Le système de composition vCard n\'a pas démarré correctement." - "Échec exportation" - "Les données du contact n\'ont pas été exportées.\nMotif : %s." - "Importation (%s)" - "Impossible de lire les données vCard" - "Lecture des données vCard annulée" - "Le fichier vCard %s a bien été importé" - "Importation du fichier %s annulée" - "Le fichier %s va bientôt être importé." - "Le fichier va bientôt être importé." - "La demande d\'importation du fichier vCard a été rejetée. Veuillez réessayer plus tard." - "Le fichier %s va bientôt être exporté." - "Le fichier sera bientôt exporté." - "Les contacts seront exportés sous peu." - "La demande d\'exportation du fichier vCard a été rejetée. Veuillez réessayer plus tard." - "contact" - "Mise en cache des fichiers vCard dans l\'espace de stockage temporaire local. L\'importation va bientôt démarrer." - "Impossible d\'importer le fichier vCard." - "Contact reçu par NFC" - "Exporter les contacts?" - "Mise en cache…" - "Importation de %s/%s : %s" - "Exporter en format .vcf" "Trier par" "Prénom" "Nom de famille" "Format de nom" "Prénom en premier" "Nom de famille en premier" - "Compte par défaut pour les nouveaux contacts" - "Synchroniser les métadonnées des contacts" - "À propos de Contacts" - "Paramètres" - "Partager les contacts visibles" - "Échec du partage des contacts visibles." - "Partager les contacts favoris" - "Partager tous les contacts" - "Impossible de partager les contacts." - "Importer/exporter des contacts" - "Importer des contacts" - "Impossible de partager ce contact." - "Il n\'y a aucun contact à partager." - "Rechercher" - "Rechercher des contacts" - "Favoris" - "Aucun contact." - "Aucun contact visible" - "Aucun favori" - "Aucun contact dans %s" "Effacer les contacts fréquents" - "Sélectionner une carte SIM" - "Gérer les comptes" - "Importer/exporter" - "par %1$s" - "%1$s par %2$s" "arrêter la recherche" "Effacer les termes de recherche" - "Options d\'affichage des contacts" "Compte" "Toujours l\'utiliser pour les appels" "Appeler avec" @@ -248,19 +151,12 @@ "Tapez une note à envoyer avec l\'appel..." "ENVOYER ET APPELER" "%1$s/%2$s" - "%1$s%2$s" + "%1$s : %2$s" "Onglet %1$s." Onglet %1$s. %2$d élément non lu. Onglet %1$s. %2$d éléments non lus. - "Version" - "Licences de logiciels libres" - "Détails des licences de logiciels libres" - "Politique de confidentialité" - "Modalités" - "Licences de logiciels libres" - "Échec de l\'ouverture de l\'URL." "Appel vidéo" "Partager et appeler" diff --git a/java/com/android/contacts/common/res/values-fr/strings.xml b/java/com/android/contacts/common/res/values-fr/strings.xml index 474d721dc..a3955bba3 100644 --- a/java/com/android/contacts/common/res/values-fr/strings.xml +++ b/java/com/android/contacts/common/res/values-fr/strings.xml @@ -18,7 +18,6 @@ "Texte copié" - "Copier dans le presse-papiers" "Appeler le %s" "Appeler le numéro de téléphone du domicile" "Appeler le numéro de téléphone mobile" @@ -40,7 +39,6 @@ "Appeler le téléavertisseur professionnel" "Appeler le %s" "Appeler le numéro de téléphone MMS" - "%s (appeler)" "Envoyer un SMS au %s" "Envoyer un SMS au numéro de téléphone du domicile" "Envoyer un SMS au numéro de téléphone mobile" @@ -62,7 +60,6 @@ "Envoyer un SMS au téléavertisseur professionnel" "Envoyer un SMS au %s" "Envoyer un SMS au numéro de téléphone MMS" - "%s (envoyer un SMS)" "Effacer les contacts fréquents ?" "Cette opération efface la liste des personnes que vous contactez le plus souvent dans les applications Contacts et Téléphone, et entraîne une réinitialisation des adresses mémorisées comme celles que vous utilisez le plus fréquemment dans vos applications de messagerie électronique." "Suppression des contacts fréquents…" @@ -70,22 +67,14 @@ "Absent" "Occupé" "Contacts" + "Principaux dossiers recommandés" "Autre" "Répertoire" "Contacts professionnels" "Tous les contacts" + "Suggestions" "Moi" - "Recherche..." - "Plus de %d contacts ont été trouvés." - "Aucun contact" - - %d contact trouvé. - %d contacts trouvés. - - "Lien rapide vers %1$s" "(Sans nom)" - "Appels fréquents" - "Contacts fréquents" "Afficher le contact" "Tous les contacts disposant d\'un numéro de téléphone" "Contacts du profil professionnel" @@ -125,8 +114,6 @@ "Envoyer un e-mail à %s" "Envoyer un e-mail" "Rue" - "Boîte postale" - "Quartier" "Ville" "État" "Code postal" @@ -144,103 +131,19 @@ "Chatter via ICQ" "Chatter via Jabber" "Chat" - "supprimer" - "Développer ou réduire les champs de nom" - "Développer ou réduire les champs de nom phonétique" "Tous les contacts" - "OK" - "Annuler" "Contacts du compte \"%s\"" "Contacts avec affichage perso." "Contact" - "Enregistrer les contacts importés sur :" - "Importer depuis la carte SIM" - "Importer depuis la carte SIM ^1 (^2)" - "Importer depuis la carte SIM %1$s" - "Importer depuis fichier .vcf" - "Annuler l\'importation du fichier %s ?" - "Annuler l\'exportation du fichier %s ?" - "Impossible annuler import./export. vCard" - "Erreur inconnue." - "Impossible d\'ouvrir le fichier %s pour la raison suivante : %s." - "Impossible de démarrer le programme d\'exportation pour la raison suivante : %s." - "Aucun contact ne peut être exporté." - "Vous avez désactivé une autorisation nécessaire." - "Une erreur s\'est produite lors de l\'exportation : %s." - "Le nom de fichier requis est trop long (\"%s\")." - "Erreur d\'E/S." - "Mémoire insuffisante. Le fichier est peut-être trop volumineux." - "Impossible d\'analyser le fichier vCard pour une raison inattendue." - "Le format n\'est pas compatible." - "Impossible de collecter des métadonnées contenues dans le ou les fichiers vCard." - "Impossible d\'importer un ou plusieurs fichiers (%s)." - "Exportation du fichier %s terminée" - "Les contacts ont bien été exportés" - "Les contacts ont bien été exportés. Cliquez sur la notification pour les partager." - "Appuyez pour partager les contacts." - "Exportation du fichier %s annulée" - "Exportation des données des contacts" - "Les données de contact sont en cours d\'exportation." - "Impossible d\'obtenir les informations concernant la base de données." - "Aucun contact ne peut être exporté. Si des contacts sont enregistrés sur votre appareil, il est possible que votre fournisseur de données n\'autorise pas leur exportation." - "Le système de composition vCard n\'a pas démarré correctement." - "Échec exportation" - "Les données du contact n\'ont pas été exportées.\nMotif : %s." - "Importation (%s)" - "Impossible de lire les données vCard" - "Lecture des données vCard annulée" - "Le fichier vCard %s a bien été importé" - "Importation du fichier %s annulée" - "Le fichier %s va bientôt être importé." - "Le fichier va bientôt être importé." - "La demande d\'importation du fichier vCard a été rejetée. Veuillez réessayer ultérieurement." - "Le fichier %s va bientôt être exporté." - "Le fichier va bientôt être exporté." - "Les contacts seront bientôt exportés." - "La demande d\'exportation du fichier vCard a été rejetée. Veuillez réessayer ultérieurement." - "contact" - "Mise en cache des fichiers vCard dans l\'espace de stockage temporaire local. L\'importation va bientôt démarrer." - "Impossible d\'importer le fichier vCard." - "Contact reçu via NFC" - "Exporter les contacts ?" - "Mise en cache" - "Importation %s sur %s (%s)" - "Exporter dans fichier .vcf" "Trier par" "Prénom" "Nom" "Format du nom" "Prénom en premier" "Nom en premier" - "Compte par défaut pour les nouveaux contacts" - "Synchroniser les métadonnées des contacts" - "À propos de Contacts" - "Paramètres" - "Partager les contacts visibles" - "Échec du partage des contacts visibles." - "Partager les contacts favoris" - "Partager tous les contacts" - "Échec du partage des contacts." - "Importer/Exporter des contacts" - "Importer des contacts" - "Impossible de partager ce contact." - "Aucun contact à partager" - "Rechercher" - "Rechercher des contacts" - "Favoris" - "Aucun contact" - "Aucun contact visible" - "Aucun favori" - "Aucun contact dans %s" "Effacer les contacts fréquents" - "Sélectionner une carte SIM" - "Gérer les comptes" - "Importer/Exporter" - "via %1$s" - "%1$s via %2$s" "arrêter la recherche" "Effacer la recherche" - "Options d\'affichage des contacts" "Compte" "Toujours l\'utiliser pour les appels" "Appeler avec" @@ -248,19 +151,12 @@ "Saisissez une note pour accompagner l\'appel..." "ENVOYER ET APPELER" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Onglet %1$s." Onglet %1$s. %2$d élément non lu. Onglet %1$s. %2$d éléments non lus. - "Version de build" - "Licences Open Source" - "Informations sur les licences des logiciels Open Source" - "Règles de confidentialité" - "Conditions d\'utilisation" - "Licences Open Source" - "Impossible d\'ouvrir l\'URL." "Appel vidéo" "Partager et appeler" diff --git a/java/com/android/contacts/common/res/values-gl/strings.xml b/java/com/android/contacts/common/res/values-gl/strings.xml index 4a3262a2b..a558558ea 100644 --- a/java/com/android/contacts/common/res/values-gl/strings.xml +++ b/java/com/android/contacts/common/res/values-gl/strings.xml @@ -18,7 +18,6 @@ "Texto copiado" - "Copiar no portapapeis" "Chamar ao %s" "Chama á casa" "Chamar ao móbil" @@ -40,7 +39,6 @@ "Chamar ao buscapersoas do traballo" "Chamar a %s" "Chamar ao número de teléfono de MMS" - "%s (chamar)" "Enviar unha mensaxe a %s" "Enviar unha mensaxe á casa" "Enviar unha mensaxe ao teléfono móbil" @@ -62,7 +60,6 @@ "Enviar unha mensaxe ao buscapersoas do traballo" "Enviar unha mensaxe a %s" "Enviar unha mensaxe ao teléfono da MMS" - "%s (enviar mensaxe)" "Borrar contactados con frecuencia?" "Borra a lista de persoas coas que contactaches frecuentemente das aplicacións Contactos e Teléfono, e obriga ás aplicacións de correo electrónico a que memoricen as túas preferencias de enderezos desde cero." "Borrando contactados frecuencia..." @@ -70,22 +67,14 @@ "Ausente" "Ocupado" "Contactos" + "Suxestións destacadas" "Outro" "Directorio" "Directorio de traballo" "Todos os contactos" + "Suxestións" "Eu" - "Buscando..." - "Encontráronse máis de %d contactos." - "Non hai contactos" - - %d contactos encontrados - 1 contacto encontrado - - "Contacto rápido para %1$s" "(Sen nome)" - "Chamados frecuentemente" - "Contactos frecuentes" "Ver contacto" "Todos os contactos con números de teléfono" "Contactos do perfil de traballo" @@ -96,9 +85,9 @@ "Nome" "Nome" "Apelidos" - "Tratamento do nome" + "Forma de tratamento" "Segundo nome" - "Información profesional do nome" + "Título académico ou profesional" "Nome fonético" "Nome fonético" "Segundo nome fonético" @@ -125,8 +114,6 @@ "Enviar correo electrónico a %s" "Enviar correo electrónico" "Rúa" - "Apartado de correos" - "Barrio" "Cidade" "Estado" "Código postal" @@ -144,103 +131,19 @@ "Chatear con ICQ" "Chatear con Jabber" "Chatear" - "eliminar" - "Amplía ou contrae os campos do nome" - "Amplía ou reduce campos de nome fonético" "Todos os contactos" - "Feito" - "Cancelar" "Contactos en %s" "Contactos na vista personalizada" "Un só contacto" - "Gardar contactos importados en:" - "Importar da tarxeta SIM" - "Importar da SIM ^1 - ^2" - "Importar da SIM %1$s" - "Importar de ficheiro .vcf" - "Cancelar importación de %s?" - "Cancelar exportación de %s?" - "Imposible cancelar import./export. vCard" - "Erro descoñecido" - "Non se puido abrir \"%s\": %s." - "Non se puido iniciar o exportador: \"%s\"." - "Non hai ningún contacto exportable." - "Desactivaches un permiso necesario." - "Produciuse un erro durante a exportación: \"%s\"." - "O nome do ficheiro necesario é demasiado longo (\"%s\")." - "Erro de E/S" - "Non hai memoria suficiente. É posible que o ficheiro sexa demasiado grande." - "Non se puido analizar o vCard debido a un motivo inesperado." - "O formato non é compatible." - "Non se puido recoller a información meta de determinados ficheiros vCard." - "Non se puideron importar un ou máis ficheiros (%s)." - "Finalizouse a exportación de %s." - "Finalizou a exportación dos contactos." - "Finalizou a exportación dos contactos. Fai clic na notificación para compartilos." - "Toca para compartir os contactos." - "Cancelouse a exportación de %s." - "Exportando datos de contacto" - "Estanse exportando os datos dos contactos." - "Non se puido obter información da base de datos." - "Non hai ningún contacto exportable. Se tes contactos no teu dispositivo, é posible que algúns provedores de datos non permitan exportalos desde este dispositivo." - "O redactor de vCard non se iniciou correctamente." - "Imposible exportar" - "Non se exportaron os datos dos contactos.\n Motivo: \"%s\"" - "Importando %s" - "Non se puideron ler os datos de vCard" - "Lectura dos datos de vCard cancelada" - "Acabouse de importar o vCard %s" - "Importación de %s cancelada" - "%s importarase en breve." - "O ficheiro importarase en breve." - "Rexeitouse a solicitude de importación de vCard. Téntao de novo máis tarde." - "%s exportarase en breve." - "O ficheiro exportarase en breve." - "Exportaranse os contactos en breve." - "Rexeitouse a solicitude de exportación do vCard. Téntao de novo máis tarde." - "contacto" - "Almacenando vCard na memoria caché do almacenamento temporal local. A importación real iniciarase en breve." - "Non se puido importar o vCard." - "Contacto por NFC" - "Exportar contactos?" - "Almacenando na caché" - "Importando %s/%s: %s" - "Exportar a ficheiro .vcf" "Ordenar por" "Nome" "Apelidos" "Formato do nome" "Primeiro o nome" "Primeiro os apelidos" - "Conta predeterminada para novos contactos" - "Sincronizar metadatos de contacto" - "Información sobre Contactos" - "Configuración" - "Compartir contactos visibles" - "Produciuse un erro ao compartir os contactos visibles." - "Compartir contactos favoritos" - "Compartir todos os contactos" - "Erro ao compartir os contactos." - "Importar/exportar contactos" - "Importar contactos" - "Non se pode compartir este contacto." - "Non hai contactos para compartir." - "Buscar" - "Buscar contactos" - "Favoritos" - "Non hai contactos." - "Ningún contacto visible" - "Sen favoritos" - "Ningún contacto en %s" "Borrar frecuentes" - "Seleccionar tarxeta SIM" - "Xestionar contas" - "Importar/exportar" - "a través de %1$s" - "%1$s a través de %2$s" "detén a busca" "Borrar busca" - "Opcións de visualización de contactos" "Conta" "Usar sempre para as chamadas" "Chamar con" @@ -248,19 +151,12 @@ "Escribe unha nota para enviala coa chamada…" "ENVIAR E CHAMAR" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Pestana %1$s." Pestana %1$s. %2$d elementos non lidos. Pestana %1$s. %2$d elemento non lido. - "Versión de compilación" - "Licenzas de código aberto" - "Detalles da licenza para software de código aberto" - "Política de privacidade" - "Condicións de servizo" - "Licenzas de código aberto" - "Produciuse un erro ao abrir o URL." "Videochamada" "Comparte e chama" diff --git a/java/com/android/contacts/common/res/values-gu/strings.xml b/java/com/android/contacts/common/res/values-gu/strings.xml index 536aceb9c..a24c43804 100644 --- a/java/com/android/contacts/common/res/values-gu/strings.xml +++ b/java/com/android/contacts/common/res/values-gu/strings.xml @@ -18,7 +18,6 @@ "ટેક્સ્ટ કૉપિ કર્યો" - "ક્લિપબોર્ડ પર કૉપિ કરો" "%s ને કૉલ કરો" "ઘરે કૉલ કરો" "મોબાઇલ પર કૉલ કરો" @@ -40,7 +39,6 @@ "કાર્યાલયના પેજર પર કૉલ કરો" "%s ને કૉલ કરો" "MMS પર કૉલ કરો" - "%s (કૉલ કરો)" "%s ને ટેક્સ્ટ કરો" "ઘરે ટેક્સ્ટ કરો" "મોબાઇલ પર ટેક્સ્ટ કરો" @@ -62,7 +60,6 @@ "કાર્યાલયના પેજર પર ટેક્સ્ટ કરો" "%s ને ટેક્સ્ટ કરો" "MMS પર ટેક્સ્ટ કરો" - "%s (સંદેશ મોકલો)" "વારંવાર સંપર્ક કરેલા સાફ કરીએ?" "તમે સંપર્કો અને ફોન એપ્લિકેશન્સમાં વારંવાર સંપર્ક કરેલ સૂચિને સાફ કરશો અને ઇમેઇલ એપ્લિકેશન્સને તમારી સંબોધન પસંદગીઓને શરૂઆતથી જાણવા માટે ફરજ પાડશો." "વારંવાર સંપર્ક કરેલા સાફ કરે છે…" @@ -70,22 +67,14 @@ "દૂર" "વ્યસ્ત" "સંપર્કો" + "ટોચના સૂચવેલ" "અન્ય" "નિર્દેશિકા" "કાર્ય નિર્દેશિકા" "તમામ સંપર્કો" + "સૂચનો" "હું" - "શોધી રહ્યું છે..." - "%d કરતાં વધુ મળ્યાં." - "કોઈ સંપર્કો નથી" - - %d મળ્યાં - %d મળ્યાં - - "%1$s માટે ઝડપી સંપર્ક" "(નામ નથી)" - "વારંવાર કૉલ કરેલા" - "વારંવાર સંપર્ક કરેલા" "સંપર્ક જુઓ" "ફોન નંબર્સ સાથેના તમામ સંપર્કો" "કાર્ય પ્રોફાઇલના સંપર્કો" @@ -125,8 +114,6 @@ "%s ને ઇમેઇલ કરો" "ઇમેઇલ" "શેરી" - "પોસ્ટ બોક્સ" - "પડોશ" "શહેર" "રાજ્ય" "પિન કોડ" @@ -144,103 +131,19 @@ "ICQ નો ઉપયોગ કરીને ચેટ કરો" "Jabber નો ઉપયોગ કરીને ચેટ કરો" "ચેટ" - "કાઢી નાખો" - "નામ ફીલ્ડ્સ વિસ્તૃત કરો અથવા સંકુચિત કરો" - "ધ્વન્યાત્મક નામ ફીલ્ડ્સ વિસ્તૃત કરો અથવા સંકુચિત કરો" "તમામ સંપર્કો" - "થઈ ગયું" - "રદ કરો" "%s માં સંપર્કો" "કસ્ટમ દૃશ્યમાં સંપર્કો" "એકલ સંપર્ક" - "આયાત કરેલ સંપર્કોને આની પર સાચવો:" - "SIM કાર્ડમાંથી આયાત કરો" - "SIM ^1 - ^2 માંથી આયાત કરો" - "SIM %1$s માંથી આયાત કરો" - ".vcf ફાઇલમાંથી આયાત કરો" - "%s ના આયાતને રદ કરીએ?" - "%s ના નિકાસને રદ કરીએ?" - "vCard આયાત/નિકાસને રદ કરી શક્યાં નહીં" - "અજાણી ભૂલ." - "\"%s\" ખોલી શક્યાં નથી: %s." - "નિકાસકર્તા શરૂ કરી શક્યાં નહીં: \"%s\"." - "કોઈ નિકાસયોગ્ય સંપર્ક નથી." - "તમે આવશ્યક પરવાનગી અક્ષમ કરી છે." - "નિકાસ દરમિયાન ભૂલ આવી: \"%s\"." - "જરૂરી ફાઇલનું નામ ખૂબ લાંબું છે (\"%s\")." - "I/O ભૂલ" - "પર્યાપ્ત મેમરી નથી. આ ફાઇલ ખૂબ મોટી હોઈ શકે છે." - "અનપેક્ષિત કારણસર vCard નું વિશ્લેષણ કરી શકાયું નથી." - "ફોર્મેટ સમર્થિત નથી." - "આપેલ vCard ફાઇલ(લો)ની મેટા માહિતી ભેગી કરી શકાઈ નથી." - "એક અથવા વધુ ફાઇલો આયાત કરી શકાઈ નથી (%s)." - "%s ને નિકાસ કરવું સમાપ્ત થયું." - "સંપર્કોને નિકાસ કરવાનું સમાપ્ત થયું." - "નિકાસ કરવાનું સમાપ્ત થયું, સંપર્કો શેર કરવા માટે સૂચના ક્લિક કરો." - "સંપર્કો શેર કરવા માટે ટૅપ કરો." - "%s ને નિકાસ કરવું રદ કર્યું." - "સંપર્ક ડેટા નિકાસ કરી રહ્યાં છે" - "સંપર્ક ડેટાનો નિકાસ કરવામાં આવી રહ્યો છે." - "ડેટાબેસ જાણકારી મેળવી શકાઈ નથી." - "કોઈ નિકાસયોગ્ય સંપર્કો નથી. જો તમારી પાસે તમારા ઉપકરણ પર કોઈ સંપર્કો નથી, તો કેટલાક ડેટા પ્રદાતા ઉપકરણ પરથી સંપર્કોને નિકાસ કરવાની મંજૂરી આપી શકશે નહીં." - "vCard કમ્પોઝર ઠીકથી પ્રારંભ થયું નથી." - "નિકાસ કરી શક્યાં નથી" - "સંપર્ક ડેટા નિકાસ કર્યો નહોતો.\nકારણ: \"%s\"" - "%s ને આયાત કરી રહ્યાં છે" - "vCard ડેટા વાંચી શકાયો નથી" - "vCard ડેટા વાંચવું રદ કર્યું" - "vCard %s ને આયાત કરવું સમાપ્ત થયું" - "%s ને આયાત કરવું રદ કર્યું" - "%s ને ટૂંક સમયમાં આયાત કરવામાં આવશે." - "ફાઇલ ટૂંક સમયમાં આયાત કરવામાં આવશે." - "vCard આયાતની વિનંતી નકારી હતી. પછીથી ફરી પ્રયાસ કરો." - "%s ને ટૂંક સમયમાં નિકાસ કરવામાં આવશે." - "ફાઇલને ટૂંક સમયમાં નિકાસ કરવામાં આવશે." - "સંપર્કોનો ટૂંક સમયમાં નિકાસ કરવામાં આવશે." - "vCard નિકાસની વિનંતી નકારી હતી. પછીથી ફરી પ્રયાસ કરો." - "સંપર્ક" - "સ્થાનિક અસ્થાયી સ્ટોરેજ પર vCard કેશ કરી રહ્યાં છે. વાસ્તવિક આયાત જલ્દી જ શરૂ થશે." - "vCard આયાત કરી શકાયો નથી." - "NFC પર સંપર્ક પ્રાપ્ત" - "સંપર્કો નિકાસ કરીએ?" - "કેશ કરી રહ્યાં છે" - "%s/%s આયાત કરે છે: %s" - ".vcf ફાઇલ પર નિકાસ કરો" "આ પ્રમાણે સૉર્ટ કરો" "પ્રથમ નામ" "છેલ્લું નામ" "નામ ફોર્મેટ" "પ્રથમ નામ પહેલા" "છેલ્લું નામ પહેલા" - "નવા સંપર્કો માટે ડિફોલ્ટ એકાઉન્ટ" - "સંપર્ક મેટાડેટાને સમન્વયિત કરો" - "સંપર્કો વિશે" - "સેટિંગ્સ" - "દૃશ્યક્ષમ સંપર્કોને શેર કરો" - "દૃશ્યક્ષમ સંપર્કો શેર કરવામાં નિષ્ફળ થયાં." - "મનપસંદ સંપર્કોને શેર કરો" - "તમામ સંપર્કોને શેર કરો" - "સંપર્કોને શેર કરવામાં નિષ્ફળ થયાં." - "સંપર્કો આયાત/નિકાસ કરો" - "સંપર્કો આયાત કરો" - "આ સંપર્ક શેર કરી શકાતો નથી." - "શેર કરવા માટે કોઇ સંપર્કો નથી" - "શોધો" - "સંપર્કો શોધો" - "મનપસંદ" - "કોઈ સંપર્કો નથી." - "કોઈ દૃશ્યક્ષમ સંપર્કો નથી." - "કોઈ મનપસંદ નથી" - "%s માં કોઈ સંપર્કો નથી" "વારંવારના સાફ કરો" - "SIM કાર્ડ પસંદ કરો" - "એકાઉન્ટ્સ સંચાલિત કરો" - "આયાત/નિકાસ કરો" - "%1$s મારફતે" - "%2$s મારફતે %1$s ના રોજ" "શોધવાનું રોકો" "શોધ સાફ કરો" - "સંપર્ક પ્રદર્શન વિકલ્પો" "એકાઉન્ટ" "કૉલ્સ માટે આનો ઉપયોગ હંમેશાં કરો" "આની સાથે કૉલ કરો" @@ -248,19 +151,12 @@ "કૉલ સાથે મોકલવા માટે એક નોંધ લખો ..." "મોકલો અને કૉલ કરો" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ટૅબ." %1$s ટૅબ. %2$d વાંચ્યા વગરની આઇટમ. %1$s ટૅબ. %2$d વાંચ્યા વગરની આઇટમ. - "બિલ્ડ સંસ્કરણ" - "ઓપન સોર્સ લાઇસેંસેસ" - "ખુલ્લા સ્ત્રોતના સોફ્ટવેર માટે લાઇસેંસની વિગતો" - "ગોપનીયતા નીતિ" - "સેવાની શરતો" - "ખુલ્લા સ્રોત લાઇસન્સીસ" - "url ખોલવામાં નિષ્ફળ થયાં." "વિડિઓ કૉલ" "શેર કરો અને કૉલ કરો" diff --git a/java/com/android/contacts/common/res/values-hi/strings.xml b/java/com/android/contacts/common/res/values-hi/strings.xml index c61e195cb..1d49d79cb 100644 --- a/java/com/android/contacts/common/res/values-hi/strings.xml +++ b/java/com/android/contacts/common/res/values-hi/strings.xml @@ -17,8 +17,7 @@ - "लेख की प्रतिलिपि बनाई गई" - "क्‍लिपबोर्ड पर प्रतिलिपि बनाएं" + "लेख को कॉपी किया गया" "%s पर कॉल करें" "घर के फ़ोन नंबर पर कॉल करें" "मोबाइल पर कॉल करें" @@ -40,7 +39,6 @@ "कार्यालय के पेजर पर कॉल करें" "%s पर कॉल करें" "MMS पर कॉल करें" - "%s (कॉल करें)" "%s पर लेख संदेश भेजें" "घर के फ़ोन नंबर पर लेख संदेश भेजें" "मोबाइल पर लेख संदेश भेजें" @@ -62,7 +60,6 @@ "कार्यालय के पेजर पर लेख संदेश भेजें" "%s पर लेख संदेश भेजें" "MMS पर लेख संदेश भेजें" - "%s (संदेश भेजें)" "अक्‍सर किए जाने वाले संपर्क साफ करें?" "आपको संपर्क और फ़ोन ऐप्स से अक्सर संपर्क किए जाने वाली सूची साफ़ करनी होगी, और अपने ईमेल ऐप्स को आपकी पता प्राथमिकताओं को प्रारंभ से जानने के लिए बाध्य करना होगा." "अक्सर किए जाने वाले संपर्क साफ कर रहा है…" @@ -70,22 +67,14 @@ "दूर" "व्यस्त" "संपर्क" + "शीर्ष सुझाव" "अन्य" "निर्देशिका" "कार्य निर्देशिका" "सभी संपर्क" + "सुझाव" "मुझे" - "खोज रहा है..." - "%d से अधिक मिले." - "कोई संपर्क नहीं" - - %d मिले - %d मिले - - "%1$s के लिए त्वरित संपर्क" "(कोई नाम नहीं)" - "बार-बार कॉल किए गए" - "बार-बार संपर्क किए गए" "संपर्क देखें" "फ़ोन नंबरों वाले सभी संपर्क" "कार्य प्रोफ़ाइल के संपर्क" @@ -125,8 +114,6 @@ "%s पर ईमेल करें" "ईमेल करें" "मार्ग का नाम" - "पीओ बॉक्स" - "पड़ोस" "शहर" "राज्य" "पिन कोड" @@ -144,103 +131,19 @@ "ICQ का उपयोग करके बातचीत करें" "Jabber का उपयोग करके बातचीत करें" "बातचीत करें" - "हटाएं" - "नाम फ़ील्ड विस्तृत या संक्षिप्त करें" - "फ़ोनेटिक नाम फ़ील्ड विस्‍तृत या संक्षिप्त करें" "सभी संपर्क" - "पूर्ण" - "अभी नहीं" "%s के संपर्क" "कस्टम दृश्य में संपर्क" "एकल संपर्क" - "आयातित संपर्कों को इसमें सहेजें:" - "सिम कार्ड से आयात करें" - "^1 - ^2 सिम से आयात करें" - "%1$s सिम से आयात करें" - ".vcf फ़ाइल से आयात करें" - "%s का आयात रहने दें?" - "%s का निर्यात रहने दें?" - "vCard आयात/निर्यात रद्द नहीं हो सका" - "अज्ञात गड़बड़ी‍." - "\"%s\" नहीं खोली जा सकी: %s." - "निर्यातकर्ता प्रारंभ नहीं किया जा सका: \"%s\"." - "कोई भी निर्यात-योग्‍य संपर्क नहीं है." - "आपने एक आवश्यक अनुमति को अक्षम कर दिया है." - "निर्यात करते समय कोई गड़बड़ी हुई: \"%s\"." - "आवश्‍यक फ़ाइल नाम बहुत बड़ा है (\"%s\")." - "I/O गड़बड़ी" - "स्‍मृति पर्याप्त नहीं है. हो सकता है फ़ाइल बहुत बड़ी हो." - "किसी अप्रत्‍याशित कारण से vCard पार्स नहीं किया जा सका." - "प्रारूप समर्थित नहीं है." - "दी गई vCard फ़ाइल (फ़ाइलों) की मेटा जानकारी एकत्र नहीं की जा सकी." - "एक या अधिक फ़ाइलें आयात नहीं की जा सकीं (%s)." - "%s का निर्यात पूरा हो गया." - "संपर्कों का निर्यात किया जाना समाप्त हो गया." - "संपर्कों का निर्यात पूरा हो गया है, संपर्क साझा करने के लिए नोटिफ़िकेशन क्लिक करें." - "संपर्क साझा करने के लिए टैप करें." - "%s को निर्यात करना रद्द कर दिया गया." - "संपर्क डेटा निर्यात हो रहा है" - "संपर्क डेटा निर्यात किया जा रहा है." - "डेटाबेस जानकारी नहीं मिल सकी." - "कोई भी निर्यात-योग्‍य संपर्क नहीं है. यदि आपके पास अपने डिवाइस पर संपर्क हों, तो हो सकता है कि कुछ डेटा प्रदाता संपर्कों को डिवाइस से निर्यात ना करने दें." - "vCard कंपोज़र ठीक से प्रारंभ नहीं हुआ." - "निर्यात नहीं कर सका" - "संपर्क डेटा निर्या‍त नहीं किया गया था.\nकारण: \"%s\"" - "%s आयात कर रहा है" - "vCard डेटा नहीं पढ़ा जा सका" - "vCard डेटा को पढ़ना रद्द कर दिया गया" - "vCard %s आयात करना पूर्ण" - "%s को आयात करना रद्द कर दिया गया" - "%s को जल्‍दी ही आयात किया जाएगा." - "फ़ाइल शीघ्र ही आयात की जाएगी." - "vCard आयात अनुरोध अस्‍वीकार हो गया था. बाद में पुन: प्रयास करें." - "%s को जल्‍दी ही निर्यात किया जाएगा." - "फ़ाइल शीघ्र ही निर्यात की जाएगी." - "संपर्कों को शीघ्र ही निर्यात किया जाएगा." - "vCard निर्यात अनुरोध अस्‍वीकार हो गया था. बाद में पुन: प्रयास करें." - "संपर्क" - "vCard को स्‍थानीय अस्‍थायी मेमोरी में संचित कर रहा है. वास्‍तविक आयात जल्‍दी ही प्रारंभ होगा." - "vCard आयात नहीं कर सका." - "NFC पर प्राप्त संपर्क" - "संपर्कों को निर्यात करें?" - "संचय कर रहा है" - "%s/%s आयात कर रहा है: %s" - ".vcf फाइल में निर्यात करें" "इससे क्रमित करें" "नाम" "उपनाम" "नाम प्रारूप" "नाम पहले" "उपनाम पहले" - "नए संपर्कों के लिए डिफ़ॉल्ट खाता" - "संपर्क मेटाडेटा समन्वयनित करें" - "संपर्क के बारे में" - "सेटिंग" - "दिखाई देने वाले संपर्क साझा करें" - "दृश्‍यमान संपर्क साझा करने में विफल रहा." - "पसंदीदा संपर्कों को साझा करें" - "सभी संपर्कों को साझा करें" - "संपर्कों को साझा करना विफल रहा." - "संपर्कों को आयात/निर्यात करें" - "संपर्क आयात करें" - "यह संपर्क साझा नहीं किया जा सकता." - "साझा करने के लिए कोई भी संपर्क नहीं है." - "खोजें" - "संपर्क ढूंढें" - "पसंदीदा" - "कोई संपर्क नहीं." - "कोई दृश्यमान संपर्क नहीं." - "कोई पसंदीदा नहीं" - "%s में कोई संपर्क नहीं" "अक्सर किए जाने वाले साफ़ करें" - "सिम कार्ड चुनें" - "खाते प्रबंधित करें" - "आयात करें/निर्यात करें" - "%1$s द्वारा" - "%2$s द्वारा %1$s को" "खोजना बंद करें" "खोज साफ़ करें" - "संपर्क प्रदर्शन विकल्प" "खाता" "कॉल के लिए हमेशा इसका उपयोग करें" "इस सिम से कॉल करें" @@ -248,19 +151,12 @@ "कॉल के साथ भेजने के लिए नोट लिखें ..." "भेजें और कॉल करें" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s टैब." %1$s टैब. %2$d नहीं पढ़े गए आइटम. %1$s टैब. %2$d नहीं पढ़े गए आइटम. - "बिल्ड वर्शन" - "ओपन सोर्स लाइसेंस" - "ओपन सोर्स सॉफ़्टवेयर के लाइसेंस वि‍वरण" - "निजता नीति" - "सेवा की शर्तें" - "ओपन सोर्स लाइसेंस" - "url खोलने में विफल रहा." "वीडियो कॉल" "साझा करें और कॉल करें" diff --git a/java/com/android/contacts/common/res/values-hr/strings.xml b/java/com/android/contacts/common/res/values-hr/strings.xml index 66986dd38..2aa9272de 100644 --- a/java/com/android/contacts/common/res/values-hr/strings.xml +++ b/java/com/android/contacts/common/res/values-hr/strings.xml @@ -18,7 +18,6 @@ "Tekst kopiran" - "Kopiraj u međuspremnik" "Nazovi %s" "Nazovi kućni broj" "Nazovi mobitel" @@ -40,7 +39,6 @@ "Nazovi poslovni dojavljivač" "Nazovi %s" "Nazovi MMS" - "%s (poziv)" "Pošalji SMS na %s" "Pošalji SMS na kućni" "Pošalji SMS na mobitel" @@ -62,7 +60,6 @@ "Pošalji SMS na poslovni dojavljivač" "Pošalji SMS na %s" "Pošalji SMS na MMS" - "%s (poruka)" "Brisati podatke o čestim kontaktima?" "Izbrisat ćete popis osoba s kojima često kontaktirate u aplikacijama Kontakti i Osobe, pa će aplikacije e-pošte morati ispočetka učiti vaše postavke adresiranja." "Brisanje često kontaktiranih..." @@ -70,23 +67,14 @@ "Odsutan" "Zauzet" "Kontakti" + "Najbolji prijedlozi" "Drugo" "Direktorij" "Poslovni direktorij" "Svi kontakti" + "Prijedlozi" "Ja" - "Pretraživanje…" - "Pronađeno je više od %d." - "Nema kontakata" - - %d pronađen - %d pronađena - %d pronađenih - - "Brzi kontakt za korisnika %1$s" "(Bez imena)" - "Često nazivani" - "Često kontaktirani" "Prikaži kontakt" "Svi kontakti s telefonskim brojevima" "Poslovni kontakti" @@ -126,8 +114,6 @@ "Pošalji e-poruku kontaktu %s" "Pošalji e-poruku" "Ulica" - "Poštanski pretinac" - "Četvrt" "Grad" "Država" "Poštanski broj" @@ -145,103 +131,19 @@ "Chatajte pomoću ICQ-a" "Chatajte uz Jabber" "Chat" - "izbriši" - "Proširi ili sažmi nazive polja" - "Proširivanje ili sažimanje polja fonetskih imena" "Svi kontakti" - "Gotovo" - "Odustani" "Kontakti na računu %s" "Kontakti u prilagođenom prikazu" "Jedan kontakt" - "Spremite uvezene kontakte na račun:" - "Uvoz sa SIM kartice" - "Uvoz sa SIM-a ^1^2" - "Uvoz sa SIM-a %1$s" - "Uvezi iz .vcf datoteke" - "Otkazati uvoz datoteke %s?" - "Otkazati izvoz datoteke %s?" - "Uvoz/izvoz kartice vCard nije otkazan" - "Nepoznata pogreška." - "Nije moguće otvoriti datoteku \"%s\": %s." - "Alat za izvoz ne može se pokrenuti: \"%s\"." - "Nema kontakata koji se mogu izvoziti." - "Onemogućili ste obavezno dopuštenje." - "Tijekom izvoza došlo je do pogreške: \"%s\"." - "Obavezan naziv datoteke predug je (\"%s\")." - "I/O pogreška" - "Nema dovoljno memorije. Datoteka je možda prevelika." - "Iz neočekivanog razloga nije moguće analizirati vCard datoteku." - "Format nije podržan." - "Neuspješno prikupljanje metainformacija danih datoteka kartice vCard." - "Uvoz jedne ili više datoteka nije uspio (%s)." - "Završetak izvoza datoteke %s." - "Dovršen je izvoz kontakata." - "Dovršen je izvoz kontakata. Kliknite obavijest za dijeljenje kontakata." - "Dodirnite za dijeljenje kontakata." - "Izvoz datoteke %s otkazan je." - "Izvoz podataka o kontaktu" - "Podaci kontakata izvoze se." - "Dohvaćanje podataka iz baze podataka nije uspjelo." - "Nema kontakata koji se mogu izvoziti. Ako na svojem telefonu imate kontakte, neki davatelji podataka možda ne dopuštaju izvoz kontakata s tog uređaja." - "Sastavljač za vCard nije se ispravno pokrenuo." - "Izvoz nije uspio" - "Podaci o kontaktu nisu izvezeni.\nRazlog: \"%s\"" - "Uvozi se %s" - "Čitanje podataka vCarda nije uspjelo" - "Čitanje podataka kartice vCard otkazano" - "Završetak uvoza datoteke %s kartice vCard" - "Uvoz datoteke %s otkazan je" - "Datoteka %s uskoro će biti uvezena." - "Datoteka će uskoro biti uvezena." - "Zahtjev za uvoz formata vCard odbijen je. Pokušajte ponovo kasnije." - "Datoteka %s uskoro će biti izvezena." - "Datoteka će se uskoro izvesti." - "Kontakti će se uskoro izvesti." - "Zahtjev za izvoz formata vCard odbijen je. Pokušajte ponovo kasnije." - "kontakt" - "Spremanje vCard datoteka u lokalnu privremenu pohranu. Stvarni uvoz počet će uskoro." - "Uvoz vCard datoteke nije uspio." - "Kontakt NFC-om" - "Izvesti kontakte?" - "Spremanje u predmemoriju" - "Uvoz %s/%s: %s" - "Izvezi u .vcf datoteku" "Poredaj po" "Ime" "Prezime" "Oblik imena" "Najprije ime" "Najprije prezime" - "Zadani račun za nove kontakte" - "Sinkronizacija metapodataka kontakta" - "O kontaktima" - "Postavke" - "Dijeli vidljive kontakte" - "Nije uspjelo dijeljenje vidljivih kontakata" - "Podijeli omiljene kontakte" - "Podijeli sve kontakte" - "Dijeljenje kontakata nije uspjelo." - "Uvoz/izvoz kontakata" - "Uvezi kontakte" - "Ovaj kontakt nije moguće dijeliti." - "Nema kontakata za dijeljenje." - "Traži" - "Potražite kontakte" - "Favoriti" - "Nema kontakata." - "Nema vidljivih kontakata." - "Nema favorita" - "Nema kontakata pod: %s" "Briši često kontaktirane" - "Odaberite SIM karticu" - "Upravljaj računima" - "Uvoz/izvoz" - "putem izvora %1$s" - "%1$s putem izvora %2$s" "zaustavi pretraživanje" "Brisanje pretraživanja" - "Opcije prikaza kontakata" "Račun" "Uvijek upotrebljavaj za pozive" "Poziv putem usluge" @@ -249,20 +151,13 @@ "Napišite bilješku koju ćete poslati uz poziv..." "POŠALJI I NAZOVI" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Kartica %1$s." Kartica %1$s. %2$d nepročitana stavka. Kartica %1$s. %2$d nepročitane stavke. Kartica %1$s. %2$d nepročitanih stavki. - "Međuverzija" - "Licence otvorenog izvornog koda" - "Pojedinosti o licenci za softver otvorenog koda" - "Pravila o privatnosti" - "Uvjeti pružanja usluge" - "Licence otvorenog izvornog koda" - "Otvaranje URL-a nije uspjelo." "Videopoziv" "Dijeli i pozovi" diff --git a/java/com/android/contacts/common/res/values-hu/strings.xml b/java/com/android/contacts/common/res/values-hu/strings.xml index 22bf5094c..347609c14 100644 --- a/java/com/android/contacts/common/res/values-hu/strings.xml +++ b/java/com/android/contacts/common/res/values-hu/strings.xml @@ -18,7 +18,6 @@ "Másolt szöveg" - "Másolás vágólapra" "%s hívása" "Otthoni szám hívása" "Mobil hívása" @@ -40,7 +39,6 @@ "Munkahelyi csipogó hívása" "%s hívása" "MMS-ben szereplő telefonszám hívása" - "%s (hívás)" "SMS: %s" "SMS küldése haza" "SMS küldése mobiltelefonra" @@ -62,7 +60,6 @@ "SMS küldése munkahelyi csipogóra" "SMS küldése ide: %s" "SMS küldése MMS-ben szereplő számra" - "%s (üzenet)" "Törli a gyakran keresetteket?" "Törölni fogja a gyakran keresett személyek listáját a Névjegyek és a Telefon alkalmazásban, és arra kényszeríti az e-mail alkalmazásokat, hogy elölről kezdjék az Ön címzési szokásainak megtanulását." "Gyakran keresettek törlése..." @@ -70,22 +67,14 @@ "Nincs a gépnél" "Elfoglalt" "Címtár" + "Legjobb javaslatok" "Egyéb" "Címtár" "Munkahelyi névjegyek címtára" "Összes névjegy" + "Javaslatok" "Én" - "Keresés…" - "Több mint %d találat." - "Nincsenek névjegyek" - - %d találat - 1 találat - - "%1$s gyors elérése" "(Nincs név)" - "Gyakran hívott" - "Gyakran keresettek" "Névjegy megtekintése" "Minden névjegy telefonszámokkal" "Munkaprofilhoz tartozó névjegyek" @@ -125,8 +114,6 @@ "E-mail küldése a(z) %s címre" "E-mail küldése" "Utca, házszám" - "Postafiók" - "Környék" "Település" "Állam" "Irányítószám" @@ -144,103 +131,19 @@ "Csevegés az ICQ-n" "Csevegés Jabberen" "Csevegés" - "törlés" - "Névmezők részletes vagy listanézete" - "Fonetikus névmezők kinyitása és összecsukása" "Az összes névjegy" - "Kész" - "Mégse" "Ismerősök itt: %s" "Egyéni nézet névjegyei" "Egyetlen névjegy" - "Importált névjegyek mentési helye:" - "Importálás SIM kártyáról" - "Importálás a következő SIM kártyáról: ^1^2" - "Importálás a következő SIM kártyáról: %1$s" - "Importálás .vcf fájlból" - "Megszakítja %s importálását?" - "Megszakítja %s exportálását?" - "vCard imp./exp. megszakítása sikertelen" - "Ismeretlen hiba." - "A(z) „%s” fájl nem nyitható meg: %s." - "Nem sikerült elindítani az exportálót: „%s”." - "Nincs exportálható névjegy." - "Letiltott egy szükséges engedélyt." - "Hiba történt az exportálás során: „%s”." - "A fájlnév túl hosszú („%s”)." - "I/O hiba" - "Nincs elég memória. Lehet, hogy túl nagy a fájl." - "Váratlan ok miatt nem sikerült a vCard szintaktikai elemzése." - "A formátum nem támogatott." - "Nem sikerült begyűjteni a vCard-fájl(ok) metaadatait." - "Egy vagy több fájl nem importálható (%s)." - "A(z) %s exportálása befejeződött." - "A névjegyek exportálása befejeződött." - "Az exportálás befejeződött. A névjegyek megosztásához kattintson az értesítésre." - "Koppintson rá a névjegyek megosztásához." - "A(z) %s exportálása megszakítva." - "Névjegyadatok exportálása" - "A névjegyadatok exportálása folyamatban van." - "Nem sikerült lekérni az adatbázis-információkat." - "Nincsenek exportálható névjegyek. Ha vannak névjegyek az eszközön, előfordulhat, hogy az adatszolgáltató nem teszi lehetővé a névjegyek exportálását az eszközről." - "A vCard-készítő nem megfelelően indult el." - "Sikertelen export" - "Nem sikerült a névjegyadatok exportálása.\nOk: „%s”" - "Importálás – %s" - "Nem sikerült beolvasni a vCard adatait." - "A vCard-adatok beolvasása megszakítva" - "A(z) %s vCard importálása befejeződött" - "A(z) %s importálása megszakítva" - "A(z) %s hamarosan importálva lesz." - "A fájl importálása nemsokára megtörténik." - "A vCard-importálási kérelem elutasítva. Próbálja újra később." - "A(z) %s hamarosan exportálva lesz." - "A fájl exportálása hamarosan megtörténik." - "A névjegyek exportálása hamarosan megtörténik." - "A vCard-exportálási kérelem elutasítva. Próbálja újra később." - "névjegy" - "vCard(ok) mentése az ideiglenes helyi tárolóba. A tényleges importálás hamarosan megkezdődik." - "Nem sikerült a vCard importálása." - "NFC-n kapott név" - "Exportálja a névjegyeket?" - "Gyorsítótárazás" - "Importálás – %s/%s: %s" - "Exportálás .vcf fájlba" "Rendezés alapja" "Utónév" "Vezetéknév" "Névformátum" "Utónév elöl" "Vezetéknév elöl" - "Alapértelmezett fiók az új névjegyek számára" - "Névjegyek metaadatainak szinkronizálása" - "A Névjegyekről" - "Beállítások" - "Látható névjegyek megosztása" - "Nem sikerült megosztani a látható névjegyeket." - "Kedvenc névjegyek megosztása" - "Az összes névjegy megosztása" - "Nem sikerült megosztani a névjegyeket." - "Névjegyek importálása/exportálása" - "Névjegyek importálása" - "Ezt a névjegyet nem lehet megosztani." - "Nincsenek megosztható névjegyek." - "Keresés" - "Névjegy keresése" - "Kedvencek" - "Nincsenek névjegyek." - "Nincsenek látható névjegyek." - "Nincsenek kedvencek" - "Nincsenek névjegyek itt: %s" "Gyakran keresettek törlése" - "SIM kártya kiválasztása" - "Fiókok kezelése" - "Importálás/exportálás" - "itt: %1$s" - "%1$s itt: %2$s" "keresés leállítása" "Keresés törlése" - "Névjegy megjelenítési lehetőségei" "Fiók" "Mindig ezt használja hívásokhoz" "Hívás a következővel:" @@ -248,19 +151,12 @@ "Írjon üzenetet, amelyet elküldhetünk a hívással együtt…" "KÜLDÉS ÉS HÍVÁS" "%2$s/%1$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s lap." %1$s lap. %2$d olvasatlan elem. %1$s lap. %2$d olvasatlan elem. - "Build verziószáma" - "Nyílt forráskódú licencek" - "A nyílt forráskódú szoftverekhez kapcsolódó licenc részletei" - "Adatvédelmi irányelvek" - "Általános Szerződési Feltételek" - "Nyílt forráskódú licencek" - "Nem sikerült megnyitni az URL-címet." "Videohívás" "Megosztás és hívás" diff --git a/java/com/android/contacts/common/res/values-hy/strings.xml b/java/com/android/contacts/common/res/values-hy/strings.xml index 85c902347..0a6cfa23e 100644 --- a/java/com/android/contacts/common/res/values-hy/strings.xml +++ b/java/com/android/contacts/common/res/values-hy/strings.xml @@ -18,7 +18,6 @@ "Տեքսը պատճենված է" - "Պատճենել սեղմատախտակին" "Զանգել %s համարին" "Զանգել տուն" "Զանգել շարժականին" @@ -40,7 +39,6 @@ "Զանգել աշխատավայրի փեյջերին" "Զանգել %s-ին" "Զանգել MMS համարին" - "%s (Զանգ)" "Հաղորդագրել %s-ին" "Հաղորդագրել տուն" "Հաղորդագրել բջջայինին" @@ -62,7 +60,6 @@ "Հաղորդագրել աշխատանքային փեյջերին" "Հաղորդագրել %s-ին" "Հաղորդագրել MMS համարին" - "%s (Հաղորդագրություն)" "Մաքրե՞լ հաճախակի հաղորդակցվածները" "Դուք կմաքրեք հաճախակի հաղորդակցվողների ցանկը Կոնտակտներ և Հեռախոս հավելվածներում, և ձեր էլփոստի ծրագիրը զրոյից կսովորի ձեր հասցեագրումների նախընտրությունները:" "Հաճախակի հաղորդակցումների մաքրում..." @@ -70,22 +67,14 @@ "Տեղում չէ" "Զբաղված" "Կոնտակտներ" + "Լավագույն առաջարկներ" "Այլ" "Գրացուցակ" "Աշխատանքային գրացուցակ" "Բոլոր կոնտակտները" + "Առաջարկներ" "Ես" - "Որոնում..." - "Գտնվել են %d-ից ավելի:" - "Կոնտակտներ չկան" - - %d found - Գտնվել է %d կոնտակտ - - "Արագ կապ %1$s-ի հետ" "(Անանուն)" - "Հաճախակի կանչվող" - "Հաճախակի հաղորդակցվող" "Դիտել կոնտակտը" "Բոլոր հեռախոսահամարներով կոնտատկները" "Աշխատանքային պրոֆիլի կոնտակտներ" @@ -125,8 +114,6 @@ "Նամակագրել %s-ին" "Էլփոստ" "Փողոց" - "Բաժանորդային արկղը" - "Շրջակայքը" "Քաղաքը" "Նահանգը" "Փոստային կոդը" @@ -144,103 +131,19 @@ "Զրուցել ICQ-ով" "Զրուցել Jabber-ով" "Զրույց" - "ջնջել" - "Ընդարձակել կամ սեղմել անունների դաշտերը" - "Ընդարձակել կամ կոծկել տառադարձված անվան դաշտերը" "Բոլոր կոնտակտները" - "Պատրաստ է" - "Չեղարկել" "%s-ի կոնտակտները" "Հատուկ տեսքով կոնտակտներ" "Մեկ կոնտակտ" - "Պահել ներմուծված կոնտակտներն այստեղ՝" - "Ներմուծել SIM քարտից" - "Ներմուծել ^1 - ^2 SIM-ից" - "Ներմուծել %1$s SIM-ից" - "Ներմուծել .vcf ֆայլից" - "Չեղարկե՞լ %s-ի ներմուծումը:" - "Չեղարկե՞լ %s-ի արտահանումը" - "Հնարավոր չէ չեղարկել vCard-ի ներմուծումը/արտահանումը" - "Անհայտ սխալ:" - "Հնարավոր չէ բացել «%s» ֆայլը՝ %s:" - "Հնարավոր չէ մեկնարկել արտահանողին. պատճառը` «%s»:" - "Արտահանելի կոնտակտներ չկան:" - "Դուք անջատել եք անհրաժեշտ թույլտվությունը:" - "Արտահանման ընթացքում սխալ է տեղի ունեցել. պատճառը` «%s»:" - "Պահանջվող ֆայլի անունը («%s») շատ երկար է:" - "I/O սխալ" - "Հիշողությունը բավարար չէ: Հնարավոր է` ֆայլը չափազանց մեծ է:" - "Չհաջողվեց վերլուծել vCard-ը անսպասելի պատճառով:" - "Ձևաչափը չի աջակցվում:" - "Հնարավոր չէ հավաքել vCard ֆայլ(եր)ի մետա տեղեկատվությունը:" - "Հնարավոր չէ ներմուծել մեկ կամ ավելի ֆայլեր (%s):" - "%s-ի արտահանումն ավարտվեց:" - "Կոնտակտների արտահանումն ավարտվեց:" - "Կոնտակտներն արտահանվեցին: Սեղմեք ծանուցումը՝ դրանք հասանելի դարձնելու համար:" - "Հպեք՝ կոնտակտները հասանելի դարձնելու համար:" - "%s-ի արտահանումը չեղարկվեց:" - "Կոնտակտային տվյալների արտահանում" - "Կոնտակտային տվյալներն արտահանվում են:" - "Հնարավոր չէ ստանալ տվյալների շտեմարանի տեղեկատվությունը:" - "Արտահանելու կոնտակտներ չկան: Հնարավոր է՝ որոշ տվյալների մատակարարներ չեն թույլատրում սարքից կոնտակտների արտահանումը:" - "vCard-ի կազմիչը ճիշտ չի մեկնարկել:" - "Հնարավոր չէ արտահանել" - "Կոնտակտային տվյալները չեն արտահանվել:\nՊատճառը՝ «%s»" - "%s-ի ներմուծում" - "Չհաջողվեց ընթերցել vCard-ի տվյալները" - "vCard տվյալների ընթերցումը չեղարկվեց" - "%s-ի ներմուծումը ավարտվեց vCard-ից" - "%s-ի ներմուծումը չեղարկվեց" - "%s-ը շուտով կներմուծվի:" - "Ֆայլը շուտով կներմուծվի:" - "vCard-ի ներմուծման հայցը մերժվել է: Կրկին փորձեք ավելի ուշ:" - "%s-ը կարտահանվի շուտով:" - "Ֆայլը շուտով կարտահանվի:" - "Կոնտակտները շուտով կարտահանվեն:" - "vCard-ի արտահանման հայցը մերժվեց: Փորձեք կրկին ավելի ուշ:" - "կոնտակտ" - "vCard(եր)-ի քեշավորում ժամանակավոր պաոց: Փաստացի ներմուծումը կսկսվի շուտով:" - "Չհաջողվեց ներմուծել vCard-ը:" - "NFC-ով ստացված կոնտակտ" - "Արտահանե՞լ կոնտակտները" - "Քեշավորում" - "Ներմուծվում է %s/%s. %s" - "Արտահանել .vcf ֆայլ" "Դասավորել ըստ" "Անվան" "Ազգանվան" "Անվան ձևաչափ" "Սկզբում՝ անունը" "Սկզբում՝ ազգանունը" - "Կանխադրված հաշիվ նոր կոնտակտների համար" - "Համաժամացնել կոնտակտի մետատվյալները" - "Կոնտակտների մասին" - "Կարգավորումներ" - "Փոխանցել տեսանելի կոնտակտները" - "Չհաջողվեց համօգտագործել տեսանելի կոնտակտները:" - "Ուղարկել կոնտակտների ընտրանին" - "Տրամադրել բոլոր կոնտակտները" - "Չհաջողվեց տրամադրել կոնտակտները:" - "Կոնտակտների ներմուծում/արտահանում" - "Ներմուծել կոնտակտներ" - "Հնարավոր չէ տարածել կոնտակտը:" - "Հասանելի կոնտակտներ չկան։" - "Որոնում" - "Կոնտակտների որոնում" - "Ընտրյալներ" - "Կոնտակտներ չկան:" - "Տեսանելի կոնտակտներ չկան:" - "Ընտրանի չկա" - "%s-ում կոնտակտներ չկան" "Մաքրել հաճախակիները" - "Ընտրեք SIM քարտը" - "Հաշիվների կառավարում" - "Ներմուծել/արտահանել" - "%1$s-ի միջոցով" - "%1$s` %2$s-ի միջոցով" "դադարեցնել որոնումը" "Մաքրել որոնման դաշտը" - "Կոնտակտի ցուցադրման ընտրանքները" "Հաշիվ" "Միշտ օգտագործել սա՝ զանգերի համար" "Զանգել հետևյալով" @@ -248,19 +151,12 @@ "Մուտքագրեք նշում՝ զանգի հետ ուղարկելու համար ..." "ՈՒՂԱՐԿԵԼ ԵՎ ԶԱՆԳԵԼ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ներդիր:" %1$s tab. %2$d unread items. %1$s ներդիր: %2$d չընթերցված տարր: - "Կառուցման տարբերակը" - "Բաց կոդով ծրագրերի արտոնագրեր" - "Բաց կոդով ծրագրային ապահովման արտոնագրերի մանրամասներ" - "Գաղտնիության քաղաքականություն" - "Օգտագործման պայմաններ" - "Բաց կոդով ծրագրակազմի արտոնագրեր" - "Չհաջողվեց բացել url-ը:" "Տեսազանգ" "Կիսվել և զանգել" diff --git a/java/com/android/contacts/common/res/values-in/strings.xml b/java/com/android/contacts/common/res/values-in/strings.xml index d7ee8bfb9..a332790f6 100644 --- a/java/com/android/contacts/common/res/values-in/strings.xml +++ b/java/com/android/contacts/common/res/values-in/strings.xml @@ -18,7 +18,6 @@ "Teks disalin" - "Salin ke papan klip" "Hubungi %s" "Telepon rumah" "Hubungi nomor seluler" @@ -40,7 +39,6 @@ "Hubungi pager kantor" "Hubungi %s" "Hubungi MMS" - "%s (Telepon)" "SMS %s" "SMS rumah" "SMS nomor seluler" @@ -62,7 +60,6 @@ "SMS pager kantor" "SMS %s" "SMS MMS" - "%s (SMS)" "Hapus yang sering dihubungi?" "Anda akan menghapus daftar yang sering dihubungi pada aplikasi Kontak dan Ponsel, serta memaksa aplikasi email untuk mempelajari preferensi penanganan dari awal." "Menghapus yang sering dihubungi..." @@ -70,22 +67,14 @@ "Keluar" "Sibuk" "Kontak" + "Paling Disarankan" "Lainnya" "Direktori" "Direktori kerja" "Semua kontak" + "Saran" "Saya" - "Menelusuri…" - "Ditemukan lebih dari %d." - "Tidak ada kontak" - - Ditemukan %d kontak - Ditemukan 1 kontak - - "Kontak cepat untuk %1$s" "(Tanpa nama)" - "Paling sering dipanggil" - "Paling sering dihubungi" "Lihat kontak" "Semua kontak dengan nomor telepon" "Kontak profil kerja" @@ -125,8 +114,6 @@ "Email %s" "Email" "Jalan" - "Kotak postingan" - "Lingkungan" "Kota" "Negara Bagian" "Kode pos" @@ -144,103 +131,19 @@ "Ngobrol menggunakan ICQ" "Ngobrol menggunakan Jabber" "Ngobrol" - "hapus" - "Luaskan atau ciutkan bidang nama" - "Luaskan atau ciutkan bidang nama fonetik" "Semua kontak" - "Selesai" - "Batal" "Kontak di %s" "Kontak dalam tampilan khusus" "Kontak tunggal" - "Simpan kontak yang diimpor ke:" - "Impor dari kartu SIM" - "Impor dari SIM ^1 - ^2" - "Impor dari SIM %1$s" - "Impor dari file .vcf" - "Batalkan impor %s?" - "Batalkan ekspor %s?" - "Tidak dapat membatalkan impor/ekspor vCard" - "Kesalahan tidak dikenal." - "Tidak dapat membuka \"%s\": %s." - "Tidak dapat memulai pengekspor: \"%s\"." - "Tidak ada kontak yang dapat diekspor." - "Anda telah menonaktifkan izin yang diperlukan." - "Terjadi kesalahan saat ekspor: \"%s\"." - "Nama file yang diperlukan terlalu panjang (\"%s\")." - "Kesalahan I/O" - "Memori tidak cukup. File mungkin terlalu besar." - "Tidak dapat mengurai vCard karena alasan yang tak terduga." - "Format tidak didukung." - "Tidak dapat mengumpulkan informasi meta dari file vCard yang diberikan." - "Satu file atau lebih tidak dapat diimpor (%s)." - "Selesai mengekspor %s." - "Selesai mengekspor kontak." - "Selesai mengekspor kontak, klik notifikasi untuk membagikan kontak." - "Ketuk untuk membagikan kontak." - "Batal mengekspor %s." - "Mengekspor data kontak" - "Data kontak sedang diekspor." - "Tidak dapat memperoleh informasi basis data." - "Tidak ada data kontak yang dapat diekspor. Jika Anda menyimpan kontak di perangkat, beberapa penyedia data mungkin tidak mengizinkan kontak diekspor dari perangkat tersebut." - "Penyusun vCard tidak memulai dengan semestinya." - "Tak dapat mengekspor" - "Data kontak tidak diekspor.\nAlasan: \"%s\"" - "Mengimpor %s" - "Tidak dapat membaca data vCard" - "Batal membaca data vCard" - "Selesai mengimpor vCard %s" - "Batal mengimpor %s" - "%s akan segera diimpor." - "File akan segera diimpor." - "Permintaan impor vCard ditolak. Coba lagi nanti." - "%s akan segera diekspor." - "File akan segera diekspor." - "Kontak akan segera diekspor." - "Permintaan ekspor vCard ditolak. Coba lagi nanti." - "kontak" - "Menyimpan vCard ke dalam cache penyimpanan lokal sementara. Impor yang sebenarnya akan segera dimulai." - "Tidak dapat mengimpor vCard." - "Kontak diterima lewat NFC" - "Ekspor kontak?" - "Menyimpan ke cache" - "Mengimpor %s/%s: %s" - "Ekspor ke file .vcf" "Urutkan menurut" "Nama depan" "Nama belakang" "Format nama" "Nama depan terlebih dulu" "Nama belakang terlebih dulu" - "Akun default untuk kontak baru" - "Sinkronkan metadata kontak" - "Tentang Kontak" - "Setelan" - "Bagikan kontak yang terlihat" - "Gagal membagikan kontak yang terlihat." - "Bagikan kontak favorit" - "Bagikan semua kontak" - "Gagal membagikan kontak." - "Impor/ekspor kontak" - "Impor kontak" - "Kontak ini tidak dapat dibagi." - "Tidak ada kontak untuk dibagikan." - "Telusuri" - "Temukan kontak" - "Favorit" - "Tidak ada kontak." - "Tidak ada kontak yang terlihat." - "Tidak ada favorit" - "Tidak ada kontak di %s" "Hapus yang sering" - "Pilih kartu SIM" - "Kelola akun" - "Impor/ekspor" - "melalui %1$s" - "%1$s melalui %2$s" "menghentikan penelusuran" "Hapus penelusuran" - "Opsi tampilan kontak" "Akun" "Selalu gunakan ini untuk telepon" "Telepon dengan" @@ -248,19 +151,12 @@ "Ketik catatan untuk dikirim dengan panggilan telepon ..." "KIRIM & TELEPON" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Tab %1$s." Tab %1$s. %2$d item belum dibaca. Tab %1$s. %2$d item belum dibaca. - "Versi build" - "Lisensi sumber terbuka" - "Detail lisensi untuk software sumber terbuka" - "Kebijakan privasi" - "Persyaratan layanan" - "Lisensi sumber terbuka" - "Gagal membuka url." "Video call" "Membagikan dan menelepon" diff --git a/java/com/android/contacts/common/res/values-is/strings.xml b/java/com/android/contacts/common/res/values-is/strings.xml index 26c1aefd1..24d3d54ad 100644 --- a/java/com/android/contacts/common/res/values-is/strings.xml +++ b/java/com/android/contacts/common/res/values-is/strings.xml @@ -18,7 +18,6 @@ "Texti afritaður" - "Afrita á klippiborð" "Hringja í %s" "Hringja heim" "Hringa í farsíma" @@ -40,7 +39,6 @@ "Hringja í vinnusímboða" "Hringja í %s" "Hringja í MMS-númer" - "%s (hringja)" "Senda textaskilaboð í %s" "Senda textaskilaboð heim" "Senda textaskilaboð í farsíma" @@ -62,7 +60,6 @@ "Senda textaskilaboð í vinnusímboða" "Senda textaskilaboð til %s" "Senda textaskilaboð í MMS-númer" - "%s (senda SMS)" "Hreinsa mest notaða tengiliði?" "Þetta hreinsar tengiliðina sem þú hefur mest samskipti við úr forritunum Tengiliðir og Sími og þvingar tölvupóstforrit til að læra upp á nýtt hvernig þú notar netföng." "Hreinsar mest notaða tengiliði…" @@ -70,22 +67,14 @@ "Í burtu" "Upptekin(n)" "Tengiliðir" + "Helstu tillögur" "Annað" "Skrá" "Vinnuskrá" "Allir tengiliðir" + "Tillögur" "Ég" - "Leitar…" - "Yfir %d fundust." - "Engir tengiliðir" - - %d fannst - %d fannst - - "Flýtitengiliður fyrir %1$s" "(Nafn vantar)" - "Oft hringt í" - "Oft haft samband við" "Skoða tengilið" "Allir tengiliðir með símanúmer" "Tengiliðir í vinnusniði" @@ -125,8 +114,6 @@ "Senda tölvupóst til %s" "Senda tölvupóst" "Gata" - "Pósthólf" - "Hverfi" "Borg/bær" "Ríki" "Póstnúmer" @@ -144,103 +131,19 @@ "Spjalla með ICQ" "Spjalla með Jabber" "Spjalla" - "eyða" - "Birta fleiri eða færri nafnareiti" - "Birta fleiri eða færri nafnareiti" "Allir tengiliðir" - "Lokið" - "Hætta við" "Tengiliðir á %s" "Tengiliðir á sérsniðnu yfirliti" "Einn tengiliður" - "Vista innflutta tengiliði á:" - "Flytja inn af SIM-korti" - "Flytja inn af SIM-korti ^1^2" - "Flytja inn af SIM-korti %1$s" - "Flytja inn úr .vcf-skrá" - "Hætta við innflutning á %s?" - "Hætta við útflutning á %s?" - "Ekki tókst að hætta við flutning vCard" - "Óþekkt villa." - "Ekki tókst að opna „%s“: %s." - "Ekki tókst að ræsa útflutningsverkfærið: „%s“." - "Engir tengiliðir sem flytja má út." - "Þú hefur gert nauðsynlegt leyfi óvirkt." - "Villa kom upp við útflutninginn: „%s“." - "Skráarheitið er of langt („%s“)." - "Inntaks-/úttaksvilla" - "Ekki nægt minni. Skráin kann að vera of stór." - "Ekki tókst að þátta vCard-skrána af óþekktri ástæðu." - "Ekki er stuðningur við sniðið." - "Ekki tókst að safna lýsigögnum fyrir uppgefna(r) vCard-skrá(r)." - "Ekki tókst að flytja inn eina eða fleiri skrár (%s)." - "Útflutningi á %s lokið." - "Útflutningi tengiliða lokið." - "Útflutningi tengiliða lokið, smelltu á tilkynninguna til að deila tengiliðum." - "Ýttu til að deila tengiliðum." - "Hætt við útflutning á %s." - "Flytur út tengiliðagögn" - "Verið er að flytja út tengiliðagögnin þín." - "Ekki tókst að sækja upplýsingar úr gagnagrunni." - "Engir tengiliðir til flytja út. Ef þú ert með tengiliði í tækinu getur verið að vissar gagnaveitur leyfi ekki útflutning tengiliða úr tækinu." - "Ræsing vCard-skrifviðmótsins tókst ekki." - "Flutningur mistókst" - "Tengiliðagögn voru ekki flutt út.\nÁstæða: „%s\"" - "Flytur inn %s" - "Ekki tókst að lesa gögn úr vCard-skrá" - "Hætt við lestur vCard-gagna" - "Innflutningi lokið á vCard-skránni %s" - "Hætt við innflutning á %s" - "%s verður flutt inn innan skamms." - "Skráin verður flutt inn innan skamms." - "Beiðni um innflutning vCard-skrár hafnað. Reyndu aftur síðar." - "%s verður flutt út innan skamms." - "Skráin verður flutt út innan skamms." - "Tengiliðir verður fluttir út eftir smástund." - "Beiðni um útflutning vCard-skrár hafnað. Reyndu aftur síðar." - "tengiliður" - "Setur vCard í skyndiminni í staðbundinni geymslu. Raunverulegur innflutningur hefst innan skamms." - "Ekki tókst að flytja vCard-skrána inn." - "Tengiliður mótt. um NFC" - "Flytja út tengiliði?" - "Setur í skyndiminni" - "Flytur inn %s/%s: %s" - "Flytja út í .vcf-skrá" "Raða eftir" "Fornafn" "Eftirnafn" "Nafnasnið" "Fornafn fyrst" "Eftirnafn fyrst" - "Sjálfgefinn reikningur fyrir nýja tengiliði" - "Samstilla lýsigögn tengiliða" - "Um tengiliði" - "Stillingar" - "Deila sýnilegum tengiliðum" - "Mistókst að deila sýnilegum tengiliðum." - "Deila eftirlætistengiliðum" - "Deila öllum tengiliðum" - "Ekki tókst að deila tengiliðum." - "Tengiliðir fluttir inn/út" - "Flytja tengiliði inn" - "Ekki er hægt að deila þessum tengilið." - "Engir tengiliðir til að deila." - "Leita" - "Finna tengiliði" - "Uppáhald" - "Engir tengiliðir." - "Engir sýnilegir tengiliðir." - "Ekkert uppáhald" - "Engir tengiliðir í %s" "Hreinsa algenga tengiliði" - "Veldu SIM-kort" - "Stjórna reikningum" - "Innflutningur og útflutningur" - "í gegnum %1$s" - "%1$s í gegnum %2$s" "hætta leit" "Hreinsa leit" - "Birtingarkostir fyrir tengiliði" "Reikningur" "Nota þetta alltaf fyrir símtöl" "Hringja með" @@ -248,19 +151,12 @@ "Sláðu inn texta til að senda með símtalinu..." "SENDA OG HRINGJA" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Flipinn %1$s." Flipinn %1$s. %2$d ólesið atriði. Flipinn %1$s. %2$d ólesin atriði. - "Útgáfa smíðar" - "Leyfi opins kóða" - "Leyfisupplýsingar fyrir hugbúnað með opnum kóða" - "Persónuverndarstefna" - "Þjónustuskilmálar" - "Leyfi opins kóða" - "Ekki tókst að opna slóðina." "Hringja myndsímtal" "Deila og hringja" diff --git a/java/com/android/contacts/common/res/values-it/strings.xml b/java/com/android/contacts/common/res/values-it/strings.xml index 8ea564854..3414bf8b9 100644 --- a/java/com/android/contacts/common/res/values-it/strings.xml +++ b/java/com/android/contacts/common/res/values-it/strings.xml @@ -18,7 +18,6 @@ "Testo copiato" - "Copia negli appunti" "Chiama %s" "Chiama casa" "Chiama cellulare" @@ -40,7 +39,6 @@ "Chiama cercapersone lavoro" "Chiama %s" "Chiama MMS" - "%s (Chiama)" "SMS a %s" "SMS a casa" "SMS a cellulare" @@ -62,7 +60,6 @@ "SMS a cercapersone lavoro" "SMS a %s" "SMS a MMS" - "%s (Invia SMS)" "Cancellare contattati di frequente?" "Verrà cancellato l\'elenco dei contatti frequenti nelle app Contatti e Telefono e le app email dovranno apprendere da zero le tue preferenze di comunicazione." "Cancellazione contattati di frequente…" @@ -70,22 +67,14 @@ "Assente" "Occupato" "Contatti" + "Suggerimenti più popolari" "Altro" "Directory" "Directory di lavoro" "Tutti i contatti" + "Suggerimenti" "Io" - "Ricerca..." - "Più di %d trovati." - "Nessun contatto" - - %d trovati - 1 trovato - - "Accesso rapido ai contatti per %1$s" "(Nessun nome)" - "Numeri più chiamati" - "Contattati spesso" "Visualizza contatto" "Tutti i contatti con numeri di telefono" "Contatti del profilo di lavoro" @@ -125,8 +114,6 @@ "Invia email a %s" "Invia email" "Via" - "Casella postale" - "Quartiere" "Città" "Provincia" "Codice postale" @@ -144,103 +131,19 @@ "Chatta su ICQ" "Chatta su Jabber" "Chat" - "elimina" - "Espandi o comprimi i campi dei nomi" - "Espandi o comprimi i campi dei nomi fonetici" "Tutti i contatti" - "Fine" - "Annulla" "Contatti in %s" "Contatti in visualizzazione personalizzata" "Contatto singolo" - "Salva i contatti importati in:" - "Importa da scheda SIM" - "Importa da SIM ^1 - ^2" - "Importa da SIM %1$s" - "Importa da file .vcf" - "Annullare l\'importazione di %s?" - "Annullare l\'esportazione di %s?" - "Annull. import./esport. vCard non riuscito" - "Errore sconosciuto." - "Impossibile aprire \"%s\": %s." - "Avvio dell\'utilità di esportazione non riuscito: \"%s\"." - "Nessun contatto esportabile." - "Hai disattivato un\'autorizzazione obbligatoria." - "Si è verificato un errore durante l\'esportazione: \"%s\"." - "Il nome file richiesto è troppo lungo (\"%s\")." - "Errore I/O" - "Memoria insufficiente. Il file potrebbe essere troppo grande." - "Analisi vCard non riuscita per motivo imprevisto." - "Il formato non è supportato." - "Raccolta dei metadati dei file vCard specificati non riuscita." - "Importazione di uno o più file non riuscita (%s)." - "Esportazione di %s terminata." - "Esportazione dei contatti terminata." - "Esportazione dei contatti terminata. Fai clic sulla notifica per condividere i contatti." - "Tocca per condividere i contatti." - "Esportazione di %s annullata." - "Esportazione dati contatti" - "Esportazione dei dati dei contatti in corso." - "Recupero informazioni database non riuscito." - "Non sono presenti contatti esportabili. Se hai contatti sul dispositivo, è possibile che alcuni fornitori di dati non consentano l\'esportazione dei contatti dal dispositivo." - "Il compositore di vCard non si è avviato correttamente." - "Impossibile esportare" - "I dati dei contatti non sono stati esportati.\nMotivo: \"%s\"" - "Importazione di %s" - "Lettura dati vCard non riuscita" - "Lettura dati vCard annullata" - "Importazione vCard %s terminata" - "Importazione di %s annullata" - "La vCard %s verrà importata a breve." - "Il file sarà importato a breve." - "Richiesta importazione vCard rifiutata. Riprova più tardi." - "La vCard %s verrà esportata a breve." - "Il file verrà esportato a breve." - "I contatti verranno esportati a breve." - "Richiesta esportazione vCard rifiutata. Riprova più tardi." - "contatto" - "Memorizzazione delle vCard nella cache di archiviazione temporanea locale. L\'importazione reale inizierà a breve." - "Importazione vCard non riuscita." - "Contatto via NFC" - "Esportare contatti?" - "Memorizzazione nella cache" - "Importazione di %s/%s: %s" - "Esporta in file .vcf" "Ordina per" "Nome" "Cognome" "Formato nome" "Prima il nome" "Prima il cognome" - "Account predefinito per i nuovi contatti" - "Sincronizza i metadati dei contatti" - "Informazioni su Contatti" - "Impostazioni" - "Condividi contatti visibili" - "Impossibile condividere i contatti visibili." - "Condividi i contatti preferiti" - "Condividi tutti i contatti" - "Impossibile condividere i contatti." - "Importa/esporta contatti" - "Importa contatti" - "Questo contatto non può essere condiviso." - "Nessun contatto da condividere." - "Cerca" - "Trova contatti" - "Preferiti" - "Nessun contatto." - "Nessun contatto visibile." - "Nessun preferito" - "Nessun contatto in %s" "Cancella frequenti" - "Seleziona scheda SIM" - "Gestisci account" - "Importa/esporta" - "tramite %1$s" - "%1$s tramite %2$s" "interrompi ricerca" "Cancella ricerca" - "Opzioni di visualizzazione dei contatti" "Account" "Usa sempre questa per chiamare" "Chiama con" @@ -248,19 +151,12 @@ "Digita una nota da inviare con la chiamata..." "INVIA E CHIAMA" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Scheda %1$s." Scheda %1$s. %2$d elementi da leggere. Scheda %1$s. %2$d elemento da leggere. - "Versione build" - "Licenze open source" - "Dettagli delle licenze per il software open source" - "Norme sulla privacy" - "Termini di servizio" - "Licenze open source" - "Impossibile aprire l\'URL." "Videochiamata" "Condividi e chiama" diff --git a/java/com/android/contacts/common/res/values-iw/strings.xml b/java/com/android/contacts/common/res/values-iw/strings.xml index 2a6b2c189..381b5d1b6 100644 --- a/java/com/android/contacts/common/res/values-iw/strings.xml +++ b/java/com/android/contacts/common/res/values-iw/strings.xml @@ -18,7 +18,6 @@ "טקסט שהועתק" - "העתק ללוח" "התקשר אל %s" "התקשר לבית" "התקשר לנייד" @@ -40,7 +39,6 @@ "התקשר לזימונית של העבודה" "התקשר אל %s" "‏התקשר ל-MMS" - "%s (שיחה)" "שלח הודעת טקסט אל %s" "שלח הודעת טקסט לבית" "שלח הודעת טקסט לנייד" @@ -62,7 +60,6 @@ "שלח הודעת טקסט לזימונית של עבודה" "שלח הודעת טקסט אל %s" "‏שלח הודעת טקסט ל-MMS" - "%s (הודעה)" "האם למחוק אנשי קשר קבועים?" "הפעולה הזו תמחק מהאפליקציות \'אנשים\' ו\'טלפון\' את רשימת אנשי הקשר שאיתם אתה יוצר קשר בתדירות גבוהה, ויהיה עליך ללמד מחדש את אפליקציות האימייל את הכתובות המועדפות עליך." "מוחק אנשי קשר קבועים…" @@ -70,24 +67,14 @@ "לא נמצא" "לא פנוי" "אנשי קשר" + "הצעות מובילות" "אחר" "ספריה" "ספריית עבודה" "כל אנשי הקשר" + "הצעות" "אני" - "מחפש..." - "נמצאו יותר מ-%d." - "אין אנשי קשר" - - נמצאו %d - נמצאו %d - נמצאו %d - נמצא אחד - - "קשר מהיר עבור %1$s" "(ללא שם)" - "התקשרות לעתים קרובות" - "בקשר לעתים קרובות" "הצג איש קשר" "כל אנשי הקשר עם מספרי טלפון" "אנשי הקשר של פרופיל העבודה" @@ -127,8 +114,6 @@ "שלח אימייל אל %s" "שלח אימייל" "רחוב" - "תא דואר" - "שכונה" "עיר" "מדינה" "מיקוד" @@ -146,103 +131,19 @@ "‏שוחח בצ\'אט באמצעות ICQ" "‏שוחח בצ\'אט באמצעות Jabber" "צ\'אט" - "מחק" - "הרחב או כווץ שמות של שדות" - "הרחב או כווץ שדות של שמות פונטיים" "כל אנשי הקשר" - "סיום" - "ביטול" "אנשי קשר ב-%s" "אנשי קשר בתצוגה מותאמת אישית" "איש קשר יחיד" - "שמור אנשי קשר שיובאו ב-:" - "‏יבא מכרטיס SIM" - "‏יבא מ-SIM ^1 - ^2" - "‏יבא מ-SIM %1$s" - "‏יבא מקובץ ‎.vcf" - "האם לבטל את הייבוא של %s?" - "האם לבטל את הייצוא של %s?" - "‏לא ניתן היה לבטל ייבוא/ייצוא של vCard" - "שגיאה לא ידועה." - "לא היה ניתן לפתוח את \"%s\"‏: %s." - "לא ניתן להפעיל את המייצא: \"%s\"." - "אין אנשי קשר הניתנים לייצוא." - "השבתת הרשאה נדרשת." - "אירעה שגיאה במהלך הייצוא: \"%s\"." - "שם הקובץ הדרוש ארוך מדי (\"%s\")" - "שגיאת קלט/פלט" - "אין מספיק זיכרון. ייתכן שהקובץ גדול מדי." - "‏לא ניתן היה לנתח את ה-vCard מסיבה בלתי צפויה." - "הפורמט אינו נתמך." - "‏לא ניתן היה לאסוף מטא-מידע של קובצי vCard נתונים." - "‏לא ניתן היה לייבא קובץ אחד או יותר (%s)." - "הייצוא של %s הסתיים." - "ייצוא אנשי הקשר הושלם." - "יצוא אנשי הקשר הסתיים, לחץ על ההודעה כדי לשתף אנשי קשר." - "הקש כדי לשתף אנשי קשר." - "הייצוא של %s בוטל." - "מייצא נתונים של אנשי קשר" - "יצוא הנתונים של אנשי הקשר מתבצע כעת." - "לא ניתן היה לקבל מידע ממסד הנתונים." - "אין אנשי קשר שניתן לייצא. אם במכשיר מוגדרים אנשי קשר, ייתכן שספקי הנתונים שלהם לא מאפשרים לייצא אותם מהטלפון." - "‏יישום יצירת ה-vCard לא הופעל כהלכה." - "לא ניתן היה לייצא" - "נתוני אנשי הקשר לא יוצאו.\nסיבה: \"%s\"" - "מייבא את %s" - "‏לא ניתן היה לקרוא נתוני vCard" - "‏קריאת נתוני ה-VCard בוטלה" - "‏הייבוא של קובץ vCard ‏%s הסתיים" - "הייבוא של %s בוטל" - "הייבוא של %s יתבצע בהקדם." - "ייבוא הקובץ יתבצע בהקדם." - "‏הבקשה לייבוא ה-vCard נדחתה. נסה שוב מאוחר יותר." - "הייצוא של %s יתבצע בהקדם." - "ייצוא הקובץ יתבצע בעוד זמן קצר." - "יצוא אנשי הקשר יבוצע תוך זמן קצר." - "‏הבקשה לייצוא ה-vCard נדחתה. נסה שוב מאוחר יותר." - "איש קשר" - "‏קובצי ה-vCard נשמרים כקבצים באחסון מקומי זמני. הייבוא בפועל יחל בקרוב." - "‏לא ניתן היה לייבא את ה-vCard." - "‏איש הקשר התקבל באמצעות NFC" - "לייצא את אנשי הקשר?" - "שומר כקובץ שמור" - "מייבא %s/%s‏: %s" - "‏יצא לקובץ ‎.vcf" "מיון לפי" "שם פרטי" "שם משפחה" "פורמט השם" "שם פרטי יופיע ראשון" "שם משפחה יופיע ראשון" - "חשבון ברירת מחדל לאנשי קשר חדשים" - "שתף מטא נתונים של איש קשר" - "מידע על אנשי קשר" - "הגדרות" - "שתף אנשי קשר שמוצגים כעת" - "שיתוף של התוכן הגלוי נכשל." - "שתף אנשי קשר מועדפים" - "שתף את כל אנשי הקשר" - "הניסיון לשתף את אנשי הקשר נכשל." - "יבא/יצא אנשי קשר" - "יבא אנשי קשר" - "לא ניתן לשתף איש קשר זה." - "אין אנשי קשר לשיתוף." - "חפש" - "חפש אנשי קשר" - "מועדפים" - "אין אנשי קשר." - "אין אנשי קשר גלויים." - "אין מועדפים" - "אין אנשי קשר ב-%s" "מחק אנשי קשר קבועים" - "‏בחר כרטיס SIM" - "נהל חשבונות" - "ייבוא/ייצוא" - "באמצעות %1$s" - "%1$s באמצעות %2$s" "הפסק לחפש" "נקה חיפוש" - "אפשרויות להצגת אנשי קשר" "חשבון" "השתמש תמיד עבור שיחות" "התקשר באמצעות" @@ -250,7 +151,7 @@ "הקלד הערה לשליחה עם השיחה..." "שלח והתקשר" "%1$s / %2$s" - "%1$s%2$s" + "‎%1$s %2$s‎" "הכרטיסייה %1$s." הכרטיסייה %1$s. %2$d פריטים שלא נקראו. @@ -258,13 +159,6 @@ הכרטיסייה %1$s. %2$d פריטים שלא נקראו. הכרטיסייה %1$s. %2$d פריט שלא נקרא. - "‏גרסת Build" - "רישיונות קוד פתוח" - "פרטי רישיון לתוכנות קוד פתוח" - "מדיניות פרטיות" - "תנאים והגבלות" - "רישיונות קוד פתוח" - "לא ניתן לפתוח את כתובת האתר." "שיחת וידאו" "שיתוף והתקשרות" diff --git a/java/com/android/contacts/common/res/values-ja/donottranslate_config.xml b/java/com/android/contacts/common/res/values-ja/donottranslate_config.xml index e05c6d658..29512c04a 100644 --- a/java/com/android/contacts/common/res/values-ja/donottranslate_config.xml +++ b/java/com/android/contacts/common/res/values-ja/donottranslate_config.xml @@ -1,4 +1,20 @@ + + false @@ -14,7 +30,4 @@ false - - - true \ No newline at end of file diff --git a/java/com/android/contacts/common/res/values-ja/strings.xml b/java/com/android/contacts/common/res/values-ja/strings.xml index 3271b46bb..f4af8fa81 100644 --- a/java/com/android/contacts/common/res/values-ja/strings.xml +++ b/java/com/android/contacts/common/res/values-ja/strings.xml @@ -18,7 +18,6 @@ "テキストをコピーしました" - "クリップボードにコピー" "%sに発信" "自宅に発信" "モバイル端末に発信" @@ -40,7 +39,6 @@ "ポケベル(勤務先)に発信" "%sに発信" "MMSに発信" - "%s さん(通話を発信)" "%sにSMS" "自宅にSMS" "モバイル端末にSMS" @@ -62,7 +60,6 @@ "ポケベル(勤務先)にSMS" "%sにSMS" "MMSにSMS" - "%s さん(メッセージを送信)" "よく使う連絡先を消去しますか?" "連絡帳アプリや電話アプリのよく使う連絡先リストを消去し、メールアプリがアドレス設定を初めから保存していくようにします。" "よく使う連絡先を消去しています…" @@ -70,22 +67,14 @@ "不在" "取り込み中" "連絡先" + "おすすめ" "その他" "ディレクトリ" "仕事用の連絡先リスト" "すべての連絡先" + "候補" "自分" - "検索中..." - "%d件以上見つかりました。" - "連絡先はありません" - - %d 件見つかりました - 1 件見つかりました - - "%1$sさんのクイックコンタクト" "(名前なし)" - "よく使う連絡先" - "よく使う連絡先" "連絡先を表示" "電話番号のあるすべての連絡先" "仕事用プロファイルの連絡先" @@ -125,8 +114,6 @@ "%sにメール" "メール" "番地" - "私書箱" - "街区(中国等で使用)" "市区町村" "都道府県" "郵便番号" @@ -144,103 +131,19 @@ "ICQでチャット" "Jabberでチャット" "チャット" - "削除" - "名前フィールドの展開/折りたたみ" - "フリガナ項目を展開または折りたたみます" "すべての連絡先" - "完了" - "キャンセル" "%sの連絡先" "連絡先のカスタム表示" "単独の連絡先" - "インポートされた連絡先の保存先:" - "SIMカードからインポート" - "SIM(^1 - ^2)からインポート" - "SIM(%1$s)からインポート" - ".vcfからインポート" - "%sのインポートをキャンセルしますか?" - "%sのエクスポートをキャンセルしますか?" - "vCardインポート/エクスポート取り消し不可" - "不明なエラーです。" - "「%s」を開けませんでした。理由: %s。" - "エクスポータを起動できませんでした: 「%s」。" - "エクスポートできる連絡先がありません。" - "必要な権限が無効にされています。" - "エクスポート中にエラーが発生しました: 「%s」。" - "ファイル名(必須)が長すぎます(「%s」)。" - "送受信エラー" - "メモリが不足しています。ファイルが大きすぎる可能性があります。" - "予期しない理由によりvCardを解析できませんでした。" - "このフォーマットには対応していません。" - "指定されたvCardファイルのメタ情報を取得できませんでした。" - "1つ以上のファイルをインポートできませんでした(%s)。" - "%sのエクスポートの完了" - "連絡先のエクスポートの完了" - "連絡先のエクスポートが終了しました。通知をタップして連絡先を共有してください。" - "タップして連絡先を共有してください。" - "%sのエクスポートのキャンセル" - "連絡先データのエクスポート" - "連絡先データをエクスポートしています。" - "データベース情報を取得できませんでした。" - "エクスポートできる連絡先がありません。端末に連絡先を保存していても、データ プロバイダによっては連絡先をエクスポートできないことがあります。" - "vCardコンポーザーが正しく起動しませんでした。" - "エクスポート失敗" - "連絡先データはエクスポートされませんでした。\n理由: 「%s」" - "%sをインポート中" - "vCardデータの読み取りの失敗" - "vCardデータの読み取りのキャンセル" - "vCardの%sのインポートの終了" - "%sのインポートのキャンセル" - "%sはまもなくインポートされます。" - "ファイルはまもなくインポートされます。" - "vCardのインポートリクエストは拒否されました。しばらくしてからもう一度お試しください。" - "%sはまもなくエクスポートされます。" - "ファイルはまもなくエクスポートされます。" - "連絡先のエクスポートをまもなく開始します。" - "vCardのエクスポートリクエストは拒否されました。しばらくしてからもう一度お試しください。" - "連絡先" - "vCardをローカル一時ストレージにキャッシュしています。まもなくインポート処理を開始します。" - "vCardをインポートできませんでした。" - "NFC受信の連絡先" - "連絡先をエクスポートしますか?" - "キャッシュ中" - "%s/%s%s)をインポート中" - ".vcfにエクスポート" "並べ替え" "名" "姓" "名前の形式" "名が先" "姓が先" - "新しい連絡先のデフォルトアカウント" - "連絡先メタデータの同期" - "連絡先について" - "設定" - "表示可能な連絡先を共有" - "表示可能な連絡先を共有できませんでした。" - "お気に入りの連絡先を共有" - "すべての連絡先を共有" - "連絡先を共有できませんでした。" - "連絡先のインポート/エクスポート" - "連絡先をインポート" - "この連絡先は共有できません。" - "共有する連絡先がありません。" - "検索" - "連絡先を検索" - "お気に入り" - "連絡先はありません。" - "表示できる連絡先はありません。" - "お気に入りはありません" - "%sの連絡先はありません" "よく使う連絡先のクリア" - "SIMカードの選択" - "アカウントを管理" - "インポート/エクスポート" - "更新元: %1$s" - "%1$s、更新元: %2$s" "検索を停止" "検索をクリア" - "連絡先表示オプション" "アカウント" "このSIMを常に通話に使用する" "発信用の端末アカウントを選択してください" @@ -248,19 +151,12 @@ "発信時に送信するメモを入力..." "送信 / 通話" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s タブ。" %1$s タブ。%2$d 件の未読項目。 %1$s タブ。%2$d 件の未読項目。 - "ビルドバージョン" - "オープンソースライセンス" - "オープンソースソフトウェアに関するライセンスの詳細" - "プライバシーポリシー" - "利用規約" - "オープンソース ライセンス" - "この URL を開けませんでした。" "ビデオ通話" "共有して発信" diff --git a/java/com/android/contacts/common/res/values-ka/strings.xml b/java/com/android/contacts/common/res/values-ka/strings.xml index ebbee6e33..8ae8da952 100644 --- a/java/com/android/contacts/common/res/values-ka/strings.xml +++ b/java/com/android/contacts/common/res/values-ka/strings.xml @@ -18,7 +18,6 @@ "კოპირებული ტექსტი" - "კოპირება გაცვლის ბუფერში" "დარეკვა %s ნომერზე" "დარეკვა სახლში" "დარეკვა მობილურზე" @@ -40,7 +39,6 @@ "დარეკვა სამსახურის პეიჯერზე" "დარეკვა %s-თან" "დარეკვა MMS-ის ნომერზე" - "%s (ზარი)" "ტექსტური შეტყობინების გაგზავნა %s-ზე" "ტექსტური შეტყობინების გაგზავნა სახლში" "ტექსტური შეტყობინების გაგზავნა მობილურზე" @@ -62,7 +60,6 @@ "ტექსტური შეტყობინების გაგზავნა სამსახურის პეიჯერზე" "ტექსტური შეტყობინების გაგზავნა %s-ისთვის" "ტექსტური შეტყობინების გაგზავნა MMS ნომერზე" - "%s (შეტყობინება)" "გსურთ ხშირი კონტაქტების წაშლა?" "თქვენ წაშლით ხშირად დაკავშირებულთა სიას კონტაქტებიდან და ტელეფონის აპლიკაციიდან და აიძულებთ ელ-ფოსტის აპლიკაციებს შეისწავლონ თქვენი ადრესატების პრიორიტეტები ნულიდან." "ხშირი კონტაქტები იშლება…" @@ -70,22 +67,14 @@ "გასული" "დაკავებული" "კონტაქტები" + "საუკეთესო შეთავაზებები" "სხვა" "კატალოგი" "სამსახურის კატალოგი" "ყველა კონტაქტი" + "შეთავაზებები" "მე" - "ძიება..." - "ნაპოვნია %d-ზე მეტი." - "კონტაქტები არ არის" - - მოიძებნა %d - მოიძებნა 1 - - "სწრაფი დაკავშირება %1$s-თან" "(სახელის გარეშე)" - "ხშირად დარეკილი" - "ხშირი კონტაქტები" "კონტაქტის ნახვა" "ყველა ტელეფონის ნომრიანი კონტაქტი" "სამსახურის პროფილის კონტაქტები" @@ -125,8 +114,6 @@ "ელფოსტის გაგზავნა %s" "ელფოსტის გაგზავნა" "ქუჩა" - "საფოსტო ყუთი" - "უბანი" "ქალაქი" "შტატი" "ZIP-კოდი" @@ -144,103 +131,19 @@ "ჩეთი ICQ-ით" "ჩეთი Jabber-ით" "ჩეთი" - "წაშლა" - "სახელთა ველების გაშლა ან აკეცვა" - "ფონეტიკური სახელების ველების გაშლა ან ჩაკეცვა" "ყველა კონტაქტი" - "დასრულდა" - "გაუქმება" "კონტაქტები %s-ში" "კონტაქტები მორგებულ ხედში" "ერთი კონტაქტი" - "იმპორტირებული კონტაქტების შენახვა აქ:" - "SIM ბარათიდან იმპორტი" - "იმპორტი SIM-იდან ^1 - ^2" - "იმპორტი SIM-იდან %1$s" - "იმპორტი .vcf ფაილიდან" - "გსურთ %s-ის იმპორტის გაუქმება?" - "გსურთ %s-ის ექსპორტის გაუქმება?" - "vCard-ის იმპორტი/ექსპორტი ვერ გაუქმდა" - "უცნობი შეცდომა." - "„%s“-ის გახსნა ვერ მოხერხდა: %s." - "ექსპორტერის გაშვება ვერ მოხერხდა: „%s“." - "ექსპორტირებადი კონტაქტი არ არსებობს." - "თქვენ გათიშული გაქვთ საჭირო ნებართვა." - "შეცდომის გამო ექსპორტი ვერ მოხერხდა: „%s“." - "საჭირო ფაილის სახელი ძალიან გრძელია („%s“)" - "I/O შეცდომა" - "მეხსიერება არასაკმარისია. შესაძლოა ფაილი ძალიან დიდია." - "vCard ფაილის გარჩევა ვერ მოხერხდა გაუთვალისწინებული მიზეზით." - "ფორმატი მხარდაუჭერელია." - "მოცემული vCard ფაილ(ებ)ის მეტა ინფორმაციის შეგროვება ვერ მოხერხდა." - "ერთი ან მეტი ფაილის იმპორტი ვერ მოხერხდა (%s)." - "%s-ის ექსპორტი დასრულდა." - "კონტაქტების ექსპორტი დასრულდა." - "კონტაქტების ექსპორტი დასრულდა. კონტაქტების გასაზიარებლად, შეეხეთ შეტყობინებას." - "შეეხეთ კონტაქტების გასაზიარებლად." - "%s-ის ექსპორტი გაუქმდა." - "მიმდინარეობს კონტაქტების მონაცემების ექსპორტი" - "მიმდინარეობს კონტაქტების მონაცემების ექსპორტი." - "მონაცემთა ბაზის შესახებ ინფორმაციის მიღება ვერ მოხერხდა." - "ექსპორტირებადი კონტაქტები არ არის. თუ კონტაქტები ნამდვილად არის თქვენს მოწყობილობაში, შესაძლოა ზოგიერთი მონაცემთა პროვაიდერი არ იძლევა მოწყობილობიდან მათი ექსპორტის უფლებას." - "vCard ფაილის კომპოზიტორი გაშვებულია არასწორად." - "ექსპორტი ჩაიშალა." - "კონტაქტების მონაცემები არ არის ექსპორტირებული.\nმიზეზი: „%s“" - "იმპორტირდება %s" - "vCard მონაცემთა წაკითხვა ვერ მოხერხდა" - "vCard მონაცემთა წაკითხვა გაუქმდა" - "vCard ფაილის %s იმპორტი დასრულდა" - "%s-ის იმპორტი გაუქმდა" - "%s მალე იმპორტირდება." - "ეს ფაილი მალე იმპორტირდება." - "vCard-ის იმპორტის მოთხოვნა უარყოფილია. სცადეთ მოგვიანებით." - "%s მალე ექსპორტირდება." - "ამ ფაილის ექსპორტი მალე შესრულდება." - "კონტაქტების ექსპორტი მალე განხორციელდება." - "vCard-ის ექსპორტის მოთხოვნა უარყოფილია. სცადეთ მოგვიანებით." - "კონტაქტი" - "მიმდინარეობს vCard ფაილ(ებ)ის ქეშირება ადგილობრივ დროებით მეხსიერებაში. ფაქტიური იმპორტი დაიწყება მალე." - "vCard-ის იმპორტი ვერ მოხერხდა." - "კონტაქტი NFC-ით" - "გსურთ კონტაქტების ექსპორტი?" - "ქეშირება" - "იმპორტირდება %s/%s-დან: %s" - "ექსპორტი .vcf ფაილში" "სორტირება:" "სახელით" "გვარით" "სახელის ფორმატი" "ჯერ სახელი" "ჯერ გვარი" - "ნაგულისხმევი ანგარიში ახალი კონტაქტებისთვის" - "კონტაქტების მეტამონაცემების სინქრონიზაცია" - "Contacts-ის შესახებ" - "პარამეტრები" - "ხილული კონტაქტების გაზიარება" - "ხილული კონტაქტების გაზიარება ვერ მოხერხდა." - "რჩეული კონტაქტების გაზიარება" - "ყველა კონტაქტის გაზიარება" - "კონტაქტების გაზიარება ვერ მოხერხდა." - "კონტაქტების იმპორტი/ექსპორტი" - "კონტაქტების იმპორტი" - "ამ კონტაქტის გაზიარება შეუძლებელია." - "გასაზიარებელი კონტაქტები არ არის." - "ძიება" - "კონტაქტების პოვნა" - "რჩეულები" - "კონტაქტები არ არის." - "ხილული კონტაქტები არ არის." - "რჩეულები არ არის" - "%s-ში კონტაქტები არ არის" "ხშირი კონტაქტების წაშლა" - "აირჩიეთ SIM ბარათი" - "ანგარიშების მართვა" - "იმპორტი/ექსპორტი" - "%1$s-ის მეშვეობით" - "%1$s, %2$s-ის მეშვეობით" "ძიების შეჩერება" "ძიების გასუფთავება" - "კონტაქტის ჩვენების ვარიანტები" "ანგარიში" "ზარებისთვის მუდამ ამის გამოყენება" "დარეკვა ანგარიშით:" @@ -248,19 +151,12 @@ "აკრიფეთ შენიშვნა ზართან ერთად გასაგზავნად ..." "გაგზავნა და დარეკვა" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ცხრ." %1$s ცხრ. %2$d წაუკითხავი ერთეული. %1$s ცხრ. %2$d წაუკითხავი ერთეული. - "ანაწყობის ვერსია" - "ღია კოდის ლიცენზიები" - "ღია კოდის პროგრამული უზრუნველყოფის ლიცენზირების დეტალები" - "კონფიდენციალურობის დებულება" - "მომსახურების პირობები" - "ღია კოდის ლიცენზიები" - "Url-ის გახსნა ვერ მოხერხდა." "ვიდეოზარი" "გაზიარება და დარეკვა" diff --git a/java/com/android/contacts/common/res/values-kk/strings.xml b/java/com/android/contacts/common/res/values-kk/strings.xml index 327532abc..401a90fe4 100644 --- a/java/com/android/contacts/common/res/values-kk/strings.xml +++ b/java/com/android/contacts/common/res/values-kk/strings.xml @@ -18,7 +18,6 @@ "Мәтін көшірмесі жасалды" - "Аралық сақтағышқа көшіру" "%s нөміріне қоңырау шалу" "Үйге қоңырау шалу" "Ұялы телефонға қоңырау шалу" @@ -40,7 +39,6 @@ "Жұмыс пэйджеріне қоңырау шалу" "%s нөміріне қоңырау соғу" "MMS нөміріне қоңырау шалу" - "%s (Қоңырау)" "%s мәтін-хабар жіберу" "Үй телефонына мәтін-хабар жіберу" "Ұялы телефонған мәтін-хабар жіберу" @@ -62,7 +60,6 @@ "Жұмыс пейджеріне мәтін-хабар жіберу" "%s нөміріне мәтін-хабар жіберу" "MMS нөміріне мәтін-хабар жіберу" - "%s (Хабар)" "Жиі қолданылғандар тазартылсын ба?" "Контактілер және Телефондар қолданбаларындағы жиі хабарласатындар тізімі тазаланады және электрондық пошта қолданбалары мекенжай параметрлерін басынан үйренуге мәжбүрленеді." "Жиі қолданылғандар тазартылуда…" @@ -70,22 +67,14 @@ "Желіден тыс" "Бос емес" "Контактілер" + "Үздік ұсыныстар" "Басқа" "Анықтама" "Жұмыс каталогы" "Барлық контактілер" + "Ұсыныстар" "Мен" - "Іздеуде…" - "%d көбірек табылды." - "Контактілер жоқ" - - %d табылды - 1 табылды - - "%1$s үшін жылдам байланыс" "(Атаусыз)" - "Қоңырау жиі шалынғандар" - "Жиі қолданылғандар" "Контактіні көру" "Телефон нөмірі бар барлық контактілер" "Жұмыс профилінің контактілері" @@ -125,8 +114,6 @@ "%s мекенжайына хат жіберу" "Хат жіберу" "Көше" - "Пошта жәшігі" - "Аудан" "Қала" "Штат" "Индекс" @@ -144,103 +131,19 @@ "ICQ қолданып чаттасу" "Jabber қолданып чаттасу" "Чаттасу" - "жою" - "Ат аймақтарын кеңейту немесе қирату" - "Фонетикалық атау өрістерін жаю немесе жию" "Барлық контактілер" - "Дайын" - "Тоқтату" "%s ішіндегі контактілер" "Контактілердің жеке көрінісі" "Жалғыз контакт" - "Импортталған контактілерді келесіге сақтау:" - "SIM картадан импорттау" - "^1^2 SIM картасынан импорттау" - "%1$s SIM картасынан импорттау" - ".vcf файлынан импорттау" - "%s импорттау тоқтатылсын ба?" - "%s экспорттау тоқтатылсын ба?" - "vКартасын импорттау/экспорттауды тоқтату мүмкін болмады" - "Белгісіз қателік." - "\"%s\" файлын аша алмады: %s." - "Экспорттаушыны бастау мүмкін болмады: \"%s\"." - "Экспортталатын контакт жоқ." - "Сіз міндетті рұқсатты өшірдіңіз." - "Экспорттау кезінде қателік орын алды: \"%s\"." - "Қажетті файл атауы тым ұзақ (\"%s\")." - "I/O қателігі" - "Жад жеткіліксіз. Файл тым үлкен болуы мүмкін." - "vКартасын талдау күтпеген себеппен мүмкін болмады." - "Форматтың қолдауы жоқ." - "Осы vКарта файлдары туралы мета ақпарат жинай алмады." - "Бір немесе бірнеше карталарды импорттау мүмкін болмады (%s)." - "%s экспорттау аяқталды." - "Контактілер экспортталып болды." - "Контактілерді экспорттау аяқталды, контактілерді бөлісу үшін хабарландыруды басыңыз." - "Контактілерді бөлісу үшін түртіңіз." - "%s экспорттау тоқтатылды." - "Контакт дерекқор экспортталуда" - "Контактінің деректері экспортталуда." - "Дерекқор ақпаратын ала алмады." - "Экспорттауға болатын контактілер жоқ. Құрылғыңызда контактілер болса, кейбір провайдерлер контактілердің құрылғыдан экспортталуына рұқсат бермейді." - "vКарта жасақтаушы дұрыс басталмады." - "Экспорттай алмады" - "Контакт деректері экспортталмады. \nСебебі: \"%s\"" - "%s импортталуда" - "vКарта дерекқорын оқи алмады" - "vКарта дерекқорын оқу тоқтатылды" - "%s vКарта файлын импорттау аяқталды" - "%s импорттау тоқтатылды" - "%s жуық арада импортталады." - "Файл жуық арада импортталады." - "vКартасын импорттау өтініші қабылданбады. Кейінірек қайта әрекеттеніп көріңіз." - "%s жуық арада экспортталады." - "Файл қысқа уақыттан кейін экспортталады." - "Контактілер жуық арада экспортталады." - "vКартасын экспорттау өтініші қабылданбады. Кейінірек қайта әрекеттеніп көріңіз." - "контакт" - "vКарталарын жергілікті уақытша жадқа кэштеу. Импорттау жуық арада басталады." - "vКартасын экспорттау мүмкін болмады." - "ЖӨБ контактісі" - "Контактілер экспортталсын ба?" - "Кэштеу" - "%s/%s импортталуда: %s" - ".vcf файлына экспорттау" "Сұрыптау шарты" "Аты" "Тегі" "Ат пішімі" "Алдымен аты" "Алдымен тегі" - "Жаңа контактілерге арналған әдепкі есептік жазба" - "Контакт метадеректерін синхрондау" - "Контактілер туралы" - "Параметрлер" - "Көрінетін контактілерді бөлісу" - "Көрінетін контактілерді бөлісу сәтсіз аяқталды." - "Таңдаулы контактілерді бөлісу" - "Барлық контактілерді бөлісу" - "Контактілерді бөлісу сәтсіз аяқталды." - "Контактілерді импорттау/экспорттау" - "Контактілерді импорттау" - "Бұл контактіні бөлісу мүмкін болмады" - "Бөлісетін контактілер жоқ." - "Іздеу" - "Контактілерді табу" - "Сүйіктілер" - "Ешқандай контактілер жоқ." - "Ешқандай көрінетін контактілер жоқ." - "Таңдаулылар жоқ" - "%s контактілер жоқ" "Жиі қолданылғандары өшіру" - "SIM картасын таңдау" - "Есептік жазбаларды басқару" - "Импорттау/экспорттау" - "%1$s арқылы" - "%1$s дерегі %2$s арқылы" "іздеуді тоқтату" "Іздеуді өшіру" - "Контактілерді көрсету опциялары" "Есептік жазба" "Осыны қоңыраулар үшін әрқашан пайд." "Келесімен қоңырау шалу" @@ -248,19 +151,12 @@ "Қоңыраумен жіберу үшін ескертпе теріңіз ..." "ЖІБЕРУ ЖӘНЕ ҚОҢЫРАУ ШАЛУ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s қойындысы." %1$s қойындысы. %2$d оқылмаған элемент. %1$s қойындысы. %2$d оқылмаған элемент. - "Жинақ нұсқасы" - "Ашық бағдарлама лицензиялары" - "Ашық бастапқы код бағдарламасына арналған лицензия туралы мәліметтер" - "Құпиялылық саясаты" - "Қызмет көрсету шарттары" - "Бастапқы коды ашық бағдарлама лицензиялары" - "Url ашылған жоқ." "Бейне қоңырау" "Бөлісу және қоңырау шалу" diff --git a/java/com/android/contacts/common/res/values-km/strings.xml b/java/com/android/contacts/common/res/values-km/strings.xml index 503016792..f602dec8f 100644 --- a/java/com/android/contacts/common/res/values-km/strings.xml +++ b/java/com/android/contacts/common/res/values-km/strings.xml @@ -18,7 +18,6 @@ "បាន​ចម្លង​អត្ថបទ" - "ចម្លង​ទៅ​ក្ដារ​តម្បៀត​ខ្ទាស់" "ហៅ %s" "ហៅ​ទៅ​ផ្ទះ" "ហៅ​ទៅ​ទូរស័ព្ទ​ចល័ត" @@ -40,7 +39,6 @@ "ហៅ​ទៅ​ភេយ័រ​កន្លែង​ធ្វើការ" "ហៅ​ទៅ %s" "ហៅ MMS" - "%s (ហៅ)" "អត្ថបទ %s" "​សារ​ទៅ​​ផ្ទះ" "អត្ថបទ​ទូរស័ព្ទ​ចល័ត" @@ -62,7 +60,6 @@ "អត្ថបទ​ភេ​យ័រ​កន្លែង​ធ្វើការ" "អត្ថបទ %s" "អត្ថបទ MMS" - "%s (សារ)" "សម្អាត​ទំនាក់ទំនង​ញឹកញាប់?" "អ្នកនឹងជម្រះបញ្ជីដែលអ្នកទាក់ទងជាញឹកញាប់នៅក្នុងកម្មវិធីទូរស័ព្ទ និងទំនាក់ទំនង ហើយបង្ខំឲ្យកម្មវិធីអ៊ីមែលស្វែងយល់ពីចំណូលចិត្តទំនាក់ទំនងរបស់អ្នកតាំងពីដំបូង។" "សម្អាត​ទំនាក់ទំនង​ញឹកញាប់..." @@ -70,22 +67,14 @@ "ចាក​ឆ្ងាយ" "រវល់" "ទំនាក់ទំនង" + "បាន​ណែនាំ​​កម្រិត​ខ្ពស់" "ផ្សេងៗ" "ថត" "ថតកន្លែងការងារ" "ទំនាក់ទំនង​ទាំងអស់" + "ការ​ណែនាំ" "ខ្ញុំ" - "កំពុង​ស្វែងរក..." - "បាន​រក​ឃើញ​ច្រើន​ជាង %d ។" - "គ្មាន​ទំនាក់ទំនង" - - បាន​រកឃើញ %d - បាន​រកឃើញ 1 - - "ទំនាក់ទំនង​រហ័ស​សម្រាប់ %1$s" "(គ្មាន​ឈ្មោះ)" - "បាន​ហៅ​ញឹកញាប់" - "បាន​ទាក់ទង​ញឹកញាប់" "មើល​ទំនាក់ទំនង" "ទំនាក់ទំនង​ទាំងអស់​ដែល​មាន​លេខ​ទូរស័ព្ទ" "ទំនាក់ទំនងប្រវត្តិរូបការងារ" @@ -125,8 +114,6 @@ "អ៊ីមែល %s" "អ៊ីមែល" "ផ្លូវ" - "ប្រអប់​សំបុត្រ" - "អ្នក​ជិត​ខាង" "ទីក្រុង" "រដ្ឋ" "លេខ​កូដ​តំបន់" @@ -144,103 +131,19 @@ "ជជែក​ដោយ​ប្រើ ICQ" "ជជែក​ដោយ​ប្រើ Jabber" "ជជែក​​" - "លុប​" - "ពង្រីក ឬ​បង្រួម​វាល​ឈ្មោះ" - "ពង្រីក និងបង្រួមប្រអប់ឈ្មោះសូរសព្ទ" "ទំនាក់ទំនងទាំងអស់" - "រួចរាល់" - "បោះ​បង់​" "ទំនាក់ទំនង​នៅ​ក្នុង %s" "ទំនាក់ទំនង​ក្នុង​ទិដ្ឋភាព​ផ្ទាល់ខ្លួន" "ទំនាក់ទំនង​ទោល" - "រក្សាទំនាក់ទំនងដែលបាននាំចូលទៅ៖" - "នាំចូល​ពី​ស៊ីម​កាត" - "នាំចូល​ពី​ស៊ីម ^1 - ^2" - "នាំចូល​ពី​ស៊ីម %1$s" - "នាំចូូលពីឯកសារ .vcf" - "បោះបង់​ការ​នាំចូល %s ?" - "បោះបង់​ការ​នាំចេញ %s ?" - "មិន​អាច​បោះបង់​ការ​នាំចេញ/នាំចូល vCard" - "មិន​ស្គាល់​កំហុស។" - "មិន​អាច​បើក \"%s\"៖ %s." - "មិន​អាច​ចាប់ផ្ដើម​កម្មវិធី​នាំ​ចេញ៖ \"%s\" ។" - "មិន​មាន​ទំនាក់ទំនង​ដើម្បី​នាំចេញ​ទេ។" - "អ្នកបានបិទសិទ្ធិអនុញ្ញាតដែលតម្រូវឲ្យមាន។" - "មាន​កំហុស​កើតឡើង​ពេល​នាំចេញ៖ \"%s\" ។" - "ឈ្មោះ​ឯកសារ​ដែល​បាន​ទាមទារ​គឺ​វែង​ពេក (\"%s\") ។" - "កំហុស I/O" - "អង្គ​ចងចាំ​មិន​គ្រប់គ្រាន់ (ប្រហែលជា​ឯកសារ​ធំ​ពេក​)" - "មិន​អាច​ញែក vCard បាន​ព្រោះ​ហេតុផល​មិន​រំពឹង​ទុក។" - "មិន​គាំទ្រ​ទ្រង់ទ្រាយ។" - "មិន​អាច​ប្រមូល​ព័ត៌មាន​មេតា​របស់​ឯកសារ vCard ដែល​បាន​ផ្ដល់។" - "មាន​ឯកសារ​មួយ ឬ​ច្រើន​ដែល​មិន​អាច​នាំចូល (%s​) បាន​។" - "បាន​បញ្ចប់​ការ​នាំ​ចេញ %s ។" - "បានបញ្ចប់ការនាំចេញទំនាក់ទំនង។" - "បានបញ្ចប់ការនាំចេញទំនាក់ទំនង សូមចុចការជូនដំណឹងនោះដើម្បីចែករំលែកទំនាក់ទំនង" - "ប៉ះដើម្បីចែករំលែកទំនាក់ទំនង" - "បាន​បោះបង់​ការ​នាំចេញ %s ។" - "កំពុង​នាំចេញ​ព័ត៌មាន​ទំនាក់ទំនង" - "ទិន្នន័យចំណាំកំពុងត្រូវបាននាំចេញ" - "មិន​អាច​យក​ព័ត៌មាន​មូលដ្ឋាន​ទិន្នន័យ។" - "មិនមានទំនាក់ទំនងដែលអាចនាំចេញបានទេ។ ប្រសិនបើអ្នកពិតជាមានទំនាក់ទំនងនៅក្នុង​ឧបករណ៍​របស់អ្នកមែន នោះក្រុមហ៊ុនផ្ដល់ទិន្នន័យប្រហែលជាមិនអនុញ្ញាតឲ្យនាំចេញទំនាក់ទំនងទាំងនោះ​​ពី​ឧបករណ៍​​ទេ។" - "កម្មវិធី​តែង​របស់ vCard មិន​បាន​ចាប់ផ្ដើម​ត្រឹមត្រូវ​ទេ។" - "មិន​អាច​នាំចេញ" - "មិន​បាន​នាំចេញ​ព័ត៌មាន​ទំនាក់ទំនង។\nមូលហេតុ៖ \"%s\"" - "ការ​នាំចូល %s" - "មិន​អាច​អាន​ទិន្នន័យ vCard" - "បាន​បោះបង់​ការ​អាន​ទិន្នន័យ vCard" - "បាន​បញ្ចប់​ការ​នាំចូល vCard %s" - "បាន​បោះបង់​ការ​នាំចូល %s" - "នឹង​នាំចូល %s ក្នុង​ពេល​ឆាប់ៗ។" - "នឹង​នាំចូល​ឯកសារ​ក្នុង​ពេល​ឆាប់ៗ។" - "បាន​បដិសេធ​សំណើ​នាំចូល vCard ។ សូម​ព្យាយាម​ម្ដងទៀត​នៅ​ពេល​ក្រោយ​។" - "នឹង​នាំចេញ %s ក្នុង​ពេល​ឆាប់ៗ។" - "នឺងនាំចេញឯកសារក្នុងពេលឆាប់ៗ។" - "ទំនាក់ទំនងនឹងត្រូវបាននាំចេញក្នុងពេលបន្តិចទៀតនេះ" - "បាន​បដិសេធ​សំណើ​នាំចេញ vCard ។ សូម​ព្យាយាម​ម្ដងទៀត​នៅ​ពេល​ក្រោយ​។" - "ទំនាក់ទំនង" - "ការ​ផ្ទុក vCard(s​) ទៅកាន់​ឧបករណ៍​ផ្ទុក​បណ្ដោះអាសន្ន​មូលដ្ឋាន។ ការ​នាំ​ចូល​ពិតប្រាកដ​នឹង​ចាប់ផ្ដើម​ក្នុង​ពេល​ឆាប់ៗ។" - "មិន​អាច​នាំចូល vCard ។" - "ទំនាក់ទំនង​ដែល​បាន​ទទួល​តាម NFC" - "នាំចេញ​ទំនាក់ទំនង?" - "ការ​ផ្ទុក​ក្នុង​ឃ្លាំង​សម្ងាត់" - "កំពុង​នាំចូល %s/%s%s" - "នាំចេញទៅឯកសារ .vcf" "តម្រៀប​តាម" "នាម​ខ្លួន" "នាមត្រកូល" "ទម្រង់ឈ្មោះ" "នាម​ខ្លួន​មុន" "នាមត្រកូល​មុន" - "គណនីលំនាំដើមសម្រាប់ទំនាក់ទំនងថ្មី" - "ធ្វើសមកាលកម្មទិន្នន័យមេតា" - "អំពីទំនាក់ទំនង" - "ការ​កំណត់" - "ចែករំលែក​ទំនាក់ទំនង​ដែល​អាច​មើល​ឃើញ" - "បានបរាជ័យក្នុងការចែករំលែកទំនាក់ទំនងដែលអាចមើលឃើញ។" - "ចែករំលែកទំនាក់ទំនងសំណព្វចិត្ត" - "ចែករំលែកទំនាក់ទំនងទាំងអស់" - "បរាជ័យក្នុងការចែករំលែកទំនាក់ទំនង" - "នាំចេញ/នាំចូល​ទំនាក់ទំនង" - "នាំចូល​ទំនាក់ទំនង" - "ទំនាក់ទំនង​នេះ​មិន​អាច​ចែករំលែក​បាន​ទេ។" - "មិនមានទំនាក់ទំនងដើម្បីចែករំលែកទេ" - "ស្វែងរក" - "រក​ទំនាក់ទំនង" - "សំណព្វ" - "មិន​មាន​ទំនាក់ទំនង។" - "មើល​មិន​ឃើញ​ទំនាក់ទំនង។" - "គ្មានសំណព្វទេ" - "មិន​មាន​ទំនាក់ទំនង​នៅ​ក្នុង %s" "សម្អាត​ញឹកញាប់" - "ជ្រើស​ស៊ី​ម​កាត" - "គ្រប់គ្រងគណនី" - "នាំចេញ/នាំចូល" - "តាមរយៈ %1$s" - "%1$s តាមរយៈ %2$s" "បញ្ឈប់​ការ​ស្វែងរក" "សម្អាត​ការ​ស្វែងរក" - "ជម្រើស​បង្ហាញ​ទំនាក់ទំនង" "គណនី" "ប្រើ​វា​សម្រាប់​ការ​ហៅ​ជា​និច្ច" "ហៅ​ជាមួយ" @@ -248,19 +151,12 @@ "វាយបញ្ចូលចំណាំដែលត្រូវផ្ញើជាមួយការហៅទូរស័ព្ទ ..." "ផ្ញើ & ហៅ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "ផ្ទាំង %1$s។" ផ្ទាំង %1$s។ ធាតុមិនទាន់​អាន %2$d ផ្ទាំង %1$s។ ធាតុមិនទាន់​អាន %2$d - "កំណែបង្កើត" - "អាជ្ញាប័ណ្ណប្រភពកូដចំហ" - "សេចក្ដីលម្អិតអាជ្ញាបណ្ណសម្រាប់កម្មវិធីប្រភពកូដបើកចំហ" - "គោលនយោបាយ​ភាព​​ឯកជន​" - "លក្ខខណ្ឌប្រើប្រាស់" - "អាជ្ញាប័ណ្ណប្រភពកូដចំហ" - "បាន​បរាជ័យ​ក្នុង​ការ​បើក URL។" "ការ​ហៅវីដេអូ" "ចែករំលែក និង​ហៅ​ទូរសព្ទ" diff --git a/java/com/android/contacts/common/res/values-kn/strings.xml b/java/com/android/contacts/common/res/values-kn/strings.xml index 446e078a6..08ac7db67 100644 --- a/java/com/android/contacts/common/res/values-kn/strings.xml +++ b/java/com/android/contacts/common/res/values-kn/strings.xml @@ -18,7 +18,6 @@ "ಪಠ್ಯವನ್ನು ನಕಲಿಸಲಾಗಿದೆ" - "ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಿ" "%s ಕರೆ ಮಾಡಿ" "ಮನೆಗೆ ಕರೆ ಮಾಡಿ" "ಮೊಬೈಲ್‌‌ಗೆ ಕರೆ ಮಾಡಿ" @@ -40,7 +39,6 @@ "ಕೆಲಸದ ಪೇಜರ್‌‌ಗೆ ಕರೆ ಮಾಡಿ" "%s ಕರೆ ಮಾಡಿ" "MMS ಕರೆ ಮಾಡಿ" - "%s (ಕರೆ ಮಾಡಿ)" "%s ಗೆ ಸಂದೇಶ ಮಾಡಿ" "ನಿವಾಸಕ್ಕೆ ಸಂದೇಶ ಮಾಡಿ" "ಮೊಬೈಲ್‌‌ಗೆ ಸಂದೇಶ ಮಾಡಿ" @@ -62,7 +60,6 @@ "ಕೆಲಸದ ಪೇಜರ್‌‌ಗೆ ಸಂದೇಶ ಮಾಡಿ" "%s ಗೆ ಸಂದೇಶ ಮಾಡಿ" "MMS ಸಂದೇಶ ಮಾಡಿ" - "%s (ಸಂದೇಶ ಕಳುಹಿಸಿ)" "ಪದೇ ಪದೇ ಸಂಪರ್ಕಿಸಿರುವುದನ್ನು ತೆರುವುಗೊಳಿಸುವುದೇ?" "ಸಂಪರ್ಕಗಳು ಮತ್ತು ಫೋನ್‌ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ ಪದೇ ಪದೇ ಸಂಪರ್ಕಪಡಿಸಿರುವ ಪಟ್ಟಿಯನ್ನು ನೀವು ತೆರುವುಗೊಳಿಸುತ್ತೀರಿ ಮತ್ತು ಮೊದಲಿನಿಂದ ನಿಮ್ಮ ವಿಳಾಸ ಪ್ರಾಶಸ್ತ್ಯಗಳನ್ನು ತಿಳಿಯಲು ಇಮೇಲ್‌ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಒತ್ತಾಯಿಸಿ." "ಪದೇ ಪದೇ ಸಂಪರ್ಕಿಸಿರುವುದನ್ನು ತೆರುವುಗೊಳಿಸಲಾಗುತ್ತಿದೆ…" @@ -70,22 +67,14 @@ "ದೂರ" "ಕಾರ್ಯನಿರತ" "ಸಂಪರ್ಕಗಳು" + "ಉನ್ನತ ಸಲಹೆ" "ಇತರೆ" "ಡೈರೆಕ್ಟರಿ" "ಕೆಲಸದ ಡೈರೆಕ್ಟರಿ" "ಎಲ್ಲಾ ಸಂಪರ್ಕಗಳು" + "ಸಲಹೆಗಳು" "ನಾನು" - "ಹುಡುಕಲಾಗುತ್ತಿದೆ…" - "%d ಗಿಂತ ಹೆಚ್ಚಾಗಿ ಕಂಡುಬಂದಿದೆ." - "ಯಾವುದೇ ಸಂಪರ್ಕಗಳಿಲ್ಲ" - - %d ಕಂಡುಬಂದಿವೆ - %d ಕಂಡುಬಂದಿವೆ - - "%1$s ಇವರಿಗಾಗಿ ತಕ್ಷಣದ ಸಂಪರ್ಕ" "(ಯಾವುದೇ ಹೆಸರಿಲ್ಲ)" - "ಪದೇ ಪದೇ ಕರೆ ಮಾಡಲಾಗಿದೆ" - "ಪದೇ ಪದೇ ಸಂಪರ್ಕಿಸಿರುವುದು" "ಸಂಪರ್ಕವನ್ನು ವೀಕ್ಷಿಸಿ" "ಫೋನ್‌ ಸಂಖ್ಯೆಗಳೊಂದಿಗೆ ಎಲ್ಲ ಸಂಪರ್ಕಗಳು" "ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಸಂಪರ್ಕಗಳು" @@ -125,8 +114,6 @@ "%s ಇಮೇಲ್‌ ಮಾಡಿ" "ಇಮೇಲ್" "ಗಲ್ಲಿ" - "PO ಬಾಕ್ಸ್‌" - "ನೆರೆಹೊರೆ" "ನಗರ" "ರಾಜ್ಯ" "ಪಿನ್ ಕೋಡ್" @@ -144,103 +131,19 @@ "ICQ ಬಳಸಿಕೊಂಡು ಚಾಟ್‌ ಮಾಡಿ" "Jabber ಬಳಸಿಕೊಂಡು ಚಾಟ್‌ ಮಾಡಿ" "ಚಾಟ್" - "ಅಳಿಸಿ" - "ಹೆಸರಿನ ಕ್ಷೇತ್ರಗಳನ್ನು ವಿಸ್ತರಿಸಿ ಅಥವಾ ಸಂಕುಚಿಸಿ" - "ಫೊನೆಟಿಕ್ ಹೆಸರಿನ ಕ್ಷೇತ್ರಗಳನ್ನು ವಿಸ್ತರಿಸಿ ಅಥವಾ ಸಂಕುಚಿಸಿ" "ಎಲ್ಲ ಸಂಪರ್ಕಗಳು" - "ಮುಗಿದಿದೆ" - "ರದ್ದುಮಾಡಿ" "%s ನಲ್ಲಿ ಸಂಪರ್ಕಗಳು" "ಕಸ್ಟಮ್‌ ವೀಕ್ಷಣೆಯಲ್ಲಿನ ಸಂಪರ್ಕಗಳು" "ಏಕೈಕ ಸಂಪರ್ಕ" - "ಆಮದು ಮಾಡಲಾದ ಸಂಪರ್ಕಗಳನ್ನು ಇಲ್ಲಿ ಉಳಿಸಿ:" - "ಸಿಮ್‌ ಕಾರ್ಡ್‌ನಿಂದ ಆಮದು ಮಾಡಿ" - "^1 - ^2 SIM ನಿಂದ ಆಮದು ಮಾಡಿ" - "%1$s SIM ನಿಂದ ಆಮದು ಮಾಡಿ" - ".vcf ಫೈಲ್‌ನಿಂದ ಆಮದು ಮಾಡಿ" - "%s ಆಮದು ಮಾಡುವುದನ್ನು ರದ್ದುಗೊಳಿಸುವುದೇ?" - "%s ಅನ್ನು ರಫ್ತು ಮಾಡುವುದನ್ನು ರದ್ದುಗೊಳಿಸುವುದೇ?" - "vCard ಆಮದು/ರಫ್ತು ಮಾಡುವುದನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ" - "ಅಪರಿಚಿತ ದೋಷ." - "\"%s\" ಅನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ: %s." - "ರಫ್ತುದಾರರನ್ನು ಪ್ರಾರಂಭಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ: \"%s\"." - "ಯಾವುದೇ ರಫ್ತುಮಾಡಬಹುದಾದ ಸಂಪರ್ಕವಿಲ್ಲ." - "ನೀವು ಅಗತ್ಯವಿರುವ ಅನುಮತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿರುವಿರಿ." - "ರಫ್ತು ಮಾಡುವ ಸಂದರ್ಭದಲ್ಲಿ ದೋಷವೊಂದು ಕಂಡುಬಂದಿದೆ: \"%s\"." - "ಅಗತ್ಯವಿರುವ ಫೈಲ್‌‌ ಹೆಸರು ತುಂಬಾ ದೊಡ್ಡದಾಗಿದೆ (\"%s\")." - "I/O ದೋಷ" - "ಸಾಕಷ್ಟು ಮೆಮೊರಿ ಇಲ್ಲ. ಫೈಲ್‌ ತುಂಬಾ ದೊಡ್ಡದಾಗಿರಬಹುದು." - "ಅನಿರೀಕ್ಷಿತ ಕಾರಣದಿಂದಾಗಿ vCard ಪಾರ್ಸ್ ಮಾಡಲಾಗಲಿಲ್ಲ." - "ಸ್ವರೂಪಕ್ಕೆ ಬೆಂಬಲವಿಲ್ಲ." - "ನೀಡಿದ vCard ಫೈಲ್‌(ಗಳ) ಮೆಟಾ ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ." - "ಒಂದು ಅಥವಾ ಹೆಚ್ಚಿನ ಫೈಲ್‌ಗಳನ್ನು ಆಮದು ಮಾಡಲಾಗುವುದಿಲ್ಲ (%s)." - "%s ರಫ್ತು ಮುಗಿದಿದೆ." - "ಸಂಪರ್ಕಗಳ ರಫ್ತು ಮಾಡುವಿಕೆ ಮುಗಿದಿದೆ." - "ಸಂಪರ್ಕಗಳನ್ನು ಆಮದು ಮಾಡುವುದನ್ನು ಮುಕ್ತಾಯಗೊಳಿಸಲಾಗಿದೆ, ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಅಧಿಸೂಚನೆ ಕ್ಲಿಕ್ ಮಾಡಿ." - "ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಟ್ಯಾಪ್ ಮಾಡಿ." - "%s ರಫ್ತು ಮಾಡುವುದನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ." - "ಸಂಪರ್ಕ ಡೇಟಾವನ್ನು ರಫ್ತುಮಾಡಲಾಗುತ್ತಿದೆ" - "ಸಂಪರ್ಕ ಡೇಟಾವನ್ನು ಆಮದು ಮಾಡಲಾಗುತ್ತಿದೆ." - "ಡೇಟಾಬೇಸ್ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲಾಗಲಿಲ್ಲ." - "ಯಾವುದೇ ರಫ್ತುಮಾಡುವಂತಹ ಸಂಪರ್ಕಗಳಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ನೀವು ಸಂಪರ್ಕಗಳನ್ನು ಹೊಂದಿದ್ದರೆ, ಸಾಧನದಿಂದ ರಫ್ತು ಮಾಡಲಿರುವ ಸಂಪರ್ಕಗಳಿಗೆ ಕೆಲವು ಡೇಟಾ ಪೂರೈಕೆದಾರರು ಅನುಮತಿ ನೀಡದಿರಬಹುದು." - "vCard ಸಂಯೋಜಕ ಸರಿಯಾಗಿ ಪ್ರಾರಂಭವಾಗಿಲ್ಲ." - "ರಫ್ತು ಮಾಡಲಾಗುವುದಿಲ್ಲ" - "ಸಂಪರ್ಕ ಡೇಟಾವನ್ನು ರಫ್ತು ಮಾಡಲಿಲ್ಲ.\nಕಾರಣ: \"%s\"" - "%s ಆಮದು ಮಾಡಲಾಗುತ್ತಿದೆ" - "vCard ಡೇಟಾವನ್ನು ಓದಲಾಗಲಿಲ್ಲ" - "vCard ಡೇಟಾ ಓದುವಿಕೆ ರದ್ದಗೊಳಿಸಲಾಗಿದೆ" - "%s vCard ಆಮದು ಮುಕ್ತಾಯಗೊಂಡಿದೆ" - "%s ಆಮದು ರದ್ದುಪಡಿಸಲಾಗಿದೆ" - "%s ಅನ್ನು ಸ್ವಲ್ಪ ಸಮಯದಲ್ಲಿ ಆಮದು ಮಾಡಲಾಗುತ್ತದೆ." - "ಫೈಲ್‌ ಅನ್ನು ಸ್ವಲ್ಪ ಸಮಯದಲ್ಲಿ ಆಮದು ಮಾಡಲಾಗುತ್ತದೆ." - "vCard ಆಮದು ವಿನಂತಿಯನ್ನು ತಿರಸ್ಕರಿಸಲಾಗಿದೆ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ." - "%s ಸ್ವಲ್ಪ ಸಮಯದಲ್ಲಿ ರಫ್ತು ಮಾಡಲಾಗುತ್ತದೆ." - "ಫೈಲ್‌ ಅನ್ನು ಸ್ವಲ್ಪ ಸಮಯದಲ್ಲಿ ರಪ್ತು ಮಾಡಲಾಗುತ್ತದೆ." - "ಸಂಪರ್ಕಗಳನ್ನು ಶೀಘ್ರದಲ್ಲೇ ಆಮದು ಮಾಡಲಾಗುತ್ತದೆ." - "vCard ರಫ್ತು ವಿನಂತಿಯನ್ನು ತಿರಸ್ಕರಿಸಲಾಗಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ." - "ಸಂಪರ್ಕ" - "vCard(ಗಳು) ಅನ್ನು ಸ್ಥಳೀಯ ತಾತ್ಕಾಲಿಕ ಸಂಗ್ರಹಣೆಗೆ ಸಂಗ್ರಹ ಮಾಡಲಾಗುತ್ತಿದೆ. ನಿಜವಾದ ಆಮದು ಶೀಘ್ರದಲ್ಲೇ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ." - "vCard ಆಮದು ಮಾಡಲಾಗಿಲ್ಲ." - "NFC ಮೂಲಕ ಸ್ವೀಕರಿಸಲಾದ ಸಂಪರ್ಕ" - "ಸಂಪರ್ಕಗಳನ್ನು ರವಾನಿಸುವುದೇ?" - "ಸಂಗ್ರಹಿಸಲಾಗುತ್ತಿದೆ" - "%s/%s ಆಮದು ಮಾಡಲಾಗುತ್ತಿದೆ: %s" - ".vcf ಫೈಲ್‌ಗೆ ರಫ್ತು ಮಾಡಿ" "ಈ ಪ್ರಕಾರ ವಿಂಗಡಿಸು" "ಮೊದಲ ಹೆಸರು" "ಕೊನೆಯ ಹೆಸರು" "ಹೆಸರಿನ ಫಾರ್ಮ್ಯಾಟ್‌" "ಮೊದಲ ಹೆಸರು ಮೊದಲು" "ಕೊನೆಯ ಹೆಸರು ಮೊದಲು" - "ಹೊಸ ಸಂಪರ್ಕಗಳಿಗೆ ಡಿಫಾಲ್ಟ್‌ ಖಾತೆ" - "ಸಂಪರ್ಕ ಮೆಟಾಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಿ" - "ಸಂಪರ್ಕಗಳ ಕುರಿತು" - "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" - "ಗೋಚರಿಸುವ ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ" - "ಗೋಚರಿಸುವ ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ವಿಫಲವಾಗಿದೆ." - "ಮೆಚ್ಚಿನ ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ" - "ಎಲ್ಲ ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಿ" - "ಸಂಪರ್ಕಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ವಿಫಲವಾಗಿದೆ." - "ಸಂಪರ್ಕಗಳನ್ನು ಆಮದು/ರವಾನೆ ಮಾಡಿ" - "ಸಂಪರ್ಕಗಳನ್ನು ಆಮದು ಮಾಡಿ" - "ಈ ಸಂಪರ್ಕವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ." - "ಹಂಚಿಕೊಳ್ಳಲು ಯಾವುದೇ ಸಂಪರ್ಕಗಳಿಲ್ಲ." - "ಹುಡುಕಿ" - "ಸಂಪರ್ಕಗಳನ್ನು ಹುಡುಕಿ" - "ಮೆಚ್ಚಿನವುಗಳು" - "ಯಾವುದೇ ಸಂಪರ್ಕಗಳಿಲ್ಲ." - "ಯಾವುದೇ ಗೋಚರಿಸುವ ಸಂಪರ್ಕಗಳಿಲ್ಲ." - "ಯಾವುದೇ ಮೆಚ್ಚಿನವುಗಳಿಲ್ಲ" - "%s ರಲ್ಲಿ ಯಾವುದೇ ಸಂಪರ್ಕಗಳಿಲ್ಲ" "ಪುನರಾವರ್ತನೆಗಳನ್ನು ತೆರುವುಗೊಳಿಸಿ" - "ಸಿಮ್‌ ಕಾರ್ಡ್ ಆಯ್ಕೆಮಾಡಿ" - "ಖಾತೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ" - "ಆಮದು/ರವಾನೆ ಮಾಡು" - "%1$s ಮೂಲಕ" - "%1$s %2$s ಮೂಲಕ" "ಹುಡುಕಾಟವನ್ನು ನಿಲ್ಲಿಸಿ" "ಹುಡುಕಾಟವನ್ನು ತೆರವುಗೊಳಿಸಿ" - "ಸಂಪರ್ಕ ಡಿಸ್‌ಪ್ಲೇ ಆಯ್ಕೆಗಳು" "ಖಾತೆ" "ಕರೆಗಳನ್ನು ಮಾಡಲು ಯಾವಾಗಲೂ ಇದನ್ನು ಬಳಸಿ" "ಇದರೊಂದಿಗೆ ಕರೆ ಮಾಡಿ" @@ -248,19 +151,12 @@ "ಕರೆ ಕಳುಹಿಸಲು ಟಿಪ್ಪಣಿಯನ್ನು ಟೈಪ್ ಮಾಡಿ ..." "ಕಳುಹಿಸು ಮತ್ತು ಕರೆಮಾಡು" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ಟ್ಯಾಬ್." %1$s ಟ್ಯಾಬ್. %2$d ಓದದಿರುವ ಐಟಂಗಳು. %1$s ಟ್ಯಾಬ್. %2$d ಓದದಿರುವ ಐಟಂಗಳು. - "ಬಿಲ್ಡ್ ಆವೃತ್ತಿ" - "ಮುಕ್ತ ಮೂಲ ಪರವಾನಗಿಗಳು" - "ಮುಕ್ತ ಮೂಲ ಸಾಫ್ಟ್‌ವೇರ್‌ಗಾಗಿ ಪರವಾನಗಿ ವಿವರಗಳು" - "ಗೌಪ್ಯತೆ ನೀತಿ" - "ಸೇವಾ ನಿಯಮಗಳು" - "ಮುಕ್ತ ಮೂಲ ಪರವಾನಗಿಗಳು" - "url ತೆರೆಯಲು ವಿಫಲವಾಗಿದೆ." "ವೀಡಿಯೊ ಕರೆ" "ಹಂಚಿಕೊಳ್ಳಿ ಮತ್ತು ಕರೆ ಮಾಡಿ" diff --git a/java/com/android/contacts/common/res/values-ko/strings.xml b/java/com/android/contacts/common/res/values-ko/strings.xml index 4c2bd4f62..3f4eafce8 100644 --- a/java/com/android/contacts/common/res/values-ko/strings.xml +++ b/java/com/android/contacts/common/res/values-ko/strings.xml @@ -18,7 +18,6 @@ "텍스트 복사됨" - "클립보드에 복사" "%s(으)로 전화걸기" "집으로 전화걸기" "휴대전화로 전화걸기" @@ -40,7 +39,6 @@ "직장 호출기로 전화 걸기" "%s(으)로 전화걸기" "MMS로 전화걸기" - "%s(전화)" "%s에 문자 보내기" "집으로 문자 보내기" "휴대전화로 문자 보내기" @@ -62,7 +60,6 @@ "직장 호출기로 문자 보내기" "%s(으)로 문자 보내기" "MMS로 문자 보내기" - "%s(메시지)" "자주 연락하는 사람들 목록을 삭제하시겠습니까?" "주소록 및 휴대전화 앱에서 자주 연락하는 사람의 목록을 삭제하고 이메일 앱이 주소록 환경설정을 처음부터 다시 반영하도록 합니다." "자주 연락하는 사람들 목록을 삭제하는 중…" @@ -70,22 +67,14 @@ "자리 비움" "다른 용무 중" "주소록" + "인기 추천" "기타" "디렉토리" "직장 디렉토리" "모든 연락처" + "추천" "나" - "검색 중..." - "%d개 이상 찾았습니다." - "주소록이 없습니다." - - %d개 찾음 - 1개 찾음 - - "%1$s님의 빠른 주소록" "(이름 없음)" - "자주 통화한 목록" - "자주 연락하는 사람들" "연락처 보기" "전화번호가 포함된 모든 연락처" "직장 프로필 연락처" @@ -125,8 +114,6 @@ "%s에 이메일 보내기" "이메일 보내기" "도로명" - "사서함" - "인근 지역" "시" "도" "우편번호" @@ -144,103 +131,19 @@ "ICQ로 채팅" "Jabber로 채팅" "채팅" - "삭제" - "이름 입력란 펼치기/접기" - "이름(소리나는 대로) 입력란 펼치기 또는 접기" "모든 연락처" - "완료" - "취소" "%s의 주소록" "주소록 맞춤 보기" "단일 연락처" - "가져온 주소록을 저장할 계정:" - "SIM 카드에서 가져오기" - "SIM ^1 - ^2에서 가져오기" - "SIM %1$s에서 가져오기" - ".VCF 파일에서 가져오기" - "%s 가져오기를 취소하시겠습니까?" - "%s 내보내기를 취소하시겠습니까?" - "vCard 가져오기/내보내기를 취소하지 못했습니다." - "알 수 없는 오류입니다." - "\'%s\'을(를) 열지 못했습니다. 이유: %s" - "내보내기를 시작하지 못했습니다. 이유: \'%s\'" - "내보낼 수 있는 연락처가 없습니다." - "필수 권한을 사용 중지했습니다." - "내보내는 중에 오류가 발생했습니다. 이유: \'%s\'" - "필수 파일 이름이 너무 깁니다(\'%s\')." - "I/O 오류" - "메모리가 부족합니다. 파일이 너무 크기 때문일 수 있습니다." - "예기치 못한 이유로 인해 vCard를 파싱하지 못했습니다." - "지원되지 않는 형식입니다." - "지정한 vCard 파일에 대한 메타 정보를 수집하지 못했습니다." - "하나 이상의 파일을 가져오지 못했습니다(%s)." - "%s 내보내기 완료됨" - "연락처 내보내기 완료" - "연락처 내보내기가 끝나면 알림을 클릭하여 연락처를 공유하세요." - "연락처를 공유하려면 탭하세요." - "%s 내보내기 취소됨" - "연락처 데이터 내보내기" - "연락처 데이터를 내보내는 중입니다." - "데이터베이스 정보를 가져오지 못했습니다." - "내보낼 수 있는 연락처가 없습니다. 기기에 연락처가 있다면 일부 데이터 제공업체에서 연락처를 기기에서 내보내지 못하도록 했기 때문일 수 있습니다." - "vCard 작성기가 제대로 시작되지 않았습니다." - "내보내기 실패" - "주소록 데이터를 내보내지 못했습니다.\n(이유: \'%s\')" - "%s 가져오는 중" - "vCard 데이터를 읽지 못함" - "vCard 데이터 읽기 취소" - "%s vCard 가져오기 완료됨" - "%s 가져오기 취소됨" - "%s을(를) 곧 가져옵니다." - "파일을 곧 가져옵니다." - "vCard 가져오기 요청이 거부되었습니다. 나중에 다시 시도해 주세요." - "%s을(를) 곧 내보냅니다." - "파일을 곧 내보냅니다." - "곧 연락처를 내보냅니다." - "vCard 내보내기 요청이 거부되었습니다. 나중에 다시 시도해 주세요." - "연락처" - "vCard를 로컬 임시 저장공간에 캐시하는 중입니다. 곧 가져오기가 시작됩니다." - "vCard를 가져오지 못했습니다." - "NFC를 통해 받은 연락처" - "주소록을 내보내시겠습니까?" - "캐시" - "%s/%s 가져오는 중: %s" - ".VCF 파일로 내보내기" "정렬 기준:" "이름" "성" "이름 형식" "이름 먼저" "성 먼저" - "새 연락처에 대한 기본 계정" - "연락처 메타데이터 동기화" - "주소록 정보" - "설정" - "표시되는 연락처 모두 공유" - "표시되는 연락처를 공유하지 못했습니다." - "자주 사용하는 연락처 공유" - "모든 연락처 공유" - "연락처를 공유할 수 없습니다." - "주소록 가져오기/내보내기" - "주소록 가져오기" - "연락처를 공유할 수 없습니다." - "공유할 연락처가 없습니다." - "검색" - "연락처 찾기" - "즐겨찾기" - "연락처가 없습니다." - "표시할 수 있는 연락처가 없습니다." - "즐겨찾기가 없습니다." - "%s에 연락처가 없습니다." "자주 연락하는 사람 목록 삭제" - "SIM 카드 선택" - "계정 관리" - "가져오기/내보내기" - "출처: %1$s" - "%1$s(출처: %2$s)" "검색 중지" "검색창 지우기" - "연락처 표시 옵션" "계정" "통화에 항상 사용" "통화에 사용할 SIM" @@ -248,19 +151,12 @@ "통화에 함께 전송할 메모를 입력하세요..." "보내기 및 전화 걸기" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s 탭" %1$s 탭. 읽지 않은 항목 %2$d %1$s 탭. 읽지 않은 항목 %2$d - "빌드 버전" - "오픈소스 라이선스" - "오픈소스 소프트웨어 라이선스 세부정보" - "개인정보처리방침" - "서비스 약관" - "오픈소스 라이선스" - "URL을 열지 못했습니다." "화상 통화" "공유 및 전화 걸기" diff --git a/java/com/android/contacts/common/res/values-ky/strings.xml b/java/com/android/contacts/common/res/values-ky/strings.xml index e5bab4550..3a0f0c377 100644 --- a/java/com/android/contacts/common/res/values-ky/strings.xml +++ b/java/com/android/contacts/common/res/values-ky/strings.xml @@ -18,7 +18,6 @@ "SMS көчүрүлдү" - "Алмашуу буферине көчүрүү" "Чалуу %s" "Үйгө чалуу" "Мобилге чалуу" @@ -40,7 +39,6 @@ "Жумушчу пейжерге чалуу" "Чалуу %s" "MMS номурна чалуу" - "%s (Чалуу)" "SMS %s" "Үйгө SMS жөнөтүү" "Мобилге SMS жөнөтүү" @@ -62,7 +60,6 @@ "Жумушчу пейжерге SMS жөнөтүү" "Текст жөнөтүү %s" "MMS телефонго SMS жөнөтүү" - "%s (Билдирүү жөнөтүү)" "Көп чалынгандар тизмеси тазалансынбы?" "Байланыштар жана Телефон колдонмолорунан көп байланышкан адамдар тизмесин тазалап, даректүү жеке жөндөөлөр тууралуу билүү үчүн электрондук почта колдонмолорун иштетиңиз." "Көп чалынгандар тизмеси тазаланууда…" @@ -70,22 +67,14 @@ "Чыгып кетти" "Бош эмес" "Байланыштар" + "Эң көп сунушталгандар" "Башка" "Директорий" "Жумуш профилиндеги байланыштар китепчеси" "Бардык байланыштар" + "Сунуштар" "Мен" - "Изделүүдө…" - "%d ашык табылды." - "Байланыштар жок" - - %d табылды - 1 табылды - - "%1$s үчүн тез байланышуу" "(Аты жок)" - "Көп чалынган" - "Көп байланышып турган" "Байланыштын чоо-жайын карап көрүү" "Телефон номерлери бар бардык байланыштар" "Жумуш профилиндеги байланыштар" @@ -125,8 +114,6 @@ "Кат жазуу (%s)" "Электрондук кат жазуу" "Көчөсү" - "Абонент кутусу" - "Району" "Шаары" "Облусу" "Индекси" @@ -144,103 +131,19 @@ "ICQ аркылуу чатташуу" "Jabber аркылуу чатташуу" "Чат" - "жок кылуу" - "Аттар талааларын жаюу же түрүү" - "Фонетикалык аталыш талааларын жайып көрсөтүү же жыйыштыруу" "Бардык байланыштар" - "Даяр" - "Жокко чыгаруу" "%s байланыштары" "Байланыштардын ыңгайлаштырылган көрүнүшү" "Жалгыз байланыш" - "Импорттолгон байланыштар төмөнкүгө сакталсын:" - "SIM-картадан импорттоо" - "SIM ^1^2 ичинен импорттоо" - "SIM %1$s ичинен импорттоо" - ".vcf файлынан импорттоо" - "%s импортто токтотулсунбу?" - "%s экспорттоо токтотулсунбу?" - "vCard импортоо/экспортоо токтотулбады." - "Белгисиз ката." - "\"%s\" ачылбай жатат: %s." - "Экспортчу башталбай жатат: \"%s\"." - "Экспортко жарактуу байланыш жок." - "Керектүү уруксатты өчүрүп койгонсуз." - "Экспорттоо учурунда ката кетти: \"%s\"." - "Талап кылынган файл аты өтө узун (\"%s\")." - "I/O катасы" - "Эс тутум жетишсиз. Файл өтө чоң окшойт." - "Аныкталбаган себептерден улам vCard\'ды талданбай албай жатат." - "Бул формат колдоого алынбайт." - "Берилген vCard файл(дар)ынын мета маалыматтарын чогултуу мүмкүн болбой жатат." - "Бир же эки файл импорттолбой жатат (%s)." - "%s экспорттоо аяктады." - "Байланыштар өткөрүлүп бүттү." - "Байланыштар өткөрүлүп берилди, байланыштар менен бөлүшүү үчүн эскертмени басыңыз." - "Байланыштар менен бөлүшүү үчүн таптап коюңуз." - "%s экспортто токтотулду." - "Байланыш берилиштери экспорттолууда" - "Байланыштын чоо-жайы өткөрүлүп берилүүдө." - "Берилиштер корунун маалыматтарын алуу мүмкүн эмес." - "Экспорттоло турган байланыштар жок. Эгер байланыштар түзмөгүңүздө болсо, айрым дайындарды камсыздоочулар байланыштарды түзмөктөн экспорттоого жол бербеши мүмкүн." - "vCard түзүүчү туура эмес иштеп баштады." - "Экспорттоо мүмкүн эмес" - "Байланыш маалыматтары экспорттолгон жок.\nСебеби: \"%s\"" - "%s импорттолууда" - "vCard берилиштерин окуу мүмкүн эмес" - "vCard берилиштерин окуу токтотулду" - "%s vCard импорттолуп бүттү" - "%s файлын импорттоо токтотулду" - "%s жакынкы убакытта импорттолот." - "Файл жакынкы убакытта импорттолот." - "vCard импорттоо талабы четке кагылды. Кийинчерээк кайра аракеттениңиз." - "%s жакынкы убакытта экспорттолот." - "Файл бир аздан кийин өткөрүлүп берилет." - "Байланыштар жакында өткөрүлүп берилет." - "vCard экспорттоо талабы четке кагылды. Кийинчерээк кайра аракеттениңиз." - "байланыш" - "vCard(дар) жергиликтүү убактылуу жайга топтолууда. Чыныгы импорт жакында башталат." - "vCard импорт кылынган жок." - "Байланыш NFC аркылуу алынды" - "Байланыштар экспорттолсунбу?" - "Топтоо" - "%s/%s: %s импорттолууда" - ".vcf файлга экспорттоо" "Төмөнкү боюнча иреттештирүү" "Ысымы" "Фамилиясы" "Ысым форматы" "Биринчи ысымы" "Биринчи фамилиясы" - "Жаңы байланыштар үчүн демейки каттоо эсеби" - "Байланыш метадайындарын шайкештирүү" - "Байланыштар жөнүндө" - "Жөндөөлөр" - "Көрүнүктүү байланыштарды бөлүшүү" - "Көрүнүктүү байланыштар бөлүшүлбөй койду." - "Сүйүктүү байланыштарды бөлүшүү" - "Бардык байланыштарды бөлүшүү" - "Байланыштар бөлүшүлбөй калды." - "Байланыштарды өткөрүп алуу/берүү" - "Байланыштарды өткөрүп алуу" - "Бул байланышты бөлүшүү мүмкүн эмес." - "Бөлүшө турган байланыштар жок." - "Издөө" - "Байланыштарды табуу" - "Сүйүктүүлөр" - "Эч бир байланыш жок." - "Көрүнүктүү байланыштар жок." - "Сүйүктүүлөр тизмеси бош" - "%s ичинде байланыштар жок" "Көп чалуулар тизмесин тазалоо" - "SIM карта тандаңыз" - "Каттоо эсептерин башкаруу" - "Импорттоо/экспорттоо" - "%1$s аркылуу" - "%1$s %2$s аркылуу" "издөөнү токтотуу" "Издөөнү тазалоо" - "Байланышты көрсөтүү параметрлери" "Каттоо эсеби" "Бул ар дайым чалуулр үчн колдонулсн" "Төмөнкү менен чалуу" @@ -248,19 +151,12 @@ "Чалуу менен жөнөтүлө турган кыска жазууну териңиз …" "ЖӨНӨТҮҮ ЖАНА ЧАЛУУ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "\"%1$s\" өтмөгү." \"%1$s\" өтмөгү. %2$d нерсе окула элек. \"%1$s\" өтмөгү. %2$d нерсе окула элек. - "Куралыш версиясы" - "Ачык программа уруксаттамалары" - "Баштапкы коду ачык программанын уруксаттамасынын чоо-жайы" - "Купуялуулук саясаты" - "Тейлөө шарттары" - "Ачык программа уруксаттамалары" - "url ачылбай калды." "Видео чалуу" "Бөлүшүү жана чалуу" diff --git a/java/com/android/contacts/common/res/values-lo/strings.xml b/java/com/android/contacts/common/res/values-lo/strings.xml index c649539d4..5e780028a 100644 --- a/java/com/android/contacts/common/res/values-lo/strings.xml +++ b/java/com/android/contacts/common/res/values-lo/strings.xml @@ -18,7 +18,6 @@ "ສຳເນົາຂໍ້ຄວາມແລ້ວ" - "ສຳເນົາໃສ່ຄລິບບອດ" "ໂທຫາ %s" "ໂທຫາເບີບ້ານ" "ໂທຫາເບີມືຖື" @@ -40,7 +39,6 @@ "ໂທຫາ pager ບ່ອນເຮັດວຽກ" "ໂທ​ຫາ %s" "ໂທຫາເບີ MMS" - "%s (ໂທ)" "ສົ່ງຂໍ້ຄວາມຫາ %s" "ສົ່ງຂໍ້ຄວາມຫາເບີບ້ານ" "ສົ່ງຂໍ້ຄວາມຫາເບີມືຖື" @@ -62,7 +60,6 @@ "ສົ່ງຂໍ້ຄວາມຫາເບີ pager ບ່ອນເຮັດວຽກ" "ສົ່ງຂໍ້ຄວາມຫາ %s" "ສົ່ງຂໍ້ຄວາມຫາເບີ MMS" - "%s (ສົ່ງຂໍ້ຄວາມ)" "ລຶບລາຍຊື່ທີ່ຕິດຕໍ່ເລື້ອຍໆອອກ?" "ທ່ານຈະລຶບຂໍ້ມູນລາຍຊື່ທີ່ຕິດຕໍ່ຫາເລື້ອຍໆຢູ່ໃນແອັບຯລາຍ​ຊື່ ແລະໂທ​ລະ​ສັບ ພ້ອມທັງບັງຄັບໃຫ້ແອັບຯອີເມວເລີ່ມຮຽນຮູ້ຄ່າກຳນົດທີ່ຢູ່ຂອງທ່ານໃໝ່ຕັ້ງແຕ່ຕົ້ນ." "ກຳລັງລຶບລ້າງລາຍຊື່ທີ່ຕິດຕໍ່ຫາເລື້ອຍໆ..." @@ -70,22 +67,14 @@ "ບໍ່ຢູ່" "ບໍ່ຫວ່າງ" "ລາຍຊື່ຜູ້ຕິດຕໍ່" + "ແນະນຳຫຼາຍທີ່ສຸດ" "ອື່ນໆ" "ໄດເຣັກທໍຣີ" "ໄດເຣັກທໍຣີບ່ອນເຮັດວຽກ" "ລາຍຊື່ຜູ້ຕິດຕໍ່ທັງໝົດ" + "ຄຳແນະນຳ" "ຂ້ອຍ" - "ກຳລັງຊອກຫາ..." - "ພົບຫຼາຍກວ່າ %d ລາຍການ." - "ບໍ່ມີລາຍຊື່ຜູ້ຕິດຕໍ່" - - ພົບ %d ລາຍການ - ພົບ 1 ລາຍການ - - "ຂໍ້ມູນລາຍຊື່ຜູ່ຕິດຕໍ່ດ່ວນຂອງ %1$s" "(ບໍ່ມີຊື່)" - "ເບີທີ່ໂທເລື້ອຍໆ" - "ຕິດຕໍ່ຫາເລື້ອຍໆ" "ເບິ່ງລາຍຊື່ຜູ້ຕິດຕໍ່" "ລາຍຊື່ຜູ່ຕິດຕໍ່ທັງໝົດທີ່ມີເບີໂທລະສັບ" "ລາຍຊື່ຜູ້ຕິດຕໍ່ຂອງໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ" @@ -125,8 +114,6 @@ "ສົ່ງອີ​ເມວຫາ %s" "ສົ່ງອີເມວ" "ຖະໜົນ" - "ຕູ້ໄປສະນີ" - "ບໍລິເວນໃກ້ຄຽງ" "ເມືອງ" "ລັດ" "ລະຫັດ ZIP" @@ -144,103 +131,19 @@ "ສົນທະນາໂດຍໃຊ້ ICQ" "ສົນທະນາໂດຍໃຊ້ Jabber" "ສົນທະນາ" - "ລຶບ" - "ຂະຫຍາຍ ຫຼືຫຍໍ້ຊ່ອງຂໍ້ມູນຊື່" - "ຂະ​ຫຍາຍ ຫຼື ຫຍໍ້​ບ່ອນ​ໃສ່​ຊື່​ຕາມ​ການ​ອອກ​ສຽງ" "ລາຍ​ຊື່​ຜູ້ຕິດ​ຕໍ່​ທັງ​ໝົດ" - "ແລ້ວໆ" - "ຍົກເລີກ" "ລາຍຊື່ຜູ່ຕິດຕໍ່ໃນ %s" "ລາຍຊື່ຜູ່ຕິດຕໍ່ໃນມຸມມອງກຳນົດເອງ" "ລາຍຊື່ຜູ່ຕິດຕໍ່ດ່ຽວ" - "ບັນ​ທຶກ​ລາຍ​ຊື່​ຕິດ​ຕໍ່​ນຳ​ເຂົ້າ​ແລ້ວ​ໃສ່:" - "ນຳເຂົ້າຈາກ SD card" - "ນຳ​ເຂົ້າ​ຈາກ SIM ^1 - ^2" - "​ນຳ​ເຂົ້າ​ຈາກ SIM %1$s" - "ນຳ​ເຂົ້າ​ຈາກ​ໄຟ​ລ໌ .vcf" - "ຍົກເລີກການນຳເຂົ້າ %s?" - "ຍົກເລີກການສົ່ງອອກ %s?" - "ບໍ່ສາມາດຍົກເລີກ ການນຳເຂົ້າ/ສົ່ງອອກ vCard ໄດ້" - "ຄວາມຜິດພາດບໍ່ຮູ້ສາຍເຫດ." - "ບໍ່ສາມາດເປີດ \"%s\" ໄດ້: %s." - "ບໍ່ສາມາດເລີ່ມໂປຣແກຣມສົ່ງອອກໄດ້: \"%s\"." - "ບໍ່ມີລາຍຊື່ຜູ່ຕິດຕໍ່ທີ່ສາມາດສົ່ງອອກໄດ້." - "ທ່ານປິດການນຳໃຊ້ສິດອະນຸຍາດທີ່ຈຳເປັນໄວ້ແລ້ວ." - "ເກີດຄວາມຜິດພາດໃນລະຫວ່າງການສົ່ງອອກ: \"%s\"." - "ຊື່ໄຟລ໌ທີ່ຕ້ອງການຍາວເກີນໄປ (\"%s\")." - "I/O ຜິດພາດ" - "ໜ່ວຍຄວາມຈຳບໍ່ພໍ. ເປັນໄປໄດ້ວ່າໄຟລ໌ໃຫຍ່ເກີນໄປ." - "ບໍ່ສາມາດວິເຄາະຂໍ້ມູນ vCard ຂອງທ່ານໄດ້ເນື່ອງຈາກສາຍເຫດທີ່ບໍ່ຄາດຄິດ." - "ບໍ່ຮອງຮັບຮູບແບບນີ້." - "ບໍ່ສາມາດເກັບກຳຂໍ້ມູນ meta ຂອງໄຟລ໌ vCard ທີ່ລະບຸໄດ້." - "ມີໄຟລ໌ນຶ່ງ ຫຼືຫຼາຍກວ່ານັ້ນບໍ່ສາມາດນຳເຂົ້າໄດ້ (%s)." - "ສິ້ນສຸດການສົ່ງອອກແລ້ວ %s." - "ສຳ​ເລັດ​ການ​ສົ່ງ​ອອກລາຍ​ຊື່​ອ​ແລ້ວ." - "ເມື່ອສຳເລັດການສົ່ງອອກລາຍຊື່ຜູ້ຕິດຕໍ່ແລ້ວ, ໃຫ້ຄລິກການແຈ້ງເຕືອນເພື່ອແບ່ງປັນລາຍຊື່ຜູ້ຕິດຕໍ່." - "ແຕະເພື່ອແບ່ງປັນລາຍຊື່ຜູ້ຕິດຕໍ່." - "ການສົ່ງອອກ %s ຖືກຍົກເລີກແລ້ວ." - "ກຳລັງສົ່ງອອກຂໍ້ມູນລາຍຊື່ຜູ່ຕິດຕໍ່" - "ຂໍ້ມູນລາຍຊື່ຜູ້ຕິດຕໍ່ກຳລັງຖືກສົ່ງອອກ." - "ບໍ່ສາມາດດຶງຂໍ້ມູນຖານຂໍ້ມູນໄດ້." - "ບໍ່ມີລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ສາມາດສົ່ງອອກໄດ້. ຫາກທ່ານມີລາຍຊື່ຜູ້ຕິດຕໍ່ໃນອຸປະກອນຂອງທ່ານ ແຕ່ບໍ່ສາມາດສົ່ງອອກໄດ້ ກໍອາດເປັນເພາະບາງຜູ້ໃຫ້ບໍລິການຂໍ້ມູນບໍ່ອະນຸຍາດ ໃຫ້ສົ່ງລາຍຊື່ຜູ້ຕິດຕໍ່ອອກຈາກອຸປະກອນໄດ້." - "ໂປຣແກຣມຂຽນ vCard ຖືກເລີ່ມຢ່າງບໍ່ຖືກຕ້ອງ." - "ບໍ່ສາມາດສົ່ງອອກໄດ້" - "ຂໍ້ມູນລາຍຊື່ຜູ່ຕິດຕໍ່ຍັງບໍ່ໄດ້ຖືກສົ່ງອອກເທື່ອ.\nເຫດຜົນ: \"%s\"" - "ກຳລັງນຳເຂົ້າ %s" - "ບໍ່ສາມາດອ່ານຂໍ້ມູນ vCard ໄດ້" - "ການອ່ານຂໍ້ມູນ vCard ຖືກຍົກເລີກແລ້ວ" - "ການນຳເຂົ້າໄຟລ໌ vCard %s ສິ້ນສຸດແລ້ວ" - "ການນຳເຂົ້າ %s ຖືກຍົກເລີກແລ້ວ" - "%s ຈະຖືກນຳເຂົ້າໃນໄວໆນີ້." - "ໄຟລ໌ຈະຖືກນຳເຂົ້າໃນໄວໆນີ້." - "ການຮ້ອງຂໍການນຳເຂົ້າ vCard​ ຖືກປະຕິເສດ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ." - "%s ຈະຖືກສົ່ງອອກໃນໄວໆນີ້." - "ໄຟ​ລ໌​ຈະ​ຖືກ​ສົ່ງ​ອອກ​ໄວໆ​ນີ້." - "ລາຍຊື່ຜູ້ຕິດຕໍ່ຈະຖືກສົ່ງອອກໃນໄວໆນີ້." - "ຄຳຂໍການສົ່ງອອກ vCard ຖືກປະຕິເສດ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ." - "ລາຍຊື່ຜູ່ຕິດຕໍ່" - "ກຳລັງເກັບຂໍ້ມູນ vCard ໃສ່ບ່ອນຈັດເກັບຂໍ້ມູນຊົ່ວຄາວໃນອຸປະກອນ. ການນຳເຂົ້າຈະເລີ່ມຂຶ້ນໃນໄວໆນີ້." - "ບໍ່ສາມາດນຳເຂົ້າ vCard ໄດ້." - "ລາຍຊື່ຜູ່ຕິດຕໍ່ທີ່ໄດ້ຮັບຜ່ານ NFC" - "ສົ່ງອອກລາຍຊື່ຜູ້ຕິດຕໍ່ບໍ?" - "ກຳລັງຈັດເກັບຂໍ້ມູນ" - "ກຳລັງນຳເຂົ້າ %s/%s: %s" - "ສົ່ງ​ອອກ​ຫາ​ໄຟ​ລ໌ .vcf" "ຮຽງຕາມ" "ຊື່" "ນາມສະກຸນ" "​ຮູບ​ແບບ​ຊື່" "​ຊື່​ກ່ອນ" "​ນາມ​ສະ​ກຸນ​ກ່ອນ" - "ບັນ​ຊີ​ເລີ່ມຕົ້ນ​ສຳ​ລັບ​ລາຍ​ຊື່​ຕິດ​ຕໍ່​ໃໝ່" - "ຊິ້ງຂໍ້ມູນເມຕາເດຕາຂອງລາຍຊື່ຜູ້ຕິດຕໍ່" - "ກ່ຽວກັບລາຍຊື່ຜູ້ຕິດຕໍ່" - "ການຕັ້ງຄ່າ" - "ແບ່ງປັນລາຍຊື່ຜູ່ຕິດຕໍ່ທີ່ເບິ່ງເຫັນໄດ້" - "ແບ່ງ​ປັນ​ລາຍ​ຊື່​ຕິດ​ຕໍ່​ສາ​ມາດ​ເຫັນ​ໄດ້​ບໍ່​ສຳ​ເລັດ." - "ແບ່ງປັນລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ມັກ" - "ແບ່ງປັນທຸກລາຍຊື່ຜູ້ຕິດຕໍ່" - "ແບ່ງປັນລາຍຊື່ຜູ້ຕິດຕໍ່ບໍ່ສຳເລັດ." - "ນຳເຂົ້າ/ສົ່ງອອກ ລາຍຊື່ຜູ້ຕິດຕໍ່" - "ນຳເຂົ້າລາຍຊື່ຜູ່ຕິດຕໍ່" - "ບໍ່ສາມາດແບ່ງປັນລາຍຊື່ລາຍຊື່ຜູ່ຕິດຕໍ່ນີ້ໄດ້." - "ບໍ່ມີລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ຈະແບ່ງປັນ." - "ຊອກຫາ" - "ຊອກຫາລາຍຊື່ຜູ້ຕິດຕໍ່" - "ລາຍການທີ່ມັກ" - "ບໍ່ມີລາຍຊື່ຜູ້ຕິດຕໍ່." - "ບໍ່ມີລາຍຊື່ຜູ່ຕິດຕໍ່ທີ່ເບິ່ງເຫັນໄດ້." - "ບໍ່ມີລາຍການທີ່ມັກ" - "ບໍ່ມີລາຍຊື່ຜູ້ຕິດຕໍ່ໃນ %s" "ລຶບລາຍຊື່ຄົນທີ່ຕິດຕໍ່ຫາເລື້ອຍໆ" - "ເລືອກ SIM ກາດ" - "ຈັດການບັນຊີ" - "ນຳເຂົ້າ/ສົ່ງອອກ" - "ຜ່ານ %1$s" - "%1$s ຜ່ານ %2$s" "ຢຸດ​ການ​ຊອກ​ຫາ" "ລຶບ​ການ​ຊອກ​ຫາ" - "​ໂຕ​ເລືອກ​ການ​ສະ​ແດງ​ລາຍ​ຊື່​ຜູ່​ຕິດ​ຕໍ່" "ບັນຊີ" "ໃຊ້​ຊິມ​ນີ້​ເພື່ອ​ການໂທທຸກ​ເທື່ອ" "ໂທ​ດ້ວຍ" @@ -248,19 +151,12 @@ "ພິມ​ບັນ​ທຶກ ເພື່ອ​ສົ່ງ​ກັບ​ການ​ໂທ ..." "ສົ່ງ ແລະ ໂທ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "ແຖບ %1$s." ແຖບ %1$s. %2$d ລາຍການບໍ່ທັນໄດ້ອ່ານ. ແຖບ %1$s. %2$d ລາຍການບໍ່ທັນໄດ້ອ່ານ. - "ເວີຊັນທີ່ສ້າງ" - "​ລິ​ຂະ​ສິດ​ໂອ​ເພນ​ຊອດ" - "ລາຍລະອຽດລິຂະສິດຂອງຊອບແວແຫຼ່ງເປີດ" - "​ນະ​ໂຍ​ບາຍ​ຄວາມ​ເປັນ​ສ່ວນ​ໂຕ" - "​ເງື່ອນ​ໄຂ​ການ​ໃຫ້​ບໍ​ລິ​ການ" - "ລິຂະສິດໂອເພນຊອດ" - "ເປີດ URL ລົ້ມເຫລວ." "ໂທວິດີໂອ" "ແບ່ງປັນ ແລະ ໂທ" diff --git a/java/com/android/contacts/common/res/values-lt/strings.xml b/java/com/android/contacts/common/res/values-lt/strings.xml index b74bd99ee..ed6cc7f66 100644 --- a/java/com/android/contacts/common/res/values-lt/strings.xml +++ b/java/com/android/contacts/common/res/values-lt/strings.xml @@ -18,7 +18,6 @@ "Tekstas nukopijuotas" - "Kopijuoti į iškarpinę" "Skambinti %s" "Skambinti namų telefono numeriu" "Skambinti mobiliojo telefono numeriu" @@ -40,7 +39,6 @@ "Skambinti darbo pranešimų gaviklio numeriu" "Skambinti %s" "Skambinti MMS telefono numeriu" - "%s (skambutis)" "Siųsti teksto pranešimą %s" "Siųsti teksto pranešimą namų telefono numeriu" "Siųsti teksto pranešimą mobiliojo telefono numeriu" @@ -62,7 +60,6 @@ "Siųsti teksto pranešimą darbo pranešimų gaviklio numeriu" "Siųsti teksto pranešimą %s" "Siųsti MMS telefono numeriu" - "%s (pranešimas)" "Išvalyti dažniausius kontaktus?" "Išvalysite dažniausių kontaktų sąrašą Kontaktų ir Telefono programose, o el. pašto programoms reikės iš naujo gauti adresavimo nuostatas." "Valomi dažniausi kontaktai…" @@ -70,24 +67,14 @@ "Pasišalinęs" "Užsiėmęs" "Adresinė" + "Populiariausi siūlomi" "Kita" "Katalogas" "Darbo katalogas" "Visi kontaktai" + "Pasiūlymai" "Aš" - "Ieškoma…" - "Rasta daugiau nei %d." - "Kontaktų nėra" - - Rastas %d kontaktas - Rasti %d kontaktai - Rasta %d kontakto - Rasta %d kontaktų - - "Spartusis %1$s kontaktas" "(Nėra pavadinimo)" - "Dažniausiai skambinta" - "Dažniausiai susisiekta" "Žr. išsamią kontaktinę informaciją" "Visi kontaktai su telefonų numeriais" "Darbo profilio kontaktai" @@ -127,8 +114,6 @@ "El. paštas %s" "El. paštas" "Gatvė" - "Pašto dėžutė" - "Kaimynystė" "Miestas" "Valstija" "Pašto kodas" @@ -146,103 +131,19 @@ "Kalbėti naudojant ICQ" "Kalbėti naudojant „Jabber“" "Pokalbis" - "ištrinti" - "Išskleisti arba sutraukti pavadinimų laukus" - "Išskleisti arba sutraukti fonetinių pavadinimų laukus" "Visi kontaktai" - "Atlikta" - "Atšaukti" "%s kontaktai" "Kontaktai tinkintame rodinyje" "Vienas kontaktas" - "Importuotus kontaktus išsaugoti paskyroje:" - "Importuoti iš SIM kortelės" - "Importuoti iš SIM kortelės „^1“ – ^2" - "Importuoti iš SIM kortelės „%1$s“" - "Importuoti iš VCF failo" - "Atšaukti „%s“ importavimą?" - "Atšaukti „%s“ eksportavimą?" - "Nepav. atš. el. viz. kort. imp. / eksp." - "Nežinoma klaida." - "Nepavyko atidaryti „%s“: %s." - "Nepavyko paleisti eksportavimo priemonės: „%s“." - "Nėra eksportuojamo kontakto." - "Išjungėte būtiną leidimą." - "Eksportuojant įvyko klaida: „%s“." - "Reikalingo failo pavadinimas per ilgas („%s“)." - "Įvesties / išvesties klaida" - "Nepakanka atminties. Gali būti, kad failas per didelis." - "Dėl netikėtos priežasties nepavyko išanalizuoti el. vizitinės kortelės." - "Formatas nepalaikomas." - "Nepavyko surinkti pateikto (-ų) el. vizitinės kortelės failo (-ų) metainformacijos." - "Nepavyko importuoti vieno ar daugiau failų (%s)." - "Baigta eksportuoti „%s“." - "Baigta eksportuoti kontaktus." - "Kontaktai baigti eksportuoti. Spustelėkite pranešimą ir bendrinkite kontaktus." - "Palieskite, kad bendrintumėte kontaktus." - "„%s“ eksportavimas atšauktas." - "Eksportuojami kontaktų duomenys" - "Kontaktų duomenys eksportuojami." - "Nepavyko gauti duomenų informacijos." - "Nėra jokių eksportuojamų kontaktų. Jei įrenginyje yra kontaktų, kai kurie duomenų paslaugų teikėjai gali neleisti eksportuoti kontaktų iš įrenginio." - "El. vizitinių kortelių rengyklė nebuvo tinkamai paleista." - "Nepavyko eksportuoti" - "Kontakto duomenys nebuvo eksportuoti.\nPriežastis: „%s“" - "Importuojama %s" - "Nepavyko nusk. el. vizit. kort. duomenų" - "El. vizit. kort. duomenų skaitymas atš." - "Baigtas „%s“ el. vizit. kort. importavimas" - "Atšauktas „%s“ importavimas" - "„%s“ bus netrukus importuotas." - "Failas bus netrukus importuotas." - "El. vizitinės kortelės importavimo užklausa atmesta. Vėliau bandykite dar kartą." - "„%s“ bus netrukus eksportuotas." - "Failas bus eksportuotas netrukus." - "Netrukus kontaktai bus eksportuoti." - "El. vizitinės kortelės eksportavimo užklausa buvo atmesta. Vėliau bandykite dar kartą." - "kontaktas" - "El. vizitinė (-ės) kortelė (-ės) padedama (-os) į vietinę laikinąją saugyklą. Netrukus bus pradėtas tikrasis importavimas." - "Nepavyko importuoti el. vizit. kortelės." - "Kont. g. per ALR" - "Eksportuoti kontaktus?" - "Dedama į talpyklą" - "Importuojama: %s / %s, %s" - "Eksportuoti į VCF failą" "Rūšiuoti pagal" "Vardas" "Pavardė" "Vardo formatas" "Pirmiausia vardas" "Pirmiausia pavardė" - "Numatytoji naujų kontaktų paskyra" - "Kontaktų metaduomenų sinchronizavimas" - "Apie Kontaktus" - "Nustatymai" - "Bendrinti matomus kontaktus" - "Nepavyko bendrinti matomų kontaktų." - "Bendrinti mėgstamiausius kontaktus" - "Bendrinti visus kontaktus" - "Nepavyko bendrinti kontaktų." - "Kontaktų importavimas / eksportavimas" - "Importuoti kontaktus" - "Šio kontakto negalima bendrinti." - "Nėra bendrintinų kontaktų." - "Paieška" - "Ieškoti kontaktų" - "Mėgstamiausi" - "Kontaktų nėra." - "Nėra matomų kontaktų." - "Nėra mėgstamiausių" - "„%s“ kontaktų nėra" "Valyti dažniausiai naudojamus" - "Pasirinkite SIM kortelę" - "Valdyti paskyras" - "Importuoti / eksportuoti" - "naudojant „%1$s“" - "%1$s naudojant „%2$s“" "sustabdyti paiešką" "Išvalyti paiešką" - "Kontaktų rodymo parinktys" "Paskyra" "Visada naudoti tai skambučiams" "Skambinkite naudodami" @@ -250,7 +151,7 @@ "Įveskite užrašą, kurį galima išsiųsti skambinant..." "SIŲSTI IR SKAMBINTI" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Skirtukas „%1$s“." Skirtukas „%1$s“. %2$d neskaitytas elementas. @@ -258,13 +159,6 @@ Skirtukas „%1$s“. %2$d neskaityto elemento. Skirtukas „%1$s“. %2$d neskaitytų elementų. - "Versija" - "Atvirojo šaltinio licencijos" - "Išsami atvirojo šaltinio programinės įrangos licencijos informacija" - "Privatumo politika" - "Paslaugų teikimo sąlygos" - "Atvirojo šaltinio licencijos" - "Nepavyko atidaryti URL." "Vaizdo skambutis" "Bendrinti ir skambinti" diff --git a/java/com/android/contacts/common/res/values-lv/strings.xml b/java/com/android/contacts/common/res/values-lv/strings.xml index c09a27f5d..494919ea2 100644 --- a/java/com/android/contacts/common/res/values-lv/strings.xml +++ b/java/com/android/contacts/common/res/values-lv/strings.xml @@ -18,7 +18,6 @@ "Teksts ir nokopēts" - "Kopēt starpliktuvē" "Zvanīt: %s" "Zvanīt uz mājas tālruni" "Zvanīt uz mobilo tālruni" @@ -40,7 +39,6 @@ "Zvanīt uz darba peidžeri" "Zvanīt: %s" "Zvanīt uz multiziņas numuru" - "%s (zvanīt)" "Sūtīt īsziņu: %s" "Sūtīt īsziņu uz mājas tālruņa numuru" "Sūtīt īsziņu uz mobilo tālruni" @@ -62,7 +60,6 @@ "Sūtīt īsziņu uz darba peidžeri" "Sūtīt īsziņu: %s" "Sūtīt multiziņu" - "%s (sūtīt īsziņu)" "Vai dzēst bieži lietotos kontaktus?" "Tiks dzēsts bieži lietoto kontaktpersonu saraksts lietotnēs Kontaktpersonas un Tālrunis, un e-pasta lietotnēs no jauna tiks sākta adrešu preferenču saglabāšana." "Bieži lietoto kontaktu dzēšana..." @@ -70,23 +67,14 @@ "Prombūtnē" "Aizņemts" "Kontaktpersonas" + "Populārākie ieteikumi" "Cits" "Katalogs" "Darba katalogs" "Visas kontaktpersonas" + "Ieteikumi" "Es" - "Notiek meklēšana…" - "Atrastas vairāk nekā %d kontaktpersonas." - "Nav kontaktpersonu" - - Atrastas %d kontaktpersonas - Atrasta %d kontaktpersona - Atrastas %d kontaktpersonas - - "Ātrā saziņa ar kontaktpersonu %1$s" "(Nav vārda)" - "Kontaktpersonas, kurām bieži zvanāt" - "Personas, ar kurām bieži sazināties" "Skatīt kontaktpersonu" "Visas kontaktpersonas ar tālruņa numuriem" "Kontaktpersonas darba profilā" @@ -126,8 +114,6 @@ "Sūtīt e-pasta ziņojumu uz: %s" "Sūtīt e-pasta ziņojumu" "Iela" - "Abonenta kastīte" - "Teritoriālā vienība" "Pilsēta" "Štats" "Pasta indekss" @@ -145,103 +131,19 @@ "Tērzēt, izmantojot ICQ" "Tērzēt, izmantojot Jabber" "Tērzēt" - "dzēst" - "Izvērst vai sakļaut nosaukumu laukus" - "Izvērst vai sakļaut vārda izrunas laukus" "Visas kontaktpersonas" - "Gatavs" - "Atcelt" "Kontaktpersonas sarakstā %s" "Lietotāju filtrs" "Viena kontaktpersona" - "Saglabāt importētās kontaktpersonas šeit:" - "Importēt no SIM kartes" - "Importēt no SIM kartes ^1 — ^2" - "Importēt no SIM kartes %1$s" - "Importēt no .vcf faila" - "Vai atcelt faila %s importēšanu?" - "Vai atcelt faila %s eksportēšanu?" - "Nevarēja atcelt vCard f. imp./eksp." - "Nezināma kļūda." - "Nevarēja atvērt failu %s: %s." - "Nevarēja startēt eksportētāju: %s." - "Nav eksportējamu kontaktpersonu datu." - "Jūs esat atspējojis obligātu atļauju." - "Eksportēšanas laikā radās kļūda: %s." - "Faila nosaukums ir pārāk garš (%s)." - "Ievades/izvades kļūda" - "Atmiņā nepietiek vietas. Iespējams, fails ir pārāk liels." - "Neparedzēta iemesla dēļ nevarēja parsēt vCard failu." - "Šāds formāts netiek atbalstīts." - "Nevarēja iegūt metainformāciju par vienu vai vairākiem konkrētiem vCard failiem." - "Nevarēja importēt vienu vai vairākus failus (%s)." - "Faila %s eksportēšana pabeigta" - "Kontaktpersonu eksportēšana ir pabeigta." - "Kontaktpersonu eksportēšana ir pabeigta. Lai kopīgotu kontaktpersonas, noklikšķiniet uz paziņojuma." - "Pieskarieties, lai kopīgotu kontaktpersonas." - "Faila %s eksportēšana atcelta" - "Kontaktpersonu datu eksportēšana" - "Kontaktpersonu dati tiek eksportēti." - "Nevarēja iegūt informāciju no datu bāzes." - "Nav nevienas eksportējamas kontaktpersonas. Ja jūsu ierīcē ir saglabātas kontaktpersonas, iespējams, datu pakalpojumu sniedzējs neļauj eksportēt kontaktpersonas no ierīces." - "vCard veidotājs netika pareizi startēts." - "Nevarēja eksportēt" - "Kontaktpersonas dati netika eksportēti.\nIemesls: %s" - "Notiek importēšana: %s" - "Nevarēja nolasīt vCard datus" - "Atcelta vCard datu lasīšana" - "vCard faila %s importēšana pabeigta" - "Faila %s importēšana atcelta" - "Fails %s drīzumā tiks importēts." - "Fails drīzumā tiks importēts." - "Tika noraidīts vCard faila importēšanas pieprasījums. Vēlāk mēģiniet vēlreiz." - "Fails %s drīzumā tiks eksportēts." - "Fails drīzumā tiks eksportēts." - "Kontaktpersonas drīzumā tiks eksportētas." - "Tika noraidīts vCard faila eksportēšanas pieprasījums. Vēlāk mēģiniet vēlreiz." - "kontaktpersona" - "Notiek vCard failu saglabāšana vietējā pagaidu kešatmiņā. Importēšana tiks sākta pēc neilga brīža." - "Nevarēja importēt vCard datus." - "Kont. saņ., izm. NFC." - "Vai eksportēt kontaktp. datus?" - "Notiek saglabāšana kešatmiņā" - "Importē %s. no %s: %s" - "Eksportēt .vcf failā" "Kārtot pēc" "Vārds" "Uzvārds" "Vārda formāts" "Vispirms rādīt vārdu" "Vispirms rādīt uzvārdu" - "Noklusējuma konts jaunām kontaktpersonām" - "Kontaktpersonu metadatu sinhronizācija" - "Par lietotni Kontaktpersonas" - "Iestatījumi" - "Kopīgot redzamo kontaktpersonu datus" - "Neizdevās kopīgot redzamās kontaktpersonas." - "Kopīgot izlases kontaktpersonas" - "Kopīgot visas kontaktpersonas" - "Neizdevās kopīgot kontaktpersonas." - "Kontaktpersonu importēšana/eksportēšana" - "Importēt kontaktpersonas" - "Šīs kontaktpersonas datus nevar kopīgot." - "Nav nevienas kontaktpersonas, ko kopīgot." - "Meklēt" - "Meklēt kontaktpersonas" - "Izlase" - "Nav kontaktpersonu." - "Nav redzamu kontaktpersonu." - "Izlasē nav nevienas kontaktpersonas." - "Nav kontaktpersonu šādā grupā: %s" "Dzēst bieži lietotos kontaktus" - "Atlasiet SIM karti" - "Pārvaldīt kontus" - "Importēt/eksportēt" - "izmantojot %1$s" - "%1$s, izmantojot %2$s" "pārtraukt meklēšanu" "Notīrīt meklēšanas lauku" - "Kontaktpersonu rādīšanas opcijas" "Konts" "Vienmēr izmantot zvaniem" "Zvanīt, izmantojot" @@ -249,20 +151,13 @@ "Ierakstiet piezīmi, ko nosūtīt ar zvanu..." "SŪTĪT UN ZVANĪT" "%1$s no %2$s" - "%1$s • %2$s" + "%1$s: %2$s" "Cilne “%1$s”" Cilne “%1$s”. %2$d nelasīti vienumi. Cilne “%1$s”. %2$d nelasīts vienums. Cilne “%1$s”. %2$d nelasīti vienumi. - "Versija" - "Atklātā pirmkoda licences" - "Licences informācija par atklātā pirmkoda programmatūru" - "Konfidencialitātes politika" - "Pakalpojumu sniegšanas noteikumi" - "Atklātā pirmkoda licences" - "Neizdevās atvērt URL." "Videozvans" "Kopīgot un zvanīt" diff --git a/java/com/android/contacts/common/res/values-mk/strings.xml b/java/com/android/contacts/common/res/values-mk/strings.xml index da1530f2a..a7283da81 100644 --- a/java/com/android/contacts/common/res/values-mk/strings.xml +++ b/java/com/android/contacts/common/res/values-mk/strings.xml @@ -18,7 +18,6 @@ "Текстот е копиран" - "Копирај во клип-табла" "Повикај %s" "Јави се дома" "Повикај мобилен" @@ -40,7 +39,6 @@ "Повикај пејџер на работа" "Повикај %s" "Повикај MMS" - "%s (Повик)" "Испрати текстуална порака на %s" "Испрати текстуална порака дома" "Испрати текстуална порака на мобилен" @@ -62,7 +60,6 @@ "Испрати текстуална порака на пејџер на работа" "Испрати текстуална порака на %s" "Испрати текстуална порака на MMS" - "%s (Порака)" "Исчисти често контактирани?" "Ќе го исчистите списокот на често контактирани лица во апликациите „Контакти“ и „Телефон“ и ќе ги принудите апликациите на е-пошта одново да ги дознаат вашите параметри на обраќање." "Чистење често контактирани..." @@ -70,22 +67,14 @@ "Отсутен" "Зафатен" "Контакти" + "Нејдобри предложени" "Друг" "Адресар" "Работен директориум" "Сите контакти" + "Предлози" "Јас" - "Се пребарува..." - "Повеќе од %d се пронајдени." - "Нема контакти" - - %d пронајдени - %d пронајдени - - "Брз контакт за %1$s" "(Без име)" - "Често повикувани" - "Често контактирани" "Прегледајте контакт" "Сите контакти со телефонски броеви" "Контакти на Работниот профил" @@ -125,8 +114,6 @@ "%s е-пошта" "E-пошта" "Улица" - "Поштенски фах" - "Соседство" "Град" "Држава" "Поштенски број" @@ -144,103 +131,19 @@ "Разговор на ICQ" "Разговор на Jabber" "Разговор" - "избриши" - "Отвори или затвори полиња со име" - "Прошири ги или собери ги полињата за фонетско име" "Сите контакти" - "Готово" - "Откажи" "Контакти во %s" "Контакти во прилагоден приказ" "Еден контакт" - "Зачувајте ги увезените контакти до:" - "Увези од SIM картичка" - "Увези од SIM ^1^2" - "Увези од SIM %1$s" - "Увези од датотеката .vcf" - "Откажи увоз на %s?" - "Откажи извоз на %s?" - "Не можеше да се откаже увоз/извоз на визит картичка" - "Непозната грешка." - "„%s“ не можеше да се отвори: %s." - "Не можеше да се вклучи извозникот: „%s“." - "Нема контакт што може да се извезе." - "Оневозможивте потребна дозвола." - "Настанаи грешка при извоз: „%s“." - "Бараното име на датотеката е предолго („%s“)." - "I/O грешка" - "Нема доволно меморија. Датотеката е можеби премногу голема." - "Визит картичката не можеше да се разложи од неочекувана причина." - "Форматот не е поддржан." - "Не можеше да собере мета информации за дадени датотека(и) на визит картичка(и)." - "Една или повеќе датотеки не можеа да се увезат (%s)." - "Заврши извезувањето на %s." - "Извозот на контакти заврши." - "Извозот на контакти заврши. Кликнете на известувањето за да ги споделите контактите." - "Допрете за споделување контакти." - "Извезувањето на %s е откажано." - "Извезување податоци за контакт" - "Се врши извоз на податоците за контакт." - "Не можеше да добие информации за базата на податоци." - "Нема контакти на кои може да се изврши извоз. Ако имате контакти на вашиот уред, некои оператори може да не дозволуваат извоз на контактите од уредот." - "Композиторот на визит картичката не започна правилно." - "Не можеа да се извезат" - "Податоците за контакт не се извезоа.\nПричина: „%s“" - "Увезување %s" - "Не можеше да прочита податоци од визит картичка" - "Читањето податоци од визит картичка е откажано" - "Заврши увезувањето на визит картичката %s" - "Увезувањето на %s е откажано" - "%s ќе се увезе наскоро." - "Датотеката ќе се увезе наскоро." - "Барањето за увезување визит картичка беше одбиено. Обидете се повторно подоцна." - "%s ќе се извезе наскоро." - "Датотеката ќе се извезе наскоро." - "Наскоро ќе се изврши извоз на контактите." - "Барањето за извезување визит картичка беше одбиено. Обидете се повторно подоцна." - "контакт" - "Кеширање визит картичка(и) во локална привремена меморија. Реалниот увоз ќе започне наскоро." - "Не можеше да се увезе визит картичка." - "Контакт добиен преку NFC" - "Извези контакти?" - "Кеширање" - "Се увезуваат %s/%s: %s" - "Извези во датотеката .vcf" "Подреди по" "Име" "Презиме" "Формат на име" "Прво името" "Прво презимето" - "Стандардна сметка за новите контакти" - "Синхронизација на метаподатоци за контакт" - "За Контакти" - "Поставки" - "Сподели видливи контакти" - "Не успеаја да се споделат видливите контакти." - "Сподели ги омилените контакти" - "Сподели ги сите контакти" - "Не успеа да се споделат контактите." - "Увези/извези контакти" - "Увези контакти" - "Овој контакт не може да се сподели." - "Нема контакти за споделување." - "Барај" - "Пронајди контакти" - "Омилени" - "Нема контакти." - "Нема видливи контакти." - "Нема омилени" - "Нема контакти во %s" "Исчисти чести" - "Изберете SIM-картичка" - "Управувај со сметки" - "Увези/извези" - "од %1$s" - "на %1$s од %2$s" "запри пребарување" "Исчисти го полето за пребарување" - "Опции за прикажување контакт" "Сметка" "Секогаш користи го ова за повици" "Повикајте со" @@ -248,19 +151,12 @@ "Напишете белешка да се испрати со повикот..." "ИСПРАТИ И ПОВИКАЈ" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Картичка %1$s." Картичка %1$s. %2$d непрочитана ставка. Картичка %1$s. %2$d непрочитани ставки. - "Верзија" - "Лиценци за софтвер со отворен код" - "Детали за лиценцата за софтвер со отворен код" - "Политика за приватност" - "Услови на користење" - "Лиценци за софтвер со отворен код" - "Врската не успеа да се отвори." "Видеоповик" "Сподели и повикај" diff --git a/java/com/android/contacts/common/res/values-ml/strings.xml b/java/com/android/contacts/common/res/values-ml/strings.xml index 7e927499a..c36226d0f 100644 --- a/java/com/android/contacts/common/res/values-ml/strings.xml +++ b/java/com/android/contacts/common/res/values-ml/strings.xml @@ -18,7 +18,6 @@ "വാചകം പകർത്തി" - "ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക" "വിളിക്കുക %s" "വീട്ടിലെ ഫോണിലേക്ക് വിളിക്കുക" "മൊബൈലിലേക്ക് വിളിക്കുക" @@ -40,7 +39,6 @@ "ഔദ്യോഗിക പേജറിലേക്ക് വിളിക്കുക" "വിളിക്കുക %s" "MMS ഫോണിലേക്ക് വിളിക്കുക" - "%s (വിളിക്കുക)" "%s എന്നതിലേക്ക് വാചക സന്ദേശമയയ്‌ക്കുക" "വീട്ടിലെ ഫോണിലേക്ക് വാചകസന്ദേശമയയ്‌ക്കുക" "മൊബൈലിലേക്ക് വാചകസന്ദേശമയയ്‌ക്കുക" @@ -62,7 +60,6 @@ "ഔദ്യോഗിക പേജറിലേക്ക് വാചകസന്ദേശമയയ്‌ക്കുക" "%s എന്നതിലേക്ക് വാചക സന്ദേശമയയ്‌ക്കുക" "MMS നമ്പറിലേക്ക് വാചകസന്ദേശമയയ്‌ക്കുക" - "%s (സന്ദേശം)" "സ്ഥിരംവിളിക്കുന്നവരെ മായ്‌ക്കണോ?" "നിങ്ങൾ കോൺടാക്‌റ്റുകളുടെയും ഫോണിന്റെയും അപ്ലിക്കേഷനുകളിലെ പതിവായി കോൺടാക്റ്റുചെയ്യുന്നവരുടെ ലിസ്റ്റ് മായ്‌ക്കുകയും സ്‌ക്രാച്ചിൽ നിന്നും ബന്ധപ്പെടൽ മുൻഗണനകൾ അറിയാൻ ഇമെയിൽ അപ്ലിക്കേഷനുകളെ പ്രേരിപ്പിക്കുകയും ചെയ്യും." "സ്ഥിരംവിളിക്കുന്നവരെ മായ്‌ക്കുന്നു…" @@ -70,22 +67,14 @@ "ലഭ്യമല്ല" "തിരക്കിലാണ്" "കോണ്ടാക്റ്റ്" + "കൂടുതൽ നിർദ്ദേശിച്ചിരിക്കുന്നവ" "മറ്റുള്ളവ" "ഡയറക്‌ടറി" "ഔദ്യോഗിക ഡയറക്‌ടറി" "എല്ലാ കോൺടാക്റ്റുകളും" + "നിര്‍ദ്ദേശങ്ങള്‍" "ഞാന്‍" - "തിരയുന്നു…" - "%d-ൽ കൂടുതൽ കണ്ടെത്തി." - "കോൺടാക്റ്റുകളൊന്നുമില്ല" - - %d എണ്ണം കണ്ടെത്തി - ഒരെണ്ണം കണ്ടെത്തി - - "%1$s എന്നയാളുടെ ദ്രുത കോൺടാക്റ്റ്" "(പേരില്ല)" - "പതിവായി വിളിച്ചവർ" - "പതിവ് കോൺടാക്റ്റുകൾ" "കോൺടാക്റ്റ് കാണുക" "ഫോൺ നമ്പറുകളുള്ള എല്ലാ കോൺടാക്റ്റുകളും" "ഔദ്യോഗിക പ്രൊഫൈൽ കോൺടാക്റ്റുകൾ" @@ -125,8 +114,6 @@ "%s എന്നതിലേക്ക് ഇമെയിൽ ചെയ്യുക" "ഇമെയിൽ" "സ്‌ട്രീറ്റ്" - "PO ബോക്സ്" - "സമീപസ്ഥലം" "നഗരം" "സംസ്ഥാനം" "തപാൽ കോഡ്" @@ -144,103 +131,19 @@ "ICQ ഉപയോഗിച്ച് ചാറ്റുചെയ്യുക" "Jabber ഉപയോഗിച്ച് ചാറ്റുചെയ്യുക" "ചാറ്റുചെയ്യുക" - "ഇല്ലാതാക്കുക" - "പേരിന്റെ ഫീൽഡുകൾ വിപുലീകരിക്കുക അല്ലെങ്കിൽ ചുരുക്കുക" - "ഫോണിറ്റിക്ക് പേരിന്റെ ഫീൽഡുകൾ വികസിപ്പിക്കുക അല്ലെങ്കിൽ ചുരുക്കുക" "എല്ലാ കോൺടാക്റ്റുകളും" - "പൂർത്തിയായി" - "റദ്ദാക്കുക" "%s എന്നതിലെ കോൺടാക്റ്റുകൾ" "ഇഷ്‌ടാനുസൃതകാഴ്‌ചയിലെ കോൺടാക്റ്റ്" "സിംഗിൾ കോൺടാക്റ്റ്" - "ഇമ്പോർട്ടുചെയ്ത കോൺടാക്റ്റുകൾ ഇനിപ്പറയുന്നതിലേക്ക് സംരക്ഷിക്കുക:" - "സിം കാർഡിൽ നിന്നും ഇമ്പോർട്ടുചെയ്യുക" - "SIM-ൽ നിന്ന് ഇമ്പോർട്ടുചെയ്യുക ^1 - ^2" - "SIM-ൽ നിന്ന് ഇമ്പോർട്ടുചെയ്യുക %1$s" - ".vcf ഫയലിൽ നിന്ന് ഇമ്പോർട്ടുചെയ്യൂ" - "%s എന്നത് ഇമ്പോർട്ടുചെയ്യുന്നത് റദ്ദാക്കണോ?" - "%s എന്നത് എക്‌സ്‌പോർട്ടുചെയ്യുന്നത് റദ്ദാക്കണോ?" - "vCard ഡൗൺലോഡ്/അപ്‌ലോഡ് റദ്ദാക്കാനായില്ല" - "അജ്ഞാത പിശക്." - "\"%s\" തുറക്കാനായില്ല: %s." - "എക്‌സ്‌പോർട്ടർ ആരംഭിക്കാനായില്ല: \"%s\"." - "എക്‌സ്‌പോർട്ടുചെയ്യാനാകുന്ന കോൺടാക്റ്റ് ഒന്നുമില്ല." - "ആവശ്യമായ ഒരു അനുമതി നിങ്ങൾ പ്രവർത്തനരഹിതമാക്കി." - "എക്‌സ്‌പോർട്ടുചെയ്യുമ്പോൾ ഒരു പിശക് സംഭവിച്ചു: \"%s\"." - "ആവശ്യമായ ഫയലിന്റെ പേര് ദൈർഘ്യമേറിയതാണ് (\"%s\")." - "I/O പിശക്" - "ആവശ്യമായ മെമ്മറിയില്ല. ഫയൽ വളരെ വലുതായിരിക്കാം." - "ഒരു അപ്രതീക്ഷിത കാരണത്താൽ vCard പാഴ്‌സുചെയ്യാനായില്ല." - "ഫോർമാറ്റിനെ പിന്തുണയ്‌ക്കില്ല." - "നൽകിയിരിക്കുന്ന vCard ഫയലിന്റെ (ഫയലുകളുടെ) മീറ്റ വിവരം ശേഖരിക്കാനായില്ല." - "ഒന്നോ അതിലധികമോ ഫയലുകൾ ഇമ്പോർട്ടുചെയ്യാനായില്ല (%s)." - "%s എക്‌സ്‌പോർട്ടുചെയ്യൽ പൂർത്തിയായി." - "കോൺടാക്റ്റുകൾ എക്‌സ്‌പോർട്ടുചെയ്യൽ പൂർത്തിയായി." - "കോൺടാക്റ്റുകൾ എക്‌സ്‌പോർട്ടുചെയ്യൽ പൂർത്തിയായി, കോൺടാക്റ്റുകൾ പങ്കിടുന്നതിന് അറിയിപ്പിൽ ക്ലിക്കുചെയ്യുക." - "കോൺടാക്റ്റുകൾ പങ്കിടാൻ ടാപ്പുചെയ്യുക." - "%s എക്‌സ്‌പോർട്ടുചെയ്യൽ റദ്ദാക്കി." - "കോൺടാക്റ്റ് ഡാറ്റ എക്‌സ്‌പോർട്ടുചെയ്യുന്നു" - "കോൺടാക്റ്റ് ഡാറ്റ എക്സ്പോർട്ടുചെയ്യുകയാണ്." - "ഡാറ്റാബേസ് വിവരം നേടാനായില്ല." - "എക്‌സ്‌പോർട്ടുചെയ്യാനാകുന്ന കോൺടാക്റ്റുകളൊന്നുമില്ല. നിങ്ങളുടെ ഫോണിൽ കോൺടാക്റ്റുകളുണ്ടെങ്കിൽ, ഫോണിൽ നിന്നും കോൺടാക്റ്റുകൾ എക്‌സ്‌പോർട്ടുചെയ്യാൻ ചില സേവന ദാതാക്കൾ അനുവദിക്കാനിടയില്ല." - "vCard കമ്പോസർ ശരിയായി ആരംഭിച്ചില്ല." - "എക്‌സ്‌പോർട്ടുചെയ്യാനായില്ല" - "കോൺടാക്റ്റ് ഡാറ്റ എക്‌സ്‌പോർട്ടുചെയ്‌തില്ല.\nകാരണം: \"%s\"" - "%s എന്നയാളെ ഇമ്പോർട്ടുചെയ്യുന്നു." - "vCard ഡാറ്റ വായിക്കാനായില്ല" - "vCard ഡാറ്റ വായിക്കുന്നത് റദ്ദാക്കി" - "vCard %s ഇമ്പോർട്ടുചെയ്യൽ പൂർത്തിയായി" - "%s ഇമ്പോർട്ടുചെയ്യൽ റദ്ദാക്കി" - "%s എന്നത് ഉടൻ ഇമ്പോർട്ടുചെയ്യും." - "ഈ ഫയൽ ഉടൻ ഇമ്പോർട്ടുചെയ്യും." - "vCard ഇമ്പോർട്ടുചെയ്യൽ അഭ്യർത്ഥന നിരസിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക." - "%s എന്നത് ഉടൻ എക്‌സ്‌പോർട്ടുചെയ്യും." - "ഫയൽ ഉടൻ എക്സ്പോർട്ടുചെയ്യും." - "കോൺടാക്റ്റുകൾ താമസിയാതെ എക്സ്പോർട്ടുചെയ്യും." - "vCard എക്‌സ്‌പോർട്ടുചെയ്യൽ അഭ്യർത്ഥന നിരസിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക." - "കോൺടാക്റ്റ്" - "പ്രാദേശിക താൽക്കാലിക സംഭരണത്തിലേക്ക് vCard (vCard-കൾ) കാഷെ ചെയ്യുന്നു. യഥാർത്ഥ ഇമ്പോർട്ടുചെയ്യൽ ഉടൻ ആരംഭിക്കും." - "vCard ഇമ്പോർട്ടുചെയ്യാനായില്ല." - "NFC മുഖേന ലഭിച്ച കോൺടാക്റ്റ്" - "കോൺടാക്റ്റുകൾ എക്‌സ്‌പോർട്ടുചെയ്യണോ?" - "കാഷെ ചെയ്യൽ" - "%s/%s ഇമ്പോർട്ടുചെയ്യുന്നു: %s" - ".vcf ഫയലിലേക്ക് എക്സ്പോർട്ട് ചെയ്യൂ" "ഇതുപ്രകാരം അടുക്കുക" "ഫസ്റ്റ് നെയിം" "ലാസ്റ്റ് നെയിം" "പേരിന്റെ ഫോർമാറ്റ്" "ഫസ്റ്റ് നെയിം ആദ്യം" "ലാസ്റ്റ് നെയിം ആദ്യം" - "പുതുകോൺടാക്റ്റുകൾക്കുള്ള ഡിഫോൾട്ട് അക്കൗണ്ട്" - "കോൺടാക്റ്റ് മെറ്റാഡാറ്റ സമന്വയിപ്പിക്കുക" - "കോണ്‍ടാക്റ്റുകളെ കുറിച്ച്" - "ക്രമീകരണം" - "ദൃശ്യമായ കോൺടാക്റ്റുകൾ പങ്കിടുക" - "ദൃശ്യമായ കോൺടാക്റ്റുകൾ പങ്കിടുന്നത് പരാജയപ്പെട്ടു." - "പ്രിയപ്പെട്ട കോൺടാക്റ്റുകൾ പങ്കിടുക" - "എല്ലാ കോൺടാക്റ്റുകളും പങ്കിടുക" - "കോൺടാക്റ്റുകൾ പങ്കിടുന്നത് പരാജയം." - "കോൺടാക്റ്റ് ഡൗൺലോഡ്/അപ്‌ലോഡ്" - "കോൺടാക്റ്റുകൾ ഇമ്പോർട്ടുചെയ്യുക" - "ഈ കോൺടാക്റ്റ് പങ്കിടാനാകില്ല." - "പങ്കിടാൻ കോൺടാക്റ്റുകളൊന്നും ഇല്ല." - "തിരയുക" - "കോൺടാക്റ്റ് കണ്ടെത്തൂ" - "പ്രിയപ്പെട്ടവർ" - "കോൺടാക്റ്റുകൾ ഒന്നുമില്ല." - "ദൃശ്യമായ കോൺടാക്റ്റുകളൊന്നുമില്ല." - "പ്രിയപ്പെട്ടവയൊന്നുമില്ല" - "%s എന്നതിൽ കോൺടാക്റ്റുകളൊന്നുമില്ല" "സ്ഥിരംവിളിക്കുന്നവരെ മായ്‌ക്കൂ" - "സിം കാർഡ് തിരഞ്ഞെടുക്കുക" - "മാനേജുചെയ്യുക" - "ഡൗൺലോഡ്/അപ്‌ലോഡ്" - "%1$s വഴി" - "%2$s വഴി %1$s" "തിരയൽ നിർത്തുക" "തിരയൽ മായ്ക്കുക" - "കോൺടാക്‌റ്റ് ഡിസ്പ്ലേ ഓപ്ഷനുകൾ" "അക്കൗണ്ട്" "ഇത് എല്ലായ്‌പ്പോഴും കോളുകൾക്കായി ഉപയോഗിക്കുക" "ഇത് ഉപയോഗിച്ച് വിളിക്കുക" @@ -248,19 +151,12 @@ "കോളിനൊപ്പം അയയ്ക്കുന്നതിന് ഒരു കുറിപ്പ് ടൈപ്പുചെയ്യുക ..." "അയയ്‌ക്കുകയും വിളിക്കുകയും ചെയ്യുക" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ടാബ്." %1$s ടാബ്. %2$d വായിക്കാത്ത ഇനങ്ങൾ. %1$s ടാബ്. %2$d വായിക്കാത്ത ഇനം. - "ബിൽഡ് പതിപ്പ്" - "ഓപ്പൺ സോഴ്‌സ് ലൈസൻസ്" - "ഓപ്പൺ സോഴ്‌സ് സോഫ്റ്റ്‌വെയറിനായുള്ള ലൈസൻസ് വിശദാംശങ്ങൾ" - "സ്വകാര്യതാ നയം" - "സേവന നിബന്ധനകൾ" - "ഓപ്പൺ സോഴ്‌സ് ലൈസൻസ്" - "url തുറക്കാനായില്ല." "വീഡിയോ കോള്‍" "പങ്കിടുക, കോൾ ചെയ്യുക" diff --git a/java/com/android/contacts/common/res/values-mn/strings.xml b/java/com/android/contacts/common/res/values-mn/strings.xml index f0a8c9245..b91b9a994 100644 --- a/java/com/android/contacts/common/res/values-mn/strings.xml +++ b/java/com/android/contacts/common/res/values-mn/strings.xml @@ -18,7 +18,6 @@ "Текст хуулагдав" - "Түр санах ойд хуулах" "%s руу залгах" "Гэрийн утас руу залгах" "Гар утас руу залгах" @@ -40,7 +39,6 @@ "Ажлын пейжер рүү залгах" "%s руу залгах" "MMS рүү залгах" - "%s (Залгах)" "%s руу зурвас илгээх" "Гэрийн утас руу зурвас илгээх" "Гар утас руу зурвас илгээх" @@ -62,7 +60,6 @@ "Ажлын пейжэр рүү зурвас илгээх" "%s руу зурвас бичих" "MMS руу зурвас илгээх" - "%s (Зурвас илгээх)" "Байнга холбоо барьдаг харилцагчдын жагсаалтыг устгах уу?" "Та холбоо барих хэсэг болон утасны програмд байгаа тогтмол холбоо баридаг хаягуудыг устгах ба имэйл програмуудыг таны холбоо барих хаягуудыг эрэмбэлэх үйлдлийг идэвхжүүлэх болно." "Байнга холбоо барьдаг харилцагчдын жагсаалтыг устгаж байна…" @@ -70,22 +67,14 @@ "Холдсон" "Завгүй" "Харилцагчид" + "Санал болгосон шилдэг" "Бусад" "Директор" "Ажлын лавлагаа" "Бүх харилцагчид" + "Санал болголт" "Би" - "Хайж байна..." - "%d-с олон олдлоо." - "Харилцагч байхгүй" - - %d олдсон - 1 олдсон - - "%1$s-тай шууд холбогдох" "(нэр байхгүй)" - "Байнга залгасан" - "Байнга холбоо барьдаг" "Харилцагчийг харах" "Утасны дугаартай бүх харилцагчид" "Ажлын профайлын харилцагч" @@ -125,8 +114,6 @@ "%s рүү имэйлдэх" "Имэйлдэх" "Гудамж" - "ШХ" - "Хөрш" "Хот" "Муж улс" "Зип код" @@ -144,103 +131,19 @@ "ICQ ашиглан чатлах" "Jabber ашиглан чатлах" "Чат" - "устгах" - "Нэрийн талбаруудыг дэлгэх буюу хумих" - "Нэр галиглах талбарыг дэлгэх болон хумих" "Бүх харилцагч" - "Дууссан" - "Цуцлах" "%s доторх харилцагчид" "Хувийн тохиргоотой харагдац дахь харилцагчид" "Ганц харилцагч" - "Импортолсон харилцагчийн хаягийг хадгалах:" - "SIM картаас импортлох" - "SIM ^1 - ^2-с импортлох" - "SIM %1$s-с импортлох" - ".vcf файлаас импортлох" - "%s-г импорт хийхийг цуцлах уу?" - "%s-г экспорт хийхийг цуцлах уу?" - "vCard импорт/экспорт хийхийг цуцлаж чадсангүй" - "Тодорхойгүй алдаа." - "\"%s\"-г нээж чадсангүй: %s." - "Экспорт хийгчийг эхлүүлж чадсангүй: \"%s\"." - "Экспорт хийж болох харилцагч байхгүй." - "Та шаардлагатай зөвшөөрлийг идэвхгүй болгосон байна." - "Экспорт хийх явцад алдаа гарсан: \"%s\"." - "Шаардагдах файлын нэр хэт урт (\"%s\")" - "I/O алдаа" - "Санах ой хүрэхгүй байна. Файл хэт том байж магадгүй." - "Тодорхойгүй шалтгаанаар vCard-г задлаж чадсангүй." - "Формат нь дэмжигдэхгүй байна." - "Өгөгдсөн vCard файлын мета мэдээллийг цуглуулж чадсангүй." - "Нэг буюу хэд хэдэн файлыг импорт хийж чадсангүй (%s)." - "%s-г экспорт хийж дууссан." - "Харилцагчийн жагсаалтыг экспортолж дууслаа." - "Харилцагчдыг экспортолж дууссан. Харилцагчдыг хуваалцахын тулд мэдэгдлийг дарна уу." - "Харилцагчдыг хуваалцахын тулд дарна уу." - "%s-г экспорт хийхийг цуцлав." - "Харилцагчийн өгөгдлийг экспорт хийж байна" - "Харилцагчийн датаг экспортолсон." - "Өгөгдлийн сангийн мэдээллийг авч чадсангүй" - "Экспорт хийж болох харилцагчид алга байна. Хэрэв та төхөөрөмжиндөө харилцагчидтай байгаа бол зарим дата нийлүүлэгчээс харилцагчдын мэдээллийг төхөөрөмжөөс экспорт хийхийг зөвшөөрөхгүй байж магадгүй." - "vCard бичигч зохих ёсоор эхэлсэнгүй." - "Экспорт хийж чадсангүй" - "Харилцагчийн өгөгдлийг экспорт хийсэнгүй.\nШалтгаан: \"%s\"" - "%s-г импорт хийж байна" - "vCard өгөгдлийг уншиж чадсангүй" - "vCard өгөгдөл уншихыг цуцлав" - "vCard %s -г импорт хийж дууссан" - "%s-г импорт хийхийг цуцлав" - "%s-г удахгүй импортлох болно." - "Файлыг удахгүй импортлох болно." - "vCard импортлох хүсэлтийг зөвшөөрсөнгүй. Дараа дахин оролдоно уу." - "%s-г удахгүй экспорт хийх болно." - "Энэ файлыг удахгүй экспортлох болно." - "Харилцагчдыг удахгүй экспортлох болно." - "vCard экспорт хийх хүсэлтийг зөвшөөрсөнгүй. Дараа дахин оролдоно уу." - "харилцагч" - "vCard-г дотоод түр санд кеш хийж байна. Удахгүй бодитоор импорт хийж эхлэх болно." - "vCard-г импорт хийж чадсангүй." - "NFC-р хүлээн авсан харилцагч" - "Харилцагчдыг экспорт хийх үү?" - "Кеш хийж байна" - "%s/%s-г импортолж байна: %s" - ".vcf файл болгож экспортлох" "Эрэмбэлэх" "Өөрийн нэр" "Овог" "Нэрийн формат" "Нэрийг эхэнд нь" "Овгийг эхэнд нь" - "Шинэ харилцагчийн өгөгдмөл бүртгэл" - "Харилцагчдын мета-өгөгдлийг синк хийх" - "Харилцагчийн хаягийн тухай" - "Тохиргоо" - "Харагдах харилцагчдыг хуваалцах" - "Харагдаж байгаа харилцагчийн хаягийг хуваалцаж чадсангүй." - "Дуртай харилцагчдаа хуваалцах" - "Бүх харилцагчдыг хуваалцах" - "Харилцагчдыг хуваалцаж чадсангүй." - "Харилцагчид импортлох/экспортлох" - "Харилцагчид импортлох" - "Энэ харилцагчийг хуваалцах боломжгүй." - "Хуваалцах харилцагчийн жагсаалт алга." - "Хайлт" - "Харилцагч хайх" - "Дуртай" - "Харилцагч байхгүй." - "Харагдах харилцагчид байхгүй." - "Дуртай зүйл алга" - "%s дотор харилцагчид байхгүй" "Байнга харилцсаныг арилгах" - "SIM карт сонгоно уу" - "Бүртгэлийг удирдах" - "Импорт/экспорт" - "%1$s-р" - "%2$s%1$s" "хайлтыг зогсоох" "Хайлтыг цэвэрлэх" - "Харилцагчийн харагдах сонголт" "Бүртгэл" "Дуудлагад байнга үүнийг ашиглах" "Залгах" @@ -248,19 +151,12 @@ "Дуудлаганд илгээх тэмдэглэл бичнэ үү..." "ИЛГЭЭХ, ДУУДЛАГА" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s таб." %1$s таб. %2$d уншаагүй зүйл. %1$s таб. %2$d уншаагүй зүйл. - "Боловсруулсан хувилбар" - "Нээлттэй Эхийн Лиценз" - "Нээлттэй эхийн програм хангамжийн лицензийн мэдээлэл" - "Нууцлалын Бодлого" - "Үйлчилгээний нөхцөл" - "Нээлттэй эхийн лиценз" - "URL-г нээж чадсангүй." "Видео дуудлага" "Хуваалцаад залгах" diff --git a/java/com/android/contacts/common/res/values-mr/strings.xml b/java/com/android/contacts/common/res/values-mr/strings.xml index 96504c7bc..a0172e6b7 100644 --- a/java/com/android/contacts/common/res/values-mr/strings.xml +++ b/java/com/android/contacts/common/res/values-mr/strings.xml @@ -18,7 +18,6 @@ "मजकूर कॉपी केला" - "क्लिपबोर्डवर कॉपी करा" "%s ला कॉल करा" "निवासस्‍थानी कॉल करा" "मोबाईलवर कॉल करा" @@ -40,7 +39,6 @@ "कार्यस्‍थानी पेजरवर कॉल करा" "%s ला कॉल करा" "MMS वर कॉल करा" - "%s (कॉल करा)" "%s मजकूर पाठवा" "निवासस्थानी मजकूर पाठवा" "मोबाईलवर मजकूर पाठवा" @@ -62,7 +60,6 @@ "कार्य पेजरवर मजकूर पाठवा" "%s मजकूर पाठवा" "MMS वर मजकूर पाठवा" - "%s (संदेश पाठवा)" "वारंवार सपर्क साधलेले साफ करायचे?" "आपण संपर्क आणि फोन अ‍ॅप्‍स मधील वारंवार संपर्क साधलेली सूची साफ कराल आणि ईमेल अ‍ॅप्‍सना सुरवातीपासून आपली पत्ता प्राधान्‍ये जाणून घेण्‍याची सक्ती कराल." "वारंवार सपर्क साधलेले साफ करीत आहे..." @@ -70,35 +67,27 @@ "दूर आहे" "व्यस्त" "संपर्क" + "सुचविलेले उत्कृष्ट" "इतर" "निर्देशिका" "कार्य निर्देशिका" "सर्व संपर्क" + "सूचना" "मी" - "शोधत आहे..." - "%d पेक्षा जास्त आढळले." - "कोणतेही संपर्क नाहीत" - - %d सापडला - %d सापडले - - "%1$s साठी द्रुत संपर्क" "(नाव नाही)" - "वारंवार कॉल केलेले" - "वारंवार संपर्क केलेले" "संपर्क पहा" "फोन नंबरसह सर्व संपर्क" "कार्य प्रोफाईल संपर्क" - "अद्यतने पहा" - "केवळ डिव्हाइस, संकालित न केलेला" + "अपडेट पहा" + "केवळ डीव्हाइस, संकालित न केलेला" "नाव" "टोपणनाव" "नाव" "नाव" "आडनाव" - "नाव प्रत्यय" + "नाव उपसर्ग" "मधले नाव" - "नाव प्रत्यय" + "नाव उपसर्ग" "ध्वन्यात्मक नाव" "ध्वन्यात्मक नाव" "ध्वन्यात्मक मधले नाव" @@ -125,8 +114,6 @@ "%s वर ईमेल करा" "ईमेल" "मार्ग" - "PO बॉक्स" - "अतिपरिचित क्षेत्र" "शहर" "राज्य" "पिनकोड" @@ -144,103 +131,19 @@ "ICQ चा वापर करून चॅट करा" "Jabber चा वापर करून चॅट करा" "चॅट करा" - "हटवा" - "नाव फील्‍ड विस्‍तृत करा किंवा संकुचित करा" - "ध्वन्यात्मक नाव फील्ड विस्तृत करा किंवा संकुचित करा" "सर्व संपर्क" - "पूर्ण झाले" - "रद्द करा" "%s मधील संपर्क" "सानुकूल दृश्यामधील संपर्क" "एकल संपर्क" - "आयात केलेले संपर्क यावर जतन करा:" - "सिमकार्डवरुन आयात करा" - "^1 - ^2 SIM वरून आयात करा" - "%1$s SIM वरून आयात करा" - ".vcf फाईल वरून आयात करा" - "%s चे आयात रद्द करायचे?" - "%s चे निर्यात रद्द करायचे?" - "vCard आयात/निर्यात रद्द करू शकलो नाही" - "अज्ञात त्रुटी." - "\"%s\" उघडू शकलो नाही: %s." - "निर्यातकर्ता प्रारंभ करू शकला नाही: \"%s\"." - "कोणताही निर्यात करण्‍यायोग्‍य संपर्क नाही." - "आपण आवश्‍यक असलेली एक परवानगी अक्षम केली आहे." - "निर्यात दरम्‍यान त्रुटी आली: \"%s\"." - "आवश्‍यक फाईल नाव (\"%s\") खूप मोठे आहे." - "I/O त्रुटी" - "पुरेशी मेमरी नाही. फाईल कदाचित खूप मोठी असू शकते." - "अनपेक्षित कारणासाठी vCard विश्लेषण करू शकलो नाही." - "स्वरूपन समर्थित नाही." - "दिलेल्‍या vCard फाईल(यली) ची मेटा माहिती संकलित करू शकलो नाही." - "एक किंवा अधिक फायली आयात केल्‍या जाऊ शकत नाहीत(%s)." - "%s निर्यात करणे समाप्त झाले." - "संपर्क आयात करणे समाप्त झाले" - "संपर्क निर्यात करणे समाप्त झाले, संपर्क सामायिक करण्यासाठी सूचनेवर क्लिक करा." - "संपर्क सामायिक करण्यासाठी टॅप करा." - "%s निर्यात करणे रद्द केले." - "संपर्क डेटा निर्यात करीत आहे" - "संपर्क डेटा निर्यात केला जात आहे." - "डेटाबेस माहिती मिळवू शकलो नाही." - "निर्यात करण्‍यायोग्‍य कोणतेही संपर्क नाहीत. आपल्‍या डिव्हाइसवर आपल्याकडे संपर्क असल्‍यास, काही डेटा प्रदाते डिव्हाइस मधून संपर्क निर्यात करण्‍यास कदाचित अनुमती देणार नाहीत." - "vCard रचनाकाराने योग्‍यरित्‍या प्रारंभ केला नाही." - "निर्यात करू शकलो नाही" - "संपर्क डेटा निर्यात केला नाही.\nकारण: \"%s\"" - "%s आयात करीत आहे" - "vCard डेटा वाचू शकलो नाही" - "vCard डेटा वाचणे रद्द केले" - "vCard %s आयात करणे समाप्त झाले" - "%s आयात करणे रद्द झाले" - "%s लवकरच आयात केली जाईल." - "फाईल लवकरच आयात केली जाईल." - "vCard आयात विनंती नाकारली. नंतर पुन्हा प्रयत्न करा." - "%s लवकरच निर्यात केली जाईल." - "फाईल लवकरच निर्यात केली जाईल." - "संपर्क लवकरच निर्यात केले जातील." - "vCard निर्यात विनंती नाकारली. नंतर पुन्हा प्रयत्न करा." - "संपर्क" - "स्‍थानिक तात्‍पुरत्‍या संचयनावर vCard(s) कॅश करीत आहे. वास्‍तविक आयात लवकरच प्रारंभ होईल." - "vCard आयात करू शकलो नाही." - "NFC वरील संपर्काचे पुनरावलोकन केले" - "संपर्क निर्यात करायचे?" - "कॅश करीत आहे" - "आयात करत आहे %s/%s: %s" - ".vcf फाईलवर निर्यात करा" "नुसार क्रमवारी लावा" "नाव" "आडनाव" "नाव स्वरूपन" "नाव प्रथम" "आडनाव प्रथम" - "नवीन संपर्कांसाठी डीफॉल्ट खाते" - "संपर्क मेटाडेटा संकालित करा" - "संपर्कांबद्दल" - "सेटिंग्ज" - "दृश्यमान संपर्क सामायिक करा" - "दृश्यमान संपर्क सामायिक करण्‍यात अयशस्वी झाले." - "आवडते संपर्क सामायिक करा" - "सर्व संपर्क सामायिक करा" - "संपर्क सामायिक करण्यात अयशस्वी झाले." - "संपर्क आयात/निर्यात करा" - "संपर्क आयात करा" - "हा संपर्क सामायिक केला जाऊ शकत नाही." - "सामायिक करण्यासाठी कोणतेही संपर्क नाहीत." - "शोधा" - "संपर्क शोधा" - "आवडते" - "कोणतेही संपर्क नाहीत." - "कोणतेही दृश्यमान संपर्क नाहीत." - "कोणतेही मनपसंत नाही" - "%s मध्ये कोणतेही सपंर्क नाहीत" "वारंवारता साफ करा" - "सिम कार्ड निवडा" - "खाती व्यवस्थापित करा" - "आयात/निर्यात" - "%1$s द्वारे" - "%2$s द्वारे %1$s" "शोध थांबवा" "शोध साफ करा" - "संपर्क प्रदर्शन पर्याय" "खाते" "कॉलसाठी हे नेहमी वापरा" "यासह कॉल करा" @@ -248,19 +151,12 @@ "कॉलसह पाठविण्‍यासाठी एक टीप टाइप करा..." "पाठवा आणि कॉल करा" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s टॅब." %1$s टॅब. %2$d न वाचलेला आयटम. %1$s टॅब. %2$d न वाचलेले आयटम. - "बिल्ड आवृत्ती" - "मुक्त स्त्रोत परवाने" - "मुक्त स्त्रोत सॉफ्टवेअरसाठी परवाना तपशील" - "गोपनीयता धोरण" - "सेवा अटी" - "मुक्त स्त्रोत परवाने" - "url उघडण्यात अयशस्वी झाले." "व्हिडिओ कॉल" "सामायिक करा आणि कॉल करा" diff --git a/java/com/android/contacts/common/res/values-ms/strings.xml b/java/com/android/contacts/common/res/values-ms/strings.xml index 60d2b7acc..5616c0974 100644 --- a/java/com/android/contacts/common/res/values-ms/strings.xml +++ b/java/com/android/contacts/common/res/values-ms/strings.xml @@ -18,7 +18,6 @@ "Teks disalin" - "Salin ke papan keratan" "Panggil %s" "Panggil nombor rumah" "Panggil nombor mudah alih" @@ -40,7 +39,6 @@ "Panggil alat kelui tempat kerja" "Panggil %s" "Panggil MMS" - "%s (Panggil)" "SMS %s" "SMS rumah" "SMS telefon mudah alih" @@ -62,7 +60,6 @@ "SMS alat kelui tempat kerja" "SMS %s" "SMS nombor MMS" - "%s (Hantar mesej)" "Padam bersih senarai kerap dihubungi?" "Anda akan mengosongkan senarai yang kerap dihubungi dalam apl Kenalan dan Telefon serta memaksa apl e-mel untuk mempelajari pilihan alamat anda dari awal." "Memadam bersih senarai kerap dihubungi..." @@ -70,22 +67,14 @@ "Tiada" "Sibuk" "Kenalan" + "Teratas Dicadangkan" "Lain-lain" "Direktori" "Direktori kerja" "Semua kenalan" + "Cadangan" "Saya" - "Mencari..." - "lebih daripada %d ditemui" - "Tiada kenalan" - - %d ditemui - 1 ditemui - - "Kenalan pantas untuk %1$s" "(Tiada nama)" - "Kerap dipanggil" - "Kerap dihubungi" "Lihat kenalan" "Semua kenalan dengan nombor telefon" "Kenalan profil kerja" @@ -125,8 +114,6 @@ "E-mel %s" "E-mel" "Jalan" - "Peti surat" - "Kawasan kejiranan" "Bandar" "Negeri" "Poskod" @@ -144,103 +131,19 @@ "Sembang menggunakan ICQ" "Sembang menggunakan Jabber" "Sembang" - "padam" - "Kembangkan atau runtuhkan medan nama" - "Kembangkan atau runtuhkan medan nama fonetik" "Semua kenalan" - "Selesai" - "Batal" "Kenalan dalam %s" "Kenalan dalam paparan tersuai" "Kenalan tunggal" - "Simpan kenalan yang diimport ke:" - "Import daripada kad SIM" - "Import dari SIM ^1 - ^2" - "Import dari SIM %1$s" - "Import daripada fail .vcf" - "Batalkan import %s?" - "Batalkan eksport %s?" - "Tidak dapat membatalkan import/eksport vCard" - "Ralat tidak diketahui." - "Tidak dapat membuka \"%s\": %s." - "Tidak dapat memulakan pengeksport: \"%s\"." - "Tiada kenalan yang dapat dieksport." - "Anda telah melumpuhkan kebenaran yang diperlukan." - "Ralat berlaku semasa eksport: \"%s\"." - "Nama fail yang diperlukan terlalu panjang (\"%s\")." - "Ralat I/O" - "Tidak cukup memori. Fail itu mungkin terlalu besar." - "Tidak dapat menghurai vCard atas sebab-sebab yang tidak dijangka." - "Format tidak disokong." - "Tidak dapat mengumpul maklumat meta fail Vcard yang dinyatakan." - "Satu atau lebih fail tidak dapat diimport (%s)." - "Selesai mengeksport %s." - "Selesai mengeksport kenalan." - "Selesai mengeksport kenalan, klik pemberitahuan untuk berkongsi kenalan." - "Ketik untuk berkongsi kenalan." - "Mengeksport %s dibatalkan." - "Mengeksport data kenalan" - "Data kenalan sedang dieksport." - "Tidak boleh mendapatkan maklumat pangkalan data." - "Tiada kenalan yang boleh dieksport. Jika anda mempunyai kenalan pada peranti anda, sesetengah penyedia data mungkin tidak membenarkan kenalan dieksport daripada peranti." - "Komposer vCard tidak bermula dengan betul." - "Tidak dapat mengeksport" - "Data kenalan tidak dieksport.\nAlasan: \"%s\"" - "Mengimport %s" - "Tidak dapat membaca data vCard" - "Membaca data vCard dibatalkan" - "Selesai mengimport vCard %s" - "Pengimportan %s dibatalkan" - "%s akan diimport sebentar lagi." - "Fail akan diimport sebentar lagi." - "Permintaan import vCard telah ditolak. Cuba lagi nanti." - "%sakan dieksport sebentar lagi." - "Fail akan dieksport sebentar lagi." - "Kenalan akan dieksport sebentar lagi." - "Permintaan eksport vCard telah ditolak. Cuba lagi nanti." - "kenalan" - "Membuat cache vCard ke storan sementara setempat. Pengimportan sebenar akan bermula tidak lama lagi." - "Tidak dapat mengimport vCard." - "Diterima dr NFC" - "Eksport kenalan?" - "Mengcache" - "Mengimport %s/%s: %s" - "Eksport ke fail .vcf" "Isih mengikut" "Nama pertama" "Nama keluarga" "Format nama" "Nama pertama dahulu" "Nama keluarga dahulu" - "Akaun lalai untuk kenalan baharu" - "Segerakkan metadata kenalan" - "Perihal Kenalan" - "Tetapan" - "Kongsi kenalan yang kelihatan" - "Gagal berkongsi kenalan yang kelihatan" - "Kongsi kenalan kegemaran" - "Kongsi semua kenalan" - "Gagal berkongsi kenalan." - "Import/eksport kenalan" - "Import kenalan" - "Kenalan ini tidak boleh dikongsi." - "Tiada kenalan untuk dikongsi." - "Carian" - "Cari kenalan" - "Kegemaran" - "Tiada kenalan." - "Tiada kenalan yang dapat dilihat." - "Tiada kegemaran" - "Tiada kenalan dalam %s" "Padam bersih kerap dihubungi" - "Pilih kad SIM" - "Urus akaun" - "Import/eksport" - "melalui %1$s" - "%1$s melalui %2$s" "berhenti mencari" "Kosongkan carian" - "Pilihan paparan kenalan" "Akaun" "Sentiasa gunakan ini untuk panggilan" "Panggil dengan" @@ -248,19 +151,12 @@ "Taip nota untuk dihantar dengan panggilan…" "HANTAR & PANGGIL" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Tab %1$s." Tab %1$s. %2$d item belum dibaca. Tab %1$s. %2$d item belum dibaca. - "Versi binaan" - "Lesen sumber terbuka" - "Butiran lesen untuk perisian sumber terbuka" - "Dasar privasi" - "Syarat perkhidmatan" - "Lesen sumber terbuka" - "Gagal membuka url." "Panggilan video" "Kongsi dan panggil" diff --git a/java/com/android/contacts/common/res/values-my/strings.xml b/java/com/android/contacts/common/res/values-my/strings.xml index d81e8950d..007c147bc 100644 --- a/java/com/android/contacts/common/res/values-my/strings.xml +++ b/java/com/android/contacts/common/res/values-my/strings.xml @@ -18,7 +18,6 @@ "စာသားကူးယူပြီး" - "ခဏကူးယူထားပါ" "%s ကိုခေါ်ပါ" "အိမ်ကိုခေါ်ပါ" "မိုဘိုင်းကိုခေါ်ပါ" @@ -40,7 +39,6 @@ "အလုပ်ပေဂျာကိုခေါ်ပါ" "%s ကိုခေါ်ပါ" "MMS ကိုခေါ်ပါ" - "%s (ခေါ်ပါ)" "%s သို့ စာပို့ပါ" "အိမ်သို့ စာပို့ပါ" "မိုဘိုင်းသို့ စာပို့ပါ" @@ -62,7 +60,6 @@ "အလုပ်ပေ့ဂျာသို့ စာပို့ပါ" "%sထံ စာပို့ပါ" "MMS နံပါတ်သို့ စာပို့ပါ" - "%s (မက်ဆေ့ဂ်ျပို့ပါ)" "အသုံးများသောလိပ်စာများရှင်းပစ်မလား?" "အသုံးများသော အဆက်အသွယ်စာရင်းအား Contacts နှင့် Phone app များမှ သင် ရှင်းလင်းပစ်မှာဖြစ်ပြီး၊ အီးမေးလ် app များအား သင့်နှစ်သက်ရာ ​ပ​ြောဆိုဆက်ဆံမှုပုံစံကို အစမှပြန်လည် လေ့လာခိုင်းမည်။" "အသုံးများသောလိပ်စာများ ရှင်းလင်းနေစဉ်" @@ -70,22 +67,14 @@ "အဝေးရောက်နေပါသည်" "အလုပ်များနေသည်" "အဆက်အသွယ်များ" + "ထိပ်တန်း အကြံပြုထားပါသည်" "တစ်ခြား" "လမ်းညွှန်" "အလုပ်လမ်းညွှန်" "လိပ်စာများအားလုံး" + "အကြံပြုချက်များ" "ကျွန်ုပ်" - "ရှာဖွေနေသည်…" - "%d ထက်ပိုတွေ့ရှိသည်" - "အဆက်အသွယ်များမရှိပါ" - - %d ခု တွေ့ပါသည် - ၁ ခု တွေ့ပါသည် - - "%1$s အတွက် အမြန်ဆက်သွယ်လိပ်စာ" "(အမည်မရှိ)" - "မကြာခဏခေါ်ရန်သူများ" - "မကြာခဏဆက်သွယ်ရန်သူများ" "အဆက်အသွယ်ကိုကြည့်ရန်" "ဖုန်းနံပါတ်ပါသော လိပ်စာများအားလုံး" "အလုပ်ပရိုဖိုင် အဆက်အသွယ်များ" @@ -125,8 +114,6 @@ "အီးမေးလ် %s" "အီးမေးလ်" "လမ်း" - "စာတိုက်သေတ္တာ" - "ပတ်ဝန်းကျင်" "မြို့" "ပြည်နယ်" "စာပို့သင်္ကေတ" @@ -144,103 +131,19 @@ "ICQ သုံး၍ ချက်တင်ပြုလုပ်ခြင်း" "Jabberသုံး၍ ချက်တင်ပြုလုပ်ခြင်း" "ချက်တင်းပြောသည်" - "ဖျက်သည်" - "နာမည်အကွက်များအား ဖြန့်ချ သို့မဟုတ် လိပ်တင်ပါ" - "အသံထွက်ဆိုင်ရာ အကွက်များကို တိုးချဲ့ သို့မဟုတ် ခေါက်သိမ်းပါ" "ဆက်သွယ်အားလုံး" - "ပြီးပါပြီ" - "မလုပ်တော့ပါ" "%s ထဲမှ အဆက်အသွယ်များ" "မိမိစိတ်ကြိုက် မြင်ကွင်းမှ" "အဆက်အသွယ်တစ်ခုတည်း" - "သွင်းထားသည့် အဆက်အသွယ်များကို သိမ်းဆည်းရန် −" - "ဆင်းမ်ကဒ်ထဲမှ အထဲသို့သွင်းရန်" - "ဆင်းမ်ကဒ်မှ သွင်းယူရန် ^1 - ^2" - "ဆင်းမ်ကဒ်မှ သွင်းယူရန် %1$s" - ".vcf ဖိုင်မှသွင်းမည်" - "%s ကို အထဲသို့သွင်းခြင်းအား ရပ်တန့်မလား?" - "%s ကိုအပြင်သို့ထုတ်ခြင်းအား ရပ်တန့်မလား?" - "လိပ်စာကဒ် အသွင်း၊အထုတ်ကို ရပ်၍မရပါ" - "အမည်မသိသော မှားယွင်းမှု" - "\"%s\" ကို ဖွင့်၍မရပါ - %s။" - "အပြင်ထုတ်သောစနစ်အား စတင်လို့မရပါ: \"%s\"." - "အပြင်သို့ထုတ်ယူရနိုင်သော အဆက်အသွယ်မရှိပါ" - "လိုအပ်သည့် ခွင့်ပြုချက်ကို သင်ပိတ်လိုက်သည်။" - "အပြင်ထုတ်နေစဉ် အမှားပေါ်ပါသည်: \"%s\"." - "လိုအပ်သောဖိုင်နာမည် အလွန်ရှည်နေပါသည် (\"%s\")." - "I/O အမှား" - "လုံလောက်သော မှတ်ဉာဏ်မရှိပါ။ ဖိုင်အရမ်းကြီးနေတာ ဖြစ်နိုင်ပါသည်" - "လိပ်စာကဒ်အား အမျိုးအမည်မသိအမှားကြောင့် ဖတ်လို့မရပါ" - "ပံ့ပိုးမှုပေးနိုင်သော ပုံစံမဟုတ်ပါ" - "ဖော်ပြပါ လိပ်စာကဒ်ဖိုင်(များ)၏ အချက်အလက်များအား စုဆောင်းလို့မရပါ" - "ဖိုင်တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော ဖိုင်များအား အထဲသို့သွင်းလို့မရပါ(%s)." - "%s ကို အပြင်ထုတ်ခြင်းပြီးစီးပါပြီး" - "အဆက်အသွယ်များ တင်ပို့ခြင်း ပြီးပါပြီ။" - "အဆက်အသွယ်များကို တင်ပို့ပြီးပါပြီ၊ အဆက်အသွယ်များကို မျှဝေရန် အကြောင်းကြားချက်ကိုနှိပ်ပါ။" - "အဆက်အသွယ်များကို မျှဝေရန် နှိပ်ပါ။" - "%s ကို အပြင်ထုတ်ခြင်းအား ပယ်ဖျက်ပြီး" - "အဆက်အသွယ်ဒေတာများအား အပြင်သို့ထုတ်နေစဉ်" - "အဆက်အသွယ်အချက်အလက်ကို တင်ပို့နေသည်။" - "ဒေတာဘေ့စ်အချက်အလက်အား မရရှိနိုင်ပါ" - "တင်ပို့နိုင်သောအဆက်အသွယ် မရှိပါ။ သင့်ကိရိယာတွင် အဆက်အသွယ်များရှိပါက ဒေတာဝန်ဆောင်မှုအချို့က အဆက်အသွယ်များကို ကိရိယာမှ တင်ပို့ခွင့်မပေးခြင်းမျိုး ဖြစ်နိုင်ပါသည်။" - "လိပ်စာကဒ်ပြုလုပ်သောစန် ကောင်းမွန်စာ မစတင်ပါ" - "အပြင်ထုတ်လို့မရပါ" - "အဆက်အသွယ် အချက်အလက်ကို \nအကြောင်းပြချက်ကြောင့် မထုတ်နိုင်ပါ။ \"%s\"" - "%s အား အထဲသွင်းစဉ်" - "လိပ်စာကဒ်ဒေတာအား ဖတ်မရပါ" - "လိပ်စာကဒ်ဒေတာဖတ်ခြင်းအား ရပ်တန့်ပြီး" - "%s လိပ်စာကဒ် အထဲသွင်းခြင်း ပြီးပါပြီ" - "%s အားအထဲသွင်းခြင်း ရပ်ဆိုင်းပြီး" - "%s ကို မကြာမှီ အထဲသို့ သွင်းပါမည်" - "ဖိုင်အား မကြာမှီ အထဲသို့ သွင်းပါမည်" - "လိပ်စာကဒ်အား အထဲသွင်းရန် တောင်းဆိုမှု ငြင်းဆန်ခံရပါသည်။ နောင်မှ ပြန်လည်ကြိုးစားပါ" - "%s ကို မကြာမီ အပြင်သို့ ထုတ်ပါမည်" - "ဖိုင်အား မကြာမီ တင်ပို့ပါလိမ့်မည်။" - "အဆက်အသွယ်များကို မကြာမီ တင်ပို့သွားပါမည်။" - "လိပ်စာကဒ်အား အပြင်ထုတ်ရန် တောင်းဆိုမှု ငြင်းဆန်ခံရပါသည်။ နောင်မှ ပြန်လည်ကြိုးစားပါ" - "အဆက်အသွယ်" - "လိပ်စာကဒ်(များ)ကို စက်တွင်း ခဏသိမ်းဆည်းရာနေရာသို့ ပို့နေပါသည်။ အမှန်တကယ် တင်သွင်းခြင်း မကြာခင် စပါမည်။" - "လိပ်စာကဒ်အား အထဲသွင်းလို့မရပါ" - "NFCမှရသောလိပ်စာ" - "လိပ်စာများအပြင်သို့ထုတ်မလား?" - "ယာယီသိမ်းထားခြင်း" - "%s/%s ကို သွင်းနေသည် - %s" - ".vcf ဖိုင်သို့ထုတ်မည်" "ဖြင့် စီပေးရန်" "ပထမ အမည်" "နောက်ဆုံး အမည်" "အမည် ချထားပုံစံ" "ပထမ အမည် ဦးစွာ" "နောက်ဆုံး အမည် ဦးစွာ" - "အဆက်အသွယ် အသစ်များအတွက် မူရင်း အကောင့်" - "အဆက်အသွယ် မက်တာဒေတာကို စင့်ခ်လုပ်ပါ" - "အဆက်အသွယ်များ အကြောင်း" - "အပြင်အဆင်များ" - "မြင်နိုင်သော အဆက်အသွယ်များအား မျှဝေပါ" - "မြင်သာသော အဆက်အသွယ်တွေကိုဝေမျှခြင်းမပြုနိုင်ခဲ့ပါ။" - "အကြိုက်ဆုံးအဆက်အသွယ်များကို မျှဝေပါ" - "အဆက်အသွယ်များအားလုံးကို မျှဝေပါ" - "အဆက်အသွယ်များကို မျှဝေခြင်းမအောင်မြင်ပါ။" - "အဆက်အသွယ်များ သွင်းယူ၊ ထုတ်ယူရန်" - "အဆက်အသွယ်များ သွင်းပါ" - "ဒီလိပ်စာအား မျှဝေလို့ မရပါ" - "မျှဝေရန် အဆက်အသွယ်များမရှိပါ။" - "ရှာဖွေရန်" - "အဆက်အသွယ်များရှာပါ" - "အနှစ်သက်ဆုံးများ" - "အဆက်အသွယ်များမရှိပါ။" - "မြင်နိုင်သော အဆက်အသွယ်မရှိပါ" - "အနှစ်သက်ဆုံး မရှိပါ" - "%s ထဲတွင် အဆက်အသွယ်မရှိပါ" "မကြာခဏအရာများအား ဖယ်ရှားရန်" - "ဆင်းမ် ကဒ်ကို ရွေးရန်" - "အကောင့်များကို စီမံကွပ်ကဲရန်" - "သွင်းယူ၊ ထုတ်ယူခြင်း" - "%1$s မှတဆင့်" - "%2$s မှတဆင့် %1$s" "ရှာဖွေမှုကို ရပ်ရန်" "ရှာဖွေမှုကို ရှင်းပါ" - "အဆက်အသွယ် ပြသမှု ရွေးစရာများ" "အကောင့်" "ခေါ်ဆိုမှုများ အတွက် အမြဲတမ်း ဒါကို သုံးရန်" "ဖြင့် ခေါ်ဆိုရန်" @@ -248,19 +151,12 @@ "ခေါ်ဆိုမှုဖြင့် ပေးပို့ရန် မှတ်စုတစ်ခု ရိုက်ပါ ..." "ပေးပို့ပြီး ခေါ်ပါ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s တဘ်။" %1$s တဘ်။ မဖတ်ရသေးသည့် အရာ %2$d ခု။ %1$s တဘ်။ မဖတ်ရသေးသည့် အရာ %2$d ခု။ - "တည်ဆောက်မှု ဗားရှင်း" - "အခမဲ့ ရင်းမြစ် လိုင်စင်များ" - "အခမဲ့ ဆော့ဝဲအတွက် လိုင်စင် အသေးစိတ်များ" - "ပုဂ္ဂိုလ်ရေးဆိုင်ရာ မူဝါဒ" - "ဝန်ဆောင်မှုဆိုင်ရာ စည်းမျဉ်းများ" - "အခမဲ့ရင်းမြစ်လိုင်စင်များ" - "url ကို ဖွင့်၍မရပါ။" "ဗီဒီယို ခေါ်ဆိုမှု" "မျှဝေပြီး ခေါ်ဆိုရန်" diff --git a/java/com/android/contacts/common/res/values-nb/strings.xml b/java/com/android/contacts/common/res/values-nb/strings.xml index 7085cb381..707033a6a 100644 --- a/java/com/android/contacts/common/res/values-nb/strings.xml +++ b/java/com/android/contacts/common/res/values-nb/strings.xml @@ -18,7 +18,6 @@ "Tekst kopiert" - "Kopier til utklippstavlen" "Ring %s" "Ring hjem" "Ring mobilnummer" @@ -40,7 +39,6 @@ "Ring personsøkernummer (arbeid)" "Ring %s" "Ring multimediemeldingnummer" - "%s (ring)" "Send tekstmelding til %s" "Send tekstmelding til hjemmenummer" "Send tekstmelding til mobilnummer" @@ -62,7 +60,6 @@ "Send tekstmelding til personsøkernummer (arbeid)" "Send tekstmelding til %s" "Send tekstmelding til multimediemeldingnummer" - "%s (send en melding)" "Vil du fjerne ofte kontaktede personer?" "Du fjerner listen over ofte kontaktede personer i Kontakter- og Telefon-appene, og tvinger e-postappene til å lære seg adresseinnstillingene dine på nytt." "Fjerner ofte kontaktede personer ..." @@ -70,22 +67,14 @@ "Borte" "Opptatt" "Kontakter" + "Toppforslag" "Annen" "Katalog" "Jobbkatalog" "Alle kontakter" + "Forslag" "Meg" - "Søker …" - "Fant mer enn %d." - "Ingen kontakter" - - %d er funnet - 1 er funnet - - "Hurtigkontakt for %1$s" "(Uten navn)" - "Ofte oppringt" - "Ofte kontaktet" "Se kontakten" "Alle kontakter med telefonnumre" "Jobbprofilkontakter" @@ -125,8 +114,6 @@ "Send e-post (%s)" "Send e-post" "Gate" - "Postboks" - "Nabolag" "By" "Fylke/delstat" "Postnummer" @@ -144,103 +131,19 @@ "Nettprat med ICQ" "Nettprat med Jabber" "Nettprat" - "slett" - "Vis eller skjul navnefelt" - "Vis eller skjul fonetiske navnefelt" "Alle kontakter" - "Ferdig" - "Avbryt" "Kontakter i %s" "Kontakter i tilpasset visning" "Enkeltkontakt" - "Lagre importerte kontakter i:" - "Importér fra SIM-kort" - "Importér fra SIM-kortet ^1^2" - "Importér fra SIM-kortet %1$s" - "Importer fra .vcf-fil" - "Vil du avbryte importeringen av %s?" - "Vil du avbryte eksporteringen av %s?" - "Kunne ikke avbryte imp./eksp. av vCard" - "Ukjent feil." - "Kunne ikke åpne «%s»: %s" - "Kunne ikke starte eksporteringen: %s." - "Du har ingen kontakter som kan eksporteres." - "Du har slått av en nødvendig tillatelse." - "Det oppsto en feil under eksporteringen: %s." - "Det obligatoriske filnavnet er for langt (%s)." - "Inn-/ut-feil" - "Ikke nok minne. Det er mulig at filen er for stor." - "Kan ikke analysere vCard pga. uventet årsak." - "Formatet støttes ikke." - "Kunne ikke hente metainformasjon for aktuell(e) vCard-fil(er)." - "En eller flere filer kan ikke importeres (%s)." - "Eksporteringen av %s er fullført." - "Eksportering av kontaktene er fullført." - "Kontaktdataene er eksportert. Klikk på varselet for å dele kontaktene." - "Trykk for å dele kontaktene." - "Eksporteringen av %s ble avbrutt." - "Eksporterer kontaktdata" - "Kontaktdataene eksporteres." - "Kunne ikke hente databaseinformasjon." - "Du har ingen kontakter som kan eksporteres. Har du kontakter på enheten din, vil enkelte dataleverandører muligens ikke tillate at kontaktene eksporteres." - "vCard-oppretteren startet ikke som den skulle." - "Eksporten mislyktes" - "Kontaktdataene ble ikke eksportert.\nÅrsak: %s" - "Importerer %s" - "Kunne ikke lese vCard-dataene" - "Lesingen av vCard-dataene ble avbrutt" - "Importen av vCard-filen %s er fullført" - "Importeringen av %s ble avbrutt" - "%s blir snart importert." - "Filen importeres snart." - "Forespørselen om vCard-importering ble avvist. Prøv på nytt senere." - "%s blir snart eksportert." - "Filen eksporteres snart." - "Kontaktene eksporteres snart." - "Forespørselen om eksport av vCard ble avvist. Prøv på nytt senere." - "kontakt" - "Bufrer vCard for import til lokal, midlertidig lagring. Selve importeringen starter snart." - "Kunne ikke importere vCard." - "Kontakt mottatt via NFC" - "Vil du eksportere kontaktene?" - "Bufrer" - "Importerer %s/%s: %s" - "Eksportér til .vcf-fil" "Sortér etter" "Fornavn" "Etternavn" "Navneformat" "Fornavnet først" "Etternavnet først" - "Standardkonto for nye kontakter" - "Synkroniser metadata for kontakter" - "Om Kontakter" - "Innstillinger" - "Del synlige kontakter" - "Delingen av synlige kontakter mislyktes." - "Del favorittkontaktene" - "Del alle kontaktene" - "Kunne ikke dele kontaktene." - "Importér/eksportér kontakter" - "Importér kontakter" - "Denne kontakten kan ikke deles." - "Det finnes ingen kontakter å dele." - "Søk" - "Finn kontakter" - "Favoritter" - "Ingen kontakter." - "Ingen synlige kontakter." - "Ingen favoritter" - "Ingen kontakter i %s" "Fjern ofte kontaktede personer" - "Velg SIM-kort" - "Administrer kontoer" - "Importér/eksportér" - "via %1$s" - "%1$s via %2$s" "avslutt søket" "Slett søk" - "Alternativer for visning av kontakter" "Konto" "Bruk alltid dette for samtaler" "Ring med" @@ -248,19 +151,12 @@ "Skriv et notat du vil sende med anropet …" "SEND OG RING" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s-fanen." %1$s-fanen. %2$d uleste elementer. %1$s-fanen. %2$d ulest element. - "Delversjon" - "Åpen kildekode-lisenser" - "Lisensdetaljer for programvare med åpen kildekode" - "Personvern" - "Vilkår for bruk" - "Lisenser for åpen kildekode" - "Kunne ikke åpne nettadressen." "Videosamtale" "Del og ring" diff --git a/java/com/android/contacts/common/res/values-ne/strings.xml b/java/com/android/contacts/common/res/values-ne/strings.xml index 1f54232af..6a41f6759 100644 --- a/java/com/android/contacts/common/res/values-ne/strings.xml +++ b/java/com/android/contacts/common/res/values-ne/strings.xml @@ -18,7 +18,6 @@ "पाठको प्रतिलिपि गरियो" - "क्लिपबोर्डमा प्रतिलिपि गर्नुहोस्" "%s लाई कल गर्नुहोस्" "घरमा कल गर्नुहोस्" "मोबाइलमा कल गर्नुहोस्" @@ -40,7 +39,6 @@ "काम पेजरमा कल गर्नुहोस्" "%s लाई कल गर्नुहोस्" "MMS लाई कल गर्नुहोस्" - "%s (फोन गर्नुहोस्)" "पाठ %s" "पाठ घर" "पाठ मोबाइल" @@ -62,7 +60,6 @@ "पाठ काम पेजर" "पाठ %s" "पाठ MMS" - "%s (सन्देश पठाउनुहोस्)" "प्रायः सम्पर्क भएकालाई हटाउने?" "तपाईंले सम्पर्कहरू र फोन अनुप्रयोगहरूमा बारम्बार सम्पर्क गरेको सूची खाली गर्नुहुनेछ र स्क्रयाचबाट तपाईंको ठेगाना प्राथमिकताहरू सिक्नको लागि इमेल अनुप्रयोगहरूलाई दबाब दिनुहुनेछ।" "बारम्बार सम्पर्क गरिएकाहरूलाई मेटाउँदै ..." @@ -70,22 +67,14 @@ "टाढा" "व्यस्त" "सम्पर्क" + "सबैभन्दा धेरै सुझाव दिइएको" "अन्य" "निर्देशिका" "कार्यको निर्देशिका" "सबै सम्पर्कहरू" + "सुझावहरू" "म" - "खोजी गर्दै..." - "%dभन्दा बढी पाइयो।" - "कुनै सम्पर्कहरू छैन।" - - %d भेट्टिए - १ भेट्टियो - - "%1$sलाई तत्काल सम्पर्क गर्नुहोस्" "(नाम छैन)" - "बारम्बार कल गरिएको" - "लगातार सम्पर्क गरिएको" "सम्पर्क हेर्नुहोस्" "फोन नम्बर भएका सबै सम्पर्कहरू" "कार्य प्रोफाइलका सम्पर्कहरू" @@ -125,8 +114,6 @@ "%sलाई इमेल गर्नुहोस्" "इमेल गर्नुहोस्" "सडक" - "PO Box:" - "छिमेक" "शहर" "स्थिति" "ZIP कोड" @@ -144,103 +131,19 @@ "ICQको प्रयोग गरेर च्याट गर्नुहोस्" "जाब्बरको प्रयोग गरेर च्याट गर्नुहोस्" "कुराकानी" - "मेटाउनुहोस्" - "नाम फिल्डहरू विस्तार गर्नुहोस् वा खुम्चाउनुहोस्" - "फोनेटिक नाम क्षेत्रहरू विस्तृत गर्नुहोस् वा संक्षिप्त गर्नुहोस्" "सबै सम्पर्कहरू" - "सम्पन्न भयो" - "रद्द गर्नुहोस्" "%sमा सम्पर्कहरू" "कस्टम दृश्यमा रहेका सम्पर्कहरू" "एकल सम्पर्क" - "आयातित् सम्पर्कहरू सुरक्षित गर्नुहोस्:" - "SIM कार्डबाट आयात गर्नुहोस्" - "SIM ^1 - ^2 बाट आयात" - "%1$s सिमबाट आयात" - ".vcf फाइलबाट आयात गर्नुहोस्" - "%sको आयात रद्द गर्ने हो?" - "%s को निर्यात रद्द गर्नहोस्?" - "VCard आयात/निर्यात रद्द गर्न सकेन" - "अज्ञात त्रुटि।" - "\"%s\" लाई खोल्न सकिएन: %s।" - "निर्यातकले सुरु गर्न सकेन \" %s \"।" - "निर्यात गर्न मिल्ने कुनै सम्पर्क छैन।" - "तपाईँले आवश्यक अनुमति असक्षम गर्नुभएको छ।" - "निर्यात गर्दा एउटा त्रुटि देखा पर्‍यो \" %s \"।" - "आवश्यक फाइल नाम धेरै लामो छ (\" %s \")।" - "I/O त्रुटि" - "अप्रयाप्त मेमोरी। फाइल धेरै ठूलो हुन सक्छ।" - "एक अप्रत्यासित कारणले गर्दा vCard पार्स गर्न सकेन।" - "स्वरूप समर्थित छैन।" - "दिइएको vCard फाइल(हरू)को अधिजानकारी जम्मा गर्न सकेन।" - "एक वा बढी फाइलहरू आयात गर्न सकिएन (%s)।" - "%sनिर्यात सकियो।" - "सम्पर्क ठेगानाहरू निर्यात गर्ने सकियो।" - "सम्पर्कहरूलाई निर्यात गर्ने काम सकियो, सम्पर्कहरूलाई साझेदारी गर्न सूचनामा क्लिक गर्नुहोस्।" - "सम्पर्कहरूलाई साझेदारी गर्न ट्याप गर्नुहोस्।" - "%s निर्यात रद्द गरियो।" - "सम्पर्क डेटा निर्यात हुँदै" - "सम्पर्क सम्बन्धी डेटा निर्यात भइरहेको छ।" - "डेटाबेस जानकारी पाउन सकेन।" - "कुनै पनि सम्पर्क ठेगानाहरू निर्यात गर्न मिल्ने किसिमका छैनन्। तपाईँको यन्त्रमा सम्पर्कहरू पक्कै छन् भने पनि केही डेटा प्रदायकहरूले उक्त यन्त्रबाट ती सम्पर्कहरू निर्यात गर्ने अनुमति नदिन सक्छन्।" - "vCard रचनाकार राम्ररी सुरु भएन।" - "निर्यात गर्न सकेन" - "सम्पर्क डेटा निर्यात गरिएको थिएन \n कारण: \" %s \"" - "%sआयत गर्दै" - "VCard डेटा पढ्न सकेन" - "vCard डेटा पढ्ने रद्द भयो" - "vCard आयात गर्ने समाप्त भयो %s" - "%sआयत गर्ने रद्द भयो" - "%s केहीबेर मै आयात गरिने छ।" - "फाइल तुरुन्तै आयात गरिने छ।" - "vCard आयात अनुरोध अस्वीकृत गरियो। पछि फेरि प्रयास गर्नुहोस्।" - "%s तुरुन्तै निर्यात गरिने छ।" - "फाइल तुरुन्तै निर्यात गरिने छ।" - "सम्पर्कहरूलाई चॉंडै निर्यात गरिने छ।" - "vCard निर्यात अनुरोध अस्वीकार गरियो। कृपया फेरि प्रयास गर्नुहोस्।" - "सम्पर्क" - "स्थानीय अस्थायी भण्डारणका लागि vCard (हरू) क्यास गर्दै । वास्तविक आयात छिट्टै सुरु हुने छ।" - "VCard आयात गर्न सकेन।" - "NFCमा प्राप्त सम्पर्क" - "सम्पर्कहरू निर्यात गर्ने?" - "क्यासिङ हुँदै" - "%s/%s लाई आयात गर्दै: %s" - ".vcf फाइलमा निर्यात गर्नुहोस्" "क्रमवद्घ गर्नुहोस्" "नाम" "थर" "नामको ढाँचा" "नाम पहिले" "थर पहिले" - "नयाँ सम्पर्कहरूका लागि पूर्वनिर्धारित खाता" - "सम्पर्क मेटाडाटालाई सिंक गर्नुहोस्" - "सम्पर्कहरूको बारेमा" - "सेटिङहरू" - "देखिने सम्पर्कहरू साझेदारी गर्नुहोस्" - "देख्न सकिने सम्पर्कहरू साझेदारी गर्न असफल भयो।" - "मनपर्ने सम्पर्क साझेदारी गर्नुहोस्" - "सबै सम्पर्क साझेदारी गर्नुहोस्" - "सम्पर्कहरू साझेदारी गर्न असफल भयो।" - "आयात/निर्यात सम्पर्कहरू" - "सम्पर्कहरूलाई आयात गर्नुहोस्" - "यस सम्पर्कलाई साझेदारी गर्न सकिँदैन।" - "साझेदारी गर्न कुनै सम्पर्क ठेगानाहरू छैनन्।" - "खोजी गर्नुहोस्" - "सम्पर्क पत्ता लगाउनुहोस्" - "मनपर्नेहरू" - "कुनै सम्पर्क छैन।" - "देखिने कुनै सम्पर्कहरू छैनन्।" - "मनपर्नेहरू छैनन्" - "%s मा कुनै सम्पर्कहरू छैनन्" "बारम्बारताहरू हटाउनुहोस्" - "सिम कार्ड चयन गर्नुहोस्" - "खाताहरू व्यवस्थापन गर्नुहोस्" - "आयात/निर्यात" - "%1$sको मार्फत" - "%1$s मार्फत %2$s" "खोजी गर्न रोक्नुहोस्" "खोजी सफा गर्नुहोस्" - "सम्पर्क प्रदर्शन विकल्पहरू" "खाता" "कल गर्नका लागि यसको प्रयोग सधैं गर्नुहोस्" "संग कल" @@ -248,19 +151,12 @@ "यस कलसँग पठाउन एक टिप्पणी टाइप गर्नुहोस्" "पठाउनुहोस् र कल गर्नुहोस्" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ट्याब।" %1$s ट्याब। %2$d नपढिएका वस्तुहरू। %1$s ट्याब। %2$d नपढिएको वस्तु। - "बिल्ड संस्करण" - "खुलास्रोत इजाजतपत्रहरू" - "खुला स्रोतका सफ्टवेयरका इजाजतपत्र सम्बन्धी विवरणहरू" - "गोपनीयता नीति" - "सेवा सर्तहरू" - "खुला स्रोत सम्बन्धी इजाजतपत्रहरू" - "url खोल्न सकिएन।" "भिडियो कल" "आदान-प्रदान र कल गर्नुहोस्" diff --git a/java/com/android/contacts/common/res/values-nl/strings.xml b/java/com/android/contacts/common/res/values-nl/strings.xml index 9d41899f1..9fd2415b4 100644 --- a/java/com/android/contacts/common/res/values-nl/strings.xml +++ b/java/com/android/contacts/common/res/values-nl/strings.xml @@ -18,7 +18,6 @@ "Tekst gekopieerd" - "Kopiëren naar klembord" "%s bellen" "Privé bellen" "Mobiel bellen" @@ -40,7 +39,6 @@ "Pager werk bellen" "%s bellen" "MMS bellen" - "%s (bellen)" "Sms\'en naar %s" "Sms\'en naar huis" "Sms\'en naar mobiel" @@ -62,7 +60,6 @@ "Sms\'en naar pager werk" "Sms\'en naar %s" "Sms\'en naar MMS" - "%s (sms\'en)" "Lijst regelmatige contacten wissen?" "Je wist de lijst met contacten waarmee je regelmatig contact opneemt in de apps Contacten en Telefoon, en e-mailapps moeten je voorkeursadressen weer opnieuw leren." "Regelmatige contacten wissen..." @@ -70,22 +67,14 @@ "Niet beschikbaar" "Bezet" "Contacten" + "Populaire suggesties" "Overig" "Directory" "Zakelijke contactenlijst" "Alle contacten" + "Suggesties" "Ik" - "Zoeken..." - "Meer dan %d gevonden." - "Geen contacten" - - %d gevonden - 1 gevonden - - "Snelcontact voor %1$s" "(Geen naam)" - "Vaak gebeld" - "Regelmatig contact mee opgenomen" "Contact weergeven" "Alle contacten met telefoonnummers" "Contacten uit werkprofiel" @@ -125,8 +114,6 @@ "E-mailen naar %s" "E-mailen" "Straat" - "Postbus" - "Buurt" "Stad" "Staat" "Postcode" @@ -144,103 +131,19 @@ "Chatten via ICQ" "Chatten via Jabber" "Chat" - "verwijderen" - "Naamvelden uitvouwen of samenvouwen" - "Fonetische naamvelden uitvouwen of samenvouwen" "Alle contacten" - "Gereed" - "Annuleren" "Contacten in %s" "Contacten in aangepaste weergave" "Eén contact" - "Geïmporteerde contacten opslaan in:" - "Importeren van simkaart" - "Importeren van simkaart ^1 - ^2" - "Importeren van simkaart %1$s" - "Importeren uit VCF-bestand" - "Import van %s annuleren?" - "Export van %s annuleren?" - "Kan vCard-import/export niet annuleren" - "Onbekende fout." - "Kan \'%s\' niet openen: %s." - "Kan het exportprogramma niet starten: \'%s\'." - "Er is geen contact dat kan worden geëxporteerd." - "Je hebt een vereist recht uitgeschakeld." - "Er is een fout opgetreden tijdens het exporteren: \'%s\'." - "Vereiste bestandsnaam is te lang (\'%s\')." - "I/O-fout" - "Onvoldoende geheugen. Het bestand is mogelijk te groot." - "Kan vCard om onverwachte reden niet parseren." - "De indeling wordt niet ondersteund." - "Kan metadata niet verzamelen uit vCard-bestand(en)." - "Kan een of meer bestanden niet importeren (%s)." - "Exporteren van %s voltooid." - "Contacten geëxporteerd." - "De contacten zijn geëxporteerd. Klik op de melding om contacten te delen." - "Tik om contacten te delen." - "Exporteren van %s geannuleerd." - "Contactgegevens exporteren" - "Contactgegevens worden geëxporteerd." - "Kan databasegegevens niet ophalen." - "Er zijn geen exporteerbare contacten. Als je wel contacten op je apparaat hebt opgeslagen, staat je gegevensprovider het exporteren van contacten van het apparaat mogelijk niet toe." - "De vCard-editor is niet correct gestart." - "Kan niet exporteren" - "De contactgegevens zijn niet geëxporteerd.\nReden: \'%s\'" - "%s importeren" - "Kan vCard-gegevens niet lezen" - "Lezen van vCard-gegevens geannuleerd" - "Importeren van vCard %s voltooid" - "Importeren van %s geannuleerd" - "%s wordt binnenkort geïmporteerd." - "Bestand wordt binnenkort geïmporteerd." - "Verzoek voor vCard-import is geweigerd. Probeer het later opnieuw." - "%s wordt binnenkort geëxporteerd." - "Dit bestand wordt binnenkort geëxporteerd." - "Contacten worden binnenkort geëxporteerd." - "Verzoek voor vCard-export is geweigerd. Probeer het later opnieuw." - "contact" - "Bezig met opslaan van vCard(s) in de lokale tijdelijke opslag. Het daadwerkelijke importeren begint binnenkort." - "Kan vCard niet importeren." - "Contact via NFC" - "Contacten exporteren?" - "In cachegeheugen opslaan" - "%s/%s importeren: %s" - "Exporteren naar VCF-bestand" "Sorteren op" "Voornaam" "Achternaam" "Naamindeling" "Voornaam eerst" "Achternaam eerst" - "Standaardaccount voor nieuwe contacten" - "Metadata van contacten synchroniseren" - "Over Contacten" - "Instellingen" - "Zichtbare contacten delen" - "Kan zichtbare contacten niet delen." - "Favoriete contacten delen" - "Alle contacten delen" - "Kan contacten niet delen." - "Contacten importeren/exporteren" - "Contacten importeren" - "Dit contact kan niet worden gedeeld." - "Er zijn geen contacten om te delen." - "Zoeken" - "Contacten zoeken" - "Favorieten" - "Geen contacten." - "Geen zichtbare contacten." - "Geen favorieten" - "Geen contacten in %s" "Regelmatige contacten wissen" - "Simkaart selecteren" - "Accounts beheren" - "Importeren/exporteren" - "via %1$s" - "%1$s via %2$s" "stoppen met zoeken" "Zoekopdracht wissen" - "Opties voor contactweergave" "Account" "Altijd gebruiken voor oproepen" "Bellen met" @@ -248,19 +151,12 @@ "Typ een notitie om te verzenden met de oproep..." "VERZENDEN EN BELLEN" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Tabblad %1$s." Tabblad %1$s. %2$d ongelezen items. Tabblad %1$s. %2$d ongelezen item. - "Buildversie" - "Open-sourcelicenties" - "Licentiedetails voor open-sourcesoftware" - "Privacybeleid" - "Servicevoorwaarden" - "Open-sourcelicenties" - "Kan de URL niet openen." "Videogesprek" "Delen en bellen" diff --git a/java/com/android/contacts/common/res/values-no/strings.xml b/java/com/android/contacts/common/res/values-no/strings.xml index 7085cb381..707033a6a 100644 --- a/java/com/android/contacts/common/res/values-no/strings.xml +++ b/java/com/android/contacts/common/res/values-no/strings.xml @@ -18,7 +18,6 @@ "Tekst kopiert" - "Kopier til utklippstavlen" "Ring %s" "Ring hjem" "Ring mobilnummer" @@ -40,7 +39,6 @@ "Ring personsøkernummer (arbeid)" "Ring %s" "Ring multimediemeldingnummer" - "%s (ring)" "Send tekstmelding til %s" "Send tekstmelding til hjemmenummer" "Send tekstmelding til mobilnummer" @@ -62,7 +60,6 @@ "Send tekstmelding til personsøkernummer (arbeid)" "Send tekstmelding til %s" "Send tekstmelding til multimediemeldingnummer" - "%s (send en melding)" "Vil du fjerne ofte kontaktede personer?" "Du fjerner listen over ofte kontaktede personer i Kontakter- og Telefon-appene, og tvinger e-postappene til å lære seg adresseinnstillingene dine på nytt." "Fjerner ofte kontaktede personer ..." @@ -70,22 +67,14 @@ "Borte" "Opptatt" "Kontakter" + "Toppforslag" "Annen" "Katalog" "Jobbkatalog" "Alle kontakter" + "Forslag" "Meg" - "Søker …" - "Fant mer enn %d." - "Ingen kontakter" - - %d er funnet - 1 er funnet - - "Hurtigkontakt for %1$s" "(Uten navn)" - "Ofte oppringt" - "Ofte kontaktet" "Se kontakten" "Alle kontakter med telefonnumre" "Jobbprofilkontakter" @@ -125,8 +114,6 @@ "Send e-post (%s)" "Send e-post" "Gate" - "Postboks" - "Nabolag" "By" "Fylke/delstat" "Postnummer" @@ -144,103 +131,19 @@ "Nettprat med ICQ" "Nettprat med Jabber" "Nettprat" - "slett" - "Vis eller skjul navnefelt" - "Vis eller skjul fonetiske navnefelt" "Alle kontakter" - "Ferdig" - "Avbryt" "Kontakter i %s" "Kontakter i tilpasset visning" "Enkeltkontakt" - "Lagre importerte kontakter i:" - "Importér fra SIM-kort" - "Importér fra SIM-kortet ^1^2" - "Importér fra SIM-kortet %1$s" - "Importer fra .vcf-fil" - "Vil du avbryte importeringen av %s?" - "Vil du avbryte eksporteringen av %s?" - "Kunne ikke avbryte imp./eksp. av vCard" - "Ukjent feil." - "Kunne ikke åpne «%s»: %s" - "Kunne ikke starte eksporteringen: %s." - "Du har ingen kontakter som kan eksporteres." - "Du har slått av en nødvendig tillatelse." - "Det oppsto en feil under eksporteringen: %s." - "Det obligatoriske filnavnet er for langt (%s)." - "Inn-/ut-feil" - "Ikke nok minne. Det er mulig at filen er for stor." - "Kan ikke analysere vCard pga. uventet årsak." - "Formatet støttes ikke." - "Kunne ikke hente metainformasjon for aktuell(e) vCard-fil(er)." - "En eller flere filer kan ikke importeres (%s)." - "Eksporteringen av %s er fullført." - "Eksportering av kontaktene er fullført." - "Kontaktdataene er eksportert. Klikk på varselet for å dele kontaktene." - "Trykk for å dele kontaktene." - "Eksporteringen av %s ble avbrutt." - "Eksporterer kontaktdata" - "Kontaktdataene eksporteres." - "Kunne ikke hente databaseinformasjon." - "Du har ingen kontakter som kan eksporteres. Har du kontakter på enheten din, vil enkelte dataleverandører muligens ikke tillate at kontaktene eksporteres." - "vCard-oppretteren startet ikke som den skulle." - "Eksporten mislyktes" - "Kontaktdataene ble ikke eksportert.\nÅrsak: %s" - "Importerer %s" - "Kunne ikke lese vCard-dataene" - "Lesingen av vCard-dataene ble avbrutt" - "Importen av vCard-filen %s er fullført" - "Importeringen av %s ble avbrutt" - "%s blir snart importert." - "Filen importeres snart." - "Forespørselen om vCard-importering ble avvist. Prøv på nytt senere." - "%s blir snart eksportert." - "Filen eksporteres snart." - "Kontaktene eksporteres snart." - "Forespørselen om eksport av vCard ble avvist. Prøv på nytt senere." - "kontakt" - "Bufrer vCard for import til lokal, midlertidig lagring. Selve importeringen starter snart." - "Kunne ikke importere vCard." - "Kontakt mottatt via NFC" - "Vil du eksportere kontaktene?" - "Bufrer" - "Importerer %s/%s: %s" - "Eksportér til .vcf-fil" "Sortér etter" "Fornavn" "Etternavn" "Navneformat" "Fornavnet først" "Etternavnet først" - "Standardkonto for nye kontakter" - "Synkroniser metadata for kontakter" - "Om Kontakter" - "Innstillinger" - "Del synlige kontakter" - "Delingen av synlige kontakter mislyktes." - "Del favorittkontaktene" - "Del alle kontaktene" - "Kunne ikke dele kontaktene." - "Importér/eksportér kontakter" - "Importér kontakter" - "Denne kontakten kan ikke deles." - "Det finnes ingen kontakter å dele." - "Søk" - "Finn kontakter" - "Favoritter" - "Ingen kontakter." - "Ingen synlige kontakter." - "Ingen favoritter" - "Ingen kontakter i %s" "Fjern ofte kontaktede personer" - "Velg SIM-kort" - "Administrer kontoer" - "Importér/eksportér" - "via %1$s" - "%1$s via %2$s" "avslutt søket" "Slett søk" - "Alternativer for visning av kontakter" "Konto" "Bruk alltid dette for samtaler" "Ring med" @@ -248,19 +151,12 @@ "Skriv et notat du vil sende med anropet …" "SEND OG RING" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s-fanen." %1$s-fanen. %2$d uleste elementer. %1$s-fanen. %2$d ulest element. - "Delversjon" - "Åpen kildekode-lisenser" - "Lisensdetaljer for programvare med åpen kildekode" - "Personvern" - "Vilkår for bruk" - "Lisenser for åpen kildekode" - "Kunne ikke åpne nettadressen." "Videosamtale" "Del og ring" diff --git a/java/com/android/contacts/common/res/values-pa/strings.xml b/java/com/android/contacts/common/res/values-pa/strings.xml index c96510cc7..593abee39 100644 --- a/java/com/android/contacts/common/res/values-pa/strings.xml +++ b/java/com/android/contacts/common/res/values-pa/strings.xml @@ -18,7 +18,6 @@ "ਟੈਕਸਟ ਕਾਪੀ ਕੀਤਾ" - "ਕਲਿਪਬੋਰਡ ਤੇ ਕਾਪੀ ਕਰੋ" "%s ਨੂੰ ਕਾਲ ਕਰੋ" "ਘਰ ਕਾਲ ਕਰੋ" "ਮੋਬਾਈਲ ਤੇ ਕਾਲ ਕਰੋ" @@ -40,7 +39,6 @@ "ਦਫ਼ਤਰ ਦੇ ਪੇਜ਼ਰ ਤੇ ਕਾਲ ਕਰੋ" "%s ਨੂੰ ਕਾਲ ਕਰੋ" "MMS ਕਾਲ ਕਰੋ" - "%s (ਕਾਲ ਕਰੋ)" "%s ਤੇ ਟੈਕਸਟ ਕਰੋ" "ਘਰ ਦੇ ਨੰਬਰ ਤੇ ਟੈਕਸਟ ਕਰੋ" "ਮੋਬਾਈਲ ਤੇ ਟੈਕਸਟ ਕਰੋ" @@ -62,7 +60,6 @@ "ਦਫ਼ਤਰ ਦੇ ਪੇਜ਼ਰ ਤੇ ਟੈਕਸਟ ਕਰੋ" "%s ਨੂੰ ਟੈਕਸਟ ਕਰੋ" "MMS ਤੇ ਟੈਕਸਟ ਕਰੋ" - "%s (ਸੁਨੇਹਾ ਭੇਜੋ)" "ਕੀ ਅਕਸਰ ਸੰਪਰਕ ਕੀਤੇ ਜਾਣ ਵਾਲੇ ਹਟਾਉਣੇ ਹਨ?" "ਤੁਸੀਂ ਵਾਰੀ-ਵਾਰੀ ਸੰਪਰਕ ਅਤੇ ਫੋਨ ਐਪਸ ਵਿੱਚ ਸੰਪਰਕ ਕੀਤੀ ਸੂਚੀ ਹਟਾਓਗੇ ਅਤੇ ਈਮੇਲ ਐਪਸ ਤੇ ਸਕ੍ਰੈਚ ਨਾਲ ਤੁਹਾਡੀਆਂ ਪਤਾ ਲਗਾਉਣ ਦੀਆਂ ਤਰਜੀਹਾਂ ਜਾਣਨ ਲਈ ਜ਼ੋਰ ਪਾਓਗੇ।" "ਅਕਸਰ ਸੰਪਰਕ ਕੀਤੇ ਜਾਣ ਵਾਲੇ ਹਟਾ ਰਿਹਾ ਹੈ…" @@ -70,22 +67,14 @@ "ਦੂਰ" "ਰੁੱਝਾ ਹੋਇਆ ਹੈ" "ਸੰਪਰਕ" + "ਪ੍ਰਮੁੱਖ ਸੁਝਾਏ ਗਏ" "ਹੋਰ" "ਡਾਇਰੈਕਟਰੀ" "ਕੰਮ ਡਾਇਰੈਕਟਰੀ" "ਸਾਰੇ ਸੰਪਰਕ" + "ਸੁਝਾਅ" "ਮੈਂ" - "ਖੋਜ ਰਿਹਾ ਹੈ..." - "%d ਤੋਂ ਵੱਧ ਮਿਲੇ।" - "ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ" - - %d ਮਿਲਿਆ - %d ਮਿਲੇ - - "%1$s ਲਈ ਤਤਕਾਲ ਸੰਪਰਕ" "(ਕੋਈ ਨਾਮ ਨਹੀਂ)" - "ਅਕਸਰ ਕਾਲ ਕਰਨ ਵਾਲੇ" - "ਅਕਸਰ ਸੰਪਰਕ ਕੀਤੇ ਜਾਣ ਵਾਲੇ" "ਸੰਪਰਕ ਦੇਖੋ" "ਫੋਨ ਨੰਬਰਾਂ ਵਾਲੇ ਸਾਰੇ ਸੰਪਰਕ" "ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਸੰਪਰਕ" @@ -125,8 +114,6 @@ "%s ਨੂੰ ਈਮੇਲ ਕਰੋ" "ਈਮੇਲ" "ਗਲੀ" - "PO ਬੌਕਸ" - "ਗਵਾਂਢ" "ਸ਼ਹਿਰ" "ਰਾਜ" "ਜ਼ਿੱਪ ਕੋਡ" @@ -144,103 +131,19 @@ "ICQ ਵਰਤਦੇ ਹੋਏ ਚੈਟ ਕਰੋ" "Jabber ਵਰਤਦੇ ਹੋਏ ਚੈਟ ਕਰੋ" "ਚੈਟ" - "ਮਿਟਾਓ" - "ਨਾਮ ਖੇਤਰਾਂ ਦਾ ਵਿਸਤਾਰ ਕਰੋ ਜਾਂ ਨਸ਼ਟ ਕਰੋ" - "ਫੋਨੈਟਿਕ ਨਾਮ ਖੇਤਰਾਂ ਦਾ ਵਿਸਤਾਰ ਕਰੋ ਜਾਂ ਨਸ਼ਟ ਕਰੋ" "ਸਾਰੇ ਸੰਪਰਕ" - "ਹੋ ਗਿਆ" - "ਰੱਦ ਕਰੋ" "%s ਵਿੱਚ ਸੰਪਰਕ" "ਕਸਟਮ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸੰਪਰਕ" "ਸਿੰਗਲ ਸੰਪਰਕ" - "ਆਯਾਤ ਕੀਤੇ ਸੰਪਰਕਾਂ ਨੂੰ ਇਸ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ:" - "SIM ਕਾਰਡ ਵਿੱਚੋਂ ਆਯਾਤ ਕਰੋ" - "SIM ^1 - ^2 ਵਿੱਚੋਂ ਆਯਾਤ ਕਰੋ" - "SIM %1$s ਵਿੱਚੋਂ ਆਯਾਤ ਕਰੋ" - ".vcf ਫ਼ਾਈਲ ਤੋਂ ਆਯਾਤ ਕਰੋ" - "ਕੀ %s ਦਾ ਆਯਾਤ ਰੱਦ ਕਰਨਾ ਹੈ?" - "ਕੀ %s ਦਾ ਨਿਰਯਾਤ ਰੱਦ ਕਰਨਾ ਹੈ?" - "vCard ਆਯਾਤ/ਨਿਰਯਾਤ ਰੱਦ ਨਹੀਂ ਕਰ ਸਕਿਆ" - "ਅਗਿਆਤ ਅਸ਼ੁੱਧੀ।" - "\"%s\" ਨੂੰ ਖੋਲ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: %s।" - "ਐਕਸਪੋਰਟ ਚਾਲੂ ਨਹੀੰ ਕਰ ਸਕਿਆ: \"%s\"।" - "ਕੋਈ ਵੀ ਨਿਰਯਾਤ ਕਰਨ ਯੋਗ ਸੰਪਰਕ ਨਹੀਂ ਹਨ।" - "ਤੁਸੀਂ ਇੱਕ ਲੁੜੀਂਦੀ ਅਨੁਮਤੀ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਹੈ।" - "ਨਿਰਯਾਤ ਕਰਨ ਦੌਰਾਨ ਇੱਕ ਅਸ਼ੁੱਧੀ ਵਾਪਰੀ: \"%s\"।" - "ਲੁੜੀਂਦਾ ਫਾਈਲ ਨਾਮ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵੱਡਾ ਹੈ (\"%s\")।" - "I/O ਅਸ਼ੁੱਧੀ" - "ਮੈਮਰੀ ਕਾਫ਼ੀ ਨਹੀਂ। ਫਾਈਲ ਬਹੁਤ ਜ਼ਿਆਦਾ ਵੱਡੀ ਹੋ ਸਕਦੀ ਹੈ।" - "ਇੱਕ ਅਕਲਪਿਤ ਕਾਰਨ ਕਰਕੇ vCard ਪਾਰਸ ਨਹੀਂ ਕਰ ਸਕਿਆ।" - "ਫੌਰਮੈਟ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।" - "ਦਿੱਤੀ ਗਈ vCard ਫਾਈਲ(ਫਾਈਲਾਂ) ਦੀ meta ਜਾਣਕਾਰੀ ਇਕੱਤਰ ਨਹੀਂ ਕਰ ਸਕਿਆ।" - "ਇੱਕ ਜਾਂ ਵੱਧ ਫਾਈਲਾਂ ਆਯਾਤ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ (%s)।" - "%s ਨੂੰ ਨਿਰਯਾਤ ਕਰਨਾ ਪੂਰਾ ਹੋਇਆ।" - "ਸੰਪਰਕਾਂ ਨੂੰ ਨਿਰਯਾਤ ਕਰਨਾ ਪੂਰਾ ਹੋਇਆ।" - "ਸੰਪਰਕਾਂ ਨੂੰ ਨਿਰਯਾਤ ਕਰਨਾ ਮੁਕੰਮਲ ਹੋਇਆ, ਸੰਪਰਕਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਲਈ ਸੂਚਨਾ \'ਤੇ ਕਲਿੱਕ ਕਰੋ।" - "ਸੰਪਰਕਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।" - "%s ਨੂੰ ਨਿਰਯਾਤ ਕਰਨਾ ਰੱਦ ਕੀਤਾ।" - "ਸੰਪਰਕ ਡਾਟਾ ਨਿਰਯਾਤ ਕਰ ਰਿਹਾ ਹੈ" - "ਸੰਪਰਕ ਡੈਟੇ ਨੂੰ ਨਿਰਯਾਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।" - "ਡਾਟਾਬੇਸ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰ ਸਕਿਆ।" - "ਕੋਈ ਨਿਰਯਾਤ ਕਰਨਯੋਗ ਸੰਪਰਕ ਨਹੀਂ ਹਨ। ਜੇਕਰ ਤੁਹਾਡੀ ਡੀਵਾਈਸ \'ਤੇ ਕੋਈ ਸੰਪਰਕ ਹਨ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਕੁਝ ਡੈਟਾ ਪ੍ਰਦਾਨਕ ਸੰਪਰਕਾਂ ਨੂੰ ਡੀਵਾਈਸ ਤੋਂ ਨਿਰਯਾਤ ਕੀਤੇ ਜਾਣ ਦੀ ਇਜਾਜ਼ਤ ਨਾ ਦੇਣ।" - "vCard ਕੰਪੋਜ਼ਰ ਸਹੀ ਢੰਗ ਨਾਲ ਚਾਲੂ ਨਹੀਂ ਹੋਇਆ।" - "ਨਿਰਯਾਤ ਨਹੀਂ ਕਰ ਸਕਿਆ" - "ਸੰਪਰਕ ਡਾਟਾ ਨਿਰਯਾਤ ਨਹੀਂ ਕੀਤਾ ਗਿਆ ਸੀ।\nਕਾਰਨ: \"%s\"" - "%s ਨੂੰ ਆਯਾਤ ਕਰ ਰਿਹਾ ਹੈ" - "vCard ਡਾਟਾ ਨਹੀਂ ਪੜ੍ਹ ਸਕਿਆ" - "vCard ਡਾਟਾ ਪੜ੍ਹਨਾ ਰੱਦ ਕੀਤਾ" - "vCard %s ਨੂੰ ਆਯਾਤ ਕਰਨਾ ਪੂਰਾ ਹੋਇਆ" - "%s ਨੂੰ ਆਯਾਤ ਕਰਨਾ ਰੱਦ ਕੀਤਾ।" - "%s ਨੂੰ ਥੋੜ੍ਹੀ ਦੇਰ ਵਿੱਚ ਆਯਾਤ ਕੀਤਾ ਜਾਏਗਾ।" - "ਫਾਈਲ ਥੋੜ੍ਹੀ ਦੇਰ ਵਿੱਚ ਆਯਾਤ ਕੀਤੀ ਜਾਏਗੀ।" - "vCard ਆਯਾਤ ਬੇਨਤੀ ਅਸਵੀਕਾਰ ਕੀਤੀ ਗਈ ਸੀ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" - "%s ਨੂੰ ਥੋੜ੍ਹੀ ਦੇਰ ਵਿੱਚ ਨਿਰਯਾਤ ਕੀਤਾ ਜਾਏਗਾ।" - "ਫਾਈਲ ਥੋੜ੍ਹੀ ਦੇਰ ਵਿੱਚ ਨਿਰਯਾਤ ਕੀਤੀ ਜਾਏਗੀ।" - "ਸੰਪਰਕਾਂ ਨੂੰ ਜਲਦ ਹੀ ਨਿਰਯਾਤ ਕੀਤਾ ਜਾਵੇਗਾ।" - "vCard ਨਿਰਯਾਤ ਬੇਨਤੀ ਅਸਵੀਕਾਰ ਕੀਤੀ ਗਈ ਸੀ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" - "ਸੰਪਰਕ" - "ਸਥਾਨਕ ਅਸਥਾਈ ਸਟੋਰੇਜ ਲਈ vCard ਕੈਚ ਕਰ ਰਿਹਾ ਹੈ। ਅਸਲੀ ਆਯਾਤ ਜਲਦੀ ਹੀ ਚਾਲੂ ਹੋਵੇਗਾ।" - "vCard ਆਯਾਤ ਨਹੀਂ ਕਰ ਸਕਿਆ।" - "NFC ਤੇ ਪ੍ਰਾਪਤ ਕੀਤਾ ਸੰਪਰਕ" - "ਕੀ ਸੰਪਰਕ ਨਿਰਯਾਤ ਕਰਨੇ ਹਨ?" - "ਕੈਚ ਕਰ ਰਿਹਾ ਹੈ" - "%s/%s ਨੂੰ ਆਯਾਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ: %s" - ".vcf ਫ਼ਾਈਲ ਵਿੱਚ ਨਿਰਯਾਤ ਕਰੋ" "ਇਸ ਮੁਤਾਬਕ ਛਾਂਟੋ" "ਪਹਿਲਾ ਨਾਮ" "ਆਖਰੀ ਨਾਮ" "ਨਾਮ ਦੀ ਵੰਨਗੀ" "ਪਹਿਲਾਂ ਪਹਿਲਾ ਨਾਮ" "ਪਹਿਲਾਂ ਆਖਰੀ ਨਾਮ" - "ਨਵੇਂ ਸੰਪਰਕਾਂ ਲਈ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਖਾਤਾ" - "ਸੰਪਰਕ ਮੈਟਾਡੈਟੇ ਨੂੰ ਸਮਕਾਲੀ ਕਰੋ" - "ਸੰਪਰਕਾਂ ਬਾਰੇ" - "ਸੈਟਿੰਗਾਂ" - "ਦਿੱਸਦੇ ਸੰਪਰਕ ਸ਼ੇਅਰ ਕਰੋ" - "ਦ੍ਰਿਸ਼ਮਾਨ ਸੰਪਰਕ ਸ਼ੇਅਰ ਕਰਨ ਵਿੱਚ ਅਸਫਲ।" - "ਮਨਪਸੰਦ ਸੰਪਰਕਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ" - "ਸਾਰੇ ਸੰਪਰਕ ਸਾਂਝੇ ਕਰੋ" - "ਸੰਪਰਕ ਸਾਂਝੇ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।" - "ਸੰਪਰਕ ਆਯਾਤ/ਨਿਰਯਾਤ ਕਰੋ" - "ਸੰਪਰਕ ਆਯਾਤ ਕਰੋ" - "ਇਸ ਸੰਪਰਕ ਸ਼ੇਅਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।" - "ਸ਼ੇਅਰ ਕਰਨ ਲਈ ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ ਹਨ।" - "ਖੋਜੋ" - "ਸੰਪਰਕ ਲੱਭੋ" - "ਮਨਪਸੰਦ" - "ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ।" - "ਕੋਈ ਦਿੱਸਦੇ ਸੰਪਰਕ ਨਹੀਂ।" - "ਕੋਈ ਮਨਪਸੰਦ ਨਹੀਂ" - "%s ਵਿੱਚ ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ" "ਫ੍ਰੀਕਵੈਂਟਸ ਹਟਾਓ" - "SIM ਕਾਰਡ ਚੁਣੋ" - "ਖਾਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰੋ" - "ਆਯਾਤ/ਨਿਰਯਾਤ ਕਰੋ" - "%1$s ਰਾਹੀਂ" - "%2$s ਰਾਹੀਂ %1$s" "ਖੋਜ ਕਰਨਾ ਬੰਦ ਕਰੋ" "ਖੋਜ ਹਟਾਓ" - "ਸੰਪਰਕ ਡਿਸਪਲੇ ਚੋਣਾਂ" "ਖਾਤਾ" "ਕਾਲਾਂ ਲਈ ਹਮੇਸ਼ਾਂ ਇਹ ਵਰਤੋ" "ਇਸਦੇ ਨਾਲ ਕਾਲ ਕਰੋ" @@ -248,19 +151,12 @@ "ਕਾਲ ਦੇ ਨਾਲ ਭੇਜਣ ਲਈ ਕੋਈ ਨੋਟ ਟਾਈਪ ਕਰੋ ..." "ਭੇਜੋ ਅਤੇ ਕਾਲ ਕਰੋ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ਟੈਬ।" %1$s ਟੈਬ। %2$d ਅਣ-ਪੜ੍ਹੀਆਂ ਆਈਟਮਾਂ। %1$s ਟੈਬ। %2$d ਅਣ-ਪੜ੍ਹੀਆਂ ਆਈਟਮਾਂ। - "ਨਿਰਮਾਣ ਰੂਪ" - "ਖੁੱਲ੍ਹਾ ਸਰੋਤ ਲਾਇਸੰਸ" - "ਓਪਨ ਸੋਰਸ ਸੌਫਟਵੇਅਰ ਲਈ ਲਾਇਸੰਸ ਵੇਰਵੇ" - "ਪ੍ਰਾਈਵੇਸੀ ਨੀਤੀ" - "ਸੇਵਾ ਦੀਆਂ ਮਦਾਂ" - "ਖੁੱਲ੍ਹਾ ਸਰੋਤ ਲਾਇਸੰਸ" - "url ਖੋਲ੍ਹਣ ਵਿੱਚ ਅਸਫਲ।" "ਵੀਡੀਓ ਕਾਲ" "ਸਾਂਝਾ ਕਰੋ ਅਤੇ ਕਾਲ ਕਰੋ" diff --git a/java/com/android/contacts/common/res/values-pl/strings.xml b/java/com/android/contacts/common/res/values-pl/strings.xml index c4e65f556..bbb3854f1 100644 --- a/java/com/android/contacts/common/res/values-pl/strings.xml +++ b/java/com/android/contacts/common/res/values-pl/strings.xml @@ -18,7 +18,6 @@ "Tekst skopiowany" - "Kopiuj do schowka" "Połącz – %s" "Połącz – domowy" "Połącz – komórka" @@ -40,7 +39,6 @@ "Połącz – służbowy pager" "Połącz – %s" "Połącz – MMS" - "%s (zadzwoń)" "SMS – %s" "SMS – domowy" "SMS – komórka" @@ -62,7 +60,6 @@ "SMS – służbowy pager" "SMS – %s" "SMS – MMS" - "%s (wyślij wiadomość)" "Wyczyścić częste kontakty?" "Wyczyścisz listę częstych kontaktów w aplikacjach Kontakty i Telefon. Aplikacje pocztowe będą musiały od nowa poznać Twoje preferencje adresowe." "Czyszczę częste kontakty…" @@ -70,24 +67,14 @@ "Nieobecny" "Zajęty" "Kontakty" + "Najlepsze sugestie" "Inny" "Katalog" "Katalog służbowy" "Wszystkie kontakty" + "Sugestie" "Ja" - "Wyszukiwanie..." - "Znaleziono więcej niż %d." - "Brak kontaktów" - - Znaleziono %d - Znaleziono %d - Znaleziono %d - Znaleziono 1 - - "Szybki kontakt dla: %1$s" "(Bez nazwy)" - "Częste połączenia" - "Częste kontakty" "Pokaż kontakt" "Wszystkie kontakty z numerami telefonów" "Kontakty w profilu służbowym" @@ -127,8 +114,6 @@ "E-mail – %s" "E-mail" "Ulica" - "Skrytka pocztowa" - "Dzielnica" "Miasto" "Stan" "Kod pocztowy" @@ -146,103 +131,19 @@ "Czat w ICQ" "Czat w Jabberze" "Czat" - "usuń" - "Rozwiń lub zwiń pola imion i nazwisk" - "Rozwiń lub zwiń pola nazwisk zapisanych fonetycznie" "Wszystkie kontakty" - "Gotowe" - "Anuluj" "Kontakty na koncie %s" "Kontakty spełniające kryteria" "Jeden kontakt" - "Zapisz zaimportowane kontakty na koncie:" - "Importuj z karty SIM" - "Importuj z karty SIM ^1^2" - "Importuj z karty SIM %1$s" - "Importuj z pliku .vcf" - "Anulować importowanie pliku %s?" - "Anulować eksportowanie pliku %s?" - "Nie można anulować importu/eksportu vCard" - "Nieznany błąd." - "Nie udało się otworzyć pliku „%s”: %s." - "Nie udało się uruchomić programu eksportującego: „%s”." - "Brak kontaktów, które można wyeksportować." - "Wyłączyłeś wymagane uprawnienia" - "Podczas eksportu wystąpił błąd: „%s”." - "Wymagana nazwa pliku jest zbyt długa („%s”)." - "Błąd wejścia/wyjścia" - "Za mało pamięci. Plik może być zbyt duży." - "Nie można przeanalizować pliku vCard z nieoczekiwanego powodu." - "Format nie jest obsługiwany." - "Nie można zebrać metainformacji z podanych plików vCard." - "Nie można zaimportować co najmniej jednego pliku (%s)." - "Zakończono eksportowanie pliku %s." - "Eksportowanie kontaktów zostało zakończone." - "Kontakty zostały wyeksportowane. Aby je udostępnić, kliknij powiadomienie." - "Kliknij, by udostępnić kontakty." - "Anulowano eksportowanie pliku %s." - "Eksportowanie danych kontaktowych" - "Eksportuję dane kontaktów." - "Nie udało się pobrać informacji z bazy danych." - "Brak kontaktów do eksportu. Jeśli masz na urządzeniu kontakty, być może niektórzy dostawcy danych nie zezwalają na ich eksport z urządzenia." - "Obiekt tworzenia danych vCard nie uruchomił się poprawnie." - "Eksport nieudany" - "Dane kontaktów nie zostały wyeksportowane.\nPrzyczyna: „%s”" - "Importowanie: %s" - "Nie udało się odczytać danych vCard" - "Anulowano odczyt danych kart vCard" - "Zakończono importowanie pliku vCard %s" - "Anulowano importowanie pliku %s" - "Plik %s zostanie za chwilę zaimportowany." - "Plik zostanie za chwilę zaimportowany." - "Żądanie importu danych vCard zostało odrzucone. Spróbuj ponownie później." - "Plik %s zostanie za chwilę wyeksportowany." - "Plik zostanie za chwilę wyeksportowany." - "Kontakty zostaną wyeksportowane wkrótce." - "Żądanie eksportu danych vCard zostało odrzucone. Spróbuj ponownie później." - "kontakt" - "Trwa buforowanie plików vCard w lokalnym obszarze tymczasowym. Właściwy import rozpocznie się za chwilę." - "Nie udało się zaimportować pliku vCard." - "Kontakt odebrany przez NFC" - "Wyeksportować kontakty?" - "Buforowanie" - "Importuję %s/%s: %s" - "Eksportuj do pliku .vcf" "Sortuj według" "Imię" "Nazwisko" "Format imienia i nazwiska" "Najpierw imię" "Najpierw nazwisko" - "Domyślne konto dla nowych kontaktów" - "Synchronizuj metadane kontaktów" - "Aplikacja Kontakty" - "Ustawienia" - "Udostępnij widoczne kontakty" - "Nie udało się udostępnić widocznych kontaktów." - "Udostępnij ulubione kontakty" - "Udostępnij wszystkie kontakty" - "Nie udało się udostępnić kontaktów." - "Importuj/eksportuj kontakty" - "Importuj kontakty" - "Tego kontaktu nie można udostępnić." - "Brak kontaktów do udostępnienia." - "Szukaj" - "Znajdź kontakty" - "Ulubione" - "Brak kontaktów" - "Brak widocznych kontaktów" - "Brak ulubionych" - "Brak kontaktów w grupie %s" "Wyczyść częste kontakty" - "Wybierz kartę SIM" - "Zarządzaj kontami" - "Importuj/eksportuj" - "przez: %1$s" - "%1$s przez: %2$s" "zatrzymaj wyszukiwanie" "Wyczyść wyszukiwanie" - "Opcje wyświetlania kontaktów" "Konto" "Zawsze używaj do połączeń" "Zadzwoń, używając" @@ -250,7 +151,7 @@ "Wpisz notatkę, którą chcesz wysłać razem z połączeniem..." "WYŚLIJ I ZADZWOŃ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Karta %1$s." Karta %1$s. %2$d nieprzeczytane elementy. @@ -258,13 +159,6 @@ Karta %1$s. %2$d nieprzeczytanego elementu. Karta %1$s. %2$d nieprzeczytany element. - "Wersja kompilacji" - "Licencje open source" - "Szczegóły licencji na oprogramowanie open source" - "Polityka prywatności" - "Warunki usługi" - "Licencje open source" - "Nie udało się otworzyć URL-a." "Rozmowa wideo" "Udostępnij i zadzwoń" diff --git a/java/com/android/contacts/common/res/values-pt-rBR/strings.xml b/java/com/android/contacts/common/res/values-pt-rBR/strings.xml index ee2b87c68..f517c7a62 100644 --- a/java/com/android/contacts/common/res/values-pt-rBR/strings.xml +++ b/java/com/android/contacts/common/res/values-pt-rBR/strings.xml @@ -18,7 +18,6 @@ "Texto copiado" - "Copiar para área de transferência" "Ligar para %s" "Ligar para residência" "Ligar para celular" @@ -40,7 +39,6 @@ "Ligar para pager comercial" "Ligar para %s" "Ligar para MMS" - "%s (chamada)" "Enviar SMS para %s" "Enviar SMS para residência" "Enviar SMS para celular" @@ -62,7 +60,6 @@ "Enviar SMS para pager comercial" "Enviar SMS para %s" "Enviar SMS para MMS" - "%s (mensagem)" "Apagar contatos frequentes?" "Você apagará a lista de contatos frequentes nos apps Contatos e Telefone, fazendo com que os apps de e-mail tenham que redefinir suas preferências de endereçamento." "Apagando contatos frequentes…" @@ -70,22 +67,14 @@ "Ausente" "Ocupado" "Contatos" + "Principais sugestões" "Outros" "Diretório" "Diretório de trabalho" "Todos os contatos" + "Sugestões" "Eu" - "Pesquisando..." - "Mais de %d encontrados." - "Nenhum contato" - - %d encontrado - %d encontrados - - "Contato rápido de %1$s" "(Sem nome)" - "Mais chamados" - "Contatos frequentes" "Visualizar contato" "Todos os contatos com números de telefone" "Contatos do perfil de trabalho" @@ -125,8 +114,6 @@ "Enviar e-mail para %s" "Enviar e-mail" "Rua" - "Caixa postal" - "Bairro" "Cidade" "Estado" "CEP" @@ -144,103 +131,19 @@ "Bater papo usando o ICQ" "Bater papo usando o Jabber" "Bate-papo" - "excluir" - "Expandir ou recolher campos de nome" - "Expandir ou recolher campos de nome fonético" "Todos os contatos" - "Concluído" - "Cancelar" "Contatos em %s" "Cont. na vis. pers." "Contato único" - "Salvar contatos importados em:" - "Importar do cartão SIM" - "Importar do SIM ^1 - ^2" - "Importar do SIM %1$s" - "Importar de arquivo .vcf" - "Cancelar a importação de %s?" - "Cancelar a exportação de %s?" - "Impossível cancelar imp./export. vCard" - "Erro desconhecido." - "Não foi possível abrir \"%s\": %s." - "Não foi possível iniciar o exportador: \"%s\"." - "Não há contato exportável." - "Você desativou uma permissão obrigatória." - "Ocorreu um erro ao exportar: \"%s\"." - "O nome de arquivo exigido é muito longo (\"%s\")." - "Erro E/S" - "Não há memória suficiente. O arquivo pode ser muito grande." - "Não foi possível analisar o vCard por um motivo inesperado." - "O formato não é suportado." - "Não foi possível coletar informações meta de determinados arquivos vCard." - "Um ou mais arquivos não puderam ser importados (%s)." - "Exportação de %s concluída." - "A exportação de contatos foi concluída." - "A exportação dos contatos foi concluída. Clique na notificação para compartilhar contatos." - "Toque para compartilhar contatos." - "Exportação de %s cancelada." - "Exportando dados do contato" - "Os dados dos contatos estão sendo exportados." - "Não foi possível obter as informações do banco de dados." - "Não há contatos exportáveis. Se você tiver contatos no seu dispositivo, talvez alguns provedores de dados não permitam que eles sejam exportados." - "O criador do vCard não iniciou corretamente." - "Impossível exportar" - "Os dados de contato não foram exportados.\nMotivo: \"%s\"" - "Importando %s" - "Não foi possível ler os dados do vCard" - "Leitura dos dados do vCard cancelada" - "Importação do vCard %s concluída" - "Importação do vCard %s cancelada" - "%s será importado em breve." - "O arquivo será importado em breve." - "O pedido de importação do vCard foi rejeitado. Tente novamente mais tarde." - "%s será exportado em breve." - "O arquivo será exportado em breve." - "Os contatos serão exportados em breve." - "O pedido de exportação do vCard foi rejeitado. Tente novamente mais tarde." - "contato" - "Armazenando VCards em cache no armazenamento temporário local. A importação real começará em breve." - "Não foi possível importar o vCard." - "Contato via NFC" - "Exportar contatos?" - "Armazenando em cache" - "Importando %s/%s: %s" - "Exportar p/ arquivo .vcf" "Classificar por" "Nome" "Sobrenome" "Formato de nome" "Primeiro o nome" "Primeiro o sobrenome" - "Conta padrão para novos contatos" - "Sincronizar metadados de contatos" - "Sobre Contatos" - "Configurações" - "Compartilhar contatos visíveis" - "Falha ao compartilhar contatos visíveis." - "Compartilhar contatos favoritos" - "Compartilhar todos os contatos" - "Falha ao compartilhar contatos." - "Importar/exportar contatos" - "Importar contatos" - "Este contato não pode ser compartilhado." - "Não há contatos para compartilhar." - "Pesquisar" - "Localizar contatos" - "Favoritos" - "Nenhum contato." - "Não há contatos visíveis." - "Nenhum favorito" - "Nenhum contato em %s" "Apagar frequentes" - "Selecionar cartão SIM" - "Gerenciar contas" - "Importar/exportar" - "via %1$s" - "%1$s via %2$s" "parar de pesquisar" "Limpar pesquisa" - "Opções de exibição de contato" "Conta" "Sempre usar esta opção para chamadas" "Ligar com" @@ -248,19 +151,12 @@ "Escreva uma nota para enviar com a chamada..." "ENVIAR E LIGAR" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Guia \"%1$s\"." Guia \"%1$s\". %2$d item não lido. Guia \"%1$s\". %2$d itens não lidos. - "Versão" - "Licenças de código aberto" - "Detalhes da licença do software de código aberto" - "Política de Privacidade" - "Termos de Serviço" - "Licenças de código aberto" - "Falha ao abrir o URL." "Videochamada" "Compartilhar e ligar" diff --git a/java/com/android/contacts/common/res/values-pt-rPT/strings.xml b/java/com/android/contacts/common/res/values-pt-rPT/strings.xml index 44bba149d..4f612f555 100644 --- a/java/com/android/contacts/common/res/values-pt-rPT/strings.xml +++ b/java/com/android/contacts/common/res/values-pt-rPT/strings.xml @@ -18,7 +18,6 @@ "Texto copiado" - "Copiar para área de transf." "Telefonar para %s" "Telefonar para casa" "Telefonar para telemóvel" @@ -40,7 +39,6 @@ "Telefonar para o pager do trabalho" "Telefonar para %s" "Telefonar para um número MMS" - "%s (Chamada)" "Enviar mensagem de texto para %s" "Enviar mensagem de texto para o telefone de casa" "Enviar mensagem de texto para telemóvel" @@ -62,7 +60,6 @@ "Enviar mensagem de texto para o pager do trabalho" "Enviar mensagem de texto para %s" "Enviar mensagem de texto para um número MMS" - "%s (Mensagem)" "Limpar contactos frequentes?" "Limpa a lista de contactos frequentes nas aplicações Contactos e Telemóvel e força as aplicações de email a aprenderem as suas preferências de endereço de raiz." "A limpar contactos frequentes..." @@ -70,22 +67,14 @@ "Ausente" "Ocupado(a)" "Contactos" + "Principais sugestões" "Outro" "Diretório" "Diretório de trabalho" "Todos os contactos" + "Sugestões" "Eu" - "A pesquisar..." - "Foram encontrados mais de %d." - "Sem contactos" - - %d found - %d encontrados - - "Contacto rápido para %1$s" "(Sem nome)" - "Números de marcação frequente" - "Contactados frequentemente" "Ver contacto" "Todos os contactos com números de telefone" "Contactos do perfil de trabalho" @@ -125,8 +114,6 @@ "Enviar email a %s" "Enviar email" "Rua" - "Apartado" - "Bairro" "Cidade" "Estado" "Código postal" @@ -144,103 +131,19 @@ "Chat através do ICQ" "Chat através do Jabber" "Chat" - "eliminar" - "Expandir ou reduzir campos dos nomes" - "Expandir ou reduzir campos de nomes fonéticos" "Todos os contactos" - "Concluído" - "Cancelar" "Contactos em %s" "Contactos na vista personalizada" "Contacto único" - "Guardar contactos importados em:" - "Importar do cartão SIM" - "Importar do SIM ^1^2" - "Importar do SIM %1$s" - "Importar de ficheiro .vcf" - "Cancelar a importação de %s?" - "Cancelar a exportação de %s?" - "Imposs. cancel. import./export. do vCard" - "Erro desconhecido." - "Não foi possível abrir \"%s\": %s." - "Não foi possível iniciar o exportador: \"%s\"." - "Não existe um contacto exportável." - "Desativou uma autorização obrigatória." - "Ocorreu um erro durante a exportação: \"%s\"." - "Nome de ficheiro demasiado longo (\"%s\")." - "Erro de E/S" - "Memória insuficiente. O ficheiro pode ser demasiado grande." - "Não foi possível analisar o vCard por um motivo inesperado." - "O formato não é suportado." - "Não foi possível recolher meta informações de determinado(s) ficheiro(s) vCard." - "Não foi possível importar um ou mais ficheiros (%s)." - "A exportação de %s terminou." - "Exportação de contactos concluída." - "A exportação dos contactos foi concluída. Clique na notificação para partilhar contactos." - "Toque para partilhar contactos." - "A exportação de %s foi cancelada." - "A exportar dados do contacto" - "Os dados de contactos estão a ser exportados." - "Não foi possível obter informações da base de dados" - "Não existem contactos para exportar. Se tiver contactos no seu dispositivo, alguns fornecedores de dados podem não permitir a exportação dos contactos a partir do dispositivo." - "O compositor vCard não iniciou corretamente." - "Impossível exportar" - "Os dados de contactos não foram exportados.\nMotivo: \"%s\"" - "A importar %s" - "Não foi possível ler dados do vCard" - "A leitura de dados vCard foi cancelada" - "A importação do vCard terminou %s" - "A importação de %s foi cancelada" - "%s será importado em breve." - "O ficheiro será importado em breve." - "O pedido de importação do vCard foi rejeitado. Tente novamente mais tarde." - "O %s será exportado em breve." - "O ficheiro é exportado em breve." - "Os contactos serão exportados brevemente." - "O pedido de exportação do vCard foi rejeitado. Tente novamente mais tarde." - "contacto" - "A colocar vCard(s) em cache no armazenamento temporário local. A importação efetiva começará brevemente." - "Não foi possível importar o vCard." - "Contacto recebido através de NFC" - "Exportar contactos?" - "A colocar em cache" - "A importar %s/%s: %s" - "Exportar p/ ficheiro .vcf" "Ordenar por" "Nome próprio" "Apelido" "Formato do nome" "Nome próprio em primeiro lugar" "Apelido em primeiro lugar" - "Conta predefinida para novos contactos" - "Sincronizar metadados de contactos" - "Acerca do Contactos" - "Definições" - "Partilhar contactos visíveis" - "Falha ao partilhar os contactos visíveis." - "Partilhar contactos favoritos" - "Partilhar todos os contactos" - "Falha ao partilhar os contactos." - "Importar/exportar contactos" - "Importar contactos" - "Não é possível partilhar este contacto." - "Não existem contactos para partilhar." - "Pesquisar" - "Localizar contactos" - "Favoritos" - "Sem contactos." - "Sem contactos visíveis" - "Sem favoritos" - "Sem contactos em %s" "Limpar frequentes" - "Selecionar cartão SIM" - "Gerir contas" - "Importar/exportar" - "através do %1$s" - "%1$s através do %2$s" "parar de pesquisar" "Limpar pesquisa" - "Opções de visualização de contactos" "Conta" "Utilizar sempre este para chamadas" "Ao telefone com" @@ -248,19 +151,12 @@ "Escrever uma nota para enviar com a chamada..." "ENVIAR E LIGAR" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Separador %1$s." - %1$s tab. %2$d unread items. + Separador %1$s. %2$d item não lido. Separador %1$s. %2$d itens não lidos. - "Versão da compilação" - "Licenças de código aberto" - "Detalhes da licença para software de código aberto" - "Política de Privacidade" - "Termos de Utilização" - "Licenças de código aberto" - "Falha ao abrir o URL." "Videochamada" "Partilhar e ligar" diff --git a/java/com/android/contacts/common/res/values-pt/strings.xml b/java/com/android/contacts/common/res/values-pt/strings.xml index ee2b87c68..f517c7a62 100644 --- a/java/com/android/contacts/common/res/values-pt/strings.xml +++ b/java/com/android/contacts/common/res/values-pt/strings.xml @@ -18,7 +18,6 @@ "Texto copiado" - "Copiar para área de transferência" "Ligar para %s" "Ligar para residência" "Ligar para celular" @@ -40,7 +39,6 @@ "Ligar para pager comercial" "Ligar para %s" "Ligar para MMS" - "%s (chamada)" "Enviar SMS para %s" "Enviar SMS para residência" "Enviar SMS para celular" @@ -62,7 +60,6 @@ "Enviar SMS para pager comercial" "Enviar SMS para %s" "Enviar SMS para MMS" - "%s (mensagem)" "Apagar contatos frequentes?" "Você apagará a lista de contatos frequentes nos apps Contatos e Telefone, fazendo com que os apps de e-mail tenham que redefinir suas preferências de endereçamento." "Apagando contatos frequentes…" @@ -70,22 +67,14 @@ "Ausente" "Ocupado" "Contatos" + "Principais sugestões" "Outros" "Diretório" "Diretório de trabalho" "Todos os contatos" + "Sugestões" "Eu" - "Pesquisando..." - "Mais de %d encontrados." - "Nenhum contato" - - %d encontrado - %d encontrados - - "Contato rápido de %1$s" "(Sem nome)" - "Mais chamados" - "Contatos frequentes" "Visualizar contato" "Todos os contatos com números de telefone" "Contatos do perfil de trabalho" @@ -125,8 +114,6 @@ "Enviar e-mail para %s" "Enviar e-mail" "Rua" - "Caixa postal" - "Bairro" "Cidade" "Estado" "CEP" @@ -144,103 +131,19 @@ "Bater papo usando o ICQ" "Bater papo usando o Jabber" "Bate-papo" - "excluir" - "Expandir ou recolher campos de nome" - "Expandir ou recolher campos de nome fonético" "Todos os contatos" - "Concluído" - "Cancelar" "Contatos em %s" "Cont. na vis. pers." "Contato único" - "Salvar contatos importados em:" - "Importar do cartão SIM" - "Importar do SIM ^1 - ^2" - "Importar do SIM %1$s" - "Importar de arquivo .vcf" - "Cancelar a importação de %s?" - "Cancelar a exportação de %s?" - "Impossível cancelar imp./export. vCard" - "Erro desconhecido." - "Não foi possível abrir \"%s\": %s." - "Não foi possível iniciar o exportador: \"%s\"." - "Não há contato exportável." - "Você desativou uma permissão obrigatória." - "Ocorreu um erro ao exportar: \"%s\"." - "O nome de arquivo exigido é muito longo (\"%s\")." - "Erro E/S" - "Não há memória suficiente. O arquivo pode ser muito grande." - "Não foi possível analisar o vCard por um motivo inesperado." - "O formato não é suportado." - "Não foi possível coletar informações meta de determinados arquivos vCard." - "Um ou mais arquivos não puderam ser importados (%s)." - "Exportação de %s concluída." - "A exportação de contatos foi concluída." - "A exportação dos contatos foi concluída. Clique na notificação para compartilhar contatos." - "Toque para compartilhar contatos." - "Exportação de %s cancelada." - "Exportando dados do contato" - "Os dados dos contatos estão sendo exportados." - "Não foi possível obter as informações do banco de dados." - "Não há contatos exportáveis. Se você tiver contatos no seu dispositivo, talvez alguns provedores de dados não permitam que eles sejam exportados." - "O criador do vCard não iniciou corretamente." - "Impossível exportar" - "Os dados de contato não foram exportados.\nMotivo: \"%s\"" - "Importando %s" - "Não foi possível ler os dados do vCard" - "Leitura dos dados do vCard cancelada" - "Importação do vCard %s concluída" - "Importação do vCard %s cancelada" - "%s será importado em breve." - "O arquivo será importado em breve." - "O pedido de importação do vCard foi rejeitado. Tente novamente mais tarde." - "%s será exportado em breve." - "O arquivo será exportado em breve." - "Os contatos serão exportados em breve." - "O pedido de exportação do vCard foi rejeitado. Tente novamente mais tarde." - "contato" - "Armazenando VCards em cache no armazenamento temporário local. A importação real começará em breve." - "Não foi possível importar o vCard." - "Contato via NFC" - "Exportar contatos?" - "Armazenando em cache" - "Importando %s/%s: %s" - "Exportar p/ arquivo .vcf" "Classificar por" "Nome" "Sobrenome" "Formato de nome" "Primeiro o nome" "Primeiro o sobrenome" - "Conta padrão para novos contatos" - "Sincronizar metadados de contatos" - "Sobre Contatos" - "Configurações" - "Compartilhar contatos visíveis" - "Falha ao compartilhar contatos visíveis." - "Compartilhar contatos favoritos" - "Compartilhar todos os contatos" - "Falha ao compartilhar contatos." - "Importar/exportar contatos" - "Importar contatos" - "Este contato não pode ser compartilhado." - "Não há contatos para compartilhar." - "Pesquisar" - "Localizar contatos" - "Favoritos" - "Nenhum contato." - "Não há contatos visíveis." - "Nenhum favorito" - "Nenhum contato em %s" "Apagar frequentes" - "Selecionar cartão SIM" - "Gerenciar contas" - "Importar/exportar" - "via %1$s" - "%1$s via %2$s" "parar de pesquisar" "Limpar pesquisa" - "Opções de exibição de contato" "Conta" "Sempre usar esta opção para chamadas" "Ligar com" @@ -248,19 +151,12 @@ "Escreva uma nota para enviar com a chamada..." "ENVIAR E LIGAR" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Guia \"%1$s\"." Guia \"%1$s\". %2$d item não lido. Guia \"%1$s\". %2$d itens não lidos. - "Versão" - "Licenças de código aberto" - "Detalhes da licença do software de código aberto" - "Política de Privacidade" - "Termos de Serviço" - "Licenças de código aberto" - "Falha ao abrir o URL." "Videochamada" "Compartilhar e ligar" diff --git a/java/com/android/contacts/common/res/values-ro/strings.xml b/java/com/android/contacts/common/res/values-ro/strings.xml index 358e7af93..b4426cd91 100644 --- a/java/com/android/contacts/common/res/values-ro/strings.xml +++ b/java/com/android/contacts/common/res/values-ro/strings.xml @@ -18,7 +18,6 @@ "Text copiat" - "Copiați în clipboard" "Apelați %s" "Apelați numărul de domiciliu" "Apelați numărul de mobil" @@ -40,7 +39,6 @@ "Apelați numărul de pager de serviciu" "Apelați %s" "Apelați MMS" - "%s (apelați)" "Trimiteți un mesaj text către %s" "Trimiteți un mesaj text către telefonul de domiciliu" "Trimiteți un mesaj text către numărul de mobil" @@ -62,7 +60,6 @@ "Trimiteți un mesaj text către un număr de pager de serviciu" "Trimiteți un mesaj text către %s" "Trimiteți un mesaj text către un număr MMS" - "%s (trimiteți mesaj)" "Ștergeți pers. frecvent contactate?" "Veți șterge lista persoanelor contactate frecvent din aplicațiile Agendă și Telefon și veți forța aplicațiile de e-mail să vă învețe preferințele pentru adrese de la zero." "Se șterg pers. frecvent contactate…" @@ -70,23 +67,14 @@ "Plecat(ă)" "Ocupat(ă)" "Agendă" + "Cele mai populare sugestii" "Altul" "Director" "Directorul de serviciu" "Toată agenda" + "Sugestii" "Eu" - "Se caută…" - "S-au găsit peste %d persoane de contact." - "Nu există persoane în agendă" - - %d găsite - %d găsite - Una găsită - - "Contact rapid pentru %1$s" "(Fără nume)" - "Apelate frecvent" - "Contactate frecvent" "Vizualizați persoana din agendă" "Toate persoanele de contact cu numere de telefon" "Persoane de contact din profilul de serviciu" @@ -126,8 +114,6 @@ "Trimiteți un e-mail la %s" "Trimiteți un e-mail" "Stradă" - "Căsuță poștală" - "Cartier" "Oraș" "Stat" "Cod poștal" @@ -145,103 +131,19 @@ "Conversați prin ICQ" "Conversați prin Jabber" "Conversați prin chat" - "ștergeți" - "Extindeți sau restrângeți câmpurile pentru nume" - "Extindeți sau restrângeți câmpurile pentru nume fonetice" "Toată agenda" - "Terminat" - "Anulați" "Agenda din %s" "Agenda în afișarea personalizată" "O singură persoană de contact" - "Salvați persoanele de contact importate în:" - "Importați de pe cardul SIM" - "Importați de pe cardul SIM ^1 - ^2" - "Importați de pe cardul SIM %1$s" - "Importați din fișier .vcf" - "Anulați importul fișierului %s?" - "Anulați exportul fișierului %s?" - "Anulare import/export vCard nereușită" - "Eroare necunoscută." - "Nu s-a putut deschide fișierul „%s”: %s." - "Nu s-a putut inițializa instrumentul de export: „%s”" - "Nu există persoane de contact care să poată fi exportate." - "Ați dezactivat o permisiune necesară." - "A apărut o eroare în timpul exportului: „%s”." - "Numele de fișier solicitat este prea lung („%s”)." - "Eroare I/O" - "Memoria este insuficientă (probabil fișierul este prea mare)." - "Nu s-au putut analiza datele de pe vCard dintr-un motiv neașteptat." - "Formatul nu este acceptat." - "Nu s-au putut colecta metainformațiile pentru fișierele vCard indicate." - "Unul sau mai multe fișiere nu s-au putut importa (%s)." - "S-a finalizat exportul fișierului %s." - "Persoanele de contact au fost exportate." - "S-a încheiat exportul persoanelor de contact. Dați clic pe notificare pentru a trimite persoanele de contact." - "Atingeți pentru a trimite persoanele de contact." - "Exportul fișierului %s a fost anulat." - "Se exportă datele persoanelor de contact" - "Se exportă datele privind persoanele de contact." - "Nu s-au putut obține informații din baza de date." - "Nu există persoane de contact care să poată fi exportate. Dacă aveți persoane de contact pe dispozitiv, este posibil ca exportul acestora de pe dispozitiv să nu fie permis de unii furnizori de date." - "Editorul de vCard nu a pornit în mod corespunzător." - "Nu s-a putut exporta" - "Datele persoanelor de contact nu au fost exportate.\nMotivul: „%s”" - "Se importă %s" - "Nu s-au putut citi datele de pe vCard" - "Citirea datelor vCard a fost anulată" - "S-a finalizat importul fișierului vCard %s" - "Importul %s a fost anulat" - "%s va fi importat în curând." - "Fișierul va fi importat în curând." - "Solicitarea de import a fișierului vCard a fost respinsă. Încercați din nou mai târziu." - "%s va fi exportat în curând." - "Fișierul va fi exportat în curând." - "Persoanele de contact vor fi exportate în curând." - "Solicitarea de export a fișierului vCard a fost respinsă. Încercați din nou mai târziu." - "persoană de contact" - "Fișierele vCard se stochează în memoria cache într-un spațiu de stocare local temporar. Importul propriu-zis va începe în curând." - "Nu s-a putut importa fișierul vCard." - "Persoană primită prin NFC" - "Exportați agenda?" - "Se stochează în cache" - "Se importă %s/%s: %s" - "Exportați ca fișier .vcf" "Sortați după" "Prenume" "Nume" "Format pentru nume" "Întâi prenumele" "Întâi numele" - "Contul prestabilit pentru persoanele de contact noi" - "Sincronizați metadatele pentru persoanele de contact" - "Despre Agendă" - "Setări" - "Distribuiți persoanele de contact vizibile" - "Persoanele de contact vizibile nu au putut fi trimise." - "Trimiteți persoanele de contact preferate" - "Trimiteți toate persoanele de contact" - "Persoanele de contact nu s-au trimis." - "Importați/exportați agenda" - "Importați Agenda" - "Nu se poate permite accesul la această intrare." - "Nu există persoane de contact de trimis." - "Căutați" - "Găsiți persoane de contact" - "Favorite" - "Nicio persoană de contact." - "Nicio persoană de contact nu este vizibilă." - "Nu există preferate" - "Nicio persoană de contact în %s" "Ștergeți contacte frecvente" - "Selectați cardul SIM" - "Gestionați conturile" - "Importați/Exportați" - "prin %1$s" - "%1$s prin %2$s" "nu mai căutați" "Ștergeți căutarea" - "Opțiuni de afișare pentru persoanele de contact" "Cont" "Utilizați mereu pentru apeluri" "Apelați cu" @@ -249,20 +151,13 @@ "Introduceți o notă ca să o trimiteți împreună cu apelul..." "TRIMITEȚI ȘI APELAȚI" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Fila %1$s" Fila %1$s. %2$d elemente necitite. Fila %1$s. %2$d de elemente necitite. Fila %1$s. %2$d element necitit. - "Versiunea" - "Licențe open source" - "Detalii privind licența pentru software-ul open source" - "Confidențialitate" - "Termeni și condiții" - "Licențe open source" - "Adresa URL nu a putut fi deschisă." "Apel video" "Trimiteți și apelați" diff --git a/java/com/android/contacts/common/res/values-ru/strings.xml b/java/com/android/contacts/common/res/values-ru/strings.xml index 3442f2c60..f8b70a7af 100644 --- a/java/com/android/contacts/common/res/values-ru/strings.xml +++ b/java/com/android/contacts/common/res/values-ru/strings.xml @@ -18,7 +18,6 @@ "Текст скопирован" - "Копировать в буфер обмена" "Вызов:%s" "Домашний" "Мобильный" @@ -40,7 +39,6 @@ "Рабочий пейджер" "Вызов: %s" "Номер MMS" - "%s (вызов)" "SMS: %s" "SMS: домашний" "SMS: мобильный" @@ -62,7 +60,6 @@ "SMS: рабочий пейджер" "SMS: %s" "SMS: номер MMS" - "%s (SMS)" "Очистить список популярных контактов?" "Список популярных контактов в приложениях \"Контакты\" и \"Телефон\" будет очищен, а приложения электронной почты начнут запоминать адреса заново." "Подождите…" @@ -70,24 +67,14 @@ "Отсутствует" "Не беспокоить" "Контакты" + "Топ рекомендуемых" "Другое" "Каталог" "Каталог контактов из рабочего профиля" "Все контакты" + "Рекомендуемые" "Вы" - "Поиск…" - "Найдено контактов: более %d" - "Нет контактов" - - Найден %d контакт - Найдено %d контакта - Найдено %d контактов - Найдено %d контакта - - "Быстрый вызов, контакт: %1$s" "Имя не указано" - "Часто вызываемые" - "Часто набираемые" "Посмотреть контакт" "Контакты с номерами телефонов" "Контакты из рабочего профиля" @@ -127,8 +114,6 @@ "Написать письмо (%s)" "Написать письмо" "Улица" - "Абонентский ящик" - "Район" "Город" "Регион" "Индекс" @@ -146,103 +131,19 @@ "Чат через ICQ" "Чат через Jabber" "Чат" - "удалить" - "Показать/скрыть дополнительные поля" - "Показать или скрыть поля с транскрипцией имени" "Все контакты" - "Готово" - "Отмена" "Контакты аккаунта \"%s\"" "Пользовательский фильтр" "Один контакт" - "Куда сохранить контакты?" - "Импорт с SIM-карты" - "Импорт с SIM-карты ^1 (^2)" - "Импорт с SIM-карты %1$s" - "Импорт из файла VCF" - "Отменить импорт файла \"%s\"?" - "Отменить экспорт файла \"%s\"?" - "Не удалось отменить импорт/экспорт vCard" - "Неизвестная ошибка." - "Не удалось открыть файл %s. %s" - "Не удалось запустить инструмент экспорта. %s" - "Нет контактов для экспорта." - "Отсутствует необходимое разрешение." - "Произошла ошибка экспорта. %s" - "Слишком длинное название файла (\"%s\")." - "Ошибка ввода-вывода" - "Недостаточно памяти. Возможно, файл слишком большой." - "Не удалось выполнить синтаксический анализ файла vCard." - "Формат не поддерживается." - "Не удалось собрать метаданные файлов vCard." - "Не удалось импортировать один или несколько файлов (%s)." - "Экспорт файла \"%s\" завершен" - "Экспорт контактов завершен." - "Экспорт контактов завершен. Чтобы открыть к ним доступ, нажмите на уведомление." - "Нажмите, чтобы открыть доступ к контактам." - "Экспорт файла \"%s\" отменен" - "Экспорт данных контакта" - "Экспорт контактов…" - "База данных недоступна." - "Не найдены контакты для экспорта. Возможно, экспорт контактов с устройства не поддерживается поставщиком услуг передачи данных." - "Сбой при запуске редактора vCard." - "Ошибка экспорта" - "Не удалось экспортировать данные.\nПричина: %s" - "Импорт файла \"%s\"…" - "Данные файла vCard не прочитаны" - "Чтение данных vCard отменено" - "Файл \"%s\" импортирован" - "Импорт файла \"%s\" отменен" - "Импорт файла \"%s\" скоро начнется." - "Импорт файла скоро начнется." - "Запрос на импорт данных vCard отклонен. Повторите попытку позже." - "Экспорт файла \"%s\" скоро начнется." - "Файл будет экспортирован в ближайшее время." - "Контакты скоро будут экспортированы." - "Запрос на экспорт данных vCard отклонен. Повторите попытку позже." - "контакт" - "Выполняется кеширование файлов vCard в локальное временное хранилище, после чего начнется импорт." - "Не удалось импортировать данные vCard." - "Получено по NFC" - "Экспортировать контакты?" - "Кеширование…" - "Импорт %s из %s: %s..." - "Экспорт в файл VCF" "Сортировка" "По имени" "По фамилии" "Формат имени" "Сначала имя" "Сначала фамилия" - "Аккаунт по умолчанию для новых контактов" - "Синхронизация метаданных контакта" - "О Контактах" - "Настройки" - "Передать видимые контакты" - "Не удалось поделиться видимыми контактами." - "Отправить избранные" - "Отправить все контакты" - "Не удалось отправить контакты" - "Импорт/экспорт контактов" - "Импортировать контакты" - "Не удалось передать данные" - "Доступных контактов нет" - "Поиск" - "Поиск контактов" - "Избранное" - "Нет контактов" - "Нет видимых контактов" - "Здесь пока ничего нет" - "Нет контактов в группе \"%s\"" "Очистить популярные" - "Выберите SIM-карту" - "Управление аккаунтами" - "Импорт/экспорт" - %1$s" - "%1$s в %2$s" "прекратить поиск" "Очистить условия поиска" - "Отображение контактов" "Аккаунт" "Всегда использовать для звонков" "Аккаунт для звонка" @@ -250,7 +151,7 @@ "Введите текст…" "ОТПРАВИТЬ И ПОЗВОНИТЬ" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Вкладка \"%1$s\"." Вкладка %1$s. %2$d непрочитанный элемент. @@ -258,13 +159,6 @@ Вкладка %1$s. %2$d непрочитанных элементов. Вкладка %1$s. %2$d непрочитанного элемента. - "Версия сборки" - "Лицензии открытого ПО" - "Сведения о лицензиях на ПО с открытым исходным кодом" - "Политика конфиденциальности" - "Условия использования" - "Лицензии открытого ПО" - "Не удалось открыть URL." "Видеовызов" "Поделиться и позвонить" diff --git a/java/com/android/contacts/common/res/values-si/strings.xml b/java/com/android/contacts/common/res/values-si/strings.xml index 72ca32d9c..94612ef28 100644 --- a/java/com/android/contacts/common/res/values-si/strings.xml +++ b/java/com/android/contacts/common/res/values-si/strings.xml @@ -18,7 +18,6 @@ "පෙළ පිටපත් කරන ලදී" - "පසුරු පුවරුවට පිටපත් කරන්න" "%s අමතන්න" "ගෙදර අමතන්න" "ජංගම දුරකථනය අමතන්න" @@ -40,7 +39,6 @@ "කාර්යාල පේජරය අමතන්න" "%s අමතන්න" "MMS අමතන්න" - "%s (ඇමතුම)" "%s ට කෙටි පණිවිඩයක් යවන්න" "නිවසට කෙටි පණිවිඩයක් යවන්න" "ජංගම දුරකථනයට කෙටි පණිවිඩයක් යවන්න" @@ -62,7 +60,6 @@ "කාර්යාල පේජරයට කෙටි පණිවිඩයක් යවන්න" "%s ට කෙටි පණිවිඩයක් යවන්න" "MMS වෙත කෙටි පණිවිඩයක් යවන්න" - "%s (පණිවිඩය)" "නිතරම සම්බන්ධ වන අය හිස් කරන්නද?" "ඔබ සම්බන්ධතා සහ දුරකථන යෙදුම්වලින් නිතරම සම්බන්ධ වුණු අයගේ ලැයිස්තුව හිස් කර, මුල සිටම ඔබගේ ලිපින අභිරුචි ඉගෙනීමට ඊ-තැපැල් යෙදුම්වලට බල කරයි." "නිතරම සම්බන්ධ වන අය හිස් කරමින්…" @@ -70,22 +67,14 @@ "ළඟ නැත" "කාර්යබහුල" "සම්බන්ධතා" + "ඉහළින්ම යෝජිත" "වෙනත්" "නාමාවලිය" "කාර්යාල සම්බන්ධතා නාමාවලිය" "සියලුම සම්බන්ධතා" + "යෝජනා" "මම" - "සොයමින්..." - "%d ට වඩා සොයාගන්නා ලදී." - "සම්බන්ධතා නැත" - - %dක් සොයා ගන්නා ලදි - %dක් සොයා ගන්නා ලදි - - "%1$s සඳහා ඉක්මන් සම්බන්ධතාව" "(නමක් නොමැත)" - "නිතරම අමතන ලද" - "නිතරම සම්බන්ධ වන" "සම්බන්ධතාව පෙන්වන්න." "දුරකථන අංක සහිත සම්බන්ධතා" "කාර්යාල පැතිකඩ සම්බන්ධතා" @@ -125,8 +114,6 @@ "%s ඊ-තැපැල් කරන්න" "ඊ-තැපෑල" "වීථිය" - "තැපැල් පෙට්ටිය" - "අසල්වැසි ප්‍රදේශය" "නගරය" "ජනපදය" "ZIP කේතය" @@ -144,103 +131,19 @@ "ICQ භාවිතයෙන් කතාබස් කරන්න" "Jabber භාවිතයෙන් කතාබස් කරන්න" "කතාබස්" - "මකන්න" - "නම් ක්ෂේත්‍ර විහිදන්න හෝ හකුළන්න" - "ශබ්දිම නම් ක්ෂේත්‍ර විහිදීම හෝ හැකිළීම" "සියලුම සම්බන්ධතා" - "හරි" - "අවලංගු කරන්න" "%s හි සම්බන්ධතා" "අභිරුචි පෙනුමේ සම්බන්ධතා" "එක් සම්බන්ධතාවය" - "ආයාත කළ සම්බන්ධතා මෙහි සුරකින්න:" - "SIM පතෙන් ආයාත කරන්න" - "SIM ^1 - ^2 වෙතින් ආයාත කරන්න" - "SIM %1$s වෙතින් ආයාත කරන්න" - ".vcf ගොනුවකින් ආයාත කරන්න" - "%s ආයාත කිරීම අවලංගු කරන්නද?" - "%s නිර්යාත කිරීම අවලංගු කරන්නද?" - "vCard ආයාත/නිර්යාත කිරීම අවලංගු කළ නොහැක" - "නොදන්නා දෝෂය." - "\"%s\" විවෘත කිරීමට නොහැකි විය: %s." - "නිර්යාතකරු පටන් ගැනීමට නොහැක: \"%s\"" - "නිර්යාත කළ හැකි සම්බන්ධතාවයක් නොමැත." - "ඔබ අවශ්‍ය අවසරයක් අබල කර ඇත." - "නිර්යාතය අතරතුර දෝෂයක් සිදු විය: \"%s\"." - "අවශ්‍ය කරන ගොනු නම දිග වැඩිය (\"%s\")." - "I/O දෝෂය" - "මතකය මදිය. ගොනුව විශාල වැඩි විය හැක." - "බලාපොරොත්තු නොවූ හේතුවක් නිසා vCard ය විග්‍රහ කළ නොහැක." - "මෙම ආකෘතිය වෙත සහාය නොදක්වයි." - "ලබාදුන් vCard ගොනු(ව) වල පාර දත්ත එකතු කළ නොහැකි විය." - "ගොනු එකක් හෝ කිහිපයක් ආයාත කිරීමට නොහැකි විය (%s)." - "%s නිර්යාත කිරීම අවසන් කෙරුණි." - "සම්බන්ධතා නිර්යාත කිරීම අවසන් කෙරුණි." - "සම්බන්ධතා නිර්යාත කිරීම අවසන්ය, සම්බන්ධතා බෙදා ගැනීමට දැනුම්දීම ක්ලික් කරන්න." - "සම්බන්ධතා බෙදා ගැනීමට තට්ටු කරන්න." - "%s නිර්යාත කිරීම අවලංගු කෙරුණි." - "සම්බන්ධතා දත්ත නිර්යාත කිරීම" - "සම්බන්ධතා දත්ත නිර්යාත කරමින් තිබේ." - "දත්ත සමුදායේ තොරතුරු ලබාගත නොහැකි විය." - "නිර්යාත කළ හැකි සම්බන්ධතා නැත. ඔබේ උපාංගයේ සම්බන්ධතා තිබේ නම්, සමහර දත්ත සපයන්නන් උපාංගයෙන් සම්බන්ධතා නිර්යාත කිරීමට අවසර ලබා නොදිය හැකිය." - "vCard සකසනය නිවැරදිව පටන් ගත්තේ නැත." - "නිර්යාත කළ නොහැකි වීය" - "සම්බන්ධතා දත්ත නිර්යාත නොකරන ලදි.\nහේතුව: \"%s\"" - "%s ආයාත කරමින්" - "vCard දත්ත කියවිය නොහැක විය" - "vCard දත්ත කියවීම අවලංගු කෙරුණි" - "vCard %s ආයාත කිරීම අවසන් විය" - "%s ආයාත කිරීම අවලංගු කෙරුණි" - "%s කෙටි වේලාවකින් ආයාත වනු ඇත." - "ගොනුව කෙටි වේලාවකින් ආයාත කරනු ඇත." - "vCard ආයාත ඉල්ලීම ප්‍රතික්ෂේප කරන ලදි. පසුව නැවත උත්සාහ කරන්න." - "%s කෙටි වේලාවකින් නිර්යාත කරනු ඇත." - "ගොනුව කෙටි වේලාවකින් නිර්යාත කරනු ඇත." - "ටික වේලාවකින් සම්බන්ධතා නිර්යාත කරනු ඇත." - "vCard නිර්යාත අයැදුම ප්‍රතික්ෂේප කරන ලදි. පසුව නැවත උත්සාහ කරන්න." - "සම්බන්ධතාවය" - "පෙදෙසි තාවකාලික ආචයනයට vCard(s) හැඹිලිගත කරමින් පවතී. සැබෑ ආයාත කිරීම ඉක්මනින් පටන් ගනු ඇත." - "vCard ආයාත කිරීමට නොහැකි විය." - "NFC හරහා සම්බන්ධතාව ලැබුණි" - "සම්බන්ධතා නිර්යාත කරන්නද?" - "හැඹිලි ගත කරමින්" - "%s/%s ආයාත කරමින්: %s" - ".vcf ගොනුවකට නිර්යාත කරන්න" "අනුපිළිවෙලට සකසා ඇත්තේ" "පළමු නම" "අවසාන නම" "නමේ ආකෘතිය" "මුල් නම මුලින්ම" "අවසාන නම මුලින්ම" - "නව සම්බන්ධතා සඳහා පෙරනිමි ගිණුම" - "සම්බන්ධතා පාරදත්ත සමමුහුර්ත කරන්න" - "සම්බන්ධතා ගැන" - "සැකසීම්" - "පෙනෙන සම්බන්ධතා බෙදාගන්න" - "දෘශ්‍යමාන සම්බන්ධතා බෙදා ගැනීම අසාර්ථක විය." - "ප්‍රියතම සම්බන්ධතා බෙදා ගන්න" - "සියලු සම්බන්ධතා බෙදා ගන්න" - "සම්බන්ධතා බෙදා ගැනීම අසාර්ථක විය." - "සම්බන්ධතා ආයාත/නිර්යාත කිරීම" - "සම්බන්ධතා ආයාත කරන්න" - "මෙම සම්බන්ධතාව බෙදා ගත නොහැක." - "බෙදාගැනීමට සම්බන්ධතා නොමැත." - "සොයන්න" - "සම්බන්ධතා සොයන්න" - "ප්‍රියතම" - "සම්බන්ධතා නැත." - "දෘශ්‍ය සම්බන්ධතා නැත." - "ප්‍රියතම නැත" - "%s හි සම්බන්ධතා නැත" "නිතරමයන් හිස් කරන්න" - "SIM කාඩ්පත තෝරන්න" - "ගිණුම් කළමනාකරණය කරන්න" - "ආයාත/නිර්යාත" - "%1$s හරහා" - "%2$s මඟින් %1$s" "සෙවීම අවසන් කරන්න" "සෙවීම හිස් කරන්න" - "දර්ශනය කිරීමේ විකල්පය සම්බන්ධ කරගන්න" "ගිණුම" "ඇමතුම් සඳහා මෙම එක සැමවිටම භාවිතා කරන්න" "සමඟ අමතන්න" @@ -248,19 +151,12 @@ "ඇමතුම සමග යැවීමට සටහනක් ටයිප් කරන්න ..." "යවන්න සහ අමතන්න" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ටැබය." %1$s ටැබය. නොකියවූ අයිතම %2$d. %1$s ටැබය. නොකියවූ අයිතම %2$d. - "තැනුම් අනුවාදය" - "විවෘත මූලාශ්‍ර බලපත්‍ර" - "විවෘත මූලාශ්‍ර මෘදුකාංග සඳහා බලපත්‍ර විස්තර" - "පෞද්ගලිකත්ව ප්‍රතිපත්තිය" - "සේවා නියම" - "විවෘත මූලාශ්‍ර බලපත්‍ර" - "url විවෘත කිරීමට අසමත් විය." "වීඩියෝ ඇමතුම" "බෙදා ගෙන අමතන්න" diff --git a/java/com/android/contacts/common/res/values-sk/strings.xml b/java/com/android/contacts/common/res/values-sk/strings.xml index b85f63f1b..dc4d0412e 100644 --- a/java/com/android/contacts/common/res/values-sk/strings.xml +++ b/java/com/android/contacts/common/res/values-sk/strings.xml @@ -18,7 +18,6 @@ "Text bol skopírovaný" - "Kopírovať do schránky" "Volať kontakt %s" "Volať na domáci telefón" "Volať na mobil" @@ -40,7 +39,6 @@ "Volať na pracovný pager" "Volať kontakt %s" "Volať na číslo MMS" - "%s (hovor)" "Poslať správu kontaktu %s" "Poslať správu na domáci telefón" "Poslať správu na mobil" @@ -62,7 +60,6 @@ "Poslať správu na pracovný pager" "Poslať správu kontaktu %s" "Poslať správu na číslo MMS" - "%s (správa)" "Vymazať často kontaktované osoby?" "Vymažete zoznam často kontaktovaných osôb v aplikáciách Kontakty a Telefón a e-mailové aplikácie budú musieť odznova vytvoriť predvoľby adresátov." "Mazanie často kontaktov. osôb..." @@ -70,24 +67,14 @@ "Som preč" "Nemám čas" "Kontakty" + "Najviac odporúčané" "Iné" "Adresár" "Pracovný adresár" "Všetky kontakty" + "Návrhy" "Ja" - "Hľadá sa…" - "Našlo sa viac ako %d." - "Žiadne kontakty" - - Boli nájdené %d kontakty - Bolo nájdených niekoľko (%d) kontaktov - Bolo nájdených %d kontaktov - Bol nájdený 1 kontakt - - "Rýchly kontakt pre osobu %1$s" "(Bez mena)" - "Najčastejšie volané kontakty" - "Najčastejšie používané kontakty" "Zobraziť kontakt" "Všetky kontakty s telefónnymi číslami" "Kontakty v pracovnom profile" @@ -127,8 +114,6 @@ "Poslať e-mail na adresu %s" "E-mail" "Ulica" - "PO box" - "Štvrť" "Mesto" "Štát" "PSČ" @@ -146,103 +131,19 @@ "Zhovárať sa pomocou služby ICQ" "Zhovárať sa pomocou služby Jabber" "Četovať" - "odstrániť" - "Rozbaliť alebo zbaliť pole mena" - "Rozbaliť alebo zbaliť polia foneticky zadaných mien" "Všetky kontakty" - "Hotovo" - "Zrušiť" "Kontakty v účte %s" "Kontakty vo vlastnom zobrazení" "Jednotlivý kontakt" - "Účet na ukladanie importovaných kontaktov:" - "Importovať zo SIM karty" - "Importovať zo SIM karty ^1^2" - "Importovať zo SIM karty %1$s" - "Importovať zo súboru .vcf" - "Zrušiť importovanie súboru %s?" - "Zrušiť exportovanie súboru %s?" - "Import alebo export vizitky nie je možné zrušiť" - "Neznáma chyba." - "Súbor %s nebolo možné otvoriť: %s." - "Nástroj na exportovanie sa nepodarilo spustiť: „%s“." - "Nedá sa exportovať žiadny kontakt." - "Zakázali ste požadované povolenie." - "Počas exportovania sa vyskytla chyba: „%s“." - "Požadovaný názov súboru (%s) je príliš dlhý." - "Chyba I/O" - "Nedostatok pamäte. Súbor je možno príliš veľký." - "Analýza karty vCard zlyhala z neznámeho dôvodu." - "Formát nie je podporovaný." - "Metaúdaje daných súborov vizitiek vCard sa nepodarilo zhromaždiť." - "Nepodaril sa import jedného alebo viacerých súborov (%s)." - "Exportovanie súboru %s bolo dokončené." - "Exportovanie kontaktov bolo dokončené" - "Exportovanie kontaktov bolo dokončené. Zdieľajte ich kliknutím na upozornenie." - "Klepnutím zdieľajte kontakty." - "Exportovanie súboru %s bolo zrušené." - "Export údajov kontaktov" - "Kontaktné údaje sa exportujú." - "Nepodarilo sa získať informácie z databázy." - "Neboli nájdené žiadne kontakty, ktoré by bolo možné exportovať. Ak v zariadení skutočne máte kontakty, problém môže byť spôsobený tým, že niektorí poskytovatelia údajov nemusia umožňovať export kontaktov zo zariadenia." - "Nástroj na tvorbu vizitiek vCard sa nespustil správne." - "Exportovanie zlyhalo" - "Údaje o kontaktoch sa neexportovali.\nDôvod: „%s“" - "Importuje sa %s" - "Nepodarilo sa prečítať údaje vizitky vCard" - "Čítanie údajov vizitky vCard bolo zrušené" - "Import vizitky vCard %s bol dokončený" - "Importovanie súboru %s bolo zrušené" - "Vizitka %s bude čoskoro importovaná." - "Súbor bude čoskoro importovaný." - "Žiadosť o import vizitky vCard bola odmietnutá. Skúste to znova neskôr." - "Vizitka %s bude čoskoro exportovaná." - "Súbor bude čoskoro exportovaný." - "Kontakty budú čoskoro exportované." - "Žiadosť o exportovanie vizitky vCard bola odmietnutá. Skúste to znova neskôr." - "kontakt" - "Prebieha načítavanie vizitiek vCard do vyrovnávacej pamäte miestneho dočasného úložiska. Samotné importovanie začne o chvíľu." - "Vizitku vCard sa nepodarilo importovať." - "Kontakt cez NFC" - "Exportovať kontakty?" - "Ukladanie do vyrovnávacej pamäte..." - "Importuje sa %s/%s: %s" - "Exportovať do súboru .vcf" "Zoradiť podľa" "Krstné meno" "Priezvisko" "Formát mena" "Najprv krstné meno" "Najprv priezvisko" - "Predvolený účet pre nové kontakty" - "Synchronizácia metadát kontaktov" - "O aplikácii Kontakty" - "Nastavenia" - "Zdieľať viditeľné kontakty" - "Nepodarilo sa zdieľať viditeľné kontakty" - "Zdieľať obľúbené kontakty" - "Zdieľať všetky kontakty" - "Nepodarilo sa zdieľať kontakty." - "Import a export kontaktov" - "Importovať kontakty" - "Tento kontakt nie je možné zdieľať" - "Nemáte žiadne kontakty na zdieľanie." - "Hľadať" - "Hľadať kontakty" - "Obľúbené" - "Žiadne kontakty." - "Žiadne kontakty nie sú viditeľné." - "Žiadne obľúbené kontakty" - "V skupine %s nie sú žiadne kontakty" "Vymazať často kontaktovaných" - "Vybrať SIM kartu" - "Spravovať účty" - "Import a export" - "zdroj: %1$s" - "%1$s, zdroj: %2$s" "zastaviť vyhľadávanie" "Vymazať vyhľadávanie" - "Možnosti zobrazenia kontaktov" "Účet" "Vždy používať pre hovory" "Volať pomocou" @@ -250,7 +151,7 @@ "Napíšte poznámku, ktorá sa odošle s hovorom..." "ODOSLAŤ A VOLAŤ" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Karta %1$s." Karta %1$s. %2$d neprečítané položky. @@ -258,13 +159,6 @@ Karta %1$s. %2$d neprečítaných položiek. Karta %1$s. %2$d neprečítaná položka. - "Verzia zostavy" - "Licencie open source" - "Podrobnosti o licenciách pre softvér open source" - "Pravidlá ochrany súkromia" - "Zmluvné podmienky" - "Licencie open source" - "Webovú adresu nebolo možné otvoriť" "Videohovor" "Zdieľať a volať" diff --git a/java/com/android/contacts/common/res/values-sl/strings.xml b/java/com/android/contacts/common/res/values-sl/strings.xml index f4c39dea9..1a9eab7e2 100644 --- a/java/com/android/contacts/common/res/values-sl/strings.xml +++ b/java/com/android/contacts/common/res/values-sl/strings.xml @@ -18,7 +18,6 @@ "Besedilo kopirano" - "Kopiraj v odložišče" "Pokliči številko %s" "Pokliči domov" "Pokliči mobilni telefon" @@ -40,7 +39,6 @@ "Pokliči službeni pozivnik" "Pokliči številko pomočnika %s" "Pokliči telefon MMS" - "%s (Pokliči)" "Pošlji SMS na številko %s" "Pošlji SMS domov" "Pošlji SMS v mobilni telefon" @@ -62,7 +60,6 @@ "Pošlji SMS v službeni pozivnik" "Pošlji SMS pomočniku na številko %s" "Pošlji SMS na telefonsko številko MMS" - "%s (Pošlji sporočilo)" "Želite izbrisati seznam pog. stikov?" "Izbrisali boste seznam pogostih stikov v aplikacijah Stiki in Telefon, zato bodo e-poštne aplikacije začele shranjevati pogoste naslovnike od začetka." "Brisanje seznama pogost. stikov ..." @@ -70,24 +67,14 @@ "Odsoten" "Zaseden" "Stiki" + "Najboljši predlogi" "Drugo" "Imenik" "Delovni imenik" "Vsi stiki" + "Predlogi" "Jaz" - "Iskanje ..." - "Najdenih je bilo več kot toliko stikov: %d." - "Ni stikov" - - %d najden stik - %d najdena stika - %d najdeni stiki - %d najdenih stikov - - "Hitri stik za %1$s" "(Ni imena)" - "Pogosto klicani" - "Pogosto uporabljeni stiki" "Ogled stika" "Vsi stiki s telefonskimi številkami" "Stiki za delovni profil" @@ -127,8 +114,6 @@ "Pošlji e-poštno sporočilo na %s" "Pošlji e-poštno sporočilo" "Ulica" - "Poštni predal" - "Naselje" "Kraj" "Zvezna država" "Poštna številka" @@ -146,103 +131,19 @@ "Klepet s storitvijo ICQ" "Klepet s storitvijo Jabber" "Klepet" - "izbriši" - "Razširi ali strni imenska polja" - "Razširitev ali strnitev fonetičnih imenskih polj" "Vsi stiki" - "Dokončano" - "Prekliči" "Stiki v %s" "Stiki v pogledu po meri" "Posamezen stik" - "Shranjevanje uvoženih stikov v račun:" - "Uvoz s kartice SIM" - "Uvoz s kartice SIM ^1^2" - "Uvoz s kartice SIM %1$s" - "Uvoz iz datoteke .vcf" - "Želite preklicati izvoz datoteke %s?" - "Želite preklicati izvoz datoteke %s?" - "Uvoza/izvoza vCard ni mogoče preklicati" - "Neznana napaka." - "Datoteke »%s« ni bilo mogoče odpreti: %s." - "Funkcije za izvoz ni bilo mogoče zagnati: »%s«." - "Ni stikov za izvoz." - "Onemogočili ste zahtevano dovoljenje." - "Pri izvozu je prišlo do napake: »%s«." - "Zahtevano ime datoteke je predolgo (»%s«)." - "Vhodno/izhodna napaka" - "Ni dovolj pomnilnika. Morda je datoteka prevelika." - "Datoteke vCard iz neznanega razloga ni bilo mogoče razčleniti." - "Ta oblika ni podprta." - "Metapodatkov za določene datoteke vCard ni bilo mogoče zbrati." - "Ene ali več datotek ni bilo mogoče uvoziti (%s)." - "Izvoz datoteke %s je končan." - "Izvoz stikov je končan." - "Izvoz stikov je dokončan. Kliknite obvestilo, če želite dati stike v skupno rabo." - "Dotaknite se, če želite dati stike v skupno rabo." - "Izvoz datoteke %s je preklican." - "Izvažanje podatkov o stikih" - "Podatki o stikih se izvažajo." - "Informacij o zbirki podatkov ni bilo mogoče dobiti." - "Na voljo ni noben stik, ki bi ga bilo mogoče izvoziti. Če imate v napravi stike, nekateri ponudniki podatkov morda ne omogočajo njihovega izvoza iz naprave." - "Urejevalnik za vCard se ni pravilno zagnal." - "Izvoz ni mogoč" - "Podatki stika niso bili izvoženi.\nRazlog: »%s«" - "Uvažanje %s" - "Podatkov vCard ni bilo mogoče prebrati" - "Branje podatkov vCard je preklicano" - "Uvoz datoteke vCard %s je končan" - "Uvoz datoteke %s je preklican" - "Datoteka %s bo kmalu uvožena." - "Datoteka bo kmalu uvožena." - "Zahteva za uvoz datoteke vCard je bila zavrnjena. Poskusite znova pozneje." - "Datoteka %s bo kmalu izvožena." - "Datoteka bo kmalu izvožena." - "Stiki bodo kmalu izvoženi." - "Zahteva za izvoz datoteke vCard je bila zavrnjena. Poskusite znova pozneje." - "stik" - "Predpomnjenje datotek vCard v lokalno začasno shrambo. Dejanski uvoz se bo začel kmalu." - "Datoteke vCard ni mogoče uvoziti." - "Stik prejet prek NFC" - "Želite izvoziti stike?" - "Predpomnjenje" - "Uvažanje %s/%s: %s" - "Izvoz v datoteko .vcf" "Razvrsti glede na" "Ime" "Priimek" "Oblika imena" "Najprej ime" "Najprej priimek" - "Privzeti račun za nove stike" - "Sinhronizacija metapodatkov stikov" - "O Stikih" - "Nastavitve" - "Vidne stike deli z drugimi" - "Deljenje vidnih stikov z drugimi ni uspelo." - "Deljenje priljubljenih stikov" - "Skupna raba vseh stikov" - "Dajanje stikov v skupno rabo ni uspelo." - "Uvoz/izvoz stikov" - "Uvozi stike" - "Tega stika ni mogoče dati v skupno rabo." - "Ni stikov za deljenje z drugimi" - "Iskanje" - "Najdi stike" - "Priljubljene" - "Ni stikov." - "Ni vidnih stikov." - "Ni priljubljenih" - "Ni stikov v kategoriji %s" "Izbriši seznam pogostih stikov" - "Izberite kartico SIM" - "Upravljanje računov" - "Uvozi/izvozi" - "vir: %1$s" - "vir: %2$s%1$s" "ustavitev iskanja" "Počisti iskalno polje" - "Možnosti prikaza stikov" "Račun" "Vedno uporabi to možnost za klice" "Klicanje z …" @@ -250,7 +151,7 @@ "Vnesite zapisek, ki ga želite poslati s klicem ..." "POŠLJI IN KLIČI" "%1$s/%2$s" - "%1$s%2$s" + "%1$s: %2$s" "Zavihek »%1$s«." Zavihek »%1$s«. %2$d neprebran element. @@ -258,13 +159,6 @@ Zavihek »%1$s«. %2$d neprebrani elementi. Zavihek »%1$s«. %2$d neprebranih elementov. - "Delovna različica" - "Odprtokodne licence" - "Podrobnosti o licenci za odprtokodno programsko opremo" - "Pravilnik o zasebnosti" - "Pogoji storitve" - "Odprtokodne licence" - "Naslova URL ni bilo mogoče odpreti." "Videoklic" "Klic s skupno rabo" diff --git a/java/com/android/contacts/common/res/values-sq/strings.xml b/java/com/android/contacts/common/res/values-sq/strings.xml index 553c46df5..b40c98d03 100644 --- a/java/com/android/contacts/common/res/values-sq/strings.xml +++ b/java/com/android/contacts/common/res/values-sq/strings.xml @@ -18,7 +18,6 @@ "Teksti u kopjua" - "Kopjo në kujtesën e fragmenteve" "Telefono %s" "Telefono numrin e shtëpisë" "Telefono numrin celular" @@ -40,7 +39,6 @@ "Telefono numrin e biperit të punës" "Telefono %s" "Telefono numrin MMS" - "%s (Telefono)" "Dërgo mesazh te %s" "Dërgo mesazh te numri i shtëpisë" "Dërgo mesazh te numri celular" @@ -62,7 +60,6 @@ "Dërgo mesazh te numri i biperit" "Dërgo mesazh te %s" "Dërgo mesazh te numri i MMS-së" - "%s (Mesazh)" "Të pastrohen kontaktet e shpeshta?" "Do ta pastrosh listën e kontakteve të shpeshta në aplikacionet \"Kontaktet\" dhe \"Telefoni\" dhe do t\'i detyrosh aplikacionet e mail-it të mësojnë preferencat e tua të adresimit nga e para." "Po pastron kontaktet e shpeshta…" @@ -70,22 +67,14 @@ "I larguar" "I zënë" "Kontaktet" + "Sugjerimet kryesore" "Tjetër" "Direktoria" "Direktoria e punës" "Të gjitha kontaktet" + "Sugjerimet" "Unë" - "Po kërkon..." - "U gjetën më shumë se %d." - "Nuk ka asnjë kontakt" - - %d u gjetën - u gjet - - "Kontakti i shpejtë për %1$s" "(Pa emër)" - "Të telefonuara shpesh" - "Të kontaktuara shpesh" "Shiko kontaktin" "Të gjitha kontaktet me numra telefoni" "Kontaktet e profilit të punës" @@ -125,8 +114,6 @@ "Dërgo mail në %s" "Dërgo mail" "Rruga" - "Kutia postare" - "Lagjja" "Qyteti" "Shteti" "Kodi ZIP" @@ -144,103 +131,19 @@ "Bisedo me ICQ" "Bisedo me Jabber" "Bisedo" - "fshi" - "Zgjero ose palos fushat e emrit" - "Zgjero ose palos fushat e emrit fonetik" "Të gjitha kontaktet" - "U krye!" - "Anulo" "Kontaktet në %s" "Pamja e personalizuar" "Një kontakt i vetëm" - "Ruaji kontaktet e importuara në:" - "Importo nga karta SIM" - "Importo nga karta SIM ^1 - ^2" - "Importo nga karta SIM %1$s" - "Importo nga skedar .vcf" - "Të anulohet importimi i %s?" - "Të anulohet eksportimi i %s?" - "Importimi/eksportimi i vCard nuk mund të anulohej" - "Gabim i panjohur." - "Nuk mund të hapej \"%s\": %s." - "Eksportuesi nuk mund të nisej: \"%s\"." - "Nuk ka asnjë kontakt që mund të eksportohet." - "Ke çaktivizuar një leje e cila është të detyrueshme." - "Ndodhi një gabim gjatë eksportimit: \"%s\"." - "Emri i kërkuar i skedarit është shumë i gjatë (\"%s\")." - "Gabim I/O" - "Nuk ka memorie të mjaftueshme. Skedari mund të jetë shumë i madh." - "vCard nuk mund të analizohej për një arsye të paparashikuar." - "Formati nuk mbështetet." - "Informacionet e skedarit(ëve) të dhënë të vCard nuk mund të mblidheshin." - "Një ose më shumë skedarë nuk mundën të importoheshin (%s)." - "Eksportimi i %s përfundoi." - "Eksportimi i kontakteve përfundoi." - "Eksportimi i kontakteve përfundoi, kliko njoftimin për të ndarë kontaktet." - "Trokit për të ndarë kontaktet." - "Eksportimi i %s u anulua." - "Po eksporton të dhënat e kontaktit" - "Të dhënat e kontaktit po eksportohen." - "Informacionet e bazës së të dhënave nuk mund të merreshin." - "Nuk ka kontakte që mund të eksportohen. Nëse ke kontakte në pajisjen tënde, disa ofrues të të dhënave mund të mos lejojnë që kontaktet të eksportohen nga pajisja." - "Kompozitori i vCard nuk u nis si duhet." - "Nuk mund të eksportoheshin" - "Të dhënat e kontaktit nuk u eksportuan.\nArsyeja: \"%s\"" - "Po importon %s" - "Të dhënat e vCard nuk mund të lexoheshin" - "Leximi i të dhënave të vCard u anulua." - "Importimi i %s të vCard përfundoi" - "Importimi i %s u anulua" - "%s do të importohet së shpejti." - "Skedari do të importohet së shpejti." - "Kërkesa e importit të vCard u refuzua. Provo përsëri më vonë." - "%s do të eksportohet së shpejti." - "Skedari do të eksportohet së shpejti." - "Kontaktet do të eksportohen së shpejti." - "Kërkesa e eksportimit të vCard u refuzua. Provo përsëri më vonë." - "kontakti" - "Po ruan vCard në hapësirën ruajtëse lokale të përkohshme. Importimi aktual do të nisë së shpejti." - "vCard nuk mund të eksportohej." - "Kontakti u mor nëpërmjet NFC-së" - "Të eksportohen kontaktet?" - "Po ruan memorien e përkohshme" - "Po importon %s/%s: %s" - "Eksporto në skedar .vcf" "Rendit sipas" "Emri" "Mbiemri" "Formati i emrit" "Emri në fillim" "Mbiemri në fillim" - "Llogaria e parazgjedhur për kontaktet e reja" - "Sinkronizo të dhënat meta të kontakteve" - "Rreth kontakteve" - "Cilësimet" - "Shpërnda kontaktet e dukshme" - "Ndarja e kontakteve të dukshme dështoi." - "Ndaj kontaktet e preferuara" - "Ndaj të gjitha kontaktet" - "Ndarja e kontakteve dështoi." - "Importo/eksporto kontaktet" - "Importo kontaktet" - "Ky kontakt nuk mund të shpërndahet" - "Nuk ka kontakte për të shpërndarë" - "Kërko" - "Gjej kontaktet" - "Të preferuarat" - "Nuk ka asnjë kontakt." - "Nuk ka kontakte të dukshme." - "Nuk ka të preferuara" - "Nuk ka kontakte në %s" "Pastro kontaktet e shpeshta" - "Zgjidh kartën SIM" - "Menaxho llogaritë" - "Importo/eksporto" - "nëpërmjet %1$s" - "%1$s nëpërmjet %2$s" "ndalo kërkimin" "Pastro kërkimin" - "Opsionet e paraqitjes së kontaktit" "Llogaria" "Përdor gjithmonë këtë për telefonatat" "Telefono me" @@ -248,19 +151,12 @@ "Shkruaj një shënim për të dërguar një telefonatë..." "DËRGO DHE TELEFONO" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Skeda %1$s." Skeda %1$s. %2$d artikuj të palexuar. Skeda %1$s. %2$d artikull i palexuar. - "Versioni i ndërtimit" - "Licencat me burim të hapur" - "Detajet e licencës për softuer me burim të hapur" - "Politika e privatësisë" - "Kushtet e shërbimit" - "Licencat me burim të hapur" - "Dështoi në hapjen e url-së." "Telefonatë me video" "Ndaj dhe telefono" diff --git a/java/com/android/contacts/common/res/values-sr/strings.xml b/java/com/android/contacts/common/res/values-sr/strings.xml index 99997e656..f072f9835 100644 --- a/java/com/android/contacts/common/res/values-sr/strings.xml +++ b/java/com/android/contacts/common/res/values-sr/strings.xml @@ -18,7 +18,6 @@ "Текст је копиран" - "Копирај у прив. меморију" "Позови %s" "Позови кућни телефон" "Позови мобилни телефон" @@ -40,7 +39,6 @@ "Позови пословни пејџер" "Позови %s" "Позови број за MMS" - "%s (позови)" "Пошаљи SMS на %s" "Пошаљи SMS на кућни телефон" "Пошаљи SMS на мобилни телефон" @@ -62,7 +60,6 @@ "Пошаљи SMS на пословни пејџер" "Пошаљи SMS на %s" "Пошаљи SMS на број за MMS" - "%s (пошаљи SMS)" "Бришете често контактиране?" "Обрисаћете листу често контактираних у апликацијама Контакти и Телефон, па ће имејл апликације морати поново да прикупе информације о адресирању." "Брисање често контактираних..." @@ -70,23 +67,14 @@ "Одсутан/на" "Заузет/а" "Контакти" + "Најпопуларнији предлози" "Другo" "Директоријум" "Директоријум за Work" "Сви контакти" + "Предлози" "Ја" - "Претражује се…" - "Пронађено је више од %d." - "Нема контаката" - - Пронађен је %d - Пронађена су %d - Пронађено је %d - - "Брзи контакт за корисника %1$s" "(Нема имена)" - "Често позивани" - "Често контактирани" "Прикажи контакт" "Сви контакти са бројевима телефона" "Контакти са профила за Work" @@ -126,8 +114,6 @@ "Пошаљи имејл на %s" "Пошаљи имејл" "Улица" - "Поштански фах" - "Крај" "Град" "Држава" "Поштански број" @@ -145,103 +131,19 @@ "Започни ћаскање преко ICQ-а" "Започни ћаскање преко Jabber-а" "Ћаскање" - "избриши" - "Проширивање или скупљање поља за називе" - "Прошири или скупи поља за фонетско име" "Сви контакти" - "Готово" - "Откажи" "Контакти у групи %s" "Контакти у прилагођеном приказу" "Појединачни контакт" - "Сачувајте увезене контакте на:" - "Увези са SIM картице" - "Увоз са SIM картице ^1^2" - "Увоз са SIM картице %1$s" - "Увези из .vcf датотеке" - "Желите ли да откажете увоз датотеке %s?" - "Желите ли да откажете извоз датотеке %s?" - "Није могуће отказати vCard увоз/извоз" - "Непозната грешка." - "Нисмо успели да отворимо датотеку „%s“: %s." - "Није могуће покренути програм за извоз: „%s“" - "Нема контаката за извоз." - "Онемогућили сте обавезну дозволу." - "Дошло је до грешке при извозу: „%s“" - "Захтевани назив датотеке је предугачак („%s“)." - "У/И грешка" - "Нема довољно меморије. Датотека је можда превелика." - "Из неочекиваног разлога није могуће рашчланити vCard датотеку." - "Формат није подржан." - "Није могуће прикупити метаподатке наведених vCard датотека." - "Није могућ увоз једне или више датотека (%s)." - "Извоз датотеке %s је завршен." - "Извоз контаката је завршен." - "Извоз контаката је завршен. Кликните на обавештење да бисте их делили." - "Додирните да бисте делили контакте." - "Извоз датотеке %s је отказан." - "Извоз података о контактима је у току" - "Подаци о контактима се извозе." - "Преузимање информација из базе података није могуће." - "Нема контаката за извоз. Ако имате контакте на уређају, неки добављачи података можда не дозвољавају извоз контаката са уређаја." - "Програм за израду vCard датотека се није исправно покренуо." - "Извоз није могућ" - "Подаци о контактима низу извезени.\nРазлог: „%s“" - "Увоз контакта %s" - "Читање vCard података није могуће" - "Читање vCard података је отказано" - "Увоз vCard датотеке %s је завршен" - "Увоз датотеке %s је отказан" - "Датотека %s ће ускоро бити увезена." - "Датотека ће ускоро бити увезена." - "Захтев за увоз vCard датотеке је одбијен. Пробајте поново касније." - "Датотека %s ће ускоро бити извезена." - "Датотека ће ускоро бити извезена." - "Контакти ће ускоро бити извезени." - "Захтев за извоз vCard датотеке је одбијен. Пробајте поново касније." - "контакт" - "Кеширање vCard датотекa у локалну привремену меморију. Увоз ће ускоро започети." - "Увоз vCard датотеке није могућ." - "Контакт преко NFC-а" - "Желите ли да извезете контакте?" - "Кеширање" - "Увозимо %s/%s: %s" - "Извези у .vcf датотеку" "Сортирај према" "Имену" "Презимену" "Формат имена и презимена" "Прво име" "Прво презиме" - "Подразумевани налог за нове контакте" - "Синхронизујте метаподатке контаката" - "О Контактима" - "Подешавања" - "Дели видљиве контакте" - "Није успело дељење видљивих контаката." - "Дели омиљене контакте" - "Дели све контакте" - "Дељење контаката није успело." - "Увоз/извоз контаката" - "Увези контакте" - "Овај контакт не може да се дели." - "Нема контаката за дељење." - "Претражи" - "Пронађите контакте" - "Омиљено" - "Нема контаката." - "Нема видљивих контаката." - "Нема омиљених" - "Нема контаката у групи %s" "Обриши често контактиране" - "Изаберите SIM картицу" - "Управљај налозима" - "Увези/извези" - "преко %1$s" - "%1$s преко %2$s" "заустављање претраживања" "Брисање претраге" - "Опције приказивања контаката" "Налог" "Увек користи ово за позиве" "Позови помоћу" @@ -249,20 +151,13 @@ "Унесите белешку коју ћете послати уз позив..." "ПОШАЉИ И ПОЗОВИ" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Картица %1$s." Картица %1$s. %2$d непрочитана ставка. Картица %1$s. %2$d непрочитане ставке. Картица %1$s. %2$d непрочитаних ставки. - "Верзија" - "Лиценце отвореног кода" - "Детаљи лиценце за софтвер отвореног кода" - "Политика приватности" - "Услови коришћења услуге" - "Лиценце отвореног кода" - "Отварање URL-а није успело." "Видео позив" "Дели и позови" diff --git a/java/com/android/contacts/common/res/values-sv/strings.xml b/java/com/android/contacts/common/res/values-sv/strings.xml index 79e56e504..eb1976e37 100644 --- a/java/com/android/contacts/common/res/values-sv/strings.xml +++ b/java/com/android/contacts/common/res/values-sv/strings.xml @@ -18,7 +18,6 @@ "Texten har kopierats" - "Kopiera till Urklipp" "Ring %s" "Ring hem" "Ring mobilen" @@ -40,7 +39,6 @@ "Ring upp jobbpersonsökare" "Ring %s" "Ring upp MMS" - "%s (ring)" "Skicka SMS till %s" "Skicka SMS till hem" "Skicka SMS till mobil" @@ -62,7 +60,6 @@ "Skicka SMS till jobbpersonsökare" "Skicka SMS till %s" "Skicka SMS till MMS" - "%s (meddelande)" "Vill du rensa listan?" "Du rensar listan över personer som du kontaktar ofta i apparna Kontakter och Telefon. E-postappar tvingas lära sig dina mottagarinställningar från början." "Listan rensas …" @@ -70,22 +67,14 @@ "Borta" "Upptagen" "Kontakter" + "Bästa förslagen" "Övrigt" "Katalog" "Jobbkatalog" "Alla kontakter" + "Förslag" "Jag" - "Söker…" - "Fler än %d hittades." - "Inga kontakter" - - %d hittade - En hittad - - "Snabbkontakt för %1$s" "(Inget namn)" - "Ringer ofta" - "Kontaktar ofta" "Visa kontakten" "Alla kontakter med telefonnummer" "Kontakter i jobbprofilen" @@ -125,8 +114,6 @@ "Skicka e-post till %s" "E-post" "Gatuadress" - "Postbox" - "Område" "Ort" "Delstat" "Postnummer" @@ -144,103 +131,19 @@ "Chatta med ICQ" "Chatta med Jabber" "Chatt" - "ta bort" - "Expandera eller komprimera namnfält" - "Expandera eller komprimera fonetiska namnfält" "Alla kontakter" - "Färdig" - "Avbryt" "Kontakter i %s" "Kontakter i anpassad vy" "En kontakt" - "Spara importerade kontakter i:" - "Importera från SIM-kort" - "Importera från SIM-kort ^1^2" - "Importera från SIM-kort %1$s" - "Importera från VCF-fil" - "Vill du avbryta importen av %s?" - "Vill du avbryta exporten av %s?" - "Kunde ej avbryta import/export av vCard" - "Okänt fel." - "Det gick inte att öppna %s: %s." - "Det gick inte att starta exportverktyget: %s." - "Det finns ingen kontakt att exportera." - "Du har inaktiverat en behörighet som krävs." - "Ett fel inträffade under exporten: %s." - "Det obligatoriska filnamnet är för långt (%s)." - "I/O-fel" - "Det finns inte tillräckligt med minne. Filen kan vara för stor." - "Det gick inte att analysera vCard av okänd anledning." - "Formatet stöds inte." - "Det gick inte att samla in metainformation för de angivna vCard-filerna." - "En eller flera filer kunde inte importeras (%s)." - "%s har exporterats." - "Kontakterna har exporterats." - "Kontakterna exporterade. Klicka på aviseringen om du vill dela dem." - "Tryck här om du vill dela kontakterna." - "Exporten av %s avbröts." - "Kontaktuppgifter exporteras" - "Kontaktuppgifterna exporteras." - "Det gick inte att hämta databasinformation." - "Det finns inga kontakter att exportera. Om du har kontakter på mobilen tillåter kanske inte vissa dataleverantörer att kontakter exporteras från mobilen." - "vCard-kompositören initierades inte korrekt." - "Kunde inte exportera" - "Kontaktuppgifterna exporterades inte.\nOrsak: %s" - "Importerar %s" - "Det gick inte att läsa vCard-data" - "Inläsningen av vCard-data avbröts" - "vCard-filen %s har importerats" - "Importen av %s avbröts" - "%s importeras snart." - "Filen kommer snart att importeras." - "Begäran om vCard-import avvisades. Försök igen vid ett senare tillfälle." - "%s exporteras snart." - "Filen kommer snart att exporteras." - "Kontakterna exporteras snart." - "Begäran om vCard-export avvisades. Försök igen vid ett senare tillfälle." - "kontakt" - "vCard-fil(er) cachelagras till en lokal tillfällig lagringsenhet. Den faktiska importen börjar snart." - "Det gick inte att importera vCard." - "Mott. v. NFC" - "Vill du exportera kontakter?" - "Cachelagrar" - "Importerar %s/%s: %s" - "Exportera till VCF-fil" "Sortera efter" "Förnamn" "Efternamn" "Namnformat" "Förnamn först" "Efternamn först" - "Standardkonto för nya kontakter" - "Synkronisera metadata för kontakter" - "Om Kontakter" - "Inställningar" - "Dela synliga kontakter" - "Det gick inte att dela synliga kontakter." - "Dela favoritkontakterna" - "Dela alla kontakter" - "Det gick inte att dela kontakterna." - "Importera/exportera kontakter" - "Importera kontakter" - "Den här kontakten kan inte delas." - "Det finns inga kontakter att dela." - "Sökning" - "Sök efter kontakter" - "Favoriter" - "Inga kontakter." - "Det finns inga synliga kontakter." - "Inga favoriter" - "Inga kontakter i %s" "Rensa listan över kontakter" - "Välj SIM-kort" - "Hantera konton" - "Importera/exportera" - "via %1$s" - "%1$s via %2$s" "avbryt sökning" "Rensa sökning" - "Visningsalternativ för kontakter" "Konto" "Använd alltid för samtal" "Ring med" @@ -248,19 +151,12 @@ "Gör en anteckning som skickas när du ringer …" "SKICKA OCH RING" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "Fliken %1$s." Fliken %1$s. %2$d olästa poster. Fliken %1$s. %2$d oläst post. - "Programversion" - "Licenser för öppen källkod" - "Licensinformation för programvara med öppen källkod" - "Sekretesspolicy" - "Användarvillkor" - "Licenser för öppen källkod" - "Det gick inte att öppna webbadressen." "Videosamtal" "Dela och ring" diff --git a/java/com/android/contacts/common/res/values-sw/strings.xml b/java/com/android/contacts/common/res/values-sw/strings.xml index 4d30271f3..9388649bf 100644 --- a/java/com/android/contacts/common/res/values-sw/strings.xml +++ b/java/com/android/contacts/common/res/values-sw/strings.xml @@ -18,7 +18,6 @@ "Maandishi yamenakiliwa" - "Nakili kwenye ubao wa kunakili" "Pia simu %s" "Piga simu nyumbani" "Pigia simu ya mkononi" @@ -40,7 +39,6 @@ "Ipigie peja ya kazini" "Piga simu %s" "Piga simu kwa MMS" - "%s (Piga)" "Tumia ujumbe wa maandishi kwa %s" "Tuma ujumbe wa maandishi nyumbani" "Tumia simu ya mkononi ujumbe wa maandishi" @@ -62,7 +60,6 @@ "Itumie peja ya kazini ya kazini ujumbe" "Tuma ujumbe wa maandishi kwa %s" "Tumia MMS ujmbe wa maandishi" - "%s (Tuma Ujumbe)" "Futa unaowasiliana nao mara kwa mara?" "Utafuta orodha ya unaowasiliana nao mara kwa mara katika programu za Anwani na Simu, na ulazimishe programu za barua pepe zitambue mapendeleo yako ya anwani kutoka mwanzo." "Inafuta unaowasiliana nao mara kwa mara..." @@ -70,22 +67,14 @@ "Mbali" "Ana shughuli" "Anwani" + "Mapendekezo Maarufu" "Nyingineyo" "Saraka" "Anwani za kazi" "Anwani zote" + "Mapendekezo" "Mimi" - "Inatafuta…" - "Zaidi ya %d zimepatikana." - "Hakuna anwani" - - %d zimepatikana - 1 imepatikana - - "Anwani ya haraka ya %1$s" "(Hakuna jina)" - "Zinazopigwa mara kwa mara" - "Unaowasiliana nao zaidi" "Angalia maelezo ya mawasiliano" "Anwani zote zilizo na nambari ya simu" "Anwani za watu wa kazini" @@ -125,8 +114,6 @@ "Tuma barua pepe kwenye %s" "Tuma barua pepe" "Barabara" - "Sanduku la posta" - "Mtaa" "Mji" "Jimbo" "Msimbo wa posta" @@ -144,103 +131,19 @@ "Piga gumzo kutumia ICQ" "Piga gumzo kutumia Jabber" "Gumzo" - "futa" - "Panua au ukunje sehemu za jina" - "Panua au ukunje sehemu za majina ya kifonetiki" "Anwani zote" - "Kwisha" - "Ghairi" "Anwani kwenye %s" "Anwani katika mwoneko maalum" "Anwani moja" - "Hifadhi anwani zinazoingizwa kwenye:" - "Ingiza kutoka SIM kadi" - "Leta kutoka SIM ^1 - ^2" - "Leta kutoka SIM %1$s" - "Leta kutoka faili ya .vcf" - "Ghairi uhamisho wa %s?" - "Ighairi uhamisho wa %s?" - "Haikuweza kughairi uingizaji/uhamishaji wa vCard" - "Hitilafu isiyojulikana." - "Imeshindwa kufungua \"%s\": %s." - "Haikuweza kuanzisha kihamishaji: \"%s\"." - "Hakuna anwani inayoweza kuhamishwa." - "Umezima idhini inayohitajika." - "Hitilafu imetokea wakati wa uhamisho: \"%s\"." - "Jina la faili linalohitajika ni ndefu sana (\"%s\")." - "Hitilafu ya I/O" - "Hakuna kumbukumbu ya kutosha. Faili inaweza kuwa kubwa mno." - "Haikuweza kuchanganua vCard kwa sababu isiyotarajiwa." - "Muundo huu hautumiki." - "Haikuweza kukusanya maelezo meta ya faili zilizotolewa za vCard." - "Moja au faili zaidi hazikuweza kuingizwa (%s)." - "Imemaliza kuhamisha %s." - "Imekamilisha kuhamisha anwani." - "Imemaliza kuhamisha anwani, bofya kipengele cha arifa ili kushiriki anwani." - "Gonga ili ushiriki anwani." - "Kuhamisha %s kumeghairiwa." - "Inahamisha data ya anwani" - "Inahamisha data ya anwani." - "Haikupata maelezo ya hifadhidata." - "Hakuna anwani zinazoweza kuhamishwa. Kama una anwani kwenye kompyuta kibao, huenda baadhi ya watoa huduma za data hawaruhusu anwani zihamishwe kutoka kwenye kifaa." - "Kitunzi cha vCard hakikuanza vizuri." - "Isingehamishika" - "Data ya anwani haikuhamishwa.\nKwa sababu: \"%s\"" - "Inaleta %s" - "Haikuweza kusoma data ya vCard" - "Kusoma data ya VCard kumeghairiwa" - "Imemaliza kuleta %s ya vCard" - "Kuleta %s kumeghairiwa" - "%s italetwa hivi karibuni." - "Faili italetwa hivi karibuni." - "Ombi la kuleta vCard limekataliwa. Tafadhali jaribu baadaye." - "%s itahamishwa baada ya muda mfupi." - "Faili itahamishwa baada ya dakika chache." - "Itahamisha anwani baada ya muda mfupi." - "Ombi la kuhamishwa kwa vCard limekataliwa. Jaribu tena baadaye." - "anwani" - "Vcard Inaakibisha ndani ya hifadhi ya muda mfupi. Uhamisho halisi utaanza hivi karibuni." - "Haikuweza kuleta vCard." - "Anwani imepokewa kupitia NFC" - "Anwani Zihamishwe?" - "Inaakibisha" - "Inaleta %s/%s: %s" - "Tuma kwenye faili ya .vcf" "Panga kulingana na" "Jina la kwanza" "Jina la mwisho" "Mpangilio wa majina" "Anza kwa jina la kwanza" "Anza kwa jina la mwisho" - "Akaunti ya msingi ya anwani mpya" - "Sawazisha metadata ya anwani" - "Kuhusu Anwani" - "Mipangilio" - "Shiriki anwani zinazoonekana" - "Imeshindwa kushiriki anwani zinazoonekana." - "Shiriki anwani unazopenda" - "Shiriki anwani zote" - "Imeshindwa kushiriki anwani." - "Ingiza au uhamishe anwani" - "Ingiza anwani" - "Anwani hii haiwezi kushirikiwa." - "Hakuna anwani za kushiriki." - "Tafuta" - "Tafuta anwani" - "Vipendwa" - "Hakuna anwani." - "Hakuna anwani zinazoonekana" - "Hakuna vipendwa" - "Hakuna anwani kwenye %s" "Futa za mara kwa mara" - "Chagua SIM kadi" - "Dhibiti akaunti" - "Ingiza au uhamishe" - "kupitia %1$s" - "%1$s kupitia %2$s" "acha kutafuta" "Futa utafutaji" - "Chaguo za onyesho la anwani" "Akaunti" "Tumia hii kwa simu wakati wote" "Piga simu ukitumia" @@ -248,19 +151,12 @@ "Andika dokezo litakaloambatana na simu utakayopiga ..." "TUMA na UPIGE SIMU" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Kichupo cha %1$s." Kichupo cha %1$s. Vipengee %2$d havijasomwa. Kichupo cha %1$s. Kipengee %2$d hakijasomwa. - "Toleo la muundo" - "Leseni za programu huria" - "Maelezo ya leseni ya programu huria" - "Sera ya faragha" - "Sheria na masharti" - "Leseni za programu huria" - "Imeshindwa kufungua url." "Simu ya video" "Shiriki na upige simu" diff --git a/java/com/android/contacts/common/res/values-sw600dp/dimens.xml b/java/com/android/contacts/common/res/values-sw600dp/dimens.xml index cf67a1e72..e5773b42d 100644 --- a/java/com/android/contacts/common/res/values-sw600dp/dimens.xml +++ b/java/com/android/contacts/common/res/values-sw600dp/dimens.xml @@ -15,12 +15,9 @@ --> - 0dip - @dimen/list_visible_scrollbar_padding 24dip - 16dip 32dp diff --git a/java/com/android/contacts/common/res/values-ta/strings.xml b/java/com/android/contacts/common/res/values-ta/strings.xml index e041a999d..182d7c799 100644 --- a/java/com/android/contacts/common/res/values-ta/strings.xml +++ b/java/com/android/contacts/common/res/values-ta/strings.xml @@ -18,7 +18,6 @@ "உரை நகலெடுக்கப்பட்டது" - "கிளிப்போர்டுக்கு நகலெடு" "%s மொபைல் எண்ணில் அழை" "வீட்டு தொலைபேசி எண்ணில் அழை" "மொபைல் எண்ணில் அழை" @@ -40,7 +39,6 @@ "பணியிடத்தின் பேஜர் எண்ணில் அழை" "%s ஐ அழை" "MMS தொலைபேசி எண்ணில் அழை" - "%s (அழை)" "%s க்கு உரைச்செய்தி அனுப்பு" "வீட்டு தொலைபேசி எண்ணிற்கு உரைச்செய்தி அனுப்பு" "மொபைல் எண்ணிற்கு உரைச்செய்தி அனுப்பு" @@ -62,7 +60,6 @@ "பணியிட பேஜர் எண்ணிற்கு உரைச்செய்தி அனுப்பு" "%s க்கு உரைச்செய்தி அனுப்பு" "MMS மொபைல் எண்ணிற்கு உரைச்செய்தி அனுப்பு" - "%s (செய்தி அனுப்பு)" "அடிக்கடி தொடர்புகொண்ட தொடர்பை அழிக்கவா?" "தொடர்புகள் மற்றும் ஃபோன் பயன்பாடுகளில் உள்ள அடிக்கடி தொடர்பு கொண்டவர்களின் பட்டியல் அழிக்கப்பட்டு, தொடக்கத்திலிருந்து மீண்டும் உங்கள் முகவரியிடல் விருப்பத்தேர்வுகளை மின்னஞ்சல் பயன்பாடுகள் அறியும்படி செய்யப்படும்." "அடிக்கடித் தொடர்புகொண்ட தொடர்பை அழிக்கிறது…" @@ -70,22 +67,14 @@ "வெளியே" "பணிமிகுதி" "தொடர்புகள்" + "அதிகம் பரிந்துரைத்தவை" "மற்றவை" "கோப்பகம்" "பணிக் கோப்பகம்" "எல்லா தொடர்புகளும்" + "பரிந்துரைகள்" "எனக்கு" - "தேடுகிறது..." - "%d க்கும் மேற்பட்டவை கண்டறியப்பட்டன." - "தொடர்புகள் இல்லை" - - %d தொடர்புகள் உள்ளன - 1 தொடர்பு உள்ளது - - "%1$s க்கான விரைவு தொடர்பு" "(பெயர் இல்லை)" - "அடிக்கடி தொடர்புகொண்டவர்கள்" - "அடிக்கடி தொடர்புகொண்டவர்கள்" "தொடர்பைக் காட்டும் பொத்தான்" "மொபைல் எண்களுடனான எல்லா தொடர்புகளும்" "பணிச் சுயவிவரத் தொடர்புகள்" @@ -125,8 +114,6 @@ "%s க்கு மின்னஞ்சல் அனுப்பு" "மின்னஞ்சல்" "தெரு" - "அஞ்சல் பெட்டி" - "சுற்றுப்புறங்கள்" "நகரம்" "மாநிலம்" "ஜிப் குறியீடு" @@ -144,103 +131,19 @@ "ICQ இல் அரட்டையடி" "Jabber இல் அரட்டையடி" "அரட்டை" - "நீக்கு" - "பெயர் புலங்களை விரிவுப்படுத்து அல்லது சுருக்கு" - "ஒலிப்புமுறை பெயர் புலங்களை விரி அல்லது சுருக்கு" "எல்லா தொடர்புகளும்" - "முடிந்தது" - "ரத்துசெய்" "%s இல் உள்ள தொடர்புகள்" "தனிப்பயன் காட்சியில் உள்ள தொடர்புகள்" "ஒரு தொடர்பு" - "இறக்கிய தொடர்புகளை இதில் சேமி:" - "சிம் கார்டிலிருந்து இறக்குமதிசெய்" - "^1 - ^2 என்ற SIM இல் இருந்து இறக்குமதிசெய்" - "%1$s என்ற SIM இல் இருந்து இறக்குமதிசெய்" - ".vcf கோப்பிலிருந்து இறக்கு" - "%s இன் இறக்குமதியை ரத்துசெய்யவா?" - "%s இன் ஏற்றுமதியை ரத்துசெய்யவா?" - "vCard இன் இறக்குமதி/ஏற்றுமதியை ரத்துசெய்ய முடியவில்லை" - "தெரியாத பிழை." - "\"%s\"ஐத் திறக்க முடியவில்லை: %s." - "ஏற்றுமதியைத் தொடங்க முடியவில்லை: \"%s\"." - "ஏற்றுமதி செய்யக்கூடிய தொடர்பு இல்லை." - "தேவைப்படும் அனுமதியை முடக்கியுள்ளீர்கள்." - "ஏற்றுமதி செய்யும்போது பிழை: \"%s\"." - "தேவையான கோப்பின் பெயர் மிகவும் நீளமாக உள்ளது (\"%s\")." - "I/O பிழை" - "போதுமான நினைவகம் இல்லை. கோப்பு மிகவும் பெரியதாக இருக்கலாம்." - "எதிர்பாராதவிதமாக vCard ஐப் பாகுபடுத்த முடியவில்லை." - "வடிவம் ஆதரிக்கப்படவில்லை." - "வழங்கப்பட்ட vCard கோப்பின்(களின்) மெட்டா தகவலைச் சேகரிக்க முடியவில்லை." - "ஒன்று அல்லது அதற்கு மேற்பட்ட கோப்புகளை ஏற்றுமதி செய்ய முடியவில்லை (%s)." - "%s ஏற்றப்பட்டது." - "தொடர்புகள் ஏற்றப்பட்டன." - "தொடர்புகள் ஏற்றப்பட்டன. தொடர்புகளைப் பகிர, அறிவிப்பைக் கிளிக் செய்யவும்." - "தொடர்புகளைப் பகிர, தட்டவும்." - "%s ஐ ஏற்றுமதி செய்வது ரத்துசெய்யப்பட்டது." - "தொடர்பு தரவை ஏற்றுமதி செய்கிறது" - "தொடர்புத் தரவு ஏற்றப்படுகிறது." - "தரவுத்தளத் தகவலைப் பெற முடியவில்லை." - "ஏற்றத்தக்க தொடர்புகள் இல்லை. சாதனத்தில் தொடர்புகள் இருந்தாலும், சாதனத்திலிருந்து அவற்றை ஏற்றுவதற்குச் சில தரவு வழங்குநர்கள் அனுமதிக்காமல் போகலாம்." - "vCard தொகுப்பான் முறையாகத் தொடங்கவில்லை." - "ஏற்றுமதி செய்ய முடியவில்லை" - "தொடர்பு தரவு ஏற்றுமதி செய்யப்படவில்லை.\nகாரணம்: \"%s\"" - "%s ஐ இறக்குமதி செய்கிறது" - "vCard தரவைப் படிக்க முடியவில்லை" - "vCard தரவைப் படிப்பது ரத்துசெய்யப்பட்டது" - "vCard %s இறக்கப்பட்டது" - "%s ஐ இறக்குமதிசெய்வது ரத்துசெய்யப்பட்டது" - "%s விரைவில் இறக்குமதி செய்யப்படும்." - "கோப்பு விரைவில் இறக்குமதி செய்யப்படும்." - "vCard இன் இறக்குமதி கோரிக்கை நிராகரிக்கப்பட்டது. பிறகு முயற்சிக்கவும்." - "%s விரைவில் ஏற்றுமதி செய்யப்படும்." - "கோப்பு விரைவில் ஏற்றப்படும்." - "கூடிய விரைவில் தொடர்புகள் ஏற்றப்படும்." - "vCard இன் ஏற்றுமதி கோரிக்கை நிராகரிக்கப்பட்டது. பிறகு முயற்சிக்கவும்." - "தொடர்பு" - "vCard(களை) ஐ அகச் சேமிப்பிடத்தில் தற்காலிகமாகச் சேமிக்கிறது. அசல் இறக்குமதி உடனடியாக தொடங்கப்படும்." - "vCard ஐ இறக்குமதி செய்ய முடியவில்லை." - "NFC வழியாக தொடர்பு பெறப்பட்டது" - "தொடர்புகளை இறக்கவா?" - "தற்காலிகமாகச் சேமித்தல்" - "%s/%sஐ இறக்குகிறது: %s" - ".vcf கோப்பிற்கு ஏற்று" "வரிசைப்படுத்து" "முதல் பெயர்" "இறுதிப் பெயர்" "பெயர் வடிவம்" "முதல் பெயர் முதலில்" "இறுதிப் பெயர் முதலில்" - "புதிய தொடர்புகளுக்கான இயல்பு கணக்கு" - "தொடர்பின் மீத்தரவை ஒத்திசை" - "தொடர்புகள் விவரம்" - "அமைப்பு" - "தெரியும் தொடர்புகளைப் பகிர்" - "தெரியும் தொடர்புகளைப் பகிர்வதில் தோல்வி." - "பிடித்த தொடர்புகளைப் பகிர்" - "எல்லா தொடர்புகளையும் பகிர்" - "தொடர்புகளைப் பகிர முடியவில்லை." - "தொடர்புகளை இறக்கு/ஏற்று" - "தொடர்புகளை இறக்குமதி செய்" - "தொடர்பைப் பகிர முடியவில்லை." - "பகிர்வதற்குத் தொடர்புகள் இல்லை." - "தேடு" - "தொடர்புகளைக் கண்டறி" - "பிடித்தவை" - "தொடர்புகள் இல்லை." - "தெரியும் தொடர்புகள் எதுவுமில்லை." - "பிடித்தவை எதுவும் இல்லை" - "%s இல் தொடர்புகள் இல்லை" "அடிக்கடி தொடர்புகொண்டவர்களை அழி" - "சிம் ஐத் தேர்ந்தெடுக்கவும்" - "கணக்குகளை நிர்வகி" - "இறக்கு/ஏற்று" - "%1$s வழியாக" - "%2$s வழியாக %1$s" "தேடுவதை நிறுத்து" "தேடலை அழி" - "தொடர்பின் காட்சி விருப்பத்தேர்வு" "கணக்கு" "அழைப்புகளுக்கு எப்போதும் இதைப் பயன்படுத்து" "இதன் மூலம் அழை" @@ -248,19 +151,12 @@ "அழைப்புடன் சேர்த்து அனுப்ப, குறிப்பை உள்ளிடவும்..." "அனுப்பி அழை" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s தாவல்." %1$s தாவல். படிக்காதவை (%2$d). %1$s தாவல். படிக்காதது (%2$d). - "பதிப்பு எண்" - "ஓப்பன் சோர்ஸ் உரிமங்கள்" - "ஓப்பன் சோர்ஸ் மென்பொருளுக்கான உரிம விவரங்கள்" - "தனியுரிமைக் கொள்கை" - "சேவை விதிமுறைகள்" - "ஓப்பன் சோர்ஸ் உரிமங்கள்" - "urlஐத் திறக்க முடியவில்லை." "வீடியோ அழைப்பைத் தொடங்குவதற்கான பொத்தான்" "பகிர்ந்து அழைப்பதற்கான பொத்தான்" diff --git a/java/com/android/contacts/common/res/values-te/strings.xml b/java/com/android/contacts/common/res/values-te/strings.xml index 6dd0e2143..b1f221499 100644 --- a/java/com/android/contacts/common/res/values-te/strings.xml +++ b/java/com/android/contacts/common/res/values-te/strings.xml @@ -18,7 +18,6 @@ "వచనం కాపీ చేయబడింది" - "క్లిప్‌బోర్డ్‌కు కాపీ చేయి" "%sకు కాల్ చేయండి" "ఇంటికి కాల్ చేయండి" "మొబైల్‌కు కాల్ చేయండి" @@ -40,7 +39,6 @@ "కార్యాలయ పేజర్‌కు కాల్ చేయండి" "%sకు కాల్ చేయండి" "MMSకు కాల్ చేయండి" - "%s (కాల్ చేయి)" "%sకు వచనం పంపండి" "ఇంటికి వచనం పంపండి" "మొబైల్‌కు వచనం పంపండి" @@ -62,7 +60,6 @@ "కార్యాలయ పేజర్‌కు వచనం పంపండి" "%sకు వచనం పంపండి" "MMSకు వచనం పంపండి" - "%s (సందేశం పంపు)" "తరచుగా సంప్రదించినవాటిని క్లియర్ చేయాలా?" "మీరు పరిచయాలు మరియు ఫోన్ అనువర్తనాల్లో తరచుగా సంప్రదించిన పరిచయాల జాబితాను తీసివేస్తారు మరియు స్క్రాచ్ నుండి మీ చిరునామా ప్రాధాన్యతలను తెలుసుకునేలా ఇమెయిల్ అనువర్తనాలను నిర్బంధిస్తారు." "తరచుగా సంప్రదించినవాటిని క్లియర్ చేస్తోంది…" @@ -70,22 +67,14 @@ "దూరంగా ఉన్నారు" "బిజీగా ఉన్నారు" "పరిచయాలు" + "ఉత్తమ సూచనలు" "ఇతరం" "డైరెక్టరీ" "కార్యాలయ డైరెక్టరీ" "అన్ని పరిచయాలు" + "సూచనలు" "నేను" - "శోధిస్తోంది..." - "%d కంటే ఎక్కువ కనుగొనబడ్డాయి." - "పరిచయాలు లేవు" - - %d కనుగొనబడ్డాయి - 1 కనుగొనబడింది - - "%1$s కోసం శీఘ్ర సంప్రదింపు" "(పేరు లేదు)" - "తరచుగా కాల్ చేయబడినవి" - "తరచుగా సంప్రదించబడినవి" "పరిచయాన్ని వీక్షించండి" "ఫోన్ నంబర్‌లు గల అన్ని పరిచయాలు" "కార్యాలయ ప్రొఫైల్ పరిచయాలు" @@ -125,8 +114,6 @@ "%sకు ఇమెయిల్ చేయండి" "ఇమెయిల్ చేయండి" "వీధి" - "PO పెట్టె" - "పరిసరాలు" "నగరం" "రాష్ట్రం" "జిప్ కోడ్" @@ -144,103 +131,19 @@ "ICQని ఉపయోగించి చాట్ చేయండి" "Jabberని ఉపయోగించి చాట్ చేయండి" "చాట్ చేయండి" - "తొలగించు" - "పేరు ఫీల్డ్‌లను విస్తరింపజేయి లేదా కుదించు" - "ఫొనెటిక్ పేరు ఫీల్డ్‌లను విస్తరింపజేస్తుంది లేదా కుదిస్తుంది" "అన్ని పరిచయాలు" - "పూర్తయింది" - "రద్దు చేయి" "%sలో పరిచయాలు" "అనుకూల వీక్షణలో పరిచయాలు" "ఒక పరిచయం" - "దిగుమతి చేసిన పరిచయాలను దీనికి సేవ్ చేయి:" - "సిమ్ కార్డు నుండి దిగుమతి చేయండి" - "^1 - ^2 SIM నుండి దిగుమతి చేయండి" - "%1$s SIM నుండి దిగుమతి చేయండి" - ".vcf ఫైల్ నుండి దిగుమతి చేయి" - "%s యొక్క దిగుమతిని రద్దు చేయాలా?" - "%s యొక్క ఎగుమతిని రద్దు చేయాలా?" - "vCard దిగుమతి/ఎగుమతిని రద్దు చేయడం సాధ్యపడలేదు" - "తెలియని లోపం." - "\"%s\"ని ఈ కారణంగా తెరవడం సాధ్యపడలేదు: %s." - "ఎక్స్‌పోర్టర్‌ను ప్రారంభించడం సాధ్యపడలేదు: \"%s\"." - "ఎగమతి చేయగల పరిచయం లేదు." - "మీరు అవసరమయ్యే అనుమతిని నిలిపివేసారు." - "ఎగుమతి సమయంలో లోపం సంభవించింది: \"%s\"." - "అవసరమైన ఫైల్ పేరు (\"%s\") చాలా పెద్దదిగా ఉంది." - "I/O లోపం" - "తగినంత మెమరీ లేదు. ఫైల్ చాలా పెద్దదిగా ఉండవచ్చు." - "ఊహించని కారణంగా vCardను అన్వయించడం సాధ్యపడలేదు." - "ఆకృతికి మద్దతు లేదు." - "అందించిన vCard ఫైల్(లు) యొక్క మెటా డేటా సమాచారాన్ని సేకరించడం సాధ్యపడలేదు." - "ఒకటి లేదా అంతకంటే ఎక్కువ ఫైల్‌లను (%s) దిగుమతి చేయడం సాధ్యపడలేదు." - "%sని ఎగుమతి చేయడం పూర్తయింది." - "పరిచయాలను ఎగుమతి చేయడం పూర్తయింది." - "పరిచయాలను ఎగుమతి చేయడం పూర్తయింది, పరిచయాలను భాగస్వామ్యం చేయడానికి నోటిఫికేషన్‌ను క్లిక్ చేయండి." - "పరిచయాలను భాగస్వామ్యం చేయడానికి నొక్కండి." - "%sని ఎగుమతి చేయడం రద్దు చేయబడింది." - "పరిచయ డేటాను ఎగుమతి చేస్తోంది" - "పరిచయ డేటా ఎగుమతి చేయబడుతోంది." - "డేటాబేస్ సమాచారాన్ని పొందడం సాధ్యపడలేదు." - "ఎగుమతి చేయదగిన పరిచయాలు ఏవీ లేవు. మీరు మీ పరికరంలో పరిచయాలు కలిగి ఉన్నప్పటికీ, కొందరు డేటా ప్రదాతలు పరిచయాలను పరికరం నుండి ఎగుమతి చేయడానికి అనుమతించకుండా ఉండవచ్చు." - "vCard కంపోజర్ సరిగ్గా ప్రారంభించబడలేదు." - "ఎగుమతి చేయడం సాధ్యపడలేదు" - "పరిచయ డేటా ఎగుమతి చేయబడలేదు.\nకారణం: \"%s\"" - "%sని దిగుమతి చేస్తోంది" - "vCard డేటాను చదవడం సాధ్యపడలేదు" - "vCard డేటాను చదవడం రద్దయింది" - "vCard %sని దిగుమతి చేయడం పూర్తయింది" - "%sని దిగుమతి చేయడం రద్దయింది" - "%s కొద్దిసేపట్లో దిగుమతి చేయబడుతుంది." - "ఫైల్ కొద్దిసేపట్లో దిగుమతి చేయబడుతుంది." - "vCard దిగుమతి అభ్యర్థన తిరస్కరించబడింది. తర్వాత మళ్లీ ప్రయత్నించండి." - "%s కొద్దిసేపట్లో ఎగుమతి చేయబడుతుంది." - "ఫైల్ కాసేపట్లో ఎగుమతి చేయబడుతుంది." - "పరిచయాలు కొద్ది సేపట్లో ఎగుమతి చేయబడతాయి." - "vCard ఎగుమతి అభ్యర్థన తిరస్కరించబడింది. తర్వాత మళ్లీ ప్రయత్నించండి." - "పరిచయం" - "vCard(ల)ను స్థానిక తాత్కాలిక నిల్వకు కాష్ చేస్తోంది. అసలు దిగుమతి కొద్దిసేపట్లో ప్రారంభమవుతుంది." - "vCardని దిగుమతి చేయడం సాధ్యపడలేదు." - "పరిచయం NFC ద్వారా స్వీకరించబడింది" - "పరిచయాలను ఎగుమతి చేయాలా?" - "కాష్ చేస్తోంది" - "%sలో %s దిగుమతి చేస్తోంది: %s" - ".vcf ఫైల్‌కు ఎగుమతి చేయి" "ఇలా క్రమబద్ధీకరించు" "మొదటి పేరు" "చివరి పేరు" "పేరు ఆకృతి" "ముందుగా మొదటి పేరు" "ముందుగా చివరి పేరు" - "కొత్త పరిచయాల కోసం డిఫాల్ట్ ఖాతా" - "పరిచయ మెటాడేటాను సమకాలీకరించు" - "పరిచయాల గురించి" - "సెట్టింగ్‌లు" - "కనిపించే పరిచయాలను భాగస్వామ్యం చేయండి" - "కనిపించే పరిచయాలను భాగస్వామ్యం చేయడం విఫలమైంది." - "ఇష్టమైన పరిచయాలను భాగస్వామ్యం చేయి" - "పరిచయాలన్నీ భాగస్వామ్యం చేయి" - "పరిచయాలను భాగస్వామ్యం చేయడం విఫలమైంది." - "పరిచయాలను దిగుమతి/ఎగుమతి చేయండి" - "పరిచయాలను దిగుమతి చేయి" - "ఈ పరిచయాన్ని భాగస్వామ్యం చేయడం సాధ్యపడదు." - "భాగస్వామ్యం చేయడానికి పరిచయాలు ఏవీ లేవు." - "శోధించండి" - "పరిచయాలను కనుగొనండి" - "ఇష్టమైనవి" - "పరిచయాలు లేవు." - "కనిపించే పరిచయాలు ఏవీ లేవు." - "ఇష్టమైనవి లేవు" - "%sలో పరిచయాలు లేవు" "తరచుగా ఉన్నవాటిని క్లియర్ చేయి" - "సిమ్ కార్డ్‌ను ఎంచుకోండి" - "ఖాతాలను నిర్వహించు" - "దిగుమతి చేయి/ఎగుమతి చేయి" - "%1$s ద్వారా" - "%2$s ద్వారా %1$s" "శోధించడం ఆపివేయి" "శోధనను క్లియర్ చేయి" - "పరిచయ ప్రదర్శన ఎంపికలు" "ఖాతా" "కాల్‌ల కోసం ఎల్లప్పుడూ దీన్ని ఉపయోగించు" "దీనితో కాల్ చేయండి" @@ -248,19 +151,12 @@ "కాల్‌తో పాటు పంపడానికి గమనికను టైప్ చేయండి ..." "పంపు & కాల్ చేయి" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ట్యాబ్." %1$s ట్యాబ్. %2$d చదవని అంశాలు. %1$s ట్యాబ్. %2$d చదవని అంశం. - "బిల్డ్ సంస్కరణ" - "ఓపెన్ సోర్స్ లైసెన్స్‌లు" - "ఓపెన్ సోర్స్ సాఫ్ట్‌వేర్ కోసం లైసెన్స్ వివరాలు" - "గోప్యతా విధానం" - "సేవా నిబంధనలు" - "ఓపెన్ సోర్స్ లైసెన్స్‌లు" - "urlని తెరవడంలో విఫలమైంది." "వీడియో కాల్" "భాగస్వామ్యం చేసి, కాల్ చేయి" diff --git a/java/com/android/contacts/common/res/values-th/strings.xml b/java/com/android/contacts/common/res/values-th/strings.xml index b979e7424..a5f8e9ef4 100644 --- a/java/com/android/contacts/common/res/values-th/strings.xml +++ b/java/com/android/contacts/common/res/values-th/strings.xml @@ -18,7 +18,6 @@ "คัดลอกข้อความแล้ว" - "คัดลอกไปยังคลิปบอร์ด" "โทรหา %s" "โทรเข้าบ้าน" "โทรเข้ามือถือ" @@ -40,7 +39,6 @@ "โทรเข้าเพจเจอร์ที่ทำงาน" "โทรหา %s" "โทรหา MMS" - "%s (โทร)" "ส่งข้อความถึง %s" "ส่งข้อความเข้าโทรศัพท์บ้าน" "ส่งข้อความเข้ามือถือ" @@ -62,7 +60,6 @@ "ส่งข้อความเข้าเพจเจอร์ที่ทำงาน" "ส่งข้อความถึง %s" "ส่งข้อความถึง MMS" - "%s (ข้อความ)" "ล้างรายชื่อที่ติดต่อบ่อยไหม" "คุณจะล้างรายชื่อของผู้ที่ติดต่อด้วยบ่อยๆ ในแอปพลิเคชัน Contacts และ Phone และบังคับให้แอปพลิเคชันอีเมลเรียนรู้ค่ากำหนดที่อยู่ของคุณใหม่ตั้งแต่ต้น" "กำลังล้างรายชื่อที่ติดต่อบ่อย…" @@ -70,22 +67,14 @@ "ไม่อยู่" "ไม่ว่าง" "รายชื่อติดต่อ" + "รายการแนะนำยอดนิยม" "อื่นๆ" "ไดเรกทอรี" "ไดเรกทอรีที่ทำงาน" "รายชื่อติดต่อทั้งหมด" + "รายการแนะนำ" "ฉัน" - "กำลังค้นหา…" - "พบมากกว่า %d รายการ" - "ไม่มีรายชื่อติดต่อ" - - พบ %d รายการ - พบ 1 รายการ - - "สมุดโทรศัพท์ด่วนสำหรับ %1$s" "(ไม่มีชื่อ)" - "โทรติดต่อบ่อย" - "ติดต่อบ่อยครั้ง" "ดูผู้ติดต่อ" "รายชื่อติดต่อทั้งหมดที่มีหมายเลขโทรศัพท์" "รายชื่อติดต่อในโปรไฟล์งาน" @@ -125,8 +114,6 @@ "ส่งอีเมลถึง %s" "อีเมล" "ถนน" - "ตู้ ปณ." - "ย่านใกล้เคียง" "เมือง" "รัฐ" "รหัสไปรษณีย์" @@ -144,103 +131,19 @@ "แชทโดยใช้ ICQ" "แชทโดยใช้ Jabber" "แชท" - "ลบ" - "ขยายหรือยุบฟิลด์ชื่อ" - "ขยายหรือยุบช่องคำอ่านชื่อ" "รายชื่อติดต่อทั้งหมด" - "เสร็จสิ้น" - "ยกเลิก" "รายชื่อติดต่อใน %s" "รายชื่อติดต่อในมุมมองที่กำหนดเอง" "รายชื่อติดต่อเดียว" - "บันทึกรายชื่อติดต่อที่นำเข้าลงใน:" - "นำเข้าจากซิมการ์ด" - "นำเข้าจากซิม ^1 - ^2" - "นำเข้าจากซิม %1$s" - "นำเข้าจากไฟล์ .vcf" - "ยกเลิกการนำเข้า %s หรือไม่" - "ยกเลิกการส่งออก %s หรือไม่" - "ไม่สามารถยกเลิกการนำเข้า/ส่งออก vCard" - "ข้อผิดพลาดที่ไม่ทราบสาเหตุ" - "ไม่สามารถเปิด \"%s\": %s" - "เริ่มใช้งานโปรแกรมส่งออกไม่ได้: \"%s\"" - "ไม่มีรายชื่อติดต่อที่สามารถส่งออกได้" - "คุณได้ปิดใช้สิทธิ์ที่จำเป็น" - "เกิดข้อผิดพลาดระหว่างส่งออก: \"%s\"" - "ชื่อไฟล์ที่ต้องระบุยาวเกินไป (\"%s\")" - "ข้อผิดพลาด I/O" - "หน่วยความจำไม่เพียงพอ ไฟล์อาจใหญ่เกินไป" - "ไม่สามารถแยกวิเคราะห์ vCard ด้วยเหตุผลที่ไม่คาดคิด" - "ไม่สนับสนุนรูปแบบนี้" - "ไม่สามารถรวบรวมข้อมูลเมตาของ vCard ที่ระบุ" - "ไม่สามารถนำเข้าไฟล์ตั้งแต่หนึ่งไฟล์ขึ้นไป (%s)" - "ส่งออก %s เสร็จแล้ว" - "ส่งออกรายชื่อติดต่อเรียบร้อยแล้ว" - "ส่งออกรายชื่อติดต่อเสร็จแล้ว คลิกการแจ้งเตือนเพื่อแชร์รายชื่อติดต่อ" - "แตะเพื่อแชร์รายชื่อติดต่อ" - "ยกเลิกการส่งออก %s แล้ว" - "กำลังส่งออกข้อมูลสมุดโทรศัพท์" - "กำลังส่งออกข้อมูลผู้ติดต่อ" - "ไม่สามารถดึงข้อมูลจากฐานข้อมูล" - "ไม่มีรายชื่อติดต่อที่สามารถส่งออกได้ หากคุณมีรายชื่อติดต่ออยู่ในอุปกรณ์จริงๆ อาจเป็นเพราะผู้ให้บริการข้อมูลบางรายไม่อนุญาตให้ส่งออกรายชื่อติดต่อจากอุปกรณ์" - "โปรแกรมเขียนข้อความ vCard เริ่มการทำงานไม่ถูกต้อง" - "ไม่สามารถส่งออก" - "ไม่ได้ส่งออกข้อมูลรายชื่อติดต่อ\nสาเหตุ: \"%s\"" - "กำลังนำเข้า %s" - "ไม่สามารถอ่านข้อมูล vCard" - "ยกเลิกการอ่านข้อมูล vCard แล้ว" - "นำเข้า vCard %s เรียบร้อยแล้ว" - "ยกเลิกการนำเข้า %s แล้ว" - "การนำเข้า %s จะเกิดขึ้นในไม่ช้า" - "ไฟล์จะถูกนำเข้าในไม่ช้า" - "คำขอนำเข้า vCard ถูกปฏิเสธ ลองใหม่ภายหลัง" - "การส่งออก %s จะเกิดขึ้นในไม่ช้า" - "ระบบจะส่งออกไฟล์ในอีกสักครู่" - "ระบบจะส่งออกรายชื่อติดต่อในไม่ช้า" - "คำขอส่งออก vCard ถูกปฏิเสธ ลองใหม่ภายหลัง" - "รายชื่อติดต่อ" - "กำลังแคช vCard ไปยังที่จัดเก็บข้อมูลชั่วคราวในตัวเครื่อง การนำเข้าจริงจะเริ่มต้นในอีกสักครู่" - "ไม่สามารถนำเข้า vCard" - "รับรายชื่อผ่าน NFC แล้ว" - "ส่งออกรายชื่อติดต่อ" - "กำลังแคช" - "กำลังนำเข้า %s/%s: %s" - "ส่งออกเป็นไฟล์ .vcf" "จัดเรียงตาม" "ชื่อ" "นามสกุล" "รูปแบบชื่อ" "ชื่อขึ้นก่อน" "นามสกุลขึ้นก่อน" - "บัญชีเริ่มต้นสำหรับรายชื่อติดต่อใหม่" - "ซิงค์ข้อมูลเมตาของรายชื่อติดต่อ" - "เกี่ยวกับ \"รายชื่อติดต่อ\"" - "การตั้งค่า" - "แชร์รายชื่อติดต่อที่มองเห็น" - "ไม่สามารถแชร์รายชื่อติดต่อที่มองเห็นได้" - "แชร์รายชื่อติดต่อโปรด" - "แชร์รายชื่อติดต่อทั้งหมด" - "ไม่สามารถแชร์รายชื่อติดต่อ" - "นำเข้า/ส่งออกรายชื่อติดต่อ" - "นำเข้าสมุดโทรศัพท์" - "ไม่สามารถแชร์รายชื่อติดต่อนี้ได้" - "ไม่มีรายชื่อติดต่อที่จะแชร์" - "ค้นหา" - "ค้นหารายชื่อติดต่อ" - "รายการโปรด" - "ไม่มีรายชื่อติดต่อ" - "ไม่มีรายชื่อติดต่อที่แสดงไว้" - "ไม่มีรายการโปรด" - "ไม่มีรายชื่อติดต่อใน %s" "ล้างรายชื่อที่ติดต่อบ่อย" - "เลือกซิมการ์ด" - "จัดการบัญชี" - "นำเข้า/ส่งออก" - "ผ่านทาง %1$s" - "%1$s ผ่านทาง %2$s" "หยุดการค้นหา" "ล้างการค้นหา" - "ตัวเลือกการแสดงรายชื่อผู้ติดต่อ" "บัญชี" "ใช้ในการโทรทุกครั้ง" "โทรด้วย" @@ -248,19 +151,12 @@ "พิมพ์โน้ตเพื่อส่งพร้อมการโทร ..." "ส่งและโทร" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "แท็บ %1$s" แท็บ %1$s ยังไม่อ่าน %2$d รายการ แท็บ %1$s ยังไม่อ่าน %2$d รายการ - "เวอร์ชันบิวด์" - "ใบอนุญาตโอเพนซอร์ส" - "รายละเอียดสัญญาอนุญาตสำหรับซอฟต์แวร์โอเพนซอร์ส" - "นโยบายความเป็นส่วนตัว" - "ข้อกำหนดในการให้บริการ" - "ใบอนุญาตโอเพนซอร์ส" - "เปิด URL ไม่สำเร็จ" "แฮงเอาท์วิดีโอ" "แชร์และโทร" diff --git a/java/com/android/contacts/common/res/values-tl/strings.xml b/java/com/android/contacts/common/res/values-tl/strings.xml index 62caef820..07696b71a 100644 --- a/java/com/android/contacts/common/res/values-tl/strings.xml +++ b/java/com/android/contacts/common/res/values-tl/strings.xml @@ -18,7 +18,6 @@ "Kinopya ang teksto" - "Kopyahin sa clipboard" "Tawagan sa %s" "Tawagan sa bahay" "Tawagan sa mobile" @@ -40,7 +39,6 @@ "Tawagan sa pager sa trabaho" "Tawagan sa %s" "Tawagan sa MMS" - "%s (Tawagan)" "I-text sa %s" "I-text sa bahay" "I-text sa mobile" @@ -62,7 +60,6 @@ "I-text sa pager sa trabaho" "I-text sa %s" "I-text sa MMS" - "%s (Imensahe)" "I-clear ang madalas na kinontak" "Iki-clear mo ang listahan ng mga madalas na nakakaugnay sa mga app ng Mga Contact at Telepono at pupuwersahin mo ang mga app ng email na matutunan ang iyong mga kagustuhan sa pag-a-address mula sa simula." "Kini-clear madalas na inuugnayan…" @@ -70,22 +67,14 @@ "Wala" "Abala" "Mga Contact" + "Mga Madalas Imungkahi" "Iba pa" "Direktoryo" "Directory sa trabaho" "Lahat ng mga contact" + "Mga Mungkahi" "Ako" - "Naghahanap…" - "Higit sa %d ang nakita." - "Walang mga contact" - - %d ang nahanap - %d ang nahanap - - "Mabilisang contact para kay %1$s" "(Walang pangalan)" - "Madalas na tinatawagan" - "Madalas na kino-contact" "Tingnan ang contact" "Lahat ng contact na may mga numero ng telepono" "Mga contact ng profile sa trabaho" @@ -125,8 +114,6 @@ "Mag-email sa %s" "Mag-email" "Kalye" - "PO box" - "Kapitbahayan" "Lungsod" "Estado" "ZIP code" @@ -144,103 +131,19 @@ "Makipag-chat gamit ang ICQ" "Makipag-chat gamit ang Jabber" "Chat" - "tanggalin" - "Palawakin o tiklupin ang mga field ng pangalan" - "Palakihin o i-collapse ang mga field ng phonetic na pangalan" "Lahat ng contact" - "Tapos na" - "Kanselahin" "Mga contact sa %s" "Mga contact sa custom na view" "Iisang contact" - "I-save ang mga ii-import na contact sa:" - "I-import mula sa SIM card" - "I-import mula sa SIM ^1 - ^2" - "I-import mula sa SIM %1$s" - "Mag-import mula sa .vcf file" - "Kanselahin ang pag-import ng %s?" - "Kanselahin ang pag-export ng %s?" - "Di makansela pag-import/pag-export vCard" - "Hindi alam na error." - "Hindi mabuksan ang \"%s\": %s." - "Hindi masimulan ang exporter: \"%s\"." - "Walang na-e-export na contact." - "Na-disable mo ang isang kinakailangang pahintulot." - "May naganap na error habang nag-e-export: \"%s\"." - "Masyadong mahaba ang kinakailangang filename (\"%s\")." - "I/O na error" - "Walang sapat na memory. Maaaring masyadong malaki ang file." - "Hindi ma-parse ang vCard dahil sa isang hindi inaasahang dahilan." - "Hindi sinusuportahan ang format." - "Hindi makakolekta ng impormasyon ng meta ng ibinigay na (mga) vCard file." - "Hindi ma-import ang isa o higit pang mga file (%s)." - "Tapos na ang pag-export ng %s." - "Tapos nang i-export ang mga contact." - "Tapos nang ma-export ang mga contact, i-click ang notification upang ibahagi ang mga contact." - "I-tap upang ibahagi ang mga contact." - "Kinansela ang pag-export ng %s." - "Ine-export ang data ng contact" - "Ine-export ang data ng contact." - "Hindi makuha ang impormasyon ng database." - "Walang mga na-e-export na contact. Kung mayroon kang mga contact sa iyong device, maaaring hindi payagan ng ilang provider ng data na i-export mula sa device ang mga contact." - "Hindi nagsimula nang maayos ang composer ng vCard." - "Hindi ma-export" - "Hindi na-export ang data ng contact.\nDahilan: \"%s\"" - "Ini-import ang %s" - "Hindi mabasa ang data ng vCard" - "Kinansela ang pagbabasa ng data ng vCard" - "Tapos na ang pag-import ng vCard na %s" - "Kinansela ang pag-import ng %s" - "Ii-import ang %s sa ilang sandali." - "Ii-import ang file sa ilang sandali." - "Tinanggihan ang kahilingan sa pag-import ng vCard. Subukang muli sa ibang pagkakataon." - "I-e-export ang %s sa ilang sandali." - "Ie-export ang file sa ilang sandali." - "Ie-export ang mga contact sa ilang sandali." - "Tinanggihan ang kahilingan sa pag-export ng vCard. Subukang muli sa ibang pagkakataon." - "contact" - "Kina-cache ang (mga) vCard sa lokal na pansamantalang storage. Magsisimula sa lalong madaling panahon ang aktwal na pag-import." - "Hindi ma-import ang vCard." - "Natanggap contact sa NFC" - "I-export ang mga contact?" - "Nagka-cache" - "Ini-import ang %s/%s: %s" - "I-export sa .vcf file" "Uriin ayon sa" "Pangalan" "Apelyido" "Format ng pangalan" "Pangalan muna" "Apelyido muna" - "Default na account para sa mga bagong contact" - "I-sync ang metadata ng contact" - "Tungkol sa Mga Contact" - "Mga Setting" - "Magbahagi ng mga nakikitang contact" - "Hindi naibahagi ang mga nakikitang contact." - "Ibahagi ang mga paboritong contact" - "Ibahagi ang lahat ng contact" - "Hindi naibahagi ang mga contact." - "Mag-import/mag-export ng mga contact" - "Mag-import ng mga contact" - "Hindi maibabahagi ang contact na ito." - "Walang ibabahaging mga contact." - "Maghanap" - "Maghanap ng mga contact" - "Mga Paborito" - "Walang mga contact." - "Walang mga nakikitang contact." - "Walang mga paborito" - "Walang mga contact sa %s" "I-clear ang mga frequent" - "Pumili ng SIM card" - "Pamahalaan ang mga account" - "Mag-import/mag-export" - "sa pamamagitan ng %1$s" - "%1$s sa pamamagitan ng %2$s" "ihinto ang paghahanap" "I-clear ang paghahanap" - "Mga opsyon ng display ng contact" "Account" "Gamitin ito palagi sa mga tawag" "Tumawag gamit ang" @@ -248,19 +151,12 @@ "Mag-type ng isang tala na ipadadala kasama ng tawag ..." "IPADALA AT TAWAGAN" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Tab ng %1$s." Tab ng %1$s. %2$d hindi pa nababasang item. Tab ng %1$s. %2$d na hindi pa nababasang item. - "Bersyon ng build" - "Mga open source na lisensya" - "Mga detalye ng lisensya para sa open source na software" - "Patakaran sa privacy" - "Tuntunin ng serbisyo" - "Mga open source na lisensya" - "Nabigong buksan ang url." "Mag-video call" "Ibahagi at tumawag" diff --git a/java/com/android/contacts/common/res/values-tr/strings.xml b/java/com/android/contacts/common/res/values-tr/strings.xml index ce3c109d2..6a111597d 100644 --- a/java/com/android/contacts/common/res/values-tr/strings.xml +++ b/java/com/android/contacts/common/res/values-tr/strings.xml @@ -18,7 +18,6 @@ "Metin kopyalandı" - "Panoya kopyala" "Ara (%s)" "Ara (ev)" "Ara (mobil)" @@ -40,7 +39,6 @@ "Ara (iş çağrı cihazı)" "Ara (%s)" "Ara (MMS)" - "%s (Telefon et)" "SMS gönder (%s)" "SMS gönder (ev)" "SMS gönder (mobil)" @@ -62,7 +60,6 @@ "SMS gönder (iş çağrı cihazı)" "SMS gönder (%s)" "SMS gönder (MMS)" - "%s (Mesaj gönder)" "Sık iletişim kurulanlar silinsin mi?" "Kişiler ve Telefon uygulamalarındaki sık iletişim kurulanlar listesini temizleyecek ve e-posta uygulamalarını adres tercihlerinizi en baştan öğrenmeye zorlayacaksınız." "Sık iletişim kurulanlar siliniyor…" @@ -70,22 +67,14 @@ "Dışarıda" "Meşgul" "Kişiler" + "En Çok Önerilenler" "Diğer" "Dizin" "İş dizini" "Tüm kişiler" + "Öneriler" "Ben" - "Aranıyor..." - "%d kişiden fazla bulundu." - "Hiç kişi yok" - - %d kişi bulundu - 1 kişi bulundu - - "%1$s için hızlı kişi" "(Adsız)" - "Sık arananlar" - "Sık iletişim kurulanlar" "Kişiyi görüntüle" "Telefon numarası olan tüm kişiler" "İş profili kişileri" @@ -125,8 +114,6 @@ "E-posta gönder (%s)" "E-posta gönder" "Cadde" - "Posta kutusu" - "Mahalle" "Şehir" "Eyalet" "Posta kodu" @@ -144,103 +131,19 @@ "ICQ kullanarak sohbet et" "Jabber kullanarak sohbet et" "Sohbet" - "sil" - "Ad alanlarını genişlet veya daralt" - "Fonetik ad alanlarını genişlet veya daralt" "Tüm kişiler" - "Bitti" - "İptal" "%s hesabındaki kişiler" "Özel görünümdeki kişiler" "Tek kişi" - "İçe aktarılan kişilerin kaydedileceği yer:" - "SIM karttan içe aktar" - "SIM\'den (^1 - ^2) içe aktar" - "SIM\'den (%1$s) içe aktar" - ".vcf dosyasından aktar" - "%s dosyasının içe aktarılması iptal edilsin mi?" - "%s dosyasının dışa aktarılması iptal edilsin mi?" - "İçe/dışa aktarma işlemi iptal edilemedi" - "Bilinmeyen hata." - "\"%s\" açılamadı: %s" - "Dışa aktarıcı başlatılamadı: \"%s\"" - "Dışa aktarabilecek kişi yok." - "Gerekli bir izni devre dışı bıraktınız." - "Dışa aktarma sırasında bir hata oluştu: \"%s\"" - "Gereken dosya adı çok uzun (\"%s\")." - "G/Ç Hatası" - "Bellek yetersiz. Dosya çok büyük olabilir." - "Beklenmeyen bir nedenden dolayı vCard ayrıştırılamadı." - "Biçim desteklenmiyor." - "Belirtilen vCard dosyalarının meta bilgileri toplanamadı." - "Bir veya daha fazla dosya içe aktarılamadı (%s)." - "%s dosyasını dışa aktarma tamamlandı." - "Kişileri dışa aktarma işlemi tamamlandı." - "Kişileri dışa aktarma işlemi tamamlandı. Dışa aktarılan kişileri paylaşmak için bildirimi tıklayın." - "Kişileri paylaşmak için dokunun." - "%s dosyasını dışa aktarma iptal edildi." - "Kişi verileri dışa aktarılıyor" - "Kişi verileri dışa aktarılıyor." - "Veritabanı bilgileri alınamadı." - "Dışa aktarılabilecek kişi yok. Cihazınızda kişileriniz varsa, bazı veri sağlayıcılar kişilerin telefondan dışa aktarılmasına izin vermeyebilir." - "vCard oluşturucu düzgün başlamadı." - "Dışa aktarılamadı" - "Kişi verileri dışa aktarılamadı.\nNedeni: \"%s\"" - "%s içe aktarılıyor" - "vCard verileri okunamadı" - "vCard verilerini okuma işlemi iptal edildi" - "vCard %s dosyasının içe aktarılması tamamlandı" - "%s dosyasını içe aktarma iptal edildi" - "%s kısa bir süre içinde içe aktarılacak." - "Dosya kısa bir süre sonra içe aktarılacak." - "vCard\'ı içe aktarma isteği reddedildi. Daha sonra tekrar deneyin." - "%s kısa bir süre içinde dışa aktarılacak." - "Dosya kısa bir süre sonra dışa aktarılacak." - "Kişiler kısa bir süre içinde dışa aktarılacak." - "vCard\'ı dışa aktarma isteği reddedildi. Daha sonra tekrar deneyin." - "kişi" - "vCard\'lar geçici bir yerel depolama alanında önbelleğe alınıyor. Asıl içe aktarma işlemi kısa süre içinde başlayacak." - "vCard içe aktarılamadı." - "Kişi NFC ile alındı" - "Kişiler dışa aktarılsın mı?" - "Önbelleğe alınıyor" - "İçe aktarılıyor %s/%s: %s" - ".vcf dosyasına aktar" "Sıralama ölçütü" "Ad" "Soyadı" "Ad biçimi" "Önce ad" "Önce soyadı" - "Yeni kişiler için varsayılan hesap" - "Kişi meta verilerini senkronize et" - "Kişiler Hakkında" - "Ayarlar" - "Görülebilir kişileri paylaş" - "Görünür kişiler paylaşılamadı." - "Favori kişileri paylaş" - "Tüm kişileri paylaş" - "Kişiler paylaşılamadı." - "Kişileri içe/dışa aktar" - "Kişileri içe aktar" - "Bu kişi paylaşılamıyor." - "Paylaşılacak kişi yok." - "Ara" - "Kişileri bul" - "Sık Kullanılanlar" - "Kişi listesi boş." - "Görülebilir kişi yok." - "Favori yok" - "%s içinde kişi yok" "Sık iletişim kurulanları sil" - "SIM kart seçin" - "Hesapları yönet" - "İçe/Dışa aktar" - "%1$s üzerinden" - "%2$s üzerinden şu zamanda: %1$s" "aramayı durdur" "Aramayı temizle" - "Kişi görüntüleme seçenekleri" "Hesap" "Çağrılar için her zaman bunu kullan" "Çağrıyı şununla yap:" @@ -248,19 +151,12 @@ "Çağrıyla göndermek için bir not yazın..." "GÖNDER VE ARA" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s sekmesi." %1$s sekmesi. %2$d okunmamış öğe. %1$s sekmesi. %2$d okunmamış öğe. - "Derleme sürümü" - "Açık kaynak lisansları" - "Açık kaynak yazılımlar için lisans ayrıntıları" - "Gizlilik politikası" - "Hizmet şartları" - "Açık kaynak lisansları" - "URL açılamadı." "Görüntülü görüşme" "Paylaşır ve telefon eder" diff --git a/java/com/android/contacts/common/res/values-uk/strings.xml b/java/com/android/contacts/common/res/values-uk/strings.xml index f6d1e4731..81dda3977 100644 --- a/java/com/android/contacts/common/res/values-uk/strings.xml +++ b/java/com/android/contacts/common/res/values-uk/strings.xml @@ -18,7 +18,6 @@ "Текст скопійовано" - "Копіювати в буфер обміну" "Набрати %s" "Набрати домашній номер телефону" "Набрати номер мобільного телефону" @@ -40,7 +39,6 @@ "Набрати робочий номер пейджера" "Набрати %s" "Набрати номер MMS" - "%s (зателефонувати)" "SMS на %s" "SMS на домашній номер телефону" "SMS на номер мобільного телефону" @@ -62,7 +60,6 @@ "SMS на робочий номер пейджера" "SMS на %s" "SMS на номер MMS" - "%s (надіслати повідомлення)" "Очистити список частих контактів?" "Буде видалено список користувачів, з якими ви часто спілкуєтеся, з додатків Контакти та Телефон і скинуто налаштування адрес у додатках для електронної пошти." "Очищення списку частих контактів…" @@ -70,24 +67,14 @@ "Не на місці" "Не турбувати" "Контакти" + "Найкращі пропозиції" "Інші" "Каталог" "Робочі контакти" "Усі контакти" + "Пропозиції" "Я" - "Пошук…" - "Знайдено понад %d." - "Контактів немає" - - Знайдено %d - Знайдено %d - Знайдено %d - Знайдено %d - - "Швидкий зв’язок, контакт %1$s" "(Без імені)" - "Часті виклики" - "Часті контакти" "Переглянути контакт" "Усі контакти з номерами телефону" "Контакти в робочому профілі" @@ -127,8 +114,6 @@ "Написати на %s" "Написати" "Вулиця" - "Поштова скринька" - "У районі" "Місто" "Штат/регіон" "Поштовий індекс" @@ -146,103 +131,19 @@ "Чат через ICQ" "Чат через Jabber" "Чат" - "видалити" - "Розгорнути або згорнути поля імен" - "Розгорнути або згорнути поля вимови імен" "Усі контакти" - "Готово" - "Скасувати" "Контакти в обліковому записі %s" "Користувацький фільтр" "Один контакт" - "Зберегти імпортовані контакти в обліковий запис:" - "Імпорт із SIM-карти" - "Імпортувати із SIM-карти \"^1\" – ^2" - "Імпортувати із SIM-карти \"%1$s\"" - "Імпортувати з файлу .vcf" - "Скасувати імпорт файлу %s?" - "Скасувати експорт файлу %s?" - "Не вдалося скасув. імпорт/експорт vCard" - "Невідома помилка." - "Не вдалося відкрити файл \"%s\": %s." - "Не вдалося запустити експортер: \"%s\"." - "Немає контактів, які можна експортувати." - "Ви вимкнули обов’язковий дозвіл." - "Під час експорту сталася помилка: \"%s\"." - "Потрібна назва файлу задовга (\"%s\")" - "Помилка вводу/виводу" - "Недостатньо пам’яті. Можливо, файл завеликий." - "Не вдалося проаналізувати vCard через неочікувану причину." - "Формат не підтримується." - "Не вдалося зібрати мета-інформацію файлів цієї vCard." - "Не вдалось імпортувати один або декілька файлів (%s)." - "Експорт файлу %s завершено." - "Контакти експортовано." - "Контакти експортовано. Натисніть сповіщення, щоб надати доступ до контактів." - "Торкніться, щоб надати доступ до контактів." - "Експорт файлу %s скасовано." - "Експортувати контактні дані" - "Контакти експортуються." - "Не вдалось отримати інформацію бази даних." - "Немає контактів, які можна експортувати. Якщо на вашому пристрої є контакти, можливо, постачальник даних заборонив їх експорт." - "Майстер vCard не запущено належним чином." - "Помилка експорту" - "Контактні дані не експортовано.\nПричина: \"%s\"" - "Імпорт контакта %s" - "Не вдалося прочитати дані vCard" - "Читання даних vCard скасовано" - "Імпорт файлу %s vCard завершено" - "Імпорт файлу %s скасовано" - "Файл %s незабаром буде імпортовано." - "Файл незабаром буде імпортовано." - "Запит на імпорт файлу vCard відхилено. Повторіть спробу пізніше." - "Файл %s незабаром буде експортовано." - "Невдовзі файл буде експортовано." - "Контакти невдовзі буде експортовано." - "Запит на експорт файлу vCard відхилено. Повторіть спробу пізніше." - "контакт" - "Кешування файлів vCard у локальну тимчасову пам’ять. Імпорт почнеться незабаром." - "Не вдалось імпортувати файл vCard." - "Контакт через NFC" - "Експортувати контакти?" - "Кешування" - "Імпорт %s з %s: %s" - "Експортувати у файл .vcf" "Параметри сортування" "Ім’я" "Прізвище" "Формат імені" "Ім’я спочатку" "Прізвище спочатку" - "Обліковий запис за умовчанням для нових контактів" - "Синхронізувати метадані контактів" - "Про додаток Контакти" - "Налаштування" - "Надіслати видимі контакти" - "Не вдалося поділитись видимими контактами." - "Поділитися вибраними контактами" - "Поділитися всіма контактами" - "Не вдалося поділитися контактами." - "Імпорт/експорт контактів" - "Імпортувати контакти" - "Цей контакт неможливо надіслати." - "Немає контактів, якими можна поділитися." - "Пошук" - "Пошук контактів" - "Вибране" - "Контактів немає." - "Видимих контактів немає." - "Немає вибраних контактів" - "%s – контактів немає" "Очистити часті контакти" - "Вибрати SIM-карту" - "Керувати обліковими записами" - "Імпорт або експорт" - "через %1$s" - "%1$s через %2$s" "припинити пошук" "Очистити поле пошуку" - "Параметри відображення контактів" "Обліковий запис" "Завжди використовувати для дзвінків" "Телефонувати за допомогою" @@ -250,7 +151,7 @@ "Введіть нотатку, яку хочете надіслати під час дзвінка…" "ЗАТЕЛЕФОНУВАТИ Й НАДІСЛАТИ" "%1$s з %2$s" - "%1$s%2$s" + "%1$s %2$s" "Вкладка \"%1$s\"." Вкладка \"%1$s\". %2$d непрочитаний елемент. @@ -258,13 +159,6 @@ Вкладка \"%1$s\". %2$d непрочитаних елементів. Вкладка \"%1$s\". %2$d непрочитаного елемента. - "Версія складання" - "Ліцензії відкритого коду" - "Деталі ліцензії для програмного забезпечення з відкритим кодом" - "Політика конфіденційності" - "Умови використання" - "Ліцензії на ПЗ з відкритим кодом" - "Не вдалося відкрити посилання." "Відеодзвінок" "Надіслати й зателефонувати" diff --git a/java/com/android/contacts/common/res/values-ur/strings.xml b/java/com/android/contacts/common/res/values-ur/strings.xml index b34c78d95..eb9c8886e 100644 --- a/java/com/android/contacts/common/res/values-ur/strings.xml +++ b/java/com/android/contacts/common/res/values-ur/strings.xml @@ -18,7 +18,6 @@ "متن کاپی ہوگیا" - "کلپ بورڈ میں کاپی کریں" "%s کو کال کریں" "گھر پر کال کریں" "موبائل پر کال کریں" @@ -40,7 +39,6 @@ "دفتر کے پیجر پر کال کریں" "%s کو کال کریں" "‏MMS نمبر پر کال کریں" - "%s (کال کریں)" "%s پر متن بھیجیں" "گھر کے نمبر پر متن بھیجیں" "موبائل پر متن بھیجیں" @@ -62,7 +60,6 @@ "دفتر کے پیجر پر متن بھیجیں" "%s پر متن بھیجیں" "‏MMS نمبر پر متن بھیجیں" - "%s (پیغام بھیجیں)" "اکثر رابطہ کردہ کو صاف کریں؟" "آپ رابطے اور فون ایپس میں اکثر رابطہ کردہ فہرست کو صاف کر دیں گے اور ای میل ایپس کو از سر نو اپنے پتے کی ترجیحات جاننے پر مجبور کریں گے۔" "اکثر رابطہ کردہ کو صاف کر رہا ہے…" @@ -70,22 +67,14 @@ "دور" "مصروف" "رابطے" + "سرفہرست تجویز کردہ" "دیگر" "ڈائریکٹری" "دفتری ڈائرکٹری" "سبھی رابطے" + "تجاویز" "میں" - "تلاش کر رہا ہے…" - "%d سے زیادہ ملے۔" - "کوئی رابطے نہیں ہیں" - - %d ملے - 1 ملا - - "%1$s کیلئے فوری رابطہ" "(کوئی نام نہیں)" - "اکثر کال کردہ" - "اکثر رابطہ کردہ" "رابطہ دیکھیں" "فون نمبرز کے ساتھ سبھی رابطے" "دفتری پروفائل رابطے" @@ -125,8 +114,6 @@ "ای میل کریں %s" "ای میل کریں" "اسٹریٹ" - "‏PO باکس" - "مضافات" "شہر" "ریاست" "زپ کوڈ" @@ -144,103 +131,19 @@ "‏ICQ کے ذریعے چیٹ کریں" "‏Jabber کے ذریعے چیٹ کریں" "چیٹ کریں" - "حذف کریں" - "نام کی فیلڈز کو پھیلائیں یا چھوٹا کریں" - "فونیٹک نام کی فیلڈز کو پھیلائیں یا سکیڑیں" "سبھی رابطے" - "ہوگیا" - "منسوخ کریں" "%s میں رابطے" "حسب ضرورت منظر میں رابطے" "واحد رابطہ" - "درآمد کردہ رابطے اس میں محفوظ کریں:" - "‏SIM کارڈ سے درآمد کریں" - "‏SIM ^1 - ^2‎ سے درآمد کریں" - "‏SIM %1$s‎ سے درآمد کریں" - "‏‎.vcf فائل سے درآمد کریں" - "%s کی درآمد منسوخ کریں؟" - "%s کی برآمد منسوخ کریں؟" - "وی کارڈ کی درآمد/برآمد کو منسوخ نہیں کرسکا" - "نامعلوم خرابی۔" - "\"%s\" نہیں کھولی جا سکی: \"%s\"۔" - "برآمد کنندہ شروع نہیں ہو سکا: \"%s\"۔" - "کوئی قابل برآمد رابطہ نہیں ہے۔" - "آپ نے ایک درکار اجازت غیر فعال کر دی ہے۔" - "برآمد کرنے کے دوران ایک غلطی ہوگئی: \"%s\"۔" - "مطلوبہ فائل کا نام کافی لمبا (\"%s\") ہے۔" - "‏I/O غلطی" - "کافی میموری نہیں ہے۔ فائل کافی بڑی ہو سکتی ہے۔" - "ایک غیر متوقع وجہ سے وی کارڈ کو پارس نہیں کرسکا۔" - "فارمیٹ تعاون یافتہ نہیں ہے۔" - "مقررہ وی کارڈ فائل (فائلوں) کی میٹا معلومات اکٹھا نہیں کرسکا۔" - "‏ایک یا مزید فائلیں درآمد نہیں ہوسکیں (%s)۔" - "%s کی برآمد پوری ہوگئی۔" - "رابطوں کی برآمدگی مکمل ہو گئی۔" - "رابطوں کی برآمدگی مکمل ہو گئی، رابطوں کا اشتراک کرنے کیلئے اطلاع پر کلک کریں۔" - "رابطوں کا اشتراک کرنے کے لئے تھپتھپائیں۔" - "%s کی برآمد منسوخ ہوگئی۔" - "رابطہ کا ڈیٹا برآمد کر رہا ہے" - "رابطہ ڈیٹا برآمد ہو رہا ہے۔" - "ڈیٹابیس کی معلومات حاصل نہیں ہو سکی۔" - "برآمد کرنے لائق کوئی رابطے نہیں ہیں۔ اگر آپ کے آلہ پر واقعی رابطے ہیں تو ممکن ہے کچھ ڈیٹا فراہم کنندگان رابطوں کو آلہ سے برآمد کیے جانے کی اجازت نہ دیتے ہوں۔" - "وی کارڈ کمپوزر مناسب طریقے سے شروع نہیں ہوا۔" - "برآمد نہیں کیا جاسکا" - "رابطہ کا ڈیٹا برآمد نہیں ہوا۔\nوجہ: \"%s\"" - "%s کو درآمد کر رہا ہے" - "وی کارڈ کا ڈیٹا نہیں پڑھ سکا" - "وی کارڈ کا ڈیٹا پڑھنا منسوخ ہوگیا" - "وی کارڈ %s کی درآمد پوری ہوگئی" - "%s کی درآمد منسوخ ہوگئی" - "%s جلد ہی درآمد کی جائے گی۔" - "فائل جلد ہی درآمد کی جائے گی۔" - "وی کارڈ درآمد کرنے کی درخواست مسترد ہوگئی تھی۔ بعد میں دوبارہ کوشش کریں۔" - "%s جلد ہی برآمد کی جائے گی۔" - "فائل تھوڑی دیر میں برآمد کر دی جائے گی۔" - "رابطے جلد ہی برآمد ہو جائیں گے۔" - "وی کارڈ برآمد کرنے کی درخواست مسترد ہوگئی تھی۔ بعد میں دوبارہ کوشش کریں۔" - "رابطہ" - "وی کارڈ (کارڈز) کو مقامی عارضی اسٹوریج میں ذخیرہ کر رہا ہے۔ اصل درآمد جلد ہی شروع ہوگی۔" - "وی کارڈ درآمد نہیں کرسکا۔" - "‏NFC پر موصولہ رابطہ" - "رابطے برآمد کریں؟" - "ذخیرہ کر رہا ہے" - "%s/%s: %s درآمد کر رہا ہے" - "‏‎.vcf فائل میں برآمد کریں" "ترتیب دیں بلحاظ" "پہلا نام" "آخری نام" "نام کا فارمیٹ" "پہلا نام پہلے" "آخری نام پہلے" - "نئے رابطوں کیلئے ڈیفالٹ اکاؤنٹ" - "رابطہ میٹا ڈیٹا مطابقت پذیر بنائیں" - "رابطے کے بارے میں" - "ترتیبات" - "مرئی رابطوں کا اشتراک کریں" - "مرئی رابطوں کا اشتراک کرنے میں ناکام ہو گیا۔" - "پسندیدہ رابطوں کا اشتراک کریں" - "سارے رابطوں کا اشتراک کریں" - "رابطوں کا اشتراک کرنے میں ناکام۔" - "رابطے درآمد/برآمد کریں" - "رابطے درآمد کریں" - "اس رابطہ کا اشتراک نہیں کیا جا سکتا۔" - "اشتراک کرنے کے لئے کوئی رابطے نہیں ہیں۔" - "تلاش کریں" - "رابطے تلاش کریں" - "پسندیدہ" - "کوئی رابطے نہیں ہیں۔" - "کوئی مرئی رابطے نہیں ہیں۔" - "کوئی پسندیدہ نہیں" - "%s میں کوئی رابطے نہیں ہیں" "اکثر و بیشتر کو صاف کریں" - "‏SIM کارڈ منتخب کریں" - "اکاؤنٹس کا نظم کریں" - "درآمد/برآمد کریں" - "معرفت %1$s" - "%1$s معرفت %2$s" "تلاش کرنا بند کریں" "تلاش صاف کریں" - "رابطہ کے ڈسپلے کے اختیارات" "اکاؤنٹ" "کالز کیلئے ہمیشہ اس کا استعمال کریں" "کال کریں مع" @@ -248,19 +151,12 @@ "کال کے ساتھ بھیجنے کیلئے ایک نوٹ ٹائپ کریں…" "بھیجیں اور کال کریں" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ٹیب۔" %1$s ٹیب۔ %2$d بغیر پڑھی ہوئی آئٹمز۔ %1$s ٹیب۔ %2$d بغیر پڑھی ہوئی آئٹم۔ - "بلڈ ورژن" - "اوپن سورس لائسنسز" - "اوپن سورس سافٹ ویئر کیلئے لائسنس کی تفصیلات" - "رازداری کی پالیسی" - "سروس کی شرائط" - "اوپن سورس لائسنسز" - "‏URL کھولنے میں ناکامی۔" "ویڈیو کال" "اشتراک کریں اور کال کریں" diff --git a/java/com/android/contacts/common/res/values-uz/strings.xml b/java/com/android/contacts/common/res/values-uz/strings.xml index 44bfd9999..2da34cd29 100644 --- a/java/com/android/contacts/common/res/values-uz/strings.xml +++ b/java/com/android/contacts/common/res/values-uz/strings.xml @@ -18,7 +18,6 @@ "Matndan nuxsa olindi" - "Vaqtinchalik xotiraga nusxalash" "Qo‘ng‘iroq: %s" "Uy telefoniga qo‘ng‘iroq qilish" "Mobil" @@ -26,7 +25,7 @@ "Ish faks raqamiga qo‘ng‘iroq qilish" "Uy faks raqamiga qo‘ng‘iroq qilish" "Peyjerga qo‘ng‘iroq qilish" - "Qo‘ng‘iroq qilish" + "Chaqiruv" "Qayta qo‘ng‘iroq raqamiga qo‘ng‘iroq qilish" "Mashina telefon raqamiga qo‘ng‘iroq qilish" "Kompaniya asosiy raqamiga qo‘ng‘iroq qilish" @@ -40,7 +39,6 @@ "Ish peyjeriga qo‘ng‘iroq qilish" "Qo‘ng‘iroq: %s" "MMS raqamga qo‘ng‘iroq qilish" - "%s (Qo‘ng‘iroq qilish)" "%sga sms jo‘natish" "Uy telefoniga sms jo‘natish" "SMS: mobil" @@ -62,7 +60,6 @@ "Ish peyjeriga sms jo‘natish" "%s telefoniga qo‘ng‘iroq qilish" "MMS telefonga sms jo‘natish" - "%s (Xabar yozish)" "Bu ro‘yxat tozalansinmi?" "Kontaktlar va Telefon ilovalaridagi tez-tez aloqa qilingan kontaktlar ro‘yxati tozalanadi hamda e-pochta ilovalari manzillarni eslab qolishni qaytadan boshlaydi." "Ko‘p gaplashilganlar tozalanmoqda…" @@ -70,22 +67,14 @@ "Tashqarida" "Band" "Kontaktlar" + "Eng faol" "Boshqa" "Direktoriya" "Ishchi katalogi" "Barcha kontaktlar" + "Takliflar" "Men" - "Qidirilmoqda…" - "%ddan ko‘proq topildi." - "Hech qanday kontakt yo‘q" - - %d ta kontakt topildi - 1 ta kontakt topildi - - "%1$s uchun tez kontakt" "(Ismi yo‘q)" - "Ko‘p qo‘ng‘iroq qilingan kontaktlar" - "Ko‘p gaplashilgan kontaktlar" "Kontaktni ko‘rish" "Telefon raqamli kontaktlar" "Ishchi profili kontaktlari" @@ -125,8 +114,6 @@ "%sga xat jo‘natish" "Boshqa e-pochtalarga xat jo‘natish" "Ko‘cha" - "Pochta qutisi" - "Mahalla" "Shahar" "Shahar" "ZIP kodi" @@ -144,103 +131,19 @@ "ICQ’da suhbatlashish" "Jabber’da suhbatlashish" "Suhbatlashish" - "o‘chirib tashlash" - "Qo‘shimcha maydonlarni ko‘rsatish va berkitish" - "Fonetik ism maydonlarni ko‘rsatish va berkitish" "Barcha kontaktlar" - "Tayyor" - "Bekor qilish" "%sdagi kontaktlar" "Filtrlangan kontaktlar" "Bitta kontakt" - "Import qilingan kontaktlarni saqlash joyi:" - "SIM-kartadan import qilish" - "Quyidagi SIM-kartadan import qilish: ^1^2" - "Quyidagi SIM-kartadan import qilish: %1$s" - "VCF fayldan import qilish" - "%sni import qilish bekor qilinsinmi?" - "%sni eksport qilish bekor qilinsinmi?" - "Tashrifnomani import/eksport qilishni bekor qilib bo‘lmadi" - "Noma’lum xato." - "%s faylini ochib bo‘lmadi. %s." - "Eksport qiluvchini ishga tushirib bo‘lmaydi: \"%s\"." - "Eksport qilsa bo‘ladigan kontakt mavjud emas." - "Siz zarur ruxsatni o‘chirib qo‘ygansiz." - "Eksport jarayonida xato yuz berdi: \"%s\"." - "So‘ralgan fayl nomi juda uzun (\"%s\")." - "I/O xato" - "Xotira yetarli emas. Fayl juda katta bo‘lishi mumkin." - "Tashrifnomani kutilmagan sabab tufayli tahlil qilib bo‘lmadi." - "Ushbu formatda ishlamaydi." - "Berilgan tashrifnoma(lar) meta ma’lumotini yig‘ib bo‘lmadi." - "Bir yoki bir necha fayllarni import qilib bo‘lmadi (%s)." - "%sni eksport qilish tugadi." - "Kontaktlar eksport qilindi." - "Kontaktlar eksport qilindi. Ularni baham ko‘rish uchun bildirishnoma ustiga bosing." - "Kontaktlarni baham ko‘rish uchun bosing." - "%sni eksport qilish bekor qilindi." - "Kontakt ma’lumoti eksport qilinmoqda" - "Kontakt ma’lumotlari eksport qilinmoqda." - "Ma’lumotlar bazasining ma’lumoti olinmadi." - "Eksport qilish uchun kontaktlar yo‘q. Ba’zi tarmoq operatorlari kontaktlarni qurilmadan eksport qilishga ruxsat bermagan bo‘lishi mumkin." - "Tashrifnoma yaratgich to‘g‘ri ishga tushmagan." - "Eksport qilinmadi" - "Kontakt ma’lumoti eksport qilinmadi.\nSababi: \"%s\"" - "%s import qilinmoqda" - "Tashrifnoma ma’lumotlari o‘qilmadi" - "Tashrifnomani o‘qish bekor qilindi" - "%s tashrifnomani import qilish tugadi" - "%sni import qilish bekor qilindi" - "%s tezda import qilinadi." - "Fayl tezda import qilinadi." - "Tashrifnomani import qilish so‘rovi rad qilindi. Keyinroq urinib ko‘ring." - "%s tezda eksport qilinadi." - "Fayl tez orada eksport qilinadi." - "Kontaktlar tez orada eksport qilinadi." - "Tashrifnomani eksport qilish rad qilindi. Keyinroq urinib ko‘ring." - "kontakt" - "Tashrifnoma(lar) telefondagi vaqtinchalik xotira keshiga yuklanmoqda. Import qilish jarayoni tezda boshlanadi." - "Tashrifnoma import qilinmadi." - "Kontakt NFC orqali olindi" - "Kontaktlar eksport qilinsinmi?" - "Keshga yuklanmoqda" - "Import qilinmoqda: %s/%s%s" - "VCF faylga eksport qilish" "Saralash tartibi" "Ismi asosida" "Familiyasi asosida" "Ism formati" "Avval ismi" "Avval familiyasi" - "Yangi kontaktlar uchun birlamchi hisob" - "Kontakt meta-ma’lumotlarini sinxronlash" - "Kontaktlar ilovasi haqida" - "Sozlamalar" - "Ko‘rinadigan kontaktlarni yuborish" - "Ko‘rinadigan kontaktlarni yuborib bo‘lmadi." - "Sevimli kontaktlarni yuborish" - "Barcha kontaktlarni yuborish" - "Kontaktlarni yuborib bo‘lmadi." - "Kontaktlarni import/eksport qilish" - "Kontaktlarni import qilish" - "Kontaktni yuborib bo‘lmadi." - "Yuborish uchun hech qanday kontakt yo‘q." - "Qidirish" - "Kontaktlar ichidan qidirish" - "Sevimlilar" - "Hech qanday kontakt yo‘q." - "Ko‘rinadigan kontaktlar yo‘q." - "Hech narsa yo‘q" - "%s guruhida hech qanday kontakt yo‘q" "Faol kontaktlarni tozalash" - "SIM kartani tanlang" - "Hisoblarni boshqarish" - "Import/eksport" - "%1$s orqali" - "%2$s orqali %1$s" "qidiruvni to‘xtatish" "Izlashni tozalash" - "Kontaktlarni ko‘rsatish" "Hisob" "Har doim qo‘ng‘iroqlar u-n foyd-sin" "Ushbu bilan qo‘ng‘iroq qilish" @@ -248,19 +151,12 @@ "Qo‘ng‘iroqqa qo‘shib yuborish uchun izoh yozing ..." "YUBORISH va QO‘NG‘IROQ QILISH" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ichki oynasi." %1$s ichki oynasi. %2$d ta o‘qilmagan narsa. %1$s ichki oynasi. %2$d ta o‘qilmagan narsa. - "Versiyasi" - "Ochiq kodli DT litsenziyalari" - "Ochiq kodli DT litsenziyalari haqida ma’lumot" - "Maxfiylik siyosati" - "Foydalanish shartlari" - "Ochiq kodli dasturiy ta’minot litsenziyalari" - "URLni ochishda xatolik yuz berdi." "Video suhbat" "Ulashish va chaqirish" diff --git a/java/com/android/contacts/common/res/values-vi/strings.xml b/java/com/android/contacts/common/res/values-vi/strings.xml index dadb78a7d..31fe86a1c 100644 --- a/java/com/android/contacts/common/res/values-vi/strings.xml +++ b/java/com/android/contacts/common/res/values-vi/strings.xml @@ -18,7 +18,6 @@ "Đã sao chép văn bản" - "Sao chép vào khay nhớ tạm" "Gọi %s" "Gọi số điện thoại nhà riêng" "Gọi số điện thoại di động" @@ -40,7 +39,6 @@ "Gọi số máy nhắn tin cơ quan" "Gọi %s" "Gọi MMS" - "%s (Gọi)" "Nhắn tin tới %s" "Nhắn tin tới số điện thoại nhà riêng" "Nhắn tin tới số điện thoại di động" @@ -62,7 +60,6 @@ "Nhắn tin tới số máy nhắn tin cơ quan" "Nhắn tin tới %s" "Nhắn tin tới số điện thoại MMS" - "%s (Tin nhắn)" "Xóa danh sách liên hệ thường xuyên?" "Bạn sẽ xóa danh sách liên hệ thường xuyên trong ứng dụng Danh bạ và điện thoại cũng như buộc các ứng dụng email phải tìm hiểu các tùy chọn gửi của bạn lại từ đầu." "Đang xóa DS liên hệ thường xuyên…" @@ -70,22 +67,14 @@ "Đã ra ngoài" "Bận" "Danh bạ" + "Đề xuất hàng đầu" "Khác" "Thư mục" "Thư mục công việc" "Tất cả liên hệ" + "Đề xuất" "Tôi" - "Đang tìm kiếm…" - "Đã tìm thấy hơn %d người liên hệ." - "Không có liên hệ nào" - - Đã tìm thấy %d - Đã tìm thấy 1 - - "Liên hệ nhanh của %1$s" "(Không có tên)" - "Thường xuyên được gọi" - "Thường xuyên được liên hệ" "Xem liên hệ" "Tất cả người liên hệ có số điện thoại" "Liên hệ trên hồ sơ công việc" @@ -125,8 +114,6 @@ "Gửi email cho %s" "Gửi email" "Đường phố" - "Hòm thư bưu điện" - "Vùng lân cận" "Thành phố" "Tiểu bang" "Mã ZIP" @@ -144,103 +131,19 @@ "Trò chuyện sử dụng ICQ" "Trò chuyện sử dụng Jabber" "Trò chuyện" - "xóa" - "Mở rộng hoặc thu gọn trường tên" - "Mở rộng hoặc thu gọn trường tên theo phiên âm" "Tất cả liên hệ" - "Xong" - "Hủy" "Danh bạ trong %s" "Danh bạ ở chế độ xem tùy chỉnh" "Một liên hệ" - "Lưu danh bạ đã nhập vào:" - "Nhập từ thẻ SIM" - "Nhập từ SIM ^1 - ^2" - "Nhập từ SIM %1$s" - "Nhập từ tệp .vcf" - "Hủy nhập %s?" - "Hủy xuất %s?" - "Không thể nhập/xuất vCard" - "Lỗi không xác định." - "Không thể mở \"%s\": %s." - "Không thể chạy trình xuất: \"%s\"." - "Không thể xuất liên hệ nào." - "Bạn đã tắt quyền được yêu cầu." - "Đã xảy ra lỗi khi xuất: \"%s\"." - "Tên tệp yêu cầu quá dài (\"%s\")." - "Lỗi I/O" - "Không đủ bộ nhớ. Tệp có thể quá lớn." - "Không thể phân tích cú pháp vCard vì lý do không mong muốn." - "Định dạng không được hỗ trợ." - "Không thể thu thập thông tin meta của (các) tệp vCard cụ thể." - "Không thể nhập một hoặc nhiều tệp (%s)." - "Đã xuất xong %s." - "Đã xuất xong danh bạ." - "Đã xuất xong liên hệ. Nhấp vào thông báo để chia sẻ liên hệ." - "Nhấp để chia sẻ liên hệ." - "Quá trình xuất %s bị hủy." - "Đang xuất dữ liệu liên hệ" - "Dữ liệu liên hệ đang được xuất." - "Không thể nhận thông tin cơ sở dữ liệu." - "Không thể xuất liên hệ nào. Nếu bạn có danh bạ trên thiết bị của mình, một số nhà cung cấp dữ liệu không cho phép xuất danh bạ từ thiết bị." - "Trình soạn vCard không khởi động đúng." - "Không thể xuất" - "Không xuất được dữ liệu liên hệ.\nLý do: \"%s\"" - "Đang nhập %s" - "Không thể đọc dữ liệu vCard" - "Thao tác đọc dữ liệu vCard bị hủy" - "Đã nhập xong vCard %s" - "Quá trình nhập %s bị hủy" - "%s sẽ sớm được nhập." - "Tệp sẽ sớm được nhập." - "Yêu cầu nhập vCard bị từ chối. Hãy thử lại sau." - "%s sẽ sớm được xuất." - "Tệp sẽ sớm được xuất." - "Danh bạ sẽ được xuất ngay." - "Yêu cầu xuất vCard bị từ chối. Hãy thử lại sau." - "liên hệ" - "Đang lưu vào bộ nhớ cache các tệp vCard sẽ được nhập vào bộ nhớ cục bộ tạm thời. Thao tác nhập thực sự sẽ sớm bắt đầu." - "Không thể nhập vCard." - "L.h nhận qua NFC" - "Xuất danh bạ?" - "Đang lưu vào bộ nhớ cache" - "Đang nhập %s/%s: %s" - "Xuất sang tệp .vcf" "Sắp xếp theo" "Tên" "Họ" "Định dạng tên" "Tên trước" "Họ trước" - "Tài khoản mặc định cho các liên hệ mới" - "Đồng bộ hóa siêu dữ liệu liên hệ" - "Giới thiệu về Danh bạ" - "Cài đặt" - "Chia sẻ liên hệ hiển thị" - "Không chia sẻ được liên hệ được hiển thị." - "Chia sẻ liên hệ yêu thích" - "Chia sẻ tất cả các liên hệ" - "Không chia sẻ được liên hệ." - "Nhập/xuất danh bạ" - "Nhập danh bạ" - "Không thể chia sẻ liên hệ này." - "Không có liên hệ nào để chia sẻ." - "Tìm kiếm" - "Tìm liên hệ" - "Liên hệ ưa thích" - "Không có liên hệ nào." - "Không có địa chỉ liên hệ nào hiển thị." - "Không có liên hệ yêu thích nào" - "Không có địa chỉ liên hệ nào trong %s" "Xóa DS liên hệ thường xuyên" - "Chọn thẻ SIM" - "Quản lý tài khoản" - "Nhập/xuất" - "qua %1$s" - "%1$s qua %2$s" "ngừng tìm kiếm" "Xóa tìm kiếm" - "Tùy chọn hiển thị liên hệ" "Tài khoản" "Luôn sử dụng SIM này để gọi" "Gọi bằng" @@ -248,19 +151,12 @@ "Nhập ghi chú để gửi kèm cuộc gọi..." "GỬI và GỌI" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "Tab %1$s." Tab %1$s. %2$d mục chưa đọc. Tab %1$s. %2$d mục chưa đọc. - "Phiên bản đóng gói" - "Giấy phép nguồn mở" - "Chi tiết giấy phép cho phần mềm nguồn mở" - "Chính sách bảo mật" - "Điều khoản dịch vụ" - "Giấy phép nguồn mở" - "Không mở được url." "Gọi điện video" "Chia sẻ và gọi" diff --git a/java/com/android/contacts/common/res/values-zh-rCN/strings.xml b/java/com/android/contacts/common/res/values-zh-rCN/strings.xml index 161638e66..a83d4607a 100644 --- a/java/com/android/contacts/common/res/values-zh-rCN/strings.xml +++ b/java/com/android/contacts/common/res/values-zh-rCN/strings.xml @@ -18,7 +18,6 @@ "文本已复制" - "复制到剪贴板" "拨打%s电话号码" "拨打住宅电话号码" "拨打手机号码" @@ -40,7 +39,6 @@ "拨打公司寻呼机号码" "拨打%s的电话" "拨打彩信电话号码" - "%s(拨打电话)" "向%s电话号码发短信" "向住宅电话号码发短信" "向手机发短信" @@ -62,7 +60,6 @@ "向公司寻呼机号码发短信" "向%s发短信" "向彩信电话号码发短信" - "%s(发送短信)" "是否清除常用联系人?" "此操作会清除“通讯录”和“电话”应用中的常用联系人列表,并强制电子邮件应用重新获取您最常使用的联系地址。" "正在清除常用联系人…" @@ -70,22 +67,14 @@ "离开" "忙碌" "通讯录" + "常用联系人推荐" "其他" "目录" "工作目录" "所有联系人" + "建议" "我" - "正在搜索..." - "找到超过 %d 位联系人。" - "没有联系人" - - 找到 %d 位联系人 - 找到 1 位联系人 - - "%1$s的快捷联系方式" "(无姓名)" - "经常呼叫的联系人" - "常用联系人" "查看联系人" "所有拥有电话号码的联系人" "工作资料联系人" @@ -125,8 +114,6 @@ "向%s邮箱发送电子邮件" "发送电子邮件" "街道" - "邮政信箱" - "社区" "城市" "省/自治区/直辖市" "邮编" @@ -144,103 +131,19 @@ "使用 ICQ 聊天" "使用 Jabber 聊天" "聊天" - "删除" - "展开或收起姓名字段" - "展开或收起姓名拼音字段" "所有联系人" - "完成" - "取消" "%s 中的联系人" "自定义视图中的联系人" "单个联系人" - "将导入的联系人保存到:" - "从 SIM 卡导入" - "从 SIM 卡“^1” - ^2 导入" - "从 SIM 卡“%1$s”导入" - "从 .vcf 文件导入" - "要取消导入“%s”吗?" - "要取消导出“%s”吗?" - "无法取消导入/导出 vCard" - "未知错误。" - "无法打开“%s”:%s。" - "无法启动导出程序:“%s”。" - "没有可导出的联系人。" - "您已停用某项必需权限。" - "导出时出错:“%s”。" - "指定的文件名过长(“%s”)。" - "I/O 错误" - "内存不足。该文件可能过大。" - "由于意外原因而无法解析 vCard。" - "不支持此格式。" - "无法收集指定 vCard 文件的元信息。" - "一个或多个文件无法导入 (%s)。" - "已顺利导出“%s”。" - "已成功导出联系人。" - "联系人数据导出已完成,点击通知即可分享联系人数据。" - "点按即可分享联系人数据。" - "已取消导出“%s”。" - "正在导出联系人数据" - "正在导出联系人数据。" - "无法获取数据库信息。" - "没有可导出的联系人。如果您的设备上确实存有联系人,可能是某些数据源不允许从设备中导出联系人。" - "vCard 制作程序未正确启动。" - "无法导出" - "未导出联系人数据。\n原因:“%s”" - "正在导入%s" - "无法读取 vCard 数据" - "已取消读取 vCard 数据" - "已顺利导入 vCard %s" - "已取消导入“%s”" - "“%s”将在稍后导入。" - "该文件将在稍后导入。" - "vCard 导入请求遭拒,请稍后重试。" - "“%s”将在稍后导出。" - "即将导出文件。" - "即将导出联系人数据。" - "vCard 导出请求遭拒,请稍后重试。" - "联系人" - "正在将 vCard 缓存到本地临时存储空间。实际导入操作即将开始。" - "无法导入 vCard。" - "通过NFC收到的联系人" - "要导出联系人吗?" - "正在缓存" - "正在导入第 %s/%s 位联系人:%s" - "导出为 .vcf 文件" "排序方式" "名字" "姓氏" "姓名格式" "名字在前" "姓氏在前" - "用于保存新联系人的默认帐号" - "同步联系人元数据" - "关于通讯录" - "设置" - "分享所显示的联系人" - "无法分享所显示的联系人。" - "分享收藏的联系人" - "分享所有联系人" - "无法分享联系人。" - "导入/导出联系人" - "导入联系人" - "无法分享此联系人。" - "没有可供分享的联系人。" - "搜索" - "查找联系人" - "收藏" - "没有联系人。" - "没有可显示的联系人。" - "没有收藏的联系人" - "%s中没有联系人" "清除常用联系人" - "选择SIM卡" - "管理帐号" - "导入/导出" - "来源:%1$s" - "%1$s,来源:%2$s" "停止搜索" "清除搜索内容" - "联系人显示选项" "帐号" "一律使用这张卡进行通话" "用于外拨电话的帐号" @@ -248,19 +151,12 @@ "输入要在拨打电话时发送的备注…" "发送并拨打电话" "%1$s / %2$s" - "%1$s%2$s" + "%1$s%2$s" "%1$s标签。" %1$s标签。%2$d 项未读内容。 %1$s标签。%2$d 项未读内容。 - "版本号" - "开放源代码许可" - "开放源代码软件的许可详情" - "隐私权政策" - "服务条款" - "开放源代码许可" - "无法打开网址。" "视频通话" "分享并拨打电话" diff --git a/java/com/android/contacts/common/res/values-zh-rHK/strings.xml b/java/com/android/contacts/common/res/values-zh-rHK/strings.xml index 9952ab626..dfa66139d 100644 --- a/java/com/android/contacts/common/res/values-zh-rHK/strings.xml +++ b/java/com/android/contacts/common/res/values-zh-rHK/strings.xml @@ -18,7 +18,6 @@ "文字已複製" - "複製到剪貼簿" "撥打%s電話號碼" "撥打住家電話號碼" "撥打手機號碼" @@ -40,7 +39,6 @@ "撥打公司傳呼機號碼" "撥打%s的電話號碼" "撥打 MMS 電話號碼" - "%s (通話)" "傳送短訊至%s電話" "傳送短訊至住家電話" "傳送短訊至手機" @@ -62,30 +60,21 @@ "傳送短訊至公司傳呼機" "傳送短訊至%s的電話" "傳送短訊至 MMS 電話號碼" - "%s (訊息)" "清除常用聯絡人?" - "您將清除「通訊錄」應用程式和「電話」應用程式中的常用聯絡人名單,並強制電子郵件應用程式重新取得您的寄件喜好設定。" + "您將清除「通訊錄」應用程式和「電話」應用程式中的常用聯絡人名單,並強制電子郵件應用程式重新取得您的寄件偏好設定。" "正在清除常用聯絡人…" "在線" "離開" "忙碌" "通訊錄" + "熱門建議" "其他" "名錄" "工作目錄" "所有聯絡人" + "建議" "我" - "正在搜尋..." - "找到超過 %d 位聯絡人。" - "沒有聯絡人" - - 找到 %d 位聯絡人 - 找到 1 位聯絡人 - - "快速聯絡%1$s" "(沒有名稱)" - "經常通話的聯絡人" - "常用聯絡人" "查看聯絡人" "所有附有電話號碼的聯絡人" "工作設定檔通訊錄" @@ -125,8 +114,6 @@ "傳送電郵至%s的信箱" "傳送電郵" "街道" - "郵政信箱" - "社區" "城市" "州/省" "郵遞區號" @@ -144,103 +131,19 @@ "使用 ICQ 進行即時通訊" "使用 Jabber 進行即時通訊" "即時通訊" - "刪除" - "展開或收合名稱欄位" - "展開或收合姓名拼音欄位" "所有聯絡人" - "完成" - "取消" "%s 中的聯絡人" "聯絡人自訂檢視" "單一聯絡人" - "儲存匯入的聯絡人至以下帳戶:" - "從 SIM 卡匯入" - "從 SIM 卡匯入 ^1 - ^2" - "從 SIM 卡匯入 %1$s" - "匯入 .vcf 檔案" - "要取消匯入 %s 嗎?" - "要取消匯出 %s 嗎?" - "無法取消匯入/匯出 vCard" - "不明錯誤。" - "無法開啟「%s」:%s。" - "無法啟動匯出程式:「%s」。" - "沒有聯絡人資料可以匯出。" - "您已停用所需權限。" - "匯出時發生錯誤:「%s」。" - "要求的檔案名稱過長 (「%s」)。" - "I/O 錯誤" - "記憶體不足,檔案可能過大。" - "由於未預期的原因,無法剖析 vCard。" - "不支援此格式。" - "無法從指定的 vCard 檔案收集中繼資料。" - "無法匯入一個或多個檔案 (%s)。" - "已完成匯出 %s。" - "已匯出聯絡人。" - "已完成匯出通訊錄,按一下通知即可共用通訊錄。" - "輕按即可共用通訊錄。" - "已取消匯出 %s。" - "正在匯出聯絡人資料" - "正在匯出聯絡人資料。" - "無法取得資料庫資訊。" - "沒有聯絡人可以匯出。如果您的裝置確實有聯絡人,可能部分資料提供者不允許您將聯絡人從裝置匯出。" - "vCard 編輯器並未正確啟動。" - "無法匯出" - "聯絡人資料未匯出。\n原因:「%s」" - "正在匯入 %s" - "無法讀取 vCard 資料" - "已取消讀取 vCard 資料的操作" - "已完成匯入 vCard %s" - "已取消匯入 %s" - "%s 將在稍後匯入。" - "稍後即將匯入檔案。" - "vCard 匯入要求已被拒,請稍後再試。" - "%s 將在稍後匯出。" - "檔案即將匯出。" - "系統即將匯出通訊錄。" - "vCard 匯出要求已被拒,請稍後再試。" - "聯絡人" - "正在將 vCard 資料快取至本機暫存空間,隨即將開始實際的匯入操作。" - "無法匯入 vCard。" - "已透過 NFC 收到聯絡人資料" - "要匯出聯絡人資料嗎?" - "快取中" - "正在匯入第 %s 位:%s,共 %s 位" - "匯出至 .vcf 檔案" "排序方式" "名字" "姓氏" "姓名格式" "名字在前" "姓氏在前" - "新聯絡人的預設帳戶" - "同步處理聯絡人元數據" - "有關通訊錄" - "設定" - "分享正常顯示的聯絡人" - "無法分享顯示的聯絡人" - "分享常用聯絡人資料" - "分享所有聯絡人資料" - "無法分享聯絡人資料。" - "匯入/匯出聯絡人資料" - "匯入通訊錄" - "無法分享這位聯絡人的資料。" - "沒有聯絡人可供分享。" - "搜尋" - "尋找聯絡人" - "我的最愛" - "沒有聯絡人。" - "沒有可顯示的聯絡人。" - "沒有最愛聯絡人" - "「%s」中沒有聯絡人" "清除常用聯絡人" - "選取 SIM 卡" - "管理帳戶" - "匯入/匯出" - "透過 %1$s" - "%1$s (透過 %2$s)" "停止搜尋" "清除搜尋" - "聯絡人顯示選項" "帳戶" "永遠使用這張 SIM 卡通話" "選取用於撥號的 SIM 卡:" @@ -248,19 +151,12 @@ "撥號時可以書寫和傳送筆記…" "傳送和撥號" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "「%1$s」標籤。" %1$s」標籤 (%2$d 個未讀取項目)。 %1$s」標籤 (%2$d 個未讀取項目)。 - "版本" - "開放原始碼授權" - "開放原始碼軟件的授權詳情" - "私隱權政策" - "服務條款" - "開放原始碼授權" - "無法開啟網址。" "視像通話" "分享並通話" diff --git a/java/com/android/contacts/common/res/values-zh-rTW/strings.xml b/java/com/android/contacts/common/res/values-zh-rTW/strings.xml index e5ad61fac..fca680b54 100644 --- a/java/com/android/contacts/common/res/values-zh-rTW/strings.xml +++ b/java/com/android/contacts/common/res/values-zh-rTW/strings.xml @@ -18,7 +18,6 @@ "文字已複製" - "複製到剪貼簿" "撥打%s電話號碼" "撥打住家電話號碼" "撥打手機號碼" @@ -40,7 +39,6 @@ "撥打公司呼叫器號碼" "撥打%s電話號碼" "撥打 MMS 電話號碼" - "%s (撥號)" "傳送簡訊至%s電話" "傳送簡訊至住家電話" "傳送簡訊至手機" @@ -62,7 +60,6 @@ "傳送簡訊至公司呼叫器" "傳送簡訊至%s電話" "傳送簡訊至 MMS 電話" - "%s (傳送簡訊)" "清除常用聯絡人?" "您即將清除「聯絡人」應用程式和「電話」應用程式中的常用聯絡人清單,並設定讓電子郵件應用程式重新熟悉您的寄件偏好設定。" "正在清除常用聯絡人…" @@ -70,22 +67,14 @@ "離開" "忙碌" "聯絡人" + "常用聯絡人建議" "其他" "目錄" "Work 聯絡人目錄" "所有聯絡人" + "建議" "我" - "搜尋中…" - "找到 %d 位以上的聯絡人。" - "沒有聯絡人" - - 找到 %d 位聯絡人 - 找到 1 位聯絡人 - - "%1$s 的快速聯絡人相片" "(無姓名)" - "經常通話" - "經常聯絡" "查看聯絡人" "所有包含電話號碼的聯絡人資訊" "Work 設定檔聯絡人" @@ -125,8 +114,6 @@ "傳送電子郵件至「%s」" "電子郵件" "街" - "郵政信箱" - "鄰" "縣市鄉鎮" "州" "郵遞區號" @@ -144,103 +131,19 @@ "使用 ICQ 進行即時通訊" "使用 Jabber 進行即時通訊" "即時通訊" - "刪除" - "展開或收合名稱欄位" - "展開或收合姓名拼音欄位" "所有聯絡人" - "完成" - "取消" "%s 中的聯絡人" "聯絡人自訂檢視" "單一聯絡人" - "將匯入的聯絡人儲存到:" - "從 SIM 卡匯入" - "從 SIM 卡 ^1 - ^2 匯入" - "從 SIM 卡 %1$s 匯入" - "從 .vcf 檔案匯入" - "確定要取消匯入 %s?" - "確定要取消匯出 %s?" - "無法取消匯入/匯出 vCard" - "未知的錯誤。" - "無法開啟「%s」:%s。" - "無法啟動匯出程式:「%s」。" - "沒有可匯出的聯絡人。" - "必要權限已停用。" - "匯出時發生錯誤:「%s」。" - "要求的檔案名稱過長 (「%s」)。" - "I/O 錯誤" - "記憶體不足,檔案可能過大。" - "由於意外因素,導致無法剖析 vCard。" - "不支援此格式。" - "無法從指定的 vCard 檔案收集中繼資料。" - "無法匯入一或多個檔案 (%s)。" - "已完成 %s 匯出作業。" - "匯出聯絡人完成。" - "聯絡人資料匯出完成,按一下通知即可分享聯絡人資料。" - "輕觸即可分享聯絡人資料。" - "已取消匯出 %s。" - "正在匯出聯絡人資料" - "正在匯出聯絡人資料。" - "無法取得資料庫資訊。" - "沒有可匯出的聯絡人。如果你的裝置中確實有聯絡人資料,那麼可能是部分資料提供者不允許你從裝置匯出聯絡人資料。" - "vCard 編輯器並未正確啟動。" - "無法匯出" - "聯絡人資料未匯出。\n原因:「%s」" - "正在匯入 %s" - "無法讀取 vCard 資料" - "已取消讀取 vCard 資料" - "已完成匯入 vCard 的 %s" - "已取消匯入 %s" - "%s 將在稍後匯入。" - "稍後即將匯入該檔案。" - "vCard 匯入要求遭到拒絕,請稍後再試。" - "%s 將在稍後匯出。" - "稍後即將匯出該檔案。" - "即將匯出聯絡人資料。" - "vCard 匯出要求遭到拒絕,請稍後再試。" - "聯絡人" - "正在將 vCard 資料快取至本機暫存空間,隨即將啟動實際的匯入作業。" - "無法匯入 vCard。" - "已透過 NFC 收到聯絡人資訊" - "確定要匯出聯絡人?" - "快取中" - "匯入中:%s/%s%s" - "匯出成 .vcf 檔案" "排序依據" "名字" "姓氏" "姓名格式" "名字在前" "姓氏在前" - "新聯絡人的預設帳戶" - "同步處理聯絡人中繼資料" - "關於聯絡人" - "設定" - "分享正常顯示的聯絡人" - "無法分享目前顯示的聯絡人資料。" - "分享常用聯絡人資料" - "分享所有聯絡人資料" - "無法分享聯絡人資料。" - "匯入/匯出聯絡人" - "匯入聯絡人" - "無法分享這位聯絡人的資料。" - "沒有任何聯絡人資料可供分享。" - "搜尋" - "尋找聯絡人" - "我的收藏" - "沒有聯絡人。" - "沒有可顯示的聯絡人。" - "沒有常用聯絡人" - "「%s」中沒有聯絡人" "清除常用聯絡人" - "選取 SIM 卡" - "管理帳戶" - "匯入/匯出" - "透過 %1$s" - "%1$s (透過 %2$s)" "停止搜尋" "清除搜尋" - "聯絡人顯示選項" "帳戶" "一律使用這張 SIM 卡通話" "選擇通話帳戶" @@ -248,19 +151,12 @@ "輸入可在撥號時傳送的備註..." "傳送並撥打" "%1$s/%2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s分頁。" %1$s分頁。%2$d 個未讀項目。 %1$s分頁。%2$d 個未讀項目。 - "版本" - "開放原始碼授權" - "開放原始碼軟體的授權詳細資料" - "隱私權政策" - "服務條款" - "開放原始碼授權" - "無法開啟網址。" "視訊通話" "分享及撥號" diff --git a/java/com/android/contacts/common/res/values-zu/strings.xml b/java/com/android/contacts/common/res/values-zu/strings.xml index adca1399c..e3cbc96e8 100644 --- a/java/com/android/contacts/common/res/values-zu/strings.xml +++ b/java/com/android/contacts/common/res/values-zu/strings.xml @@ -18,7 +18,6 @@ "Umbhalo okopishiwe" - "Kopisha ku-clipboard" "Fonela ku-%s" "Fonela ekhaya" "Fonela iselula" @@ -40,7 +39,6 @@ "Fonela isicingo sasemsebenzini" "Fonela %s" "Fonela i-MMS" - "%s (Ikholi)" "Bhalela ku-%s" "Bhalela ekhaya" "Bhalela iselula" @@ -62,7 +60,6 @@ "Bhalela isicingo sasemsebenzini" "Bhalela ku-%s" "Bhala i-MMS" - "%s (Umlayezo)" "Sula oxhumana nabo njalo?" "Uzosula uhlu loxhumana nabo kakhulu kuzinhelo zokusebenza zokuxhumana noma zefoni, futhi uphoqelele izinhlelo zokusebenza ze-imeyili ukufunda izintandokazi zakho zekheli kusuka ekuqaleni." "Isula oxhumana nabo njalo…" @@ -70,22 +67,14 @@ "Ngiphumile" "Ngimatasa" "Othi tana nabo" + "Okuphezulu okuphakanyisiwe" "Okunye" "Uhla lwemibhalo" "Uhla lwemibhalo lomsebenzi" "Bonke othintana nabo" + "Iziphakamiso" "Mina" - "Iyasesha..." - "Abangaphezu kuka-%d abatholakele." - "Abekho othintana nabo" - - %d okutholakele - %d okutholakele - - "Oxhumene naye ngokushesha ku-%1$s" "(Alikho igama)" - "Abashayelwa njalo" - "Abathintwa njalo" "Buka oxhumana naye" "Bonke othintana nabo kanye nezinombolo zabo zefoni" "Oxhumana nabo bephrofayela yomsebenzi" @@ -125,8 +114,6 @@ "I-imeyili %s" "I-imeyili" "Umgwaqo" - "PO box" - "Indawo yasekhaya" "Idolobha" "Isifunda" "Ikhodi ye-ZIP" @@ -144,103 +131,19 @@ "Xoxa usebenzisa i-ICQ" "Xoxa usebenzisa i-Jabber" "Xoxa" - "susa" - "Nweba noma goqa izinkambu zegama" - "Nweba noma goqa izinkambu zegama lefonotiki" "Bonke oxhumana nabo" - "Kwenziwe" - "Khansela" "Oxhumana nabo ku-%s" "Oxhumana nabo ekubukweni okwenziwe ngendlela oyifisayo" "Oyedwa oxhumana naye" - "Londoloza oxhumana nabo abangenisiwe ku-:" - "Landa kusuka kwikhadi le-SIM" - "Ngenisa kusuka ku-SIM ^1 - ^2" - "Ngenisa kusuka ku-SIM %1$s" - "Ngenisa kusukela kufayela le-.vcf" - "Khansela ukulandwa kwe-%s?" - "Khansela ukuthunyelwa kwe-%s?" - "Yehlulekile ukukhansela ukulanda/ukuthumela i-vCard" - "Iphutha elingaziwa" - "Ayikwazi ukuvula i-\"%s\": %s" - "Ayikwazanga ukuqalisa isithumeli: \"%s\"" - "Abekho oxhumana nabo abathumelekayo." - "Ukhubaze imvume edingekayo." - "Kube khona iphutha ngesikhathi kuthunyelwa: \"%s\"." - "Igama lefayela elidingekayo lide kakhulu (\"%s\")" - "Iphutha le-I/O" - "Imemori enganele. Ifayela kungenzeka likhulu kakhulu." - "Yehlulekile ukunqunta i-vCard ngokwesizathu esingalindelekile" - "Ifomethi ayisekelwe." - "Yehlulekile ukuqoqa ulwazi lwemetha noma amafayela we-vCard." - "Ifayela elilodwa noma amafayela angaphezulu ehlulekile ukulandwa (%s)." - "Iqedile ukuthumela i-%s" - "Iqedile ukukhipha oxhumana nabo." - "Iqedile ukuthumela oxhumana nabo, chofoza isaziso ukuze wabelane ngoxhumana nabo." - "Thepha ukuze wabelane ngoxhumana nabo." - "Ukulandwa kwe-%s kukhanseliwe." - "Kuthunyelwa idatha yoxhumana naye" - "Idatha yoxhumana nabo iyathunyelwa." - "Yehlulekile ukuthola ulwazi lwemininingo egciniwe." - "Abekho oxhuana nabo abangathumeleka. Uma unabo oxhumana nabo kudivayisi yakho yakho, abanye abahlinzeki be-data kungenzeka bangavumi ukuthi oxhumana nabo bthuyelwe besuka kudivayisi yakho." - "Umqambi we-Vcard akazange aqale ngendlela efanele." - "Yehlulekile ukuthumela" - "Idatha yoxhumana naye ayizange ithunyelwe.\nIsizathu: \"%s\"" - "Ilanda i-%s" - "Yehlulekile ukufunda idatha ye-vCard" - "Ukufundwa kwe-vCard kukhanseliwe" - "Iqedile ukulanda i-vCard %s" - "Ukulanda i-%s kukhanseliwe" - "%s izothunyelwa maduzane." - "Ifayela lizothunyelwa maduzane." - "Isicelo sokungenisa i-vCard sinqatshelwe. Zama futhi emuva kwesikhathi." - "%s izothunyelwa maduzane" - "Ifayela lizokhishwa maduze." - "Oxhumana nabo bazothunyelwa maduze." - "Isicelo sokuthumela i-vCard sinqatshelwe. Sicela uzame futhi emuva kwesikhathi." - "oxhumana naye" - "Ifaka kunqolobane ama-vCard kusitoreji sesikhashana. Ukulandwa kwangempela kuzoqala khona maduze." - "Yehlulekile ukulanda i-vCard" - "Othintana naye utholakale nge-NFC" - "Thumela oxhumana nabo?" - "Ukulondoloza isikhashana" - "Ingenisa i-%s%s%s" - "Thumela kufayela le-.vcf" "Hlunga nge-" "Igama lokuqala" "Isibongo" "Ifomethi yegama" "Igama lokuqala kuqala" "Isibongo kuqala" - "I-akhawunti ezenzakalelayo yoxhumana nabo abasha" - "Vumelanisa imethadatha" - "Mayelana noxhumana nabo" - "Izilungiselelo" - "Yabelana noxhumana nabo ababonakalayo" - "Yehlulekile ukwabelana ngoxhumana nabo ababonakalayo" - "Yabelana ngoxhumana nabo obathandayo" - "Yabelana bonke oxhumana nabo" - "Yehlulekile ukwabelana ngoxhumana nabo." - "Landa/thumela oxhumana nabo" - "Ngenisa othintana nabo" - "Lona oxhumana naye ngeke ukwazi ukwabelana ngaye." - "Abekho oxhumana nabo ongabelana nabo." - "Sesha" - "Thola othintana nabo" - "Izintandokazi" - "Abekho oxhumana nabo." - "Abekho othintana nabo ababonakalayo." - "Azikho izintandokazi" - "Abekho othintana nabo ku-%s" "Sula oxhumana nabo njalo" - "Khetha ikhadi le-SIM" - "Phatha ama-akhawunti" - "Ngenisa/ thekelisa" - "nge-%1$s" - "%1$s nge-%2$s" "misa ukusesha" "Sula usesho" - "Izinketho zokubonisa oxhumana naye" "I-Akhawunti" "Njalo sebenzisa lokhu kumakholi" "Shaya nge" @@ -248,19 +151,12 @@ "Thayipha inothi ukuthumela nekholi ..." "THUMELA FUTHI YENZA IKHOLI" "%1$s / %2$s" - "%1$s%2$s" + "%1$s %2$s" "%1$s ithebhu." %1$s ithebhu. %2$d izinto ezingafundiwe. %1$s ithebhu. %2$d izinto ezingafundiwe. - "Yakha inguqulo" - "Amalayisensi womthombo ovulekile" - "Iminingwane yelayisensi yesofthiwe yomthombo ovulelekile" - "Inqubomgomo yobumfihlo" - "Imigomo yesevisi" - "Amalayisense womthombo ovulekile" - "Yehlulekile ukuvula i-url." "Ikholi yevidiyo" "Yabelana uphinde ushaye" diff --git a/java/com/android/contacts/common/res/values/colors.xml b/java/com/android/contacts/common/res/values/colors.xml index 434d193c7..1f46233c4 100644 --- a/java/com/android/contacts/common/res/values/colors.xml +++ b/java/com/android/contacts/common/res/values/colors.xml @@ -15,13 +15,6 @@ --> - - #eeeeee - - #44ff0000 - - #A52714 - #a0ffffff @@ -36,47 +29,9 @@ #2A56C6 - - #AAAAAA - - - #D0D0D0 - #363636 - - #DDDDDD - - - #7F000000 - - - #CCCCCC - - #7f000000 - - #fff - #000 - - - - #DB4437 - #E91E63 - #9C27B0 - #673AB7 - #3F51B5 - #4285F4 - #039BE5 - #0097A7 - #009688 - #0F9D58 - #689F38 - #EF6C00 - #FF5722 - #757575 - - @@ -96,23 +51,7 @@ #424242 - - #607D8B - - #455A64 - - - #cccccc - - #ffffff - @color/dialer_theme_color - - #ffffff - - #008aa1 #ffffff @color/tab_ripple_color diff --git a/java/com/android/contacts/common/res/values/dimens.xml b/java/com/android/contacts/common/res/values/dimens.xml index 642eb31a4..19b27b8c6 100644 --- a/java/com/android/contacts/common/res/values/dimens.xml +++ b/java/com/android/contacts/common/res/values/dimens.xml @@ -14,7 +14,7 @@ ~ limitations under the License --> - + @@ -28,24 +28,6 @@ 18dp 8dp - - 23dip - - 16dip - - - 16dip - - - - 48sp - - - 0dip - 32dip @@ -56,38 +38,10 @@ 56dp - - 0dip - - - 12dp - - - 1dp - - - 32dip - - - 48dip - 16sp 40dp 15dp - 12dp - - - 20sp - 10dip - - - 40dp - 20dp - 1dp - 67% 56dp @@ -107,7 +61,7 @@ 2dp 14sp - 2dp + 0dp 16dp 2dp 0dp @@ -115,8 +69,6 @@ 12sp 2dp - - 4dp 48dp @@ -130,17 +82,6 @@ 20sp - - 16dp - - 57dp - - 24sp - - - 40dp - 2dp - - true - true @@ -41,55 +38,4 @@ ContactEditorUtils_anything_saved - - - default - - - default - - - - - - - - - vcf - - - contacts.vcf - - - 1 - - - 99999 - - - - - - true - - - true - - - true - - pref_build_version - pref_open_source_licenses - pref_privacy_policy - pref_terms_of_service - - diff --git a/java/com/android/contacts/common/res/values/ids.xml b/java/com/android/contacts/common/res/values/ids.xml index 871f5a636..65969c43f 100644 --- a/java/com/android/contacts/common/res/values/ids.xml +++ b/java/com/android/contacts/common/res/values/ids.xml @@ -27,4 +27,5 @@ + diff --git a/java/com/android/contacts/common/res/values/integers.xml b/java/com/android/contacts/common/res/values/integers.xml index d38ad1da0..f4ed5c276 100644 --- a/java/com/android/contacts/common/res/values/integers.xml +++ b/java/com/android/contacts/common/res/values/integers.xml @@ -19,7 +19,6 @@ 2 - 3 30 @@ -33,7 +32,4 @@ 250 - - - 100 diff --git a/java/com/android/contacts/common/res/values/strings.xml b/java/com/android/contacts/common/res/values/strings.xml index 9ac9fef28..df8d70fc3 100644 --- a/java/com/android/contacts/common/res/values/strings.xml +++ b/java/com/android/contacts/common/res/values/strings.xml @@ -18,8 +18,6 @@ Text copied - - Copy to clipboard Call @@ -67,8 +65,6 @@ Call MMS - - %s (Call) Text @@ -116,8 +112,6 @@ Text MMS - - %s (Message) Clear frequently contacted? @@ -143,6 +137,9 @@ Contacts + + Top Suggested + Other @@ -155,43 +152,16 @@ All contacts + + Suggestions + Me - - Searching\u2026 - - - More than %d found. - - - No contacts - - - - 1 found - %d found - - - - Quick contact for %1$s - (No name) - - Frequently called - - - Frequently contacted - Street - - PO box - - Neighborhood City @@ -357,35 +323,9 @@ Chat - - delete - - - Expand or collapse name fields - - - Expand or collapse phonetic - name fields - All contacts - - Done - - - Cancel - Contacts in %s @@ -395,208 +335,6 @@ Single contact - - Save imported contacts to: - - - Import from SIM card - - - Import from SIM ^1 - ^2 - - - Import from SIM %1$s - - - Import from .vcf file - - - Cancel import of %s? - - - Cancel export of %s? - - - Couldn\'t cancel vCard import/export - - - Unknown error. - - - Couldn\'t open \"%s\": %s. - - - Couldn\'t start the exporter: \"%s\". - - - There is no exportable contact. - - - You have disabled a required permission. - - - An error occurred during export: \"%s\". - - - Required filename is too long (\"%s\"). - - - I/O error - - - Not enough memory. The file may be too large. - - - Couldn\'t parse vCard for an unexpected reason. - - - The format isn\'t supported. - - - Couldn\'t collect meta information of given vCard file(s). - - - One or more files couldn\'t be imported (%s). - - - Finished exporting %s. - - - Finished exporting contacts. - - - Finished exporting contacts, click the notification to share contacts. - - - Tap to share contacts. - - - Exporting %s canceled. - - - Exporting contact data - - - Contact data is being exported. - - - Couldn\'t get database information. - - - There are no exportable contacts. If you do have contacts on your device, some data providers may not allow the contacts to be exported from the device. - - - The vCard composer didn\'t start properly. - - - Couldn\'t export - - - The contact data wasn\'t exported.\nReason: \"%s\" - - - Importing %s - - - Couldn\'t read vCard data - - - Reading vCard data canceled - - - Finished importing vCard %s - - - Importing %s canceled - - - %s will be imported shortly. - - The file will be imported shortly. - - vCard import request was rejected. Try again later. - - %s will be exported shortly. - - - The file will be exported shortly. - - - Contacts will be exported shortly. - - - vCard export request was rejected. Try again later. - - contact - - - Caching vCard(s) to local temporary storage. The actual import will start soon. - - - Couldn\'t import vCard. - - - Contact received over NFC - - - Export contacts? - - - Caching - - - Importing %s/%s: %s - - - Export to .vcf file - @@ -617,95 +355,9 @@ Last name first - - Default account for new contacts - - - Sync contact metadata - - - About Contacts - - - Settings - - - Share visible contacts - - - Failed to share visible contacts. - - - Share favorite contacts - - - Share all contacts - - - Failed to share contacts. - - - Import/export contacts - - - Import contacts - - - This contact can\'t be shared. - - - There are no contacts to share. - - - Search - - - Find contacts - - - Favorites - - - No contacts. - - - No visible contacts. - - - No favorites - - - No contacts in %s - Clear frequents - - Select SIM card - - - Manage accounts - - - Import/export - - - sans-serif - - - via %1$s - - - %1$s via %2$s - - - sans-serif-medium - stop searching @@ -716,10 +368,6 @@ sans-serif - - Contact display options - Account @@ -744,9 +392,9 @@ compared to the character limit. Example: 2 / 64 --> %1$s / %2$s - - %1$s%2$s + + %1$s %2$s %1$s tab. @@ -765,27 +413,6 @@ - - Build version - - - Open source licenses - - - License details for open source software - - - Privacy policy - - - Terms of service - - - Open source licenses - - - Failed to open the url. - @dimen/list_section_divider_min_height - @drawable/list_section_divider_holo_custom @style/DirectoryHeaderStyle center_vertical 8dip diff --git a/java/com/android/contacts/common/util/AccountFilterUtil.java b/java/com/android/contacts/common/util/AccountFilterUtil.java index 18743c65e..25f937c5e 100644 --- a/java/com/android/contacts/common/util/AccountFilterUtil.java +++ b/java/com/android/contacts/common/util/AccountFilterUtil.java @@ -16,35 +16,15 @@ package com.android.contacts.common.util; -import android.app.Activity; import android.content.Context; -import android.content.Intent; -import android.util.Log; import android.view.View; import android.widget.TextView; import com.android.contacts.common.R; import com.android.contacts.common.list.ContactListFilter; -import com.android.contacts.common.list.ContactListFilterController; /** Utility class for account filter manipulation. */ public class AccountFilterUtil { - public static final String EXTRA_CONTACT_LIST_FILTER = "contactListFilter"; - private static final String TAG = AccountFilterUtil.class.getSimpleName(); - - /** - * Find TextView with the id "account_filter_header" and set correct text for the account filter - * header. - * - * @param filterContainer View containing TextView with id "account_filter_header" - * @return true when header text is set in the call. You may use this for conditionally showing or - * hiding this entire view. - */ - public static boolean updateAccountFilterTitleForPeople( - View filterContainer, ContactListFilter filter, boolean showTitleForAllAccounts) { - return updateAccountFilterTitle(filterContainer, filter, showTitleForAllAccounts, false); - } - /** * Similar to {@link #updateAccountFilterTitleForPeople(View, ContactListFilter, boolean, * boolean)}, but for Phone UI. @@ -78,8 +58,6 @@ public class AccountFilterUtil { } else if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) { headerTextView.setText(R.string.listCustomView); textWasSet = true; - } else { - Log.w(TAG, "Filter type \"" + filter.filterType + "\" isn't expected."); } } else { if (filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) { @@ -97,29 +75,9 @@ public class AccountFilterUtil { } else if (filter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) { headerTextView.setText(R.string.listSingleContact); textWasSet = true; - } else { - Log.w(TAG, "Filter type \"" + filter.filterType + "\" isn't expected."); } } - } else { - Log.w(TAG, "Filter is null."); } return textWasSet; } - - /** This will update filter via a given ContactListFilterController. */ - public static void handleAccountFilterResult( - ContactListFilterController filterController, int resultCode, Intent data) { - if (resultCode == Activity.RESULT_OK) { - final ContactListFilter filter = data.getParcelableExtra(EXTRA_CONTACT_LIST_FILTER); - if (filter == null) { - return; - } - if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) { - filterController.selectCustomFilter(); - } else { - filterController.setContactListFilter(filter, true); - } - } - } } diff --git a/java/com/android/contacts/common/util/BitmapUtil.java b/java/com/android/contacts/common/util/BitmapUtil.java deleted file mode 100644 index 20f916a3f..000000000 --- a/java/com/android/contacts/common/util/BitmapUtil.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.contacts.common.util; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.PorterDuff.Mode; -import android.graphics.PorterDuffXfermode; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; - -/** Provides static functions to decode bitmaps at the optimal size */ -public class BitmapUtil { - - private BitmapUtil() {} - - /** - * Returns Width or Height of the picture, depending on which size is smaller. Doesn't actually - * decode the picture, so it is pretty efficient to run. - */ - public static int getSmallerExtentFromBytes(byte[] bytes) { - final BitmapFactory.Options options = new BitmapFactory.Options(); - - // don't actually decode the picture, just return its bounds - options.inJustDecodeBounds = true; - BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); - - // test what the best sample size is - return Math.min(options.outWidth, options.outHeight); - } - - /** - * Finds the optimal sampleSize for loading the picture - * - * @param originalSmallerExtent Width or height of the picture, whichever is smaller - * @param targetExtent Width or height of the target view, whichever is bigger. - *

If either one of the parameters is 0 or smaller, no sampling is applied - */ - public static int findOptimalSampleSize(int originalSmallerExtent, int targetExtent) { - // If we don't know sizes, we can't do sampling. - if (targetExtent < 1) { - return 1; - } - if (originalSmallerExtent < 1) { - return 1; - } - - // Test what the best sample size is. To do that, we find the sample size that gives us - // the best trade-off between resulting image size and memory requirement. We allow - // the down-sampled image to be 20% smaller than the target size. That way we can get around - // unfortunate cases where e.g. a 720 picture is requested for 362 and not down-sampled at - // all. Why 20%? Why not. Prove me wrong. - int extent = originalSmallerExtent; - int sampleSize = 1; - while ((extent >> 1) >= targetExtent * 0.8f) { - sampleSize <<= 1; - extent >>= 1; - } - - return sampleSize; - } - - /** Decodes the bitmap with the given sample size */ - public static Bitmap decodeBitmapFromBytes(byte[] bytes, int sampleSize) { - final BitmapFactory.Options options; - if (sampleSize <= 1) { - options = null; - } else { - options = new BitmapFactory.Options(); - options.inSampleSize = sampleSize; - } - return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); - } - - /** - * Retrieves a copy of the specified drawable resource, rotated by a specified angle. - * - * @param resources The current resources. - * @param resourceId The resource ID of the drawable to rotate. - * @param angle The angle of rotation. - * @return Rotated drawable. - */ - public static Drawable getRotatedDrawable( - android.content.res.Resources resources, int resourceId, float angle) { - - // Get the original drawable and make a copy which will be rotated. - Bitmap original = BitmapFactory.decodeResource(resources, resourceId); - Bitmap rotated = - Bitmap.createBitmap(original.getWidth(), original.getHeight(), Bitmap.Config.ARGB_8888); - - // Perform the rotation. - Canvas tempCanvas = new Canvas(rotated); - tempCanvas.rotate(angle, original.getWidth() / 2, original.getHeight() / 2); - tempCanvas.drawBitmap(original, 0, 0, null); - - return new BitmapDrawable(resources, rotated); - } - - /** - * Given an input bitmap, scales it to the given width/height and makes it round. - * - * @param input {@link Bitmap} to scale and crop - * @param targetWidth desired output width - * @param targetHeight desired output height - * @return output bitmap scaled to the target width/height and cropped to an oval. The cropping - * algorithm will try to fit as much of the input into the output as possible, while - * preserving the target width/height ratio. - */ - public static Bitmap getRoundedBitmap(Bitmap input, int targetWidth, int targetHeight) { - if (input == null) { - return null; - } - final Bitmap.Config inputConfig = input.getConfig(); - final Bitmap result = - Bitmap.createBitmap( - targetWidth, targetHeight, inputConfig != null ? inputConfig : Bitmap.Config.ARGB_8888); - final Canvas canvas = new Canvas(result); - final Paint paint = new Paint(); - canvas.drawARGB(0, 0, 0, 0); - paint.setAntiAlias(true); - final RectF dst = new RectF(0, 0, targetWidth, targetHeight); - canvas.drawOval(dst, paint); - - // Specifies that only pixels present in the destination (i.e. the drawn oval) should - // be overwritten with pixels from the input bitmap. - paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); - - final int inputWidth = input.getWidth(); - final int inputHeight = input.getHeight(); - - // Choose the largest scale factor that will fit inside the dimensions of the - // input bitmap. - final float scaleBy = - Math.min((float) inputWidth / targetWidth, (float) inputHeight / targetHeight); - - final int xCropAmountHalved = (int) (scaleBy * targetWidth / 2); - final int yCropAmountHalved = (int) (scaleBy * targetHeight / 2); - - final Rect src = - new Rect( - inputWidth / 2 - xCropAmountHalved, - inputHeight / 2 - yCropAmountHalved, - inputWidth / 2 + xCropAmountHalved, - inputHeight / 2 + yCropAmountHalved); - - canvas.drawBitmap(input, src, dst, paint); - return result; - } -} diff --git a/java/com/android/contacts/common/util/ContactDisplayUtils.java b/java/com/android/contacts/common/util/ContactDisplayUtils.java index 1586784db..ff22f2880 100644 --- a/java/com/android/contacts/common/util/ContactDisplayUtils.java +++ b/java/com/android/contacts/common/util/ContactDisplayUtils.java @@ -16,21 +16,20 @@ package com.android.contacts.common.util; -import static android.provider.ContactsContract.CommonDataKinds.Phone; - import android.content.Context; import android.content.res.Resources; +import android.provider.ContactsContract.CommonDataKinds.Phone; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.TtsSpan; -import android.util.Log; import android.util.Patterns; import com.android.contacts.common.R; import com.android.contacts.common.compat.PhoneNumberUtilsCompat; import com.android.contacts.common.preference.ContactsPreferences; +import com.android.dialer.common.LogUtil; import java.util.Objects; /** Methods for handling various contact data labels. */ @@ -38,7 +37,6 @@ public class ContactDisplayUtils { public static final int INTERACTION_CALL = 1; public static final int INTERACTION_SMS = 2; - private static final String TAG = ContactDisplayUtils.class.getSimpleName(); /** * Checks if the given data type is a custom type. @@ -74,9 +72,9 @@ public class ContactDisplayUtils { } else { resId = getPhoneLabelResourceId(type); if (interactionType != INTERACTION_CALL) { - Log.e( - TAG, - "Un-recognized interaction type: " + LogUtil.e( + "ContactDisplayUtils.getLabelForCallOrSms", + "un-recognized interaction type: " + interactionType + ". Defaulting to ContactDisplayUtils.INTERACTION_CALL."); } diff --git a/java/com/android/contacts/common/util/DateUtils.java b/java/com/android/contacts/common/util/DateUtils.java index 1935d727a..09d52bce8 100644 --- a/java/com/android/contacts/common/util/DateUtils.java +++ b/java/com/android/contacts/common/util/DateUtils.java @@ -16,252 +16,11 @@ package com.android.contacts.common.util; -import android.content.Context; -import android.text.format.DateFormat; import android.text.format.Time; -import java.text.ParsePosition; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.Locale; -import java.util.TimeZone; /** Utility methods for processing dates. */ public class DateUtils { - public static final TimeZone UTC_TIMEZONE = TimeZone.getTimeZone("UTC"); - - /** - * When parsing a date without a year, the system assumes 1970, which wasn't a leap-year. Let's - * add a one-off hack for that day of the year - */ - public static final String NO_YEAR_DATE_FEB29TH = "--02-29"; - - // Variations of ISO 8601 date format. Do not change the order - it does affect the - // result in ambiguous cases. - private static final SimpleDateFormat[] DATE_FORMATS = { - CommonDateUtils.FULL_DATE_FORMAT, - CommonDateUtils.DATE_AND_TIME_FORMAT, - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'", Locale.US), - new SimpleDateFormat("yyyyMMdd", Locale.US), - new SimpleDateFormat("yyyyMMdd'T'HHmmssSSS'Z'", Locale.US), - new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.US), - new SimpleDateFormat("yyyyMMdd'T'HHmm'Z'", Locale.US), - }; - - static { - for (SimpleDateFormat format : DATE_FORMATS) { - format.setLenient(true); - format.setTimeZone(UTC_TIMEZONE); - } - CommonDateUtils.NO_YEAR_DATE_FORMAT.setTimeZone(UTC_TIMEZONE); - } - - /** - * Parses the supplied string to see if it looks like a date. - * - * @param string The string representation of the provided date - * @param mustContainYear If true, the string is parsed as a date containing a year. If false, the - * string is parsed into a valid date even if the year field is missing. - * @return A Calendar object corresponding to the date if the string is successfully parsed. If - * not, null is returned. - */ - public static Calendar parseDate(String string, boolean mustContainYear) { - ParsePosition parsePosition = new ParsePosition(0); - Date date; - if (!mustContainYear) { - final boolean noYearParsed; - // Unfortunately, we can't parse Feb 29th correctly, so let's handle this day seperately - if (NO_YEAR_DATE_FEB29TH.equals(string)) { - return getUtcDate(0, Calendar.FEBRUARY, 29); - } else { - synchronized (CommonDateUtils.NO_YEAR_DATE_FORMAT) { - date = CommonDateUtils.NO_YEAR_DATE_FORMAT.parse(string, parsePosition); - } - noYearParsed = parsePosition.getIndex() == string.length(); - } - - if (noYearParsed) { - return getUtcDate(date, true); - } - } - for (int i = 0; i < DATE_FORMATS.length; i++) { - SimpleDateFormat f = DATE_FORMATS[i]; - synchronized (f) { - parsePosition.setIndex(0); - date = f.parse(string, parsePosition); - if (parsePosition.getIndex() == string.length()) { - return getUtcDate(date, false); - } - } - } - return null; - } - - private static final Calendar getUtcDate(Date date, boolean noYear) { - final Calendar calendar = Calendar.getInstance(UTC_TIMEZONE, Locale.US); - calendar.setTime(date); - if (noYear) { - calendar.set(Calendar.YEAR, 0); - } - return calendar; - } - - private static final Calendar getUtcDate(int year, int month, int dayOfMonth) { - final Calendar calendar = Calendar.getInstance(UTC_TIMEZONE, Locale.US); - calendar.clear(); - calendar.set(Calendar.YEAR, year); - calendar.set(Calendar.MONTH, month); - calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); - return calendar; - } - - public static boolean isYearSet(Calendar cal) { - // use the Calendar.YEAR field to track whether or not the year is set instead of - // Calendar.isSet() because doing Calendar.get() causes Calendar.isSet() to become - // true irregardless of what the previous value was - return cal.get(Calendar.YEAR) > 1; - } - - /** - * Same as {@link #formatDate(Context context, String string, boolean longForm)}, with longForm - * set to {@code true} by default. - * - * @param context Valid context - * @param string String representation of a date to parse - * @return Returns the same date in a cleaned up format. If the supplied string does not look like - * a date, return it unchanged. - */ - public static String formatDate(Context context, String string) { - return formatDate(context, string, true); - } - - /** - * Parses the supplied string to see if it looks like a date. - * - * @param context Valid context - * @param string String representation of a date to parse - * @param longForm If true, return the date formatted into its long string representation. If - * false, return the date formatted using its short form representation (i.e. 12/11/2012) - * @return Returns the same date in a cleaned up format. If the supplied string does not look like - * a date, return it unchanged. - */ - public static String formatDate(Context context, String string, boolean longForm) { - if (string == null) { - return null; - } - - string = string.trim(); - if (string.length() == 0) { - return string; - } - final Calendar cal = parseDate(string, false); - - // we weren't able to parse the string successfully so just return it unchanged - if (cal == null) { - return string; - } - - final boolean isYearSet = isYearSet(cal); - final java.text.DateFormat outFormat; - if (!isYearSet) { - outFormat = getLocalizedDateFormatWithoutYear(context); - } else { - outFormat = - longForm ? DateFormat.getLongDateFormat(context) : DateFormat.getDateFormat(context); - } - synchronized (outFormat) { - outFormat.setTimeZone(UTC_TIMEZONE); - return outFormat.format(cal.getTime()); - } - } - - public static boolean isMonthBeforeDay(Context context) { - char[] dateFormatOrder = DateFormat.getDateFormatOrder(context); - for (int i = 0; i < dateFormatOrder.length; i++) { - if (dateFormatOrder[i] == 'd') { - return false; - } - if (dateFormatOrder[i] == 'M') { - return true; - } - } - return false; - } - - /** - * Returns a SimpleDateFormat object without the year fields by using a regular expression to - * eliminate the year in the string pattern. In the rare occurence that the resulting pattern - * cannot be reconverted into a SimpleDateFormat, it uses the provided context to determine - * whether the month field should be displayed before the day field, and returns either "MMMM dd" - * or "dd MMMM" converted into a SimpleDateFormat. - */ - public static java.text.DateFormat getLocalizedDateFormatWithoutYear(Context context) { - final String pattern = - ((SimpleDateFormat) SimpleDateFormat.getDateInstance(java.text.DateFormat.LONG)) - .toPattern(); - // Determine the correct regex pattern for year. - // Special case handling for Spanish locale by checking for "de" - final String yearPattern = - pattern.contains("de") ? "[^Mm]*[Yy]+[^Mm]*" : "[^DdMm]*[Yy]+[^DdMm]*"; - try { - // Eliminate the substring in pattern that matches the format for that of year - return new SimpleDateFormat(pattern.replaceAll(yearPattern, "")); - } catch (IllegalArgumentException e) { - return new SimpleDateFormat(DateUtils.isMonthBeforeDay(context) ? "MMMM dd" : "dd MMMM"); - } - } - - /** - * Given a calendar (possibly containing only a day of the year), returns the earliest possible - * anniversary of the date that is equal to or after the current point in time if the date does - * not contain a year, or the date converted to the local time zone (if the date contains a year. - * - * @param target The date we wish to convert(in the UTC time zone). - * @return If date does not contain a year (year < 1900), returns the next earliest anniversary - * that is after the current point in time (in the local time zone). Otherwise, returns the - * adjusted Date in the local time zone. - */ - public static Date getNextAnnualDate(Calendar target) { - final Calendar today = Calendar.getInstance(); - today.setTime(new Date()); - - // Round the current time to the exact start of today so that when we compare - // today against the target date, both dates are set to exactly 0000H. - today.set(Calendar.HOUR_OF_DAY, 0); - today.set(Calendar.MINUTE, 0); - today.set(Calendar.SECOND, 0); - today.set(Calendar.MILLISECOND, 0); - - final boolean isYearSet = isYearSet(target); - final int targetYear = target.get(Calendar.YEAR); - final int targetMonth = target.get(Calendar.MONTH); - final int targetDay = target.get(Calendar.DAY_OF_MONTH); - final boolean isFeb29 = (targetMonth == Calendar.FEBRUARY && targetDay == 29); - final GregorianCalendar anniversary = new GregorianCalendar(); - // Convert from the UTC date to the local date. Set the year to today's year if the - // there is no provided year (targetYear < 1900) - anniversary.set(!isYearSet ? today.get(Calendar.YEAR) : targetYear, targetMonth, targetDay); - // If the anniversary's date is before the start of today and there is no year set, - // increment the year by 1 so that the returned date is always equal to or greater than - // today. If the day is a leap year, keep going until we get the next leap year anniversary - // Otherwise if there is already a year set, simply return the exact date. - if (!isYearSet) { - int anniversaryYear = today.get(Calendar.YEAR); - if (anniversary.before(today) || (isFeb29 && !anniversary.isLeapYear(anniversaryYear))) { - // If the target date is not Feb 29, then set the anniversary to the next year. - // Otherwise, keep going until we find the next leap year (this is not guaranteed - // to be in 4 years time). - do { - anniversaryYear += 1; - } while (isFeb29 && !anniversary.isLeapYear(anniversaryYear)); - anniversary.set(anniversaryYear, targetMonth, targetDay); - } - } - return anniversary.getTime(); - } - /** * Determine the difference, in days between two dates. Uses similar logic as the {@link * android.text.format.DateUtils.getRelativeTimeSpanString} method. diff --git a/java/com/android/contacts/common/util/MaterialColorMapUtils.java b/java/com/android/contacts/common/util/MaterialColorMapUtils.java index a2d9847ec..bd32faa51 100644 --- a/java/com/android/contacts/common/util/MaterialColorMapUtils.java +++ b/java/com/android/contacts/common/util/MaterialColorMapUtils.java @@ -21,7 +21,6 @@ import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; import android.os.Trace; -import com.android.contacts.common.R; public class MaterialColorMapUtils { @@ -35,13 +34,6 @@ public class MaterialColorMapUtils { resources.obtainTypedArray(com.android.contacts.common.R.array.letter_tile_colors_dark); } - public static MaterialPalette getDefaultPrimaryAndSecondaryColors(Resources resources) { - final int primaryColor = resources.getColor(R.color.quickcontact_default_photo_tint_color); - final int secondaryColor = - resources.getColor(R.color.quickcontact_default_photo_tint_color_dark); - return new MaterialPalette(primaryColor, secondaryColor); - } - /** * Returns the hue component of a color int. * diff --git a/java/com/android/contacts/common/util/NameConverter.java b/java/com/android/contacts/common/util/NameConverter.java deleted file mode 100644 index ae3275d14..000000000 --- a/java/com/android/contacts/common/util/NameConverter.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.contacts.common.util; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.net.Uri.Builder; -import android.provider.ContactsContract; -import android.provider.ContactsContract.CommonDataKinds.StructuredName; -import android.text.TextUtils; -import com.android.contacts.common.model.dataitem.StructuredNameDataItem; -import java.util.Map; -import java.util.TreeMap; - -/** - * Utility class for converting between a display name and structured name (and vice-versa), via - * calls to the contact provider. - */ -public class NameConverter { - - /** The array of fields that comprise a structured name. */ - public static final String[] STRUCTURED_NAME_FIELDS = - new String[] { - StructuredName.PREFIX, - StructuredName.GIVEN_NAME, - StructuredName.MIDDLE_NAME, - StructuredName.FAMILY_NAME, - StructuredName.SUFFIX - }; - - /** - * Converts the given structured name (provided as a map from {@link StructuredName} fields to - * corresponding values) into a display name string. - * - *

Note that this operates via a call back to the ContactProvider, but it does not access the - * database, so it should be safe to call from the UI thread. See ContactsProvider2.completeName() - * for the underlying method call. - * - * @param context Activity context. - * @param structuredName The structured name map to convert. - * @return The display name computed from the structured name map. - */ - public static String structuredNameToDisplayName( - Context context, Map structuredName) { - Builder builder = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name"); - for (String key : STRUCTURED_NAME_FIELDS) { - if (structuredName.containsKey(key)) { - appendQueryParameter(builder, key, structuredName.get(key)); - } - } - return fetchDisplayName(context, builder.build()); - } - - /** - * Converts the given structured name (provided as ContentValues) into a display name string. - * - * @param context Activity context. - * @param values The content values containing values comprising the structured name. - */ - public static String structuredNameToDisplayName(Context context, ContentValues values) { - Builder builder = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name"); - for (String key : STRUCTURED_NAME_FIELDS) { - if (values.containsKey(key)) { - appendQueryParameter(builder, key, values.getAsString(key)); - } - } - return fetchDisplayName(context, builder.build()); - } - - /** Helper method for fetching the display name via the given URI. */ - private static String fetchDisplayName(Context context, Uri uri) { - String displayName = null; - Cursor cursor = - context - .getContentResolver() - .query( - uri, - new String[] { - StructuredName.DISPLAY_NAME, - }, - null, - null, - null); - - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - displayName = cursor.getString(0); - } - } finally { - cursor.close(); - } - } - return displayName; - } - - /** - * Converts the given display name string into a structured name (as a map from {@link - * StructuredName} fields to corresponding values). - * - *

Note that this operates via a call back to the ContactProvider, but it does not access the - * database, so it should be safe to call from the UI thread. - * - * @param context Activity context. - * @param displayName The display name to convert. - * @return The structured name map computed from the display name. - */ - public static Map displayNameToStructuredName( - Context context, String displayName) { - Map structuredName = new TreeMap(); - Builder builder = ContactsContract.AUTHORITY_URI.buildUpon().appendPath("complete_name"); - - appendQueryParameter(builder, StructuredName.DISPLAY_NAME, displayName); - Cursor cursor = - context - .getContentResolver() - .query(builder.build(), STRUCTURED_NAME_FIELDS, null, null, null); - - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - for (int i = 0; i < STRUCTURED_NAME_FIELDS.length; i++) { - structuredName.put(STRUCTURED_NAME_FIELDS[i], cursor.getString(i)); - } - } - } finally { - cursor.close(); - } - } - return structuredName; - } - - /** - * Converts the given display name string into a structured name (inserting the structured values - * into a new or existing ContentValues object). - * - *

Note that this operates via a call back to the ContactProvider, but it does not access the - * database, so it should be safe to call from the UI thread. - * - * @param context Activity context. - * @param displayName The display name to convert. - * @param contentValues The content values object to place the structured name values into. If - * null, a new one will be created and returned. - * @return The ContentValues object containing the structured name fields derived from the display - * name. - */ - public static ContentValues displayNameToStructuredName( - Context context, String displayName, ContentValues contentValues) { - if (contentValues == null) { - contentValues = new ContentValues(); - } - Map mapValues = displayNameToStructuredName(context, displayName); - for (String key : mapValues.keySet()) { - contentValues.put(key, mapValues.get(key)); - } - return contentValues; - } - - private static void appendQueryParameter(Builder builder, String field, String value) { - if (!TextUtils.isEmpty(value)) { - builder.appendQueryParameter(field, value); - } - } - - /** - * Parses phonetic name and returns parsed data (family, middle, given) as ContentValues. Parsed - * data should be {@link StructuredName#PHONETIC_FAMILY_NAME}, {@link - * StructuredName#PHONETIC_MIDDLE_NAME}, and {@link StructuredName#PHONETIC_GIVEN_NAME}. If this - * method cannot parse given phoneticName, null values will be stored. - * - * @param phoneticName Phonetic name to be parsed - * @param values ContentValues to be used for storing data. If null, new instance will be created. - * @return ContentValues with parsed data. Those data can be null. - */ - public static StructuredNameDataItem parsePhoneticName( - String phoneticName, StructuredNameDataItem item) { - String family = null; - String middle = null; - String given = null; - - if (!TextUtils.isEmpty(phoneticName)) { - String[] strings = phoneticName.split(" ", 3); - switch (strings.length) { - case 1: - family = strings[0]; - break; - case 2: - family = strings[0]; - given = strings[1]; - break; - case 3: - family = strings[0]; - middle = strings[1]; - given = strings[2]; - break; - } - } - - if (item == null) { - item = new StructuredNameDataItem(); - } - item.setPhoneticFamilyName(family); - item.setPhoneticMiddleName(middle); - item.setPhoneticGivenName(given); - return item; - } - - /** Constructs and returns a phonetic full name from given parts. */ - public static String buildPhoneticName(String family, String middle, String given) { - if (!TextUtils.isEmpty(family) || !TextUtils.isEmpty(middle) || !TextUtils.isEmpty(given)) { - StringBuilder sb = new StringBuilder(); - if (!TextUtils.isEmpty(family)) { - sb.append(family.trim()).append(' '); - } - if (!TextUtils.isEmpty(middle)) { - sb.append(middle.trim()).append(' '); - } - if (!TextUtils.isEmpty(given)) { - sb.append(given.trim()).append(' '); - } - sb.setLength(sb.length() - 1); // Yank the last space - return sb.toString(); - } else { - return null; - } - } -} diff --git a/java/com/android/contacts/common/util/StopWatch.java b/java/com/android/contacts/common/util/StopWatch.java index b944b9867..7986d1081 100644 --- a/java/com/android/contacts/common/util/StopWatch.java +++ b/java/com/android/contacts/common/util/StopWatch.java @@ -16,7 +16,7 @@ package com.android.contacts.common.util; -import android.util.Log; +import com.android.dialer.common.LogUtil; import java.util.ArrayList; /** A {@link StopWatch} records start, laps and stop, and print them to logcat. */ @@ -37,11 +37,6 @@ public class StopWatch { return new StopWatch(label); } - /** Return a dummy instance that does no operations. */ - public static StopWatch getNullStopWatch() { - return NullStopWatch.INSTANCE; - } - /** Record a lap. */ public void lap(String lapLabel) { mTimes.add(System.currentTimeMillis()); @@ -76,25 +71,6 @@ public class StopWatch { sb.append(" "); last = current; } - Log.v(TAG, sb.toString()); - } - - private static class NullStopWatch extends StopWatch { - - public static final NullStopWatch INSTANCE = new NullStopWatch(); - - public NullStopWatch() { - super(null); - } - - @Override - public void lap(String lapLabel) { - // noop - } - - @Override - public void stopAndLog(String TAG, int timeThresholdToLog) { - // noop - } + LogUtil.v(TAG, sb.toString()); } } diff --git a/java/com/android/contacts/common/util/TelephonyManagerUtils.java b/java/com/android/contacts/common/util/TelephonyManagerUtils.java index b664268ca..e4c2c6373 100644 --- a/java/com/android/contacts/common/util/TelephonyManagerUtils.java +++ b/java/com/android/contacts/common/util/TelephonyManagerUtils.java @@ -33,13 +33,4 @@ public class TelephonyManagerUtils { final String voiceMailLabel = telephonyManager.getVoiceMailAlphaTag(); return voiceMailLabel; } - - /** - * @param context Current application context. - * @return True if there is a subscription which supports video calls. False otherwise. - */ - public static boolean hasVideoCallSubscription(Context context) { - // TODO: Check the telephony manager's subscriptions to see if any support video calls. - return true; - } } diff --git a/java/com/android/contacts/common/util/TrafficStatsTags.java b/java/com/android/contacts/common/util/TrafficStatsTags.java deleted file mode 100644 index b0e7fb583..000000000 --- a/java/com/android/contacts/common/util/TrafficStatsTags.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.contacts.common.util; - -public class TrafficStatsTags { - - public static final int CONTACT_PHOTO_DOWNLOAD_TAG = 0x0001; - public static final int TAG_MAX = 0x9999; -} diff --git a/java/com/android/contacts/common/util/UriUtils.java b/java/com/android/contacts/common/util/UriUtils.java deleted file mode 100644 index 4690942ba..000000000 --- a/java/com/android/contacts/common/util/UriUtils.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.contacts.common.util; - -import android.net.Uri; -import android.provider.ContactsContract; -import java.util.List; - -/** Utility methods for dealing with URIs. */ -public class UriUtils { - - /** Static helper, not instantiable. */ - private UriUtils() {} - - /** Checks whether two URI are equal, taking care of the case where either is null. */ - public static boolean areEqual(Uri uri1, Uri uri2) { - if (uri1 == null && uri2 == null) { - return true; - } - if (uri1 == null || uri2 == null) { - return false; - } - return uri1.equals(uri2); - } - - /** Parses a string into a URI and returns null if the given string is null. */ - public static Uri parseUriOrNull(String uriString) { - if (uriString == null) { - return null; - } - return Uri.parse(uriString); - } - - /** Converts a URI into a string, returns null if the given URI is null. */ - public static String uriToString(Uri uri) { - return uri == null ? null : uri.toString(); - } - - public static boolean isEncodedContactUri(Uri uri) { - if (uri == null) { - return false; - } - final String lastPathSegment = uri.getLastPathSegment(); - if (lastPathSegment == null) { - return false; - } - return lastPathSegment.equals(Constants.LOOKUP_URI_ENCODED); - } - - /** - * @return {@code uri} as-is if the authority is of contacts provider. Otherwise or {@code uri} is - * null, return null otherwise - */ - public static Uri nullForNonContactsUri(Uri uri) { - if (uri == null) { - return null; - } - return ContactsContract.AUTHORITY.equals(uri.getAuthority()) ? uri : null; - } - - /** Parses the given URI to determine the original lookup key of the contact. */ - public static String getLookupKeyFromUri(Uri lookupUri) { - // Would be nice to be able to persist the lookup key somehow to avoid having to parse - // the uri entirely just to retrieve the lookup key, but every uri is already parsed - // once anyway to check if it is an encoded JSON uri, so this has negligible effect - // on performance. - if (lookupUri != null && !UriUtils.isEncodedContactUri(lookupUri)) { - final List segments = lookupUri.getPathSegments(); - // This returns the third path segment of the uri, where the lookup key is located. - // See {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}. - return (segments.size() < 3) ? null : Uri.encode(segments.get(2)); - } else { - return null; - } - } -} diff --git a/java/com/android/dialer/about/AndroidManifest.xml b/java/com/android/dialer/about/AndroidManifest.xml index e9489ce1e..85c750826 100644 --- a/java/com/android/dialer/about/AndroidManifest.xml +++ b/java/com/android/dialer/about/AndroidManifest.xml @@ -1,6 +1,6 @@ - + - - - diff --git a/java/com/android/dialer/about/res/raw/keep.xml b/java/com/android/dialer/about/res/raw/keep.xml index e41b8b8d0..9215627d1 100644 --- a/java/com/android/dialer/about/res/raw/keep.xml +++ b/java/com/android/dialer/about/res/raw/keep.xml @@ -16,4 +16,3 @@ --> - diff --git a/java/com/android/dialer/about/res/raw/third_party_license_metadata b/java/com/android/dialer/about/res/raw/third_party_license_metadata old mode 100644 new mode 100755 index 1acf3480c..10ed4a2ab --- a/java/com/android/dialer/about/res/raw/third_party_license_metadata +++ b/java/com/android/dialer/about/res/raw/third_party_license_metadata @@ -1,34 +1,38 @@ 40:10695 Android Annotations Support Library -10770:10695 Android Compat Support Library -21501:10695 Android Core UI Support Library -32235:10691 Android Core Utils Support Library -42961:10695 Android Design Support Library -53694:10695 Android Fragments Support Library -64426:10695 Android Graphics Support Library -75162:10691 Android Media Compat Support Library -85892:10691 Android Transition Support Library -96621:10695 Android Compatibility Library v13 -107353:10695 Android Compatibility Library v4 -118085:10695 Android Compatibility Library v7 -128796:16013 Android SDK -144828:11358 Android Common -156196:4771 Glide -160982:11358 Guava JDK5 -172358:12847 jibercsclient -185224:10173 libphonenumber -195416:10699 shortcutbadger -206126:11358 Volley -217495:18982 mime4j -236493:11358 Google Auto -247862:11358 Dagger -259236:11357 Error Prone -270604:11358 J2ObjC -281984:11359 Apache Commons IO -293355:11358 JSR 250 -304725:1602 JSR 305 -306339:11365 JSR 330 -317738:12847 carrierservices -317738:12847 rcsclientlib -330614:11358 material_components -330614:11358 lib -341987:11362 Guava JDK7 +10754:11358 Android Common +22147:10695 Android Compat Support Library +32880:10695 Android Compatibility Library v13 +43612:10695 Android Compatibility Library v4 +54344:10695 Android Compatibility Library v7 +65075:10695 Android Core UI Support Library +75809:10691 Android Core Utils Support Library +86535:10695 Android Design Support Library +97276:10695 Android Dynamic Animation Support Library +108009:10695 Android Fragments Support Library +118741:10695 Android Graphics Support Library +129477:10691 Android Media Compat Support Library +140207:10691 Android Transition Support Library +150920:11359 Apache Commons IO +162290:11358 Dagger +173664:11357 Error Prone +185037:11358 Google Auto +196410:11358 Guava JDK5 +207783:11362 Guava JDK7 +219156:11358 J2ObjC +230526:11358 JSR 250 +241896:11365 JSR 330 +253297:11358 Material Components for Android +264666:11358 OkHttp +276033:11358 Okio +287402:11358 Volley +298780:12847 carrierservices +311636:10402 gRPC +322058:11358 instrumentation +333434:12847 jibercsclient +346300:10173 libphonenumber +356484:18982 mime4j +375485:10699 shortcutbadger +386200:16013 Android SDK +402232:1096 Animal Sniffer +403338:4771 Glide +408121:1602 JSR 305 diff --git a/java/com/android/dialer/about/res/raw/third_party_licenses b/java/com/android/dialer/about/res/raw/third_party_licenses old mode 100644 new mode 100755 index c56f8a42c..51f548288 --- a/java/com/android/dialer/about/res/raw/third_party_licenses +++ b/java/com/android/dialer/about/res/raw/third_party_licenses @@ -194,19 +194,7 @@ Android Annotations Support Library: -Android Compat Support Library: - - - Copyright (c) 2005-2011, The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Android Common: Apache License @@ -386,9 +374,33 @@ Android Compat Support Library: END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] -Android Core UI Support Library: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Android Compat Support Library: Copyright (c) 2005-2011, The Android Open Source Project @@ -582,10 +594,10 @@ Android Core UI Support Library: -Android Core Utils Support Library: +Android Compatibility Library v13: - Copyright (c) 2005-2011, The Android Open Source Project + Copyright (c) 2005-2011, The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -774,7 +786,9 @@ Android Core Utils Support Library: END OF TERMS AND CONDITIONS -Android Design Support Library: + + +Android Compatibility Library v4: Copyright (c) 2005-2011, The Android Open Source Project @@ -968,7 +982,7 @@ Android Design Support Library: -Android Fragments Support Library: +Android Compatibility Library v7: Copyright (c) 2005-2011, The Android Open Source Project @@ -1162,7 +1176,7 @@ Android Fragments Support Library: -Android Graphics Support Library: +Android Core UI Support Library: Copyright (c) 2005-2011, The Android Open Source Project @@ -1356,7 +1370,7 @@ Android Graphics Support Library: -Android Media Compat Support Library: +Android Core Utils Support Library: Copyright (c) 2005-2011, The Android Open Source Project @@ -1548,10 +1562,10 @@ Android Media Compat Support Library: END OF TERMS AND CONDITIONS -Android Transition Support Library: +Android Design Support Library: - Copyright (c) 2005-2011, The Android Open Source Project + Copyright (c) 2005-2011, The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -1740,7 +1754,9 @@ Android Transition Support Library: END OF TERMS AND CONDITIONS -Android Compatibility Library v13: + + +Android Dynamic Animation Support Library: Copyright (c) 2005-2011, The Android Open Source Project @@ -1934,7 +1950,7 @@ Android Compatibility Library v13: -Android Compatibility Library v4: +Android Fragments Support Library: Copyright (c) 2005-2011, The Android Open Source Project @@ -2128,7 +2144,7 @@ Android Compatibility Library v4: -Android Compatibility Library v7: +Android Graphics Support Library: Copyright (c) 2005-2011, The Android Open Source Project @@ -2322,278 +2338,211 @@ Android Compatibility Library v7: -Android SDK: +Android Media Compat Support Library: -ANDROID SOFTWARE DEVELOPMENT KIT -Terms and Conditions + Copyright (c) 2005-2011, The Android Open Source Project -This is the Android Software Development Kit License Agreement. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. -1. Introduction + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -1.1 The Android Software Development Kit (referred to in this License Agreement as the "SDK" and -specifically including the Android system files, packaged APIs, and Google APIs add-ons) is -licensed to you subject to the terms of this License Agreement. This License Agreement forms a -legally binding contract between you and Google in relation to your use of the SDK. -1.2 "Google" means Google Inc., a Delaware corporation with principal place of business at 1600 -Amphitheatre Parkway, Mountain View, CA 94043, United States. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -2. Accepting this License Agreement + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -2.1 In order to use the SDK, you must first agree to this License Agreement. You may not use the -SDK if you do not accept this License Agreement. + 1. Definitions. -2.2 You can accept this License Agreement by: + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -(A) clicking to accept or agree to this License Agreement, where this option is made available to -you; or + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -(B) by actually using the SDK. In this case, you agree that use of the SDK constitutes acceptance of -the Licensing Agreement from that point onwards. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -2.3 You may not use the SDK and may not accept the Licensing Agreement if you are a person barred -from receiving the SDK under the laws of the United States or other countries including the country -in which you are resident or from which you use the SDK. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -2.4 If you are agreeing to be bound by this License Agreement on behalf of your employer or other -entity, you represent and warrant that you have full legal authority to bind your employer or such -entity to this License Agreement. If you do not have the requisite authority, you may not accept -the Licensing Agreement or use the SDK on behalf of your employer or other entity. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -3. SDK License from Google + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -3.1 Subject to the terms of this License Agreement, Google grants you a limited, worldwide, -royalty-free, non- assignable and non-exclusive license to use the SDK solely to develop -applications to run on the Android platform. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -3.2 You agree that Google or third parties own all legal right, title and interest in and to the -SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property -Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, -and any and all other proprietary rights. Google reserves all rights not expressly granted to you. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -3.3 Except to the extent required by applicable third party licenses, you may not copy (except for -backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create -derivative works of the SDK or any part of the SDK. Except to the extent required by applicable -third party licenses, you may not load any part of the SDK onto a mobile handset or any other -hardware device except a personal computer, combine any part of the SDK with other software, or -distribute any software or device incorporating a part of the SDK. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -3.4 Use, reproduction and distribution of components of the SDK licensed under an open source -software license are governed solely by the terms of that open source software license and not -this License Agreement. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -3.5 You agree that the form and nature of the SDK that Google provides may change without prior -notice to you and that future versions of the SDK may be incompatible with applications developed -on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) -providing the SDK (or any features within the SDK) to you or to users generally at Google's sole -discretion, without prior notice to you. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -3.6 Nothing in this License Agreement gives you a right to use any of Google's trade names, -trademarks, service marks, logos, domain names, or other distinctive brand features. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -3.7 You agree that you will not remove, obscure, or alter any proprietary rights notices (including -copyright and trademark notices) that may be affixed to or contained within the SDK. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -4. Use of the SDK by You + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under -this License Agreement in or to any software applications that you develop using the SDK, including -any intellectual property rights that subsist in those applications. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) this -License Agreement and (b) any applicable law, regulation or generally accepted practices or -guidelines in the relevant jurisdictions (including any laws regarding the export of data or -software to and from the United States or other relevant countries). + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -4.3 You agree that if you use the SDK to develop applications for general public users, you will -protect the privacy and legal rights of those users. If the users provide you with user names, -passwords, or other login information or personal information, your must make the users aware that -the information will be available to your application, and you must provide legally adequate privacy -notice and protection for those users. If your application stores personal or sensitive information -provided by users, it must do so securely. If the user provides your application with Google Account -information, your application may only use that information to access the user's Google Account -when, and for the limited purposes for which, the user has given you permission to do so. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -4.4 You agree that you will not engage in any activity with the SDK, including the development or -distribution of an application, that interferes with, disrupts, damages, or accesses in an -unauthorized manner the servers, networks, or other properties or services of any third party -including, but not limited to, Google or any mobile communications carrier. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or -to any third party for) any data, content, or resources that you create, transmit or display through -the Android platform and/or applications for the Android platform, and for the consequences of your -actions (including any loss or damage which Google may suffer) by doing so. - -4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or -to any third party for) any breach of your obligations under this License Agreement, any applicable -third party contract or Terms of Service, or any applicable law or regulation, and for the -consequences (including any loss or damage which Google or any third party may suffer) of any such -breach. - -5. Your Developer Credentials - -5.1 You agree that you are responsible for maintaining the confidentiality of any developer -credentials that may be issued to you by Google or which you may choose yourself and that you will -be solely responsible for all applications that are developed under your developer credentials. - -6. Privacy and Information - -6.1 In order to continually innovate and improve the SDK, Google may collect certain usage -statistics from the software including but not limited to a unique identifier, associated IP -address, version number of the software, and information on which tools and/or services in the SDK -are being used and how they are being used. Before any of this information is collected, the SDK -will notify you and seek your consent. If you withhold consent, the information will not be -collected. - -6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in -accordance with Google's Privacy Policy. - -7. Third Party Applications for the Android Platform - -7.1 If you use the SDK to run applications developed by a third party or that access data, content -or resources provided by a third party, you agree that Google is not responsible for those -applications, data, content, or resources. You understand that all data, content or resources which -you may access through such third party applications are the sole responsibility of the person from -which they originated and that Google is not liable for any loss or damage that you may experience -as a result of the use or access of any of those third party applications, data, content, or -resources. - -7.2 You should be aware the data, content, and resources presented to you through such a third party -application may be protected by intellectual property rights which are owned by the providers (or by -other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute -or create derivative works based on these data, content, or resources (either in whole or in part) -unless you have been specifically given permission to do so by the relevant owners. - -7.3 You acknowledge that your use of such third party applications, data, content, or resources may -be subject to separate terms between you and the relevant third party. In that case, this License -Agreement does not affect your legal relationship with these third parties. - -8. Using Android APIs - -8.1 Google Data APIs - -8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be -protected by intellectual property rights which are owned by Google or those parties that provide -the data (or by other persons or companies on their behalf). Your use of any such API may be subject -to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create -derivative works based on this data (either in whole or in part) unless allowed by the relevant -Terms of Service. - -8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you -shall retrieve data only with the user's explicit consent and only when, and for the limited -purposes for which, the user has given you permission to do so. - -9. Terminating this License Agreement - -9.1 This License Agreement will continue to apply until terminated by either you or Google as set -out below. - -9.2 If you want to terminate this License Agreement, you may do so by ceasing your use of the SDK -and any relevant developer credentials. - -9.3 Google may at any time, terminate this License Agreement with you if: - -(A) you have breached any provision of this License Agreement; or - -(B) Google is required to do so by law; or - -(C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated -its relationship with Google or ceased to offer certain parts of the SDK to you; or - -(D) Google decides to no longer providing the SDK or certain parts of the SDK to users in the -country in which you are resident or from which you use the service, or the provision of the SDK or -certain SDK services to you by Google is, in Google's sole discretion, no longer commercially -viable. - -9.4 When this License Agreement comes to an end, all of the legal rights, obligations and -liabilities that you and Google have benefited from, been subject to (or which have accrued over -time whilst this License Agreement has been in force) or which are expressed to continue -indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall -continue to apply to such rights, obligations and liabilities indefinitely. - -10. DISCLAIMER OF WARRANTIES - -10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE -SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. - -10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE -SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR -COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. - -10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - -11. LIMITATION OF LIABILITY - -11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS -LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY -LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN -AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING. - -12. Indemnification - -12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless -Google, its affiliates and their respective directors, officers, employees and agents from and -against any and all claims, actions, suits or proceedings, as well as any and all losses, -liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or -accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any -copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any -person or defames any person or violates their rights of publicity or privacy, and (c) any -non-compliance by you with this License Agreement. - -13. Changes to the License Agreement - -13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. -When these changes are made, Google will make a new version of the License Agreement available on -the website where the SDK is made available. - -14. General Legal Terms + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -14.1 This License Agreement constitute the whole legal agreement between you and Google and govern -your use of the SDK (excluding any services which Google may provide to you under a separate written -agreement), and completely replace any prior agreements between you and Google in relation to the -SDK. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is -contained in this License Agreement (or which Google has the benefit of under any applicable law), -this will not be taken to be a formal waiver of Google's rights and that those rights or remedies -will still be available to Google. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision -of this License Agreement is invalid, then that provision will be removed from this License -Agreement without affecting the rest of this License Agreement. The remaining provisions of this -License Agreement will continue to be valid and enforceable. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -14.4 You acknowledge and agree that each member of the group of companies of which Google is the -parent shall be third party beneficiaries to this License Agreement and that such other companies -shall be entitled to directly enforce, and rely upon, any provision of this License Agreement that -confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall -be third party beneficiaries to this License Agreement. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST -COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE -LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. + END OF TERMS AND CONDITIONS -14.6 The rights granted in this License Agreement may not be assigned or transferred by either you -or Google without the prior written approval of the other party. Neither you nor Google shall be -permitted to delegate their responsibilities or obligations under this License Agreement without the -prior written approval of the other party. +Android Transition Support Library: -14.7 This License Agreement, and your relationship with Google under this License Agreement, shall -be governed by the laws of the State of California without regard to its conflict of laws -provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located -within the county of Santa Clara, California to resolve any legal matter arising from this License -Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for -injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. -April 10, 2009 + Copyright (c) 2005-2011, The Android Open Source Project + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. -Android Common: + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. Apache License @@ -2773,163 +2722,37 @@ Android Common: END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. +Apache Commons IO: - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - http://www.apache.org/licenses/LICENSE-2.0 + 1. Definitions. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Glide: + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Covers library/ + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Copyright 2014 Google, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are -permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list - of conditions and the following disclaimer in the documentation and/or other materials - provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY GOOGLE, INC. ``AS IS'' AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE, INC. OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation are those of the -authors and should not be interpreted as representing official policies, either expressed -or implied, of Google, Inc. - --------------------------------------------------------------------------- -Covers third_party/gif_decoder - -Copyright (c) 2013 Xcellent Creations, Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------- -Covers third_party/disklrucache - -Copyright 2012 Jake Wharton -Copyright 2011 The Android Open Source Project - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. --------------------------------------------------------------------------- -Covers third_party/gif_encoder/AnimatedGifEncoder.java and -third_party/gif_encoder/LZWEncoder.java: - -No copyright asserted on the source code of this class. May be used for any -purpose, however, refer to the Unisys LZW patent for restrictions on use of -the associated LZWEncoder class. Please forward any corrections to -kweiner@fmsware.com. - ------------------------------------------------------------------------------ -Covers third_party/gif_encoder/NeuQuant.java - -Copyright (c) 1994 Anthony Dekker - -NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994. See -"Kohonen neural networks for optimal colour quantization" in "Network: -Computation in Neural Systems" Vol. 5 (1994) pp 351-367. for a discussion of -the algorithm. - -Any party obtaining a copy of these files from the author, directly or -indirectly, is granted, free of charge, a full and unrestricted irrevocable, -world-wide, paid up, royalty-free, nonexclusive right and license to deal in -this software and documentation files (the "Software"), including without -limitation the rights to use, copy, modify, merge, publish, distribute, -sublicense, and/or sell copies of the Software, and to permit persons who -receive copies from any such party to do so, with the only requirement being -that this copyright notice remain intact. - - -Guava JDK5: - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but @@ -3105,31 +2928,8 @@ Guava JDK5: limitations under the License. -jibercsclient: - -These components - com.google.android.rcs.core, - com.google.android.rcs.core.utils.CaseInsensitiveMap, - com.google.android.rcs.core.utils.DateTime, - com.google.android.rcs.core.utils.InetAddresses, - com.google.android.rcs.core.network.ConnectivityMonitor, - com.google.android.rcs.client.PrivateDataStorage, - com.google.android.rcs.client.utils.FastXmlSerializer, - com.google.android.rcs.client.utils.XmlUtils, - com.google.android.rcs.client.utils.QueuedWork -are licensed under Apache v2. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +Dagger: Apache License @@ -3309,42 +3109,33 @@ limitations under the License. END OF TERMS AND CONDITIONS -=============================================================================== + APPENDIX: How to apply the Apache License to your work. -These components - com.google.android.rcs.core.utils.FastBase64, - com.google.android.rcs.core.utils.LibraryLoaderHelper -are licensed under BSD. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + Copyright [yyyy] [name of copyright owner] - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + http://www.apache.org/licenses/LICENSE-2.0 -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -libphonenumber: +Error Prone: Apache License Version 2.0, January 2004 @@ -3523,20 +3314,33 @@ libphonenumber: END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. -shortcutbadger: + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + Copyright [yyyy] [name of copyright owner] - http://www.apache.org/licenses/LICENSE-2.0 + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Google Auto: Apache License @@ -3716,20 +3520,45 @@ limitations under the License. END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. -Volley: - + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ + Copyright [yyyy] [name of copyright owner] - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - 1. Definitions. + http://www.apache.org/licenses/LICENSE-2.0 - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +Guava JDK5: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. @@ -3923,7 +3752,8 @@ Volley: limitations under the License. -mime4j: +Guava JDK7: + Apache License Version 2.0, January 2004 @@ -4101,194 +3931,35 @@ mime4j: of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS - - - - THIS PRODUCT ALSO INCLUDES THIRD PARTY SOFTWARE REDISTRIBUTED UNDER THE - FOLLOWING LICENSES: + APPENDIX: How to apply the Apache License to your work. - Apache Commons Logging, - The Apache Software License, Version 1.1 (commons-logging-1.1.1.jar) - - The Apache Software License, Version 1.1 - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - 3. The end-user documentation included with the redistribution, - if any, must include the following acknowledgment: - "This product includes software developed by the - Apache Software Foundation (http://www.apache.org/)." - Alternately, this acknowledgment may appear in the software itself, - if and wherever such third-party acknowledgments normally appear. - - 4. The names "Apache" and "Apache Software Foundation" must - not be used to endorse or promote products derived from this - software without prior written permission. For written - permission, please contact apache@apache.org. - - 5. Products derived from this software may not be called "Apache", - nor may "Apache" appear in their name, without prior written - permission of the Apache Software Foundation. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - Test messages from the Perl-MIME-Tools project, - - The "Artistic License" - - Preamble - - The intent of this document is to state the conditions under which a - Package may be copied, such that the Copyright Holder maintains some - semblance of artistic control over the development of the package, - while giving the users of the package the right to use and distribute - the Package in a more-or-less customary fashion, plus the right to make - reasonable modifications. - - Definitions: - - "Package" refers to the collection of files distributed by the - Copyright Holder, and derivatives of that collection of files - created through textual modification. - - "Standard Version" refers to such a Package if it has not been - modified, or has been modified in accordance with the wishes - of the Copyright Holder as specified below. - - "Copyright Holder" is whoever is named in the copyright or - copyrights for the package. - - "You" is you, if you're thinking about copying or distributing - this Package. - - "Reasonable copying fee" is whatever you can justify on the - basis of media cost, duplication charges, time of people involved, - and so on. (You will not be required to justify it to the - Copyright Holder, but only to the computing community at large - as a market that must bear the fee.) - - "Freely Available" means that no fee is charged for the item - itself, though there may be fees involved in handling the item. - It also means that recipients of the item may redistribute it - under the same conditions they received it. - - 1. You may make and give away verbatim copies of the source form of the - Standard Version of this Package without restriction, provided that you - duplicate all of the original copyright notices and associated disclaimers. - - 2. You may apply bug fixes, portability fixes and other modifications - derived from the Public Domain or from the Copyright Holder. A Package - modified in such a way shall still be considered the Standard Version. - - 3. You may otherwise modify your copy of this Package in any way, provided - that you insert a prominent notice in each changed file stating how and - when you changed that file, and provided that you do at least ONE of the - following: - - a) place your modifications in the Public Domain or otherwise make them - Freely Available, such as by posting said modifications to Usenet or - an equivalent medium, or placing the modifications on a major archive - site such as uunet.uu.net, or by allowing the Copyright Holder to include - your modifications in the Standard Version of the Package. - - b) use the modified Package only within your corporation or organization. - - c) rename any non-standard executables so the names do not conflict - with standard executables, which must also be provided, and provide - a separate manual page for each non-standard executable that clearly - documents how it differs from the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - - 4. You may distribute the programs of this Package in object code or - executable form, provided that you do at least ONE of the following: - - a) distribute a Standard Version of the executables and library files, - together with instructions (in the manual page or equivalent) on where - to get the Standard Version. - - b) accompany the distribution with the machine-readable source of - the Package with your modifications. - - c) give non-standard executables non-standard names, and clearly - document the differences in manual pages (or equivalent), together - with instructions on where to get the Standard Version. - - d) make other distribution arrangements with the Copyright Holder. - - 5. You may charge a reasonable copying fee for any distribution of this - Package. You may charge any fee you choose for support of this - Package. You may not charge a fee for this Package itself. However, - you may distribute this Package in aggregate with other (possibly - commercial) programs as part of a larger (possibly commercial) software - distribution provided that you do not advertise this Package as a - product of your own. You may embed this Package's interpreter within - an executable of yours (by linking); this shall be construed as a mere - form of aggregation, provided that the complete Standard Version of the - interpreter is so embedded. - - 6. The scripts and library files supplied as input to or produced as - output from the programs of this Package do not automatically fall - under the copyright of this Package, but belong to whoever generated - them, and may be sold commercially, and may be aggregated with this - Package. If such scripts or library files are aggregated with this - Package via the so-called "undump" or "unexec" methods of producing a - binary executable image, then distribution of such an image shall - neither be construed as a distribution of this Package nor shall it - fall under the restrictions of Paragraphs 3 and 4, provided that you do - not represent such an executable image as a Standard Version of this - Package. - - 7. C subroutines (or comparably compiled subroutines in other - languages) supplied by you and linked into this Package in order to - emulate subroutines and variables of the language defined by this - Package shall not be considered part of this Package, but are the - equivalent of input as in Paragraph 6, provided these subroutines do - not change the language in any way that would cause it to fail the - regression tests for the language. - - 8. Aggregation of this Package with a commercial distribution is always - permitted provided that the use of this Package is embedded; that is, - when no overt attempt is made to make this Package's interfaces visible - to the end user of the commercial distribution. Such use shall not be - construed as a distribution of this Package. - - 9. The name of the Copyright Holder may not be used to endorse or promote - products derived from this software without specific prior written permission. - - 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - - The End + Copyright [yyyy] [name of copyright owner] - - + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + -Google Auto: + +J2ObjC: Apache License @@ -4494,7 +4165,7 @@ Google Auto: limitations under the License. -Dagger: +JSR 250: Apache License @@ -4700,8 +4371,9 @@ Dagger: limitations under the License. -Error Prone: +JSR 330: +JSR-330 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -4905,7 +4577,7 @@ Error Prone: limitations under the License. -J2ObjC: +Material Components for Android: Apache License @@ -5111,7 +4783,7 @@ J2ObjC: limitations under the License. -Apache Commons IO: +OkHttp: Apache License @@ -5317,8 +4989,7 @@ Apache Commons IO: limitations under the License. - -JSR 250: +Okio: Apache License @@ -5524,46 +5195,14 @@ JSR 250: limitations under the License. -JSR 305: +Volley: -Copyright (c) 2007-2009, JSR305 expert group -All rights reserved. -http://www.opensource.org/licenses/bsd-license.php + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the JSR305 expert group nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - -JSR 330: - -JSR-330 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. @@ -5762,7 +5401,7 @@ JSR-330 limitations under the License. -carrierservices, rcsclientlib: +carrierservices: These components com.google.android.rcs.core, @@ -6001,19 +5640,18 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -material_components, lib: +gRPC: Apache License Version 2.0, January 2004 - http://www.apache.org/licenses/ + https://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. @@ -6092,7 +5730,6 @@ material_components, lib: granted to You under this License for that Work shall terminate as of the date such litigation is filed. - 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: @@ -6110,7 +5747,6 @@ material_components, lib: the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one @@ -6128,9 +5764,7 @@ material_components, lib: You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, @@ -6181,24 +5815,13 @@ material_components, lib: END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] + Copyright 2015-2017 gRPC authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -6207,7 +5830,7 @@ material_components, lib: limitations under the License. -Guava JDK7: +instrumentation: Apache License @@ -6411,4 +6034,1408 @@ Guava JDK7: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - + + +jibercsclient: + +These components + com.google.android.rcs.core, + com.google.android.rcs.core.utils.CaseInsensitiveMap, + com.google.android.rcs.core.utils.DateTime, + com.google.android.rcs.core.utils.InetAddresses, + com.google.android.rcs.core.network.ConnectivityMonitor, + com.google.android.rcs.client.PrivateDataStorage, + com.google.android.rcs.client.utils.FastXmlSerializer, + com.google.android.rcs.client.utils.XmlUtils, + com.google.android.rcs.client.utils.QueuedWork +are licensed under Apache v2. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + +=============================================================================== + +These components + com.google.android.rcs.core.utils.FastBase64, + com.google.android.rcs.core.utils.LibraryLoaderHelper +are licensed under BSD. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +libphonenumber: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +mime4j: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + + + THIS PRODUCT ALSO INCLUDES THIRD PARTY SOFTWARE REDISTRIBUTED UNDER THE + FOLLOWING LICENSES: + + Apache Commons Logging, + The Apache Software License, Version 1.1 (commons-logging-1.1.1.jar) + + The Apache Software License, Version 1.1 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. The end-user documentation included with the redistribution, + if any, must include the following acknowledgment: + "This product includes software developed by the + Apache Software Foundation (http://www.apache.org/)." + Alternately, this acknowledgment may appear in the software itself, + if and wherever such third-party acknowledgments normally appear. + + 4. The names "Apache" and "Apache Software Foundation" must + not be used to endorse or promote products derived from this + software without prior written permission. For written + permission, please contact apache@apache.org. + + 5. Products derived from this software may not be called "Apache", + nor may "Apache" appear in their name, without prior written + permission of the Apache Software Foundation. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + + Test messages from the Perl-MIME-Tools project, + + The "Artistic License" + + Preamble + + The intent of this document is to state the conditions under which a + Package may be copied, such that the Copyright Holder maintains some + semblance of artistic control over the development of the package, + while giving the users of the package the right to use and distribute + the Package in a more-or-less customary fashion, plus the right to make + reasonable modifications. + + Definitions: + + "Package" refers to the collection of files distributed by the + Copyright Holder, and derivatives of that collection of files + created through textual modification. + + "Standard Version" refers to such a Package if it has not been + modified, or has been modified in accordance with the wishes + of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or + copyrights for the package. + + "You" is you, if you're thinking about copying or distributing + this Package. + + "Reasonable copying fee" is whatever you can justify on the + basis of media cost, duplication charges, time of people involved, + and so on. (You will not be required to justify it to the + Copyright Holder, but only to the computing community at large + as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item + itself, though there may be fees involved in handling the item. + It also means that recipients of the item may redistribute it + under the same conditions they received it. + + 1. You may make and give away verbatim copies of the source form of the + Standard Version of this Package without restriction, provided that you + duplicate all of the original copyright notices and associated disclaimers. + + 2. You may apply bug fixes, portability fixes and other modifications + derived from the Public Domain or from the Copyright Holder. A Package + modified in such a way shall still be considered the Standard Version. + + 3. You may otherwise modify your copy of this Package in any way, provided + that you insert a prominent notice in each changed file stating how and + when you changed that file, and provided that you do at least ONE of the + following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or + an equivalent medium, or placing the modifications on a major archive + site such as uunet.uu.net, or by allowing the Copyright Holder to include + your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict + with standard executables, which must also be provided, and provide + a separate manual page for each non-standard executable that clearly + documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + 4. You may distribute the programs of this Package in object code or + executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, + together with instructions (in the manual page or equivalent) on where + to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly + document the differences in manual pages (or equivalent), together + with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + 5. You may charge a reasonable copying fee for any distribution of this + Package. You may charge any fee you choose for support of this + Package. You may not charge a fee for this Package itself. However, + you may distribute this Package in aggregate with other (possibly + commercial) programs as part of a larger (possibly commercial) software + distribution provided that you do not advertise this Package as a + product of your own. You may embed this Package's interpreter within + an executable of yours (by linking); this shall be construed as a mere + form of aggregation, provided that the complete Standard Version of the + interpreter is so embedded. + + 6. The scripts and library files supplied as input to or produced as + output from the programs of this Package do not automatically fall + under the copyright of this Package, but belong to whoever generated + them, and may be sold commercially, and may be aggregated with this + Package. If such scripts or library files are aggregated with this + Package via the so-called "undump" or "unexec" methods of producing a + binary executable image, then distribution of such an image shall + neither be construed as a distribution of this Package nor shall it + fall under the restrictions of Paragraphs 3 and 4, provided that you do + not represent such an executable image as a Standard Version of this + Package. + + 7. C subroutines (or comparably compiled subroutines in other + languages) supplied by you and linked into this Package in order to + emulate subroutines and variables of the language defined by this + Package shall not be considered part of this Package, but are the + equivalent of input as in Paragraph 6, provided these subroutines do + not change the language in any way that would cause it to fail the + regression tests for the language. + + 8. Aggregation of this Package with a commercial distribution is always + permitted provided that the use of this Package is embedded; that is, + when no overt attempt is made to make this Package's interfaces visible + to the end user of the commercial distribution. Such use shall not be + construed as a distribution of this Package. + + 9. The name of the Copyright Holder may not be used to endorse or promote + products derived from this software without specific prior written permission. + + 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + The End + + + + +shortcutbadger: + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +Android SDK: + +ANDROID SOFTWARE DEVELOPMENT KIT + +Terms and Conditions + +This is the Android Software Development Kit License Agreement. + +1. Introduction + +1.1 The Android Software Development Kit (referred to in this License Agreement as the "SDK" and +specifically including the Android system files, packaged APIs, and Google APIs add-ons) is +licensed to you subject to the terms of this License Agreement. This License Agreement forms a +legally binding contract between you and Google in relation to your use of the SDK. + +1.2 "Google" means Google Inc., a Delaware corporation with principal place of business at 1600 +Amphitheatre Parkway, Mountain View, CA 94043, United States. + +2. Accepting this License Agreement + +2.1 In order to use the SDK, you must first agree to this License Agreement. You may not use the +SDK if you do not accept this License Agreement. + +2.2 You can accept this License Agreement by: + +(A) clicking to accept or agree to this License Agreement, where this option is made available to +you; or + +(B) by actually using the SDK. In this case, you agree that use of the SDK constitutes acceptance of +the Licensing Agreement from that point onwards. + +2.3 You may not use the SDK and may not accept the Licensing Agreement if you are a person barred +from receiving the SDK under the laws of the United States or other countries including the country +in which you are resident or from which you use the SDK. + +2.4 If you are agreeing to be bound by this License Agreement on behalf of your employer or other +entity, you represent and warrant that you have full legal authority to bind your employer or such +entity to this License Agreement. If you do not have the requisite authority, you may not accept +the Licensing Agreement or use the SDK on behalf of your employer or other entity. + +3. SDK License from Google + +3.1 Subject to the terms of this License Agreement, Google grants you a limited, worldwide, +royalty-free, non- assignable and non-exclusive license to use the SDK solely to develop +applications to run on the Android platform. + +3.2 You agree that Google or third parties own all legal right, title and interest in and to the +SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property +Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, +and any and all other proprietary rights. Google reserves all rights not expressly granted to you. + +3.3 Except to the extent required by applicable third party licenses, you may not copy (except for +backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create +derivative works of the SDK or any part of the SDK. Except to the extent required by applicable +third party licenses, you may not load any part of the SDK onto a mobile handset or any other +hardware device except a personal computer, combine any part of the SDK with other software, or +distribute any software or device incorporating a part of the SDK. + +3.4 Use, reproduction and distribution of components of the SDK licensed under an open source +software license are governed solely by the terms of that open source software license and not +this License Agreement. + +3.5 You agree that the form and nature of the SDK that Google provides may change without prior +notice to you and that future versions of the SDK may be incompatible with applications developed +on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) +providing the SDK (or any features within the SDK) to you or to users generally at Google's sole +discretion, without prior notice to you. + +3.6 Nothing in this License Agreement gives you a right to use any of Google's trade names, +trademarks, service marks, logos, domain names, or other distinctive brand features. + +3.7 You agree that you will not remove, obscure, or alter any proprietary rights notices (including +copyright and trademark notices) that may be affixed to or contained within the SDK. + +4. Use of the SDK by You + +4.1 Google agrees that it obtains no right, title or interest from you (or your licensors) under +this License Agreement in or to any software applications that you develop using the SDK, including +any intellectual property rights that subsist in those applications. + +4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) this +License Agreement and (b) any applicable law, regulation or generally accepted practices or +guidelines in the relevant jurisdictions (including any laws regarding the export of data or +software to and from the United States or other relevant countries). + +4.3 You agree that if you use the SDK to develop applications for general public users, you will +protect the privacy and legal rights of those users. If the users provide you with user names, +passwords, or other login information or personal information, your must make the users aware that +the information will be available to your application, and you must provide legally adequate privacy +notice and protection for those users. If your application stores personal or sensitive information +provided by users, it must do so securely. If the user provides your application with Google Account +information, your application may only use that information to access the user's Google Account +when, and for the limited purposes for which, the user has given you permission to do so. + +4.4 You agree that you will not engage in any activity with the SDK, including the development or +distribution of an application, that interferes with, disrupts, damages, or accesses in an +unauthorized manner the servers, networks, or other properties or services of any third party +including, but not limited to, Google or any mobile communications carrier. + +4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or +to any third party for) any data, content, or resources that you create, transmit or display through +the Android platform and/or applications for the Android platform, and for the consequences of your +actions (including any loss or damage which Google may suffer) by doing so. + +4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or +to any third party for) any breach of your obligations under this License Agreement, any applicable +third party contract or Terms of Service, or any applicable law or regulation, and for the +consequences (including any loss or damage which Google or any third party may suffer) of any such +breach. + +5. Your Developer Credentials + +5.1 You agree that you are responsible for maintaining the confidentiality of any developer +credentials that may be issued to you by Google or which you may choose yourself and that you will +be solely responsible for all applications that are developed under your developer credentials. + +6. Privacy and Information + +6.1 In order to continually innovate and improve the SDK, Google may collect certain usage +statistics from the software including but not limited to a unique identifier, associated IP +address, version number of the software, and information on which tools and/or services in the SDK +are being used and how they are being used. Before any of this information is collected, the SDK +will notify you and seek your consent. If you withhold consent, the information will not be +collected. + +6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in +accordance with Google's Privacy Policy. + +7. Third Party Applications for the Android Platform + +7.1 If you use the SDK to run applications developed by a third party or that access data, content +or resources provided by a third party, you agree that Google is not responsible for those +applications, data, content, or resources. You understand that all data, content or resources which +you may access through such third party applications are the sole responsibility of the person from +which they originated and that Google is not liable for any loss or damage that you may experience +as a result of the use or access of any of those third party applications, data, content, or +resources. + +7.2 You should be aware the data, content, and resources presented to you through such a third party +application may be protected by intellectual property rights which are owned by the providers (or by +other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute +or create derivative works based on these data, content, or resources (either in whole or in part) +unless you have been specifically given permission to do so by the relevant owners. + +7.3 You acknowledge that your use of such third party applications, data, content, or resources may +be subject to separate terms between you and the relevant third party. In that case, this License +Agreement does not affect your legal relationship with these third parties. + +8. Using Android APIs + +8.1 Google Data APIs + +8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be +protected by intellectual property rights which are owned by Google or those parties that provide +the data (or by other persons or companies on their behalf). Your use of any such API may be subject +to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create +derivative works based on this data (either in whole or in part) unless allowed by the relevant +Terms of Service. + +8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you +shall retrieve data only with the user's explicit consent and only when, and for the limited +purposes for which, the user has given you permission to do so. + +9. Terminating this License Agreement + +9.1 This License Agreement will continue to apply until terminated by either you or Google as set +out below. + +9.2 If you want to terminate this License Agreement, you may do so by ceasing your use of the SDK +and any relevant developer credentials. + +9.3 Google may at any time, terminate this License Agreement with you if: + +(A) you have breached any provision of this License Agreement; or + +(B) Google is required to do so by law; or + +(C) the partner with whom Google offered certain parts of SDK (such as APIs) to you has terminated +its relationship with Google or ceased to offer certain parts of the SDK to you; or + +(D) Google decides to no longer providing the SDK or certain parts of the SDK to users in the +country in which you are resident or from which you use the service, or the provision of the SDK or +certain SDK services to you by Google is, in Google's sole discretion, no longer commercially +viable. + +9.4 When this License Agreement comes to an end, all of the legal rights, obligations and +liabilities that you and Google have benefited from, been subject to (or which have accrued over +time whilst this License Agreement has been in force) or which are expressed to continue +indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 14.7 shall +continue to apply to such rights, obligations and liabilities indefinitely. + +10. DISCLAIMER OF WARRANTIES + +10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE +SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE. + +10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE +SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR +COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. + +10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + +11. LIMITATION OF LIABILITY + +11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS +LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY +LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN +AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING. + +12. Indemnification + +12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless +Google, its affiliates and their respective directors, officers, employees and agents from and +against any and all claims, actions, suits or proceedings, as well as any and all losses, +liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or +accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any +copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any +person or defames any person or violates their rights of publicity or privacy, and (c) any +non-compliance by you with this License Agreement. + +13. Changes to the License Agreement + +13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. +When these changes are made, Google will make a new version of the License Agreement available on +the website where the SDK is made available. + +14. General Legal Terms + +14.1 This License Agreement constitute the whole legal agreement between you and Google and govern +your use of the SDK (excluding any services which Google may provide to you under a separate written +agreement), and completely replace any prior agreements between you and Google in relation to the +SDK. + +14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is +contained in this License Agreement (or which Google has the benefit of under any applicable law), +this will not be taken to be a formal waiver of Google's rights and that those rights or remedies +will still be available to Google. + +14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision +of this License Agreement is invalid, then that provision will be removed from this License +Agreement without affecting the rest of this License Agreement. The remaining provisions of this +License Agreement will continue to be valid and enforceable. + +14.4 You acknowledge and agree that each member of the group of companies of which Google is the +parent shall be third party beneficiaries to this License Agreement and that such other companies +shall be entitled to directly enforce, and rely upon, any provision of this License Agreement that +confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall +be third party beneficiaries to this License Agreement. + +14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST +COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE +LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE. + +14.6 The rights granted in this License Agreement may not be assigned or transferred by either you +or Google without the prior written approval of the other party. Neither you nor Google shall be +permitted to delegate their responsibilities or obligations under this License Agreement without the +prior written approval of the other party. + +14.7 This License Agreement, and your relationship with Google under this License Agreement, shall +be governed by the laws of the State of California without regard to its conflict of laws +provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located +within the county of Santa Clara, California to resolve any legal matter arising from this License +Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for +injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. + +April 10, 2009 + + +Animal Sniffer: + +The MIT License + +Copyright (c) 2008 Kohsuke Kawaguchi and codehaus.org. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +Glide: + +Covers library/ + +Copyright 2014 Google, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY GOOGLE, INC. ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE, INC. OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the +authors and should not be interpreted as representing official policies, either expressed +or implied, of Google, Inc. + +-------------------------------------------------------------------------- +Covers third_party/gif_decoder + +Copyright (c) 2013 Xcellent Creations, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------- +Covers third_party/disklrucache + +Copyright 2012 Jake Wharton +Copyright 2011 The Android Open Source Project + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +-------------------------------------------------------------------------- +Covers third_party/gif_encoder/AnimatedGifEncoder.java and +third_party/gif_encoder/LZWEncoder.java: + +No copyright asserted on the source code of this class. May be used for any +purpose, however, refer to the Unisys LZW patent for restrictions on use of +the associated LZWEncoder class. Please forward any corrections to +kweiner@fmsware.com. + +----------------------------------------------------------------------------- +Covers third_party/gif_encoder/NeuQuant.java + +Copyright (c) 1994 Anthony Dekker + +NEUQUANT Neural-Net quantization algorithm by Anthony Dekker, 1994. See +"Kohonen neural networks for optimal colour quantization" in "Network: +Computation in Neural Systems" Vol. 5 (1994) pp 351-367. for a discussion of +the algorithm. + +Any party obtaining a copy of these files from the author, directly or +indirectly, is granted, free of charge, a full and unrestricted irrevocable, +world-wide, paid up, royalty-free, nonexclusive right and license to deal in +this software and documentation files (the "Software"), including without +limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons who +receive copies from any such party to do so, with the only requirement being +that this copyright notice remain intact. + + +JSR 305: + +Copyright (c) 2007-2009, JSR305 expert group +All rights reserved. + +http://www.opensource.org/licenses/bsd-license.php + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the JSR305 expert group nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/java/com/android/dialer/app/AndroidManifest.xml b/java/com/android/dialer/app/AndroidManifest.xml index de4b48c51..4200082a6 100644 --- a/java/com/android/dialer/app/AndroidManifest.xml +++ b/java/com/android/dialer/app/AndroidManifest.xml @@ -39,6 +39,7 @@ + diff --git a/java/com/android/dialer/app/Bindings.java b/java/com/android/dialer/app/Bindings.java index 2beb40184..c8cf27eb2 100644 --- a/java/com/android/dialer/app/Bindings.java +++ b/java/com/android/dialer/app/Bindings.java @@ -17,9 +17,6 @@ package com.android.dialer.app; import android.content.Context; -import com.android.dialer.app.bindings.DialerBindings; -import com.android.dialer.app.bindings.DialerBindingsFactory; -import com.android.dialer.app.bindings.DialerBindingsStub; import com.android.dialer.app.legacybindings.DialerLegacyBindings; import com.android.dialer.app.legacybindings.DialerLegacyBindingsFactory; import com.android.dialer.app.legacybindings.DialerLegacyBindingsStub; @@ -28,28 +25,10 @@ import java.util.Objects; /** Accessor for the in call UI bindings. */ public class Bindings { - private static DialerBindings instance; private static DialerLegacyBindings legacyInstance; private Bindings() {} - public static DialerBindings get(Context context) { - Objects.requireNonNull(context); - if (instance != null) { - return instance; - } - - Context application = context.getApplicationContext(); - if (application instanceof DialerBindingsFactory) { - instance = ((DialerBindingsFactory) application).newDialerBindings(); - } - - if (instance == null) { - instance = new DialerBindingsStub(); - } - return instance; - } - public static DialerLegacyBindings getLegacy(Context context) { Objects.requireNonNull(context); if (legacyInstance != null) { @@ -67,11 +46,4 @@ public class Bindings { return legacyInstance; } - public static void setForTesting(DialerBindings testInstance) { - instance = testInstance; - } - - public static void setLegacyBindingForTesting(DialerLegacyBindings testLegacyInstance) { - legacyInstance = testLegacyInstance; - } } diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java index 6e2c6be7d..01bdfc223 100644 --- a/java/com/android/dialer/app/DialtactsActivity.java +++ b/java/com/android/dialer/app/DialtactsActivity.java @@ -43,6 +43,7 @@ import android.support.v4.app.ActivityCompat; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.telecom.PhoneAccount; +import android.telecom.TelecomManager; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -71,10 +72,13 @@ import com.android.contacts.common.widget.FloatingActionButtonController; import com.android.dialer.animation.AnimUtils; import com.android.dialer.animation.AnimationListenerAdapter; import com.android.dialer.app.calllog.CallLogActivity; +import com.android.dialer.app.calllog.CallLogAdapter; +import com.android.dialer.app.calllog.CallLogAsync; import com.android.dialer.app.calllog.CallLogFragment; import com.android.dialer.app.calllog.CallLogNotificationsService; -import com.android.dialer.app.dialpad.DialpadFragment; +import com.android.dialer.app.calllog.IntentProvider; import com.android.dialer.app.list.DialtactsPagerAdapter; +import com.android.dialer.app.list.DialtactsPagerAdapter.TabIndex; import com.android.dialer.app.list.DragDropController; import com.android.dialer.app.list.ListsFragment; import com.android.dialer.app.list.OldSpeedDialFragment; @@ -88,31 +92,43 @@ import com.android.dialer.app.settings.DialerSettingsActivity; import com.android.dialer.app.widget.ActionBarController; import com.android.dialer.app.widget.SearchEditTextLayout; import com.android.dialer.callcomposer.CallComposerActivity; +import com.android.dialer.calldetails.CallDetailsActivity; +import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.callintent.CallIntentBuilder; import com.android.dialer.callintent.CallSpecificAppData; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; +import com.android.dialer.compat.telephony.TelephonyManagerCompat; +import com.android.dialer.configprovider.ConfigProviderBindings; +import com.android.dialer.constants.ActivityRequestCodes; import com.android.dialer.database.Database; import com.android.dialer.database.DialerDatabaseHelper; +import com.android.dialer.dialpadview.DialpadFragment; +import com.android.dialer.dialpadview.DialpadFragment.DialpadListener; +import com.android.dialer.dialpadview.DialpadFragment.LastOutgoingCallCallback; import com.android.dialer.interactions.PhoneNumberInteraction; import com.android.dialer.interactions.PhoneNumberInteraction.InteractionErrorCode; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; import com.android.dialer.logging.ScreenEvent; +import com.android.dialer.logging.UiAction; +import com.android.dialer.main.Main; +import com.android.dialer.main.MainComponent; import com.android.dialer.p13n.inference.P13nRanking; import com.android.dialer.p13n.inference.protocol.P13nRanker; import com.android.dialer.p13n.inference.protocol.P13nRanker.P13nRefreshCompleteListener; import com.android.dialer.p13n.logging.P13nLogger; import com.android.dialer.p13n.logging.P13nLogging; +import com.android.dialer.performancereport.PerformanceReport; import com.android.dialer.postcall.PostCall; import com.android.dialer.proguard.UsedByReflection; +import com.android.dialer.searchfragment.list.NewSearchFragment; import com.android.dialer.simulator.Simulator; import com.android.dialer.simulator.SimulatorComponent; import com.android.dialer.smartdial.SmartDialNameMatcher; import com.android.dialer.smartdial.SmartDialPrefix; import com.android.dialer.telecom.TelecomUtil; import com.android.dialer.util.DialerUtils; -import com.android.dialer.util.IntentUtil; import com.android.dialer.util.PermissionsUtil; import com.android.dialer.util.TouchPointManager; import com.android.dialer.util.TransactionSafeActivity; @@ -130,6 +146,7 @@ public class DialtactsActivity extends TransactionSafeActivity DialpadFragment.OnDialpadQueryChangedListener, OnListFragmentScrolledListener, CallLogFragment.HostInterface, + CallLogAdapter.OnActionModeStateChangedListener, DialpadFragment.HostInterface, OldSpeedDialFragment.HostInterface, SearchFragment.HostInterface, @@ -140,13 +157,15 @@ public class DialtactsActivity extends TransactionSafeActivity ActionBarController.ActivityUi, PhoneNumberInteraction.InteractionErrorListener, PhoneNumberInteraction.DisambigDialogDismissedListener, - ActivityCompat.OnRequestPermissionsResultCallback { + ActivityCompat.OnRequestPermissionsResultCallback, + DialpadListener { public static final boolean DEBUG = false; @VisibleForTesting public static final String TAG_DIALPAD_FRAGMENT = "dialpad"; private static final String ACTION_SHOW_TAB = "ACTION_SHOW_TAB"; @VisibleForTesting public static final String EXTRA_SHOW_TAB = "EXTRA_SHOW_TAB"; public static final String EXTRA_CLEAR_NEW_VOICEMAILS = "EXTRA_CLEAR_NEW_VOICEMAILS"; + private static final String KEY_LAST_TAB = "last_tab"; private static final String TAG = "DialtactsActivity"; private static final String KEY_IN_REGULAR_SEARCH_UI = "in_regular_search_ui"; private static final String KEY_IN_DIALPAD_SEARCH_UI = "in_dialpad_search_ui"; @@ -154,15 +173,13 @@ public class DialtactsActivity extends TransactionSafeActivity private static final String KEY_FIRST_LAUNCH = "first_launch"; private static final String KEY_WAS_CONFIGURATION_CHANGE = "was_configuration_change"; private static final String KEY_IS_DIALPAD_SHOWN = "is_dialpad_shown"; + private static final String TAG_NEW_SEARCH_FRAGMENT = "new_search"; private static final String TAG_REGULAR_SEARCH_FRAGMENT = "search"; private static final String TAG_SMARTDIAL_SEARCH_FRAGMENT = "smartdial"; private static final String TAG_FAVORITES_FRAGMENT = "favorites"; /** Just for backward compatibility. Should behave as same as {@link Intent#ACTION_DIAL}. */ private static final String ACTION_TOUCH_DIALER = "com.android.phone.action.TOUCH_DIALER"; - private static final int ACTIVITY_REQUEST_CODE_VOICE_SEARCH = 1; - public static final int ACTIVITY_REQUEST_CODE_CALL_COMPOSE = 2; - private static final int FAB_SCALE_IN_DELAY_MS = 300; /** @@ -180,6 +197,9 @@ public class DialtactsActivity extends TransactionSafeActivity /** Fragment for searching phone numbers using the dialpad. */ private SmartDialSearchFragment mSmartDialSearchFragment; + /** new Fragment for search phone numbers using the keyboard and the dialpad. */ + private NewSearchFragment mNewSearchFragment; + /** Animation that slides in. */ private Animation mSlideIn; @@ -225,6 +245,9 @@ public class DialtactsActivity extends TransactionSafeActivity private P13nLogger mP13nLogger; private P13nRanker mP13nRanker; + public boolean isMultiSelectModeEnabled; + + private boolean isLastTabEnabled; AnimationListenerAdapter mSlideInListener = new AnimationListenerAdapter() { @@ -256,12 +279,18 @@ public class DialtactsActivity extends TransactionSafeActivity // no need to do anything here. return; } + + if (count != 0) { + PerformanceReport.recordClick(UiAction.Type.TEXT_CHANGE_WITH_INPUT); + } + if (DEBUG) { LogUtil.v("DialtactsActivity.onTextChanged", "called with new query: " + newText); LogUtil.v("DialtactsActivity.onTextChanged", "previous query: " + mSearchQuery); } mSearchQuery = newText; + // TODO(calderwoodra): show p13n when newText is empty. // Show search fragment only when the query string is changed to non-empty text. if (!TextUtils.isEmpty(newText)) { // Call enterSearchUi only if we are switching search modes, or showing a search @@ -277,6 +306,11 @@ public class DialtactsActivity extends TransactionSafeActivity mSmartDialSearchFragment.setQueryString(mSearchQuery); } else if (mRegularSearchFragment != null && mRegularSearchFragment.isVisible()) { mRegularSearchFragment.setQueryString(mSearchQuery); + } else if (mNewSearchFragment != null && mNewSearchFragment.isVisible()) { + mNewSearchFragment.setQuery(mSearchQuery); + // When the user switches between dialpad and the serachbar, we need to reset the + // call initiation type. + mNewSearchFragment.setCallInitiationType(getCallInitiationType()); } } @@ -289,6 +323,7 @@ public class DialtactsActivity extends TransactionSafeActivity @Override public void onClick(View v) { if (!isInSearchUi()) { + PerformanceReport.recordClick(UiAction.Type.OPEN_SEARCH); mActionBarController.onSearchBoxTapped(); enterSearchUi( false /* smartDialSearch */, mSearchView.getText().toString(), true /* animate */); @@ -306,15 +341,20 @@ public class DialtactsActivity extends TransactionSafeActivity if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { if (TextUtils.isEmpty(mSearchView.getText().toString())) { // If the search term is empty, close the search UI. + PerformanceReport.recordClick(UiAction.Type.CLOSE_SEARCH_WITH_HIDE_BUTTON); maybeExitSearchUi(); } else { // If the search term is not empty, show the dialpad fab. + if (!mFloatingActionButtonController.isVisible()) { + PerformanceReport.recordClick(UiAction.Type.HIDE_KEYBOARD_IN_SEARCH); + } showFabInSearchUi(); } } return false; } }; + /** * The text returned from a voice search query. Set in {@link #onActivityResult} and used in * {@link #onResume()} to populate the search box. @@ -355,6 +395,7 @@ public class DialtactsActivity extends TransactionSafeActivity super.onCreate(savedInstanceState); mFirstLaunch = true; + isLastTabEnabled = ConfigProviderBindings.get(this).getBoolean("last_tab_enabled", false); final Resources resources = getResources(); mActionBarHeight = resources.getDimensionPixelSize(R.dimen.action_bar_height_large); @@ -371,12 +412,12 @@ public class DialtactsActivity extends TransactionSafeActivity actionBar.setBackgroundDrawable(null); SearchEditTextLayout searchEditTextLayout = - (SearchEditTextLayout) actionBar.getCustomView().findViewById(R.id.search_view_container); + actionBar.getCustomView().findViewById(R.id.search_view_container); searchEditTextLayout.setPreImeKeyListener(mSearchEditTextLayoutListener); mActionBarController = new ActionBarController(this, searchEditTextLayout); - mSearchView = (EditText) searchEditTextLayout.findViewById(R.id.search_view); + mSearchView = searchEditTextLayout.findViewById(R.id.search_view); mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener); mVoiceSearchButton = searchEditTextLayout.findViewById(R.id.voice_search_button); searchEditTextLayout @@ -399,14 +440,13 @@ public class DialtactsActivity extends TransactionSafeActivity mIsLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; mPreviouslySelectedTabIndex = DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL; - FloatingActionButton floatingActionButton = - (FloatingActionButton) findViewById(R.id.floating_action_button); + FloatingActionButton floatingActionButton = findViewById(R.id.floating_action_button); floatingActionButton.setOnClickListener(this); mFloatingActionButtonController = new FloatingActionButtonController(this, floatingActionButton); ImageButton optionsMenuButton = - (ImageButton) searchEditTextLayout.findViewById(R.id.dialtacts_options_menu_button); + searchEditTextLayout.findViewById(R.id.dialtacts_options_menu_button); optionsMenuButton.setOnClickListener(this); mOverflowMenu = buildOptionsMenu(optionsMenuButton); optionsMenuButton.setOnTouchListener(mOverflowMenu.getDragToOpenListener()); @@ -480,6 +520,13 @@ public class DialtactsActivity extends TransactionSafeActivity Trace.beginSection(TAG + " onResume"); super.onResume(); + // Some calls may not be recorded (eg. from quick contact), + // so we should restart recording after these calls. (Recorded call is stopped) + PostCall.restartPerformanceRecordingIfARecentCallExist(this); + if (!PerformanceReport.isRecording()) { + PerformanceReport.startRecording(); + } + mStateSaved = false; if (mFirstLaunch) { displayFragment(getIntent()); @@ -542,7 +589,8 @@ public class DialtactsActivity extends TransactionSafeActivity } if (getIntent().getBooleanExtra(EXTRA_CLEAR_NEW_VOICEMAILS, false)) { - CallLogNotificationsService.markNewVoicemailsAsOld(this, null); + LogUtil.i("DialtactsActivity.onResume", "clearing all new voicemails"); + CallLogNotificationsService.markAllNewVoicemailsAsOld(this); } } @@ -556,7 +604,7 @@ public class DialtactsActivity extends TransactionSafeActivity new P13nRefreshCompleteListener() { @Override public void onP13nRefreshComplete() { - // TODO: make zero-query search results visible + // TODO(strongarm): make zero-query search results visible } }); Trace.endSection(); @@ -593,6 +641,10 @@ public class DialtactsActivity extends TransactionSafeActivity && !getSystemService(KeyguardManager.class).isKeyguardLocked()) { mListsFragment.markMissedCallsAsReadAndRemoveNotifications(); } + DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(this) + .edit() + .putInt(KEY_LAST_TAB, mListsFragment.getCurrentTabIndex()) + .apply(); } @Override @@ -630,6 +682,9 @@ public class DialtactsActivity extends TransactionSafeActivity } else if (fragment instanceof ListsFragment) { mListsFragment = (ListsFragment) fragment; mListsFragment.addOnPageChangeListener(this); + } else if (fragment instanceof NewSearchFragment) { + mNewSearchFragment = (NewSearchFragment) fragment; + updateSearchFragmentPosition(); } if (fragment instanceof SearchFragment) { final SearchFragment searchFragment = (SearchFragment) fragment; @@ -664,13 +719,8 @@ public class DialtactsActivity extends TransactionSafeActivity public void onClick(View view) { int resId = view.getId(); if (resId == R.id.floating_action_button) { - if (mListsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS - && !mInRegularSearch - && !mInDialpadSearch) { - DialerUtils.startActivityWithErrorToast( - this, IntentUtil.getNewContactIntent(), R.string.add_contact_not_available); - Logger.get(this).logImpression(DialerImpression.Type.NEW_CONTACT_FAB); - } else if (!mIsDialpadShown) { + if (!mIsDialpadShown) { + PerformanceReport.recordClick(UiAction.Type.OPEN_DIALPAD); mInCallDialpadUp = false; showDialpadFragment(true); PostCall.closePrompt(); @@ -679,7 +729,7 @@ public class DialtactsActivity extends TransactionSafeActivity try { startActivityForResult( new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), - ACTIVITY_REQUEST_CODE_VOICE_SEARCH); + ActivityRequestCodes.DIALTACTS_VOICE_SEARCH); } catch (ActivityNotFoundException e) { Toast.makeText( DialtactsActivity.this, R.string.voice_search_not_available, Toast.LENGTH_SHORT) @@ -700,6 +750,7 @@ public class DialtactsActivity extends TransactionSafeActivity int resId = item.getItemId(); if (resId == R.id.menu_history) { + PerformanceReport.recordClick(UiAction.Type.OPEN_CALL_HISTORY); final Intent intent = new Intent(this, CallLogActivity.class); startActivity(intent); } else if (resId == R.id.menu_clear_frequents) { @@ -710,6 +761,9 @@ public class DialtactsActivity extends TransactionSafeActivity handleMenuSettings(); Logger.get(this).logScreenView(ScreenEvent.Type.SETTINGS, this); return true; + } else if (resId == R.id.menu_new_ui_launcher_shortcut) { + MainComponent.get(this).getMain().createNewUiLauncherShortcut(this); + return true; } return false; } @@ -721,7 +775,7 @@ public class DialtactsActivity extends TransactionSafeActivity "requestCode:%d, resultCode:%d", requestCode, resultCode); - if (requestCode == ACTIVITY_REQUEST_CODE_VOICE_SEARCH) { + if (requestCode == ActivityRequestCodes.DIALTACTS_VOICE_SEARCH) { if (resultCode == RESULT_OK) { final ArrayList matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); @@ -733,7 +787,7 @@ public class DialtactsActivity extends TransactionSafeActivity } else { LogUtil.e("DialtactsActivity.onActivityResult", "voice search failed"); } - } else if (requestCode == ACTIVITY_REQUEST_CODE_CALL_COMPOSE) { + } else if (requestCode == ActivityRequestCodes.DIALTACTS_CALL_COMPOSER) { if (resultCode == RESULT_FIRST_USER) { LogUtil.i( "DialtactsActivity.onActivityResult", "returned from call composer, error occurred"); @@ -745,6 +799,19 @@ public class DialtactsActivity extends TransactionSafeActivity } else { LogUtil.i("DialtactsActivity.onActivityResult", "returned from call composer, no error"); } + } else if (requestCode == ActivityRequestCodes.DIALTACTS_CALL_DETAILS) { + if (resultCode == RESULT_OK + && data != null + && data.getBooleanExtra(CallDetailsActivity.EXTRA_HAS_ENRICHED_CALL_DATA, false)) { + String number = data.getStringExtra(CallDetailsActivity.EXTRA_PHONE_NUMBER); + int snackbarDurationMillis = 5_000; + Snackbar.make(mParentLayout, getString(R.string.ec_data_deleted), snackbarDurationMillis) + .setAction( + R.string.view_conversation, + v -> startActivity(IntentProvider.getSendSmsIntentProvider(number).getIntent(this))) + .setActionTextColor(getResources().getColor(R.color.dialer_snackbar_action_text_color)) + .show(); + } } super.onActivityResult(requestCode, resultCode, data); } @@ -785,6 +852,7 @@ public class DialtactsActivity extends TransactionSafeActivity if (animate) { mFloatingActionButtonController.scaleOut(); + maybeEnterSearchUi(); } else { mFloatingActionButtonController.setVisible(false); maybeEnterSearchUi(); @@ -793,11 +861,19 @@ public class DialtactsActivity extends TransactionSafeActivity Assert.isNotNull(mListsFragment.getView()).animate().alpha(0).withLayer(); - //adjust the title, so the user will know where we're at when the activity start/resumes. + // adjust the title, so the user will know where we're at when the activity start/resumes. setTitle(R.string.launcherDialpadActivityLabel); } + @Override + public void getLastOutgoingCall(LastOutgoingCallCallback callback) { + new CallLogAsync() + .getLastOutgoingCall( + new CallLogAsync.GetLastOutgoingCallArgs(this, callback::lastOutgoingCall)); + } + /** Callback from child DialpadFragment when the dialpad is shown. */ + @Override public void onDialpadShown() { LogUtil.d("DialtactsActivity.onDialpadShown", ""); Assert.isNotNull(mDialpadFragment); @@ -816,6 +892,7 @@ public class DialtactsActivity extends TransactionSafeActivity * * @see #commitDialpadFragmentHide */ + @Override public void hideDialpadFragment(boolean animate, boolean clearDialpad) { if (mDialpadFragment == null || mDialpadFragment.getView() == null) { return; @@ -855,7 +932,7 @@ public class DialtactsActivity extends TransactionSafeActivity exitSearchUi(); } } - //reset the title to normal. + // reset the title to normal. setTitle(R.string.launcherActivityLabel); } @@ -890,6 +967,13 @@ public class DialtactsActivity extends TransactionSafeActivity // available immediately which is required to update position. By forcing an animation, // position will be updated after a delay by when the dialpad height would be available. fragment.updatePosition(true /* animate */); + } else if (mNewSearchFragment != null) { + int animationDuration = getResources().getInteger(R.integer.dialpad_slide_in_duration); + int actionbarHeight = getResources().getDimensionPixelSize(R.dimen.action_bar_height_large); + int shadowHeight = getResources().getDrawable(R.drawable.search_shadow).getIntrinsicHeight(); + int start = isDialpadShown() ? actionbarHeight - shadowHeight : 0; + int end = isDialpadShown() ? 0 : actionbarHeight - shadowHeight; + mNewSearchFragment.animatePosition(start, end, animationDuration); } } @@ -1007,6 +1091,19 @@ public class DialtactsActivity extends TransactionSafeActivity if (showDialpadChooser && !mDialpadFragment.isVisible()) { mInCallDialpadUp = true; } + } else if (isLastTabEnabled) { + @TabIndex + int tabIndex = + DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(this) + .getInt(KEY_LAST_TAB, DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL); + // If voicemail tab is saved and its availability changes, we still move to the voicemail tab + // but it is quickly removed and shown the contacts tab. + if (mListsFragment != null) { + mListsFragment.showTab(tabIndex); + PerformanceReport.setStartingTabIndex(tabIndex); + } else { + PerformanceReport.setStartingTabIndex(DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL); + } } } @@ -1057,7 +1154,11 @@ public class DialtactsActivity extends TransactionSafeActivity } final String tag; - if (smartDialSearch) { + boolean useNewSearch = + ConfigProviderBindings.get(this).getBoolean("enable_new_search_fragment", false); + if (useNewSearch) { + tag = TAG_NEW_SEARCH_FRAGMENT; + } else if (smartDialSearch) { tag = TAG_SMARTDIAL_SEARCH_FRAGMENT; } else { tag = TAG_REGULAR_SEARCH_FRAGMENT; @@ -1067,40 +1168,53 @@ public class DialtactsActivity extends TransactionSafeActivity mFloatingActionButtonController.scaleOut(); - SearchFragment fragment = (SearchFragment) getFragmentManager().findFragmentByTag(tag); if (animate) { transaction.setCustomAnimations(android.R.animator.fade_in, 0); } else { transaction.setTransition(FragmentTransaction.TRANSIT_NONE); } + + Fragment fragment = getFragmentManager().findFragmentByTag(tag); if (fragment == null) { - if (smartDialSearch) { + if (useNewSearch) { + fragment = new NewSearchFragment(); + } else if (smartDialSearch) { fragment = new SmartDialSearchFragment(); } else { fragment = Bindings.getLegacy(this).newRegularSearchFragment(); - fragment.setOnTouchListener( - new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - // Show the FAB when the user touches the lists fragment and the soft - // keyboard is hidden. - hideDialpadFragment(true, false); - showFabInSearchUi(); - v.performClick(); - return false; - } - }); + ((SearchFragment) fragment) + .setOnTouchListener( + (v, event) -> { + // Show the FAB when the user touches the lists fragment and the soft + // keyboard is hidden. + hideDialpadFragment(true, false); + v.performClick(); + return false; + }); } transaction.add(R.id.dialtacts_frame, fragment, tag); } else { + // TODO(calderwoodra): if this is a transition from dialpad to searchbar, animate fragment + // down, and vice versa. Perhaps just add a coordinator behavior with the search bar. transaction.show(fragment); } + // DialtactsActivity will provide the options menu fragment.setHasOptionsMenu(false); + // Will show empty list if P13nRanker is not enabled. Else, re-ranked list by the ranker. - fragment.setShowEmptyListForNullQuery(mP13nRanker.shouldShowEmptyListForNullQuery()); - if (!smartDialSearch) { - fragment.setQueryString(query); + if (!useNewSearch) { + ((SearchFragment) fragment) + .setShowEmptyListForNullQuery(mP13nRanker.shouldShowEmptyListForNullQuery()); + } else { + // TODO(calderwoodra): add p13n ranker to new search. + } + + if (!smartDialSearch && !useNewSearch) { + ((SearchFragment) fragment).setQueryString(query); + } else if (useNewSearch) { + ((NewSearchFragment) fragment).setQuery(query); + ((NewSearchFragment) fragment).setCallInitiationType(getCallInitiationType()); } transaction.commit(); @@ -1146,6 +1260,9 @@ public class DialtactsActivity extends TransactionSafeActivity if (mRegularSearchFragment != null) { transaction.remove(mRegularSearchFragment); } + if (mNewSearchFragment != null) { + transaction.remove(mNewSearchFragment); + } transaction.commit(); Assert.isNotNull(mListsFragment.getView()).animate().alpha(1).withLayer(); @@ -1163,6 +1280,8 @@ public class DialtactsActivity extends TransactionSafeActivity @Override public void onBackPressed() { + PerformanceReport.recordClick(UiAction.Type.PRESS_ANDROID_BACK_BUTTON); + if (mStateSaved) { return; } @@ -1247,6 +1366,7 @@ public class DialtactsActivity extends TransactionSafeActivity if (mInDialpadSearch && mSmartDialSearchFragment != null && !mSmartDialSearchFragment.isShowingPermissionRequest()) { + PerformanceReport.recordClick(UiAction.Type.CLOSE_DIALPAD); hideDialpadFragment(true /* animate */, true /* clearDialpad */); return true; } @@ -1255,6 +1375,7 @@ public class DialtactsActivity extends TransactionSafeActivity @Override public void onListFragmentScrollStateChange(int scrollState) { + PerformanceReport.recordScrollStateChange(scrollState); if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { hideDialpadFragment(true, false); DialerUtils.hideInputMethod(mParentLayout); @@ -1349,6 +1470,12 @@ public class DialtactsActivity extends TransactionSafeActivity Intent intent = new CallIntentBuilder(phoneNumber, callSpecificAppData).setIsVideoCall(isVideoCall).build(); + if (callSpecificAppData.getAllowAssistedDialing()) { + Bundle extras = new Bundle(); + extras.putBoolean(TelephonyManagerCompat.ALLOW_ASSISTED_DIAL, true); + intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, extras); + } + DialerUtils.startActivityWithErrorToast(this, intent); mClearSearchOnPause = true; } @@ -1381,18 +1508,6 @@ public class DialtactsActivity extends TransactionSafeActivity int tabIndex = mListsFragment.getCurrentTabIndex(); mPreviouslySelectedTabIndex = tabIndex; mFloatingActionButtonController.setVisible(true); - if (tabIndex == DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS - && !mInRegularSearch - && !mInDialpadSearch) { - mFloatingActionButtonController.changeIcon( - getResources().getDrawable(R.drawable.quantum_ic_person_add_white_24, null), - getResources().getString(R.string.search_shortcut_create_new_contact)); - } else { - mFloatingActionButtonController.changeIcon( - getResources().getDrawable(R.drawable.quantum_ic_dialpad_white_24, null), - getResources().getString(R.string.action_menu_dialpad_button)); - } - timeTabSelected = SystemClock.elapsedRealtime(); } @@ -1477,6 +1592,23 @@ public class DialtactsActivity extends TransactionSafeActivity Arrays.toString(grantResults))); } + @Override + public void onActionModeStateChanged(boolean isEnabled) { + isMultiSelectModeEnabled = isEnabled; + } + + @Override + public boolean isActionModeStateEnabled() { + return isMultiSelectModeEnabled; + } + + private CallInitiationType.Type getCallInitiationType() { + return mIsDialpadShown + ? CallInitiationType.Type.DIALPAD + : CallInitiationType.Type.REGULAR_SEARCH; + } + + /** Popup menu accessible from the search bar */ protected class OptionsPopupMenu extends PopupMenu { public OptionsPopupMenu(Context context, View anchor) { @@ -1505,6 +1637,10 @@ public class DialtactsActivity extends TransactionSafeActivity simulatorMenuItem.setVisible(false); } + Main dialtacts = MainComponent.get(context).getMain(); + menu.findItem(R.id.menu_new_ui_launcher_shortcut) + .setVisible(dialtacts.isNewUiEnabled(context)); + super.show(); } } diff --git a/java/com/android/dialer/app/SpecialCharSequenceMgr.java b/java/com/android/dialer/app/SpecialCharSequenceMgr.java deleted file mode 100644 index 85c2ea650..000000000 --- a/java/com/android/dialer/app/SpecialCharSequenceMgr.java +++ /dev/null @@ -1,495 +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.dialer.app; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.DialogFragment; -import android.app.KeyguardManager; -import android.app.ProgressDialog; -import android.content.ActivityNotFoundException; -import android.content.ContentResolver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import android.provider.Settings; -import android.support.annotation.Nullable; -import android.telecom.PhoneAccount; -import android.telecom.PhoneAccountHandle; -import android.telephony.PhoneNumberUtils; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.view.WindowManager; -import android.widget.EditText; -import android.widget.Toast; -import com.android.common.io.MoreCloseables; -import com.android.contacts.common.compat.TelephonyManagerCompat; -import com.android.contacts.common.database.NoNullCursorAsyncQueryHandler; -import com.android.contacts.common.util.ContactDisplayUtils; -import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment; -import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment.SelectPhoneAccountListener; -import com.android.dialer.calllogutils.PhoneAccountUtils; -import com.android.dialer.common.Assert; -import com.android.dialer.common.LogUtil; -import com.android.dialer.compat.CompatUtils; -import com.android.dialer.oem.MotorolaUtils; -import com.android.dialer.telecom.TelecomUtil; -import java.util.ArrayList; -import java.util.List; - -/** - * Helper class to listen for some magic character sequences that are handled specially by the - * dialer. - * - *

Note the Phone app also handles these sequences too (in a couple of relatively obscure places - * in the UI), so there's a separate version of this class under apps/Phone. - * - *

TODO: there's lots of duplicated code between this class and the corresponding class under - * apps/Phone. 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 = "SpecialCharSequenceMgr"; - - private static final String TAG_SELECT_ACCT_FRAGMENT = "tag_select_acct_fragment"; - - private static final String MMI_IMEI_DISPLAY = "*#06#"; - private static final String MMI_REGULATORY_INFO_DISPLAY = "*#07#"; - /** ***** This code is used to handle SIM Contact queries ***** */ - private static final String ADN_PHONE_NUMBER_COLUMN_NAME = "number"; - - private static final String ADN_NAME_COLUMN_NAME = "name"; - private static final int ADN_QUERY_TOKEN = -1; - /** - * Remembers the previous {@link QueryHandler} and cancel the operation when needed, to prevent - * possible crash. - * - *

QueryHandler may call {@link ProgressDialog#dismiss()} when the screen is already gone, - * which will cause the app crash. This variable enables the class to prevent the crash on {@link - * #cleanup()}. - * - *

TODO: Remove this and replace it (and {@link #cleanup()}) with better implementation. One - * complication is that we have SpecialCharSequenceMgr in Phone package too, which has *slightly* - * different implementation. Note that Phone package doesn't have this problem, so the class on - * Phone side doesn't have this functionality. Fundamental fix would be to have one shared - * implementation and resolve this corner case more gracefully. - */ - private static QueryHandler sPreviousAdnQueryHandler; - - /** This class is never instantiated. */ - private SpecialCharSequenceMgr() {} - - public static boolean handleChars(Context context, String input, EditText textField) { - //get rid of the separators so that the string gets parsed correctly - String dialString = PhoneNumberUtils.stripSeparators(input); - - if (handleDeviceIdDisplay(context, dialString) - || handleRegulatoryInfoDisplay(context, dialString) - || handlePinEntry(context, dialString) - || handleAdnEntry(context, dialString, textField) - || handleSecretCode(context, dialString)) { - return true; - } - - if (MotorolaUtils.handleSpecialCharSequence(context, input)) { - return true; - } - - return false; - } - - /** - * Cleanup everything around this class. Must be run inside the main thread. - * - *

This should be called when the screen becomes background. - */ - public static void cleanup() { - Assert.isMainThread(); - - if (sPreviousAdnQueryHandler != null) { - sPreviousAdnQueryHandler.cancel(); - sPreviousAdnQueryHandler = null; - } - } - - /** - * Handles secret codes to launch arbitrary activities in the form of *#*##*#*. - * - * @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 and handled - */ - static boolean handleSecretCode(Context context, String input) { - // Secret codes are accessed by dialing *#*##*#* - - int len = input.length(); - if (len <= 8 || !input.startsWith("*#*#") || !input.endsWith("#*#*")) { - return false; - } - String secretCode = input.substring(4, len - 4); - TelephonyManagerCompat.handleSecretCode(context, secretCode); - return true; - } - - /** - * Handle ADN requests by filling in the SIM contact number into the requested EditText. - * - *

This code works alongside the Asynchronous query handler {@link QueryHandler} and query - * cancel handler implemented in {@link SimContactQueryCookie}. - */ - static boolean handleAdnEntry(Context context, String input, EditText textField) { - /* ADN entries are of the form "N(N)(N)#" */ - TelephonyManager telephonyManager = - (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - if (telephonyManager == null - || telephonyManager.getPhoneType() != TelephonyManager.PHONE_TYPE_GSM) { - return false; - } - - // 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. - KeyguardManager keyguardManager = - (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); - if (keyguardManager.inKeyguardRestrictedInputMode()) { - return false; - } - - int len = input.length(); - if ((len > 1) && (len < 5) && (input.endsWith("#"))) { - try { - // get the ordinal number of the sim contact - final int index = Integer.parseInt(input.substring(0, len - 1)); - - // The original code that navigated to a SIM Contacts list view did not - // highlight the requested contact correctly, a requirement for PTCRB - // certification. This behaviour is consistent with the UI paradigm - // for touch-enabled lists, so it does not make sense to try to work - // around it. Instead we fill in the the requested phone number into - // the dialer text field. - - // create the async query handler - final QueryHandler handler = new QueryHandler(context.getContentResolver()); - - // create the cookie object - final SimContactQueryCookie sc = - new SimContactQueryCookie(index - 1, handler, ADN_QUERY_TOKEN); - - // setup the cookie fields - sc.contactNum = index - 1; - sc.setTextField(textField); - - // create the progress dialog - sc.progressDialog = new ProgressDialog(context); - sc.progressDialog.setTitle(R.string.simContacts_title); - sc.progressDialog.setMessage(context.getText(R.string.simContacts_emptyLoading)); - sc.progressDialog.setIndeterminate(true); - sc.progressDialog.setCancelable(true); - sc.progressDialog.setOnCancelListener(sc); - sc.progressDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); - - List subscriptionAccountHandles = - PhoneAccountUtils.getSubscriptionPhoneAccounts(context); - Context applicationContext = context.getApplicationContext(); - boolean hasUserSelectedDefault = - subscriptionAccountHandles.contains( - TelecomUtil.getDefaultOutgoingPhoneAccount( - applicationContext, PhoneAccount.SCHEME_TEL)); - - if (subscriptionAccountHandles.size() <= 1 || hasUserSelectedDefault) { - Uri uri = TelecomUtil.getAdnUriForPhoneAccount(applicationContext, null); - handleAdnQuery(handler, sc, uri); - } else { - SelectPhoneAccountListener callback = - new HandleAdnEntryAccountSelectedCallback(applicationContext, handler, sc); - - DialogFragment dialogFragment = - SelectPhoneAccountDialogFragment.newInstance( - subscriptionAccountHandles, callback, null); - dialogFragment.show(((Activity) context).getFragmentManager(), TAG_SELECT_ACCT_FRAGMENT); - } - - return true; - } catch (NumberFormatException ex) { - // Ignore - } - } - return false; - } - - private static void handleAdnQuery(QueryHandler handler, SimContactQueryCookie cookie, Uri uri) { - if (handler == null || cookie == null || uri == null) { - LogUtil.w("SpecialCharSequenceMgr.handleAdnQuery", "queryAdn parameters incorrect"); - return; - } - - // display the progress dialog - cookie.progressDialog.show(); - - // run the query. - handler.startQuery( - ADN_QUERY_TOKEN, - cookie, - uri, - new String[] {ADN_PHONE_NUMBER_COLUMN_NAME}, - null, - null, - null); - - if (sPreviousAdnQueryHandler != null) { - // It is harmless to call cancel() even after the handler's gone. - sPreviousAdnQueryHandler.cancel(); - } - sPreviousAdnQueryHandler = handler; - } - - static boolean handlePinEntry(final Context context, final String input) { - if ((input.startsWith("**04") || input.startsWith("**05")) && input.endsWith("#")) { - List subscriptionAccountHandles = - PhoneAccountUtils.getSubscriptionPhoneAccounts(context); - boolean hasUserSelectedDefault = - subscriptionAccountHandles.contains( - TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_TEL)); - - if (subscriptionAccountHandles.size() <= 1 || hasUserSelectedDefault) { - // Don't bring up the dialog for single-SIM or if the default outgoing account is - // a subscription account. - return TelecomUtil.handleMmi(context, input, null); - } else { - SelectPhoneAccountListener listener = new HandleMmiAccountSelectedCallback(context, input); - - DialogFragment dialogFragment = - SelectPhoneAccountDialogFragment.newInstance( - subscriptionAccountHandles, listener, null); - dialogFragment.show(((Activity) context).getFragmentManager(), TAG_SELECT_ACCT_FRAGMENT); - } - return true; - } - return false; - } - - // TODO: Use TelephonyCapabilities.getDeviceIdLabel() to get the device id label instead of a - // hard-coded string. - static boolean handleDeviceIdDisplay(Context context, String input) { - TelephonyManager telephonyManager = - (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - - if (telephonyManager != null && input.equals(MMI_IMEI_DISPLAY)) { - int labelResId = - (telephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) - ? R.string.imei - : R.string.meid; - - List deviceIds = new ArrayList(); - if (TelephonyManagerCompat.getPhoneCount(telephonyManager) > 1 - && CompatUtils.isMethodAvailable( - TelephonyManagerCompat.TELEPHONY_MANAGER_CLASS, "getDeviceId", Integer.TYPE)) { - for (int slot = 0; slot < telephonyManager.getPhoneCount(); slot++) { - String deviceId = telephonyManager.getDeviceId(slot); - if (!TextUtils.isEmpty(deviceId)) { - deviceIds.add(deviceId); - } - } - } else { - deviceIds.add(telephonyManager.getDeviceId()); - } - - new AlertDialog.Builder(context) - .setTitle(labelResId) - .setItems(deviceIds.toArray(new String[deviceIds.size()]), null) - .setPositiveButton(android.R.string.ok, null) - .setCancelable(false) - .show(); - return true; - } - return false; - } - - private static boolean handleRegulatoryInfoDisplay(Context context, String input) { - if (input.equals(MMI_REGULATORY_INFO_DISPLAY)) { - LogUtil.i( - "SpecialCharSequenceMgr.handleRegulatoryInfoDisplay", "sending intent to settings app"); - Intent showRegInfoIntent = new Intent(Settings.ACTION_SHOW_REGULATORY_INFO); - try { - context.startActivity(showRegInfoIntent); - } catch (ActivityNotFoundException e) { - LogUtil.e( - "SpecialCharSequenceMgr.handleRegulatoryInfoDisplay", "startActivity() failed: ", e); - } - return true; - } - return false; - } - - public static class HandleAdnEntryAccountSelectedCallback extends SelectPhoneAccountListener { - - private final Context mContext; - private final QueryHandler mQueryHandler; - private final SimContactQueryCookie mCookie; - - public HandleAdnEntryAccountSelectedCallback( - Context context, QueryHandler queryHandler, SimContactQueryCookie cookie) { - mContext = context; - mQueryHandler = queryHandler; - mCookie = cookie; - } - - @Override - public void onPhoneAccountSelected( - PhoneAccountHandle selectedAccountHandle, boolean setDefault, @Nullable String callId) { - Uri uri = TelecomUtil.getAdnUriForPhoneAccount(mContext, selectedAccountHandle); - handleAdnQuery(mQueryHandler, mCookie, uri); - // TODO: Show error dialog if result isn't valid. - } - } - - public static class HandleMmiAccountSelectedCallback extends SelectPhoneAccountListener { - - private final Context mContext; - private final String mInput; - - public HandleMmiAccountSelectedCallback(Context context, String input) { - mContext = context.getApplicationContext(); - mInput = input; - } - - @Override - public void onPhoneAccountSelected( - PhoneAccountHandle selectedAccountHandle, boolean setDefault, @Nullable String callId) { - TelecomUtil.handleMmi(mContext, mInput, selectedAccountHandle); - } - } - - /** - * Cookie object that contains everything we need to communicate to the handler's onQuery - * Complete, as well as what we need in order to cancel the query (if requested). - * - *

Note, access to the textField field is going to be synchronized, because the user can - * request a cancel at any time through the UI. - */ - private static class SimContactQueryCookie implements DialogInterface.OnCancelListener { - - public ProgressDialog progressDialog; - public int contactNum; - - // Used to identify the query request. - private int mToken; - private QueryHandler mHandler; - - // The text field we're going to update - private EditText textField; - - public SimContactQueryCookie(int number, QueryHandler handler, int token) { - contactNum = number; - mHandler = handler; - mToken = token; - } - - /** Synchronized getter for the EditText. */ - public synchronized EditText getTextField() { - return textField; - } - - /** Synchronized setter for the EditText. */ - public synchronized void setTextField(EditText text) { - textField = text; - } - - /** - * Cancel the ADN query by stopping the operation and signaling the cookie that a cancel request - * is made. - */ - @Override - public synchronized void onCancel(DialogInterface dialog) { - // close the progress dialog - if (progressDialog != null) { - progressDialog.dismiss(); - } - - // setting the textfield to null ensures that the UI does NOT get - // updated. - textField = null; - - // Cancel the operation if possible. - mHandler.cancelOperation(mToken); - } - } - - /** - * Asynchronous query handler that services requests to look up ADNs - * - *

Queries originate from {@link #handleAdnEntry}. - */ - private static class QueryHandler extends NoNullCursorAsyncQueryHandler { - - private boolean mCanceled; - - public QueryHandler(ContentResolver cr) { - super(cr); - } - - /** Override basic onQueryComplete to fill in the textfield when we're handed the ADN cursor. */ - @Override - protected void onNotNullableQueryComplete(int token, Object cookie, Cursor c) { - try { - sPreviousAdnQueryHandler = null; - if (mCanceled) { - return; - } - - SimContactQueryCookie sc = (SimContactQueryCookie) cookie; - - // close the progress dialog. - sc.progressDialog.dismiss(); - - // get the EditText to update or see if the request was cancelled. - EditText text = sc.getTextField(); - - // if the TextView is valid, and the cursor is valid and positionable on the - // Nth number, then we update the text field and display a toast indicating the - // caller name. - if ((c != null) && (text != null) && (c.moveToPosition(sc.contactNum))) { - String name = c.getString(c.getColumnIndexOrThrow(ADN_NAME_COLUMN_NAME)); - String number = c.getString(c.getColumnIndexOrThrow(ADN_PHONE_NUMBER_COLUMN_NAME)); - - // fill the text in. - text.getText().replace(0, 0, number); - - // display the name as a toast - Context context = sc.progressDialog.getContext(); - CharSequence msg = - ContactDisplayUtils.getTtsSpannedPhoneNumber( - context.getResources(), R.string.menu_callNumber, name); - Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); - } - } finally { - MoreCloseables.closeQuietly(c); - } - } - - public void cancel() { - mCanceled = true; - // Ask AsyncQueryHandler to cancel the whole request. This will fail when the query is - // already started. - cancelOperation(ADN_QUERY_TOKEN); - } - } -} diff --git a/java/com/android/dialer/app/bindings/DialerBindings.java b/java/com/android/dialer/app/bindings/DialerBindings.java deleted file mode 100644 index e1f517860..000000000 --- a/java/com/android/dialer/app/bindings/DialerBindings.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.dialer.app.bindings; - -import com.android.dialer.common.ConfigProvider; - -/** This interface allows the container application to customize the dialer. */ -public interface DialerBindings { - - ConfigProvider getConfigProvider(); -} diff --git a/java/com/android/dialer/app/bindings/DialerBindingsFactory.java b/java/com/android/dialer/app/bindings/DialerBindingsFactory.java deleted file mode 100644 index 9f209f99e..000000000 --- a/java/com/android/dialer/app/bindings/DialerBindingsFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.app.bindings; - -/** - * This interface should be implementated by the Application subclass. It allows the dialer module - * to get references to the DialerBindings. - */ -public interface DialerBindingsFactory { - - DialerBindings newDialerBindings(); -} diff --git a/java/com/android/dialer/app/bindings/DialerBindingsStub.java b/java/com/android/dialer/app/bindings/DialerBindingsStub.java deleted file mode 100644 index f56743fa5..000000000 --- a/java/com/android/dialer/app/bindings/DialerBindingsStub.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.dialer.app.bindings; - -import com.android.dialer.common.ConfigProvider; - -/** Default implementation for dialer bindings. */ -public class DialerBindingsStub implements DialerBindings { - private ConfigProvider configProvider; - - @Override - public ConfigProvider getConfigProvider() { - if (configProvider == null) { - configProvider = - new ConfigProvider() { - @Override - public String getString(String key, String defaultValue) { - return defaultValue; - } - - @Override - public long getLong(String key, long defaultValue) { - return defaultValue; - } - - @Override - public boolean getBoolean(String key, boolean defaultValue) { - return defaultValue; - } - }; - } - return configProvider; - } -} diff --git a/java/com/android/dialer/app/calllog/CallLogActivity.java b/java/com/android/dialer/app/calllog/CallLogActivity.java index 443171d3f..1bb894c59 100644 --- a/java/com/android/dialer/app/calllog/CallLogActivity.java +++ b/java/com/android/dialer/app/calllog/CallLogActivity.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.os.Bundle; import android.provider.CallLog; import android.provider.CallLog.Calls; +import android.support.design.widget.Snackbar; import android.support.v13.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; @@ -31,9 +32,14 @@ import android.view.ViewGroup; import com.android.contacts.common.list.ViewPagerTabs; import com.android.dialer.app.DialtactsActivity; import com.android.dialer.app.R; +import com.android.dialer.calldetails.CallDetailsActivity; +import com.android.dialer.constants.ActivityRequestCodes; import com.android.dialer.database.CallLogQueryHandler; import com.android.dialer.logging.Logger; import com.android.dialer.logging.ScreenEvent; +import com.android.dialer.logging.UiAction; +import com.android.dialer.performancereport.PerformanceReport; +import com.android.dialer.postcall.PostCall; import com.android.dialer.util.TransactionSafeActivity; import com.android.dialer.util.ViewUtil; @@ -48,7 +54,6 @@ public class CallLogActivity extends TransactionSafeActivity private ViewPagerTabs mViewPagerTabs; private ViewPagerAdapter mViewPagerAdapter; private CallLogFragment mAllCallsFragment; - private CallLogFragment mMissedCallsFragment; private String[] mTabTitles; private boolean mIsResumed; @@ -93,9 +98,16 @@ public class CallLogActivity extends TransactionSafeActivity @Override protected void onResume() { + // Some calls may not be recorded (eg. from quick contact), + // so we should restart recording after these calls. (Recorded call is stopped) + PostCall.restartPerformanceRecordingIfARecentCallExist(this); + if (!PerformanceReport.isRecording()) { + PerformanceReport.startRecording(); + } + mIsResumed = true; super.onResume(); - sendScreenViewForChildFragment(mViewPager.getCurrentItem()); + sendScreenViewForChildFragment(); } @Override @@ -129,6 +141,7 @@ public class CallLogActivity extends TransactionSafeActivity } if (item.getItemId() == android.R.id.home) { + PerformanceReport.recordClick(UiAction.Type.CLOSE_CALL_HISTORY_WITH_CANCEL_BUTTON); final Intent intent = new Intent(this, DialtactsActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); @@ -148,7 +161,7 @@ public class CallLogActivity extends TransactionSafeActivity @Override public void onPageSelected(int position) { if (mIsResumed) { - sendScreenViewForChildFragment(position); + sendScreenViewForChildFragment(); } mViewPagerTabs.onPageSelected(position); } @@ -158,7 +171,7 @@ public class CallLogActivity extends TransactionSafeActivity mViewPagerTabs.onPageScrollStateChanged(state); } - private void sendScreenViewForChildFragment(int position) { + private void sendScreenViewForChildFragment() { Logger.get(this).logScreenView(ScreenEvent.Type.CALL_LOG_FILTER, this); } @@ -169,6 +182,12 @@ public class CallLogActivity extends TransactionSafeActivity return position; } + @Override + public void onBackPressed() { + PerformanceReport.recordClick(UiAction.Type.PRESS_ANDROID_BACK_BUTTON); + super.onBackPressed(); + } + /** Adapter for the view pager. */ public class ViewPagerAdapter extends FragmentPagerAdapter { @@ -189,20 +208,16 @@ public class CallLogActivity extends TransactionSafeActivity CallLogQueryHandler.CALL_TYPE_ALL, true /* isCallLogActivity */); case TAB_INDEX_MISSED: return new CallLogFragment(Calls.MISSED_TYPE, true /* isCallLogActivity */); + default: + throw new IllegalStateException("No fragment at position " + position); } - throw new IllegalStateException("No fragment at position " + position); } @Override public Object instantiateItem(ViewGroup container, int position) { final CallLogFragment fragment = (CallLogFragment) super.instantiateItem(container, position); - switch (position) { - case TAB_INDEX_ALL: + if (position == TAB_INDEX_ALL) { mAllCallsFragment = fragment; - break; - case TAB_INDEX_MISSED: - mMissedCallsFragment = fragment; - break; } return fragment; } @@ -217,4 +232,22 @@ public class CallLogActivity extends TransactionSafeActivity return TAB_INDEX_COUNT; } } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == ActivityRequestCodes.DIALTACTS_CALL_DETAILS) { + if (resultCode == RESULT_OK + && data != null + && data.getBooleanExtra(CallDetailsActivity.EXTRA_HAS_ENRICHED_CALL_DATA, false)) { + String number = data.getStringExtra(CallDetailsActivity.EXTRA_PHONE_NUMBER); + Snackbar.make(findViewById(R.id.calllog_frame), getString(R.string.ec_data_deleted), 5_000) + .setAction( + R.string.view_conversation, + v -> startActivity(IntentProvider.getSendSmsIntentProvider(number).getIntent(this))) + .setActionTextColor(getResources().getColor(R.color.dialer_snackbar_action_text_color)) + .show(); + } + } + super.onActivityResult(requestCode, resultCode, data); + } } diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java index 2f8a58c8a..61129a7ce 100644 --- a/java/com/android/dialer/app/calllog/CallLogAdapter.java +++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java @@ -19,6 +19,7 @@ package com.android.dialer.app.calllog; import android.app.Activity; import android.content.ContentUris; import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; @@ -52,7 +53,6 @@ import android.view.ViewGroup; import com.android.contacts.common.ContactsUtils; import com.android.contacts.common.compat.PhoneNumberUtilsCompat; import com.android.contacts.common.preference.ContactsPreferences; -import com.android.dialer.app.Bindings; import com.android.dialer.app.DialtactsActivity; import com.android.dialer.app.R; import com.android.dialer.app.calllog.CallLogGroupBuilder.GroupCreator; @@ -63,31 +63,32 @@ import com.android.dialer.app.voicemail.VoicemailPlaybackPresenter.OnVoicemailDe import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; import com.android.dialer.calldetails.CallDetailsEntries; import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; +import com.android.dialer.callintent.CallIntentBuilder; import com.android.dialer.calllogutils.PhoneAccountUtils; import com.android.dialer.calllogutils.PhoneCallDetails; import com.android.dialer.common.Assert; -import com.android.dialer.common.ConfigProviderBindings; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.AsyncTaskExecutor; import com.android.dialer.common.concurrent.AsyncTaskExecutors; +import com.android.dialer.configprovider.ConfigProviderBindings; import com.android.dialer.enrichedcall.EnrichedCallCapabilities; import com.android.dialer.enrichedcall.EnrichedCallComponent; import com.android.dialer.enrichedcall.EnrichedCallManager; -import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult; import com.android.dialer.lightbringer.Lightbringer; import com.android.dialer.lightbringer.LightbringerComponent; import com.android.dialer.lightbringer.LightbringerListener; import com.android.dialer.logging.ContactSource; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; +import com.android.dialer.logging.UiAction; +import com.android.dialer.performancereport.PerformanceReport; import com.android.dialer.phonenumbercache.CallLogQuery; import com.android.dialer.phonenumbercache.ContactInfo; import com.android.dialer.phonenumbercache.ContactInfoHelper; import com.android.dialer.phonenumberutil.PhoneNumberHelper; import com.android.dialer.spam.Spam; import com.android.dialer.util.PermissionsUtil; -import java.util.Collections; -import java.util.List; +import java.util.ArrayList; import java.util.Map; import java.util.Set; @@ -105,11 +106,12 @@ public class CallLogAdapter extends GroupingListAdapter private static final String KEY_EXPANDED_POSITION = "expanded_position"; private static final String KEY_EXPANDED_ROW_ID = "expanded_row_id"; + private static final String KEY_ACTION_MODE = "action_mode_selected_items"; public static final String LOAD_DATA_TASK_IDENTIFIER = "load_data"; public static final String ENABLE_CALL_LOG_MULTI_SELECT = "enable_call_log_multiselect"; - public static final boolean ENABLE_CALL_LOG_MULTI_SELECT_FLAG = false; + public static final boolean ENABLE_CALL_LOG_MULTI_SELECT_FLAG = true; protected final Activity mActivity; protected final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter; @@ -117,6 +119,8 @@ public class CallLogAdapter extends GroupingListAdapter protected final CallLogCache mCallLogCache; private final CallFetcher mCallFetcher; + private final OnActionModeStateChangedListener mActionModeStateChangedListener; + private final MultiSelectRemoveView mMultiSelectRemoveView; @NonNull private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler; private final int mActivityType; @@ -136,6 +140,8 @@ public class CallLogAdapter extends GroupingListAdapter private final CallLogAlertManager mCallLogAlertManager; public ActionMode mActionMode = null; + public boolean selectAllMode = false; + public boolean deselectAllMode = false; private final SparseArray selectedItems = new SparseArray<>(); private final ActionMode.Callback mActionModeCallback = @@ -144,10 +150,17 @@ public class CallLogAdapter extends GroupingListAdapter // Called when the action mode is created; startActionMode() was called @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { + if (mActivity != null) { + announceforAccessibility( + mActivity.getCurrentFocus(), + mActivity.getString(R.string.description_entering_bulk_action_mode)); + } mActionMode = mode; // Inflate a menu resource providing context menu items MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.actionbar_delete, menu); + mMultiSelectRemoveView.showMultiSelectRemoveView(true); + mActionModeStateChangedListener.onActionModeStateChanged(true); return true; } @@ -162,10 +175,10 @@ public class CallLogAdapter extends GroupingListAdapter @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { if (item.getItemId() == R.id.action_bar_delete_menu_item) { + Logger.get(mActivity).logImpression(DialerImpression.Type.MULTISELECT_TAP_DELETE_ICON); if (selectedItems.size() > 0) { showDeleteSelectedItemsDialog(); } - mode.finish(); return true; } else { return false; @@ -175,53 +188,78 @@ public class CallLogAdapter extends GroupingListAdapter // Called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode mode) { + if (mActivity != null) { + announceforAccessibility( + mActivity.getCurrentFocus(), + mActivity.getString(R.string.description_leaving_bulk_action_mode)); + } selectedItems.clear(); mActionMode = null; + selectAllMode = false; + deselectAllMode = false; + mMultiSelectRemoveView.showMultiSelectRemoveView(false); + mActionModeStateChangedListener.onActionModeStateChanged(false); notifyDataSetChanged(); } }; - // Todo (uabdullah): Use plurals http://b/37751831 private void showDeleteSelectedItemsDialog() { - AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); - Assert.checkArgument(selectedItems.size() > 0); - String voicemailString = - selectedItems.size() == 1 - ? mActivity.getResources().getString(R.string.voicemailMultiSelectVoicemail) - : mActivity.getResources().getString(R.string.voicemailMultiSelectVoicemails); - String deleteVoicemailTitle = - mActivity - .getResources() - .getString(R.string.voicemailMultiSelectDialogTitle, voicemailString); SparseArray voicemailsToDeleteOnConfirmation = selectedItems.clone(); - builder.setTitle(deleteVoicemailTitle); - - builder.setPositiveButton( - mActivity.getResources().getString(R.string.voicemailMultiSelectDeleteConfirm), - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - deleteSelectedItems(voicemailsToDeleteOnConfirmation); - dialog.cancel(); - } - }); - - builder.setNegativeButton( - mActivity.getResources().getString(R.string.voicemailMultiSelectDeleteCancel), - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); - - AlertDialog dialog = builder.create(); - dialog.show(); + new AlertDialog.Builder(mActivity, R.style.AlertDialogCustom) + .setCancelable(true) + .setTitle( + mActivity + .getResources() + .getQuantityString( + R.plurals.delete_voicemails_confirmation_dialog_title, selectedItems.size())) + .setPositiveButton( + R.string.voicemailMultiSelectDeleteConfirm, + new DialogInterface.OnClickListener() { + @Override + public void onClick(final DialogInterface dialog, final int button) { + LogUtil.i( + "CallLogAdapter.showDeleteSelectedItemsDialog", + "onClick, these items to delete " + voicemailsToDeleteOnConfirmation); + deleteSelectedItems(voicemailsToDeleteOnConfirmation); + mActionMode.finish(); + dialog.cancel(); + Logger.get(mActivity) + .logImpression( + DialerImpression.Type.MULTISELECT_DELETE_ENTRY_VIA_CONFIRMATION_DIALOG); + } + }) + .setOnCancelListener( + new OnCancelListener() { + @Override + public void onCancel(DialogInterface dialogInterface) { + Logger.get(mActivity) + .logImpression( + DialerImpression.Type + .MULTISELECT_CANCEL_CONFIRMATION_DIALOG_VIA_CANCEL_TOUCH); + dialogInterface.cancel(); + } + }) + .setNegativeButton( + R.string.voicemailMultiSelectDeleteCancel, + new DialogInterface.OnClickListener() { + @Override + public void onClick(final DialogInterface dialog, final int button) { + Logger.get(mActivity) + .logImpression( + DialerImpression.Type + .MULTISELECT_CANCEL_CONFIRMATION_DIALOG_VIA_CANCEL_BUTTON); + dialog.cancel(); + } + }) + .show(); + Logger.get(mActivity) + .logImpression(DialerImpression.Type.MULTISELECT_DISPLAY_DELETE_CONFIRMATION_DIALOG); } private void deleteSelectedItems(SparseArray voicemailsToDelete) { for (int i = 0; i < voicemailsToDelete.size(); i++) { String voicemailUri = voicemailsToDelete.get(voicemailsToDelete.keyAt(i)); + LogUtil.i("CallLogAdapter.deleteSelectedItems", "deleting uri:" + voicemailUri); CallLogAsyncTaskUtil.deleteVoicemail(mActivity, Uri.parse(voicemailUri), null); } } @@ -235,8 +273,13 @@ public class CallLogAdapter extends GroupingListAdapter && mVoicemailPlaybackPresenter != null) { if (v.getId() == R.id.primary_action_view || v.getId() == R.id.quick_contact_photo) { if (mActionMode == null) { + Logger.get(mActivity) + .logImpression( + DialerImpression.Type.MULTISELECT_LONG_PRESS_ENTER_MULTI_SELECT_MODE); mActionMode = v.startActionMode(mActionModeCallback); } + Logger.get(mActivity) + .logImpression(DialerImpression.Type.MULTISELECT_LONG_PRESS_TAP_ENTRY); CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder) v.getTag(); viewHolder.quickContactView.setVisibility(View.GONE); viewHolder.checkBoxView.setVisibility(View.VISIBLE); @@ -248,32 +291,45 @@ public class CallLogAdapter extends GroupingListAdapter } }; + @VisibleForTesting + public View.OnClickListener getExpandCollapseListener() { + return mExpandCollapseListener; + } + /** The OnClickListener used to expand or collapse the action buttons of a call log entry. */ private final View.OnClickListener mExpandCollapseListener = new View.OnClickListener() { @Override public void onClick(View v) { + PerformanceReport.recordClick(UiAction.Type.CLICK_CALL_LOG_ITEM); + CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder) v.getTag(); if (viewHolder == null) { return; } if (mActionMode != null && viewHolder.voicemailUri != null) { + selectAllMode = false; + deselectAllMode = false; + mMultiSelectRemoveView.setSelectAllModeToFalse(); int id = getVoicemailId(viewHolder.voicemailUri); if (selectedItems.get(id) != null) { - selectedItems.delete(id); - viewHolder.checkBoxView.setVisibility(View.GONE); - viewHolder.quickContactView.setVisibility(View.VISIBLE); + Logger.get(mActivity) + .logImpression(DialerImpression.Type.MULTISELECT_SINGLE_PRESS_UNSELECT_ENTRY); + uncheckMarkCallLogEntry(viewHolder, id); } else { - viewHolder.quickContactView.setVisibility(View.GONE); - viewHolder.checkBoxView.setVisibility(View.VISIBLE); - selectedItems.put(getVoicemailId(viewHolder.voicemailUri), viewHolder.voicemailUri); - } - - if (selectedItems.size() == 0) { - mActionMode.finish(); - return; + Logger.get(mActivity) + .logImpression(DialerImpression.Type.MULTISELECT_SINGLE_PRESS_SELECT_ENTRY); + checkMarkCallLogEntry(viewHolder); + // select all check box logic + if (getItemCount() == selectedItems.size()) { + LogUtil.i( + "mExpandCollapseListener.onClick", + "getitem count %d is equal to items select count %d, check select all box", + getItemCount(), + selectedItems.size()); + mMultiSelectRemoveView.tapSelectAll(); + } } - mActionMode.setTitle(Integer.toString(selectedItems.size())); return; } @@ -285,14 +341,29 @@ public class CallLogAdapter extends GroupingListAdapter // If enriched call capabilities were unknown on the initial load, // viewHolder.isCallComposerCapable may be unset. Check here if we have the capabilities // as a last attempt at getting them before showing the expanded view to the user - EnrichedCallCapabilities capabilities = - getEnrichedCallManager().getCapabilities(viewHolder.number); - viewHolder.isCallComposerCapable = - capabilities != null && capabilities.supportsCallComposer(); - generateAndMapNewCallDetailsEntriesHistoryResults( - viewHolder.number, - viewHolder.getDetailedPhoneDetails(), - getAllHistoricalData(viewHolder.number, viewHolder.getDetailedPhoneDetails())); + EnrichedCallCapabilities capabilities = null; + + if (viewHolder.number != null) { + capabilities = getEnrichedCallManager().getCapabilities(viewHolder.number); + } + + if (capabilities == null) { + capabilities = EnrichedCallCapabilities.NO_CAPABILITIES; + } + + viewHolder.isCallComposerCapable = capabilities.isCallComposerCapable(); + + if (capabilities.isTemporarilyUnavailable()) { + LogUtil.i( + "mExpandCollapseListener.onClick", + "%s is temporarily unavailable, requesting capabilities", + LogUtil.sanitizePhoneNumber(viewHolder.number)); + // Refresh the capabilities when temporarily unavailable, see go/ec-temp-unavailable. + // Similarly to when we request capabilities the first time, the 'Share and call' button + // won't pop in with the new capabilities. Instead the row needs to be collapsed and + // expanded again. + getEnrichedCallManager().requestCapabilities(viewHolder.number); + } if (viewHolder.rowId == mCurrentlyExpandedRowId) { // Hide actions, if the clicked item is the expanded item. @@ -308,10 +379,77 @@ public class CallLogAdapter extends GroupingListAdapter } } expandViewHolderActions(viewHolder); + + if (isLightbringerCallButtonVisible(viewHolder.videoCallButtonView)) { + CallIntentBuilder.increaseLightbringerCallButtonAppearInExpandedCallLogItemCount(); + } + } + } + + private boolean isLightbringerCallButtonVisible(View videoCallButtonView) { + if (videoCallButtonView == null) { + return false; + } + if (videoCallButtonView.getVisibility() != View.VISIBLE) { + return false; + } + IntentProvider intentProvider = (IntentProvider) videoCallButtonView.getTag(); + if (intentProvider == null) { + return false; + } + String packageName = + LightbringerComponent.get(mActivity).getLightbringer().getPackageName(); + if (packageName == null) { + return false; } + return packageName.equals(intentProvider.getIntent(mActivity).getPackage()); } }; + private void checkMarkCallLogEntry(CallLogListItemViewHolder viewHolder) { + announceforAccessibility( + mActivity.getCurrentFocus(), + mActivity.getString( + R.string.description_selecting_bulk_action_mode, viewHolder.nameOrNumber)); + viewHolder.quickContactView.setVisibility(View.GONE); + viewHolder.checkBoxView.setVisibility(View.VISIBLE); + selectedItems.put(getVoicemailId(viewHolder.voicemailUri), viewHolder.voicemailUri); + updateActionBar(); + } + + private void announceforAccessibility(View view, String announcement) { + if (view != null) { + view.announceForAccessibility(announcement); + } + } + + private void updateActionBar() { + if (mActionMode == null && selectedItems.size() > 0) { + Logger.get(mActivity) + .logImpression(DialerImpression.Type.MULTISELECT_ROTATE_AND_SHOW_ACTION_MODE); + mActivity.startActionMode(mActionModeCallback); + } + if (mActionMode != null) { + mActionMode.setTitle( + mActivity + .getResources() + .getString( + R.string.voicemailMultiSelectActionBarTitle, + Integer.toString(selectedItems.size()))); + } + } + + private void uncheckMarkCallLogEntry(CallLogListItemViewHolder viewHolder, int id) { + announceforAccessibility( + mActivity.getCurrentFocus(), + mActivity.getString( + R.string.description_unselecting_bulk_action_mode, viewHolder.nameOrNumber)); + selectedItems.delete(id); + viewHolder.checkBoxView.setVisibility(View.GONE); + viewHolder.quickContactView.setVisibility(View.VISIBLE); + updateActionBar(); + } + private static int getVoicemailId(String voicemailUri) { Assert.checkArgument(voicemailUri != null); Assert.checkArgument(voicemailUri.length() > 0); @@ -328,7 +466,7 @@ public class CallLogAdapter extends GroupingListAdapter * Holds a list of URIs that are pending deletion or undo. If the activity ends before the undo * timeout, all of the pending URIs will be deleted. * - *

TODO: move this and OnVoicemailDeletedListener to somewhere like {@link + *

TODO(twyen): move this and OnVoicemailDeletedListener to somewhere like {@link * VisualVoicemailCallLogFragment}. The CallLogAdapter does not need to know about what to do with * hidden item or what to hide. */ @@ -358,6 +496,8 @@ public class CallLogAdapter extends GroupingListAdapter Activity activity, ViewGroup alertContainer, CallFetcher callFetcher, + MultiSelectRemoveView multiSelectRemoveView, + OnActionModeStateChangedListener actionModeStateChangedListener, CallLogCache callLogCache, ContactInfoCache contactInfoCache, VoicemailPlaybackPresenter voicemailPlaybackPresenter, @@ -367,6 +507,8 @@ public class CallLogAdapter extends GroupingListAdapter mActivity = activity; mCallFetcher = callFetcher; + mActionModeStateChangedListener = actionModeStateChangedListener; + mMultiSelectRemoveView = multiSelectRemoveView; mVoicemailPlaybackPresenter = voicemailPlaybackPresenter; if (mVoicemailPlaybackPresenter != null) { mVoicemailPlaybackPresenter.setOnVoicemailDeletedListener(this); @@ -426,6 +568,25 @@ public class CallLogAdapter extends GroupingListAdapter public void onSaveInstanceState(Bundle outState) { outState.putInt(KEY_EXPANDED_POSITION, mCurrentlyExpandedPosition); outState.putLong(KEY_EXPANDED_ROW_ID, mCurrentlyExpandedRowId); + + ArrayList listOfSelectedItems = new ArrayList<>(); + + if (selectedItems.size() > 0) { + for (int i = 0; i < selectedItems.size(); i++) { + int id = selectedItems.keyAt(i); + String voicemailUri = selectedItems.valueAt(i); + LogUtil.i( + "CallLogAdapter.onSaveInstanceState", "index %d, id=%d, uri=%s ", i, id, voicemailUri); + listOfSelectedItems.add(voicemailUri); + } + } + outState.putStringArrayList(KEY_ACTION_MODE, listOfSelectedItems); + + LogUtil.i( + "CallLogAdapter.onSaveInstanceState", + "saved: %d, selectedItemsSize:%d", + listOfSelectedItems.size(), + selectedItems.size()); } public void onRestoreInstanceState(Bundle savedInstanceState) { @@ -434,6 +595,33 @@ public class CallLogAdapter extends GroupingListAdapter savedInstanceState.getInt(KEY_EXPANDED_POSITION, RecyclerView.NO_POSITION); mCurrentlyExpandedRowId = savedInstanceState.getLong(KEY_EXPANDED_ROW_ID, NO_EXPANDED_LIST_ITEM); + // Restoring multi selected entries + ArrayList listOfSelectedItems = + savedInstanceState.getStringArrayList(KEY_ACTION_MODE); + LogUtil.i( + "CallLogAdapter.onRestoreInstanceState", + "restored selectedItemsList:%d", + listOfSelectedItems.size()); + + if (!listOfSelectedItems.isEmpty()) { + for (int i = 0; i < listOfSelectedItems.size(); i++) { + String voicemailUri = listOfSelectedItems.get(i); + int id = getVoicemailId(voicemailUri); + LogUtil.i( + "CallLogAdapter.onRestoreInstanceState", + "restoring selected index %d, id=%d, uri=%s ", + i, + id, + voicemailUri); + selectedItems.put(id, voicemailUri); + } + + LogUtil.i( + "CallLogAdapter.onRestoreInstance", + "restored selectedItems %s", + selectedItems.toString()); + updateActionBar(); + } } } @@ -521,6 +709,7 @@ public class CallLogAdapter extends GroupingListAdapter mBlockReportSpamListener, mExpandCollapseListener, mLongPressListener, + mActionModeStateChangedListener, mCallLogCache, mCallLogListItemHelper, mVoicemailPlaybackPresenter); @@ -546,7 +735,7 @@ public class CallLogAdapter extends GroupingListAdapter Trace.beginSection("onBindViewHolder: " + position); switch (getItemViewType(position)) { case VIEW_TYPE_ALERT: - //Do nothing + // Do nothing break; default: bindCallLogListViewHolder(viewHolder, position); @@ -559,6 +748,8 @@ public class CallLogAdapter extends GroupingListAdapter public void onViewRecycled(ViewHolder viewHolder) { if (viewHolder.getItemViewType() == VIEW_TYPE_CALLLOG) { CallLogListItemViewHolder views = (CallLogListItemViewHolder) viewHolder; + updateCheckMarkedStatusOfEntry(views); + if (views.asyncTask != null) { views.asyncTask.cancel(true); } @@ -591,6 +782,8 @@ public class CallLogAdapter extends GroupingListAdapter return; } CallLogListItemViewHolder views = (CallLogListItemViewHolder) viewHolder; + updateCheckMarkedStatusOfEntry(views); + views.isLoaded = false; int groupSize = getGroupSize(position); CallDetailsEntries callDetailsEntries = createCallDetailsEntries(c, groupSize); @@ -609,6 +802,17 @@ public class CallLogAdapter extends GroupingListAdapter loadAndRender(views, views.rowId, details, callDetailsEntries); } + private void updateCheckMarkedStatusOfEntry(CallLogListItemViewHolder views) { + if (selectedItems.size() > 0 && views.voicemailUri != null) { + int id = getVoicemailId(views.voicemailUri); + if (selectedItems.get(id) != null) { + checkMarkCallLogEntry(views); + } else { + uncheckMarkCallLogEntry(views, id); + } + } + } + private void loadAndRender( final CallLogListItemViewHolder views, final long rowId, @@ -625,12 +829,7 @@ public class CallLogAdapter extends GroupingListAdapter // the value will be false while capabilities are requested. mExpandCollapseListener will // attempt to set the field properly in that case views.isCallComposerCapable = isCallComposerCapable(views.number); - CallDetailsEntries updatedCallDetailsEntries = - generateAndMapNewCallDetailsEntriesHistoryResults( - views.number, - callDetailsEntries, - getAllHistoricalData(views.number, callDetailsEntries)); - views.setDetailedPhoneDetails(updatedCallDetailsEntries); + views.setDetailedPhoneDetails(callDetailsEntries); views.lightbringerReady = getLightbringer().isReachable(mActivity, views.number); final AsyncTask loadDataTask = new AsyncTask() { @@ -687,46 +886,7 @@ public class CallLogAdapter extends GroupingListAdapter getEnrichedCallManager().requestCapabilities(number); return false; } - return capabilities.supportsCallComposer(); - } - - @NonNull - private Map> getAllHistoricalData( - @Nullable String number, @NonNull CallDetailsEntries entries) { - if (number == null) { - return Collections.emptyMap(); - } - - Map> historicalData = - getEnrichedCallManager().getAllHistoricalData(number, entries); - if (historicalData == null) { - getEnrichedCallManager().requestAllHistoricalData(number, entries); - return Collections.emptyMap(); - } - return historicalData; - } - - private static CallDetailsEntries generateAndMapNewCallDetailsEntriesHistoryResults( - @Nullable String number, - @NonNull CallDetailsEntries callDetailsEntries, - @NonNull Map> mappedResults) { - if (number == null) { - return callDetailsEntries; - } - CallDetailsEntries.Builder mutableCallDetailsEntries = CallDetailsEntries.newBuilder(); - for (CallDetailsEntry entry : callDetailsEntries.getEntriesList()) { - CallDetailsEntry.Builder newEntry = CallDetailsEntry.newBuilder().mergeFrom(entry); - List results = mappedResults.get(entry); - if (results != null) { - newEntry.addAllHistoryResults(mappedResults.get(entry)); - LogUtil.v( - "CallLogAdapter.generateAndMapNewCallDetailsEntriesHistoryResults", - "mapped %d results", - newEntry.getHistoryResultsList().size()); - } - mutableCallDetailsEntries.addEntries(newEntry.build()); - } - return mutableCallDetailsEntries.build(); + return capabilities.isCallComposerCapable(); } /** @@ -744,6 +904,10 @@ public class CallLogAdapter extends GroupingListAdapter (VERSION.SDK_INT >= VERSION_CODES.N) ? cursor.getString(CallLogQuery.VIA_NUMBER) : ""; final int numberPresentation = cursor.getInt(CallLogQuery.NUMBER_PRESENTATION); final ContactInfo cachedContactInfo = ContactInfoHelper.getContactInfo(cursor); + final int transcriptionState = + (VERSION.SDK_INT >= VERSION_CODES.O) + ? cursor.getInt(CallLogQuery.TRANSCRIPTION_STATE) + : PhoneCallDetailsHelper.TRANSCRIPTION_NOT_STARTED; final PhoneCallDetails details = new PhoneCallDetails(number, numberPresentation, postDialDigits); details.viaNumber = viaNumber; @@ -753,6 +917,7 @@ public class CallLogAdapter extends GroupingListAdapter details.features = getCallFeatures(cursor, count); details.geocode = cursor.getString(CallLogQuery.GEOCODED_LOCATION); details.transcription = cursor.getString(CallLogQuery.TRANSCRIPTION); + details.transcriptionState = transcriptionState; details.callTypes = getCallTypes(cursor, count); details.accountComponentName = cursor.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME); @@ -785,7 +950,7 @@ public class CallLogAdapter extends GroupingListAdapter } @MainThread - private static CallDetailsEntries createCallDetailsEntries(Cursor cursor, int count) { + private CallDetailsEntries createCallDetailsEntries(Cursor cursor, int count) { Assert.isMainThread(); int position = cursor.getPosition(); CallDetailsEntries.Builder entries = CallDetailsEntries.newBuilder(); @@ -798,6 +963,16 @@ public class CallLogAdapter extends GroupingListAdapter .setDate(cursor.getLong(CallLogQuery.DATE)) .setDuration(cursor.getLong(CallLogQuery.DURATION)) .setFeatures(cursor.getInt(CallLogQuery.FEATURES)); + + String phoneAccountComponentName = cursor.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME); + if (getLightbringer().getPhoneAccountComponentName() != null + && getLightbringer() + .getPhoneAccountComponentName() + .flattenToString() + .equals(phoneAccountComponentName)) { + entry.setIsLightbringerCall(true); + } + entries.addEntries(entry.build()); cursor.moveToNext(); } @@ -840,8 +1015,7 @@ public class CallLogAdapter extends GroupingListAdapter details.countryIso, details.cachedContactInfo, position - < Bindings.get(mActivity) - .getConfigProvider() + < ConfigProviderBindings.get(mActivity) .getLong("number_of_call_to_do_remote_lookup", 5L)); } CharSequence formattedNumber = @@ -917,6 +1091,12 @@ public class CallLogAdapter extends GroupingListAdapter views.workIconView.setVisibility( details.contactUserType == ContactsUtils.USER_TYPE_WORK ? View.VISIBLE : View.GONE); + if (selectAllMode && views.voicemailUri != null) { + selectedItems.put(getVoicemailId(views.voicemailUri), views.voicemailUri); + } + if (deselectAllMode && views.voicemailUri != null) { + selectedItems.delete(getVoicemailId(views.voicemailUri)); + } if (views.voicemailUri != null && selectedItems.get(getVoicemailId(views.voicemailUri)) != null) { views.checkBoxView.setVisibility(View.VISIBLE); @@ -925,7 +1105,6 @@ public class CallLogAdapter extends GroupingListAdapter views.checkBoxView.setVisibility(View.GONE); views.quickContactView.setVisibility(View.VISIBLE); } - mCallLogListItemHelper.setPhoneCallDetails(views, details); if (mCurrentlyExpandedRowId == views.rowId) { // In case ViewHolders were added/removed, update the expanded position if the rowIds @@ -1192,9 +1371,51 @@ public class CallLogAdapter extends GroupingListAdapter notifyDataSetChanged(); } + public void onAllSelected() { + selectAllMode = true; + deselectAllMode = false; + selectedItems.clear(); + for (int i = 0; i < getItemCount(); i++) { + Cursor c = (Cursor) getItem(i); + if (c != null) { + Assert.checkArgument(CallLogQuery.VOICEMAIL_URI == c.getColumnIndex("voicemail_uri")); + String voicemailUri = c.getString(CallLogQuery.VOICEMAIL_URI); + selectedItems.put(getVoicemailId(voicemailUri), voicemailUri); + } + } + updateActionBar(); + notifyDataSetChanged(); + } + + public void onAllDeselected() { + selectAllMode = false; + deselectAllMode = true; + selectedItems.clear(); + updateActionBar(); + notifyDataSetChanged(); + } + /** Interface used to initiate a refresh of the content. */ public interface CallFetcher { void fetchCalls(); } + + /** Interface used to allow single tap multi select for contact photos. */ + public interface OnActionModeStateChangedListener { + + void onActionModeStateChanged(boolean isEnabled); + + boolean isActionModeStateEnabled(); + } + + /** Interface used to hide the fragments. */ + public interface MultiSelectRemoveView { + + void showMultiSelectRemoveView(boolean show); + + void setSelectAllModeToFalse(); + + void tapSelectAll(); + } } diff --git a/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java b/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java index a5553d134..78ec7a695 100644 --- a/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java +++ b/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java @@ -28,6 +28,7 @@ import android.provider.VoicemailContract.Voicemails; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; +import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.AsyncTaskExecutor; import com.android.dialer.common.concurrent.AsyncTaskExecutors; import com.android.dialer.util.PermissionsUtil; @@ -45,6 +46,7 @@ public class CallLogAsyncTaskUtil { public static void markVoicemailAsRead( @NonNull final Context context, @NonNull final Uri voicemailUri) { + LogUtil.enterBlock("CallLogAsyncTaskUtil.markVoicemailAsRead, voicemailUri: " + voicemailUri); if (sAsyncTaskExecutor == null) { initTaskExecutor(); } @@ -64,11 +66,8 @@ public class CallLogAsyncTaskUtil { .update(voicemailUri, values, Voicemails.IS_READ + " = 0", null) > 0) { uploadVoicemailLocalChangesToServer(context); + CallLogNotificationsService.markAllNewVoicemailsAsOld(context); } - - Intent intent = new Intent(context, CallLogNotificationsService.class); - intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_VOICEMAILS_AS_OLD); - context.startService(intent); return null; } }); @@ -110,7 +109,8 @@ public class CallLogAsyncTaskUtil { } public static void markCallAsRead(@NonNull final Context context, @NonNull final long[] callIds) { - if (!PermissionsUtil.hasPhonePermissions(context)) { + if (!PermissionsUtil.hasPhonePermissions(context) + || !PermissionsUtil.hasCallLogWritePermissions(context)) { return; } if (sAsyncTaskExecutor == null) { diff --git a/java/com/android/dialer/app/calllog/CallLogFragment.java b/java/com/android/dialer/app/calllog/CallLogFragment.java index 6e4b23fc1..6d4aea91f 100644 --- a/java/com/android/dialer/app/calllog/CallLogFragment.java +++ b/java/com/android/dialer/app/calllog/CallLogFragment.java @@ -20,7 +20,6 @@ import static android.Manifest.permission.READ_CALL_LOG; import android.app.Activity; import android.app.Fragment; -import android.app.KeyguardManager; import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageManager; @@ -35,53 +34,68 @@ import android.provider.ContactsContract; import android.support.annotation.CallSuper; import android.support.annotation.Nullable; import android.support.v13.app.FragmentCompat; +import android.support.v13.app.FragmentCompat.OnRequestPermissionsResultCallback; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; import com.android.dialer.app.Bindings; import com.android.dialer.app.R; +import com.android.dialer.app.calllog.CallLogAdapter.CallFetcher; +import com.android.dialer.app.calllog.CallLogAdapter.MultiSelectRemoveView; import com.android.dialer.app.calllog.calllogcache.CallLogCache; import com.android.dialer.app.contactinfo.ContactInfoCache; import com.android.dialer.app.contactinfo.ContactInfoCache.OnContactInfoChangedListener; import com.android.dialer.app.contactinfo.ExpirableCacheHeadlessFragment; import com.android.dialer.app.list.ListsFragment; import com.android.dialer.app.voicemail.VoicemailPlaybackPresenter; -import com.android.dialer.app.widget.EmptyContentView; -import com.android.dialer.app.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.database.CallLogQueryHandler; +import com.android.dialer.database.CallLogQueryHandler.Listener; import com.android.dialer.location.GeoUtil; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; +import com.android.dialer.oem.CequintCallerIdManager; +import com.android.dialer.performancereport.PerformanceReport; import com.android.dialer.phonenumbercache.ContactInfoHelper; import com.android.dialer.util.PermissionsUtil; +import com.android.dialer.widget.EmptyContentView; +import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; +import java.util.Arrays; /** * Displays a list of call log entries. To filter for a particular kind of call (all, missed or * voicemails), specify it in the constructor. */ public class CallLogFragment extends Fragment - implements CallLogQueryHandler.Listener, - CallLogAdapter.CallFetcher, + implements Listener, + CallFetcher, + MultiSelectRemoveView, OnEmptyViewActionButtonClickedListener, - FragmentCompat.OnRequestPermissionsResultCallback, - CallLogModalAlertManager.Listener { + OnRequestPermissionsResultCallback, + CallLogModalAlertManager.Listener, + OnClickListener { private static final String KEY_FILTER_TYPE = "filter_type"; private static final String KEY_LOG_LIMIT = "log_limit"; private static final String KEY_DATE_LIMIT = "date_limit"; private static final String KEY_IS_CALL_LOG_ACTIVITY = "is_call_log_activity"; private static final String KEY_HAS_READ_CALL_LOG_PERMISSION = "has_read_call_log_permission"; private static final String KEY_REFRESH_DATA_REQUIRED = "refresh_data_required"; + private static final String KEY_SELECT_ALL_MODE = "select_all_mode_checked"; // No limit specified for the number of logs to show; use the CallLogQueryHandler's default. private static final int NO_LOG_LIMIT = -1; // No date-based filtering. private static final int NO_DATE_LIMIT = 0; - private static final int READ_CALL_LOG_PERMISSION_REQUEST_CODE = 1; + private static final int PHONE_PERMISSIONS_REQUEST_CODE = 1; private static final int EVENT_UPDATE_DISPLAY = 1; @@ -90,13 +104,15 @@ public class CallLogFragment extends Fragment // See issue 6363009 private final ContentObserver mCallLogObserver = new CustomContentObserver(); private final ContentObserver mContactsObserver = new CustomContentObserver(); + private View mMultiSelectUnSelectAllViewContent; + private TextView mSelectUnselectAllViewText; + private ImageView mSelectUnselectAllIcon; private RecyclerView mRecyclerView; private LinearLayoutManager mLayoutManager; private CallLogAdapter mAdapter; private CallLogQueryHandler mCallLogQueryHandler; private boolean mScrollToTop; private EmptyContentView mEmptyListView; - private KeyguardManager mKeyguardManager; private ContactInfoCache mContactInfoCache; private final OnContactInfoChangedListener mOnContactInfoChangedListener = new OnContactInfoChangedListener() { @@ -123,6 +139,7 @@ public class CallLogFragment extends Fragment * True if this instance of the CallLogFragment shown in the CallLogActivity. */ private boolean mIsCallLogActivity = false; + private boolean selectAllMode; private final Handler mDisplayUpdateHandler = new Handler() { @Override @@ -194,12 +211,12 @@ public class CallLogFragment extends Fragment mIsCallLogActivity = state.getBoolean(KEY_IS_CALL_LOG_ACTIVITY, mIsCallLogActivity); mHasReadCallLogPermission = state.getBoolean(KEY_HAS_READ_CALL_LOG_PERMISSION, false); mRefreshDataRequired = state.getBoolean(KEY_REFRESH_DATA_REQUIRED, mRefreshDataRequired); + selectAllMode = state.getBoolean(KEY_SELECT_ALL_MODE, false); } final Activity activity = getActivity(); final ContentResolver resolver = activity.getContentResolver(); mCallLogQueryHandler = new CallLogQueryHandler(activity, resolver, this, mLogLimit); - mKeyguardManager = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE); if (PermissionsUtil.hasCallLogReadPermissions(getContext())) { resolver.registerContentObserver(CallLog.CONTENT_URI, true, mCallLogObserver); @@ -290,12 +307,20 @@ public class CallLogFragment extends Fragment mRecyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); + PerformanceReport.logOnScrollStateChange(mRecyclerView); mEmptyListView = (EmptyContentView) view.findViewById(R.id.empty_list_view); mEmptyListView.setImage(R.drawable.empty_call_log); mEmptyListView.setActionClickedListener(this); mModalAlertView = (ViewGroup) view.findViewById(R.id.modal_message_container); mModalAlertManager = new CallLogModalAlertManager(LayoutInflater.from(getContext()), mModalAlertView, this); + mMultiSelectUnSelectAllViewContent = + view.findViewById(R.id.multi_select_select_all_view_content); + mSelectUnselectAllViewText = (TextView) view.findViewById(R.id.select_all_view_text); + mSelectUnselectAllIcon = (ImageView) view.findViewById(R.id.select_all_view_icon); + mMultiSelectUnSelectAllViewContent.setOnClickListener(null); + mSelectUnselectAllIcon.setOnClickListener(this); + mSelectUnselectAllViewText.setOnClickListener(this); } protected void setupData() { @@ -317,7 +342,11 @@ public class CallLogFragment extends Fragment getActivity(), mRecyclerView, this, - CallLogCache.getCallLogCache(getActivity()), + this, + activityType == CallLogAdapter.ACTIVITY_TYPE_DIALTACTS + ? (CallLogAdapter.OnActionModeStateChangedListener) getActivity() + : null, + new CallLogCache(getActivity()), mContactInfoCache, getVoicemailPlaybackPresenter(), new FilteredNumberAsyncQueryHandler(getActivity()), @@ -335,9 +364,18 @@ public class CallLogFragment extends Fragment public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setupData(); + updateSelectAllState(savedInstanceState); mAdapter.onRestoreInstanceState(savedInstanceState); } + private void updateSelectAllState(Bundle savedInstanceState) { + if (savedInstanceState != null) { + if (savedInstanceState.getBoolean(KEY_SELECT_ALL_MODE, false)) { + updateSelectAllIcon(); + } + } + } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -380,9 +418,17 @@ public class CallLogFragment extends Fragment } @Override - public void onStop() { - updateOnTransition(); + public void onStart() { + super.onStart(); + CequintCallerIdManager cequintCallerIdManager = null; + if (CequintCallerIdManager.isCequintCallerIdEnabled(getContext())) { + cequintCallerIdManager = CequintCallerIdManager.createInstanceForCallLog(); + } + mContactInfoCache.setCequintCallerIdManager(cequintCallerIdManager); + } + @Override + public void onStop() { super.onStop(); mAdapter.onStop(); mContactInfoCache.stop(); @@ -407,7 +453,7 @@ public class CallLogFragment extends Fragment outState.putBoolean(KEY_IS_CALL_LOG_ACTIVITY, mIsCallLogActivity); outState.putBoolean(KEY_HAS_READ_CALL_LOG_PERMISSION, mHasReadCallLogPermission); outState.putBoolean(KEY_REFRESH_DATA_REQUIRED, mRefreshDataRequired); - + outState.putBoolean(KEY_SELECT_ALL_MODE, selectAllMode); mAdapter.onSaveInstanceState(outState); } @@ -451,6 +497,8 @@ public class CallLogFragment extends Fragment mEmptyListView.setActionLabel(EmptyContentView.NO_LABEL); } else if (filterType == CallLogQueryHandler.CALL_TYPE_ALL) { mEmptyListView.setActionLabel(R.string.call_log_all_empty_action); + } else { + mEmptyListView.setActionLabel(EmptyContentView.NO_LABEL); } } @@ -463,9 +511,7 @@ public class CallLogFragment extends Fragment super.setMenuVisibility(menuVisible); if (mMenuVisible != menuVisible) { mMenuVisible = menuVisible; - if (!menuVisible) { - updateOnTransition(); - } else if (isResumed()) { + if (menuVisible && isResumed()) { refreshData(); } } @@ -483,7 +529,6 @@ public class CallLogFragment extends Fragment fetchCalls(); mCallLogQueryHandler.fetchVoicemailStatus(); mCallLogQueryHandler.fetchMissedCallsUnreadCount(); - updateOnTransition(); mRefreshDataRequired = false; } else { // Refresh the display of the existing data to update the timestamp text descriptions. @@ -491,22 +536,6 @@ public class CallLogFragment extends Fragment } } - /** - * Updates the voicemail notification state. - * - *

TODO: Move to CallLogActivity - */ - private void updateOnTransition() { - // We don't want to update any call data when keyguard is on because the user has likely not - // seen the new calls yet. - // This might be called before onCreate() and thus we need to check null explicitly. - if (mKeyguardManager != null - && !mKeyguardManager.inKeyguardRestrictedInputMode() - && mCallTypeFilter == Calls.VOICEMAIL_TYPE) { - CallLogNotificationsService.markNewVoicemailsAsOld(getActivity(), null); - } - } - @Override public void onEmptyViewActionButtonClicked() { final Activity activity = getActivity(); @@ -514,9 +543,14 @@ public class CallLogFragment extends Fragment return; } - if (!PermissionsUtil.hasPermission(activity, READ_CALL_LOG)) { - FragmentCompat.requestPermissions( - this, new String[] {READ_CALL_LOG}, READ_CALL_LOG_PERMISSION_REQUEST_CODE); + String[] deniedPermissions = + PermissionsUtil.getPermissionsCurrentlyDenied( + getContext(), PermissionsUtil.allPhoneGroupPermissionsUsedInDialer); + if (deniedPermissions.length > 0) { + LogUtil.i( + "CallLogFragment.onEmptyViewActionButtonClicked", + "Requesting permissions: " + Arrays.toString(deniedPermissions)); + FragmentCompat.requestPermissions(this, deniedPermissions, PHONE_PERMISSIONS_REQUEST_CODE); } else if (!mIsCallLogActivity) { // Show dialpad if we are not in the call log activity. ((HostInterface) activity).showDialpad(); @@ -526,7 +560,7 @@ public class CallLogFragment extends Fragment @Override public void onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults) { - if (requestCode == READ_CALL_LOG_PERMISSION_REQUEST_CODE) { + if (requestCode == PHONE_PERMISSIONS_REQUEST_CODE) { if (grantResults.length >= 1 && PackageManager.PERMISSION_GRANTED == grantResults[0]) { // Force a refresh of the data since we were missing the permission before this. mRefreshDataRequired = true; @@ -589,6 +623,51 @@ public class CallLogFragment extends Fragment } } + @Override + public void showMultiSelectRemoveView(boolean show) { + mMultiSelectUnSelectAllViewContent.setVisibility(show ? View.VISIBLE : View.GONE); + mMultiSelectUnSelectAllViewContent.setAlpha(show ? 0 : 1); + mMultiSelectUnSelectAllViewContent.animate().alpha(show ? 1 : 0).start(); + ((ListsFragment) getParentFragment()).showMultiSelectRemoveView(show); + } + + @Override + public void setSelectAllModeToFalse() { + selectAllMode = false; + mSelectUnselectAllIcon.setImageDrawable( + getContext().getDrawable(R.drawable.ic_empty_check_mark_white_24dp)); + } + + @Override + public void tapSelectAll() { + LogUtil.i("CallLogFragment.tapSelectAll", "imitating select all"); + selectAllMode = true; + updateSelectAllIcon(); + } + + @Override + public void onClick(View v) { + selectAllMode = !selectAllMode; + if (selectAllMode) { + Logger.get(v.getContext()).logImpression(DialerImpression.Type.MULTISELECT_SELECT_ALL); + } else { + Logger.get(v.getContext()).logImpression(DialerImpression.Type.MULTISELECT_UNSELECT_ALL); + } + updateSelectAllIcon(); + } + + private void updateSelectAllIcon() { + if (selectAllMode) { + mSelectUnselectAllIcon.setImageDrawable( + getContext().getDrawable(R.drawable.ic_check_mark_blue_24dp)); + getAdapter().onAllSelected(); + } else { + mSelectUnselectAllIcon.setImageDrawable( + getContext().getDrawable(R.drawable.ic_empty_check_mark_white_24dp)); + getAdapter().onAllDeselected(); + } + } + public interface HostInterface { void showDialpad(); diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java index 1daccd1a4..60ed7dd09 100644 --- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java +++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java @@ -17,40 +17,45 @@ package com.android.dialer.app.calllog; import android.app.Activity; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.net.Uri; import android.os.AsyncTask; +import android.os.Bundle; import android.provider.CallLog; import android.provider.CallLog.Calls; import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; +import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; +import android.telecom.VideoProfile; import android.telephony.PhoneNumberUtils; import android.text.BidiFormatter; import android.text.TextDirectionHeuristics; import android.text.TextUtils; import android.view.ContextMenu; +import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewStub; import android.widget.ImageButton; import android.widget.ImageView; -import android.widget.QuickContactBadge; import android.widget.TextView; +import android.widget.Toast; import com.android.contacts.common.ClipboardUtils; -import com.android.contacts.common.ContactPhotoManager; import com.android.contacts.common.compat.PhoneNumberUtilsCompat; import com.android.contacts.common.dialog.CallSubjectDialog; -import com.android.contacts.common.util.UriUtils; import com.android.dialer.app.DialtactsActivity; import com.android.dialer.app.R; +import com.android.dialer.app.calllog.CallLogAdapter.OnActionModeStateChangedListener; import com.android.dialer.app.calllog.calllogcache.CallLogCache; import com.android.dialer.app.voicemail.VoicemailPlaybackLayout; import com.android.dialer.app.voicemail.VoicemailPlaybackPresenter; @@ -58,23 +63,39 @@ import com.android.dialer.blocking.BlockedNumbersMigrator; import com.android.dialer.blocking.FilteredNumberCompat; import com.android.dialer.blocking.FilteredNumbersUtil; import com.android.dialer.callcomposer.CallComposerActivity; -import com.android.dialer.callcomposer.CallComposerContact; +import com.android.dialer.calldetails.CallDetailsActivity; import com.android.dialer.calldetails.CallDetailsEntries; -import com.android.dialer.common.ConfigProviderBindings; +import com.android.dialer.callintent.CallIntentBuilder; +import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.compat.CompatUtils; +import com.android.dialer.compat.telephony.TelephonyManagerCompat; +import com.android.dialer.configprovider.ConfigProviderBindings; +import com.android.dialer.constants.ActivityRequestCodes; +import com.android.dialer.contactphoto.ContactPhotoManager; +import com.android.dialer.dialercontact.DialerContact; +import com.android.dialer.dialercontact.SimDetails; +import com.android.dialer.lettertile.LetterTileDrawable; +import com.android.dialer.lettertile.LetterTileDrawable.ContactType; import com.android.dialer.lightbringer.Lightbringer; import com.android.dialer.lightbringer.LightbringerComponent; import com.android.dialer.logging.ContactSource; import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.InteractionEvent; import com.android.dialer.logging.Logger; import com.android.dialer.logging.ScreenEvent; +import com.android.dialer.logging.UiAction; +import com.android.dialer.performancereport.PerformanceReport; import com.android.dialer.phonenumbercache.CachedNumberLookupService; import com.android.dialer.phonenumbercache.ContactInfo; import com.android.dialer.phonenumbercache.PhoneNumberCache; import com.android.dialer.phonenumberutil.PhoneNumberHelper; +import com.android.dialer.telecom.TelecomUtil; import com.android.dialer.util.CallUtil; import com.android.dialer.util.DialerUtils; +import com.android.dialer.util.UriUtils; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * This is an object containing references to views contained by the call log list item. This @@ -90,7 +111,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder /** The root view of the call log list item */ public final View rootView; /** The quick contact badge for the contact. */ - public final QuickContactBadge quickContactView; + public final DialerQuickContactBadge quickContactView; /** The primary action view of the entry. */ public final View primaryActionView; /** The details of the phone call. */ @@ -103,11 +124,13 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder public final ImageView primaryActionButtonView; private final Context mContext; + @Nullable private final PhoneAccountHandle mDefaultPhoneAccountHandle; private final CallLogCache mCallLogCache; private final CallLogListItemHelper mCallLogListItemHelper; private final CachedNumberLookupService mCachedNumberLookupService; private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter; private final OnClickListener mBlockReportListener; + @HostUi private final int hostUi; /** Whether the data fields are populated by the worker thread, ready to be shown. */ public boolean isLoaded; /** The view containing call log item actions. Null until the ViewStub is inflated. */ @@ -144,7 +167,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder * The callable phone number for the current call log entry. Cached here as the call back intent * is set only when the actions ViewStub is inflated. */ - public String number; + @Nullable public String number; /** The post-dial numbers that are dialed following the phone number. */ public String postDialDigits; /** The formatted phone number to display. */ @@ -201,6 +224,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder public boolean lightbringerReady; private View.OnClickListener mExpandCollapseListener; + private final OnActionModeStateChangedListener onActionModeStateChangedListener; private final View.OnLongClickListener longPressListener; private boolean mVoicemailPrimaryActionButtonClicked; @@ -216,11 +240,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder OnClickListener blockReportListener, View.OnClickListener expandCollapseListener, View.OnLongClickListener longClickListener, + CallLogAdapter.OnActionModeStateChangedListener actionModeStateChangedListener, CallLogCache callLogCache, CallLogListItemHelper callLogListItemHelper, VoicemailPlaybackPresenter voicemailPlaybackPresenter, View rootView, - QuickContactBadge quickContactView, + DialerQuickContactBadge dialerQuickContactView, View primaryActionView, PhoneCallDetailsViews phoneCallDetailsViews, CardView callLogEntryView, @@ -230,6 +255,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder mContext = context; mExpandCollapseListener = expandCollapseListener; + onActionModeStateChangedListener = actionModeStateChangedListener; longPressListener = longClickListener; mCallLogCache = callLogCache; mCallLogListItemHelper = callLogListItemHelper; @@ -237,8 +263,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder mBlockReportListener = blockReportListener; mCachedNumberLookupService = PhoneNumberCache.get(mContext).getCachedNumberLookupService(); + // Cache this to avoid having to look it up each time we bind to a call log entry + mDefaultPhoneAccountHandle = + TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_TEL); + this.rootView = rootView; - this.quickContactView = quickContactView; + this.quickContactView = dialerQuickContactView; this.primaryActionView = primaryActionView; this.phoneCallDetailsViews = phoneCallDetailsViews; this.callLogEntryView = callLogEntryView; @@ -251,6 +281,23 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder phoneCallDetailsViews.nameView.setElegantTextHeight(false); phoneCallDetailsViews.callLocationAndDate.setElegantTextHeight(false); + if (mContext instanceof CallLogActivity) { + hostUi = HostUi.CALL_HISTORY; + Logger.get(mContext) + .logQuickContactOnTouch( + quickContactView, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_CALL_HISTORY, true); + } else if (mVoicemailPlaybackPresenter == null) { + hostUi = HostUi.CALL_LOG; + Logger.get(mContext) + .logQuickContactOnTouch( + quickContactView, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_CALL_LOG, true); + } else { + hostUi = HostUi.VOICEMAIL; + Logger.get(mContext) + .logQuickContactOnTouch( + quickContactView, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_VOICEMAIL, false); + } + quickContactView.setOverlay(null); if (CompatUtils.hasPrioritizedMimeType()) { quickContactView.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE); @@ -264,6 +311,8 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder CallLogAdapter.ENABLE_CALL_LOG_MULTI_SELECT_FLAG)) { primaryActionView.setOnLongClickListener(longPressListener); quickContactView.setOnLongClickListener(longPressListener); + quickContactView.setMulitSelectListeners( + mExpandCollapseListener, onActionModeStateChangedListener); } else { primaryActionView.setOnCreateContextMenuListener(this); } @@ -275,6 +324,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder OnClickListener blockReportListener, View.OnClickListener expandCollapseListener, View.OnLongClickListener longClickListener, + CallLogAdapter.OnActionModeStateChangedListener actionModeStateChangeListener, CallLogCache callLogCache, CallLogListItemHelper callLogListItemHelper, VoicemailPlaybackPresenter voicemailPlaybackPresenter) { @@ -284,11 +334,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder blockReportListener, expandCollapseListener, longClickListener, + actionModeStateChangeListener, callLogCache, callLogListItemHelper, voicemailPlaybackPresenter, view, - (QuickContactBadge) view.findViewById(R.id.quick_contact_photo), + (DialerQuickContactBadge) view.findViewById(R.id.quick_contact_photo), view.findViewById(R.id.primary_action_view), PhoneCallDetailsViews.fromView(view), (CardView) view.findViewById(R.id.call_log_row), @@ -297,8 +348,15 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder } public static CallLogListItemViewHolder createForTest(Context context) { + return createForTest(context, null, null); + } + + public static CallLogListItemViewHolder createForTest( + Context context, + View.OnClickListener expandCollapseListener, + VoicemailPlaybackPresenter voicemailPlaybackPresenter) { Resources resources = context.getResources(); - CallLogCache callLogCache = CallLogCache.getCallLogCache(context); + CallLogCache callLogCache = new CallLogCache(context); PhoneCallDetailsHelper phoneCallDetailsHelper = new PhoneCallDetailsHelper(context, resources, callLogCache); @@ -306,13 +364,14 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder new CallLogListItemViewHolder( context, null, - null /* expandCollapseListener */, + expandCollapseListener /* expandCollapseListener */, + null, null, callLogCache, new CallLogListItemHelper(phoneCallDetailsHelper, resources, callLogCache), - null /* voicemailPlaybackPresenter */, - new View(context), - new QuickContactBadge(context), + voicemailPlaybackPresenter, + LayoutInflater.from(context).inflate(R.layout.call_log_list_item, null), + new DialerQuickContactBadge(context), new View(context), PhoneCallDetailsViews.createForTest(context), new CardView(context), @@ -456,6 +515,18 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder // Treat as normal list item; show call button, if possible. if (PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation)) { boolean isVoicemailNumber = mCallLogCache.isVoicemailNumber(accountHandle, number); + + if (!isVoicemailNumber && showLightbringerPrimaryButton()) { + CallIntentBuilder.increaseLightbringerCallButtonAppearInCollapsedCallLogItemCount(); + primaryActionButtonView.setTag(IntentProvider.getLightbringerIntentProvider(number)); + primaryActionButtonView.setContentDescription( + TextUtils.expandTemplate( + mContext.getString(R.string.description_video_call_action), validNameOrNumber)); + primaryActionButtonView.setImageResource(R.drawable.quantum_ic_videocam_vd_theme_24); + primaryActionButtonView.setVisibility(View.VISIBLE); + return; + } + if (isVoicemailNumber) { // Call to generic voicemail number, in case there are multiple accounts. primaryActionButtonView.setTag(IntentProvider.getReturnVoicemailCallIntentProvider()); @@ -467,7 +538,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder primaryActionButtonView.setContentDescription( TextUtils.expandTemplate( mContext.getString(R.string.description_call_action), validNameOrNumber)); - primaryActionButtonView.setImageResource(R.drawable.quantum_ic_call_white_24); + primaryActionButtonView.setImageResource(R.drawable.quantum_ic_call_vd_theme_24); primaryActionButtonView.setVisibility(View.VISIBLE); } else { primaryActionButtonView.setTag(null); @@ -483,12 +554,15 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder private void bindActionButtons() { boolean canPlaceCallToNumber = PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation); + // Hide the call buttons by default. We then set it to be visible when appropriate below. + // This saves us having to remember to set it to GONE in multiple places. + callButtonView.setVisibility(View.GONE); + videoCallButtonView.setVisibility(View.GONE); + if (isFullyUndialableVoicemail()) { // Sometimes the voicemail server will report the message is from some non phone number // source. If the number does not contains any dialable digit treat it as it is from a unknown // number, remove all action buttons but still show the voicemail playback layout. - callButtonView.setVisibility(View.GONE); - videoCallButtonView.setVisibility(View.GONE); detailsButtonView.setVisibility(View.GONE); createNewContactButtonView.setVisibility(View.GONE); addToExistingContactButtonView.setVisibility(View.GONE); @@ -513,34 +587,40 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder return; } - if (!TextUtils.isEmpty(voicemailUri) && canPlaceCallToNumber) { + TextView callTypeOrLocationView = + ((TextView) callButtonView.findViewById(R.id.call_type_or_location_text)); + + if (canPlaceCallToNumber) { callButtonView.setTag(IntentProvider.getReturnCallIntentProvider(number)); + callTypeOrLocationView.setVisibility(View.GONE); + } + + if (!TextUtils.isEmpty(voicemailUri) && canPlaceCallToNumber) { ((TextView) callButtonView.findViewById(R.id.call_action_text)) .setText( TextUtils.expandTemplate( mContext.getString(R.string.call_log_action_call), nameOrNumber == null ? "" : nameOrNumber)); - TextView callTypeOrLocationView = - ((TextView) callButtonView.findViewById(R.id.call_type_or_location_text)); + if (callType == Calls.VOICEMAIL_TYPE && !TextUtils.isEmpty(callTypeOrLocation)) { callTypeOrLocationView.setText(callTypeOrLocation); callTypeOrLocationView.setVisibility(View.VISIBLE); - } else { - callTypeOrLocationView.setVisibility(View.GONE); } callButtonView.setVisibility(View.VISIBLE); - } else { - callButtonView.setVisibility(View.GONE); } - if (hasPlacedCarrierVideoCall() || canSupportCarrierVideoCall()) { + // We need to check if we are showing the Lightbringer primary button. If we are, then we should + // show the "Call" button here regardless of IMS availability. + if (showLightbringerPrimaryButton()) { + callButtonView.setVisibility(View.VISIBLE); + videoCallButtonView.setVisibility(View.GONE); + } else if (CallUtil.isVideoEnabled(mContext) + && (hasPlacedCarrierVideoCall() || canSupportCarrierVideoCall())) { videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number)); videoCallButtonView.setVisibility(View.VISIBLE); } else if (lightbringerReady) { videoCallButtonView.setTag(IntentProvider.getLightbringerIntentProvider(number)); videoCallButtonView.setVisibility(View.VISIBLE); - } else { - videoCallButtonView.setVisibility(View.GONE); } // For voicemail calls, show the voicemail playback layout; hide otherwise. @@ -567,8 +647,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder detailsButtonView.setVisibility(View.GONE); } else { detailsButtonView.setVisibility(View.VISIBLE); + boolean canReportCallerId = + mCachedNumberLookupService != null + && mCachedNumberLookupService.canReportAsInvalid(info.sourceType, info.objectId); detailsButtonView.setTag( - IntentProvider.getCallDetailIntentProvider(callDetailsEntries, buildContact())); + IntentProvider.getCallDetailIntentProvider( + callDetailsEntries, buildContact(), canReportCallerId)); } boolean isBlockedOrSpam = blockId != null || (isSpamFeatureEnabled && isSpam); @@ -616,6 +700,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder return false; } + private boolean showLightbringerPrimaryButton() { + return accountHandle != null + && accountHandle.getComponentName().equals(getLightbringer().getPhoneAccountComponentName()) + && lightbringerReady; + } + private static boolean hasDialableChar(CharSequence number) { if (TextUtils.isEmpty(number)) { return false; @@ -635,12 +725,10 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder if (accountHandle == null) { return false; } - if (accountHandle - .getComponentName() - .equals(getLightbringer().getPhoneAccountComponentName(mContext))) { + if (mDefaultPhoneAccountHandle == null) { return false; } - return true; + return accountHandle.getComponentName().equals(mDefaultPhoneAccountHandle.getComponentName()); } private boolean canSupportCarrierVideoCall() { @@ -690,12 +778,23 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder return; } - final TextView view = phoneCallDetailsViews.voicemailTranscriptionView; - if (!isExpanded || TextUtils.isEmpty(view.getText())) { - view.setVisibility(View.GONE); + View transcriptContainerView = phoneCallDetailsViews.transcriptionView; + TextView transcriptView = phoneCallDetailsViews.voicemailTranscriptionView; + TextView transcriptBrandingView = phoneCallDetailsViews.voicemailTranscriptionBrandingView; + if (TextUtils.isEmpty(transcriptView.getText())) { + Assert.checkArgument(TextUtils.isEmpty(transcriptBrandingView.getText())); + } + if (!isExpanded || TextUtils.isEmpty(transcriptView.getText())) { + transcriptContainerView.setVisibility(View.GONE); return; } - view.setVisibility(View.VISIBLE); + transcriptContainerView.setVisibility(View.VISIBLE); + transcriptView.setVisibility(View.VISIBLE); + if (TextUtils.isEmpty(transcriptBrandingView.getText())) { + phoneCallDetailsViews.voicemailTranscriptionBrandingView.setVisibility(View.GONE); + } else { + phoneCallDetailsViews.voicemailTranscriptionBrandingView.setVisibility(View.VISIBLE); + } } public void updatePhoto() { @@ -717,19 +816,14 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder getContactType()); } - private int getContactType() { - int contactType = ContactPhotoManager.TYPE_DEFAULT; - if (mCallLogCache.isVoicemailNumber(accountHandle, number)) { - contactType = ContactPhotoManager.TYPE_VOICEMAIL; - } else if (isSpam) { - contactType = ContactPhotoManager.TYPE_SPAM; - } else if (mCachedNumberLookupService != null - && mCachedNumberLookupService.isBusiness(info.sourceType)) { - contactType = ContactPhotoManager.TYPE_BUSINESS; - } else if (numberPresentation == TelecomManager.PRESENTATION_RESTRICTED) { - contactType = ContactPhotoManager.TYPE_GENERIC_AVATAR; - } - return contactType; + private @ContactType int getContactType() { + return LetterTileDrawable.getContactTypeFromPrimitives( + mCallLogCache.isVoicemailNumber(accountHandle, number), + isSpam, + mCachedNumberLookupService != null + && mCachedNumberLookupService.isBusiness(info.sourceType), + numberPresentation, + false); } @Override @@ -789,25 +883,67 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder Activity activity = (Activity) mContext; activity.startActivityForResult( CallComposerActivity.newIntent(activity, buildContact()), - DialtactsActivity.ACTIVITY_REQUEST_CODE_CALL_COMPOSE); + ActivityRequestCodes.DIALTACTS_CALL_COMPOSER); } else if (view.getId() == R.id.share_voicemail) { Logger.get(mContext).logImpression(DialerImpression.Type.VVM_SHARE_PRESSED); mVoicemailPlaybackPresenter.shareVoicemail(); } else { logCallLogAction(view.getId()); + final IntentProvider intentProvider = (IntentProvider) view.getTag(); - if (intentProvider != null) { - final Intent intent = intentProvider.getIntent(mContext); - // See IntentProvider.getCallDetailIntentProvider() for why this may be null. - if (intent != null) { - DialerUtils.startActivityWithErrorToast(mContext, intent); + if (intentProvider == null) { + return; + } + + final Intent intent = intentProvider.getIntent(mContext); + // See IntentProvider.getCallDetailIntentProvider() for why this may be null. + if (intent == null) { + return; + } + + if (info != null && info.lookupKey != null) { + Bundle extras = new Bundle(); + if (intent.hasExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS)) { + extras = intent.getParcelableExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS); } + extras.putBoolean(TelephonyManagerCompat.ALLOW_ASSISTED_DIAL, true); + intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, extras); } + + // We check to see if we are starting a Lightbringer intent. The reason is Lightbringer + // intents need to be started using startActivityForResult instead of the usual startActivity + String packageName = intent.getPackage(); + if (packageName != null && packageName.equals(getLightbringer().getPackageName())) { + Logger.get(mContext) + .logImpression(DialerImpression.Type.LIGHTBRINGER_VIDEO_REQUESTED_FROM_CALL_LOG); + startLightbringerActivity(intent); + } else if (CallDetailsActivity.isLaunchIntent(intent)) { + PerformanceReport.recordClick(UiAction.Type.OPEN_CALL_DETAIL); + ((Activity) mContext) + .startActivityForResult(intent, ActivityRequestCodes.DIALTACTS_CALL_DETAILS); + } else { + if (Intent.ACTION_CALL.equals(intent.getAction()) + && intent.getIntExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, -1) + == VideoProfile.STATE_BIDIRECTIONAL) { + Logger.get(mContext) + .logImpression(DialerImpression.Type.IMS_VIDEO_REQUESTED_FROM_CALL_LOG); + } + DialerUtils.startActivityWithErrorToast(mContext, intent); + } + } + } + + private void startLightbringerActivity(Intent intent) { + try { + Activity activity = (Activity) mContext; + activity.startActivityForResult(intent, ActivityRequestCodes.DIALTACTS_LIGHTBRINGER); + } catch (ActivityNotFoundException e) { + Toast.makeText(mContext, R.string.activity_not_available, Toast.LENGTH_SHORT).show(); } } - private CallComposerContact buildContact() { - CallComposerContact.Builder contact = CallComposerContact.newBuilder(); + private DialerContact buildContact() { + DialerContact.Builder contact = DialerContact.newBuilder(); contact.setPhotoId(info.photoId); if (info.photoUri != null) { contact.setPhotoUri(info.photoUri.toString()); @@ -819,13 +955,23 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder contact.setNameOrNumber((String) nameOrNumber); } contact.setContactType(getContactType()); - contact.setNumber(number); + if (number != null) { + contact.setNumber(number); + } /* second line of contact view. */ if (!TextUtils.isEmpty(info.name)) { contact.setDisplayNumber(displayNumber); } /* phone number type (e.g. mobile) in second line of contact view */ contact.setNumberLabel(numberType); + + /* third line of contact view. */ + String accountLabel = mCallLogCache.getAccountLabel(accountHandle); + if (!TextUtils.isEmpty(accountLabel)) { + SimDetails.Builder simDetails = SimDetails.newBuilder().setNetwork(accountLabel); + simDetails.setColor(mCallLogCache.getAccountColor(accountHandle)); + contact.setSimDetails(simDetails.build()); + } return contact.build(); } @@ -834,8 +980,38 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_SEND_MESSAGE); } else if (id == R.id.add_to_existing_contact_action) { Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_ADD_TO_CONTACT); + switch (hostUi) { + case HostUi.CALL_HISTORY: + Logger.get(mContext) + .logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_CALL_HISTORY); + break; + case HostUi.CALL_LOG: + Logger.get(mContext).logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_CALL_LOG); + break; + case HostUi.VOICEMAIL: + Logger.get(mContext).logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_VOICEMAIL); + break; + default: + throw Assert.createIllegalStateFailException(); + } } else if (id == R.id.create_new_contact_action) { Logger.get(mContext).logImpression(DialerImpression.Type.CALL_LOG_CREATE_NEW_CONTACT); + switch (hostUi) { + case HostUi.CALL_HISTORY: + Logger.get(mContext) + .logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_CALL_HISTORY); + break; + case HostUi.CALL_LOG: + Logger.get(mContext) + .logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_CALL_LOG); + break; + case HostUi.VOICEMAIL: + Logger.get(mContext) + .logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_VOICEMAIL); + break; + default: + throw Assert.createIllegalStateFailException(); + } } } @@ -987,6 +1163,15 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder Logger.get(mContext).logScreenView(ScreenEvent.Type.CALL_LOG_CONTEXT_MENU, (Activity) mContext); } + /** Specifies where the view holder belongs. */ + @IntDef({HostUi.CALL_LOG, HostUi.CALL_HISTORY, HostUi.VOICEMAIL}) + @Retention(RetentionPolicy.SOURCE) + private @interface HostUi { + int CALL_LOG = 0; + int CALL_HISTORY = 1; + int VOICEMAIL = 2; + } + public interface OnClickListener { void onBlockReportSpam( diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java index e169b8de9..43e03e9fd 100644 --- a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java +++ b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java @@ -18,7 +18,6 @@ package com.android.dialer.app.calllog; import android.Manifest; import android.annotation.TargetApi; -import android.app.NotificationManager; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; @@ -27,6 +26,7 @@ import android.database.Cursor; import android.net.Uri; import android.os.Build.VERSION_CODES; import android.provider.CallLog.Calls; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.WorkerThread; import android.support.v4.os.UserManagerCompat; @@ -36,7 +36,6 @@ import com.android.dialer.app.R; import com.android.dialer.calllogutils.PhoneNumberDisplayUtil; import com.android.dialer.common.LogUtil; import com.android.dialer.location.GeoUtil; -import com.android.dialer.notification.GroupedNotificationUtil; import com.android.dialer.phonenumbercache.ContactInfo; import com.android.dialer.phonenumbercache.ContactInfoHelper; import com.android.dialer.util.PermissionsUtil; @@ -46,7 +45,6 @@ import java.util.List; /** Helper class operating on call log notifications. */ public class CallLogNotificationsQueryHelper { - private static final String TAG = "CallLogNotifHelper"; private final Context mContext; private final NewCallsQuery mNewCallsQuery; private final ContactInfoHelper mContactInfoHelper; @@ -74,44 +72,58 @@ public class CallLogNotificationsQueryHelper { countryIso); } + public static void markAllMissedCallsInCallLogAsRead(@NonNull Context context) { + markMissedCallsInCallLogAsRead(context, null); + } + + public static void markSingleMissedCallInCallLogAsRead( + @NonNull Context context, @Nullable Uri callUri) { + if (callUri == null) { + LogUtil.e( + "CallLogNotificationsQueryHelper.markSingleMissedCallInCallLogAsRead", + "call URI is null, unable to mark call as read"); + } else { + markMissedCallsInCallLogAsRead(context, callUri); + } + } + /** - * Removes the missed call notifications and marks calls as read. If a callUri is provided, only - * that call is marked as read. + * If callUri is null then calls with a matching callUri are marked as read, otherwise all calls + * are marked as read. */ @WorkerThread - public static void removeMissedCallNotifications(Context context, @Nullable Uri callUri) { - // Call log is only accessible when unlocked. If that's the case, clear the list of - // new missed calls from the call log. - if (UserManagerCompat.isUserUnlocked(context) && PermissionsUtil.hasPhonePermissions(context)) { - ContentValues values = new ContentValues(); - values.put(Calls.NEW, 0); - values.put(Calls.IS_READ, 1); - StringBuilder where = new StringBuilder(); - where.append(Calls.NEW); - where.append(" = 1 AND "); - where.append(Calls.TYPE); - where.append(" = ?"); - try { - context - .getContentResolver() - .update( - callUri == null ? Calls.CONTENT_URI : callUri, - values, - where.toString(), - new String[] {Integer.toString(Calls.MISSED_TYPE)}); - } catch (IllegalArgumentException e) { - LogUtil.e( - "CallLogNotificationsQueryHelper.removeMissedCallNotifications", - "contacts provider update command failed", - e); - } + private static void markMissedCallsInCallLogAsRead(Context context, @Nullable Uri callUri) { + if (!UserManagerCompat.isUserUnlocked(context)) { + LogUtil.e("CallLogNotificationsQueryHelper.markMissedCallsInCallLogAsRead", "locked"); + return; + } + if (!PermissionsUtil.hasPhonePermissions(context)) { + LogUtil.e("CallLogNotificationsQueryHelper.markMissedCallsInCallLogAsRead", "no permission"); + return; } - GroupedNotificationUtil.removeNotification( - context.getSystemService(NotificationManager.class), - callUri != null ? callUri.toString() : null, - R.id.notification_missed_call, - MissedCallNotifier.NOTIFICATION_TAG); + ContentValues values = new ContentValues(); + values.put(Calls.NEW, 0); + values.put(Calls.IS_READ, 1); + StringBuilder where = new StringBuilder(); + where.append(Calls.NEW); + where.append(" = 1 AND "); + where.append(Calls.TYPE); + where.append(" = ?"); + try { + context + .getContentResolver() + .update( + callUri == null ? Calls.CONTENT_URI : callUri, + values, + where.toString(), + new String[] {Integer.toString(Calls.MISSED_TYPE)}); + } catch (IllegalArgumentException e) { + LogUtil.e( + "CallLogNotificationsQueryHelper.markMissedCallsInCallLogAsRead", + "contacts provider update command failed", + e); + } } /** Create a new instance of {@link NewCallsQuery}. */ @@ -281,7 +293,9 @@ public class CallLogNotificationsQueryHelper { @TargetApi(VERSION_CODES.M) public List query(int type) { if (!PermissionsUtil.hasPermission(mContext, Manifest.permission.READ_CALL_LOG)) { - LogUtil.w(TAG, "No READ_CALL_LOG permission, returning null for calls lookup."); + LogUtil.w( + "CallLogNotificationsQueryHelper.DefaultNewCallsQuery.query", + "no READ_CALL_LOG permission, returning null for calls lookup."); return null; } final String selection = String.format("%s = 1 AND %s = ?", Calls.NEW, Calls.TYPE); @@ -302,7 +316,9 @@ public class CallLogNotificationsQueryHelper { } return newCalls; } catch (RuntimeException e) { - LogUtil.w(TAG, "Exception when querying Contacts Provider for calls lookup"); + LogUtil.w( + "CallLogNotificationsQueryHelper.DefaultNewCallsQuery.query", + "exception when querying Contacts Provider for calls lookup"); return null; } } diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java index 7dfd2cb69..0490b9932 100644 --- a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java +++ b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java @@ -17,13 +17,20 @@ package com.android.dialer.app.calllog; import android.app.IntentService; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.os.Handler; -import android.os.Looper; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.support.annotation.WorkerThread; +import android.telecom.PhoneAccountHandle; +import com.android.dialer.app.voicemail.LegacyVoicemailNotificationReceiver; +import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutorComponent; import com.android.dialer.telecom.TelecomUtil; import com.android.dialer.util.PermissionsUtil; @@ -43,28 +50,37 @@ import com.android.dialer.util.PermissionsUtil; */ public class CallLogNotificationsService extends IntentService { - /** Action to mark all the new voicemails as old. */ - public static final String ACTION_MARK_NEW_VOICEMAILS_AS_OLD = - "com.android.dialer.calllog.ACTION_MARK_NEW_VOICEMAILS_AS_OLD"; + @VisibleForTesting + static final String ACTION_MARK_ALL_NEW_VOICEMAILS_AS_OLD = + "com.android.dialer.calllog.ACTION_MARK_ALL_NEW_VOICEMAILS_AS_OLD"; - /** Action to mark all the new missed calls as old. */ - public static final String ACTION_MARK_NEW_MISSED_CALLS_AS_OLD = - "com.android.dialer.calllog.ACTION_MARK_NEW_MISSED_CALLS_AS_OLD"; + private static final String ACTION_MARK_SINGLE_NEW_VOICEMAIL_AS_OLD = + "com.android.dialer.calllog.ACTION_MARK_SINGLE_NEW_VOICEMAIL_AS_OLD "; - /** Action to update missed call notifications with a post call note. */ - public static final String ACTION_INCOMING_POST_CALL = + @VisibleForTesting + static final String ACTION_CANCEL_ALL_MISSED_CALLS = + "com.android.dialer.calllog.ACTION_CANCEL_ALL_MISSED_CALLS"; + + private static final String ACTION_CANCEL_SINGLE_MISSED_CALL = + "com.android.dialer.calllog.ACTION_CANCEL_SINGLE_MISSED_CALL"; + + private static final String ACTION_INCOMING_POST_CALL = "com.android.dialer.calllog.INCOMING_POST_CALL"; /** Action to call back a missed call. */ public static final String ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION = "com.android.dialer.calllog.CALL_BACK_FROM_MISSED_CALL_NOTIFICATION"; + /** Action mark legacy voicemail as dismissed. */ + public static final String ACTION_LEGACY_VOICEMAIL_DISMISSED = + "com.android.dialer.calllog.ACTION_LEGACY_VOICEMAIL_DISMISSED"; + /** * Extra to be included with {@link #ACTION_INCOMING_POST_CALL} to represent a post call note. * *

It must be a {@link String} */ - public static final String EXTRA_POST_CALL_NOTE = "POST_CALL_NOTE"; + private static final String EXTRA_POST_CALL_NOTE = "POST_CALL_NOTE"; /** * Extra to be included with {@link #ACTION_INCOMING_POST_CALL} to represent the phone number the @@ -72,10 +88,11 @@ public class CallLogNotificationsService extends IntentService { * *

It must be a {@link String} */ - public static final String EXTRA_POST_CALL_NUMBER = "POST_CALL_NUMBER"; + private static final String EXTRA_POST_CALL_NUMBER = "POST_CALL_NUMBER"; + + private static final String EXTRA_PHONE_ACCOUNT_HANDLE = "PHONE_ACCOUNT_HANDLE"; public static final int UNKNOWN_MISSED_CALL_COUNT = -1; - private VoicemailQueryHandler mVoicemailQueryHandler; public CallLogNotificationsService() { super("CallLogNotificationsService"); @@ -89,52 +106,107 @@ public class CallLogNotificationsService extends IntentService { context.startService(serviceIntent); } - public static void markNewVoicemailsAsOld(Context context, @Nullable Uri voicemailUri) { + public static void markAllNewVoicemailsAsOld(Context context) { + LogUtil.enterBlock("CallLogNotificationsService.markAllNewVoicemailsAsOld"); Intent serviceIntent = new Intent(context, CallLogNotificationsService.class); - serviceIntent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_VOICEMAILS_AS_OLD); - serviceIntent.setData(voicemailUri); + serviceIntent.setAction(CallLogNotificationsService.ACTION_MARK_ALL_NEW_VOICEMAILS_AS_OLD); context.startService(serviceIntent); } - public static void markNewMissedCallsAsOld(Context context, @Nullable Uri callUri) { + public static void markSingleNewVoicemailAsOld(Context context, @Nullable Uri voicemailUri) { + LogUtil.enterBlock("CallLogNotificationsService.markSingleNewVoicemailAsOld"); Intent serviceIntent = new Intent(context, CallLogNotificationsService.class); - serviceIntent.setAction(ACTION_MARK_NEW_MISSED_CALLS_AS_OLD); - serviceIntent.setData(callUri); + serviceIntent.setAction(CallLogNotificationsService.ACTION_MARK_SINGLE_NEW_VOICEMAIL_AS_OLD); + serviceIntent.setData(voicemailUri); context.startService(serviceIntent); } + public static void cancelAllMissedCalls(Context context) { + LogUtil.enterBlock("CallLogNotificationsService.cancelAllMissedCalls"); + DialerExecutorComponent.get(context) + .dialerExecutorFactory() + .createNonUiTaskBuilder(new CancelAllMissedCallsWorker()) + .build() + .executeSerial(context); + } + + public static PendingIntent createMarkAllNewVoicemailsAsOldIntent(@NonNull Context context) { + Intent intent = new Intent(context, CallLogNotificationsService.class); + intent.setAction(CallLogNotificationsService.ACTION_MARK_ALL_NEW_VOICEMAILS_AS_OLD); + return PendingIntent.getService(context, 0, intent, 0); + } + + public static PendingIntent createMarkSingleNewVoicemailAsOldIntent( + @NonNull Context context, @Nullable Uri voicemailUri) { + Intent intent = new Intent(context, CallLogNotificationsService.class); + intent.setAction(CallLogNotificationsService.ACTION_MARK_SINGLE_NEW_VOICEMAIL_AS_OLD); + intent.setData(voicemailUri); + return PendingIntent.getService(context, 0, intent, 0); + } + + public static PendingIntent createCancelAllMissedCallsPendingIntent(@NonNull Context context) { + Intent intent = new Intent(context, CallLogNotificationsService.class); + intent.setAction(ACTION_CANCEL_ALL_MISSED_CALLS); + return PendingIntent.getService(context, 0, intent, 0); + } + + public static PendingIntent createCancelSingleMissedCallPendingIntent( + @NonNull Context context, @Nullable Uri callUri) { + Intent intent = new Intent(context, CallLogNotificationsService.class); + intent.setAction(ACTION_CANCEL_SINGLE_MISSED_CALL); + intent.setData(callUri); + return PendingIntent.getService(context, 0, intent, 0); + } + + public static PendingIntent createLegacyVoicemailDismissedPendingIntent( + @NonNull Context context, PhoneAccountHandle phoneAccountHandle) { + Intent intent = new Intent(context, CallLogNotificationsService.class); + intent.setAction(ACTION_LEGACY_VOICEMAIL_DISMISSED); + intent.putExtra(EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle); + return PendingIntent.getService(context, 0, intent, 0); + } + @Override protected void onHandleIntent(Intent intent) { if (intent == null) { - LogUtil.d("CallLogNotificationsService.onHandleIntent", "could not handle null intent"); + LogUtil.e("CallLogNotificationsService.onHandleIntent", "could not handle null intent"); return; } - if (!PermissionsUtil.hasPermission(this, android.Manifest.permission.READ_CALL_LOG)) { + if (!PermissionsUtil.hasPermission(this, android.Manifest.permission.READ_CALL_LOG) + || !PermissionsUtil.hasPermission(this, android.Manifest.permission.WRITE_CALL_LOG)) { + LogUtil.e("CallLogNotificationsService.onHandleIntent", "no READ_CALL_LOG permission"); return; } String action = intent.getAction(); + LogUtil.i("CallLogNotificationsService.onHandleIntent", "action: " + action); switch (action) { - case ACTION_MARK_NEW_VOICEMAILS_AS_OLD: - // VoicemailQueryHandler cannot be created on the IntentService worker thread. The completed - // callback might happen when the thread is dead. - Handler handler = new Handler(Looper.getMainLooper()); - handler.post( - () -> { - if (mVoicemailQueryHandler == null) { - mVoicemailQueryHandler = new VoicemailQueryHandler(this, getContentResolver()); - } - mVoicemailQueryHandler.markNewVoicemailsAsOld(intent.getData()); - }); + case ACTION_MARK_ALL_NEW_VOICEMAILS_AS_OLD: + VoicemailQueryHandler.markAllNewVoicemailsAsRead(this); + VisualVoicemailNotifier.cancelAllVoicemailNotifications(this); + break; + case ACTION_MARK_SINGLE_NEW_VOICEMAIL_AS_OLD: + Uri voicemailUri = intent.getData(); + VoicemailQueryHandler.markSingleNewVoicemailAsRead(this, voicemailUri); + VisualVoicemailNotifier.cancelSingleVoicemailNotification(this, voicemailUri); + break; + case ACTION_LEGACY_VOICEMAIL_DISMISSED: + LegacyVoicemailNotificationReceiver.setDismissed( + this, intent.getParcelableExtra(EXTRA_PHONE_ACCOUNT_HANDLE), true); break; case ACTION_INCOMING_POST_CALL: String note = intent.getStringExtra(EXTRA_POST_CALL_NOTE); String phoneNumber = intent.getStringExtra(EXTRA_POST_CALL_NUMBER); MissedCallNotifier.getIstance(this).insertPostCallNotification(phoneNumber, note); break; - case ACTION_MARK_NEW_MISSED_CALLS_AS_OLD: - CallLogNotificationsQueryHelper.removeMissedCallNotifications(this, intent.getData()); + case ACTION_CANCEL_ALL_MISSED_CALLS: + cancelAllMissedCalls(this); + break; + case ACTION_CANCEL_SINGLE_MISSED_CALL: + Uri callUri = intent.getData(); + CallLogNotificationsQueryHelper.markSingleMissedCallInCallLogAsRead(this, callUri); + MissedCallNotifier.cancelSingleMissedCallNotification(this, callUri); TelecomUtil.cancelMissedCallsNotification(this); break; case ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION: @@ -145,8 +217,30 @@ public class CallLogNotificationsService extends IntentService { intent.getData()); break; default: - LogUtil.d("CallLogNotificationsService.onHandleIntent", "could not handle: " + intent); + LogUtil.e("CallLogNotificationsService.onHandleIntent", "no handler for action: " + action); break; } } + + @WorkerThread + private static void cancelAllMissedCallsBackground(Context context) { + LogUtil.enterBlock("CallLogNotificationsService.cancelAllMissedCallsBackground"); + Assert.isWorkerThread(); + CallLogNotificationsQueryHelper.markAllMissedCallsInCallLogAsRead(context); + MissedCallNotifier.cancelAllMissedCallNotifications(context); + TelecomUtil.cancelMissedCallsNotification(context); + } + + /** Worker that cancels all missed call notifications and updates call log entries. */ + private static class CancelAllMissedCallsWorker implements Worker { + + @Nullable + @Override + public Void doInBackground(@Nullable Context context) throws Throwable { + if (context != null) { + cancelAllMissedCallsBackground(context); + } + return null; + } + } } diff --git a/java/com/android/dialer/app/calllog/CallLogReceiver.java b/java/com/android/dialer/app/calllog/CallLogReceiver.java index 172d00100..ce3132d12 100644 --- a/java/com/android/dialer/app/calllog/CallLogReceiver.java +++ b/java/com/android/dialer/app/calllog/CallLogReceiver.java @@ -39,10 +39,10 @@ public class CallLogReceiver extends BroadcastReceiver { if (VoicemailContract.ACTION_NEW_VOICEMAIL.equals(intent.getAction())) { checkVoicemailStatus(context); PendingResult pendingResult = goAsync(); - DefaultVoicemailNotifier.updateVoicemailNotifications(context, pendingResult::finish); + VisualVoicemailUpdateTask.scheduleTask(context, pendingResult::finish); } else if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { PendingResult pendingResult = goAsync(); - DefaultVoicemailNotifier.updateVoicemailNotifications(context, pendingResult::finish); + VisualVoicemailUpdateTask.scheduleTask(context, pendingResult::finish); } else { LogUtil.w("CallLogReceiver.onReceive", "could not handle: " + intent); } diff --git a/java/com/android/dialer/app/calllog/ClearCallLogDialog.java b/java/com/android/dialer/app/calllog/ClearCallLogDialog.java index a01b89527..b16eb1beb 100644 --- a/java/com/android/dialer/app/calllog/ClearCallLogDialog.java +++ b/java/com/android/dialer/app/calllog/ClearCallLogDialog.java @@ -22,70 +22,63 @@ import android.app.Dialog; import android.app.DialogFragment; import android.app.FragmentManager; import android.app.ProgressDialog; -import android.content.ContentResolver; import android.content.Context; -import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; -import android.os.AsyncTask; import android.os.Bundle; import android.provider.CallLog.Calls; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; import com.android.dialer.app.R; +import com.android.dialer.common.Assert; +import com.android.dialer.common.concurrent.DialerExecutor; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutorComponent; +import com.android.dialer.enrichedcall.EnrichedCallComponent; import com.android.dialer.phonenumbercache.CachedNumberLookupService; import com.android.dialer.phonenumbercache.PhoneNumberCache; /** Dialog that clears the call log after confirming with the user */ public class ClearCallLogDialog extends DialogFragment { + private DialerExecutor clearCallLogTask; + private ProgressDialog progressDialog; + /** Preferred way to show this dialog */ public static void show(FragmentManager fragmentManager) { ClearCallLogDialog dialog = new ClearCallLogDialog(); dialog.show(fragmentManager, "deleteCallLog"); } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + clearCallLogTask = + DialerExecutorComponent.get(getContext()) + .dialerExecutorFactory() + .createUiTaskBuilder( + getFragmentManager(), + "clearCallLogTask", + new ClearCallLogWorker(getActivity().getApplicationContext())) + .onSuccess(this::onSuccess) + .build(); + } + @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final ContentResolver resolver = getActivity().getContentResolver(); - final Context context = getActivity().getApplicationContext(); - final OnClickListener okListener = - new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final ProgressDialog progressDialog = - ProgressDialog.show( - getActivity(), getString(R.string.clearCallLogProgress_title), "", true, false); - progressDialog.setOwnerActivity(getActivity()); - CallLogNotificationsService.markNewMissedCallsAsOld(getContext(), null); - final AsyncTask task = - new AsyncTask() { - @Override - protected Void doInBackground(Void... params) { - resolver.delete(Calls.CONTENT_URI, null, null); - CachedNumberLookupService cachedNumberLookupService = - PhoneNumberCache.get(context).getCachedNumberLookupService(); - if (cachedNumberLookupService != null) { - cachedNumberLookupService.clearAllCacheEntries(context); - } - return null; - } - - @Override - protected void onPostExecute(Void result) { - final Activity activity = progressDialog.getOwnerActivity(); - - if (activity == null || activity.isDestroyed() || activity.isFinishing()) { - return; - } - - if (progressDialog != null && progressDialog.isShowing()) { - progressDialog.dismiss(); - } - } - }; - // TODO: Once we have the API, we should configure this ProgressDialog - // to only show up after a certain time (e.g. 150ms) - progressDialog.show(); - task.execute(); - } + OnClickListener okListener = + (dialog, which) -> { + progressDialog = + ProgressDialog.show( + getActivity(), getString(R.string.clearCallLogProgress_title), "", true, false); + progressDialog.setOwnerActivity(getActivity()); + CallLogNotificationsService.cancelAllMissedCalls(getContext()); + + // TODO: Once we have the API, we should configure this ProgressDialog + // to only show up after a certain time (e.g. 150ms) + progressDialog.show(); + + clearCallLogTask.executeSerial(null); }; return new AlertDialog.Builder(getActivity()) .setTitle(R.string.clearCallLogConfirmation_title) @@ -96,4 +89,49 @@ public class ClearCallLogDialog extends DialogFragment { .setCancelable(true) .create(); } + + private static class ClearCallLogWorker implements Worker { + private final Context appContext; + + private ClearCallLogWorker(Context appContext) { + this.appContext = appContext; + } + + @Nullable + @Override + public Void doInBackground(@Nullable Void unused) throws Throwable { + appContext.getContentResolver().delete(Calls.CONTENT_URI, null, null); + CachedNumberLookupService cachedNumberLookupService = + PhoneNumberCache.get(appContext).getCachedNumberLookupService(); + if (cachedNumberLookupService != null) { + cachedNumberLookupService.clearAllCacheEntries(appContext); + } + return null; + } + } + + private void onSuccess(Void unused) { + Assert.isNotNull(progressDialog); + Activity activity = progressDialog.getOwnerActivity(); + + if (activity == null || activity.isDestroyed() || activity.isFinishing()) { + return; + } + + maybeShowEnrichedCallSnackbar(activity); + + if (progressDialog != null && progressDialog.isShowing()) { + progressDialog.dismiss(); + } + } + + private void maybeShowEnrichedCallSnackbar(Activity activity) { + if (EnrichedCallComponent.get(activity).getEnrichedCallManager().hasStoredData()) { + Snackbar.make( + activity.findViewById(R.id.calllog_frame), + getString(R.string.multiple_ec_data_deleted), + 5_000) + .show(); + } + } } diff --git a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java b/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java deleted file mode 100644 index 58fe6fa2c..000000000 --- a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.dialer.app.calllog; - -import android.annotation.TargetApi; -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.net.Uri; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; -import android.os.PersistableBundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; -import android.support.annotation.WorkerThread; -import android.support.v4.os.BuildCompat; -import android.support.v4.util.Pair; -import android.telecom.PhoneAccount; -import android.telecom.PhoneAccountHandle; -import android.telecom.TelecomManager; -import android.telephony.CarrierConfigManager; -import android.telephony.PhoneNumberUtils; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.util.ArrayMap; -import com.android.contacts.common.compat.TelephonyManagerCompat; -import com.android.contacts.common.util.ContactDisplayUtils; -import com.android.dialer.app.DialtactsActivity; -import com.android.dialer.app.R; -import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall; -import com.android.dialer.app.contactinfo.ContactPhotoLoader; -import com.android.dialer.app.list.DialtactsPagerAdapter; -import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; -import com.android.dialer.blocking.FilteredNumbersUtil; -import com.android.dialer.calllogutils.PhoneAccountUtils; -import com.android.dialer.common.Assert; -import com.android.dialer.common.LogUtil; -import com.android.dialer.common.concurrent.DialerExecutor.Worker; -import com.android.dialer.common.concurrent.DialerExecutors; -import com.android.dialer.logging.DialerImpression; -import com.android.dialer.logging.Logger; -import com.android.dialer.notification.NotificationChannelManager; -import com.android.dialer.notification.NotificationChannelManager.Channel; -import com.android.dialer.phonenumbercache.ContactInfo; -import com.android.dialer.telecom.TelecomUtil; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** Shows a voicemail notification in the status bar. */ -public class DefaultVoicemailNotifier implements Worker { - - public static final String TAG = "VoicemailNotifier"; - - /** The tag used to identify notifications from this class. */ - static final String VISUAL_VOICEMAIL_NOTIFICATION_TAG = "DefaultVoicemailNotifier"; - /** The identifier of the notification of new voicemails. */ - private static final int VISUAL_VOICEMAIL_NOTIFICATION_ID = R.id.notification_visual_voicemail; - - private static final int LEGACY_VOICEMAIL_NOTIFICATION_ID = R.id.notification_legacy_voicemail; - private static final String LEGACY_VOICEMAIL_NOTIFICATION_TAG = "legacy_voicemail"; - - private final Context context; - private final CallLogNotificationsQueryHelper queryHelper; - private final FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler; - - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - DefaultVoicemailNotifier( - Context context, - CallLogNotificationsQueryHelper queryHelper, - FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler) { - this.context = context; - this.queryHelper = queryHelper; - this.filteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler; - } - - public DefaultVoicemailNotifier(Context context) { - this( - context, - CallLogNotificationsQueryHelper.getInstance(context), - new FilteredNumberAsyncQueryHandler(context)); - } - - @Nullable - @Override - public Void doInBackground(@Nullable Void input) throws Throwable { - updateNotification(); - return null; - } - - /** - * Updates the notification and notifies of the call with the given URI. - * - *

Clears the notification if there are no new voicemails, and notifies if the given URI - * corresponds to a new voicemail. - * - *

It is not safe to call this method from the main thread. - */ - @VisibleForTesting - @WorkerThread - void updateNotification() { - Assert.isWorkerThread(); - // Lookup the list of new voicemails to include in the notification. - final List newCalls = queryHelper.getNewVoicemails(); - - if (newCalls == null) { - // Query failed, just return. - return; - } - - Resources resources = context.getResources(); - - // This represents a list of names to include in the notification. - String callers = null; - - // Maps each number into a name: if a number is in the map, it has already left a more - // recent voicemail. - final Map contactInfos = new ArrayMap<>(); - - // Iterate over the new voicemails to determine all the information above. - Iterator itr = newCalls.iterator(); - while (itr.hasNext()) { - NewCall newCall = itr.next(); - - // Skip notifying for numbers which are blocked. - if (!FilteredNumbersUtil.hasRecentEmergencyCall(context) - && filteredNumberAsyncQueryHandler.getBlockedIdSynchronous( - newCall.number, newCall.countryIso) - != null) { - itr.remove(); - - if (newCall.voicemailUri != null) { - // Delete the voicemail. - CallLogAsyncTaskUtil.deleteVoicemailSynchronous(context, newCall.voicemailUri); - } - continue; - } - - // Check if we already know the name associated with this number. - ContactInfo contactInfo = contactInfos.get(newCall.number); - if (contactInfo == null) { - contactInfo = - queryHelper.getContactInfo( - newCall.number, newCall.numberPresentation, newCall.countryIso); - contactInfos.put(newCall.number, contactInfo); - // This is a new caller. Add it to the back of the list of callers. - if (TextUtils.isEmpty(callers)) { - callers = contactInfo.name; - } else { - callers = - resources.getString( - R.string.notification_voicemail_callers_list, callers, contactInfo.name); - } - } - } - - if (newCalls.isEmpty()) { - // No voicemails to notify about - return; - } - - Notification.Builder groupSummary = - createNotificationBuilder() - .setContentTitle( - resources.getQuantityString( - R.plurals.notification_voicemail_title, newCalls.size(), newCalls.size())) - .setContentText(callers) - .setDeleteIntent(createMarkNewVoicemailsAsOldIntent(null)) - .setGroupSummary(true) - .setContentIntent(newVoicemailIntent(null)); - - if (BuildCompat.isAtLeastO()) { - groupSummary.setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN); - } - - NotificationChannelManager.applyChannel( - groupSummary, - context, - Channel.VOICEMAIL, - PhoneAccountHandles.getAccount(context, newCalls.get(0))); - - LogUtil.i(TAG, "Creating visual voicemail notification"); - getNotificationManager() - .notify( - VISUAL_VOICEMAIL_NOTIFICATION_TAG, - VISUAL_VOICEMAIL_NOTIFICATION_ID, - groupSummary.build()); - - for (NewCall voicemail : newCalls) { - getNotificationManager() - .notify( - voicemail.callsUri.toString(), - VISUAL_VOICEMAIL_NOTIFICATION_ID, - createNotificationForVoicemail(voicemail, contactInfos)); - } - } - - /** - * Replicates how packages/services/Telephony/NotificationMgr.java handles legacy voicemail - * notification. The notification will not be stackable because no information is available for - * individual voicemails. - */ - @TargetApi(VERSION_CODES.O) - public void notifyLegacyVoicemail( - @NonNull PhoneAccountHandle phoneAccountHandle, - int count, - String voicemailNumber, - PendingIntent callVoicemailIntent, - PendingIntent voicemailSettingIntent) { - Assert.isNotNull(phoneAccountHandle); - Assert.checkArgument(BuildCompat.isAtLeastO()); - TelephonyManager telephonyManager = - context - .getSystemService(TelephonyManager.class) - .createForPhoneAccountHandle(phoneAccountHandle); - Assert.isNotNull(telephonyManager); - LogUtil.i(TAG, "Creating legacy voicemail notification"); - - PersistableBundle carrierConfig = telephonyManager.getCarrierConfig(); - - String notificationTitle = - context - .getResources() - .getQuantityString(R.plurals.notification_voicemail_title, count, count); - - TelecomManager telecomManager = context.getSystemService(TelecomManager.class); - PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle); - - String notificationText; - PendingIntent pendingIntent; - - if (voicemailSettingIntent != null) { - // If the voicemail number if unknown, instead of calling voicemail, take the user - // to the voicemail settings. - notificationText = context.getString(R.string.notification_voicemail_no_vm_number); - pendingIntent = voicemailSettingIntent; - } else { - if (PhoneAccountUtils.getSubscriptionPhoneAccounts(context).size() > 1) { - notificationText = phoneAccount.getShortDescription().toString(); - } else { - notificationText = - String.format( - context.getString(R.string.notification_voicemail_text_format), - PhoneNumberUtils.formatNumber(voicemailNumber)); - } - pendingIntent = callVoicemailIntent; - } - Notification.Builder builder = new Notification.Builder(context); - builder - .setSmallIcon(android.R.drawable.stat_notify_voicemail) - .setColor(context.getColor(R.color.dialer_theme_color)) - .setWhen(System.currentTimeMillis()) - .setContentTitle(notificationTitle) - .setContentText(notificationText) - .setContentIntent(pendingIntent) - .setSound(telephonyManager.getVoicemailRingtoneUri(phoneAccountHandle)) - .setOngoing( - carrierConfig.getBoolean( - CarrierConfigManager.KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL)); - - if (telephonyManager.isVoicemailVibrationEnabled(phoneAccountHandle)) { - builder.setDefaults(Notification.DEFAULT_VIBRATE); - } - - NotificationChannelManager.applyChannel( - builder, context, Channel.VOICEMAIL, phoneAccountHandle); - Notification notification = builder.build(); - getNotificationManager() - .notify(LEGACY_VOICEMAIL_NOTIFICATION_TAG, LEGACY_VOICEMAIL_NOTIFICATION_ID, notification); - } - - public void cancelLegacyNotification() { - LogUtil.i(TAG, "Clearing legacy voicemail notification"); - getNotificationManager() - .cancel(LEGACY_VOICEMAIL_NOTIFICATION_TAG, LEGACY_VOICEMAIL_NOTIFICATION_ID); - } - - /** - * Determines which ringtone Uri and Notification defaults to use when updating the notification - * for the given call. - */ - private Pair getNotificationInfo(@Nullable NewCall callToNotify) { - LogUtil.v(TAG, "getNotificationInfo"); - if (callToNotify == null) { - LogUtil.i(TAG, "callToNotify == null"); - return new Pair<>(null, 0); - } - PhoneAccountHandle accountHandle = PhoneAccountHandles.getAccount(context, callToNotify); - if (accountHandle == null) { - LogUtil.i(TAG, "No default phone account found, using default notification ringtone"); - return new Pair<>(null, Notification.DEFAULT_ALL); - } - return new Pair<>( - TelephonyManagerCompat.getVoicemailRingtoneUri(getTelephonyManager(), accountHandle), - getNotificationDefaults(accountHandle)); - } - - private int getNotificationDefaults(PhoneAccountHandle accountHandle) { - if (VERSION.SDK_INT >= VERSION_CODES.N) { - return TelephonyManagerCompat.isVoicemailVibrationEnabled( - getTelephonyManager(), accountHandle) - ? Notification.DEFAULT_VIBRATE - : 0; - } - return Notification.DEFAULT_ALL; - } - - /** Creates a pending intent that marks all new voicemails as old. */ - private PendingIntent createMarkNewVoicemailsAsOldIntent(@Nullable Uri voicemailUri) { - Intent intent = new Intent(context, CallLogNotificationsService.class); - intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_VOICEMAILS_AS_OLD); - intent.setData(voicemailUri); - return PendingIntent.getService(context, 0, intent, 0); - } - - private NotificationManager getNotificationManager() { - return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - } - - private TelephonyManager getTelephonyManager() { - return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - } - - private Notification createNotificationForVoicemail( - @NonNull NewCall voicemail, @NonNull Map contactInfos) { - Pair notificationInfo = getNotificationInfo(voicemail); - ContactInfo contactInfo = contactInfos.get(voicemail.number); - - Notification.Builder notificationBuilder = - createNotificationBuilder() - .setContentTitle( - context - .getResources() - .getQuantityString(R.plurals.notification_voicemail_title, 1, 1)) - .setContentText( - ContactDisplayUtils.getTtsSpannedPhoneNumber( - context.getResources(), - R.string.notification_new_voicemail_ticker, - contactInfo.name)) - .setWhen(voicemail.dateMs) - .setSound(notificationInfo.first) - .setDefaults(notificationInfo.second); - - if (voicemail.voicemailUri != null) { - notificationBuilder.setDeleteIntent( - createMarkNewVoicemailsAsOldIntent(voicemail.voicemailUri)); - } - - NotificationChannelManager.applyChannel( - notificationBuilder, - context, - Channel.VOICEMAIL, - PhoneAccountHandles.getAccount(context, voicemail)); - - ContactPhotoLoader loader = new ContactPhotoLoader(context, contactInfo); - Bitmap photoIcon = loader.loadPhotoIcon(); - if (photoIcon != null) { - notificationBuilder.setLargeIcon(photoIcon); - } - if (!TextUtils.isEmpty(voicemail.transcription)) { - Logger.get(context) - .logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_TRANSCRIPTION); - notificationBuilder.setStyle( - new Notification.BigTextStyle().bigText(voicemail.transcription)); - } - notificationBuilder.setContentIntent(newVoicemailIntent(voicemail)); - Logger.get(context).logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED); - return notificationBuilder.build(); - } - - private Notification.Builder createNotificationBuilder() { - return new Notification.Builder(context) - .setSmallIcon(android.R.drawable.stat_notify_voicemail) - .setColor(context.getColor(R.color.dialer_theme_color)) - .setGroup(VISUAL_VOICEMAIL_NOTIFICATION_TAG) - .setOnlyAlertOnce(true) - .setAutoCancel(true); - } - - private PendingIntent newVoicemailIntent(@Nullable NewCall voicemail) { - Intent intent = - DialtactsActivity.getShowTabIntent(context, DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL); - // TODO (b/35486204): scroll to this voicemail - if (voicemail != null) { - intent.setData(voicemail.voicemailUri); - } - intent.putExtra(DialtactsActivity.EXTRA_CLEAR_NEW_VOICEMAILS, true); - return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); - } - - /** - * Updates the voicemail notifications displayed. - * - * @param runnable Called when the async update task completes no matter if it succeeds or fails. - * May be null. - */ - static void updateVoicemailNotifications(Context context, Runnable runnable) { - if (!TelecomUtil.isDefaultDialer(context)) { - LogUtil.i( - "DefaultVoicemailNotifier.updateVoicemailNotifications", - "not default dialer, not scheduling update to voicemail notifications"); - return; - } - - DialerExecutors.createNonUiTaskBuilder(new DefaultVoicemailNotifier(context)) - .onSuccess( - output -> { - LogUtil.i( - "DefaultVoicemailNotifier.updateVoicemailNotifications", - "update voicemail notifications successful"); - if (runnable != null) { - runnable.run(); - } - }) - .onFailure( - throwable -> { - LogUtil.i( - "DefaultVoicemailNotifier.updateVoicemailNotifications", - "update voicemail notifications failed"); - if (runnable != null) { - runnable.run(); - } - }) - .build() - .executeParallel(null); - } -} diff --git a/java/com/android/dialer/app/calllog/DialerQuickContactBadge.java b/java/com/android/dialer/app/calllog/DialerQuickContactBadge.java new file mode 100644 index 000000000..a3aac41fa --- /dev/null +++ b/java/com/android/dialer/app/calllog/DialerQuickContactBadge.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.app.calllog; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.QuickContactBadge; +import com.android.dialer.app.calllog.CallLogAdapter.OnActionModeStateChangedListener; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; + +/** Allows us to click the contact badge for non multi select mode. */ +class DialerQuickContactBadge extends QuickContactBadge { + + private View.OnClickListener mExtraOnClickListener; + private OnActionModeStateChangedListener onActionModeStateChangeListener; + + public DialerQuickContactBadge(Context context) { + super(context); + } + + public DialerQuickContactBadge(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DialerQuickContactBadge(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public void onClick(View v) { + if (mExtraOnClickListener != null + && onActionModeStateChangeListener.isActionModeStateEnabled()) { + Logger.get(v.getContext()) + .logImpression(DialerImpression.Type.MULTISELECT_SINGLE_PRESS_TAP_VIA_CONTACT_BADGE); + mExtraOnClickListener.onClick(v); + } else { + super.onClick(v); + } + } + + public void setMulitSelectListeners( + View.OnClickListener extraOnClickListener, + OnActionModeStateChangedListener actionModeStateChangeListener) { + mExtraOnClickListener = extraOnClickListener; + onActionModeStateChangeListener = actionModeStateChangeListener; + } +} diff --git a/java/com/android/dialer/app/calllog/IntentProvider.java b/java/com/android/dialer/app/calllog/IntentProvider.java index a94c6781e..55fdbbace 100644 --- a/java/com/android/dialer/app/calllog/IntentProvider.java +++ b/java/com/android/dialer/app/calllog/IntentProvider.java @@ -24,11 +24,11 @@ import android.provider.ContactsContract; import android.telecom.PhoneAccountHandle; import com.android.contacts.common.model.Contact; import com.android.contacts.common.model.ContactLoader; -import com.android.dialer.callcomposer.CallComposerContact; import com.android.dialer.calldetails.CallDetailsActivity; import com.android.dialer.calldetails.CallDetailsEntries; import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.callintent.CallIntentBuilder; +import com.android.dialer.dialercontact.DialerContact; import com.android.dialer.lightbringer.LightbringerComponent; import com.android.dialer.util.CallUtil; import com.android.dialer.util.IntentUtil; @@ -112,11 +112,12 @@ public abstract class IntentProvider { * @return The call details intent provider. */ public static IntentProvider getCallDetailIntentProvider( - CallDetailsEntries callDetailsEntries, CallComposerContact contact) { + CallDetailsEntries callDetailsEntries, DialerContact contact, boolean canReportCallerId) { return new IntentProvider() { @Override public Intent getIntent(Context context) { - return CallDetailsActivity.newInstance(context, callDetailsEntries, contact); + return CallDetailsActivity.newInstance( + context, callDetailsEntries, contact, canReportCallerId); } }; } diff --git a/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java b/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java new file mode 100644 index 000000000..584f07fe3 --- /dev/null +++ b/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java @@ -0,0 +1,156 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.app.calllog; + +import android.annotation.TargetApi; +import android.app.Notification; +import android.app.PendingIntent; +import android.content.Context; +import android.os.Build.VERSION_CODES; +import android.support.annotation.NonNull; +import android.support.v4.os.BuildCompat; +import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import android.telephony.CarrierConfigManager; +import android.telephony.PhoneNumberUtils; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import com.android.dialer.app.R; +import com.android.dialer.calllogutils.PhoneAccountUtils; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.notification.DialerNotificationManager; +import com.android.dialer.notification.NotificationChannelManager; + +/** Shows a notification in the status bar for legacy vociemail. */ +@TargetApi(VERSION_CODES.O) +public final class LegacyVoicemailNotifier { + private static final String NOTIFICATION_TAG = "LegacyVoicemail"; + private static final int NOTIFICATION_ID = 1; + + /** + * Replicates how packages/services/Telephony/NotificationMgr.java handles legacy voicemail + * notification. The notification will not be stackable because no information is available for + * individual voicemails. + */ + public static void showNotification( + @NonNull Context context, + @NonNull PhoneAccountHandle handle, + int count, + String voicemailNumber, + PendingIntent callVoicemailIntent, + PendingIntent voicemailSettingsIntent, + boolean isRefresh) { + LogUtil.enterBlock("LegacyVoicemailNotifier.showNotification"); + Assert.isNotNull(handle); + Assert.checkArgument(BuildCompat.isAtLeastO()); + + TelephonyManager pinnedTelephonyManager = + context.getSystemService(TelephonyManager.class).createForPhoneAccountHandle(handle); + if (pinnedTelephonyManager == null) { + LogUtil.e("LegacyVoicemailNotifier.showNotification", "invalid PhoneAccountHandle"); + return; + } + + Notification notification = + createNotification( + context, + pinnedTelephonyManager, + handle, + count, + voicemailNumber, + callVoicemailIntent, + voicemailSettingsIntent, + isRefresh); + DialerNotificationManager.notify(context, NOTIFICATION_TAG, NOTIFICATION_ID, notification); + } + + @NonNull + private static Notification createNotification( + @NonNull Context context, + @NonNull TelephonyManager pinnedTelephonyManager, + @NonNull PhoneAccountHandle handle, + int count, + String voicemailNumber, + PendingIntent callVoicemailIntent, + PendingIntent voicemailSettingsIntent, + boolean isRefresh) { + String notificationTitle = + context + .getResources() + .getQuantityString(R.plurals.notification_voicemail_title, count, count); + boolean isOngoing = + pinnedTelephonyManager + .getCarrierConfig() + .getBoolean(CarrierConfigManager.KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL); + + String contentText; + PendingIntent contentIntent; + if (!TextUtils.isEmpty(voicemailNumber) && callVoicemailIntent != null) { + contentText = getNotificationText(context, handle, voicemailNumber); + contentIntent = callVoicemailIntent; + } else { + contentText = context.getString(R.string.notification_voicemail_no_vm_number); + contentIntent = voicemailSettingsIntent; + } + + Notification.Builder builder = + new Notification.Builder(context) + .setSmallIcon(android.R.drawable.stat_notify_voicemail) + .setColor(context.getColor(R.color.dialer_theme_color)) + .setWhen(System.currentTimeMillis()) + .setContentTitle(notificationTitle) + .setContentText(contentText) + .setContentIntent(contentIntent) + .setSound(pinnedTelephonyManager.getVoicemailRingtoneUri(handle)) + .setOngoing(isOngoing) + .setOnlyAlertOnce(isRefresh) + .setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle)) + .setDeleteIntent( + CallLogNotificationsService.createLegacyVoicemailDismissedPendingIntent( + context, handle)); + + if (pinnedTelephonyManager.isVoicemailVibrationEnabled(handle)) { + builder.setDefaults(Notification.DEFAULT_VIBRATE); + } + + return builder.build(); + } + + @NonNull + private static String getNotificationText( + @NonNull Context context, PhoneAccountHandle handle, String voicemailNumber) { + if (PhoneAccountUtils.getSubscriptionPhoneAccounts(context).size() > 1) { + TelecomManager telecomManager = context.getSystemService(TelecomManager.class); + PhoneAccount phoneAccount = telecomManager.getPhoneAccount(handle); + return phoneAccount.getShortDescription().toString(); + } else { + return String.format( + context.getString(R.string.notification_voicemail_text_format), + PhoneNumberUtils.formatNumber(voicemailNumber)); + } + } + + public static void cancelNotification(@NonNull Context context) { + LogUtil.enterBlock("LegacyVoicemailNotifier.cancelNotification"); + Assert.checkArgument(BuildCompat.isAtLeastO()); + DialerNotificationManager.cancel(context, NOTIFICATION_TAG, NOTIFICATION_ID); + } + + private LegacyVoicemailNotifier() {} +} diff --git a/java/com/android/dialer/app/calllog/MissedCallNotifier.java b/java/com/android/dialer/app/calllog/MissedCallNotifier.java index dd13298bc..b363b5ab6 100644 --- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java +++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java @@ -17,7 +17,6 @@ package com.android.dialer.app.calllog; import android.app.Notification; import android.app.Notification.Builder; -import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; @@ -30,11 +29,13 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.annotation.WorkerThread; +import android.support.v4.os.BuildCompat; import android.support.v4.os.UserManagerCompat; import android.support.v4.util.Pair; import android.text.BidiFormatter; import android.text.TextDirectionHeuristics; import android.text.TextUtils; +import android.util.ArraySet; import com.android.contacts.common.ContactsUtils; import com.android.contacts.common.compat.PhoneNumberUtilsCompat; import com.android.dialer.app.DialtactsActivity; @@ -46,23 +47,30 @@ import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.callintent.CallIntentBuilder; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.DialerExecutor.Worker; -import com.android.dialer.notification.NotificationChannelManager; -import com.android.dialer.notification.NotificationChannelManager.Channel; +import com.android.dialer.notification.DialerNotificationManager; +import com.android.dialer.notification.NotificationChannelId; +import com.android.dialer.notification.NotificationManagerUtils; import com.android.dialer.phonenumbercache.ContactInfo; import com.android.dialer.phonenumberutil.PhoneNumberHelper; import com.android.dialer.util.DialerUtils; import com.android.dialer.util.IntentUtil; -import java.util.HashSet; import java.util.List; import java.util.Set; /** Creates a notification for calls that the user missed (neither answered nor rejected). */ public class MissedCallNotifier implements Worker, Void> { - /** The tag used to identify notifications from this class. */ - static final String NOTIFICATION_TAG = "MissedCallNotifier"; - /** The identifier of the notification of new missed calls. */ - private static final int NOTIFICATION_ID = R.id.notification_missed_call; + /** Prefix used to generate a unique tag for each missed call notification. */ + private static final String NOTIFICATION_TAG_PREFIX = "MissedCall_"; + /** Common ID for all missed call notifications. */ + private static final int NOTIFICATION_ID = 1; + /** Tag for the group summary notification. */ + private static final String GROUP_SUMMARY_NOTIFICATION_TAG = "GroupSummary_MissedCall"; + /** + * Key used to associate all missed call notifications and the summary as belonging to a single + * group. + */ + private static final String GROUP_KEY = "MissedCallGroup"; private final Context context; private final CallLogNotificationsQueryHelper callLogNotificationsQueryHelper; @@ -104,7 +112,8 @@ public class MissedCallNotifier implements Worker, Void> { if ((newCalls != null && newCalls.isEmpty()) || count == 0) { // No calls to notify about: clear the notification. - CallLogNotificationsQueryHelper.removeMissedCallNotifications(context, null); + CallLogNotificationsQueryHelper.markAllMissedCallsInCallLogAsRead(context); + cancelAllMissedCallNotifications(context); return; } @@ -146,7 +155,7 @@ public class MissedCallNotifier implements Worker, Void> { null, System.currentTimeMillis()); - //TODO: look up caller ID that is not in contacts. + // TODO: look up caller ID that is not in contacts. ContactInfo contactInfo = callLogNotificationsQueryHelper.getContactInfo( call.number, call.numberPresentation, call.countryIso); @@ -181,52 +190,84 @@ public class MissedCallNotifier implements Worker, Void> { publicSummaryBuilder .setContentTitle(context.getText(titleResId)) .setContentIntent(createCallLogPendingIntent()) - .setDeleteIntent(createClearMissedCallsPendingIntent(null)); + .setDeleteIntent( + CallLogNotificationsService.createCancelAllMissedCallsPendingIntent(context)); // Create the notification summary suitable for display when sensitive information is showing. groupSummary .setContentTitle(context.getText(titleResId)) .setContentText(expandedText) .setContentIntent(createCallLogPendingIntent()) - .setDeleteIntent(createClearMissedCallsPendingIntent(null)) + .setDeleteIntent( + CallLogNotificationsService.createCancelAllMissedCallsPendingIntent(context)) .setGroupSummary(useCallList) .setOnlyAlertOnce(useCallList) .setPublicVersion(publicSummaryBuilder.build()); - - NotificationChannelManager.applyChannel(groupSummary, context, Channel.MISSED_CALL, null); + if (BuildCompat.isAtLeastO()) { + groupSummary.setChannelId(NotificationChannelId.MISSED_CALL); + } Notification notification = groupSummary.build(); configureLedOnNotification(notification); LogUtil.i("MissedCallNotifier.updateMissedCallNotification", "adding missed call notification"); - getNotificationMgr().notify(NOTIFICATION_TAG, NOTIFICATION_ID, notification); + DialerNotificationManager.notify( + context, GROUP_SUMMARY_NOTIFICATION_TAG, NOTIFICATION_ID, notification); if (useCallList) { // Do not repost active notifications to prevent erasing post call notes. - NotificationManager manager = getNotificationMgr(); - Set activeTags = new HashSet<>(); - for (StatusBarNotification activeNotification : manager.getActiveNotifications()) { + Set activeTags = new ArraySet<>(); + for (StatusBarNotification activeNotification : + DialerNotificationManager.getActiveNotifications(context)) { activeTags.add(activeNotification.getTag()); } for (NewCall call : newCalls) { - String callTag = call.callsUri.toString(); + String callTag = getNotificationTagForCall(call); if (!activeTags.contains(callTag)) { - manager.notify(callTag, NOTIFICATION_ID, getNotificationForCall(call, null)); + DialerNotificationManager.notify( + context, callTag, NOTIFICATION_ID, getNotificationForCall(call, null)); } } } } + public static void cancelAllMissedCallNotifications(@NonNull Context context) { + NotificationManagerUtils.cancelAllInGroup(context, GROUP_KEY); + } + + public static void cancelSingleMissedCallNotification( + @NonNull Context context, @Nullable Uri callUri) { + if (callUri == null) { + LogUtil.e( + "MissedCallNotifier.cancelSingleMissedCallNotification", + "unable to cancel notification, uri is null"); + return; + } + // This will also dismiss the group summary if there are no more missed call notifications. + DialerNotificationManager.cancel( + context, getNotificationTagForCallUri(callUri), NOTIFICATION_ID); + } + + private static String getNotificationTagForCall(@NonNull NewCall call) { + return getNotificationTagForCallUri(call.callsUri); + } + + private static String getNotificationTagForCallUri(@NonNull Uri callUri) { + return NOTIFICATION_TAG_PREFIX + callUri; + } + public void insertPostCallNotification(@NonNull String number, @NonNull String note) { List newCalls = callLogNotificationsQueryHelper.getNewMissedCalls(); if (newCalls != null && !newCalls.isEmpty()) { for (NewCall call : newCalls) { if (call.number.equals(number.replace("tel:", ""))) { // Update the first notification that matches our post call note sender. - getNotificationMgr() - .notify( - call.callsUri.toString(), NOTIFICATION_ID, getNotificationForCall(call, note)); + DialerNotificationManager.notify( + context, + getNotificationTagForCall(call), + NOTIFICATION_ID, + getNotificationForCall(call, note)); break; } } @@ -308,7 +349,7 @@ public class MissedCallNotifier implements Worker, Void> { private Notification.Builder createNotificationBuilder() { return new Notification.Builder(context) - .setGroup(NOTIFICATION_TAG) + .setGroup(GROUP_KEY) .setSmallIcon(android.R.drawable.stat_notify_missed_call) .setColor(context.getResources().getColor(R.color.dialer_theme_color, null)) .setAutoCancel(true) @@ -321,10 +362,14 @@ public class MissedCallNotifier implements Worker, Void> { Builder builder = createNotificationBuilder() .setWhen(call.dateMs) - .setDeleteIntent(createClearMissedCallsPendingIntent(call.callsUri)) + .setDeleteIntent( + CallLogNotificationsService.createCancelSingleMissedCallPendingIntent( + context, call.callsUri)) .setContentIntent(createCallLogPendingIntent(call.callsUri)); + if (BuildCompat.isAtLeastO()) { + builder.setChannelId(NotificationChannelId.MISSED_CALL); + } - NotificationChannelManager.applyChannel(builder, context, Channel.MISSED_CALL, null); return builder; } @@ -332,7 +377,8 @@ public class MissedCallNotifier implements Worker, Void> { @WorkerThread public void callBackFromMissedCall(String number, Uri callUri) { closeSystemDialogs(context); - CallLogNotificationsQueryHelper.removeMissedCallNotifications(context, callUri); + CallLogNotificationsQueryHelper.markSingleMissedCallInCallLogAsRead(context, callUri); + cancelSingleMissedCallNotification(context, callUri); DialerUtils.startActivityWithErrorToast( context, new CallIntentBuilder(number, CallInitiationType.Type.MISSED_CALL_NOTIFICATION) @@ -343,7 +389,8 @@ public class MissedCallNotifier implements Worker, Void> { /** Trigger an intent to send an sms from a missed call number. */ public void sendSmsFromMissedCall(String number, Uri callUri) { closeSystemDialogs(context); - CallLogNotificationsQueryHelper.removeMissedCallNotifications(context, callUri); + CallLogNotificationsQueryHelper.markSingleMissedCallInCallLogAsRead(context, callUri); + cancelSingleMissedCallNotification(context, callUri); DialerUtils.startActivityWithErrorToast( context, IntentUtil.getSendSmsIntent(number).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } @@ -371,14 +418,6 @@ public class MissedCallNotifier implements Worker, Void> { return PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT); } - /** Creates a pending intent that marks all new missed calls as old. */ - private PendingIntent createClearMissedCallsPendingIntent(@Nullable Uri callUri) { - Intent intent = new Intent(context, CallLogNotificationsService.class); - intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_MISSED_CALLS_AS_OLD); - intent.setData(callUri); - return PendingIntent.getService(context, 0, intent, 0); - } - private PendingIntent createCallBackPendingIntent(String number, @NonNull Uri callUri) { Intent intent = new Intent(context, CallLogNotificationsService.class); intent.setAction(CallLogNotificationsService.ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION); @@ -410,8 +449,4 @@ public class MissedCallNotifier implements Worker, Void> { private void closeSystemDialogs(Context context) { context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); } - - private NotificationManager getNotificationMgr() { - return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - } } diff --git a/java/com/android/dialer/app/calllog/PhoneAccountHandles.java b/java/com/android/dialer/app/calllog/PhoneAccountHandles.java deleted file mode 100644 index acffffb1d..000000000 --- a/java/com/android/dialer/app/calllog/PhoneAccountHandles.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.dialer.app.calllog; - -import android.content.ComponentName; -import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.telecom.PhoneAccount; -import android.telecom.PhoneAccountHandle; -import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall; -import com.android.dialer.common.LogUtil; -import com.android.dialer.telecom.TelecomUtil; -import java.util.List; - -/** Methods to help extract {@link PhoneAccount} information from database and Telecomm sources. */ -class PhoneAccountHandles { - - @Nullable - public static PhoneAccountHandle getAccount(@NonNull Context context, @Nullable NewCall call) { - PhoneAccountHandle handle; - if (call == null || call.accountComponentName == null || call.accountId == null) { - LogUtil.v( - "PhoneAccountUtils.getAccount", - "accountComponentName == null || callToNotify.accountId == null"); - handle = TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_TEL); - if (handle == null) { - List callCapablePhoneAccounts = - TelecomUtil.getCallCapablePhoneAccounts(context); - if (!callCapablePhoneAccounts.isEmpty()) { - return callCapablePhoneAccounts.get(0); - } - return null; - } - } else { - handle = - new PhoneAccountHandle( - ComponentName.unflattenFromString(call.accountComponentName), call.accountId); - } - if (handle.getComponentName() != null) { - LogUtil.v( - "PhoneAccountUtils.getAccount", - "PhoneAccountHandle.ComponentInfo:" + handle.getComponentName()); - } else { - LogUtil.i("PhoneAccountUtils.getAccount", "PhoneAccountHandle.ComponentInfo: null"); - } - return handle; - } -} diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java index 0c720775a..c1a00e58d 100644 --- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java +++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java @@ -45,6 +45,13 @@ public class PhoneCallDetailsHelper { /** The maximum number of icons will be shown to represent the call types in a group. */ private static final int MAX_CALL_TYPE_ICONS = 3; + // TODO(mdooley): remove when these api's become public + // Copied from android.provider.VoicemailContract + static final int TRANSCRIPTION_NOT_STARTED = 0; + static final int TRANSCRIPTION_IN_PROGRESS = 1; + static final int TRANSCRIPTION_FAILED = 2; + static final int TRANSCRIPTION_AVAILABLE = 3; + private final Context mContext; private final Resources mResources; private final CallLogCache mCallLogCache; @@ -145,14 +152,37 @@ public class PhoneCallDetailsHelper { if (isVoicemail) { int relevantLinkTypes = Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS | Linkify.WEB_URLS; views.voicemailTranscriptionView.setAutoLinkMask(relevantLinkTypes); - views.voicemailTranscriptionView.setText( - TextUtils.isEmpty(details.transcription) ? null : details.transcription); + boolean showTranscriptBranding = false; + if (!TextUtils.isEmpty(details.transcription)) { + views.voicemailTranscriptionView.setText(details.transcription); + + // Set the branding text if the voicemail was transcribed by google + // TODO(mdooley): the transcription state is only set by the google transcription code, + // but a better solution would be to check the SOURCE_PACKAGE + showTranscriptBranding = details.transcriptionState == TRANSCRIPTION_AVAILABLE; + } else { + if (details.transcriptionState == TRANSCRIPTION_IN_PROGRESS) { + views.voicemailTranscriptionView.setText( + mResources.getString(R.string.voicemail_transcription_in_progress)); + } else if (details.transcriptionState == TRANSCRIPTION_FAILED) { + views.voicemailTranscriptionView.setText( + mResources.getString(R.string.voicemail_transcription_failed)); + } + } + + if (showTranscriptBranding) { + views.voicemailTranscriptionBrandingView.setText( + mResources.getString(R.string.voicemail_transcription_branding_text)); + } else { + views.voicemailTranscriptionBrandingView.setText(""); + } } // Bold if not read Typeface typeface = details.isRead ? Typeface.SANS_SERIF : Typeface.DEFAULT_BOLD; views.nameView.setTypeface(typeface); views.voicemailTranscriptionView.setTypeface(typeface); + views.voicemailTranscriptionBrandingView.setTypeface(typeface); views.callLocationAndDate.setTypeface(typeface); views.callLocationAndDate.setTextColor( ContextCompat.getColor( diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsViews.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsViews.java index e2e27a179..40c0894f0 100644 --- a/java/com/android/dialer/app/calllog/PhoneCallDetailsViews.java +++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsViews.java @@ -29,7 +29,9 @@ public final class PhoneCallDetailsViews { public final View callTypeView; public final CallTypeIconsView callTypeIcons; public final TextView callLocationAndDate; + public final View transcriptionView; public final TextView voicemailTranscriptionView; + public final TextView voicemailTranscriptionBrandingView; public final TextView callAccountLabel; private PhoneCallDetailsViews( @@ -37,13 +39,17 @@ public final class PhoneCallDetailsViews { View callTypeView, CallTypeIconsView callTypeIcons, TextView callLocationAndDate, + View transcriptionView, TextView voicemailTranscriptionView, + TextView voicemailTranscriptionBrandingView, TextView callAccountLabel) { this.nameView = nameView; this.callTypeView = callTypeView; this.callTypeIcons = callTypeIcons; this.callLocationAndDate = callLocationAndDate; + this.transcriptionView = transcriptionView; this.voicemailTranscriptionView = voicemailTranscriptionView; + this.voicemailTranscriptionBrandingView = voicemailTranscriptionBrandingView; this.callAccountLabel = callAccountLabel; } @@ -60,7 +66,9 @@ public final class PhoneCallDetailsViews { view.findViewById(R.id.call_type), (CallTypeIconsView) view.findViewById(R.id.call_type_icons), (TextView) view.findViewById(R.id.call_location_and_date), + view.findViewById(R.id.transcription), (TextView) view.findViewById(R.id.voicemail_transcription), + (TextView) view.findViewById(R.id.voicemail_transcription_branding), (TextView) view.findViewById(R.id.call_account_label)); } @@ -70,6 +78,8 @@ public final class PhoneCallDetailsViews { new View(context), new CallTypeIconsView(context), new TextView(context), + new View(context), + new TextView(context), new TextView(context), new TextView(context)); } diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java index 893d6bed9..8bfd48b05 100644 --- a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java +++ b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java @@ -16,12 +16,15 @@ package com.android.dialer.app.calllog; +import android.app.KeyguardManager; +import android.content.Context; import android.content.Intent; import android.database.ContentObserver; import android.media.AudioManager; import android.os.Bundle; import android.provider.CallLog; import android.provider.VoicemailContract; +import android.support.annotation.VisibleForTesting; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,15 +33,22 @@ import com.android.dialer.app.list.ListsFragment; import com.android.dialer.app.voicemail.VoicemailAudioManager; import com.android.dialer.app.voicemail.VoicemailErrorManager; import com.android.dialer.app.voicemail.VoicemailPlaybackPresenter; +import com.android.dialer.app.voicemail.error.VoicemailErrorMessageCreator; +import com.android.dialer.app.voicemail.error.VoicemailStatus; +import com.android.dialer.app.voicemail.error.VoicemailStatusWorker; import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DialerExecutor; +import com.android.dialer.common.concurrent.DialerExecutors; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; import com.android.dialer.util.PermissionsUtil; +import java.util.List; public class VisualVoicemailCallLogFragment extends CallLogFragment { private final ContentObserver mVoicemailStatusObserver = new CustomContentObserver(); private VoicemailPlaybackPresenter mVoicemailPlaybackPresenter; + private DialerExecutor mPreSyncVoicemailStatusCheckExecutor; private VoicemailErrorManager mVoicemailErrorManager; @@ -55,7 +65,6 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment { public void onActivityCreated(Bundle savedInstanceState) { mVoicemailPlaybackPresenter = VoicemailPlaybackPresenter.getInstance(getActivity(), savedInstanceState); - if (PermissionsUtil.hasReadVoicemailPermissions(getContext()) && PermissionsUtil.hasAddVoicemailPermissions(getContext())) { getActivity() @@ -68,6 +77,15 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment { "read voicemail permission unavailable."); } super.onActivityCreated(savedInstanceState); + + mPreSyncVoicemailStatusCheckExecutor = + DialerExecutors.createUiTaskBuilder( + getActivity().getFragmentManager(), + "fetchVoicemailStatus", + new VoicemailStatusWorker()) + .onSuccess(this::onPreSyncVoicemailStatusChecked) + .build(); + mVoicemailErrorManager = new VoicemailErrorManager(getContext(), getAdapter().getAlertManager(), mModalAlertManager); @@ -132,23 +150,52 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment { @Override public void onVisible() { - LogUtil.enterBlock("VisualVoicemailCallLogFragment.onPageSelected"); + LogUtil.enterBlock("VisualVoicemailCallLogFragment.onVisible"); super.onVisible(); if (getActivity() != null) { - Intent intent = new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL); - intent.setPackage(getActivity().getPackageName()); - getActivity().sendBroadcast(intent); + mPreSyncVoicemailStatusCheckExecutor.executeParallel(getActivity()); Logger.get(getActivity()).logImpression(DialerImpression.Type.VVM_TAB_VIEWED); getActivity().setVolumeControlStream(VoicemailAudioManager.PLAYBACK_STREAM); } } + private void onPreSyncVoicemailStatusChecked(List statuses) { + if (!shouldAutoSync(new VoicemailErrorMessageCreator(), statuses)) { + return; + } + + Intent intent = new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL); + intent.setPackage(getActivity().getPackageName()); + getActivity().sendBroadcast(intent); + } + + @VisibleForTesting + static boolean shouldAutoSync( + VoicemailErrorMessageCreator errorMessageCreator, List statuses) { + for (VoicemailStatus status : statuses) { + if (!status.isActive()) { + continue; + } + if (errorMessageCreator.isSyncBlockingError(status)) { + LogUtil.i( + "VisualVoicemailCallLogFragment.shouldAutoSync", "auto-sync blocked due to " + status); + return false; + } + } + return true; + } + @Override public void onNotVisible() { - LogUtil.enterBlock("VisualVoicemailCallLogFragment.onPageUnselected"); + LogUtil.enterBlock("VisualVoicemailCallLogFragment.onNotVisible"); super.onNotVisible(); if (getActivity() != null) { getActivity().setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE); + // onNotVisible will be called in the lock screen when the call ends + if (!getActivity().getSystemService(KeyguardManager.class).inKeyguardRestrictedInputMode()) { + LogUtil.i("VisualVoicemailCallLogFragment.onNotVisible", "clearing all new voicemails"); + CallLogNotificationsService.markAllNewVoicemailsAsOld(getActivity()); + } } } } diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java new file mode 100644 index 000000000..cbadfd317 --- /dev/null +++ b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java @@ -0,0 +1,271 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.app.calllog; + +import android.app.Notification; +import android.app.PendingIntent; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.os.BuildCompat; +import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import com.android.contacts.common.util.ContactDisplayUtils; +import com.android.dialer.app.DialtactsActivity; +import com.android.dialer.app.R; +import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall; +import com.android.dialer.app.contactinfo.ContactPhotoLoader; +import com.android.dialer.app.list.DialtactsPagerAdapter; +import com.android.dialer.common.LogUtil; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; +import com.android.dialer.notification.DialerNotificationManager; +import com.android.dialer.notification.NotificationChannelManager; +import com.android.dialer.notification.NotificationManagerUtils; +import com.android.dialer.phonenumbercache.ContactInfo; +import com.android.dialer.telecom.TelecomUtil; +import java.util.List; +import java.util.Map; + +/** Shows a notification in the status bar for visual voicemail. */ +final class VisualVoicemailNotifier { + /** Prefix used to generate a unique tag for each voicemail notification. */ + private static final String NOTIFICATION_TAG_PREFIX = "VisualVoicemail_"; + /** Common ID for all voicemail notifications. */ + private static final int NOTIFICATION_ID = 1; + /** Tag for the group summary notification. */ + private static final String GROUP_SUMMARY_NOTIFICATION_TAG = "GroupSummary_VisualVoicemail"; + /** + * Key used to associate all voicemail notifications and the summary as belonging to a single + * group. + */ + private static final String GROUP_KEY = "VisualVoicemailGroup"; + + public static void showNotifications( + @NonNull Context context, + @NonNull List newCalls, + @NonNull Map contactInfos, + @Nullable String callers) { + LogUtil.enterBlock("VisualVoicemailNotifier.showNotifications"); + PendingIntent deleteIntent = + CallLogNotificationsService.createMarkAllNewVoicemailsAsOldIntent(context); + String contentTitle = + context + .getResources() + .getQuantityString( + R.plurals.notification_voicemail_title, newCalls.size(), newCalls.size()); + Notification.Builder groupSummary = + createNotificationBuilder(context) + .setContentTitle(contentTitle) + .setContentText(callers) + .setDeleteIntent(deleteIntent) + .setGroupSummary(true) + .setContentIntent(newVoicemailIntent(context, null)); + + if (BuildCompat.isAtLeastO()) { + groupSummary.setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN); + PhoneAccountHandle handle = getAccountForCall(context, newCalls.get(0)); + groupSummary.setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle)); + } + + DialerNotificationManager.notify( + context, GROUP_SUMMARY_NOTIFICATION_TAG, NOTIFICATION_ID, groupSummary.build()); + + for (NewCall voicemail : newCalls) { + DialerNotificationManager.notify( + context, + getNotificationTagForVoicemail(voicemail), + NOTIFICATION_ID, + createNotificationForVoicemail(context, voicemail, contactInfos)); + } + } + + public static void cancelAllVoicemailNotifications(@NonNull Context context) { + LogUtil.enterBlock("VisualVoicemailNotifier.cancelAllVoicemailNotifications"); + NotificationManagerUtils.cancelAllInGroup(context, GROUP_KEY); + } + + public static void cancelSingleVoicemailNotification( + @NonNull Context context, @Nullable Uri voicemailUri) { + LogUtil.enterBlock("VisualVoicemailNotifier.cancelSingleVoicemailNotification"); + if (voicemailUri == null) { + LogUtil.e("VisualVoicemailNotifier.cancelSingleVoicemailNotification", "uri is null"); + return; + } + // This will also dismiss the group summary if there are no more voicemail notifications. + DialerNotificationManager.cancel( + context, getNotificationTagForUri(voicemailUri), NOTIFICATION_ID); + } + + private static String getNotificationTagForVoicemail(@NonNull NewCall voicemail) { + return getNotificationTagForUri(voicemail.voicemailUri); + } + + private static String getNotificationTagForUri(@NonNull Uri voicemailUri) { + return NOTIFICATION_TAG_PREFIX + voicemailUri; + } + + private static Notification.Builder createNotificationBuilder(@NonNull Context context) { + return new Notification.Builder(context) + .setSmallIcon(android.R.drawable.stat_notify_voicemail) + .setColor(context.getColor(R.color.dialer_theme_color)) + .setGroup(GROUP_KEY) + .setOnlyAlertOnce(true) + .setAutoCancel(true); + } + + private static Notification createNotificationForVoicemail( + @NonNull Context context, + @NonNull NewCall voicemail, + @NonNull Map contactInfos) { + PhoneAccountHandle handle = getAccountForCall(context, voicemail); + ContactInfo contactInfo = contactInfos.get(voicemail.number); + + Notification.Builder builder = + createNotificationBuilder(context) + .setContentTitle( + context + .getResources() + .getQuantityString(R.plurals.notification_voicemail_title, 1, 1)) + .setContentText( + ContactDisplayUtils.getTtsSpannedPhoneNumber( + context.getResources(), + R.string.notification_new_voicemail_ticker, + contactInfo.name)) + .setWhen(voicemail.dateMs) + .setSound(getVoicemailRingtoneUri(context, handle)) + .setDefaults(getNotificationDefaultFlags(context, handle)); + + if (voicemail.voicemailUri != null) { + builder.setDeleteIntent( + CallLogNotificationsService.createMarkSingleNewVoicemailAsOldIntent( + context, voicemail.voicemailUri)); + } + + if (BuildCompat.isAtLeastO()) { + builder.setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle)); + } + + ContactPhotoLoader loader = new ContactPhotoLoader(context, contactInfo); + Bitmap photoIcon = loader.loadPhotoIcon(); + if (photoIcon != null) { + builder.setLargeIcon(photoIcon); + } + if (!TextUtils.isEmpty(voicemail.transcription)) { + Logger.get(context) + .logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED_WITH_TRANSCRIPTION); + builder.setStyle(new Notification.BigTextStyle().bigText(voicemail.transcription)); + } + builder.setContentIntent(newVoicemailIntent(context, voicemail)); + Logger.get(context).logImpression(DialerImpression.Type.VVM_NOTIFICATION_CREATED); + return builder.build(); + } + + @Nullable + private static Uri getVoicemailRingtoneUri( + @NonNull Context context, @Nullable PhoneAccountHandle handle) { + if (VERSION.SDK_INT < VERSION_CODES.N) { + return null; + } + if (handle == null) { + LogUtil.i("VisualVoicemailNotifier.getVoicemailRingtoneUri", "null handle, getting fallback"); + handle = getFallbackAccount(context); + if (handle == null) { + LogUtil.i( + "VisualVoicemailNotifier.getVoicemailRingtoneUri", + "no fallback handle, using null (default) ringtone"); + return null; + } + } + return context.getSystemService(TelephonyManager.class).getVoicemailRingtoneUri(handle); + } + + private static int getNotificationDefaultFlags( + @NonNull Context context, @Nullable PhoneAccountHandle handle) { + if (VERSION.SDK_INT < VERSION_CODES.N) { + return Notification.DEFAULT_ALL; + } + if (handle == null) { + LogUtil.i( + "VisualVoicemailNotifier.getNotificationDefaultFlags", "null handle, getting fallback"); + handle = getFallbackAccount(context); + if (handle == null) { + LogUtil.i( + "VisualVoicemailNotifier.getNotificationDefaultFlags", + "no fallback handle, using default vibration"); + return Notification.DEFAULT_ALL; + } + } + if (context.getSystemService(TelephonyManager.class).isVoicemailVibrationEnabled(handle)) { + return Notification.DEFAULT_VIBRATE; + } + return 0; + } + + private static PendingIntent newVoicemailIntent( + @NonNull Context context, @Nullable NewCall voicemail) { + Intent intent = + DialtactsActivity.getShowTabIntent(context, DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL); + // TODO (b/35486204): scroll to this voicemail + if (voicemail != null) { + intent.setData(voicemail.voicemailUri); + } + intent.putExtra(DialtactsActivity.EXTRA_CLEAR_NEW_VOICEMAILS, true); + return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + } + + /** + * Gets a phone account for the given call entry. This could be null if SIM associated with the + * entry is no longer in the device or for other reasons (for example, modem reboot). + */ + @Nullable + public static PhoneAccountHandle getAccountForCall( + @NonNull Context context, @Nullable NewCall call) { + if (call == null || call.accountComponentName == null || call.accountId == null) { + return null; + } + return new PhoneAccountHandle( + ComponentName.unflattenFromString(call.accountComponentName), call.accountId); + } + + /** + * Gets any available phone account that can be used to get sound settings for voicemail. This is + * only called if the phone account for the voicemail entry can't be found. + */ + @Nullable + public static PhoneAccountHandle getFallbackAccount(@NonNull Context context) { + PhoneAccountHandle handle = + TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_TEL); + if (handle == null) { + List handles = TelecomUtil.getCallCapablePhoneAccounts(context); + if (!handles.isEmpty()) { + handle = handles.get(0); + } + } + return handle; + } + + private VisualVoicemailNotifier() {} +} diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java new file mode 100644 index 000000000..d6601be36 --- /dev/null +++ b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.app.calllog; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.WorkerThread; +import android.text.TextUtils; +import android.util.ArrayMap; +import com.android.dialer.app.R; +import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall; +import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; +import com.android.dialer.blocking.FilteredNumbersUtil; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutors; +import com.android.dialer.phonenumbercache.ContactInfo; +import com.android.dialer.telecom.TelecomUtil; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** Updates voicemail notifications in the background. */ +class VisualVoicemailUpdateTask implements Worker { + @Nullable + @Override + public Void doInBackground(@NonNull Input input) throws Throwable { + updateNotification(input.context, input.queryHelper, input.queryHandler); + return null; + } + + /** + * Updates the notification and notifies of the call with the given URI. + * + *

Clears the notification if there are no new voicemails, and notifies if the given URI + * corresponds to a new voicemail. + */ + @WorkerThread + private static void updateNotification( + Context context, + CallLogNotificationsQueryHelper queryHelper, + FilteredNumberAsyncQueryHandler queryHandler) { + Assert.isWorkerThread(); + + List newCalls = queryHelper.getNewVoicemails(); + if (newCalls == null) { + return; + } + newCalls = filterBlockedNumbers(context, queryHandler, newCalls); + if (newCalls.isEmpty()) { + return; + } + + // This represents a list of names to include in the notification. + String callers = null; + + // Maps each number into a name: if a number is in the map, it has already left a more + // recent voicemail. + Map contactInfos = new ArrayMap<>(); + for (NewCall newCall : newCalls) { + if (!contactInfos.containsKey(newCall.number)) { + ContactInfo contactInfo = + queryHelper.getContactInfo( + newCall.number, newCall.numberPresentation, newCall.countryIso); + contactInfos.put(newCall.number, contactInfo); + + // This is a new caller. Add it to the back of the list of callers. + if (TextUtils.isEmpty(callers)) { + callers = contactInfo.name; + } else { + callers = + context.getString( + R.string.notification_voicemail_callers_list, callers, contactInfo.name); + } + } + } + VisualVoicemailNotifier.showNotifications(context, newCalls, contactInfos, callers); + } + + @WorkerThread + private static List filterBlockedNumbers( + Context context, FilteredNumberAsyncQueryHandler queryHandler, List newCalls) { + Assert.isWorkerThread(); + if (FilteredNumbersUtil.hasRecentEmergencyCall(context)) { + LogUtil.i( + "VisualVoicemailUpdateTask.filterBlockedNumbers", + "not filtering due to recent emergency call"); + return newCalls; + } + + List result = new ArrayList<>(); + for (NewCall newCall : newCalls) { + if (queryHandler.getBlockedIdSynchronous(newCall.number, newCall.countryIso) != null) { + LogUtil.i( + "VisualVoicemailUpdateTask.filterBlockedNumbers", + "found voicemail from blocked number, deleting"); + if (newCall.voicemailUri != null) { + // Delete the voicemail. + CallLogAsyncTaskUtil.deleteVoicemailSynchronous(context, newCall.voicemailUri); + } + } else { + result.add(newCall); + } + } + return result; + } + + /** Updates the voicemail notifications displayed. */ + static void scheduleTask(@NonNull Context context, @NonNull Runnable callback) { + Assert.isNotNull(context); + Assert.isNotNull(callback); + if (!TelecomUtil.isDefaultDialer(context)) { + LogUtil.i("VisualVoicemailUpdateTask.scheduleTask", "not default dialer, not running"); + callback.run(); + return; + } + + Input input = + new Input( + context, + CallLogNotificationsQueryHelper.getInstance(context), + new FilteredNumberAsyncQueryHandler(context)); + DialerExecutors.createNonUiTaskBuilder(new VisualVoicemailUpdateTask()) + .onSuccess( + output -> { + LogUtil.i("VisualVoicemailUpdateTask.scheduleTask", "update successful"); + callback.run(); + }) + .onFailure( + throwable -> { + LogUtil.i("VisualVoicemailUpdateTask.scheduleTask", "update failed: " + throwable); + callback.run(); + }) + .build() + .executeParallel(input); + } + + static class Input { + @NonNull final Context context; + @NonNull final CallLogNotificationsQueryHelper queryHelper; + @NonNull final FilteredNumberAsyncQueryHandler queryHandler; + + Input( + Context context, + CallLogNotificationsQueryHelper queryHelper, + FilteredNumberAsyncQueryHandler queryHandler) { + this.context = context; + this.queryHelper = queryHelper; + this.queryHandler = queryHandler; + } + } +} diff --git a/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java b/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java index 777f4c79f..2fbebdd30 100644 --- a/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java +++ b/java/com/android/dialer/app/calllog/VoicemailQueryHandler.java @@ -15,7 +15,6 @@ */ package com.android.dialer.app.calllog; -import android.app.NotificationManager; import android.content.AsyncQueryHandler; import android.content.ContentResolver; import android.content.ContentValues; @@ -23,30 +22,49 @@ import android.content.Context; import android.net.Uri; import android.provider.CallLog.Calls; import android.support.annotation.MainThread; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.android.dialer.app.R; +import android.support.annotation.WorkerThread; import com.android.dialer.common.Assert; -import com.android.dialer.notification.GroupedNotificationUtil; +import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.ThreadUtil; /** Handles asynchronous queries to the call log for voicemail. */ public class VoicemailQueryHandler extends AsyncQueryHandler { - private static final String TAG = "VoicemailQueryHandler"; - /** The token for the query to mark all new voicemails as old. */ private static final int UPDATE_MARK_VOICEMAILS_AS_OLD_TOKEN = 50; - private Context mContext; - @MainThread - public VoicemailQueryHandler(Context context, ContentResolver contentResolver) { + private VoicemailQueryHandler(ContentResolver contentResolver) { super(contentResolver); Assert.isMainThread(); - mContext = context; + } + + @WorkerThread + public static void markAllNewVoicemailsAsRead(final @NonNull Context context) { + ThreadUtil.postOnUiThread( + () -> { + new VoicemailQueryHandler(context.getContentResolver()).markNewVoicemailsAsOld(null); + }); + } + + @WorkerThread + public static void markSingleNewVoicemailAsRead( + final @NonNull Context context, final Uri voicemailUri) { + if (voicemailUri == null) { + LogUtil.e("VoicemailQueryHandler.markSingleNewVoicemailAsRead", "voicemail URI is null"); + return; + } + ThreadUtil.postOnUiThread( + () -> { + new VoicemailQueryHandler(context.getContentResolver()) + .markNewVoicemailsAsOld(voicemailUri); + }); } /** Updates all new voicemails to mark them as old. */ - public void markNewVoicemailsAsOld(@Nullable Uri voicemailUri) { + private void markNewVoicemailsAsOld(@Nullable Uri voicemailUri) { // Mark all "new" voicemails as not new anymore. StringBuilder where = new StringBuilder(); where.append(Calls.NEW); @@ -70,11 +88,5 @@ public class VoicemailQueryHandler extends AsyncQueryHandler { voicemailUri == null ? new String[] {Integer.toString(Calls.VOICEMAIL_TYPE)} : new String[] {Integer.toString(Calls.VOICEMAIL_TYPE), voicemailUri.toString()}); - - GroupedNotificationUtil.removeNotification( - mContext.getSystemService(NotificationManager.class), - voicemailUri != null ? voicemailUri.toString() : null, - R.id.notification_visual_voicemail, - DefaultVoicemailNotifier.VISUAL_VOICEMAIL_NOTIFICATION_TAG); } } diff --git a/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java b/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java index 7645a333e..15de14318 100644 --- a/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java +++ b/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java @@ -17,10 +17,16 @@ package com.android.dialer.app.calllog.calllogcache; import android.content.Context; +import android.support.annotation.Nullable; import android.telecom.PhoneAccountHandle; +import android.text.TextUtils; +import android.util.ArrayMap; import com.android.dialer.app.calllog.CallLogAdapter; -import com.android.dialer.compat.CompatUtils; +import com.android.dialer.calllogutils.PhoneAccountUtils; +import com.android.dialer.telecom.TelecomUtil; import com.android.dialer.util.CallUtil; +import java.util.Map; +import javax.annotation.concurrent.ThreadSafe; /** * This is the base class for the CallLogCaches. @@ -31,7 +37,8 @@ import com.android.dialer.util.CallUtil; * *

This is designed with the specific use case of the {@link CallLogAdapter} in mind. */ -public abstract class CallLogCache { +@ThreadSafe +public class CallLogCache { // TODO: Dialer should be fixed so as not to check isVoicemail() so often but at the time of // this writing, that was a much larger undertaking than creating this cache. @@ -39,20 +46,18 @@ public abstract class CallLogCache { private boolean mHasCheckedForVideoAvailability; private int mVideoAvailability; + private final Map mPhoneAccountLabelCache = new ArrayMap<>(); + private final Map mPhoneAccountColorCache = new ArrayMap<>(); + private final Map mPhoneAccountCallWithNoteCache = new ArrayMap<>(); public CallLogCache(Context context) { mContext = context; } - /** Return the most compatible version of the TelecomCallLogCache. */ - public static CallLogCache getCallLogCache(Context context) { - if (CompatUtils.isClassAvailable("android.telecom.PhoneAccountHandle")) { - return new CallLogCacheLollipopMr1(context); - } - return new CallLogCacheLollipop(context); - } - - public void reset() { + public synchronized void reset() { + mPhoneAccountLabelCache.clear(); + mPhoneAccountColorCache.clear(); + mPhoneAccountCallWithNoteCache.clear(); mHasCheckedForVideoAvailability = false; mVideoAvailability = 0; } @@ -61,19 +66,12 @@ public abstract class CallLogCache { * Returns true if the given number is the number of the configured voicemail. To be able to * mock-out this, it is not a static method. */ - public abstract boolean isVoicemailNumber(PhoneAccountHandle accountHandle, CharSequence number); - - /** - * Returns {@code true} when the current sim supports video calls, regardless of the value in a - * contact's {@link android.provider.ContactsContract.CommonDataKinds.Phone#CARRIER_PRESENCE} - * column. - */ - public boolean isVideoEnabled() { - if (!mHasCheckedForVideoAvailability) { - mVideoAvailability = CallUtil.getVideoCallingAvailability(mContext); - mHasCheckedForVideoAvailability = true; + public synchronized boolean isVoicemailNumber( + PhoneAccountHandle accountHandle, @Nullable CharSequence number) { + if (TextUtils.isEmpty(number)) { + return false; } - return (mVideoAvailability & CallUtil.VIDEO_CALLING_ENABLED) != 0; + return TelecomUtil.isVoicemailNumber(mContext, accountHandle, number.toString()); } /** @@ -89,10 +87,26 @@ public abstract class CallLogCache { } /** Extract account label from PhoneAccount object. */ - public abstract String getAccountLabel(PhoneAccountHandle accountHandle); + public synchronized String getAccountLabel(PhoneAccountHandle accountHandle) { + if (mPhoneAccountLabelCache.containsKey(accountHandle)) { + return mPhoneAccountLabelCache.get(accountHandle); + } else { + String label = PhoneAccountUtils.getAccountLabel(mContext, accountHandle); + mPhoneAccountLabelCache.put(accountHandle, label); + return label; + } + } /** Extract account color from PhoneAccount object. */ - public abstract int getAccountColor(PhoneAccountHandle accountHandle); + public synchronized int getAccountColor(PhoneAccountHandle accountHandle) { + if (mPhoneAccountColorCache.containsKey(accountHandle)) { + return mPhoneAccountColorCache.get(accountHandle); + } else { + Integer color = PhoneAccountUtils.getAccountColor(mContext, accountHandle); + mPhoneAccountColorCache.put(accountHandle, color); + return color; + } + } /** * Determines if the PhoneAccount supports specifying a call subject (i.e. calling with a note) @@ -101,5 +115,14 @@ public abstract class CallLogCache { * @param accountHandle The PhoneAccount handle. * @return {@code true} if calling with a note is supported, {@code false} otherwise. */ - public abstract boolean doesAccountSupportCallSubject(PhoneAccountHandle accountHandle); + public synchronized boolean doesAccountSupportCallSubject(PhoneAccountHandle accountHandle) { + if (mPhoneAccountCallWithNoteCache.containsKey(accountHandle)) { + return mPhoneAccountCallWithNoteCache.get(accountHandle); + } else { + Boolean supportsCallWithNote = + PhoneAccountUtils.getAccountSupportsCallSubject(mContext, accountHandle); + mPhoneAccountCallWithNoteCache.put(accountHandle, supportsCallWithNote); + return supportsCallWithNote; + } + } } diff --git a/java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipop.java b/java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipop.java deleted file mode 100644 index 78aaa4193..000000000 --- a/java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipop.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.dialer.app.calllog.calllogcache; - -import android.content.Context; -import android.telecom.PhoneAccount; -import android.telecom.PhoneAccountHandle; -import android.telephony.PhoneNumberUtils; -import android.text.TextUtils; - -/** - * This is a compatibility class for the CallLogCache for versions of dialer before Lollipop Mr1 - * (the introduction of phone accounts). - * - *

This class should not be initialized directly and instead be acquired from {@link - * CallLogCache#getCallLogCache}. - */ -class CallLogCacheLollipop extends CallLogCache { - - private String mVoicemailNumber; - - /* package */ CallLogCacheLollipop(Context context) { - super(context); - } - - @Override - public boolean isVoicemailNumber(PhoneAccountHandle accountHandle, CharSequence number) { - if (TextUtils.isEmpty(number)) { - return false; - } - - String numberString = number.toString(); - - if (!TextUtils.isEmpty(mVoicemailNumber)) { - return PhoneNumberUtils.compare(numberString, mVoicemailNumber); - } - - if (PhoneNumberUtils.isVoiceMailNumber(numberString)) { - mVoicemailNumber = numberString; - return true; - } - - return false; - } - - @Override - public String getAccountLabel(PhoneAccountHandle accountHandle) { - return null; - } - - @Override - public int getAccountColor(PhoneAccountHandle accountHandle) { - return PhoneAccount.NO_HIGHLIGHT_COLOR; - } - - @Override - public boolean doesAccountSupportCallSubject(PhoneAccountHandle accountHandle) { - return false; - } -} diff --git a/java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipopMr1.java b/java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipopMr1.java deleted file mode 100644 index 039998780..000000000 --- a/java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipopMr1.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.dialer.app.calllog.calllogcache; - -import android.content.Context; -import android.support.annotation.VisibleForTesting; -import android.telecom.PhoneAccountHandle; -import android.text.TextUtils; -import android.util.ArrayMap; -import android.util.Pair; -import com.android.dialer.calllogutils.PhoneAccountUtils; -import com.android.dialer.phonenumberutil.PhoneNumberHelper; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * This is the CallLogCache for versions of dialer Lollipop Mr1 and above with support for multi-SIM - * devices. - * - *

This class should not be initialized directly and instead be acquired from {@link - * CallLogCache#getCallLogCache}. - */ -class CallLogCacheLollipopMr1 extends CallLogCache { - - /* - * Maps from a phone-account/number pair to a boolean because multiple numbers could return true - * for the voicemail number if those numbers are not pre-normalized. Access must be synchronzied - * as it's used in the background thread in CallLogAdapter. {@see CallLogAdapter#loadData} - */ - @VisibleForTesting - final Map, Boolean> mVoicemailQueryCache = - new ConcurrentHashMap<>(); - - private final Map mPhoneAccountLabelCache = new ArrayMap<>(); - private final Map mPhoneAccountColorCache = new ArrayMap<>(); - private final Map mPhoneAccountCallWithNoteCache = new ArrayMap<>(); - - /* package */ CallLogCacheLollipopMr1(Context context) { - super(context); - } - - @Override - public void reset() { - mVoicemailQueryCache.clear(); - mPhoneAccountLabelCache.clear(); - mPhoneAccountColorCache.clear(); - mPhoneAccountCallWithNoteCache.clear(); - - super.reset(); - } - - @Override - public boolean isVoicemailNumber(PhoneAccountHandle accountHandle, CharSequence number) { - if (TextUtils.isEmpty(number)) { - return false; - } - - Pair key = new Pair<>(accountHandle, number); - Boolean value = mVoicemailQueryCache.get(key); - if (value != null) { - return value; - } - boolean isVoicemail = - PhoneNumberHelper.isVoicemailNumber(mContext, accountHandle, number.toString()); - mVoicemailQueryCache.put(key, isVoicemail); - return isVoicemail; - } - - @Override - public String getAccountLabel(PhoneAccountHandle accountHandle) { - if (mPhoneAccountLabelCache.containsKey(accountHandle)) { - return mPhoneAccountLabelCache.get(accountHandle); - } else { - String label = PhoneAccountUtils.getAccountLabel(mContext, accountHandle); - mPhoneAccountLabelCache.put(accountHandle, label); - return label; - } - } - - @Override - public int getAccountColor(PhoneAccountHandle accountHandle) { - if (mPhoneAccountColorCache.containsKey(accountHandle)) { - return mPhoneAccountColorCache.get(accountHandle); - } else { - Integer color = PhoneAccountUtils.getAccountColor(mContext, accountHandle); - mPhoneAccountColorCache.put(accountHandle, color); - return color; - } - } - - @Override - public boolean doesAccountSupportCallSubject(PhoneAccountHandle accountHandle) { - if (mPhoneAccountCallWithNoteCache.containsKey(accountHandle)) { - return mPhoneAccountCallWithNoteCache.get(accountHandle); - } else { - Boolean supportsCallWithNote = - PhoneAccountUtils.getAccountSupportsCallSubject(mContext, accountHandle); - mPhoneAccountCallWithNoteCache.put(accountHandle, supportsCallWithNote); - return supportsCallWithNote; - } - } -} diff --git a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java index e561b5607..155a6a2eb 100644 --- a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java +++ b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java @@ -24,6 +24,7 @@ import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import com.android.dialer.common.LogUtil; import com.android.dialer.logging.ContactSource.Type; +import com.android.dialer.oem.CequintCallerIdManager; import com.android.dialer.phonenumbercache.ContactInfo; import com.android.dialer.phonenumbercache.ContactInfoHelper; import com.android.dialer.util.ExpirableCache; @@ -55,6 +56,7 @@ public class ContactInfoCache { private final OnContactInfoChangedListener mOnContactInfoChangedListener; private final BlockingQueue mUpdateRequests; private final Handler mHandler; + private CequintCallerIdManager mCequintCallerIdManager; private QueryThread mContactInfoQueryThread; private volatile boolean mRequestProcessingDisabled = false; @@ -95,6 +97,10 @@ public class ContactInfoCache { mHandler = new InnerHandler(new WeakReference<>(this)); } + public void setCequintCallerIdManager(CequintCallerIdManager cequintCallerIdManager) { + mCequintCallerIdManager = cequintCallerIdManager; + } + public ContactInfo getValue( String number, String countryIso, @@ -156,11 +162,11 @@ public class ContactInfoCache { ContactInfo info; if (request.isLocalRequest()) { info = mContactInfoHelper.lookupNumber(request.number, request.countryIso); - if (!info.contactExists) { - // TODO: Maybe skip look up if it's already available in cached number lookup + if (info != null && !info.contactExists) { + // TODO(wangqi): Maybe skip look up if it's already available in cached number lookup // service. long start = SystemClock.elapsedRealtime(); - mContactInfoHelper.updateFromCequintCallerId(info, request.number); + mContactInfoHelper.updateFromCequintCallerId(mCequintCallerIdManager, info, request.number); long time = SystemClock.elapsedRealtime() - start; LogUtil.d( "ContactInfoCache.queryContactInfo", "Cequint Caller Id look up takes %d ms", time); diff --git a/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java b/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java index 4c8e32a41..537acd060 100644 --- a/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java +++ b/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java @@ -25,10 +25,10 @@ import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; -import com.android.contacts.common.lettertiles.LetterTileDrawable; import com.android.dialer.app.R; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; +import com.android.dialer.lettertile.LetterTileDrawable; import com.android.dialer.location.GeoUtil; import com.android.dialer.phonenumbercache.ContactInfo; import com.android.dialer.phonenumbercache.ContactInfoHelper; diff --git a/java/com/android/dialer/app/dialpad/DialpadFragment.java b/java/com/android/dialer/app/dialpad/DialpadFragment.java deleted file mode 100644 index e9d57b399..000000000 --- a/java/com/android/dialer/app/dialpad/DialpadFragment.java +++ /dev/null @@ -1,1687 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.app.dialpad; - -import android.Manifest.permission; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.Fragment; -import android.content.BroadcastReceiver; -import android.content.ContentResolver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.media.AudioManager; -import android.media.ToneGenerator; -import android.net.Uri; -import android.os.Bundle; -import android.os.Trace; -import android.provider.Contacts.People; -import android.provider.Contacts.Phones; -import android.provider.Contacts.PhonesColumns; -import android.provider.Settings; -import android.support.annotation.VisibleForTesting; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.content.ContextCompat; -import android.telecom.PhoneAccount; -import android.telecom.PhoneAccountHandle; -import android.telephony.PhoneNumberFormattingTextWatcher; -import android.telephony.PhoneNumberUtils; -import android.telephony.TelephonyManager; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.util.AttributeSet; -import android.view.HapticFeedbackConstants; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.PopupMenu; -import android.widget.RelativeLayout; -import android.widget.TextView; -import com.android.contacts.common.dialog.CallSubjectDialog; -import com.android.contacts.common.util.StopWatch; -import com.android.contacts.common.widget.FloatingActionButtonController; -import com.android.dialer.animation.AnimUtils; -import com.android.dialer.app.DialtactsActivity; -import com.android.dialer.app.R; -import com.android.dialer.app.SpecialCharSequenceMgr; -import com.android.dialer.app.calllog.CallLogAsync; -import com.android.dialer.callintent.CallInitiationType; -import com.android.dialer.callintent.CallIntentBuilder; -import com.android.dialer.calllogutils.PhoneAccountUtils; -import com.android.dialer.common.LogUtil; -import com.android.dialer.dialpadview.DialpadKeyButton; -import com.android.dialer.dialpadview.DialpadView; -import com.android.dialer.location.GeoUtil; -import com.android.dialer.proguard.UsedByReflection; -import com.android.dialer.telecom.TelecomUtil; -import com.android.dialer.util.CallUtil; -import com.android.dialer.util.DialerUtils; -import com.android.dialer.util.PermissionsUtil; -import java.util.HashSet; -import java.util.List; - -/** Fragment that displays a twelve-key phone dialpad. */ -public class DialpadFragment extends Fragment - implements View.OnClickListener, - View.OnLongClickListener, - View.OnKeyListener, - AdapterView.OnItemClickListener, - TextWatcher, - PopupMenu.OnMenuItemClickListener, - DialpadKeyButton.OnPressedListener { - - private static final String TAG = "DialpadFragment"; - private static final boolean DEBUG = DialtactsActivity.DEBUG; - private static final String EMPTY_NUMBER = ""; - private static final char PAUSE = ','; - private static final char WAIT = ';'; - /** The length of DTMF tones in milliseconds */ - private static final int TONE_LENGTH_MS = 150; - - private static final int TONE_LENGTH_INFINITE = -1; - /** 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_DTMF; - /** Identifier for the "Add Call" intent extra. */ - private static final String ADD_CALL_MODE_KEY = "add_call_mode"; - /** - * 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: Using an intent extra to tell the phone to send this flash is a temporary measure. To - * be replaced with an Telephony/TelecomManager call in the future. TODO: Keep in sync with the - * string defined in OutgoingCallBroadcaster.java in Phone app until this is replaced with the - * Telephony/Telecom API. - */ - private static final String EXTRA_SEND_EMPTY_FLASH = "com.android.phone.extra.SEND_EMPTY_FLASH"; - - private static final String PREF_DIGITS_FILLED_BY_INTENT = "pref_digits_filled_by_intent"; - private final Object mToneGeneratorLock = new Object(); - /** Set of dialpad keys that are currently being pressed */ - private final HashSet mPressedDialpadKeys = new HashSet(12); - // Last number dialed, retrieved asynchronously from the call DB - // in onCreate. This number is displayed when the user hits the - // send key and cleared in onPause. - private final CallLogAsync mCallLog = new CallLogAsync(); - private OnDialpadQueryChangedListener mDialpadQueryListener; - private DialpadView mDialpadView; - private EditText mDigits; - private int mDialpadSlideInDuration; - /** Remembers if we need to clear digits field when the screen is completely gone. */ - private boolean mClearDigitsOnStop; - - private View mOverflowMenuButton; - private PopupMenu mOverflowPopupMenu; - private View mDelete; - private ToneGenerator mToneGenerator; - private View mSpacer; - private FloatingActionButtonController mFloatingActionButtonController; - private ListView mDialpadChooser; - private DialpadChooserAdapter mDialpadChooserAdapter; - /** Regular expression prohibiting manual phone call. Can be empty, which means "no rule". */ - private String mProhibitedPhoneNumberRegexp; - - private PseudoEmergencyAnimator mPseudoEmergencyAnimator; - private String mLastNumberDialed = EMPTY_NUMBER; - - // determines if we want to playback local DTMF tones. - private boolean mDTMFToneEnabled; - private String mCurrentCountryIso; - private CallStateReceiver mCallStateReceiver; - private boolean mWasEmptyBeforeTextChange; - /** - * This field is set to true while processing an incoming DIAL intent, in order to make sure that - * SpecialCharSequenceMgr actions can be triggered by user input but *not* by a tel: URI passed by - * some other app. It will be set to false when all digits are cleared. - */ - private boolean mDigitsFilledByIntent; - - private boolean mStartedFromNewIntent = false; - private boolean mFirstLaunch = false; - private boolean mAnimate = false; - - /** - * Determines whether an add call operation is requested. - * - * @param intent The intent. - * @return {@literal true} if add call operation was requested. {@literal false} otherwise. - */ - public static boolean isAddCallMode(Intent intent) { - if (intent == null) { - return false; - } - final String action = intent.getAction(); - if (Intent.ACTION_DIAL.equals(action) || Intent.ACTION_VIEW.equals(action)) { - // see if we are "adding a call" from the InCallScreen; false by default. - return intent.getBooleanExtra(ADD_CALL_MODE_KEY, false); - } else { - return false; - } - } - - /** - * Format the provided string of digits into one that represents a properly formatted phone - * number. - * - * @param dialString String of characters to format - * @param normalizedNumber the E164 format number whose country code is used if the given - * phoneNumber doesn't have the country code. - * @param countryIso The country code representing the format to use if the provided normalized - * number is null or invalid. - * @return the provided string of digits as a formatted phone number, retaining any post-dial - * portion of the string. - */ - @VisibleForTesting - static String getFormattedDigits(String dialString, String normalizedNumber, String countryIso) { - String number = PhoneNumberUtils.extractNetworkPortion(dialString); - // Also retrieve the post dial portion of the provided data, so that the entire dial - // string can be reconstituted later. - final String postDial = PhoneNumberUtils.extractPostDialPortion(dialString); - - if (TextUtils.isEmpty(number)) { - return postDial; - } - - number = PhoneNumberUtils.formatNumber(number, normalizedNumber, countryIso); - - if (TextUtils.isEmpty(postDial)) { - return number; - } - - return number.concat(postDial); - } - - /** - * Returns true of the newDigit parameter can be added at the current selection point, otherwise - * returns false. Only prevents input of WAIT and PAUSE digits at an unsupported position. Fails - * early if start == -1 or start is larger than end. - */ - @VisibleForTesting - /* package */ static boolean canAddDigit(CharSequence digits, int start, int end, char newDigit) { - if (newDigit != WAIT && newDigit != PAUSE) { - throw new IllegalArgumentException( - "Should not be called for anything other than PAUSE & WAIT"); - } - - // False if no selection, or selection is reversed (end < start) - if (start == -1 || end < start) { - return false; - } - - // unsupported selection-out-of-bounds state - if (start > digits.length() || end > digits.length()) { - return false; - } - - // Special digit cannot be the first digit - if (start == 0) { - return false; - } - - if (newDigit == WAIT) { - // preceding char is ';' (WAIT) - if (digits.charAt(start - 1) == WAIT) { - return false; - } - - // next char is ';' (WAIT) - if ((digits.length() > end) && (digits.charAt(end) == WAIT)) { - return false; - } - } - - return true; - } - - private TelephonyManager getTelephonyManager() { - return (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE); - } - - @Override - public Context getContext() { - return getActivity(); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - mWasEmptyBeforeTextChange = TextUtils.isEmpty(s); - } - - @Override - public void onTextChanged(CharSequence input, int start, int before, int changeCount) { - if (mWasEmptyBeforeTextChange != TextUtils.isEmpty(input)) { - final Activity activity = getActivity(); - if (activity != null) { - activity.invalidateOptionsMenu(); - updateMenuOverflowButton(mWasEmptyBeforeTextChange); - } - } - - // DTMF Tones do not need to be played here any longer - - // the DTMF dialer handles that functionality now. - } - - @Override - public void afterTextChanged(Editable input) { - // When DTMF dialpad buttons are being pressed, we delay SpecialCharSequenceMgr sequence, - // since some of SpecialCharSequenceMgr's behavior is too abrupt for the "touch-down" - // behavior. - if (!mDigitsFilledByIntent - && SpecialCharSequenceMgr.handleChars(getActivity(), input.toString(), mDigits)) { - // A special sequence was entered, clear the digits - mDigits.getText().clear(); - } - - if (isDigitsEmpty()) { - mDigitsFilledByIntent = false; - mDigits.setCursorVisible(false); - } - - if (mDialpadQueryListener != null) { - mDialpadQueryListener.onDialpadQueryChanged(mDigits.getText().toString()); - } - - updateDeleteButtonEnabledState(); - } - - @Override - public void onCreate(Bundle state) { - Trace.beginSection(TAG + " onCreate"); - super.onCreate(state); - - mFirstLaunch = state == null; - - mCurrentCountryIso = GeoUtil.getCurrentCountryIso(getActivity()); - - mProhibitedPhoneNumberRegexp = - getResources().getString(R.string.config_prohibited_phone_number_regexp); - - if (state != null) { - mDigitsFilledByIntent = state.getBoolean(PREF_DIGITS_FILLED_BY_INTENT); - } - - mDialpadSlideInDuration = getResources().getInteger(R.integer.dialpad_slide_in_duration); - - if (mCallStateReceiver == null) { - IntentFilter callStateIntentFilter = - new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED); - mCallStateReceiver = new CallStateReceiver(); - getActivity().registerReceiver(mCallStateReceiver, callStateIntentFilter); - } - Trace.endSection(); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { - Trace.beginSection(TAG + " onCreateView"); - Trace.beginSection(TAG + " inflate view"); - final View fragmentView = inflater.inflate(R.layout.dialpad_fragment, container, false); - Trace.endSection(); - Trace.beginSection(TAG + " buildLayer"); - fragmentView.buildLayer(); - Trace.endSection(); - - Trace.beginSection(TAG + " setup views"); - - mDialpadView = (DialpadView) fragmentView.findViewById(R.id.dialpad_view); - mDialpadView.setCanDigitsBeEdited(true); - mDigits = mDialpadView.getDigits(); - mDigits.setKeyListener(UnicodeDialerKeyListener.INSTANCE); - mDigits.setOnClickListener(this); - mDigits.setOnKeyListener(this); - mDigits.setOnLongClickListener(this); - mDigits.addTextChangedListener(this); - mDigits.setElegantTextHeight(false); - - PhoneNumberFormattingTextWatcher watcher = - new PhoneNumberFormattingTextWatcher(GeoUtil.getCurrentCountryIso(getActivity())); - mDigits.addTextChangedListener(watcher); - - // Check for the presence of the keypad - View oneButton = fragmentView.findViewById(R.id.one); - if (oneButton != null) { - configureKeypadListeners(fragmentView); - } - - mDelete = mDialpadView.getDeleteButton(); - - if (mDelete != null) { - mDelete.setOnClickListener(this); - mDelete.setOnLongClickListener(this); - } - - mSpacer = fragmentView.findViewById(R.id.spacer); - mSpacer.setOnTouchListener( - new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - if (isDigitsEmpty()) { - if (getActivity() != null) { - return ((HostInterface) getActivity()).onDialpadSpacerTouchWithEmptyQuery(); - } - return true; - } - return false; - } - }); - - mDigits.setCursorVisible(false); - - // Set up the "dialpad chooser" UI; see showDialpadChooser(). - mDialpadChooser = (ListView) fragmentView.findViewById(R.id.dialpadChooser); - mDialpadChooser.setOnItemClickListener(this); - - FloatingActionButton floatingActionButton = - (FloatingActionButton) fragmentView.findViewById(R.id.dialpad_floating_action_button); - floatingActionButton.setOnClickListener(this); - mFloatingActionButtonController = - new FloatingActionButtonController(getActivity(), floatingActionButton); - Trace.endSection(); - Trace.endSection(); - return fragmentView; - } - - private boolean isLayoutReady() { - return mDigits != null; - } - - @VisibleForTesting - public EditText getDigitsWidget() { - return mDigits; - } - - /** @return true when {@link #mDigits} is actually filled by the Intent. */ - private boolean fillDigitsIfNecessary(Intent intent) { - // Only fills digits from an intent if it is a new intent. - // Otherwise falls back to the previously used number. - if (!mFirstLaunch && !mStartedFromNewIntent) { - return false; - } - - final String action = intent.getAction(); - if (Intent.ACTION_DIAL.equals(action) || Intent.ACTION_VIEW.equals(action)) { - Uri uri = intent.getData(); - if (uri != null) { - if (PhoneAccount.SCHEME_TEL.equals(uri.getScheme())) { - // Put the requested number into the input area - String data = uri.getSchemeSpecificPart(); - // Remember it is filled via Intent. - mDigitsFilledByIntent = true; - final String converted = - PhoneNumberUtils.convertKeypadLettersToDigits( - PhoneNumberUtils.replaceUnicodeDigits(data)); - setFormattedDigits(converted, null); - return true; - } else { - if (!PermissionsUtil.hasContactsReadPermissions(getActivity())) { - return false; - } - String type = intent.getType(); - if (People.CONTENT_ITEM_TYPE.equals(type) || Phones.CONTENT_ITEM_TYPE.equals(type)) { - // Query the phone number - Cursor c = - getActivity() - .getContentResolver() - .query( - intent.getData(), - new String[] {PhonesColumns.NUMBER, PhonesColumns.NUMBER_KEY}, - null, - null, - null); - if (c != null) { - try { - if (c.moveToFirst()) { - // Remember it is filled via Intent. - mDigitsFilledByIntent = true; - // Put the number into the input area - setFormattedDigits(c.getString(0), c.getString(1)); - return true; - } - } finally { - c.close(); - } - } - } - } - } - } - return false; - } - - /** - * Checks the given Intent and changes dialpad's UI state. For example, if the Intent requires the - * screen to enter "Add Call" mode, this method will show correct UI for the mode. - */ - private void configureScreenFromIntent(Activity parent) { - // If we were not invoked with a DIAL intent, - if (!(parent instanceof DialtactsActivity)) { - setStartedFromNewIntent(false); - return; - } - // See if we were invoked with a DIAL intent. If we were, fill in the appropriate - // digits in the dialer field. - Intent intent = parent.getIntent(); - - if (!isLayoutReady()) { - // This happens typically when parent's Activity#onNewIntent() is called while - // Fragment#onCreateView() isn't called yet, and thus we cannot configure Views at - // this point. onViewCreate() should call this method after preparing layouts, so - // just ignore this call now. - LogUtil.i( - "DialpadFragment.configureScreenFromIntent", - "Screen configuration is requested before onCreateView() is called. Ignored"); - return; - } - - boolean needToShowDialpadChooser = false; - - // Be sure *not* to show the dialpad chooser if this is an - // explicit "Add call" action, though. - final boolean isAddCallMode = isAddCallMode(intent); - if (!isAddCallMode) { - - // Don't show the chooser when called via onNewIntent() and phone number is present. - // i.e. User clicks a telephone link from gmail for example. - // In this case, we want to show the dialpad with the phone number. - final boolean digitsFilled = fillDigitsIfNecessary(intent); - if (!(mStartedFromNewIntent && digitsFilled)) { - - final String action = intent.getAction(); - if (Intent.ACTION_DIAL.equals(action) - || Intent.ACTION_VIEW.equals(action) - || Intent.ACTION_MAIN.equals(action)) { - // If there's already an active call, bring up an intermediate UI to - // make the user confirm what they really want to do. - if (isPhoneInUse()) { - needToShowDialpadChooser = true; - } - } - } - } - showDialpadChooser(needToShowDialpadChooser); - setStartedFromNewIntent(false); - } - - public void setStartedFromNewIntent(boolean value) { - mStartedFromNewIntent = value; - } - - public void clearCallRateInformation() { - setCallRateInformation(null, null); - } - - public void setCallRateInformation(String countryName, String displayRate) { - mDialpadView.setCallRateInformation(countryName, displayRate); - } - - /** Sets formatted digits to digits field. */ - private void setFormattedDigits(String data, String normalizedNumber) { - final String formatted = getFormattedDigits(data, normalizedNumber, mCurrentCountryIso); - if (!TextUtils.isEmpty(formatted)) { - Editable digits = mDigits.getText(); - digits.replace(0, digits.length(), formatted); - // for some reason this isn't getting called in the digits.replace call above.. - // but in any case, this will make sure the background drawable looks right - afterTextChanged(digits); - } - } - - private void configureKeypadListeners(View fragmentView) { - final int[] buttonIds = - new int[] { - R.id.one, - R.id.two, - R.id.three, - R.id.four, - R.id.five, - R.id.six, - R.id.seven, - R.id.eight, - R.id.nine, - R.id.star, - R.id.zero, - R.id.pound - }; - - DialpadKeyButton dialpadKey; - - for (int i = 0; i < buttonIds.length; i++) { - dialpadKey = (DialpadKeyButton) fragmentView.findViewById(buttonIds[i]); - dialpadKey.setOnPressedListener(this); - } - - // Long-pressing one button will initiate Voicemail. - final DialpadKeyButton one = (DialpadKeyButton) fragmentView.findViewById(R.id.one); - one.setOnLongClickListener(this); - - // Long-pressing zero button will enter '+' instead. - final DialpadKeyButton zero = (DialpadKeyButton) fragmentView.findViewById(R.id.zero); - zero.setOnLongClickListener(this); - } - - @Override - public void onStart() { - LogUtil.d("DialpadFragment.onStart", "first launch: %b", mFirstLaunch); - Trace.beginSection(TAG + " onStart"); - super.onStart(); - // 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. - final long start = System.currentTimeMillis(); - synchronized (mToneGeneratorLock) { - if (mToneGenerator == null) { - try { - mToneGenerator = new ToneGenerator(DIAL_TONE_STREAM_TYPE, TONE_RELATIVE_VOLUME); - } catch (RuntimeException e) { - LogUtil.e( - "DialpadFragment.onStart", - "Exception caught while creating local tone generator: " + e); - mToneGenerator = null; - } - } - } - final long total = System.currentTimeMillis() - start; - if (total > 50) { - LogUtil.i("DialpadFragment.onStart", "Time for ToneGenerator creation: " + total); - } - Trace.endSection(); - } - - @Override - public void onResume() { - LogUtil.d("DialpadFragment.onResume", ""); - Trace.beginSection(TAG + " onResume"); - super.onResume(); - - final DialtactsActivity activity = (DialtactsActivity) getActivity(); - mDialpadQueryListener = activity; - - final StopWatch stopWatch = StopWatch.start("Dialpad.onResume"); - - // Query the last dialed number. Do it first because hitting - // the DB is 'slow'. This call is asynchronous. - queryLastOutgoingCall(); - - stopWatch.lap("qloc"); - - final ContentResolver contentResolver = activity.getContentResolver(); - - // retrieve the DTMF tone play back setting. - mDTMFToneEnabled = - Settings.System.getInt(contentResolver, Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1; - - stopWatch.lap("dtwd"); - - stopWatch.lap("hptc"); - - mPressedDialpadKeys.clear(); - - configureScreenFromIntent(getActivity()); - - stopWatch.lap("fdin"); - - if (!isPhoneInUse()) { - // A sanity-check: the "dialpad chooser" UI should not be visible if the phone is idle. - showDialpadChooser(false); - } - - stopWatch.lap("hnt"); - - updateDeleteButtonEnabledState(); - - stopWatch.lap("bes"); - - stopWatch.stopAndLog(TAG, 50); - - // Populate the overflow menu in onResume instead of onCreate, so that if the SMS activity - // is disabled while Dialer is paused, the "Send a text message" option can be correctly - // removed when resumed. - mOverflowMenuButton = mDialpadView.getOverflowMenuButton(); - mOverflowPopupMenu = buildOptionsMenu(mOverflowMenuButton); - mOverflowMenuButton.setOnTouchListener(mOverflowPopupMenu.getDragToOpenListener()); - mOverflowMenuButton.setOnClickListener(this); - mOverflowMenuButton.setVisibility(isDigitsEmpty() ? View.INVISIBLE : View.VISIBLE); - - if (mFirstLaunch) { - // The onHiddenChanged callback does not get called the first time the fragment is - // attached, so call it ourselves here. - onHiddenChanged(false); - } - - mFirstLaunch = false; - Trace.endSection(); - } - - @Override - public void onPause() { - super.onPause(); - - // Make sure we don't leave this activity with a tone still playing. - stopTone(); - mPressedDialpadKeys.clear(); - - // TODO: I wonder if we should not check if the AsyncTask that - // lookup the last dialed number has completed. - mLastNumberDialed = EMPTY_NUMBER; // Since we are going to query again, free stale number. - - SpecialCharSequenceMgr.cleanup(); - } - - @Override - public void onStop() { - super.onStop(); - - synchronized (mToneGeneratorLock) { - if (mToneGenerator != null) { - mToneGenerator.release(); - mToneGenerator = null; - } - } - - if (mClearDigitsOnStop) { - mClearDigitsOnStop = false; - clearDialpad(); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putBoolean(PREF_DIGITS_FILLED_BY_INTENT, mDigitsFilledByIntent); - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (mPseudoEmergencyAnimator != null) { - mPseudoEmergencyAnimator.destroy(); - mPseudoEmergencyAnimator = null; - } - getActivity().unregisterReceiver(mCallStateReceiver); - } - - private void keyPressed(int keyCode) { - if (getView() == null || getView().getTranslationY() != 0) { - return; - } - switch (keyCode) { - case KeyEvent.KEYCODE_1: - playTone(ToneGenerator.TONE_DTMF_1, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_2: - playTone(ToneGenerator.TONE_DTMF_2, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_3: - playTone(ToneGenerator.TONE_DTMF_3, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_4: - playTone(ToneGenerator.TONE_DTMF_4, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_5: - playTone(ToneGenerator.TONE_DTMF_5, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_6: - playTone(ToneGenerator.TONE_DTMF_6, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_7: - playTone(ToneGenerator.TONE_DTMF_7, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_8: - playTone(ToneGenerator.TONE_DTMF_8, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_9: - playTone(ToneGenerator.TONE_DTMF_9, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_0: - playTone(ToneGenerator.TONE_DTMF_0, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_POUND: - playTone(ToneGenerator.TONE_DTMF_P, TONE_LENGTH_INFINITE); - break; - case KeyEvent.KEYCODE_STAR: - playTone(ToneGenerator.TONE_DTMF_S, TONE_LENGTH_INFINITE); - break; - default: - break; - } - - getView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); - KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode); - mDigits.onKeyDown(keyCode, event); - - // If the cursor is at the end of the text we hide it. - final int length = mDigits.length(); - if (length == mDigits.getSelectionStart() && length == mDigits.getSelectionEnd()) { - mDigits.setCursorVisible(false); - } - } - - @Override - public boolean onKey(View view, int keyCode, KeyEvent event) { - if (view.getId() == R.id.digits) { - if (keyCode == KeyEvent.KEYCODE_ENTER) { - handleDialButtonPressed(); - return true; - } - } - return false; - } - - /** - * When a key is pressed, we start playing DTMF tone, do vibration, and enter the digit - * immediately. When a key is released, we stop the tone. Note that the "key press" event will be - * delivered by the system with certain amount of delay, it won't be synced with user's actual - * "touch-down" behavior. - */ - @Override - public void onPressed(View view, boolean pressed) { - if (DEBUG) { - LogUtil.d("DialpadFragment.onPressed", "view: " + view + ", pressed: " + pressed); - } - if (pressed) { - int resId = view.getId(); - if (resId == R.id.one) { - keyPressed(KeyEvent.KEYCODE_1); - } else if (resId == R.id.two) { - keyPressed(KeyEvent.KEYCODE_2); - } else if (resId == R.id.three) { - keyPressed(KeyEvent.KEYCODE_3); - } else if (resId == R.id.four) { - keyPressed(KeyEvent.KEYCODE_4); - } else if (resId == R.id.five) { - keyPressed(KeyEvent.KEYCODE_5); - } else if (resId == R.id.six) { - keyPressed(KeyEvent.KEYCODE_6); - } else if (resId == R.id.seven) { - keyPressed(KeyEvent.KEYCODE_7); - } else if (resId == R.id.eight) { - keyPressed(KeyEvent.KEYCODE_8); - } else if (resId == R.id.nine) { - keyPressed(KeyEvent.KEYCODE_9); - } else if (resId == R.id.zero) { - keyPressed(KeyEvent.KEYCODE_0); - } else if (resId == R.id.pound) { - keyPressed(KeyEvent.KEYCODE_POUND); - } else if (resId == R.id.star) { - keyPressed(KeyEvent.KEYCODE_STAR); - } else { - LogUtil.e( - "DialpadFragment.onPressed", "Unexpected onTouch(ACTION_DOWN) event from: " + view); - } - mPressedDialpadKeys.add(view); - } else { - mPressedDialpadKeys.remove(view); - if (mPressedDialpadKeys.isEmpty()) { - stopTone(); - } - } - } - - /** - * Called by the containing Activity to tell this Fragment to build an overflow options menu for - * display by the container when appropriate. - * - * @param invoker the View that invoked the options menu, to act as an anchor location. - */ - private PopupMenu buildOptionsMenu(View invoker) { - final PopupMenu popupMenu = - new PopupMenu(getActivity(), invoker) { - @Override - public void show() { - final Menu menu = getMenu(); - - boolean enable = !isDigitsEmpty(); - for (int i = 0; i < menu.size(); i++) { - MenuItem item = menu.getItem(i); - item.setEnabled(enable); - if (item.getItemId() == R.id.menu_call_with_note) { - item.setVisible(CallUtil.isCallWithSubjectSupported(getContext())); - } - } - super.show(); - } - }; - popupMenu.inflate(R.menu.dialpad_options); - popupMenu.setOnMenuItemClickListener(this); - return popupMenu; - } - - @Override - public void onClick(View view) { - int resId = view.getId(); - if (resId == R.id.dialpad_floating_action_button) { - view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); - handleDialButtonPressed(); - } else if (resId == R.id.deleteButton) { - keyPressed(KeyEvent.KEYCODE_DEL); - } else if (resId == R.id.digits) { - if (!isDigitsEmpty()) { - mDigits.setCursorVisible(true); - } - } else if (resId == R.id.dialpad_overflow) { - mOverflowPopupMenu.show(); - } else { - LogUtil.w("DialpadFragment.onClick", "Unexpected event from: " + view); - return; - } - } - - @Override - public boolean onLongClick(View view) { - final Editable digits = mDigits.getText(); - final int id = view.getId(); - if (id == R.id.deleteButton) { - digits.clear(); - return true; - } else if (id == R.id.one) { - if (isDigitsEmpty() || TextUtils.equals(mDigits.getText(), "1")) { - // We'll try to initiate voicemail and thus we want to remove irrelevant string. - removePreviousDigitIfPossible('1'); - - List subscriptionAccountHandles = - PhoneAccountUtils.getSubscriptionPhoneAccounts(getActivity()); - boolean hasUserSelectedDefault = - subscriptionAccountHandles.contains( - TelecomUtil.getDefaultOutgoingPhoneAccount( - getActivity(), PhoneAccount.SCHEME_VOICEMAIL)); - boolean needsAccountDisambiguation = - subscriptionAccountHandles.size() > 1 && !hasUserSelectedDefault; - - if (needsAccountDisambiguation || isVoicemailAvailable()) { - // On a multi-SIM phone, if the user has not selected a default - // subscription, initiate a call to voicemail so they can select an account - // from the "Call with" dialog. - callVoicemail(); - } else if (getActivity() != null) { - // Voicemail is unavailable maybe because Airplane mode is turned on. - // Check the current status and show the most appropriate error message. - final boolean isAirplaneModeOn = - Settings.System.getInt( - getActivity().getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) - != 0; - if (isAirplaneModeOn) { - DialogFragment dialogFragment = - ErrorDialogFragment.newInstance(R.string.dialog_voicemail_airplane_mode_message); - dialogFragment.show(getFragmentManager(), "voicemail_request_during_airplane_mode"); - } else { - DialogFragment dialogFragment = - ErrorDialogFragment.newInstance(R.string.dialog_voicemail_not_ready_message); - dialogFragment.show(getFragmentManager(), "voicemail_not_ready"); - } - } - return true; - } - return false; - } else if (id == R.id.zero) { - if (mPressedDialpadKeys.contains(view)) { - // If the zero key is currently pressed, then the long press occurred by touch - // (and not via other means like certain accessibility input methods). - // Remove the '0' that was input when the key was first pressed. - removePreviousDigitIfPossible('0'); - } - keyPressed(KeyEvent.KEYCODE_PLUS); - stopTone(); - mPressedDialpadKeys.remove(view); - return true; - } else if (id == R.id.digits) { - mDigits.setCursorVisible(true); - return false; - } - return false; - } - - /** - * Remove the digit just before the current position of the cursor, iff the following conditions - * are true: 1) The cursor is not positioned at index 0. 2) The digit before the current cursor - * position matches the current digit. - * - * @param digit to remove from the digits view. - */ - private void removePreviousDigitIfPossible(char digit) { - final int currentPosition = mDigits.getSelectionStart(); - if (currentPosition > 0 && digit == mDigits.getText().charAt(currentPosition - 1)) { - mDigits.setSelection(currentPosition); - mDigits.getText().delete(currentPosition - 1, currentPosition); - } - } - - public void callVoicemail() { - DialerUtils.startActivityWithErrorToast( - getActivity(), - new CallIntentBuilder(CallUtil.getVoicemailUri(), CallInitiationType.Type.DIALPAD).build()); - hideAndClearDialpad(false); - } - - private void hideAndClearDialpad(boolean animate) { - ((DialtactsActivity) getActivity()).hideDialpadFragment(animate, true); - } - - /** - * In most cases, when the dial button is pressed, there is a number in digits area. Pack it in - * the intent, start the outgoing call broadcast as a separate task and finish this activity. - * - *

When there is no digit and the phone is CDMA and off hook, we're sending a blank flash for - * CDMA. CDMA networks use Flash messages when special processing needs to be done, mainly for - * 3-way or call waiting scenarios. Presumably, here we're in a special 3-way scenario where the - * network needs a blank flash before being able to add the new participant. (This is not the case - * with all 3-way calls, just certain CDMA infrastructures.) - * - *

Otherwise, there is no digit, display the last dialed number. Don't finish since the user - * may want to edit it. The user needs to press the dial button again, to dial it (general case - * described above). - */ - private void handleDialButtonPressed() { - if (isDigitsEmpty()) { // No number entered. - handleDialButtonClickWithEmptyDigits(); - } else { - final String number = mDigits.getText().toString(); - - // "persist.radio.otaspdial" is a temporary hack needed for one carrier's automated - // test equipment. - // TODO: clean it up. - if (number != null - && !TextUtils.isEmpty(mProhibitedPhoneNumberRegexp) - && number.matches(mProhibitedPhoneNumberRegexp)) { - LogUtil.i( - "DialpadFragment.handleDialButtonPressed", - "The phone number is prohibited explicitly by a rule."); - if (getActivity() != null) { - DialogFragment dialogFragment = - ErrorDialogFragment.newInstance(R.string.dialog_phone_call_prohibited_message); - dialogFragment.show(getFragmentManager(), "phone_prohibited_dialog"); - } - - // Clear the digits just in case. - clearDialpad(); - } else { - final Intent intent = - new CallIntentBuilder(number, CallInitiationType.Type.DIALPAD).build(); - DialerUtils.startActivityWithErrorToast(getActivity(), intent); - hideAndClearDialpad(false); - } - } - } - - public void clearDialpad() { - if (mDigits != null) { - mDigits.getText().clear(); - } - } - - private void handleDialButtonClickWithEmptyDigits() { - if (phoneIsCdma() && isPhoneInUse()) { - // TODO: Move this logic into services/Telephony - // - // This is really CDMA specific. On GSM is it possible - // to be off hook and wanted to add a 3rd party using - // the redial feature. - startActivity(newFlashIntent()); - } else { - if (!TextUtils.isEmpty(mLastNumberDialed)) { - // Recall the last number dialed. - mDigits.setText(mLastNumberDialed); - - // ...and move the cursor to the end of the digits string, - // so you'll be able to delete digits using the Delete - // button (just as if you had typed the number manually.) - // - // Note we use mDigits.getText().length() here, not - // mLastNumberDialed.length(), since the EditText widget now - // contains a *formatted* version of mLastNumberDialed (due to - // mTextWatcher) and its length may have changed. - mDigits.setSelection(mDigits.getText().length()); - } else { - // There's no "last number dialed" or the - // background query is still running. There's - // nothing useful for the Dial button to do in - // this case. Note: with a soft dial button, this - // can never happens since the dial button is - // disabled under these conditons. - playTone(ToneGenerator.TONE_PROP_NACK); - } - } - } - - /** Plays the specified tone for TONE_LENGTH_MS milliseconds. */ - private void playTone(int tone) { - playTone(tone, TONE_LENGTH_MS); - } - - /** - * Play the specified tone for the specified 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. - * - *

The tone length can be -1, meaning "keep playing the tone." If the caller does so, it should - * call stopTone() afterward. - * - * @param tone a tone code from {@link ToneGenerator} - * @param durationMs tone length. - */ - private void playTone(int tone, int durationMs) { - // 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) getActivity().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) { - LogUtil.w("DialpadFragment.playTone", "mToneGenerator == null, tone: " + tone); - return; - } - - // Start the new tone (will stop any playing tone) - mToneGenerator.startTone(tone, durationMs); - } - } - - /** Stop the tone if it is played. */ - private void stopTone() { - // if local tone playback is disabled, just return. - if (!mDTMFToneEnabled) { - return; - } - synchronized (mToneGeneratorLock) { - if (mToneGenerator == null) { - LogUtil.w("DialpadFragment.stopTone", "mToneGenerator == null"); - return; - } - mToneGenerator.stopTone(); - } - } - - /** - * Brings up the "dialpad chooser" UI in place of the usual Dialer elements (the textfield/button - * and the dialpad underneath). - * - *

We show this UI if the user brings up the Dialer while a call is already in progress, since - * there's a good chance we got here accidentally (and the user really wanted the in-call dialpad - * instead). So in this situation we display an intermediate UI that lets the user explicitly - * choose between the in-call dialpad ("Use touch tone keypad") and the regular Dialer ("Add - * call"). (Or, the option "Return to call in progress" just goes back to the in-call UI with no - * dialpad at all.) - * - * @param enabled If true, show the "dialpad chooser" instead of the regular Dialer UI - */ - private void showDialpadChooser(boolean enabled) { - if (getActivity() == null) { - return; - } - // Check if onCreateView() is already called by checking one of View objects. - if (!isLayoutReady()) { - return; - } - - if (enabled) { - LogUtil.i("DialpadFragment.showDialpadChooser", "Showing dialpad chooser!"); - if (mDialpadView != null) { - mDialpadView.setVisibility(View.GONE); - } - - mFloatingActionButtonController.setVisible(false); - mDialpadChooser.setVisibility(View.VISIBLE); - - // Instantiate the DialpadChooserAdapter and hook it up to the - // ListView. We do this only once. - if (mDialpadChooserAdapter == null) { - mDialpadChooserAdapter = new DialpadChooserAdapter(getActivity()); - } - mDialpadChooser.setAdapter(mDialpadChooserAdapter); - } else { - LogUtil.i("DialpadFragment.showDialpadChooser", "Displaying normal Dialer UI."); - if (mDialpadView != null) { - mDialpadView.setVisibility(View.VISIBLE); - } else { - mDigits.setVisibility(View.VISIBLE); - } - - // mFloatingActionButtonController must also be 'scaled in', in order to be visible after - // 'scaleOut()' hidden method. - if (!mFloatingActionButtonController.isVisible()) { - // Just call 'scaleIn()' method if the mFloatingActionButtonController was not already - // previously visible. - mFloatingActionButtonController.scaleIn(0); - } - mDialpadChooser.setVisibility(View.GONE); - } - } - - /** @return true if we're currently showing the "dialpad chooser" UI. */ - private boolean isDialpadChooserVisible() { - return mDialpadChooser.getVisibility() == View.VISIBLE; - } - - /** Handle clicks from the dialpad chooser. */ - @Override - public void onItemClick(AdapterView parent, View v, int position, long id) { - DialpadChooserAdapter.ChoiceItem item = - (DialpadChooserAdapter.ChoiceItem) parent.getItemAtPosition(position); - int itemId = item.id; - if (itemId == DialpadChooserAdapter.DIALPAD_CHOICE_USE_DTMF_DIALPAD) { - // Fire off an intent to go back to the in-call UI - // with the dialpad visible. - returnToInCallScreen(true); - } else if (itemId == DialpadChooserAdapter.DIALPAD_CHOICE_RETURN_TO_CALL) { - // Fire off an intent to go back to the in-call UI - // (with the dialpad hidden). - returnToInCallScreen(false); - } else if (itemId == DialpadChooserAdapter.DIALPAD_CHOICE_ADD_NEW_CALL) { - // Ok, guess the user really did want to be here (in the - // regular Dialer) after all. Bring back the normal Dialer UI. - showDialpadChooser(false); - } else { - LogUtil.w("DialpadFragment.onItemClick", "Unexpected itemId: " + itemId); - } - } - - /** - * Returns to the in-call UI (where there's presumably a call in progress) in response to the user - * selecting "use touch tone keypad" or "return to call" from the dialpad chooser. - */ - private void returnToInCallScreen(boolean showDialpad) { - TelecomUtil.showInCallScreen(getActivity(), showDialpad); - - // Finally, finish() ourselves so that we don't stay on the - // activity stack. - // Note that we do this whether or not the showCallScreenWithDialpad() - // call above had any effect or not! (That call is a no-op if the - // phone is idle, which can happen if the current call ends while - // the dialpad chooser is up. In this case we can't show the - // InCallScreen, and there's no point staying here in the Dialer, - // so we just take the user back where he came from...) - getActivity().finish(); - } - - /** - * @return true if the phone is "in use", meaning that at least one line is active (ie. off hook - * or ringing or dialing, or on hold). - */ - private boolean isPhoneInUse() { - final Context context = getActivity(); - if (context != null) { - return TelecomUtil.isInCall(context); - } - return false; - } - - /** @return true if the phone is a CDMA phone type */ - private boolean phoneIsCdma() { - return getTelephonyManager().getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA; - } - - @Override - public boolean onMenuItemClick(MenuItem item) { - int resId = item.getItemId(); - if (resId == R.id.menu_2s_pause) { - updateDialString(PAUSE); - return true; - } else if (resId == R.id.menu_add_wait) { - updateDialString(WAIT); - return true; - } else if (resId == R.id.menu_call_with_note) { - CallSubjectDialog.start(getActivity(), mDigits.getText().toString()); - hideAndClearDialpad(false); - return true; - } else { - return false; - } - } - - /** - * Updates the dial string (mDigits) after inserting a Pause character (,) or Wait character (;). - */ - private void updateDialString(char newDigit) { - if (newDigit != WAIT && newDigit != PAUSE) { - throw new IllegalArgumentException("Not expected for anything other than PAUSE & WAIT"); - } - - int selectionStart; - int selectionEnd; - - // SpannableStringBuilder editable_text = new SpannableStringBuilder(mDigits.getText()); - int anchor = mDigits.getSelectionStart(); - int point = mDigits.getSelectionEnd(); - - selectionStart = Math.min(anchor, point); - selectionEnd = Math.max(anchor, point); - - if (selectionStart == -1) { - selectionStart = selectionEnd = mDigits.length(); - } - - Editable digits = mDigits.getText(); - - if (canAddDigit(digits, selectionStart, selectionEnd, newDigit)) { - digits.replace(selectionStart, selectionEnd, Character.toString(newDigit)); - - if (selectionStart != selectionEnd) { - // Unselect: back to a regular cursor, just pass the character inserted. - mDigits.setSelection(selectionStart + 1); - } - } - } - - /** Update the enabledness of the "Dial" and "Backspace" buttons if applicable. */ - private void updateDeleteButtonEnabledState() { - if (getActivity() == null) { - return; - } - final boolean digitsNotEmpty = !isDigitsEmpty(); - mDelete.setEnabled(digitsNotEmpty); - } - - /** - * Handle transitions for the menu button depending on the state of the digits edit text. - * Transition out when going from digits to no digits and transition in when the first digit is - * pressed. - * - * @param transitionIn True if transitioning in, False if transitioning out - */ - private void updateMenuOverflowButton(boolean transitionIn) { - mOverflowMenuButton = mDialpadView.getOverflowMenuButton(); - if (transitionIn) { - AnimUtils.fadeIn(mOverflowMenuButton, AnimUtils.DEFAULT_DURATION); - } else { - AnimUtils.fadeOut(mOverflowMenuButton, AnimUtils.DEFAULT_DURATION); - } - } - - /** - * Check if voicemail is enabled/accessible. - * - * @return true if voicemail is enabled and accessible. Note that this can be false "temporarily" - * after the app boot. - */ - private boolean isVoicemailAvailable() { - try { - PhoneAccountHandle defaultUserSelectedAccount = - TelecomUtil.getDefaultOutgoingPhoneAccount(getActivity(), PhoneAccount.SCHEME_VOICEMAIL); - if (defaultUserSelectedAccount == null) { - // In a single-SIM phone, there is no default outgoing phone account selected by - // the user, so just call TelephonyManager#getVoicemailNumber directly. - return !TextUtils.isEmpty(getTelephonyManager().getVoiceMailNumber()); - } else { - return !TextUtils.isEmpty( - TelecomUtil.getVoicemailNumber(getActivity(), defaultUserSelectedAccount)); - } - } catch (SecurityException se) { - // Possibly no READ_PHONE_STATE privilege. - LogUtil.w( - "DialpadFragment.isVoicemailAvailable", - "SecurityException is thrown. Maybe privilege isn't sufficient."); - } - return false; - } - - /** @return true if the widget with the phone number digits is empty. */ - private boolean isDigitsEmpty() { - return mDigits.length() == 0; - } - - /** - * Starts the asyn query to get the last dialed/outgoing number. When the background query - * finishes, mLastNumberDialed is set to the last dialed number or an empty string if none exists - * yet. - */ - private void queryLastOutgoingCall() { - mLastNumberDialed = EMPTY_NUMBER; - if (ContextCompat.checkSelfPermission(getActivity(), permission.READ_CALL_LOG) - != PackageManager.PERMISSION_GRANTED) { - return; - } - CallLogAsync.GetLastOutgoingCallArgs lastCallArgs = - new CallLogAsync.GetLastOutgoingCallArgs( - getActivity(), - new CallLogAsync.OnLastOutgoingCallComplete() { - @Override - public void lastOutgoingCall(String number) { - // TODO: Filter out emergency numbers if - // the carrier does not want redial for - // these. - // If the fragment has already been detached since the last time - // we called queryLastOutgoingCall in onResume there is no point - // doing anything here. - if (getActivity() == null) { - return; - } - mLastNumberDialed = number; - updateDeleteButtonEnabledState(); - } - }); - mCallLog.getLastOutgoingCall(lastCallArgs); - } - - private Intent newFlashIntent() { - Intent intent = new CallIntentBuilder(EMPTY_NUMBER, CallInitiationType.Type.DIALPAD).build(); - intent.putExtra(EXTRA_SEND_EMPTY_FLASH, true); - return intent; - } - - @Override - public void onHiddenChanged(boolean hidden) { - super.onHiddenChanged(hidden); - final DialtactsActivity activity = (DialtactsActivity) getActivity(); - if (activity == null || getView() == null) { - return; - } - final DialpadView dialpadView = (DialpadView) getView().findViewById(R.id.dialpad_view); - if (!hidden && !isDialpadChooserVisible()) { - if (mAnimate) { - dialpadView.animateShow(); - } - mFloatingActionButtonController.setVisible(false); - mFloatingActionButtonController.scaleIn(mAnimate ? mDialpadSlideInDuration : 0); - activity.onDialpadShown(); - mDigits.requestFocus(); - } - if (hidden) { - if (mAnimate) { - mFloatingActionButtonController.scaleOut(); - } else { - mFloatingActionButtonController.setVisible(false); - } - } - } - - public boolean getAnimate() { - return mAnimate; - } - - public void setAnimate(boolean value) { - mAnimate = value; - } - - public void setYFraction(float yFraction) { - ((DialpadSlidingRelativeLayout) getView()).setYFraction(yFraction); - } - - public int getDialpadHeight() { - if (mDialpadView == null) { - return 0; - } - return mDialpadView.getHeight(); - } - - public void process_quote_emergency_unquote(String query) { - if (PseudoEmergencyAnimator.PSEUDO_EMERGENCY_NUMBER.equals(query)) { - if (mPseudoEmergencyAnimator == null) { - mPseudoEmergencyAnimator = - new PseudoEmergencyAnimator( - new PseudoEmergencyAnimator.ViewProvider() { - @Override - public View getView() { - return DialpadFragment.this.getView(); - } - }); - } - mPseudoEmergencyAnimator.start(); - } else { - if (mPseudoEmergencyAnimator != null) { - mPseudoEmergencyAnimator.end(); - } - } - } - - public interface OnDialpadQueryChangedListener { - - void onDialpadQueryChanged(String query); - } - - public interface HostInterface { - - /** - * Notifies the parent activity that the space above the dialpad has been tapped with no query - * in the dialpad present. In most situations this will cause the dialpad to be dismissed, - * unless there happens to be content showing. - */ - boolean onDialpadSpacerTouchWithEmptyQuery(); - } - - /** - * LinearLayout with getter and setter methods for the translationY property using floats, for - * animation purposes. - */ - public static class DialpadSlidingRelativeLayout extends RelativeLayout { - - public DialpadSlidingRelativeLayout(Context context) { - super(context); - } - - public DialpadSlidingRelativeLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public DialpadSlidingRelativeLayout(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - @UsedByReflection(value = "dialpad_fragment.xml") - public float getYFraction() { - final int height = getHeight(); - if (height == 0) { - return 0; - } - return getTranslationY() / height; - } - - @UsedByReflection(value = "dialpad_fragment.xml") - public void setYFraction(float yFraction) { - setTranslationY(yFraction * getHeight()); - } - } - - public static class ErrorDialogFragment extends DialogFragment { - - private static final String ARG_TITLE_RES_ID = "argTitleResId"; - private static final String ARG_MESSAGE_RES_ID = "argMessageResId"; - private int mTitleResId; - private int mMessageResId; - - public static ErrorDialogFragment newInstance(int messageResId) { - return newInstance(0, messageResId); - } - - public static ErrorDialogFragment newInstance(int titleResId, int messageResId) { - final ErrorDialogFragment fragment = new ErrorDialogFragment(); - final Bundle args = new Bundle(); - args.putInt(ARG_TITLE_RES_ID, titleResId); - args.putInt(ARG_MESSAGE_RES_ID, messageResId); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mTitleResId = getArguments().getInt(ARG_TITLE_RES_ID); - mMessageResId = getArguments().getInt(ARG_MESSAGE_RES_ID); - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - if (mTitleResId != 0) { - builder.setTitle(mTitleResId); - } - if (mMessageResId != 0) { - builder.setMessage(mMessageResId); - } - builder.setPositiveButton( - android.R.string.ok, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dismiss(); - } - }); - return builder.create(); - } - } - - /** - * Simple list adapter, binding to an icon + text label for each item in the "dialpad chooser" - * list. - */ - private static class DialpadChooserAdapter extends BaseAdapter { - - // IDs for the possible "choices": - static final int DIALPAD_CHOICE_USE_DTMF_DIALPAD = 101; - static final int DIALPAD_CHOICE_RETURN_TO_CALL = 102; - static final int DIALPAD_CHOICE_ADD_NEW_CALL = 103; - private static final int NUM_ITEMS = 3; - private LayoutInflater mInflater; - private ChoiceItem[] mChoiceItems = new ChoiceItem[NUM_ITEMS]; - - public DialpadChooserAdapter(Context context) { - // Cache the LayoutInflate to avoid asking for a new one each time. - mInflater = LayoutInflater.from(context); - - // Initialize the possible choices. - // TODO: could this be specified entirely in XML? - - // - "Use touch tone keypad" - mChoiceItems[0] = - new ChoiceItem( - context.getString(R.string.dialer_useDtmfDialpad), - BitmapFactory.decodeResource( - context.getResources(), R.drawable.ic_dialer_fork_tt_keypad), - DIALPAD_CHOICE_USE_DTMF_DIALPAD); - - // - "Return to call in progress" - mChoiceItems[1] = - new ChoiceItem( - context.getString(R.string.dialer_returnToInCallScreen), - BitmapFactory.decodeResource( - context.getResources(), R.drawable.ic_dialer_fork_current_call), - DIALPAD_CHOICE_RETURN_TO_CALL); - - // - "Add call" - mChoiceItems[2] = - new ChoiceItem( - context.getString(R.string.dialer_addAnotherCall), - BitmapFactory.decodeResource( - context.getResources(), R.drawable.ic_dialer_fork_add_call), - DIALPAD_CHOICE_ADD_NEW_CALL); - } - - @Override - public int getCount() { - return NUM_ITEMS; - } - - /** Return the ChoiceItem for a given position. */ - @Override - public Object getItem(int position) { - return mChoiceItems[position]; - } - - /** Return a unique ID for each possible choice. */ - @Override - public long getItemId(int position) { - return position; - } - - /** Make a view for each row. */ - @Override - public View getView(int position, View convertView, ViewGroup parent) { - // When convertView is non-null, we can reuse it (there's no need - // to reinflate it.) - if (convertView == null) { - convertView = mInflater.inflate(R.layout.dialpad_chooser_list_item, null); - } - - TextView text = (TextView) convertView.findViewById(R.id.text); - text.setText(mChoiceItems[position].text); - - ImageView icon = (ImageView) convertView.findViewById(R.id.icon); - icon.setImageBitmap(mChoiceItems[position].icon); - - return convertView; - } - - // Simple struct for a single "choice" item. - static class ChoiceItem { - - String text; - Bitmap icon; - int id; - - public ChoiceItem(String s, Bitmap b, int i) { - text = s; - icon = b; - id = i; - } - } - } - - private class CallStateReceiver extends BroadcastReceiver { - - /** - * Receive call state changes so that we can take down the "dialpad chooser" if the phone - * becomes idle while the chooser UI is visible. - */ - @Override - public void onReceive(Context context, Intent intent) { - String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); - if ((TextUtils.equals(state, TelephonyManager.EXTRA_STATE_IDLE) - || TextUtils.equals(state, TelephonyManager.EXTRA_STATE_OFFHOOK)) - && isDialpadChooserVisible()) { - // Note there's a race condition in the UI here: the - // dialpad chooser could conceivably disappear (on its - // own) at the exact moment the user was trying to select - // one of the choices, which would be confusing. (But at - // least that's better than leaving the dialpad chooser - // onscreen, but useless...) - showDialpadChooser(false); - } - } - } -} diff --git a/java/com/android/dialer/app/dialpad/PseudoEmergencyAnimator.java b/java/com/android/dialer/app/dialpad/PseudoEmergencyAnimator.java deleted file mode 100644 index be2964dfe..000000000 --- a/java/com/android/dialer/app/dialpad/PseudoEmergencyAnimator.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.app.dialpad; - -import android.animation.Animator; -import android.animation.Animator.AnimatorListener; -import android.animation.ArgbEvaluator; -import android.animation.ValueAnimator; -import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.content.Context; -import android.graphics.Color; -import android.graphics.ColorFilter; -import android.graphics.LightingColorFilter; -import android.os.Handler; -import android.os.Vibrator; -import android.view.View; -import com.android.dialer.app.R; - -/** Animates the dial button on "emergency" phone numbers. */ -public class PseudoEmergencyAnimator { - - public static final String PSEUDO_EMERGENCY_NUMBER = "01189998819991197253"; - private static final int VIBRATE_LENGTH_MILLIS = 200; - private static final int ITERATION_LENGTH_MILLIS = 1000; - private static final int ANIMATION_ITERATION_COUNT = 6; - private ViewProvider mViewProvider; - private ValueAnimator mPseudoEmergencyColorAnimator; - - PseudoEmergencyAnimator(ViewProvider viewProvider) { - mViewProvider = viewProvider; - } - - public void destroy() { - end(); - mViewProvider = null; - } - - public void start() { - if (mPseudoEmergencyColorAnimator == null) { - Integer colorFrom = Color.BLUE; - Integer colorTo = Color.RED; - mPseudoEmergencyColorAnimator = - ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); - - mPseudoEmergencyColorAnimator.addUpdateListener( - new AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animator) { - try { - int color = (int) animator.getAnimatedValue(); - ColorFilter colorFilter = new LightingColorFilter(Color.BLACK, color); - - View floatingActionButtonContainer = - getView().findViewById(R.id.floating_action_button); - if (floatingActionButtonContainer != null) { - floatingActionButtonContainer.getBackground().setColorFilter(colorFilter); - } - } catch (Exception e) { - animator.cancel(); - } - } - }); - - mPseudoEmergencyColorAnimator.addListener( - new AnimatorListener() { - @Override - public void onAnimationCancel(Animator animation) {} - - @Override - public void onAnimationRepeat(Animator animation) { - try { - vibrate(VIBRATE_LENGTH_MILLIS); - } catch (Exception e) { - animation.cancel(); - } - } - - @Override - public void onAnimationStart(Animator animation) {} - - @Override - public void onAnimationEnd(Animator animation) { - try { - View floatingActionButtonContainer = - getView().findViewById(R.id.floating_action_button); - if (floatingActionButtonContainer != null) { - floatingActionButtonContainer.getBackground().clearColorFilter(); - } - - new Handler() - .postDelayed( - new Runnable() { - @Override - public void run() { - try { - vibrate(VIBRATE_LENGTH_MILLIS); - } catch (Exception e) { - // ignored - } - } - }, - ITERATION_LENGTH_MILLIS); - } catch (Exception e) { - animation.cancel(); - } - } - }); - - mPseudoEmergencyColorAnimator.setDuration(VIBRATE_LENGTH_MILLIS); - mPseudoEmergencyColorAnimator.setRepeatMode(ValueAnimator.REVERSE); - mPseudoEmergencyColorAnimator.setRepeatCount(ANIMATION_ITERATION_COUNT); - } - if (!mPseudoEmergencyColorAnimator.isStarted()) { - mPseudoEmergencyColorAnimator.start(); - } - } - - public void end() { - if (mPseudoEmergencyColorAnimator != null && mPseudoEmergencyColorAnimator.isStarted()) { - mPseudoEmergencyColorAnimator.end(); - } - } - - private View getView() { - return mViewProvider == null ? null : mViewProvider.getView(); - } - - private Context getContext() { - View view = getView(); - return view != null ? view.getContext() : null; - } - - private void vibrate(long milliseconds) { - Context context = getContext(); - if (context != null) { - Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - if (vibrator != null) { - vibrator.vibrate(milliseconds); - } - } - } - - public interface ViewProvider { - - View getView(); - } -} diff --git a/java/com/android/dialer/app/dialpad/SmartDialCursorLoader.java b/java/com/android/dialer/app/dialpad/SmartDialCursorLoader.java deleted file mode 100644 index a0c8b18d3..000000000 --- a/java/com/android/dialer/app/dialpad/SmartDialCursorLoader.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.app.dialpad; - -import android.content.AsyncTaskLoader; -import android.content.Context; -import android.database.Cursor; -import android.database.MatrixCursor; -import com.android.contacts.common.list.PhoneNumberListAdapter.PhoneQuery; -import com.android.dialer.common.LogUtil; -import com.android.dialer.database.Database; -import com.android.dialer.database.DialerDatabaseHelper; -import com.android.dialer.database.DialerDatabaseHelper.ContactNumber; -import com.android.dialer.smartdial.SmartDialNameMatcher; -import com.android.dialer.smartdial.SmartDialPrefix; -import com.android.dialer.util.PermissionsUtil; -import java.util.ArrayList; - -/** Implements a Loader class to asynchronously load SmartDial search results. */ -public class SmartDialCursorLoader extends AsyncTaskLoader { - - private static final String TAG = "SmartDialCursorLoader"; - private static final boolean DEBUG = false; - - private final Context mContext; - - private Cursor mCursor; - - private String mQuery; - private SmartDialNameMatcher mNameMatcher; - - private boolean mShowEmptyListForNullQuery = true; - - public SmartDialCursorLoader(Context context) { - super(context); - mContext = context; - } - - /** - * Configures the query string to be used to find SmartDial matches. - * - * @param query The query string user typed. - */ - public void configureQuery(String query) { - if (DEBUG) { - LogUtil.v(TAG, "Configure new query to be " + query); - } - mQuery = SmartDialNameMatcher.normalizeNumber(query, SmartDialPrefix.getMap()); - - /** Constructs a name matcher object for matching names. */ - mNameMatcher = new SmartDialNameMatcher(mQuery, SmartDialPrefix.getMap()); - mNameMatcher.setShouldMatchEmptyQuery(!mShowEmptyListForNullQuery); - } - - /** - * Queries the SmartDial database and loads results in background. - * - * @return Cursor of contacts that matches the SmartDial query. - */ - @Override - public Cursor loadInBackground() { - if (DEBUG) { - LogUtil.v(TAG, "Load in background " + mQuery); - } - - if (!PermissionsUtil.hasContactsReadPermissions(mContext)) { - return new MatrixCursor(PhoneQuery.PROJECTION_PRIMARY); - } - - /** Loads results from the database helper. */ - final DialerDatabaseHelper dialerDatabaseHelper = - Database.get(mContext).getDatabaseHelper(mContext); - final ArrayList allMatches = - dialerDatabaseHelper.getLooseMatches(mQuery, mNameMatcher); - - if (DEBUG) { - LogUtil.v(TAG, "Loaded matches " + allMatches.size()); - } - - /** Constructs a cursor for the returned array of results. */ - final MatrixCursor cursor = new MatrixCursor(PhoneQuery.PROJECTION_PRIMARY); - Object[] row = new Object[PhoneQuery.PROJECTION_PRIMARY.length]; - for (ContactNumber contact : allMatches) { - row[PhoneQuery.PHONE_ID] = contact.dataId; - row[PhoneQuery.PHONE_NUMBER] = contact.phoneNumber; - row[PhoneQuery.CONTACT_ID] = contact.id; - row[PhoneQuery.LOOKUP_KEY] = contact.lookupKey; - row[PhoneQuery.PHOTO_ID] = contact.photoId; - row[PhoneQuery.DISPLAY_NAME] = contact.displayName; - row[PhoneQuery.CARRIER_PRESENCE] = contact.carrierPresence; - cursor.addRow(row); - } - return cursor; - } - - @Override - public void deliverResult(Cursor cursor) { - if (isReset()) { - /** The Loader has been reset; ignore the result and invalidate the data. */ - releaseResources(cursor); - return; - } - - /** Hold a reference to the old data so it doesn't get garbage collected. */ - Cursor oldCursor = mCursor; - mCursor = cursor; - - if (isStarted()) { - /** If the Loader is in a started state, deliver the results to the client. */ - super.deliverResult(cursor); - } - - /** Invalidate the old data as we don't need it any more. */ - if (oldCursor != null && oldCursor != cursor) { - releaseResources(oldCursor); - } - } - - @Override - protected void onStartLoading() { - if (mCursor != null) { - /** Deliver any previously loaded data immediately. */ - deliverResult(mCursor); - } - if (mCursor == null) { - /** Force loads every time as our results change with queries. */ - forceLoad(); - } - } - - @Override - protected void onStopLoading() { - /** The Loader is in a stopped state, so we should attempt to cancel the current load. */ - cancelLoad(); - } - - @Override - protected void onReset() { - /** Ensure the loader has been stopped. */ - onStopLoading(); - - /** Release all previously saved query results. */ - if (mCursor != null) { - releaseResources(mCursor); - mCursor = null; - } - } - - @Override - public void onCanceled(Cursor cursor) { - super.onCanceled(cursor); - - /** The load has been canceled, so we should release the resources associated with 'data'. */ - releaseResources(cursor); - } - - private void releaseResources(Cursor cursor) { - if (cursor != null) { - cursor.close(); - } - } - - public void setShowEmptyListForNullQuery(boolean show) { - mShowEmptyListForNullQuery = show; - if (mNameMatcher != null) { - mNameMatcher.setShouldMatchEmptyQuery(!show); - } - } -} diff --git a/java/com/android/dialer/app/dialpad/UnicodeDialerKeyListener.java b/java/com/android/dialer/app/dialpad/UnicodeDialerKeyListener.java deleted file mode 100644 index 051daf46e..000000000 --- a/java/com/android/dialer/app/dialpad/UnicodeDialerKeyListener.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.app.dialpad; - -import android.telephony.PhoneNumberUtils; -import android.text.Spanned; -import android.text.method.DialerKeyListener; - -/** - * {@link DialerKeyListener} with Unicode support. Converts any Unicode(e.g. Arabic) characters that - * represent digits into digits before filtering the results so that we can support pasted digits - * from Unicode languages. - */ -public class UnicodeDialerKeyListener extends DialerKeyListener { - - public static final UnicodeDialerKeyListener INSTANCE = new UnicodeDialerKeyListener(); - - @Override - public CharSequence filter( - CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { - final String converted = - PhoneNumberUtils.convertKeypadLettersToDigits( - PhoneNumberUtils.replaceUnicodeDigits(source.toString())); - // PhoneNumberUtils.replaceUnicodeDigits performs a character for character replacement, - // so we can assume that start and end positions should remain unchanged. - CharSequence result = super.filter(converted, start, end, dest, dstart, dend); - if (result == null) { - if (source.equals(converted)) { - // There was no conversion or filtering performed. Just return null according to - // the behavior of DialerKeyListener. - return null; - } else { - // filter returns null if the charsequence is to be returned unchanged/unfiltered. - // But in this case we do want to return a modified character string (even if - // none of the characters in the modified string are filtered). So if - // result == null we return the unfiltered but converted numeric string instead. - return converted.subSequence(start, end); - } - } - return result; - } -} diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java index dbd4e868c..ca12e4351 100644 --- a/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java +++ b/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java @@ -20,9 +20,9 @@ import android.content.Context; import android.database.Cursor; import android.telephony.PhoneNumberUtils; import android.view.View; -import com.android.contacts.common.ContactPhotoManager; import com.android.dialer.app.R; import com.android.dialer.blocking.BlockNumberDialogFragment; +import com.android.dialer.contactphoto.ContactPhotoManager; import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns; import com.android.dialer.location.GeoUtil; import com.android.dialer.logging.InteractionEvent; diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java index f53a45840..db119ab77 100644 --- a/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java +++ b/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java @@ -31,7 +31,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; -import com.android.contacts.common.lettertiles.LetterTileDrawable; import com.android.dialer.app.R; import com.android.dialer.blocking.BlockedNumbersMigrator; import com.android.dialer.blocking.BlockedNumbersMigrator.Listener; @@ -40,6 +39,7 @@ import com.android.dialer.blocking.FilteredNumbersUtil; import com.android.dialer.blocking.FilteredNumbersUtil.CheckForSendToVoicemailContactListener; import com.android.dialer.blocking.FilteredNumbersUtil.ImportSendToVoicemailContactsListener; import com.android.dialer.database.FilteredNumberContract; +import com.android.dialer.lettertile.LetterTileDrawable; import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker; public class BlockedNumbersFragment extends ListFragment diff --git a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java index f71517a44..6e1d1a5a6 100644 --- a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java +++ b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java @@ -26,14 +26,15 @@ import android.view.View; import android.widget.QuickContactBadge; import android.widget.SimpleCursorAdapter; import android.widget.TextView; -import com.android.contacts.common.ContactPhotoManager; -import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest; -import com.android.contacts.common.util.UriUtils; import com.android.dialer.app.R; import com.android.dialer.compat.CompatUtils; +import com.android.dialer.contactphoto.ContactPhotoManager; +import com.android.dialer.contactphoto.ContactPhotoManager.DefaultImageRequest; +import com.android.dialer.lettertile.LetterTileDrawable; import com.android.dialer.phonenumbercache.ContactInfo; import com.android.dialer.phonenumbercache.ContactInfoHelper; import com.android.dialer.phonenumberutil.PhoneNumberHelper; +import com.android.dialer.util.UriUtils; public class NumbersAdapter extends SimpleCursorAdapter { @@ -98,8 +99,8 @@ public class NumbersAdapter extends SimpleCursorAdapter { info.lookupUri == null ? null : UriUtils.getLookupKeyFromUri(info.lookupUri); final int contactType = mContactInfoHelper.isBusiness(info.sourceType) - ? ContactPhotoManager.TYPE_BUSINESS - : ContactPhotoManager.TYPE_DEFAULT; + ? LetterTileDrawable.TYPE_BUSINESS + : LetterTileDrawable.TYPE_DEFAULT; final DefaultImageRequest request = new DefaultImageRequest(displayName, lookupKey, contactType, true /* isCircular */); badge.assignContactUri(info.lookupUri); diff --git a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java b/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java index 313efb4d7..1e90eecb6 100644 --- a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java +++ b/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java @@ -19,9 +19,9 @@ import android.app.FragmentManager; import android.content.Context; import android.database.Cursor; import android.view.View; -import com.android.contacts.common.ContactPhotoManager; import com.android.dialer.app.R; import com.android.dialer.blocking.FilteredNumbersUtil; +import com.android.dialer.contactphoto.ContactPhotoManager; import com.android.dialer.location.GeoUtil; import com.android.dialer.phonenumbercache.ContactInfoHelper; diff --git a/java/com/android/dialer/app/legacybindings/DialerLegacyBindings.java b/java/com/android/dialer/app/legacybindings/DialerLegacyBindings.java index 1cdeb2175..a483af9e9 100644 --- a/java/com/android/dialer/app/legacybindings/DialerLegacyBindings.java +++ b/java/com/android/dialer/app/legacybindings/DialerLegacyBindings.java @@ -40,6 +40,8 @@ public interface DialerLegacyBindings { Activity activity, ViewGroup alertContainer, CallLogAdapter.CallFetcher callFetcher, + CallLogAdapter.MultiSelectRemoveView multiSelectRemoveView, + CallLogAdapter.OnActionModeStateChangedListener actionModeStateChangedListener, CallLogCache callLogCache, ContactInfoCache contactInfoCache, VoicemailPlaybackPresenter voicemailPlaybackPresenter, diff --git a/java/com/android/dialer/app/legacybindings/DialerLegacyBindingsStub.java b/java/com/android/dialer/app/legacybindings/DialerLegacyBindingsStub.java index 6e32843ba..488fbad68 100644 --- a/java/com/android/dialer/app/legacybindings/DialerLegacyBindingsStub.java +++ b/java/com/android/dialer/app/legacybindings/DialerLegacyBindingsStub.java @@ -34,6 +34,8 @@ public class DialerLegacyBindingsStub implements DialerLegacyBindings { Activity activity, ViewGroup alertContainer, CallLogAdapter.CallFetcher callFetcher, + CallLogAdapter.MultiSelectRemoveView multiSelectRemoveView, + CallLogAdapter.OnActionModeStateChangedListener actionModeStateChangedListener, CallLogCache callLogCache, ContactInfoCache contactInfoCache, VoicemailPlaybackPresenter voicemailPlaybackPresenter, @@ -43,6 +45,8 @@ public class DialerLegacyBindingsStub implements DialerLegacyBindings { activity, alertContainer, callFetcher, + multiSelectRemoveView, + actionModeStateChangedListener, callLogCache, contactInfoCache, voicemailPlaybackPresenter, diff --git a/java/com/android/dialer/app/list/AllContactsFragment.java b/java/com/android/dialer/app/list/AllContactsFragment.java index 04609970a..32a99e795 100644 --- a/java/com/android/dialer/app/list/AllContactsFragment.java +++ b/java/com/android/dialer/app/list/AllContactsFragment.java @@ -38,12 +38,16 @@ import com.android.contacts.common.list.ContactEntryListFragment; import com.android.contacts.common.list.ContactListFilter; import com.android.contacts.common.list.DefaultContactListAdapter; import com.android.dialer.app.R; -import com.android.dialer.app.widget.EmptyContentView; -import com.android.dialer.app.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; +import com.android.dialer.common.LogUtil; import com.android.dialer.compat.CompatUtils; +import com.android.dialer.logging.InteractionEvent; +import com.android.dialer.logging.Logger; import com.android.dialer.util.DialerUtils; import com.android.dialer.util.IntentUtil; import com.android.dialer.util.PermissionsUtil; +import com.android.dialer.widget.EmptyContentView; +import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; +import java.util.Arrays; /** Fragments to show all contacts with phone numbers. */ public class AllContactsFragment extends ContactEntryListFragment @@ -149,6 +153,8 @@ public class AllContactsFragment extends ContactEntryListFragment parent, View view, int position, long id) { final Uri uri = (Uri) view.getTag(); if (uri != null) { + Logger.get(getContext()) + .logInteraction(InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_ALL_CONTACTS_GENERAL); if (CompatUtils.hasPrioritizedMimeType()) { QuickContact.showQuickContact(getContext(), view, uri, null, Phone.CONTENT_ITEM_TYPE); } else { @@ -169,9 +175,15 @@ public class AllContactsFragment extends ContactEntryListFragment 0) { + LogUtil.i( + "AllContactsFragment.onEmptyViewActionButtonClicked", + "Requesting permissions: " + Arrays.toString(deniedPermissions)); FragmentCompat.requestPermissions( - this, new String[] {READ_CONTACTS}, READ_CONTACTS_PERMISSION_REQUEST_CODE); + this, deniedPermissions, READ_CONTACTS_PERMISSION_REQUEST_CODE); } else { // Add new contact DialerUtils.startActivityWithErrorToast( diff --git a/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java b/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java index 537f488d5..fc0bd3ccf 100644 --- a/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java +++ b/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java @@ -19,6 +19,8 @@ package com.android.dialer.app.list; import android.content.Context; import android.content.res.Resources; import android.database.Cursor; +import android.graphics.drawable.Drawable; +import android.support.v4.content.ContextCompat; import android.telephony.PhoneNumberUtils; import android.text.BidiFormatter; import android.text.TextDirectionHeuristics; @@ -29,7 +31,6 @@ import com.android.contacts.common.list.PhoneNumberListAdapter; import com.android.contacts.common.util.ContactDisplayUtils; import com.android.dialer.app.R; import com.android.dialer.location.GeoUtil; -import com.android.dialer.util.CallUtil; /** * {@link PhoneNumberListAdapter} with the following added shortcuts, that are displayed as list @@ -50,7 +51,6 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter { private final boolean[] mShortcutEnabled = new boolean[SHORTCUT_COUNT]; private final BidiFormatter mBidiFormatter = BidiFormatter.getInstance(); - private final boolean mVideoCallingEnabled; private final String mCountryIso; private String mFormattedQueryString; @@ -59,7 +59,6 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter { super(context); mCountryIso = GeoUtil.getCurrentCountryIso(context); - mVideoCallingEnabled = CallUtil.isVideoEnabled(context); } @Override @@ -110,8 +109,7 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter { return convertView; } else { final ContactListItemView v = - new ContactListItemView( - getContext(), null, mVideoCallingEnabled, isCallAndShareEnabled()); + new ContactListItemView(getContext(), null, mIsImsVideoEnabled); assignShortcutToView(v, shortcutType); return v; } @@ -125,8 +123,7 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter { Context context, int partition, Cursor cursor, int position, ViewGroup parent) { final ContactListItemView view = super.newView(context, partition, cursor, position, parent); - view.setSupportVideoCallIcon(mVideoCallingEnabled); - view.setSupportCallAndShareIcon(isCallAndShareEnabled()); + view.setSupportVideoCallIcon(mIsImsVideoEnabled); return view; } @@ -171,7 +168,7 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter { private void assignShortcutToView(ContactListItemView v, int shortcutType) { final CharSequence text; - final int drawableId; + final Drawable drawable; final Resources resources = getContext().getResources(); final String number = getFormattedQueryString(); switch (shortcutType) { @@ -181,34 +178,39 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter { resources, R.string.search_shortcut_call_number, mBidiFormatter.unicodeWrap(number, TextDirectionHeuristics.LTR)); - drawableId = R.drawable.ic_search_phone; + drawable = ContextCompat.getDrawable(getContext(), R.drawable.quantum_ic_call_vd_theme_24); break; case SHORTCUT_CREATE_NEW_CONTACT: text = resources.getString(R.string.search_shortcut_create_new_contact); - drawableId = R.drawable.ic_search_add_contact; + drawable = + ContextCompat.getDrawable(getContext(), R.drawable.quantum_ic_person_add_vd_theme_24); + drawable.setAutoMirrored(true); break; case SHORTCUT_ADD_TO_EXISTING_CONTACT: text = resources.getString(R.string.search_shortcut_add_to_contact); - drawableId = R.drawable.quantum_ic_person_white_24; + drawable = + ContextCompat.getDrawable(getContext(), R.drawable.quantum_ic_person_add_vd_theme_24); break; case SHORTCUT_SEND_SMS_MESSAGE: text = resources.getString(R.string.search_shortcut_send_sms_message); - drawableId = R.drawable.quantum_ic_message_white_24; + drawable = + ContextCompat.getDrawable(getContext(), R.drawable.quantum_ic_message_vd_theme_24); break; case SHORTCUT_MAKE_VIDEO_CALL: text = resources.getString(R.string.search_shortcut_make_video_call); - drawableId = R.drawable.quantum_ic_videocam_white_24; + drawable = + ContextCompat.getDrawable(getContext(), R.drawable.quantum_ic_videocam_vd_theme_24); break; case SHORTCUT_BLOCK_NUMBER: text = resources.getString(R.string.search_shortcut_block_number); - drawableId = R.drawable.ic_not_interested_googblue_24dp; + drawable = + ContextCompat.getDrawable(getContext(), R.drawable.ic_not_interested_googblue_24dp); break; default: throw new IllegalArgumentException("Invalid shortcut type"); } - v.setDrawableResource(drawableId); + v.setDrawable(drawable); v.setDisplayName(text); - v.setPhotoPosition(super.getPhotoPosition()); v.setAdjustSelectionBoundsEnabled(false); } diff --git a/java/com/android/dialer/app/list/DialerViewPager.java b/java/com/android/dialer/app/list/DialerViewPager.java new file mode 100644 index 000000000..ae99f0521 --- /dev/null +++ b/java/com/android/dialer/app/list/DialerViewPager.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.app.list; + +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; + +/** Class that handles enabling/disabling swiping between @{ViewPagerTabs}. */ +public class DialerViewPager extends ViewPager { + + private boolean enableSwipingPages; + + public DialerViewPager(Context context, AttributeSet attributeSet) { + super(context, attributeSet); + enableSwipingPages = true; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + if (enableSwipingPages) { + return super.onInterceptTouchEvent(event); + } + + return false; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (enableSwipingPages) { + return super.onTouchEvent(event); + } + + return false; + } + + public void setEnableSwipingPages(boolean enabled) { + enableSwipingPages = enabled; + } +} diff --git a/java/com/android/dialer/app/list/DialtactsPagerAdapter.java b/java/com/android/dialer/app/list/DialtactsPagerAdapter.java index dba3d3a93..1fbf0f01a 100644 --- a/java/com/android/dialer/app/list/DialtactsPagerAdapter.java +++ b/java/com/android/dialer/app/list/DialtactsPagerAdapter.java @@ -24,13 +24,12 @@ import android.support.v13.app.FragmentPagerAdapter; import android.view.ViewGroup; import com.android.dialer.app.calllog.CallLogFragment; import com.android.dialer.app.calllog.VisualVoicemailCallLogFragment; -import com.android.dialer.calllog.CallLogComponent; -import com.android.dialer.calllog.CallLogFramework; -import com.android.dialer.calllog.ui.NewCallLogFragment; import com.android.dialer.common.Assert; -import com.android.dialer.common.ConfigProviderBindings; import com.android.dialer.common.LogUtil; +import com.android.dialer.configprovider.ConfigProviderBindings; import com.android.dialer.contactsfragment.ContactsFragment; +import com.android.dialer.contactsfragment.ContactsFragment.ClickAction; +import com.android.dialer.contactsfragment.ContactsFragment.Header; import com.android.dialer.database.CallLogQueryHandler; import com.android.dialer.speeddial.SpeedDialFragment; import com.android.dialer.util.ViewUtil; @@ -58,12 +57,10 @@ public class DialtactsPagerAdapter extends FragmentPagerAdapter { private final List fragments = new ArrayList<>(); private final String[] tabTitles; private final boolean useNewSpeedDialTab; - private final boolean useNewCallLogTab; private final boolean useNewContactsTab; private OldSpeedDialFragment oldSpeedDialFragment; private SpeedDialFragment speedDialFragment; private CallLogFragment callLogFragment; - private NewCallLogFragment newCallLogFragment; private AllContactsFragment oldContactsFragment; private ContactsFragment contactsFragment; private CallLogFragment voicemailFragment; @@ -75,10 +72,8 @@ public class DialtactsPagerAdapter extends FragmentPagerAdapter { super(fm); useNewSpeedDialTab = ConfigProviderBindings.get(context).getBoolean("enable_new_favorites_tab", false); - CallLogFramework callLogFramework = CallLogComponent.get(context).callLogFramework(); - useNewCallLogTab = callLogFramework.isNewCallLogEnabled(context); useNewContactsTab = - ConfigProviderBindings.get(context).getBoolean("enable_new_contacts_tab", false); + ConfigProviderBindings.get(context).getBoolean("enable_new_contacts_tab", true); this.tabTitles = tabTitles; hasActiveVoicemailProvider = hasVoicemailProvider; fragments.addAll(Collections.nCopies(TAB_COUNT_WITH_VOICEMAIL, null)); @@ -106,21 +101,15 @@ public class DialtactsPagerAdapter extends FragmentPagerAdapter { return oldSpeedDialFragment; } case TAB_INDEX_HISTORY: - if (useNewCallLogTab) { - if (newCallLogFragment == null) { - newCallLogFragment = new NewCallLogFragment(); - } - return newCallLogFragment; - } else { - if (callLogFragment == null) { - callLogFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL); - } - return callLogFragment; + if (callLogFragment == null) { + callLogFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL); } + return callLogFragment; case TAB_INDEX_ALL_CONTACTS: if (useNewContactsTab) { if (contactsFragment == null) { - contactsFragment = new ContactsFragment(); + contactsFragment = + ContactsFragment.newInstance(Header.ADD_CONTACT, ClickAction.OPEN_CONTACT_CARD); } return contactsFragment; } else { @@ -156,8 +145,6 @@ public class DialtactsPagerAdapter extends FragmentPagerAdapter { speedDialFragment = (SpeedDialFragment) fragment; } else if (fragment instanceof CallLogFragment && position == TAB_INDEX_HISTORY) { callLogFragment = (CallLogFragment) fragment; - } else if (fragment instanceof NewCallLogFragment) { - newCallLogFragment = (NewCallLogFragment) fragment; } else if (fragment instanceof ContactsFragment) { contactsFragment = (ContactsFragment) fragment; } else if (fragment instanceof AllContactsFragment) { diff --git a/java/com/android/dialer/app/list/ListsFragment.java b/java/com/android/dialer/app/list/ListsFragment.java index 8dd52a9d4..86a3d2fbb 100644 --- a/java/com/android/dialer/app/list/ListsFragment.java +++ b/java/com/android/dialer/app/list/ListsFragment.java @@ -31,7 +31,6 @@ import android.os.Handler; import android.os.Trace; import android.preference.PreferenceManager; import android.provider.VoicemailContract; -import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.LayoutInflater; import android.view.View; @@ -44,9 +43,12 @@ import com.android.dialer.app.voicemail.error.VoicemailStatusCorruptionHandler; import com.android.dialer.app.voicemail.error.VoicemailStatusCorruptionHandler.Source; import com.android.dialer.common.LogUtil; import com.android.dialer.database.CallLogQueryHandler; +import com.android.dialer.database.CallLogQueryHandler.Listener; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; import com.android.dialer.logging.ScreenEvent; +import com.android.dialer.logging.UiAction; +import com.android.dialer.performancereport.PerformanceReport; import com.android.dialer.speeddial.SpeedDialFragment; import com.android.dialer.util.PermissionsUtil; import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker; @@ -60,11 +62,11 @@ import java.util.ArrayList; * Contacts list. This will also eventually contain the logic that allows sliding the ViewPager * containing the lists up above the search bar and pin it against the top of the screen. */ -public class ListsFragment extends Fragment - implements ViewPager.OnPageChangeListener, CallLogQueryHandler.Listener { +public class ListsFragment extends Fragment implements OnPageChangeListener, Listener { private static final String TAG = "ListsFragment"; - private ViewPager mViewPager; + + private DialerViewPager mViewPager; private ViewPagerTabs mViewPagerTabs; private DialtactsPagerAdapter mAdapter; private RemoveView mRemoveView; @@ -73,14 +75,15 @@ public class ListsFragment extends Fragment private SharedPreferences mPrefs; private boolean mHasFetchedVoicemailStatus; private boolean mShowVoicemailTabAfterVoicemailStatusIsFetched; - private VoicemailStatusHelper mVoicemailStatusHelper; private final ArrayList mOnPageChangeListeners = new ArrayList<>(); /** The position of the currently selected tab. */ private int mTabIndex = TAB_INDEX_SPEED_DIAL; - private boolean mPaused; + private boolean mPaused; private CallLogQueryHandler mCallLogQueryHandler; + private UiAction.Type[] actionTypeList; + private final ContentObserver mVoicemailStatusObserver = new ContentObserver(new Handler()) { @Override @@ -95,8 +98,7 @@ public class ListsFragment extends Fragment LogUtil.d("ListsFragment.onCreate", null); Trace.beginSection(TAG + " onCreate"); super.onCreate(savedInstanceState); - mVoicemailStatusHelper = new VoicemailStatusHelper(); - mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); + mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); Trace.endSection(); } @@ -151,6 +153,12 @@ public class ListsFragment extends Fragment Trace.endSection(); Trace.beginSection(TAG + " setup views"); + actionTypeList = new UiAction.Type[TAB_COUNT_WITH_VOICEMAIL]; + actionTypeList[TAB_INDEX_SPEED_DIAL] = UiAction.Type.CHANGE_TAB_TO_FAVORITE; + actionTypeList[TAB_INDEX_HISTORY] = UiAction.Type.CHANGE_TAB_TO_CALL_LOG; + actionTypeList[TAB_INDEX_ALL_CONTACTS] = UiAction.Type.CHANGE_TAB_TO_CONTACTS; + actionTypeList[TAB_INDEX_VOICEMAIL] = UiAction.Type.CHANGE_TAB_TO_VOICEMAIL; + String[] tabTitles = new String[TAB_COUNT_WITH_VOICEMAIL]; tabTitles[TAB_INDEX_SPEED_DIAL] = getResources().getString(R.string.tab_speed_dial); tabTitles[TAB_INDEX_HISTORY] = getResources().getString(R.string.tab_history); @@ -163,7 +171,7 @@ public class ListsFragment extends Fragment tabIcons[TAB_INDEX_ALL_CONTACTS] = R.drawable.quantum_ic_people_white_24; tabIcons[TAB_INDEX_VOICEMAIL] = R.drawable.quantum_ic_voicemail_white_24; - mViewPager = (ViewPager) parentView.findViewById(R.id.lists_pager); + mViewPager = (DialerViewPager) parentView.findViewById(R.id.lists_pager); mAdapter = new DialtactsPagerAdapter( getContext(), @@ -180,7 +188,6 @@ public class ListsFragment extends Fragment mViewPagerTabs.configureTabIcons(tabIcons); mViewPagerTabs.setViewPager(mViewPager); addOnPageChangeListener(mViewPagerTabs); - mRemoveView = (RemoveView) parentView.findViewById(R.id.remove_view); mRemoveViewContent = parentView.findViewById(R.id.remove_view_content); @@ -191,7 +198,7 @@ public class ListsFragment extends Fragment .registerContentObserver( VoicemailContract.Status.CONTENT_URI, true, mVoicemailStatusObserver); } else { - LogUtil.w("ListsFragment.onCreateView", "no voicemail read/add permissions"); + LogUtil.w("ListsFragment.onCreateView", "no voicemail read permissions"); } Trace.endSection(); @@ -213,8 +220,8 @@ public class ListsFragment extends Fragment /** * Shows the tab with the specified index. If the voicemail tab index is specified, but the - * voicemail status hasn't been fetched, it will try to show the tab after the voicemail status - * has been fetched. + * voicemail status hasn't been fetched, it will show the speed dial tab and try to show the + * voicemail tab after the voicemail status has been fetched. */ public void showTab(int index) { if (index == TAB_INDEX_VOICEMAIL) { @@ -241,6 +248,8 @@ public class ListsFragment extends Fragment @Override public void onPageSelected(int position) { + PerformanceReport.recordClick(actionTypeList[position]); + LogUtil.i("ListsFragment.onPageSelected", "position: %d", position); mTabIndex = mAdapter.getRtlPosition(position); @@ -283,7 +292,7 @@ public class ListsFragment extends Fragment // Update hasActiveVoicemailProvider, which controls the number of tabs displayed. boolean hasActiveVoicemailProvider = - mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor) > 0; + VoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor) > 0; if (hasActiveVoicemailProvider != mAdapter.hasActiveVoicemailProvider()) { mAdapter.setHasActiveVoicemailProvider(hasActiveVoicemailProvider); mAdapter.notifyDataSetChanged(); @@ -375,7 +384,7 @@ public class ListsFragment extends Fragment public void markMissedCallsAsReadAndRemoveNotifications() { if (mCallLogQueryHandler != null) { mCallLogQueryHandler.markMissedCallsAsRead(); - CallLogNotificationsService.markNewMissedCallsAsOld(getContext(), null); + CallLogNotificationsService.cancelAllMissedCalls(getContext()); } } @@ -385,6 +394,11 @@ public class ListsFragment extends Fragment mRemoveView.animate().alpha(show ? 1 : 0).start(); } + public void showMultiSelectRemoveView(boolean show) { + mViewPagerTabs.setVisibility(show ? View.GONE : View.VISIBLE); + mViewPager.setEnableSwipingPages(!show); + } + public boolean hasFrequents() { Fragment page = mAdapter.getItem(mAdapter.getRtlPosition(TAB_INDEX_SPEED_DIAL)); return page instanceof OldSpeedDialFragment diff --git a/java/com/android/dialer/app/list/OldSpeedDialFragment.java b/java/com/android/dialer/app/list/OldSpeedDialFragment.java index 40fe74565..afc7c133b 100644 --- a/java/com/android/dialer/app/list/OldSpeedDialFragment.java +++ b/java/com/android/dialer/app/list/OldSpeedDialFragment.java @@ -45,18 +45,18 @@ import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.ImageView; import android.widget.ListView; -import com.android.contacts.common.ContactPhotoManager; import com.android.contacts.common.ContactTileLoaderFactory; import com.android.contacts.common.list.ContactTileView; import com.android.contacts.common.list.OnPhoneNumberPickerActionListener; import com.android.dialer.app.R; -import com.android.dialer.app.widget.EmptyContentView; -import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.callintent.CallSpecificAppData; import com.android.dialer.common.LogUtil; +import com.android.dialer.contactphoto.ContactPhotoManager; import com.android.dialer.util.PermissionsUtil; import com.android.dialer.util.ViewUtil; +import com.android.dialer.widget.EmptyContentView; import java.util.ArrayList; +import java.util.Arrays; /** This fragment displays the user's favorite/frequent contacts in a grid. */ public class OldSpeedDialFragment extends Fragment @@ -404,9 +404,15 @@ public class OldSpeedDialFragment extends Fragment return; } - if (!PermissionsUtil.hasPermission(activity, READ_CONTACTS)) { + String[] deniedPermissions = + PermissionsUtil.getPermissionsCurrentlyDenied( + getContext(), PermissionsUtil.allContactsGroupPermissionsUsedInDialer); + if (deniedPermissions.length > 0) { + LogUtil.i( + "OldSpeedDialFragment.onEmptyViewActionButtonClicked", + "Requesting permissions: " + Arrays.toString(deniedPermissions)); FragmentCompat.requestPermissions( - this, new String[] {READ_CONTACTS}, READ_CONTACTS_PERMISSION_REQUEST_CODE); + this, deniedPermissions, READ_CONTACTS_PERMISSION_REQUEST_CODE); } else { // Switch tabs ((HostInterface) activity).showAllContactsTab(); @@ -430,7 +436,7 @@ public class OldSpeedDialFragment extends Fragment void showAllContactsTab(); } - private class ContactTileLoaderListener implements LoaderManager.LoaderCallbacks { + class ContactTileLoaderListener implements LoaderManager.LoaderCallbacks { @Override public CursorLoader onCreateLoader(int id, Bundle args) { @@ -460,24 +466,17 @@ public class OldSpeedDialFragment extends Fragment private class ContactTileAdapterListener implements ContactTileView.Listener { @Override - public void onContactSelected(Uri contactUri, Rect targetRect) { + public void onContactSelected( + Uri contactUri, Rect targetRect, CallSpecificAppData callSpecificAppData) { if (mPhoneNumberPickerActionListener != null) { - CallSpecificAppData callSpecificAppData = - CallSpecificAppData.newBuilder() - .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL) - .build(); mPhoneNumberPickerActionListener.onPickDataUri( contactUri, false /* isVideoCall */, callSpecificAppData); } } @Override - public void onCallNumberDirectly(String phoneNumber) { + public void onCallNumberDirectly(String phoneNumber, CallSpecificAppData callSpecificAppData) { if (mPhoneNumberPickerActionListener != null) { - CallSpecificAppData callSpecificAppData = - CallSpecificAppData.newBuilder() - .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL) - .build(); mPhoneNumberPickerActionListener.onPickPhoneNumber( phoneNumber, false /* isVideoCall */, callSpecificAppData); } diff --git a/java/com/android/dialer/app/list/PhoneFavoriteListView.java b/java/com/android/dialer/app/list/PhoneFavoriteListView.java index 9516f0611..f4f395ff0 100644 --- a/java/com/android/dialer/app/list/PhoneFavoriteListView.java +++ b/java/com/android/dialer/app/list/PhoneFavoriteListView.java @@ -1,6 +1,5 @@ /* - * Copyright (C) 2012 Google Inc. - * Licensed to The Android Open Source Project. + * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +23,6 @@ import android.content.res.Configuration; import android.graphics.Bitmap; import android.os.Handler; import android.util.AttributeSet; -import android.util.Log; import android.view.DragEvent; import android.view.MotionEvent; import android.view.View; @@ -33,6 +31,7 @@ import android.widget.GridView; import android.widget.ImageView; import com.android.dialer.app.R; import com.android.dialer.app.list.DragDropController.DragItemContainer; +import com.android.dialer.common.LogUtil; /** Viewgroup that presents the user's speed dial contacts in a grid. */ public class PhoneFavoriteListView extends GridView @@ -40,14 +39,14 @@ public class PhoneFavoriteListView extends GridView public static final String LOG_TAG = PhoneFavoriteListView.class.getSimpleName(); final int[] mLocationOnScreen = new int[2]; - private final long SCROLL_HANDLER_DELAY_MILLIS = 5; - private final int DRAG_SCROLL_PX_UNIT = 25; - private final float DRAG_SHADOW_ALPHA = 0.7f; + private static final long SCROLL_HANDLER_DELAY_MILLIS = 5; + private static final int DRAG_SCROLL_PX_UNIT = 25; + private static final float DRAG_SHADOW_ALPHA = 0.7f; /** * {@link #mTopScrollBound} and {@link mBottomScrollBound} will be offseted to the top / bottom by * {@link #getHeight} * {@link #BOUND_GAP_RATIO} pixels. */ - private final float BOUND_GAP_RATIO = 0.2f; + private static final float BOUND_GAP_RATIO = 0.2f; private float mTouchSlop; private int mTopScrollBound; @@ -67,7 +66,6 @@ public class PhoneFavoriteListView extends GridView } }; private boolean mIsDragScrollerRunning = false; - private int mTouchDownForDragStartX; private int mTouchDownForDragStartY; private Bitmap mDragShadowBitmap; private ImageView mDragShadowOverlay; @@ -98,7 +96,7 @@ public class PhoneFavoriteListView extends GridView } public PhoneFavoriteListView(Context context, AttributeSet attrs) { - this(context, attrs, -1); + this(context, attrs, 0); } public PhoneFavoriteListView(Context context, AttributeSet attrs, int defStyle) { @@ -121,7 +119,6 @@ public class PhoneFavoriteListView extends GridView @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { - mTouchDownForDragStartX = (int) ev.getX(); mTouchDownForDragStartY = (int) ev.getY(); } @@ -287,7 +284,7 @@ public class PhoneFavoriteListView extends GridView try { bitmap = cache.copy(Bitmap.Config.ARGB_8888, false); } catch (final OutOfMemoryError e) { - Log.w(LOG_TAG, "Failed to copy bitmap from Drawing cache", e); + LogUtil.w(LOG_TAG, "Failed to copy bitmap from Drawing cache", e); bitmap = null; } } diff --git a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java index 5a18d039b..40f23ea6f 100644 --- a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java +++ b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java @@ -26,6 +26,8 @@ import android.widget.TextView; import com.android.contacts.common.list.ContactEntry; import com.android.dialer.app.R; import com.android.dialer.compat.CompatUtils; +import com.android.dialer.logging.InteractionEvent; +import com.android.dialer.logging.Logger; /** Displays the contact's picture overlaid with their name and number type in a tile. */ public class PhoneFavoriteSquareTileView extends PhoneFavoriteTileView { @@ -87,6 +89,8 @@ public class PhoneFavoriteSquareTileView extends PhoneFavoriteTileView { new OnClickListener() { @Override public void onClick(View v) { + Logger.get(getContext()) + .logInteraction(InteractionEvent.Type.SPEED_DIAL_OPEN_CONTACT_CARD); launchQuickContact(); } }); diff --git a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java index db89cf3dc..e0961be4b 100644 --- a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java +++ b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java @@ -18,16 +18,25 @@ package com.android.dialer.app.list; import android.content.ClipData; import android.content.Context; +import android.net.Uri; +import android.provider.ContactsContract.PinnedPositions; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; -import com.android.contacts.common.ContactPhotoManager; -import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest; import com.android.contacts.common.MoreContactUtils; import com.android.contacts.common.list.ContactEntry; import com.android.contacts.common.list.ContactTileView; +import com.android.contacts.common.model.ContactLoader; import com.android.dialer.app.R; +import com.android.dialer.callintent.CallInitiationType; +import com.android.dialer.callintent.CallSpecificAppData; +import com.android.dialer.callintent.SpeedDialContactType; +import com.android.dialer.common.LogUtil; +import com.android.dialer.contactphoto.ContactPhotoManager.DefaultImageRequest; +import com.android.dialer.lettertile.LetterTileDrawable; +import com.android.dialer.logging.InteractionEvent; +import com.android.dialer.logging.Logger; /** * A light version of the {@link com.android.contacts.common.list.ContactTileView} that is used in @@ -42,7 +51,6 @@ public abstract class PhoneFavoriteTileView extends ContactTileView { // tile is long pressed. static final String DRAG_PHONE_FAVORITE_TILE = "PHONE_FAVORITE_TILE"; private static final String TAG = PhoneFavoriteTileView.class.getSimpleName(); - private static final boolean DEBUG = false; // These parameters instruct the photo manager to display the default image/letter at 70% of // its normal size, and vertically offset upwards 12% towards the top of the letter tile, to // make room for the contact name and number label at the bottom of the image. @@ -55,6 +63,9 @@ public abstract class PhoneFavoriteTileView extends ContactTileView { private View mShadowOverlay; /** Users' most frequent phone number. */ private String mPhoneNumberString; + private boolean isPinned; + private boolean isStarred; + private int position = -1; public PhoneFavoriteTileView(Context context, AttributeSet attrs) { super(context, attrs); @@ -83,12 +94,14 @@ public abstract class PhoneFavoriteTileView extends ContactTileView { super.loadFromContact(entry); // Set phone number to null in case we're reusing the view. mPhoneNumberString = null; + isPinned = (entry.pinned != PinnedPositions.UNPINNED); + isStarred = entry.isFavorite; if (entry != null) { + sendViewNotification(getContext(), entry.lookupUri); // Grab the phone-number to call directly. See {@link onClick()}. mPhoneNumberString = entry.phoneNumber; - // If this is a blank entry, don't show anything. - // TODO krelease: Just hide the view for now. For this to truly look like an empty row + // If this is a blank entry, don't show anything. For this to truly look like an empty row // the entire ContactTileRow needs to be hidden. if (entry == ContactEntry.BLANK_ENTRY) { setVisibility(View.INVISIBLE); @@ -113,16 +126,37 @@ public abstract class PhoneFavoriteTileView extends ContactTileView { if (mListener == null) { return; } + + CallSpecificAppData.Builder callSpecificAppData = + CallSpecificAppData.newBuilder() + .setAllowAssistedDialing(true) + .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL) + .setSpeedDialContactPosition(position); + if (isStarred) { + callSpecificAppData.addSpeedDialContactType(SpeedDialContactType.Type.STARRED_CONTACT); + } else { + callSpecificAppData.addSpeedDialContactType(SpeedDialContactType.Type.FREQUENT_CONTACT); + } + if (isPinned) { + callSpecificAppData.addSpeedDialContactType(SpeedDialContactType.Type.PINNED_CONTACT); + } + if (TextUtils.isEmpty(mPhoneNumberString)) { + // Don't set performance report now, since user may spend some time on picking a number + // Copy "superclass" implementation + Logger.get(getContext()) + .logInteraction(InteractionEvent.Type.SPEED_DIAL_CLICK_CONTACT_WITH_AMBIGUOUS_NUMBER); mListener.onContactSelected( - getLookupUri(), MoreContactUtils.getTargetRectFromView(PhoneFavoriteTileView.this)); + getLookupUri(), + MoreContactUtils.getTargetRectFromView(PhoneFavoriteTileView.this), + callSpecificAppData.build()); } else { // When you tap a frequently-called contact, you want to // call them at the number that you usually talk to them // at (i.e. the one displayed in the UI), regardless of // whether that's their default number. - mListener.onCallNumberDirectly(mPhoneNumberString); + mListener.onCallNumberDirectly(mPhoneNumberString, callSpecificAppData.build()); } } }; @@ -133,7 +167,7 @@ public abstract class PhoneFavoriteTileView extends ContactTileView { return new DefaultImageRequest( displayName, lookupKey, - ContactPhotoManager.TYPE_DEFAULT, + LetterTileDrawable.TYPE_DEFAULT, DEFAULT_IMAGE_LETTER_SCALE, DEFAULT_IMAGE_LETTER_OFFSET, false); @@ -152,4 +186,26 @@ public abstract class PhoneFavoriteTileView extends ContactTileView { // Unlike Contacts' tiles, the Dialer's favorites tiles are square. return false; } + + public void setPosition(int position) { + this.position = position; + } + + /** + * Send a notification using a {@link ContactLoader} to inform the sync adapter that we are + * viewing a particular contact, so that it can download the high-res photo. + */ + private static void sendViewNotification(Context context, Uri contactUri) { + ContactLoader loader = new ContactLoader(context, contactUri, true /* postViewNotification */); + loader.registerListener( + 0, + (loader1, contact) -> { + try { + loader1.reset(); + } catch (RuntimeException e) { + LogUtil.e("PhoneFavoriteTileView.onLoadComplete", "error resetting loader", e); + } + }); + loader.startLoading(); + } } diff --git a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java index c692ecac7..cd5712eed 100644 --- a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java +++ b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java @@ -30,17 +30,21 @@ import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.PinnedPositions; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; -import android.util.Log; import android.util.LongSparseArray; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; -import com.android.contacts.common.ContactPhotoManager; import com.android.contacts.common.ContactTileLoaderFactory; import com.android.contacts.common.list.ContactEntry; import com.android.contacts.common.list.ContactTileView; import com.android.contacts.common.preference.ContactsPreferences; import com.android.dialer.app.R; +import com.android.dialer.common.LogUtil; +import com.android.dialer.contactphoto.ContactPhotoManager; +import com.android.dialer.lightbringer.Lightbringer; +import com.android.dialer.lightbringer.LightbringerComponent; +import com.android.dialer.logging.InteractionEvent; +import com.android.dialer.logging.Logger; import com.android.dialer.shortcuts.ShortcutRefresher; import com.google.common.collect.ComparisonChain; import java.util.ArrayList; @@ -190,6 +194,14 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop // Track the length of {@link #mContactEntries} and compare to {@link #TILES_SOFT_LIMIT}. int counter = 0; + // Data for logging + int starredContactsCount = 0; + int pinnedContactsCount = 0; + int multipleNumbersContactsCount = 0; + int contactsWithPhotoCount = 0; + int contactsWithNameCount = 0; + int lightbringerReachableContactsCount = 0; + // The cursor should not be closed since this is invoked from a CursorLoader. if (cursor.moveToFirst()) { int starredColumn = cursor.getColumnIndexOrThrow(Contacts.STARRED); @@ -262,6 +274,22 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop contact.pinned = pinned; mContactEntries.add(contact); + // Set counts for logging + if (isStarred) { + // mNumStarred might be larger than the number of visible starred contact, + // since it includes invisible ones (starred contact with no phone number). + starredContactsCount++; + } + if (pinned != PinnedPositions.UNPINNED) { + pinnedContactsCount++; + } + if (!TextUtils.isEmpty(name)) { + contactsWithNameCount++; + } + if (photoUri != null) { + contactsWithPhotoCount++; + } + duplicates.put(id, contact); counter++; @@ -274,6 +302,47 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop ShortcutRefresher.refresh(mContext, mContactEntries); notifyDataSetChanged(); + + Lightbringer lightbringer = LightbringerComponent.get(mContext).getLightbringer(); + for (ContactEntry contact : mContactEntries) { + if (contact.phoneNumber == null) { + multipleNumbersContactsCount++; + } else if (lightbringer.isReachable(mContext, contact.phoneNumber)) { + lightbringerReachableContactsCount++; + } + } + + Logger.get(mContext) + .logSpeedDialContactComposition( + counter, + starredContactsCount, + pinnedContactsCount, + multipleNumbersContactsCount, + contactsWithPhotoCount, + contactsWithNameCount, + lightbringerReachableContactsCount); + // Logs for manual testing + LogUtil.v("PhoneFavoritesTileAdapter.saveCursorToCache", "counter: %d", counter); + LogUtil.v( + "PhoneFavoritesTileAdapter.saveCursorToCache", + "starredContactsCount: %d", + starredContactsCount); + LogUtil.v( + "PhoneFavoritesTileAdapter.saveCursorToCache", + "pinnedContactsCount: %d", + pinnedContactsCount); + LogUtil.v( + "PhoneFavoritesTileAdapter.saveCursorToCache", + "multipleNumbersContactsCount: %d", + multipleNumbersContactsCount); + LogUtil.v( + "PhoneFavoritesTileAdapter.saveCursorToCache", + "contactsWithPhotoCount: %d", + contactsWithPhotoCount); + LogUtil.v( + "PhoneFavoritesTileAdapter.saveCursorToCache", + "contactsWithNameCount: %d", + contactsWithNameCount); } /** Iterates over the {@link Cursor} Returns position of the first NON Starred Contact */ @@ -347,7 +416,7 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop @Override public void notifyDataSetChanged() { if (DEBUG) { - Log.v(TAG, "notifyDataSetChanged"); + LogUtil.v(TAG, "notifyDataSetChanged"); } super.notifyDataSetChanged(); } @@ -355,7 +424,7 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop @Override public View getView(int position, View convertView, ViewGroup parent) { if (DEBUG) { - Log.v(TAG, "get view for " + String.valueOf(position)); + LogUtil.v(TAG, "get view for " + position); } PhoneFavoriteTileView tileView = null; @@ -371,6 +440,7 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop tileView.setPhotoManager(mPhotoManager); tileView.setListener(mListener); tileView.loadFromContact(getItem(position)); + tileView.setPosition(position); return tileView; } @@ -455,8 +525,9 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop // update the database here with the new pinned positions try { mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operations); + Logger.get(mContext).logInteraction(InteractionEvent.Type.SPEED_DIAL_PIN_CONTACT); } catch (RemoteException | OperationApplicationException e) { - Log.e(TAG, "Exception thrown when pinning contacts", e); + LogUtil.e(TAG, "Exception thrown when pinning contacts", e); } } } @@ -609,6 +680,7 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements OnDragDrop if (mDraggedEntry != null) { unstarAndUnpinContact(mDraggedEntry.lookupUri); mAwaitingRemove = true; + Logger.get(mContext).logInteraction(InteractionEvent.Type.SPEED_DIAL_REMOVE_CONTACT); } } diff --git a/java/com/android/dialer/app/list/RegularSearchFragment.java b/java/com/android/dialer/app/list/RegularSearchFragment.java index 02896793b..73120c547 100644 --- a/java/com/android/dialer/app/list/RegularSearchFragment.java +++ b/java/com/android/dialer/app/list/RegularSearchFragment.java @@ -18,19 +18,28 @@ package com.android.dialer.app.list; import static android.Manifest.permission.READ_CONTACTS; import android.app.Activity; +import android.content.Context; import android.content.pm.PackageManager; +import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v13.app.FragmentCompat; import android.view.LayoutInflater; import android.view.ViewGroup; import com.android.contacts.common.list.ContactEntryListAdapter; import com.android.contacts.common.list.PinnedHeaderListView; import com.android.dialer.app.R; -import com.android.dialer.app.widget.EmptyContentView; -import com.android.dialer.app.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; import com.android.dialer.callintent.CallInitiationType; +import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DialerExecutor; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutors; import com.android.dialer.phonenumbercache.CachedNumberLookupService; +import com.android.dialer.phonenumbercache.CachedNumberLookupService.CachedContactInfo; import com.android.dialer.phonenumbercache.PhoneNumberCache; import com.android.dialer.util.PermissionsUtil; +import com.android.dialer.widget.EmptyContentView; +import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; +import java.util.Arrays; public class RegularSearchFragment extends SearchFragment implements OnEmptyViewActionButtonClickedListener, @@ -41,6 +50,8 @@ public class RegularSearchFragment extends SearchFragment private static final int SEARCH_DIRECTORY_RESULT_LIMIT = 5; protected String mPermissionToRequest; + private DialerExecutor addContactTask; + public RegularSearchFragment() { configureDirectorySearch(); } @@ -50,6 +61,18 @@ public class RegularSearchFragment extends SearchFragment setDirectoryResultLimit(SEARCH_DIRECTORY_RESULT_LIMIT); } + @Override + public void onCreate(Bundle savedState) { + super.onCreate(savedState); + + addContactTask = + DialerExecutors.createUiTaskBuilder( + getFragmentManager(), + "RegularSearchFragment.addContact", + new AddContactWorker(getContext().getApplicationContext())) + .build(); + } + @Override protected void onCreateView(LayoutInflater inflater, ViewGroup container) { super.onCreateView(inflater, container); @@ -71,8 +94,9 @@ public class RegularSearchFragment extends SearchFragment PhoneNumberCache.get(getContext()).getCachedNumberLookupService(); if (cachedNumberLookupService != null) { final RegularSearchListAdapter adapter = (RegularSearchListAdapter) getAdapter(); - cachedNumberLookupService.addContact( - getContext(), adapter.getContactInfo(cachedNumberLookupService, position)); + CachedContactInfo cachedContactInfo = + adapter.getContactInfo(cachedNumberLookupService, position); + addContactTask.executeSerial(cachedContactInfo); } } @@ -114,8 +138,15 @@ public class RegularSearchFragment extends SearchFragment } if (READ_CONTACTS.equals(mPermissionToRequest)) { - FragmentCompat.requestPermissions( - this, new String[] {mPermissionToRequest}, PERMISSION_REQUEST_CODE); + String[] deniedPermissions = + PermissionsUtil.getPermissionsCurrentlyDenied( + getContext(), PermissionsUtil.allContactsGroupPermissionsUsedInDialer); + if (deniedPermissions.length > 0) { + LogUtil.i( + "RegularSearchFragment.onEmptyViewActionButtonClicked", + "Requesting permissions: " + Arrays.toString(deniedPermissions)); + FragmentCompat.requestPermissions(this, deniedPermissions, PERMISSION_REQUEST_CODE); + } } } @@ -143,4 +174,24 @@ public class RegularSearchFragment extends SearchFragment boolean isNearbyPlacesSearchEnabled(); } + + private static class AddContactWorker implements Worker { + + private final Context appContext; + + private AddContactWorker(Context appContext) { + this.appContext = appContext; + } + + @Nullable + @Override + public Void doInBackground(@Nullable CachedContactInfo contactInfo) throws Throwable { + CachedNumberLookupService cachedNumberLookupService = + PhoneNumberCache.get(appContext).getCachedNumberLookupService(); + if (cachedNumberLookupService != null) { + cachedNumberLookupService.addContact(appContext, contactInfo); + } + return null; + } + } } diff --git a/java/com/android/dialer/app/list/RemoveView.java b/java/com/android/dialer/app/list/RemoveView.java index 3b917db43..1d566c5a0 100644 --- a/java/com/android/dialer/app/list/RemoveView.java +++ b/java/com/android/dialer/app/list/RemoveView.java @@ -41,7 +41,7 @@ public class RemoveView extends FrameLayout { } public RemoveView(Context context, AttributeSet attrs) { - this(context, attrs, -1); + this(context, attrs, 0); } public RemoveView(Context context, AttributeSet attrs, int defStyle) { diff --git a/java/com/android/dialer/app/list/SearchFragment.java b/java/com/android/dialer/app/list/SearchFragment.java index fcf8236e3..e21e073bd 100644 --- a/java/com/android/dialer/app/list/SearchFragment.java +++ b/java/com/android/dialer/app/list/SearchFragment.java @@ -34,19 +34,20 @@ import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Space; import com.android.contacts.common.list.ContactEntryListAdapter; -import com.android.contacts.common.list.ContactListItemView; import com.android.contacts.common.list.OnPhoneNumberPickerActionListener; import com.android.contacts.common.list.PhoneNumberPickerFragment; import com.android.dialer.animation.AnimUtils; import com.android.dialer.app.R; -import com.android.dialer.app.dialpad.DialpadFragment.ErrorDialogFragment; import com.android.dialer.app.widget.DialpadSearchEmptyContentView; -import com.android.dialer.app.widget.EmptyContentView; import com.android.dialer.callintent.CallSpecificAppData; import com.android.dialer.common.LogUtil; +import com.android.dialer.dialpadview.DialpadFragment.ErrorDialogFragment; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; import com.android.dialer.util.DialerUtils; import com.android.dialer.util.IntentUtil; import com.android.dialer.util.PermissionsUtil; +import com.android.dialer.widget.EmptyContentView; public class SearchFragment extends PhoneNumberPickerFragment { @@ -80,7 +81,6 @@ public class SearchFragment extends PhoneNumberPickerFragment { setQuickContactEnabled(true); setAdjustSelectionBoundsEnabled(false); setDarkTheme(false); - setPhotoPosition(ContactListItemView.getDefaultPhotoPosition(false /* opposite */)); setUseCallableUri(true); try { @@ -98,9 +98,6 @@ public class SearchFragment extends PhoneNumberPickerFragment { public void onStart() { LogUtil.d("SearchFragment.onStart", ""); super.onStart(); - if (isSearchMode()) { - getAdapter().setHasHeader(0, false); - } mActivity = (HostInterface) getActivity(); @@ -172,16 +169,6 @@ public class SearchFragment extends PhoneNumberPickerFragment { return animator; } - @Override - protected void setSearchMode(boolean flag) { - super.setSearchMode(flag); - // This hides the "All contacts with phone numbers" header in the search fragment - final ContactEntryListAdapter adapter = getAdapter(); - if (adapter != null) { - adapter.setHasHeader(0, false); - } - } - public void setAddToContactNumber(String addToContactNumber) { mAddToContactNumber = addToContactNumber; } @@ -249,6 +236,10 @@ public class SearchFragment extends PhoneNumberPickerFragment { } break; case DialerPhoneNumberListAdapter.SHORTCUT_CREATE_NEW_CONTACT: + if (this instanceof SmartDialSearchFragment) { + Logger.get(getContext()) + .logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_DIALPAD); + } number = TextUtils.isEmpty(mAddToContactNumber) ? adapter.getFormattedQueryString() @@ -257,6 +248,10 @@ public class SearchFragment extends PhoneNumberPickerFragment { DialerUtils.startActivityWithErrorToast(getActivity(), intent); break; case DialerPhoneNumberListAdapter.SHORTCUT_ADD_TO_EXISTING_CONTACT: + if (this instanceof SmartDialSearchFragment) { + Logger.get(getContext()) + .logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_DIALPAD); + } number = TextUtils.isEmpty(mAddToContactNumber) ? adapter.getFormattedQueryString() diff --git a/java/com/android/dialer/app/list/SmartDialNumberListAdapter.java b/java/com/android/dialer/app/list/SmartDialNumberListAdapter.java index 566a15d53..3b00c7643 100644 --- a/java/com/android/dialer/app/list/SmartDialNumberListAdapter.java +++ b/java/com/android/dialer/app/list/SmartDialNumberListAdapter.java @@ -20,9 +20,9 @@ import android.database.Cursor; import android.support.annotation.NonNull; import android.telephony.PhoneNumberUtils; import android.text.TextUtils; -import android.util.Log; import com.android.contacts.common.list.ContactListItemView; -import com.android.dialer.app.dialpad.SmartDialCursorLoader; +import com.android.dialer.common.LogUtil; +import com.android.dialer.dialpadview.SmartDialCursorLoader; import com.android.dialer.smartdial.SmartDialMatchPosition; import com.android.dialer.smartdial.SmartDialNameMatcher; import com.android.dialer.smartdial.SmartDialPrefix; @@ -43,14 +43,14 @@ public class SmartDialNumberListAdapter extends DialerPhoneNumberListAdapter { setShortcutEnabled(SmartDialNumberListAdapter.SHORTCUT_DIRECT_CALL, false); if (DEBUG) { - Log.v(TAG, "Constructing List Adapter"); + LogUtil.v(TAG, "Constructing List Adapter"); } } /** Sets query for the SmartDialCursorLoader. */ public void configureLoader(SmartDialCursorLoader loader) { if (DEBUG) { - Log.v(TAG, "Configure Loader with query" + getQueryString()); + LogUtil.v(TAG, "Configure Loader with query" + getQueryString()); } if (getQueryString() == null) { @@ -77,7 +77,7 @@ public class SmartDialNumberListAdapter extends DialerPhoneNumberListAdapter { for (SmartDialMatchPosition match : nameMatches) { view.addNameHighlightSequence(match.start, match.end); if (DEBUG) { - Log.v( + LogUtil.v( TAG, cursor.getString(PhoneQuery.DISPLAY_NAME) + " " diff --git a/java/com/android/dialer/app/list/SmartDialSearchFragment.java b/java/com/android/dialer/app/list/SmartDialSearchFragment.java index eb1508c72..e97a16c19 100644 --- a/java/com/android/dialer/app/list/SmartDialSearchFragment.java +++ b/java/com/android/dialer/app/list/SmartDialSearchFragment.java @@ -28,12 +28,13 @@ import android.os.Bundle; import android.support.v13.app.FragmentCompat; import com.android.contacts.common.list.ContactEntryListAdapter; import com.android.dialer.app.R; -import com.android.dialer.app.dialpad.SmartDialCursorLoader; -import com.android.dialer.app.widget.EmptyContentView; import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.common.LogUtil; import com.android.dialer.database.DialerDatabaseHelper; +import com.android.dialer.dialpadview.SmartDialCursorLoader; import com.android.dialer.util.PermissionsUtil; +import com.android.dialer.widget.EmptyContentView; +import java.util.Arrays; /** Implements a fragment to load and display SmartDial search results. */ public class SmartDialSearchFragment extends SearchFragment @@ -79,6 +80,11 @@ public class SmartDialSearchFragment extends SearchFragment } } + @Override + public boolean getShowEmptyListForNullQuery() { + return true; + } + @Override protected void setupEmptyView() { if (mEmptyView != null && getActivity() != null) { @@ -123,8 +129,16 @@ public class SmartDialSearchFragment extends SearchFragment return; } - FragmentCompat.requestPermissions( - this, new String[] {CALL_PHONE}, CALL_PHONE_PERMISSION_REQUEST_CODE); + String[] deniedPermissions = + PermissionsUtil.getPermissionsCurrentlyDenied( + getContext(), PermissionsUtil.allPhoneGroupPermissionsUsedInDialer); + if (deniedPermissions.length > 0) { + LogUtil.i( + "SmartDialSearchFragment.onEmptyViewActionButtonClicked", + "Requesting permissions: " + Arrays.toString(deniedPermissions)); + FragmentCompat.requestPermissions( + this, deniedPermissions, CALL_PHONE_PERMISSION_REQUEST_CODE); + } } @Override diff --git a/java/com/android/dialer/app/manifests/activities/AndroidManifest.xml b/java/com/android/dialer/app/manifests/activities/AndroidManifest.xml index ca93da0de..0729d7293 100644 --- a/java/com/android/dialer/app/manifests/activities/AndroidManifest.xml +++ b/java/com/android/dialer/app/manifests/activities/AndroidManifest.xml @@ -19,7 +19,7 @@ - + + @@ -106,6 +107,7 @@ + - - - - - diff --git a/java/com/android/dialer/app/res/drawable/ic_search_phone.xml b/java/com/android/dialer/app/res/drawable/ic_search_phone.xml deleted file mode 100644 index 5d449ee56..000000000 --- a/java/com/android/dialer/app/res/drawable/ic_search_phone.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - diff --git a/java/com/android/dialer/app/res/drawable/ic_speakerphone_off.xml b/java/com/android/dialer/app/res/drawable/ic_speakerphone_off.xml deleted file mode 100644 index f07d0a889..000000000 --- a/java/com/android/dialer/app/res/drawable/ic_speakerphone_off.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/java/com/android/dialer/app/res/drawable/ic_speakerphone_on.xml b/java/com/android/dialer/app/res/drawable/ic_speakerphone_on.xml deleted file mode 100644 index 456a0483e..000000000 --- a/java/com/android/dialer/app/res/drawable/ic_speakerphone_on.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/java/com/android/dialer/app/res/drawable/shadow_fade_left.xml b/java/com/android/dialer/app/res/drawable/shadow_fade_left.xml deleted file mode 100644 index 6271a8f86..000000000 --- a/java/com/android/dialer/app/res/drawable/shadow_fade_left.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - diff --git a/java/com/android/dialer/app/res/drawable/shadow_fade_up.xml b/java/com/android/dialer/app/res/drawable/shadow_fade_up.xml deleted file mode 100644 index 86d37a9bc..000000000 --- a/java/com/android/dialer/app/res/drawable/shadow_fade_up.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/java/com/android/dialer/app/res/layout-land/dialpad_fragment.xml b/java/com/android/dialer/app/res/layout-land/dialpad_fragment.xml deleted file mode 100644 index 45ef933cb..000000000 --- a/java/com/android/dialer/app/res/layout-land/dialpad_fragment.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/com/android/dialer/app/res/layout-land/empty_content_view_dialpad_search.xml b/java/com/android/dialer/app/res/layout-land/empty_content_view_dialpad_search.xml index 5f8068067..59d13636a 100644 --- a/java/com/android/dialer/app/res/layout-land/empty_content_view_dialpad_search.xml +++ b/java/com/android/dialer/app/res/layout-land/empty_content_view_dialpad_search.xml @@ -26,14 +26,14 @@ android:layout_height="0dp" android:layout_weight="1"/> - - - - - - - diff --git a/java/com/android/dialer/app/res/layout/action_mode_close_button.xml b/java/com/android/dialer/app/res/layout/action_mode_close_button.xml new file mode 100644 index 000000000..4cb85d458 --- /dev/null +++ b/java/com/android/dialer/app/res/layout/action_mode_close_button.xml @@ -0,0 +1,31 @@ + + + + + + diff --git a/java/com/android/dialer/app/res/layout/all_contacts_activity.xml b/java/com/android/dialer/app/res/layout/all_contacts_activity.xml deleted file mode 100644 index 72f0a147f..000000000 --- a/java/com/android/dialer/app/res/layout/all_contacts_activity.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - diff --git a/java/com/android/dialer/app/res/layout/all_contacts_fragment.xml b/java/com/android/dialer/app/res/layout/all_contacts_fragment.xml index 17a45208d..422c52991 100644 --- a/java/com/android/dialer/app/res/layout/all_contacts_fragment.xml +++ b/java/com/android/dialer/app/res/layout/all_contacts_fragment.xml @@ -45,7 +45,7 @@ android:cropToPadding="false" android:clipToPadding="false"/> - - + android:layout_height="match_parent" + android:background="@color/background_dialer_light" + android:orientation="vertical"> + + android:id="@+id/call_log_pager" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1"/> + android:id="@+id/floating_action_button_container" + android:layout_width="0dp" + android:layout_height="0dp"/> diff --git a/java/com/android/dialer/app/res/layout/call_log_fragment.xml b/java/com/android/dialer/app/res/layout/call_log_fragment.xml index 64f7c10e6..efc08fbb4 100644 --- a/java/com/android/dialer/app/res/layout/call_log_fragment.xml +++ b/java/com/android/dialer/app/res/layout/call_log_fragment.xml @@ -18,9 +18,39 @@ + + + + + + - - + android:src="@drawable/ic_check_mark_48dp" /> @@ -148,17 +148,34 @@ android:visibility="gone" android:singleLine="true"/> - + android:orientation="vertical"> + + + + + + diff --git a/java/com/android/dialer/app/res/layout/call_log_list_item_actions.xml b/java/com/android/dialer/app/res/layout/call_log_list_item_actions.xml index d3a553130..ec9e5a00e 100644 --- a/java/com/android/dialer/app/res/layout/call_log_list_item_actions.xml +++ b/java/com/android/dialer/app/res/layout/call_log_list_item_actions.xml @@ -35,8 +35,7 @@ + style="@style/CallLogActionStyle"> + android:text="@string/call"/> + android:src="@drawable/ic_phone_attach"/> - - - - - - - - - - diff --git a/java/com/android/dialer/app/res/layout/dialpad_fragment.xml b/java/com/android/dialer/app/res/layout/dialpad_fragment.xml deleted file mode 100644 index dd6dab747..000000000 --- a/java/com/android/dialer/app/res/layout/dialpad_fragment.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/java/com/android/dialer/app/res/layout/empty_content_view.xml b/java/com/android/dialer/app/res/layout/empty_content_view.xml deleted file mode 100644 index 96a6a0262..000000000 --- a/java/com/android/dialer/app/res/layout/empty_content_view.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - diff --git a/java/com/android/dialer/app/res/layout/empty_content_view_dialpad_search.xml b/java/com/android/dialer/app/res/layout/empty_content_view_dialpad_search.xml index e245aaca0..1d2047982 100644 --- a/java/com/android/dialer/app/res/layout/empty_content_view_dialpad_search.xml +++ b/java/com/android/dialer/app/res/layout/empty_content_view_dialpad_search.xml @@ -16,7 +16,7 @@ + android:orientation="vertical" + tools:ignore="UnusedResources"> - - + android:animateLayoutChanges="true"> + + + android:layout_width="match_parent" + android:layout_height="@dimen/action_bar_height_large" + android:background="@color/actionbar_background_color" + android:elevation="@dimen/tab_elevation"/> - - + android:id="@+id/lists_pager_header" + style="@style/DialtactsActionBarTabTextStyle" + android:layout_width="match_parent" + android:layout_height="@dimen/tab_height" + android:layout_gravity="top" + android:elevation="@dimen/tab_elevation" + android:orientation="horizontal" + android:textAllCaps="true"/> + + @@ -58,38 +58,38 @@ This is required since drag and drop event is only sent to views are visible when drag starts. --> + android:id="@+id/remove_view" + android:layout_width="match_parent" + android:layout_height="@dimen/tab_height" + android:layout_marginTop="@dimen/action_bar_height_large" + android:contentDescription="@string/remove_contact" + android:importantForAccessibility="no"> + android:id="@+id/remove_view_content" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/actionbar_background_color" + android:gravity="center" + android:orientation="horizontal" + android:visibility="gone"> + android:id="@+id/remove_view_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:src="@drawable/ic_remove" + android:tint="@color/remove_text_color"/> + android:id="@+id/remove_view_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/remove_contact" + android:textColor="@color/remove_text_color" + android:textSize="@dimen/remove_text_size"/> diff --git a/java/com/android/dialer/app/res/layout/search_edittext.xml b/java/com/android/dialer/app/res/layout/search_edittext.xml index c02512d80..bb6a5f7de 100644 --- a/java/com/android/dialer/app/res/layout/search_edittext.xml +++ b/java/com/android/dialer/app/res/layout/search_edittext.xml @@ -29,7 +29,7 @@ android:padding="@dimen/search_box_search_icon_padding" android:importantForAccessibility="no" android:scaleType="center" - android:src="@drawable/quantum_ic_search_white_24" + android:src="@drawable/quantum_ic_search_vd_theme_24" android:tint="@color/searchbox_icon_tint"/> - - -

- - - - - diff --git a/java/com/android/dialer/app/res/menu/dialtacts_options.xml b/java/com/android/dialer/app/res/menu/dialtacts_options.xml index 25a3e1811..b50e6ad5f 100644 --- a/java/com/android/dialer/app/res/menu/dialtacts_options.xml +++ b/java/com/android/dialer/app/res/menu/dialtacts_options.xml @@ -28,5 +28,8 @@ + diff --git a/java/com/android/dialer/app/res/values-af/strings.xml b/java/com/android/dialer/app/res/values-af/strings.xml index 2eb462b1c..52005c9ec 100644 --- a/java/com/android/dialer/app/res/values-af/strings.xml +++ b/java/com/android/dialer/app/res/values-af/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Foon" "Foonsleutelblok" - "Foon" "Oproepgeskiedenis" - "Gee foutiewe nommer aan" "Kopieer nommer" "Kopieer transkripsie" - "Blokkeer nommer" - "Deblokkeer nommer" "Wysig nommer voor oproep" "Vee oproepgeskiedenis uit" "Vee stemboodskap uit" @@ -34,7 +30,6 @@ "Vee oproepgeskiedenis uit?" "Dit sal alle oproepe uit jou geskiedenis vee" "Vee tans oproepgeskiedenis uit …" - "Foon" "Gemiste oproep" "Gemiste werkoproep" "Gemiste oproepe" @@ -48,107 +43,66 @@ %1$d Stemboodskappe Stemboodskap - "Speel" "%1$s, %2$s" "Nuwe stemboodskap van %1$s" "Kon nie stemboodskap speel nie" "Laai tans stemboodskap …" - "Argiveer tans stemboodskap …" "Kon nie stemboodskap laai nie" - "Slegs oproepe met stemboodskappe" - "Slegs inkomende oproepe" - "Slegs uitgaande oproepe" - "Slegs gemisde oproepe" "(%1$d)%2$s" - "soek" - "bel" - "nommer om te skakel" - "Speel of stop terugspeel" "Skakel luidsprekerfoon aan of af" "Soek terugspeelposisie" - "Verlaag terugspeelkoers" - "Verhoog terugspeelkoers" "Oproepgeskiedenis" "Meer opsies" "sleutelblok" - "Wys slegs uitgaande" - "Wys slegs inkomende" - "Wys slegs misgeloop" - "Wys net stemboodskappe" - "Wys alle oproepe" - "Voeg 2-sek.-pouse by" - "Voeg wagtyd by" "Instellings" "Nabootser" - "Alle kontakte" - "Gebruik raak-nommerbord" - "Keer terug na oproep wat besig is" - "Voeg oproep by" - "Inkomende oproepe" - "Speel stemboodskap" - "Bekyk kontak %1$s" - "Bel %1$s" + "Skep nuwe UI-kortpad" + "Gaan tans grootmaathandelingmodus in" + "Het grootmaathandelingmodus verlaat" + "Het %1$s gekies" + "Het %1$s ontkies" "Kontakbesonderhede van %1$s" "Kontakbesonderhede vir verdagte strooiposbeller %1$s" "%1$s oproepe." "Video-oproep." - "Stuur SMS aan %1$s" - "Ongeluisterde stemboodskap" "Begin stemsoektog" - "Bel %s" "Stemboodskap" - "%s sek." - "%s min. %s sek." - "stemboodskap" - "stemboodskappe" - "Ja" - "Nee" - "Vee geselekteerde %1$s uit?" + "Kanselleer grootmaathandelingmodus" + "Vee uit" + "Kanselleer" + "%1$s gekies" + + ""Vee hierdie stemboodskappe uit? "" + ""Vee hierdie stemboodskap uit? "" + @string/call_log_header_today "%1$s om %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Kan nie hierdie nommer bel nie" - "Om stemboodskapdiens op te stel, gaan na Kieslys > Instellings." - "Om stemboodskap te bel, skakel eers vliegtuigmodus af." - "Laai tans…" - "IMEI" - "MEID" - "Laai tans van SIM-kaart af…" - "SIM-kaartkontakte" - "Geen kontakte-program beskikbaar nie" "Stemsoektog is nie beskikbaar nie" - "Kan nie \'n foonoproep maak nie want die Foon-program is gedeaktiveer." "Deursoek kontakte" "Gee nommer of soek in kontakte" "Jou oproepgeskiedenis is leeg" "Maak \'n oproep" "Jy het geen gemiste oproepe nie." "Jou stemboodskapdiens se inkassie is leeg." - "Wys net gunstelinge" "Oproepgeskiedenis" "Alles" "Gemis" - "Stemboodskap" "Spoedbel" "Oproepgeskiedenis" "Kontakte" "Stemboodskap" - "Verwyder uit gunstelinge" - "Ontdoen" "Bel %s" "Skep nuwe kontak" "Voeg by \'n kontak" "Stuur SMS" "Maak video-oproep" "Blokkeer nommer" - "%s nuwe gemiste oproepe" "Daar is nog niemand op jou spoedbel nie" "Voeg \'n gunsteling by" - "Jy het nog nie enige kontakte nie" - "Voeg \'n kontak by" - "Raak aan prent om al die nommers te sien of raak en hou om te herorganiseer" "Verwyder" + "Kies alles" "Video-oproep" "Stuur \'n boodskap" "Oproepbesonderhede" @@ -164,25 +118,14 @@ "Bel ^1" "Maak video-oproep na ^1." "Luister na stemboodskap vanaf ^1" - "Speel stemboodskap vanaf ^1" - "Laat wag stemboodskap vanaf ^1" - "Vee stemboodskap vanaf ^1 uit" - - %d nuwe stemboodskappe - %d nuwe stemboodskap - "Skep kontak vir ^1" "Voeg ^1 by \'n bestaande kontak" "Oproepbesonderhede vir ^1" - "Uit oproepgeskiedenis gevee" "Vandag" "Gister" "Ouer" - "Oproepelys" "Skakel luidspreker aan." "Skakel luidspreker af." - "Speel vinniger." - "Speel stadiger." "Begin of laat wag speel." "Vertoonopsies" "Klanke en vibrasie" @@ -199,7 +142,6 @@ "Oproepe" "Oproepblokkering" "Stemboodskap" - "Kies SIM vir stemboodskap-instellings" "Oproepblokkering is tydelik af" "Oproepblokkering is gedeaktiveer omdat jy die afgelope 48 uur nooddienste van hierdie foon af gekontak het. Dit sal outomaties heraktiveer word sodra die 48-uurtydperk verstryk." "Voer nommers in" @@ -213,12 +155,8 @@ "Geblokkeerde nommers" "%1$s is reeds geblokkeer." "Oproeprekeninge" - "Skakel aan" - "Stel toestemmings" "Skakel die kontaktetoestemming aan om spoedbel te aktiveer." "Skakel die foontoestemming aan om jou oproeprekord te sien." - "Skakel die kontaktetoestemming aan om jou kontakte te sien." - "Skakel die foontoestemming aan om na jou stemboodskapdiens te gaan." "Skakel die Kontakte-toestemmings aan om jou kontakte te deursoek." "Skakel die foontoestemming aan om \'n oproep te maak." "Foonprogram het nie toestemming om stelselinstellings te stel nie." @@ -230,4 +168,10 @@ "Strooipos" "%1$s is vanlyn en kan nie bereik word nie" "Meer oor" + "Deur Google getranskribeer" + "Google transkribeer tans …" + "Transkripsie nie beskikbaar nie" + "Bekyk" + "Oproep geskrap. Bekyk en vee aanhegsels uit wat gedurende hierdie oproep in Boodskappe gedeel is." + "Oproepe geskrap. Bekyk en vee aanhegsels uit wat gedurende oproepe in Boodskappe gedeel is."
diff --git a/java/com/android/dialer/app/res/values-am/strings.xml b/java/com/android/dialer/app/res/values-am/strings.xml index 82303019c..91396a4a8 100644 --- a/java/com/android/dialer/app/res/values-am/strings.xml +++ b/java/com/android/dialer/app/res/values-am/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ስልክ" "የስልክ የቁልፍ ሰሌዳ" - "ስልክ" "የጥሪ ታሪክ" - "ትክክለኛ ያልሆነ ቁጥርን ሪፓርት አድርግ" "ቁጥር ቅዳ" "ወደ ጽሑፍ የተገለበጠውን ቅዳ" - "ቁጥርን አግድ" - "ቁጥርን አታግድ" "ከመደወል በፊት ቁጥር አርትዕ" "የጥሪ ታሪክን አጽዳ" "የድምፅ መልዕክት ሰርዝ" @@ -34,7 +30,6 @@ "የጥሪ ታሪክ ይጽዳ?" "ይሄ ሁሉንም ጥሪዎች ከታሪክዎ ይሰርዛቸዋል" "የጥሪ ታሪክን በማጽዳት ላይ…" - "ስልክ" "ያመለጠጥሪ" "ያመለጠ የሥራ ጥሪ" "ያመለጡ ጥሪዎች" @@ -48,107 +43,66 @@ %1$d የድምፅ መልዕክቶች %1$d የድምፅ መልዕክቶች - "አጫውት" "%1$s%2$s" "ከ%1$s አዲስ የድምፅመልዕክት" "የድምጽ መልዕክትን ማጫወት አልተቻለም" "የድምጽ መልዕክትን በመጫን ላይ…" - "የድምፅ መልዕክት ማህደር ውስጥ በማስቀመጥ ላይ…" "የድምጽ መልዕክትን መጫን አልተቻለም" - "የድምጽ መልዕክት ያላቸው ጥሪዎች ብቻ" - "ገቢ ጥሪዎች ብቻ" - "ወጪ ጥሪዎች ብቻ" - "ያመለጡ ጥሪዎች ብቻ" "(%1$d) %2$s" - "ፍለጋ" - "ደውል" - "ቁጥር ለመደወል" - "መልሶ ማጫወት አጫውት ወይም አቁም" "የስልክ ድምጽ ማጉያን ያብሩ ወይም ያጥፉ" "የመልሶ ማጫወት ቦታ ይፈልጉ" - "የመልሶ ማጫወት ፍጥነት ቀንስ" - "የመልሶ ማጫወት ፍጥነት ጨምር" "የጥሪ ታሪክ" "ተጨማሪ አማራጮች" "ቁልፍ ሰሌዳ" - "ወጪዎቹን ብቻ አሳይ" - "ገቢዎቹን ብቻ አሳይ" - "ያመለጡትን ብቻ አሳይ" - "የድምፅ መልዕክቶች ብቻ አሳይ" - "ሁሉንም ጥሪዎች አሳይ" - "2 ሴኮንድ ፋታ አክል" - "መጠበቅ አክል" "ቅንብሮች" "ማስመሰያ" - "ሁሉም እውቅያዎች" - "የድምፅ ቁልፍ ሰሌዳን ንካ" - "በመካሄድ ላይ ወዳለው ጥሪ ተመለስ" - "ጥሪ ያክሉ" - "ገቢ ጥሪዎች" - "የድምፅ መልዕክት አጫውት" - "ዕውቂያ %1$s ዕይ" - "ጥሪ %1$s" + "አዲስ የዩአይ አቋራጭ ፍጠር" + "ወደ የጅምላ እርምጃ ሁነታ በመግባት ላይ" + "ከጅምላ እርምጃ ሁነታ ለቀው ወጥተዋል" + "%1$s ተመርጧል" + "%1$s አልተመረጠም" "የ%1$s እውቂያ ዝርዝሮች" "የተጠረጠረው አይፈለጌ ጥሪ አድራጊ ማግኛ አድራሻ%1$s" "%1$s ጥሪዎች።" "የቪዲዮ ጥሪ።" - "ኤስኤምኤስ ለ%1$s ላክ" - "ያልተሰማ የድምፅመልዕክት" "በድምፅ ፍለጋ ይጀምሩ" - "ደውል%s" "የድምፅ መልዕክት" - "%s ሰከንድ" - "%s ደቂቃ %s ሴከ" - "የድምፅ መልዕክት" - "የድምፅ መልዕክቶች" - "አዎ" - "አይ" - "የተመረጠው %1$s ይሰረዝ?" + "የጅምላ እርምጃ ሁነታ ይቅር" + "ሰርዝ" + "ይቅር" + "%1$s ተመርጠዋል" + + ""እነዚህ የድምፅ መልዕክቶች ይሰረዙ? "" + ""እነዚህ የድምፅ መልዕክቶች ይሰረዙ? "" + @string/call_log_header_today "%1$s %2$s ላይ" "%1$02d:%2$02d" "%1$s%2$s" - "ይህን ቁጥር መደወል አልተቻለም" - "ድምጽ መልዕክትን ለማደራጀት ወደ ምናሌ > ቅንብሮች ሂድ።" - "የድምጽ መልዕክት ጥሪ ለማድረግ፣ በመጀመሪያ የአውሮፕላን ሁነታን አጥፋ።" - "በመስቀል ላይ…" - "IMEI" - "MEID" - "ከSIM ካርድ ላይ በመጫን ላይ..." - "የSIM ካርድ ዕውቂያዎች" - "ምንም የእውቂያዎች መተግበሪያ አይገኝም" "የድምጽ ፍለጋ አይገኝም" - "የስልክ መተግበሪያው ስለተሰናከለ የስልክ ጥሪ ማድረግ አይቻልም።" "ዕውቅያዎችን ፈልግ" "ቁጥር ያክሉ ወይም እውቂያዎችን ይፈልጉ" "የእርስዎ የጥሪ ታሪክ ባዶ ነው" "ደውል" "ምንም ያመለጡዎት ጥሪዎች የሉዎትም።" "የእርስዎ የድምጽ መልዕክት ገቢ መልዕክት ባዶ ነው።" - "ተወዳጆችን ብቻ አሳይ" "የስልክ ጥሪ ታሪክ" "ሁሉም" "ያመለጡ" - "የድምፅ መልዕክት" "ፈጣን ደውል" "የጥሪ ታሪክ" "ዕውቂያዎች" "የድምፅ መልዕክት" - "ከተወዳጆች ውስጥ ተወግዷል።" - "ቀልብስ" "ደውል%s" "አዲስ እውቂያ ይፍጠሩ" "ወደ እውቂያ አክል" "ኤስኤምኤስ ላክ" "የቪዲዮ ጥሪ አድርግ" "ቁጥርን አግድ" - "%s አዲስ ያልተመለሱ ጥሪዎች" "በፈጥኖ መደወያ ላይ ገና ማንም የለዎትም" "ተወዳጅ አክል" - "ገና ምንም እውቂያዎች የሉዎትም" - "ዕውቂያ አክል" - "ሁሉንም ቁጥሮች ለማየት ምስል ይንኩ ወይም ዳግም ለመደርደር ነክተው ይያዙት" "አስወግድ" + "ሁሉንም ምረጥ" "የቪዲዮ ጥሪ" "መልእክት ላክ" "የጥሪ ዝርዝሮች" @@ -164,25 +118,14 @@ "ወደ ^1 ይደውሉ" "ቪዲዮ ጥሪ ^1።" "የ^1ን የድምጽ መልዕክት ያዳምጡ" - "የድምጽ መልዕክት ያጫውቱ ከ^1" - "የድምጽ መልዕክት ለአፍታ ያቁሙ ከ^1" - "የድምጽ መልዕክት ይሰርዙ ከ^1" - - %d አዲስ የድምጽ መልዕክቶች - %d አዲስ የድምጽ መልዕክቶች - "ለ^1 እውቂያ ፍጠር" "^1ን ወደ አሁን ያለ እውቂያ አክል" "የ^1 የጥሪ ዝርዝሮች" - "ከጥሪ ታሪክ ተሰርዟል" "ዛሬ" "ትላንት" "የቆየ" - "የጥሪዎች ዝርዝር" "ድምጽ ማጉያን አብራ።" "ድምጽ ማጉያን አጥፋ።" - "በፍጥነት አጫውት።" - "በዝግታ አጫውት።" "መልሰህ አጫውትን አስጀምር ወይም ለአፍታ አቁም።" "የማሳያ አማራጮች" "ድምጾች እና ንዝረት" @@ -199,7 +142,6 @@ "ጥሪዎች" "ጥሪን ማገድ" "የድምፅ መልዕክት" - "ለድምጽ መልዕክት ቅንብሮች ሲም ይምረጡ" "ጥሪን ማገድ ለጊዜው ተሰናክሏል" "ባለፉት 48 ሰዓቶች ውስጥ ከዚህ ስልክ ሆነው የአስቸኳይ አደጋ አገልግሎቶችን ስላነጋገሩ ጥሪን ማገድ ተሰናክሏል። አንዴ የ48 ሰዓቱ ጊዜ ካለፈ በኋላ በራስ-ሰር ዳግም ይነቃል።" "ቁጥሮችን አስመጣ" @@ -213,12 +155,8 @@ "የታገዱ ቁጥሮች" "%1$s ቀድሞውኑ ታግዷል።" "የመደወያ መለያዎች" - "አብራ" - "ፍቃዶችን አዋቅር" "ፈጥኖ መደወያን ለማንቃት የእውቂያዎች ፍቃዱን ያብሩ።" "የጥሪ ምዝግብ ማስታወአሽዎን ለማየት የስልክ ፍቃዱን ያብሩ።" - "የእርስዎን እውቂያዎች ለማየት የእውቂያዎች ፍቃዱን ያብሩ።" - "የድምፅ መልዕክትዎን ለመድረስ የስልክ ፍቃዱን ያብሩ።" "የእርስዎን እውቂያዎች ለመከታተል የእውቂያዎች ፍቃዶችን ያብሩ።" "ስልክ ለመደወል የስልክ ፍቃዱን ያብሩ።" "የስልክ መተግበሪያ ወደ የስርዓት ቅንብሮች የመጻፍ ፍቃድ የለውም።" @@ -230,4 +168,10 @@ "አይፈለጌ መልዕክት" "%1$s ከመስመር ውጭ ነው እና ሊደረስበት አይችልም" "ስለ" + "በGoogle ወደ ጽሁፍ የተለወጠ" + "Google ወደ ጽሁፍ በመለወጥ ላይ ነው …" + "ወደ ጽሁፍ ግልባጭ የለም" + "አሳይ" + "ጥሪ ተሰርዟል። በዚህ ጥሪ ወቅት በመልዕክቶች ውስጥ የተጋሩ አባሪዎችን ይመልከቱ እንዲሁም ይሰርዙ።" + "ጥሪ ተሰርዟል። በዚህ ጥሪ ወቅት በመልዕክቶች ውስጥ የተጋሩ አባሪዎችን ይመልከቱ እንዲሁም ይሰርዙ።"
diff --git a/java/com/android/dialer/app/res/values-ar/strings.xml b/java/com/android/dialer/app/res/values-ar/strings.xml index e4dfb4d9e..b194777d2 100644 --- a/java/com/android/dialer/app/res/values-ar/strings.xml +++ b/java/com/android/dialer/app/res/values-ar/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "الهاتف" "لوحة مفاتيح الهاتف" - "الهاتف" "سجل المكالمات" - "الإبلاغ عن رقم غير دقيق" "نسخ الرقم" "نسخ الكتابة الصوتية" - "حظر الرقم" - "إلغاء حظر الرقم" "تعديل الرقم قبل الاتصال" "محو سجل المكالمات" "حذف رسالة البريد الصوتي" @@ -34,7 +30,6 @@ "هل تريد محو سجل المكالمات؟" "سيؤدي ذلك إلى حذف جميع المكالمات من السجل" "جارٍ محو سجل المكالمات…" - "الهاتف" "مكالمة فائتة" "مكالمة عمل فائتة" "المكالمات الفائتة" @@ -52,107 +47,70 @@ %1$d من رسائل البريد الصوتي رسالة بريد صوتي - "تشغيل" "%1$s، %2$s" "بريد صوتي جديد من %1$s" "تعذر تشغيل البريد الصوتي" "جارٍ تحميل البريد الصوتي…" - "تجري أرشفة البريد الصوتي..." "تعذر تحميل البريد الصوتي" - "المكالمات التي تشتمل على بريد صوتي فقط" - "المكالمات الواردة فقط" - "المكالمات الصادرة فقط" - "المكالمات الفائتة فقط" "(%1$d) %2$s" - "بحث" - "طلب" - "الرقم الذي سيتم طلبه" - "بدء التشغيل أو إيقافه" "تشغيل مكبر الصوت أو تعطيله" "طلب موضع تشغيل" - "خفض معدل التشغيل" - "زيادة معدل التشغيل" "سجل المكالمات" "مزيد من الخيارات" "لوحة المفاتيح" - "عرض الصادر فقط" - "عرض الوارد فقط" - "عرض الفائت فقط" - "إظهار رسائل البريد الصوتي فقط" - "عرض جميع المكالمات" - "إضافة ثانيتين إيقاف مؤقت" - "إضافة انتظار" "الإعدادات" "المحاكي" - "جميع جهات الاتصال" - "استخدام لوحة مفاتيح نغمات باللمس" - "عودة إلى المكالمة الجارية" - "إضافة مكالمة" - "المكالمات الواردة" - "تشغيل البريد الصوتي" - "عرض جهة الاتصال %1$s" - "الاتصال بـ %1$s" + "إنشاء اختصار للواجهة الجديدة" + "يتم الدخول إلى وضع الإجراء المجمَّع" + "تمت مغادرة وضع الإجراء المجمَّع" + "تم تحديد %1$s" + "تم إلغاء تحديد %1$s" "تفاصيل جهة الاتصال بـ %1$s" "تفاصيل جهة الاتصال للمتصل غير المرغوب فيه المشتبه به %1$s" "%1$s من المكالمات." "مكالمة فيديو." - "‏إرسال رسالة قصيرة SMS إلى %1$s" - "البريد الصوتي غير المسموع" "بدء البحث الصوتي" - "الاتصال بالرقم %s" "البريد الصوتي" - "%s ثانية" - "%s دقيقة %s ثانية" - "البريد الصوتي" - "رسائل البريد الصوتي" - "نعم" - "لا" - "حذف رسائل %1$s المحددة؟" + "إلغاء وضع الإجراءات المجمَّع" + "حذف" + "إلغاء" + "تم تحديد %1$s" + + ""حذف رسائل البريد الصوتي هذه؟ "" + ""حذف رسالتي البريد الصوتي هاتين؟ "" + ""حذف رسائل البريد الصوتي هذه؟ "" + ""حذف رسائل البريد الصوتي هذه؟ "" + ""حذف رسائل البريد الصوتي هذه؟ "" + ""حذف رسالة البريد الصوتي هذه؟ "" + @string/call_log_header_today "%1$s في %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "لا يمكن الاتصال بهذا الرقم" - "لإعداد البريد الصوتي، انتقل إلى القائمة > الإعدادات." - "للاتصال بالبريد الصوتي، يجب أولاً إيقاف وضع الطائرة." - "جارٍ التحميل..." - "IMEI" - "MEID" - "‏جارٍ التحميل من شريحة SIM…" - "‏شريحة SIM وجهات الاتصال" - "لا يتوفر تطبيق لجهات الاتصال" "البحث الصوتي غير متاح" - "يتعذر إجراء مكالمة هاتفية نظرًا لأنه تم تعطيل تطبيق الهاتف." "البحث في جهات الاتصال" "إضافة رقم أو البحث في جهات الاتصال" "سجل مكالماتك فارغ" "إجراء مكالمة" "ليست لديك أية مكالمات لم يتم الرد عليها." "مجلد بريدك الوارد الصوتي فارغ." - "عرض المفضلة فقط" "سجل المكالمات" "الكل" "فائتة" - "البريد الصوتي" "اتصال سريع" "سجل المكالمات" "جهات الاتصال" "البريد الصوتي" - "تمت إزالة جهة الاتصال من المفضلة" - "تراجع" "الاتصال بالرقم %s" "إنشاء جهة اتصال جديدة" "إضافة إلى جهة اتصال" "‏إرسال رسالة قصيرة SMS" "إجراء مكالمة فيديو" "حظر الرقم" - "%s من المكالمات الجديدة الفائتة" "لم تتم إضافة أية جهة اتصال إلى قائمة الاتصال السريع حتى الآن" "إضافة مفضلة" - "ليست لديك أية جهات اتصال حتى الآن" - "إضافة جهة اتصال" - "المس الصورة للاطلاع على جميع الأرقام أو المس مع الاستمرار لإعادة الترتيب" "إزالة" + "تحديد الكل" "مكالمة فيديو" "إرسال رسالة" "تفاصيل المكالمة" @@ -168,29 +126,14 @@ "الاتصال بـ ^1" "إجراء مكالمة فيديو مع ^1." "استماع إلى بريد صوتي من ^1" - "تشغيل البريد الصوتي من ^1" - "إيقاف البريد الصوتي من ^1 مؤقتًا" - "حذف البريد الصوتي من ^1" - - ليست هناك أية رسائل صوتية جديدة (%d) - رسالتان صوتيتان جديدتان (%d) - %d رسائل صوتية - %d رسالة صوتية - %d من الرسائل الصوتية - رسالة صوتية جديدة (%d) - "إنشاء جهة اتصال لـ ^1" "إضافة ^1 إلى جهة اتصال حالية" "تفاصيل الاتصال لـ ^1" - "تم الحذف من سجل المكالمات" "اليوم" "أمس" "أقدم" - "قائمة المكالمات" "تشغيل مكبر الصوت." "تعطيل مكبر الصوت." - "تشغيل أسرع." - "تشغيل أقل سرعة." "بدء التشغيل أو إيقافه مؤقتًا." "خيارات العرض" "الأصوات والاهتزاز" @@ -207,7 +150,6 @@ "المكالمات" "حظر المكالمات" "البريد الصوتي" - "‏حدد SIM لإعدادات البريد الصوتي" "حظر المكالمات معطّل مؤقتًا" "تم تعطيل حظر المكالمات لأنك اتصلت بخدمات الطوارئ خلال 48 ساعة ماضية. وستتم إعادة تمكينه تلقائيًا بعد انتهاء هذه الفترة التي تبلغ 48 ساعة." "استيراد الأرقام" @@ -221,12 +163,8 @@ "الأرقام المحظورة" "تم حظر %1$s." "حسابات الاتصال" - "تشغيل" - "تعيين الأذونات" "لتمكين الاتصال السريع، شغِّل إذن جهات الاتصال." "للاطلاع على سجل المكالمات، شغِّل إذن الهاتف." - "للاطلاع على جهات الاتصال، شغِّل إذن جهات الاتصال." - "للوصول إلى البريد الصوتي، شغِّل إذن الهاتف." "للبحث عن جهات الاتصال، عليك تشغيل أذونات جهات الاتصال." "لإجراء مكالمة، شغِّل إذن الهاتف." "ليس لدى تطبيق الهاتف إذن لتعديل إعدادات النظام." @@ -238,4 +176,10 @@ "تعليق غير مرغوب فيه" "%1$s غير متصل ولا يمكن الوصول إليه" "حول" + "‏تم النسخ بواسطة Google" + "‏جارٍ تحويل الصوت إلى نص بواسطة Google..." + "النص غير متاح" + "عرض" + "‏تم حذف المكالمة. يمكنك عرض وحذف المرفقات التي تمت مشاركتها أثناء هذه المكالمة في Messages." + "‏تم حذف المكالمة. يمكنك عرض وحذف المرفقات التي تمت مشاركتها أثناء إجراء المكالمات في Messages." diff --git a/java/com/android/dialer/app/res/values-az/strings.xml b/java/com/android/dialer/app/res/values-az/strings.xml index 62bc117ba..90849a8e9 100644 --- a/java/com/android/dialer/app/res/values-az/strings.xml +++ b/java/com/android/dialer/app/res/values-az/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefon Klaviaturası" - "Telefon" "Zəng tarixçəsi" - "Qeyri-dəqiq sayı bildirin" "Nömrəni kopyalayın" "Transkripsiyanı kopyalayın" - "Nömrəni blok edin" - "Nömrəni blokdan çıxarın" "Zəng etmədən öncə nömrəyə düzəliş edin" "Zəng tarixçəsini təmizlə" "Səsli məktubu silin" @@ -34,7 +30,6 @@ "Zəng tarixçəsi təmizlənsin?" "Bu, tarixçənizdən bütün zəngləri siləcəkdir" "Zəng tarixçəsi silinir…" - "Telefon" "Buraxılmış zəng" "Buraxılmış iş çağrısı" "Buraxılmış zənglər" @@ -48,107 +43,66 @@ %1$d Səsli poçt Səsli poçt - "Oxudun" "%1$s, %2$s" "%1$s adlı şəxsdən yeni səsli məktub" "Səsli poçtu səsləndirmək mümkün deyil" "Səsli poçt yüklənir…" - "Səsli poçt arxivləşdirilir…" "Səsli poçtu yükləmək mümkün olmadı" - "Yalnız səsli məktublu zənglər" - "Yalnız daxil olan zənglər" - "Yalnız gedən zənglər" - "Yalnız buraxılmış zənglər" "(%1$d) %2$s" - "axtarış" - "Yığ" - "yığmaq üçün nömrə" - "Oxudun və ya dayandırın" "Spikerfonu aktiv və ya deaktiv edin" "Oxutma pozisiyası axtarın" - "Oxutma reytinqini azaldın" - "Oxutma reytinqini artırın" "Zəng tarixçəsi" "Daha çox seçim" "klaviatura" - "Yalnız gedəni göstərin" - "Yalnız gələni göstərin" - "Yalnız buraxılmışı göstərin" - "Yalnız səsli mesajları göstərin" - "Bütün zəngləri göstərin" - "2 saniyəlik pauza əlavə edin" - "Gözləmə əlavə edin" "Ayarlar" "Stimulyator" - "Bütün kontaktlar" - "Toxunma ton klaviaturasını istifadə edin" - "Davam edən zəngə qayıdın" - "Zəng əlavə edin" - "Gələn zənglər" - "Səsli məktubu oxudun" - "%1$s adlı kontakta baxın" - "Zəng %1$s" + "Yeni İİ Qısayolu yaradın" + "Toplu əməliyyat rejiminə daxil olunur" + "Toplu əməliyyat rejimi tərk edilir" + "%1$s seçildi" + "%1$s seçilmədi" "%1$s üçün kontakt detalları" "%1$s şübhəli spam zəng edəni üçün kontakt detalları" "%1$s zəng." "Video çağrı." - "%1$s adlı şəxsə SMS göndər" - "Eşidilməmiş səsli mesaj" "Səs axtarışına başlayın" - "%s zəng edin" "Səsli poçt" - "%s san" - "%s dəq %s san" - "səsli e-məktub" - "səsli e-məktublar" - "Bəli" - "Xeyr" - "Seçilmiş %1$s silinsin?" + "Qrup əməliyyatları rejimini ləğv edin" + "Silin" + "Ləğv edin" + "%1$s seçilib" + + ""Bu səsli e-məktub silinsin? "" + ""Bu səsli e-məktub silinsin? "" + @string/call_log_header_today "%1$s tarixində %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Bu nömrəyə zəng etmək mümkün deyil" - "Səsli poçtu ayarlamaq üçün Menyu > Ayarlar bölməsinə gedin." - "Səsli poçta zəng etmək üçün Təyyarə rejimini söndürün." - "Yüklənir…" - "IMEI" - "MEID" - "SIM kartdan yüklənir..." - "SIM kart kontaktları" - "Əlaqələr proqramı mövcud deyil" "Səsli axtarış mövcud deyil" - "Telefon tətbiqi deaktiv edildiyinə görə telefon zəngi etmək mümkün deyil." "Kontakt axtarın" "Nömrə əlavə edin və ya kontaktlarda axtarın" "Zəng tarixçəniz boşdur" "Zəng edin" "Buraxılmış heç bir zənginiz yoxdur." "Səsli poçt qutunuz boşdur." - "Yalnız seçilmişləri göstər" "Çağrı Tarixçəsi" "Bütün" "Buraxılmış" - "Səsli poçt" "Sürətli nömrə yığımı" "Zəng Tarixçəsi" "Kontaktlar" "Səsli poçt" - "Seçilmişlərdən silindi" - "Geri qaytar" "%s zəng edin" "Yeni kontakt yaradın" "Kontakta əlavə edin" "SMS göndərin" "Video zəng edin" "Nömrəni blok edin" - "%s yeni buraxılmış zəng" "Hələ sürətli zəng siyahınızda hec kim yoxdur" "Sevimlilərə əlavə edin" - "Hələ heç bir kontaktınız yoxdur" - "Kontakt əlavə edin" - "Bütün nömrələri görmək üçün təsvirə toxunun və ya yenidən qaydaya salmaq üçün basıb saxlayın" "Yığışdır" + "Hamısını seçin" "Video zəng" "Mesaj göndərin" "Zəng detalları" @@ -164,25 +118,14 @@ "Çağrı ^1" "^1 video zəng edin." "^1 tərəfdən səsli mesajı dinləyin" - "^1 nömrəsindən gələn səsli mesajı oxudun" - "^1 nömrəsindən gələn səsli mesajı durdurun" - "^1 nömrəsindən gələn səsli mesajı silin" - - %d yeni səsli mesaj - %d yeni səsli mesaj - "^1 üçün kontakt yaradın" "Mövcud kontakta ^1 əlavə edin" "^1 üçün detalları çağırın" - "Zəng tarixçəsindən silindi" "Bu gün" "Dünən" "Keçmi" - "Zənglər siyahısı" "Dinamiki aktiv et." "Dinamiki deaktiv et." - "Daha sürətlə oxut." - "Daha yavaş oxut." "Oxunuşu başlat və ya durdur" "Ekran seçimləri" "Səslər və vibrasiya" @@ -199,7 +142,6 @@ "Zənglər" "Zəng blok edilir" "Səsli e-məktub" - "Səsli e-poçt üçün SIM seçin" "Çağrının blok edilməsi müvəqqəti olaraq deaktiv edilib" "Son 48 saat ərzində bu telefondan təcili yardım xidmətləri ilə əlaqə saxladığınız üçün Çağrı Bloklanması deaktiv edildi. 48 saatlıq müddət başa çatdıqda avtomatik olaraq yenidən aktiv ediləcək." "Nömrələri import edin" @@ -213,12 +155,8 @@ "Bloklanmış nömrələr" "%1$s artıq bloklanıb." "Hesabların çağrılması" - "Aktiv edin" - "İcazələri quraşdırın" "Sürətli yığımı aktivləşdirmək üçün, Kontakt icazələrini aktivləşdirin." "Çağrı jurnalınızı görmək üçün Telefon icazəsini aktivləşdirin." - "Kontaktlarınızı görmək üçün Kontakt icazəsini aktivləşdirin." - "Səsli poçta daxil olmaq üçün, Telefon icazəsini aktivləşdirin." "Kontaktlarınızı axtarmaq üçün, Kontakt icazələrini aktiv edin." "Zəng etmək üçün, Telefon icazəsini aktivləşdirin." "Telefon tətbiqinin sistem ayarlarına yazmaq icazəsi yoxdur." @@ -230,4 +168,10 @@ "Spam" "%1$s oflayn olduğu üçün əlaqə saxlamaq mümkün deyil" "Haqqında" + "Google tərəfindən kopyalandı" + "Google kopyalayır..." + "Transkripsiya əlçatan deyil" + "Baxın" + "Zəng silindi. Bu zəng zamanı paylaşılan qoşmalara Mesajlaşma tətbiqində baxın və silin." + "Zənglər silindi. Bu zənglər zamanı paylaşılan qoşmalara Mesajlaşma tətbiqində baxın və silin." diff --git a/java/com/android/dialer/app/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/app/res/values-b+sr+Latn/strings.xml index 9df729108..aeff07eb4 100644 --- a/java/com/android/dialer/app/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/app/res/values-b+sr+Latn/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefonska tastatura" - "Telefon" "Istorija poziva" - "Prijavi netačan broj" "Kopiraj broj" "Kopiraj transkripciju" - "Blokiraj broj" - "Deblokiraj broj" "Izmeni broj pre poziva" "Obriši istoriju poziva" "Izbriši govornu poruku" @@ -34,7 +30,6 @@ "Želite da obrišete istoriju poziva?" "Ovo će izbrisati sve pozive iz istorije" "Briše se istorija poziva…" - "Telefon" "Propušten poziv" "Propušten poziv za Work" "Propušteni pozivi" @@ -49,107 +44,67 @@ %1$d govorne poruke %1$d govornih poruka - "Pusti" "%1$s, %2$s" "Nova govorna poruka od %1$s" "Puštanje govorne pošte nije uspelo" "Govorna pošta se učitava…" - "Govorna pošta se arhivira…" "Učitavanje govorne pošte nije uspelo" - "Samo pozivi sa govornom poštom" - "Samo dolazni pozivi" - "Samo odlazni pozivi" - "Samo propušteni pozivi" "(%1$d) %2$s" - "pretraži" - "biranje" - "broj za biranje" - "Pokretanje ili zaustavljanje reprodukcije" "Uključivanje ili isključivanje spikerfona" "Traženje pozicije u reprodukciji" - "Smanjivanje brzine reprodukcije" - "Povećavanje brzine reprodukcije" "Istorija poziva" "Još opcija" "tastatura" - "Prikaži samo odlazne" - "Prikaži samo dolazne" - "Prikaži samo propuštene" - "Prikaži samo govorne poruke" - "Prikaži sve pozive" - "Dodaj pauzu od 2 sekunde" - "Dodaj čekanje" "Podešavanja" "Simulator" - "Svi kontakti" - "Upotrebite brojčanik za tonsko biranje" - "Vrati se na poziv koji je u toku" - "Dodaj poziv" - "Dolazni pozivi" - "Puštanje govorne pošte" - "Prikaži kontakt %1$s" - "Pozovi %1$s" + "Napravite prečicu za novi UI" + "Ulazite u režim grupnih radnji" + "Izašli ste iz režima grupnih radnji" + "Izabrano je %1$s" + "Opozvan je izbor %1$s" "Detalji o kontaktu za %1$s" "Kontakt informacije potencijalnog nepoželjnog pozivaoca %1$s" "%1$s poziva." "Video poziv." - "Slanje SMS-a za %1$s" - "Nepreslušana govorna pošta" "Pokretanje glasovne pretrage" - "Pozovi %s" "Govorna pošta" - "%s sek" - "%s min %s sek" - "govornu poruku" - "govorne poruke" - "Da" - "Ne" - "Želite li da izbrišete izabranu(e) %1$s?" + "Otkažite režim grupnih radnji" + "Izbriši" + "Otkaži" + "Izabranih: %1$s" + + ""Želite li da izbrišete ove govorne poruke? "" + ""Želite li da izbrišete ove govorne poruke? "" + ""Želite li da izbrišete ove govorne poruke? "" + @string/call_log_header_today "%1$s u %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Nije moguće pozvati ovaj broj" - "Da biste podesili govornu poštu, idite u Meni > Podešavanja." - "Da biste pozvali govornu poštu, prvo isključite režim rada u avionu." - "Učitava se…" - "IMEI" - "MEID" - "Učitava se sa SIM kartice…" - "Kontakti na SIM kartici" - "Nema dostupne aplikacije za kontakte" "Glasovna pretraga nije dostupna" - "Nije moguće uputiti telefonski poziv jer je aplikacija Telefon onemogućena." "Pretraži kontakte" "Dodajte broj ili pretražite kontakte" "Istorija poziva je prazna" "Pozovi" "Nemate nijedan propušten poziv." "Prijemno sanduče govorne pošte je prazno." - "Prikaži samo omiljene" "Istorija poziva" "Svi" "Propušteni" - "Govorna pošta" "Brzo biranje" "Istorija poziva" "Kontakti" "Govorna pošta" - "Uklonjeno je iz omiljenih" - "Opozovi" "Pozovi %s" "Napravi novi kontakt" "Dodaj u kontakt" "Pošalji SMS" "Uputi video poziv" "Blokiraj broj" - "Novih propuštenih poziva: %s" "Nemate nijedan kontakt na brzom biranju" "Dodaj omiljen kontakt" - "Još uvek nemate nijedan kontakt" - "Dodaj kontakt" - "Dodirnite sliku da biste videli sve brojeve ili dodirnite i zadržite da biste im promenili raspored" "Ukloni" + "Izaberi sve" "Video poziv" "Pošalji poruku" "Detalji poziva" @@ -165,26 +120,14 @@ "Pozovi ^1" "Uputite video poziv kontaktu ^1." "Pusti govornu poštu od ^1" - "Reprodukuj govornu poštu kontakta ^1" - "Pauziraj govornu poštu kontakta ^1" - "Izbriši govornu poštu kontakta ^1" - - %d nova poruka govorne pošte - %d nove poruke govorne pošte - %d novih poruka govorne pošte - "Napravite kontakt za ^1" "Dodajte ^1 postojećem kontaktu" "Detalji poziva za ^1" - "Izbrisano iz istorije poziva" "Danas" "Juče" "Stariji" - "Lista poziva" "Uključite zvučnik." "Isključite zvučnik." - "Brža reprodukcija." - "Sporija reprodukcija." "Započnite ili pauzirajte reprodukciju." "Opcije prikaza" "Zvuci i vibracija" @@ -201,7 +144,6 @@ "Pozivi" "Blokiranje poziva" "Govorna pošta" - "Izbor SIM-a – podešav. gov. pošte" "Blokiranje poziva je privremeno isključeno" "Blokiranje poziva je onemogućeno zato što ste kontaktirali službe za pomoć u hitnim slučajevima sa ovog telefona u poslednjih 48 sati. Automatski će biti ponovo omogućeno kada istekne period od 48 sati." "Uvezi brojeve" @@ -215,12 +157,8 @@ "Blokirani brojevi" "%1$s je već blokiran." "Nalozi za pozivanje" - "Uključi" - "Podesi dozvole" "Da biste omogućili brzo biranje, uključite dozvolu za Kontakte." "Da biste videli evidenciju poziva, uključite dozvolu za Telefon." - "Da biste videli kontakte, uključite dozvolu za Kontakte." - "Da biste pristupili govornoj pošti, uključite dozvolu za Telefon." "Da biste pretražili kontakte, uključite dozvole za Kontakte." "Da biste uputili poziv, uključite dozvolu za Telefon." "Aplikacija Telefon nema dozvolu za upisivanje u sistemska podešavanja." @@ -232,4 +170,10 @@ "Nepoželjan" "%1$s je oflajn i ne možete da ga/je kontaktirate" "Osnovni podaci" + "Transkript je napravio Google" + "Google pravi transkript…" + "Transkript nije dostupan" + "Prikaži" + "Poziv je izbrisan. Pregledajte i izbrišite priloge deljene tokom ovog poziva u Messages-u." + "Pozivi su izbrisani. Pregledajte i izbrišite priloge deljene tokom poziva u Messages-u." diff --git a/java/com/android/dialer/app/res/values-be/strings.xml b/java/com/android/dialer/app/res/values-be/strings.xml index aac3df2bd..fa4c66f3f 100644 --- a/java/com/android/dialer/app/res/values-be/strings.xml +++ b/java/com/android/dialer/app/res/values-be/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Тэлефон" "Клавіятура тэлефона" - "Тэлефон" "Гісторыя выклікаў" - "Паведаміць аб недакладным нумары" "Скапіраваць нумар" "Капіраваць транскрыпцыю" - "Заблакіраваць нумар" - "Разблакіраваць нумар" "Змяніць нумар перад тым, як тэлефанаваць" "Ачысціць гісторыю выклікаў" "Выдаліць галас. паведамленне" @@ -34,7 +30,6 @@ "Ачысціць гісторыю выклікаў?" "Гэта выдаліць усе выклікі з вашай гісторыі" "Ачыстка гісторыі выклікаў…" - "Патэлефанаваць" "Прапушчаны выклік" "Прапушчаны выклік па працы" "Прапушчаныя выклікі" @@ -50,107 +45,68 @@ %1$d Паведамленняў галасавой пошты %1$d Паведамлення галасавой пошты - "Прайграць" "%1$s, %2$s" "Новае паведамл. ад %1$s" "Не ўдалося прайграць галасавую пошту" "Загрузка галасавой пошты…" - "Архіваванне галасавой пошты..." "Не ўдалося загрузіць галасавую пошту" - "Толькi выклiкі з галасавой поштай" - "Толькi ўваходныя выклiкi" - "Толькi выходныя выклiкi" - "Толькі прапушчаныя выклiкi" "( %1$d ) %2$s" - "пошук" - "набор" - "нумар для набору" - "Пачаць ці спыніць прайграванне" "Уключыць ці адключыць гучную сувязь" "Шукаць становішча прайгравання" - "Панізіць хуткасць прайгравання" - "Павялічыць хуткасць прайгравання" "Гісторыя выклікаў" "Дадатковыя параметры" "клавіятура" - "Паказаць толькі выходныя" - "Паказаць толькі ўваходныя" - "Паказаць толькі прапушчаныя" - "Паказаць толькі галас. пошту" - "Паказаць усе выклікі" - "Дадаць 2-секундную паўзу" - "Дадаць чаканне" "Налады" "Сродак мадэліравання" - "Усе кантакты" - "Выкарыстанне тонавай клавіятуры" - "Звярнуцца да бягучага выкліку" - "Дадаць выклік" - "Уваходныя выклікі" - "Прайграць паведамленне галасавой пошты" - "Прагледзець кантакт %1$s" - "Выклікаць карыстальнiка %1$s" + "Ярлык новага карыст. інтэрфейсу" + "Уваход у рэжым групавога дзеяння" + "Выхад з рэжыму групавога дзеяння" + "Выбрана: %1$s" + "Выбар скасаваны: %1$s" "Падрабязнасці кантакту для %1$s" "Кантактныя даныя абанента %1$s, які падазраецца ў спамерскіх выкліках" "Выклікаў: %1$s." "Відэавыклік." - "Адправіць SMS абаненту %1$s" - "Непраслуханая галасавая пошта" "Пачаць галасавы пошук" - "Выклікаць %s" "Галасавая пошта" - "%s с" - "%s хв %s с" - "галасавая пошта" - "галасавая пошта" - "Так" - "Не" - "Выдаліць вылучанае: %1$s?" + "Скасаваць рэжым пакетных дзеянняў" + "Выдаліць" + "Скасаваць" + "Выбрана: %1$s" + + ""Выдаліць гэтыя паведамленні галасавой пошты? "" + ""Выдаліць гэтыя паведамленні галасавой пошты? "" + ""Выдаліць гэтыя паведамленні галасавой пошты? "" + ""Выдаліць гэтыя паведамленні галасавой пошты? "" + @string/call_log_header_today "%1$s у %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Немагчыма выклікаць гэты нумар" - "Каб наладзіць галасавую пошту, перайдзіце ў раздзел \"Меню > Налады\"." - "Каб пазваніць на галасавую пошту, спачатку адключыце Рэжым палёту." - "Загрузка..." - "IMEI" - "MEID" - "Загрузка з SIM-карты..." - "Кантакты SIM-карты" - "Праграмы для аперацый з кантактамі няма" "Галасавы пошук недаступны" - "Немагчыма зрабіць выклік па тэлефоне, таму што праграма Тэлефон была адключана." "Пошук кантактаў" "Дадайце нумар ці шукайце ў кантактах" "Ваша гісторыя выклікаў пустая" "Зрабіць выклік" "У вас няма прапушчаных выклікаў." "Ваша галасавая пошта пустая." - "Паказаць толькі ўпадабаныя" "Гісторыя выклікаў" "Усе" "Прапушчаныя" - "Галасавая пошта" "Хуткі набор" "Гісторыя выклікаў" "Кантакты" "Галасавая пошта" - "Выдалена з выбранага" - "Адрабіць" "Выклікаць %s" "Новы кантакт" "Дадаць у кантакт" "Адправiць SMS" "Зрабіць відэавыклік" "Заблакіраваць нумар" - "Новых прапушчаных выклікаў: %s" "У вас пакуль нікога няма на хуткім наборы" "Дадаць улюбёны" - "У вас пакуль няма ніякіх кантактаў" - "Дадаць кантакт" - "Дакраніцеся да відарыса, каб прагледзець усе нумары, або дакраніцеся і ўтрымлівайце, каб змяніць парадак" "Выдаліць" + "Выбраць усё" "Відэавыклік" "Адправiць паведамленне" "Падрабязнасці выкліку" @@ -166,27 +122,14 @@ "Выклікаць ^1" "Відэавыклік ад ^1." "Праслухаць галасавое паведамленне ад ^1" - "Прайграць галасавое паведамленне ад ^1" - "Прыпыніць галасавое паведамленне ад ^1" - "Выдаліць галасавое паведамленне ад ^1" - - %d новае паведамленне галасавой пошты - %d новыя паведамленні галасавой пошты - %d новых паведамленняў галасавой пошты - %d новага паведамлення галасавой пошты - "Стварыць кантакт для ^1" "Дадаць ^1 да існуючага кантакту" "Падрабязнасці кантакту для ^1" - "Выдалена з гісторыі выклікаў." "Сёння" "Учора" "Больш старыя" - "Спіс выклікаў" "Уключыць дынамік." "Адключыць дынамік." - "Прайграваць хутчэй." - "Прайграваць павольней." "Пачаць ці прыпыніць прайграванне." "Параметры адлюстравання" "Гукі і вібрацыя" @@ -203,7 +146,6 @@ "Выклікі" "Блакіраванне выклікаў" "Галасавая пошта" - "Выбр. SIM для налад гал. пошты" "Блакіроўка выклікаў часова адключана" "Блакіроўка выклікаў будзе адключана, таму што вы выклікалі экстранныя службы з гэтага тэлефона на працягу апошніх 48 гадзін. Яна будзе аўтаматычна адноўлена пасля заканчэння перыяду ў 48 гадзін." "Імпартаваць нумары" @@ -217,12 +159,8 @@ "Заблакіраваныя нумары" "%1$s ужо заблакіраваны." "Уліковыя запісы для выклікаў" - "Уключыць" - "Задаць дазволы" "Каб уключыць хуткі набор, уключыце дазвол для Кантактаў." "Каб прагледзець свой журнал выклікаў, уключыце дазволы Тэлефона." - "Каб бачыць свае кантакты, уключыце дазвол для Кантактаў." - "Каб атрымаць доступ да галасавой пошты, уключыце дазвол для Тэлефона." "Каб шукаць свае кантакты, уключыце дазвол для Кантактаў." "Каб зрабіць выклік, уключыце дазвол для Тэлефона." "Праграма Тэлефон не мае дазволу на запіс у налады сістэмы." @@ -234,4 +172,10 @@ "Спам" "Карыстальнік %1$s па-за сеткай і не даступны" "Інфармацыя" + "Расшыфравана Google" + "Google расшыфроўвае..." + "Расшыфроўка недаступная" + "Праглядзець" + "Выклік выдалены. У \"Паведамленнях\" праглядзіце і выдаліце далучэнні, якія былі абагулены падчас гэтага выкліку." + "Выклікі выдалены. У \"Паведамленнях\" праглядзіце і выдаліце далучэнні, якія былі абагулены падчас гэтых выклікаў." diff --git a/java/com/android/dialer/app/res/values-bg/strings.xml b/java/com/android/dialer/app/res/values-bg/strings.xml index 7bab71f3b..812aaa4a2 100644 --- a/java/com/android/dialer/app/res/values-bg/strings.xml +++ b/java/com/android/dialer/app/res/values-bg/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Телефон" "Телефонна клавиатура" - "Телефон" "История на обажданията" - "Сигнал за неправилен номер" "Копиране на номера" "Копиране на преписа" - "Блокиране на номера" - "Отблокиране на номера" "Редактиране на номера преди обаждане" "Изчистване на историята на обажд." "Изтриване на гласова поща" @@ -34,7 +30,6 @@ "Да се изчисти ли историята на обажд.?" "Така ще се изтрият всички обаждания от историята ви" "Историята на обажд. се изчиства…" - "Телефон" "Пропуснато обаждане" "Пропуснато служебно обаждане" "Пропуснати обаждания" @@ -48,107 +43,66 @@ %1$d гласови съобщения Гласово съобщение - "Пускане" "%1$s, %2$s" "Нова гласова поща от %1$s" "Гл. поща не можа да се възпроизведе" "Гласовата поща се зарежда…" - "Гласовата поща се архивира…" "Гласовата поща не можа да се зареди" - "Само обаждания с гласова поща" - "Само входящи обаждания" - "Само изходящи обаждания" - "Само пропуснати обаждания" "(%1$d) %2$s" - "търсене" - "набиране" - "номер за набиране" - "Пускане или спиране на възпроизвеждането" "Включване или изключване на високоговорителя" "Търсене на позиция за възпроизвеждане" - "Намаляване на скоростта на възпроизвеждане" - "Увеличаване на скоростта на възпроизвеждане" "История на обажданията" "Още опции" "цифрова клавиатура" - "Показване само на изходящите" - "Показване само на входящите" - "Показване само на пропуснатите" - "Показване само на гл. поща" - "Показване на всички обаждания" - "Добавяне на 2-сек пауза" - "Добавяне на изчакване" "Настройки" "Симулатор" - "Всички контакти" - "Използване на тонова клавиатура" - "Назад към текущото обаждане" - "Добавяне на обаждане" - "Вх. обаждания" - "Пускане на гласовата поща" - "Преглед на контактa %1$s" - "Обаждане на %1$s" + "Пряк път към новия ПИ" + "Влизате в режима на групови действия" + "Излязохте от режима на групови действия" + "Избрахте %1$s" + "Премахнахте избора от %1$s" "Подробности за контакта за %1$s" "Подробности за връзка за обаждащия се %1$s, евентуално разпространяващ спам" "%1$s обаждания." "Видеообаждане." - "Изпращане на SMS до %1$s" - "Непрослушана гласова поща" "Стартиране на гласово търсене" - "Обаждане на %s" "Гласова поща" - "%s сек" - "%s мин %s сек" - "гласово съобщение" - "гласови съобщения" - "Да" - "Не" - "Избрахте %1$s – да се изтрие ли избраното?" + "Анулиране на режима на групови действия" + "Изтриване" + "Отказ" + "Избрахте %1$s" + + ""Да се изтрият ли тези гласови съобщения? "" + ""Да се изтрие ли това гласово съобщение? "" + @string/call_log_header_today "%1$s в %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Не можете да се обадите на този номер" - "За да настроите гласовата поща, отворете „Меню“ > „Настройки“." - "За да чуете гласовата си поща, първо изключете самолетния режим." - "Зарежда се…" - "IMEI" - "MEID" - "Зарежда се от SIM карта..." - "Контакти от SIM карта" - "Няма налично приложение за контакти" "Гласовото търсене не е налице" - "Не може да се осъществи телефонно обаждане, защото приложението Телефон е деактивирано." "Търсене в контактите" "Доб. номер или потърс. контакт" "Историята на обажданията ви е празна" "Извършване на обаждане" "Нямате пропуснати обаждания." "Входящата ви гласова поща е празна." - "Показване само на любимите" "История на обажданията" "Всички" "Пропуснати" - "Гл. поща" "Бързо набиране" "История на обажданията" "Контакти" "Гласова поща" - "Премахнато от любимите" - "Отмяна" "Обаждане на %s" "Създаване на нов контакт" "Добавяне към контакт" "Изпращане на SMS" "Провеждане на видеообаждане" "Блокиране на номера" - "%s нови пропуснати обаждания" "Още нямате контакти за бързо набиране" "Добавяне на любим контакт" - "Още нямате контакти" - "Добавяне на контакт" - "Докоснете изображението, за да видите всички номера, или го натиснете и задръжте за пренареждане" "Премахване" + "Избиране на всички" "Видеообаждане" "Изпращане на съобщение" "Подробности за обаждането" @@ -164,25 +118,14 @@ "Обаждане на ^1" "Видеообаждане до ^1." "Прослушване на гласовата поща от ^1" - "Пускане на гласовата поща от ^1" - "Поставяне на пауза на гласовата поща от ^1" - "Изтриване на гласовата поща от ^1" - - %d нови гласови съобщения - %d ново гласово съобщение - "Създаване на контакт за ^1" "Добавяне на ^1 към съществуващ контакт" "Подробности за обаждането за ^1" - "Изтрито от историята на обажданията" "Днес" "Вчера" "По-стари" - "Списък с обаждания" "Включване на високоговорителя." "Изключване на високоговорителя." - "По-бързо възпроизвеждане." - "По-бавно възпроизвеждане." "Стартиране или поставяне на пауза на възпроизвеждането." "Опции за показване" "Звуци и вибриране" @@ -199,7 +142,6 @@ "Обаждания" "Блокиране на обажданията" "Гласова поща" - "SIM за настройки на гл. поща" "Блокир. на обажданията е временно изкл." "Блокирането на обажданията е деактивирано, защото в рамките на последните 48 часа сте се свързали със спешните служби от този телефон. То автоматично ще бъде активирано отново, когато периодът от 48 часа изтече." "Импортиране на номерата" @@ -213,12 +155,8 @@ "Блокирани номера" "Номер %1$s вече е блокиран." "Профили за обаждане" - "Включване" - "Задаване на разрешенията" "За да активирате бързото набиране, включете разрешението за Контакти." "За да видите списъка с обажданията си, включете разрешението за Телефон." - "За да видите контактите си, включете разрешението за Контакти." - "За да осъществите достъп до гласовата си поща, включете разрешението за Телефон." "За да търсите в контактите си, включете разрешенията за тях." "За да извършите обаждане, включете разрешението за Телефон." "Приложението Телефон няма разрешение да записва в системните настройки." @@ -230,4 +168,10 @@ "Спам" %1$s не може да се установи връзка, тъй като е офлайн" "Информация" + "Транскрибирано от Google" + "Google създава препис…" + "Няма запис" + "Преглед" + "Обаждането е изтрито. Прегледайте и изтрийте прикачените файлове, споделени по време на това обаждане в Messages." + "Обажданията са изтрити. Прегледайте и изтрийте прикачените файлове, споделени по време на обажданията в Messages." diff --git a/java/com/android/dialer/app/res/values-bn/strings.xml b/java/com/android/dialer/app/res/values-bn/strings.xml index 271247be3..ab0d89653 100644 --- a/java/com/android/dialer/app/res/values-bn/strings.xml +++ b/java/com/android/dialer/app/res/values-bn/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ফোন" "ফোনের কীপ্যাড" - "ফোন" "পুরোনো কলের তালিকা" - "ভুল নম্বর অভিযোগ করুন" "নম্বর প্রতিলিপি করুন" "ট্রান্সক্রিপশান প্রতিলিপি করুন" - "নম্বর অবরোধ করুন" - "নম্বর অবরোধ মুক্ত করুন" "কল করার আগে নম্বর সম্পাদনা করুন" "পুরোনো কলের তালিকা সাফ করুন" "ভয়েসমেল মুছুন" @@ -34,7 +30,6 @@ "পুরোনো কলের তালিকা সাফ করবেন?" "এটি আপনার ইতিহাস থেকে সমস্ত কল মুছে দেবে" "পুরোনো কলের তালিকা সাফ করা হচ্ছে…" - "ফোন" "মিসড কল" "কাজের কল মিস করেছেন" "মিস করা কলগুলি" @@ -48,107 +43,66 @@ %1$dটি ভয়েসমেল %1$dটি ভয়েসমেল - "শুনুন" "%1$s, %2$s" "%1$s এর থেকে নতুন ভয়েসমেল" "ভয়েসমেল প্লে করা যায়নি" "ভয়েসমেল লোড করা হচ্ছে..." - "ভয়েসমেল সংরক্ষণাগারভুক্ত করা হচ্ছে…" "ভয়েসমেল লোড করা যায়নি" - "কেবলমাত্র ভয়েসমেলের সাথে কলগুলি" - "কেবলমাত্র ইনকামিং কলগুলি" - "কেবলমাত্র আউটগোয়িং কলগুলি" - "কেবলমাত্র মিসড কলগুলি" "(%1$d) %2$s" - "অনুসন্ধান" - "ডায়াল করুন" - "ডায়াল করার জন্য নম্বর" - "প্লেব্যাক প্লে করুন বা থামান" "স্পিকার চালু বা বন্ধ করুন" "প্লেব্যাক অবস্থান খুঁজুন" - "প্লেব্যাকের হার হ্রাস করুন" - "প্লেব্যাকের হার বৃদ্ধি করুন" "কলের ইতিহাস" "আরো বিকল্প" "কীপ্যাড" - "কেবলমাত্র আউটগোয়িং দেখান" - "কেবলমাত্র ইনকামিং দেখান" - "কেবলমাত্র মিসড দেখান" - "কেবলমাত্র ভয়েসমেলগুলি দেখান" - "সমস্ত কল দেখান" - "২- সেকেন্ড বিরতি যোগ করুন" - "অপেক্ষা যোগ করুন" "সেটিংস" "সিমুলেটার" - "সকল পরিচিতি" - "স্পর্শ স্বর কীপ্যাড ব্যবহার করুন" - "প্রগতিতে থাকা কলে প্রত্যাবর্তন" - "কল যোগ করুন" - "ইনকামিং কলগুলি" - "ভয়েসমেল প্লে করুন" - "%1$s পরিচিতি দেখুন" - "%1$s কে কল করুন" + "নতুন UI শর্টকাট তৈরি করুন" + "বাল্ক অ্যাকশন মোডে প্রবেশ করা হচ্ছে" + "বাল্ক অ্যাকশন মোড ত্যাগ করুন" + "%1$s নির্বাচন করা হয়েছে" + "%1$s অনির্বাচন করা হয়েছে" "%1$s পরিচিতির বিশদ বিবরণ" "সন্দেহভাজন স্প্যাম কলারের পরিচিতির বিশদ বিবরণ %1$s" "%1$sটি কল৷" "ভিডিও কল।" - "%1$s কে SMS পাঠান" - "না শোনা ভয়েসমেল" "ভয়েস অনুসন্ধান শুরু করুন" - "%s এ কল করুন" "ভয়েসমেল" - "%s সেকেন্ড" - "%s মিনিট %s সেকেন্ড" - "ভয়েসমেল" - "ভয়েসমেলগুলি" - "হ্যাঁ" - "না" - "নির্বাচিত %1$s মুছে ফেলতে চান?" + "ব্যাচ অ্যাকশন মোড বাতিল করুন" + "মুছুন" + "বাতিল করুন" + "%1$sটি নির্বাচিত" + + ""এই ভয়েসমেলগুলি মুছবেন? "" + ""এই ভয়েসমেলগুলি মুছবেন? "" + @string/call_log_header_today "%1$s তারিখে %2$s\'টায়" "%1$02d:%2$02d" "%1$s%2$s" - "এই নম্বরে কল করতে পারবেন না" - "ভয়েসমেল সেট আপ করতে, মেনু > সেটিংস এ যান৷" - "ভয়েসমেলে কল করতে, সবার আগে বিমানমোড বন্ধ করুন৷" - "লোড হচ্ছে..." - "IMEI" - "MEID" - "সিম কার্ড থেকে লোড করা হচ্ছে…" - "সিম কার্ডের পরিচিতিগুলি" - "কোনো পরিচিতি অ্যাপ্লিকেশান উপলব্ধ নয়" "ভয়েস অনুসন্ধান অনুপলব্ধ" - "কোনো ফোন কল করা যাবে না কারণ ফোন অ্যাপ্লিকেশানটি অক্ষম করা হয়েছে৷" "পরিচিতিগুলি খুঁজুন" "সংখ্যা যোগ করুন বা পরিচিতিগুলি অনুসন্ধান করুন" "আপনার পুরোনো কলের তালিকা খালি আছে" "একটি কল করুন" "আপনার কোনো মিসড কল নেই।" "আপনার ভয়েসমেলের ইনবক্স খালি রয়েছে।" - "কেবলমাত্র পছন্দসইগুলি দেখান" "পুরোনো কলের তালিকা" "সমস্ত" "মিসড" - "ভয়েসমেল" "দ্রুত ডায়াল" "পুরোনো কলের তালিকা" "পরিচিতিগুলি" "ভয়েস মেল" - "পছন্দসই থেকে সরানো হয়েছে" - "পূর্বাবস্থায় ফিরুন" "%s এ কল করুন" "নতুন পরিচিতি বানান" "একটি পরিচিতিতে যোগ করুন" "SMS পাঠান" "ভিডিও কল করুন" "নম্বর অবরোধ করুন" - "%sটি নতুন মিসড কল" "আপনার স্পীড ডায়ালে এখনও পর্যন্ত কেউ নেই" "একটি পছন্দসই যোগ করুন" - "আপনার এখনও পর্যন্ত কোনো পরিচিতি নেই" - "একটি পরিচিতি যোগ করুন" - "সমস্ত নম্বর দেখতে ছবিতে স্পর্শ করুন বা রেকর্ড করতে স্পর্শ করে ধরে রাখুন" "সরান" + "সবগুলি নির্বাচন করুন" "ভিডিও কল" "একটি বার্তা পাঠান" "কলের বিশদ বিবরণ" @@ -164,25 +118,14 @@ "^1 এর কল" "^1-এ ভিডিও কল করুন।" "^1 এর থেকে আসা ভয়েসমেল শোনা হয়েছে" - "^1 এর থেকে ভয়েসমেল প্লে করুন" - "^1 এর থেকে ভয়েসমেলে বিরাম দিন" - "^1 এর থেকে ভয়েসমেল মুছুন" - - %dটি নতুন ভয়েসমেল - %dটি নতুন ভয়েসমেল - "^1 এর জন্য পরিচিতি তৈরি করুন" "বিদ্যমান পরিচিতিতে ^1 যোগ করুন" "^1 এর কলের বিবরণ" - "কলের ইতিহাস থেকে মোছা হয়েছে" "আজ" "গতকাল" "পুরোনো" - "কলগুলির তালিকা" "স্পিকার চালু করুন৷" "স্পিকার বন্ধ করুন৷" - "দ্রুত প্লে করুন৷" - "ধীরে প্লে করুন৷" "প্লেব্যাক শুরু করুন বা বিরতি দিন৷" "প্রদর্শনের বিকল্পগুলি" "শব্দ এবং কম্পন" @@ -199,7 +142,6 @@ "কল" "কল অবরোধ করা" "ভয়েসমেল" - "ভয়েসমেল সেটিংসের জন্য সিম নির্বাচন করুন" "কল অবরোধ সাময়িকভাবে বন্ধ রয়েছে" "কল অবরোধ অক্ষম করা হয়েছে কারণ আপনি গত ২৮ ঘন্টার মধ্যে এই ফোন থেকে জরুরি পরিষেবায় যোগাযোগ করেছেন। ২৮ ঘন্টার সময়সীমা পেরিয়ে গেলেই এটি স্বয়ংক্রিয়ভাবে আবার সক্ষম হবে।" "নম্বরগুলি আমদানি করুন" @@ -213,12 +155,8 @@ "ব্লক করা নাম্বারগুলি" "%1$s ইতিমধ্যেই অববোধ করা রয়েছে৷" "কলিং অ্যাকাউন্টগুলি" - "চালু করুন" - "অনুমতিগুলি সেট করুন" "স্পীড ডায়াল সক্ষম করতে, পরিচিতিগুলির অনুমতি চালু করুন।" "আপনার কল লগ দেখতে, ফোনের অনুমতি চালু করুন।" - "আপনার পরিচিতিগুলি দেখতে, পরিচিতিগুলির অনুমতি চালু করুন।" - "আপনার ভয়েসমেল অ্যাক্সেস করতে, ফোনের অনুমতি চালু করুন।" "আপনার পরিচিতিগুলি অনুসন্ধান করতে, পরিচিতির অনুমতিগুলি চালু করুন।" "একটি কল করতে, ফোনের অনুমতি চালু করুন।" "ফোনের অ্যাপ্লিকেশানকে সিস্টেম সেটিংসে লেখার অনুমতি দেওয়া হয়নি।" @@ -230,4 +168,10 @@ "স্প্যাম" "%1$s এখন অফলাইনে থাকায় যোগাযোগ করা যাবে না" "সম্পর্কে" + "Google এর প্রতিলিপি করা হয়েছে" + "Google ট্রান্সক্রাইব করছে …" + "প্রতিলিপি উপলব্ধ নয়" + "দেখুন" + "কল মোছা হয়েছে। বার্তার মধ্যে কলের সময় শেয়ার করা সংযুক্তি দেখুন ও মুছুন।" + "কলগুলি মোছা হয়েছে। বার্তার মধ্যে কলের সময় শেয়ার করা সংযুক্তিগুলি দেখুন ও মুছুন।" diff --git a/java/com/android/dialer/app/res/values-bs/strings.xml b/java/com/android/dialer/app/res/values-bs/strings.xml index 92c9c14e0..b55f90124 100644 --- a/java/com/android/dialer/app/res/values-bs/strings.xml +++ b/java/com/android/dialer/app/res/values-bs/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefonska tastatura" - "Telefon" "Historija poziva" - "Prijavi netačan broj" "Kopiraj broj" "Kopiraj transkripciju" - "Blokiraj broj" - "Deblokiraj broj" "Uredi broj prije poziva" "Obriši historiju poziva" "Izbriši govornu poštu" @@ -34,7 +30,6 @@ "Obrisati historiju poziva?" "Ovo će izbrisati sve pozive iz historije" "Brisanje historije poziva u toku…" - "Telefon" "Propušteni poziv" "Propušteni poslovni poziv" "Propušteni pozivi" @@ -49,107 +44,67 @@ %1$d Poruke govorne pošte %1$d Poruka govorne pošte - "Pokreni" "%1$s, %2$s" "Nova govorna pošta od %1$s" "Nije moguće pokrenuti govornu poštu" "Učitavanje govorne pošte…" - "Arhiviranje govorne pošte..." "Nije moguće učitati govornu poštu" - "Samo pozivi s govornom poštom" - "Samo dolazni pozivi" - "Samo odlazni pozivi" - "Samo propušteni pozivi" "(%1$d) %2$s" - "pretraga" - "biraj" - "broj za biranje" - "Pokreni ili zaustavi pokretanje" "Uključi ili isključi zvučnik" "Traženje položaja reprodukcije" - "Smanjenje brzine reprodukcije" - "Povećavanje brzine reprodukcije" "Historija poziva" "Više opcija" "telefonska tastatura" - "Prikaži samo odlazne" - "Prikaži samo dolazne" - "Prikaži samo propuštene" - "Prikaži samo govornu poštu" - "Prikaži sve pozive" - "Dodaj pauzu od 2 sekunde" - "Dodaj čekanje" "Postavke" "Simulator" - "Svi kontakti" - "Koristi tastaturu za tonsko biranje" - "Povratak na poziv u toku" - "Dodaj poziv" - "Dolazni pozivi" - "Pokretanje govorne pošte" - "Prikaži kontakt %1$s" - "Pozovi kontakt %1$s" + "Kreiraj prečicu za novi UI" + "Ulazak u način rada za skupnu radnju" + "Napuštanje načina rada za skupnu radnju" + "Odabrano %1$s" + "Poništen odabir %1$s" "Detalji o kontaktu %1$s" "Detalji o kontaktu za potencijalnog neželjenog pozivaoca %1$s" "Broj poziva: %1$s." "Videopoziv." - "Pošalji SMS kontaktu %1$s" - "Nepreslušana govorna pošta" - "Pokreni glasovnu pretragu" - "Pozovi %s" + "Pokreni glasovno pretraživanje" "Govorna pošta" - "%s sek." - "%s min. %s sek." - "poruka govorne pošte" - "poruke govorne pošte" - "Da" - "Ne" - "Izbrisati izabranu/e %1$s?" + "Otkaži način rada za grupnu radnju" + "Izbriši" + "Otkaži" + "Odabrano %1$s" + + ""Izbrisati ove govorne poruke? "" + ""Izbrisati ove govorne poruke? "" + ""Izbrisati ove govorne poruke? "" + @string/call_log_header_today "%1$s u %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Nije moguće pozvati ovaj broj" - "Da postavite govornu poštu, idite na Meni > Postavke." - "Da pozovete govornu poštu, prvo isključite Način rada u avionu." - "Učitavanje..." - "IMEI" - "MEID" - "Učitavanje sa SIM kartice…" - "Kontakti sa SIM kartice" - "Nije dostupna nijedna aplikacija za kontakte" - "Glasovna pretraga nije dostupna" - "Nije moguće uputiti poziv jer je aplikacija Telefon onemogućena." + "Glasovno pretraživanje nije dostupno" "Traži kontakte" "Dodajte broj ili tražite kontakte" "Vaša historija poziva je prazna." "Pozovi" "Nemate propuštenih poziva." "Vaše sanduče govorne pošte je prazno." - "Prikaži samo favorite" "Historija poziva" "Sve" "Propušteni" - "Govorna pošta" "Brzo biranje" "Historija poziva" "Kontakti" "Govorna pošta" - "Uklonjeno iz favorita" - "Poništi" "Pozovi %s" - "Napravi novi kontakt" + "Izrada novog kontakta" "Dodaj u kontakt" "Pošalji SMS" "Uputi videopoziv" "Blokiraj broj" - "Broj novih propuštenih poziva: %s" "Nemate nikog na brzom biranju" "Dodaj u favorite" - "Još nemate nijedan kontakt" - "Dodaj kontakt" - "Dodirnite sliku da vidite sve brojeve ili dodirnite i držite da promijenite raspored." "Ukloni" + "Odaberi sve" "Videopoziv" "Pošalji poruku" "Detalji o pozivu" @@ -165,26 +120,14 @@ "Pozovi kontakt ^1" "Uputi videopoziv kontaktu ^1." "Preslušaj govornu poštu od kontakta ^1" - "Pokreni govornu poštu od kontakta ^1" - "Pauziraj govornu poštu od kontakta ^1" - "Izbriši govornu poštu od kontakta ^1" - - %d nova poruka govorne pošte - %d nove poruke govorne pošte - %d novih poruka govorne pošte - - "Napravi kontakt za ^1" + "Kreirajte kontakt za ^1" "Dodaj ^1 postojećem kontaktu" "Detalji poziva za ^1" - "Izbrisano iz historije poziva" "Danas" "Jučer" "Starije" - "Lista poziva" "Uključite zvučnik." "Isključivanje zvučnika." - "Brže pokretanje." - "Sporije pokretanje.." "Pokreni ili pauziraj pokretanje" "Opcije prikaza" "Zvukovi i vibracija" @@ -201,7 +144,6 @@ "Pozivi" "Blokiranje poziva" "Govorna pošta" - "Odaberite SIM karticu za postavke govorne pošte" "Blokiranje poziva je privremeno isključeno" "Blokiranje poziva je onemogućeno jer ste kontaktirali hitnu službu s ovog telefona u proteklih 48 sati. Automatski će se ponovo omogućiti kada istekne 48 sati." "Uvezi brojeve" @@ -215,12 +157,8 @@ "Blokirani brojevi" "%1$s je već blokiran." "Računi za pozivanje" - "Uključi" - "Postavi dozvole" "Da omogućite brzo biranje, uključite dozvolu za Kontakte." "Da vidite popis poziva, uključite dozvolu za Telefon." - "Da vidite kontakte, uključite dozvolu za Kontakte." - "Da pristupite govornoj pošti,uključite dozvolu za telefon." "Da pretražujete kontakte, uključite dozvole za Kontakte." "Da uputite poziv, uključite dozvolu za Telefon." "Aplikacija za telefon nema dozvolu za pisanje u postavkama sistema." @@ -232,4 +170,10 @@ "Neželjena pošta" "Osoba %1$s je van mreže i ne možete je kontaktirati" "O aplikaciji" + "Transkribirao Google" + "Google transkribira…" + "Transkript nije dostupan" + "Prikaži" + "Poziv je izbrisan. Pogledajte i izbrišite priloge podijeljene tokom ovog poziva u aplikaciji Messages." + "Pozivi su izbrisani. Pogledajte i izbrišite priloge podijeljene tokom poziva u aplikaciji Messages." diff --git a/java/com/android/dialer/app/res/values-ca/strings.xml b/java/com/android/dialer/app/res/values-ca/strings.xml index fa04dd980..e87a6158c 100644 --- a/java/com/android/dialer/app/res/values-ca/strings.xml +++ b/java/com/android/dialer/app/res/values-ca/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telèfon" "Teclat del telèfon" - "Telèfon" "Historial de trucades" - "Informa d\'un número incorrecte" "Copia el número" "Copia la transcripció" - "Bloqueja el número" - "Desbloqueja el número" "Edita el número abans de trucar" "Esborra l\'historial de trucades" "Suprimeix la bústia de veu" @@ -34,7 +30,6 @@ "Esborrar l\'historial de trucades?" "Se suprimiran totes les trucades de l\'historial." "Esborrant historial de trucades..." - "Telèfon" "Trucada perduda" "Trucada perduda de feina" "Trucades perdudes" @@ -48,107 +43,66 @@ %1$d bústies de veu Bústia de veu - "Reprodueix" "%1$s, %2$s" "Nou missatge de veu de %1$s" "Error en reproduir el missatge de veu." "S\'està carregant la bústia de veu..." - "S\'estan arxivant els missatges de veu…" "No s\'ha pogut carregar la bústia de veu." - "Només trucades amb bústia de veu" - "Només trucades entrants" - "Només trucades sortints" - "Només trucades perdudes" "(%1$d) %2$s" - "cerca" - "marca" - "número que es marcarà" - "Reprodueix o atura la reproducció" "Activa o desactiva el mans lliures" "Cerca la posició de la reproducció" - "Disminueix la velocitat de la reproducció" - "Augmenta la velocitat de la reproducció" "Historial de trucades" "Més opcions" "teclat" - "Mostra només trucades sortints" - "Mostra només trucades entrants" - "Mostra només trucades perdudes" - "Mostra només missatges de veu" - "Mostra totes les trucades" - "Afegeix una pausa de 2 segons" - "Afegeix espera" "Configuració" "Simulador" - "Tots els contactes" - "Utilitza el teclat de tons" - "Torna a la trucada en curs" - "Afegeix una trucada" - "Trucades entrants" - "Reprodueix el missatge de veu" - "Visualitza el contacte %1$s" - "Truca a %1$s" + "Crea drecera per a la nova IU" + "S\'està accedint al mode d\'acció massiva" + "S\'ha sortit del mode d\'acció massiva" + "S\'ha seleccionat %1$s" + "S\'ha desseleccionat %1$s" "Dades de contacte de: %1$s" "Dades de contacte de la possible trucada brossa: %1$s" "%1$s trucades" "Videotrucada" - "Envia un SMS a %1$s." - "Missatge de veu no escoltat" "Inicia la cerca per veu" - "Truca al %s" "Bústia de veu" - "%s s" - "%s min %s s" - "missatge de veu" - "missatges de veu" - "Sí" - "No" - "Vols suprimir l\'element o elements seleccionats (%1$s)?" + "Cancel·la el mode d\'accions en lot" + "Suprimeix" + "Cancel·la" + "%1$s seleccionades" + + ""Vols suprimir aquests missatges de veu? "" + ""Vols suprimir aquest missatge de veu? "" + @string/call_log_header_today "%1$s a les %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "No es pot trucar a aquest número." - "Per configurar els missatges de veu, vés a Menú > Configuració." - "Per trucar a la bústia de veu, primer has de desactivar el mode d\'avió." - "S\'està carregant…" - "IMEI" - "MEID" - "S\'està carregant des de la targeta SIM..." - "Contactes de la targeta SIM" - "No hi ha cap contacte disponible." "La cerca per veu no està disponible." - "No es pot fer una trucada telefònica perquè s\'ha desactivat l\'aplicació de telèfon." "Cerca als contactes" "Afegeix núm. o cerca contactes" "El teu historial de trucades és buit" "Fes una trucada" "No tens cap trucada perduda." - "La safata d\'entrada de la bústia de veu està buida." - "Mostra només els preferits" + "La safata d\'entrada de la bústia de veu és buida." "Historial de trucades" "Totes" "Perdudes" - "Missatge de veu" "Marcatge ràpid" "Historial de trucades" "Contactes" "Bústia de veu" - "Eliminat dels preferits" - "Desfés" "Truca al %s" "Crea un contacte" "Afegeix a un contacte" "Envia SMS" "Fes una videotrucada" "Bloqueja el número" - "%s trucades perdudes noves" "Encara no tens cap contacte al marcatge ràpid" "Afegeix un preferit" - "Encara no tens cap contacte" - "Afegeix un contacte" - "Toca la imatge per veure\'n tots els números o bé mantén-la premuda per canviar-ne l\'ordre" "Suprimeix" + "Selecciona-ho tot" "Videotrucada" "Envia un missatge" "Detalls de la trucada" @@ -164,25 +118,14 @@ "Truca a ^1" "Videotrucada amb ^1." "Escolta el missatge a la bústia de veu de: ^1" - "Reprodueix el missatge de veu de: ^1" - "Posa en pausa el missatge de veu de: ^1" - "Suprimeix el missatge de veu de: ^1" - - %d nous correus de veu - %d nou correu de veu - "Crea un contacte per a ^1" "Afegeix ^1 a un contacte existent" "Detalls de la trucada de ^1" - "S\'ha suprimit de l\'historial de trucades." "Avui" "Ahir" "Més antiga" - "Llista de trucades" "Activa l\'altaveu." "Desactiva l\'altaveu." - "Reprodueix més ràpidament." - "Reprodueix més lentament." "Inicia la reproducció o la posa en pausa." "Opcions de visualització" "Sons i vibració" @@ -199,7 +142,6 @@ "Trucades" "Bloqueig de trucades" "Bústia de veu" - "Tria la SIM per a la configuració de la bústia" "Bloqueig de trucades desactivat tempor." "El bloqueig de trucades s\'ha desactivat perquè has contactat amb els serveis d\'emergència des d\'aquest telèfon durant les últimes 48 hores. Es tornarà a activar automàticament una vegada transcorregut el període de 48 hores." "Importa els números" @@ -213,12 +155,8 @@ "Números bloquejats" "%1$s ja està bloquejat." "Comptes de trucades" - "Activa" - "Defineix els permisos" "Activa el permís Contactes per activar el marcatge ràpid." "Activa el permís Telèfon per veure el teu registre de trucades." - "Activa el permís Contactes per veure els teus contactes." - "Activa el permís Telèfon per accedir a la bústia de veu." "Per cercar els teus contactes, activa els permisos de Contactes." "Activa el permís Telèfon per fer una trucada." "L\'aplicació Telèfon no té permís per escriure a la configuració del sistema." @@ -227,7 +165,13 @@ "Bloqueja el número" "No és una trucada brossa" "Desbloqueja el número" - "Contingut brossa" + "Trucada brossa" "%1$s no té connexió i no s\'hi pot contactar" "Informació" + "Transcripció feta per Google" + "Google està transcrivint…" + "Transcripció no disponible" + "Mostra" + "S\'ha suprimit la trucada. Consulta i suprimeix els fitxers adjunts compartits durant aquesta trucada a Missatges." + "S\'han suprimit les trucades. Consulta i suprimeix els fitxers adjunts compartits durant les trucades a Missatges." diff --git a/java/com/android/dialer/app/res/values-cs/strings.xml b/java/com/android/dialer/app/res/values-cs/strings.xml index 5a3e42913..d69c96e31 100644 --- a/java/com/android/dialer/app/res/values-cs/strings.xml +++ b/java/com/android/dialer/app/res/values-cs/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Klávesnice telefonu" - "Telefon" "Historie volání" - "Nahlásit nesprávné číslo" "Kopírovat číslo" "Kopírovat přepis" - "Blokovat číslo" - "Zrušit blokování čísla" "Před voláním upravit číslo" "Vymazat historii volání" "Smazat hlasovou zprávu" @@ -34,7 +30,6 @@ "Vymazat historii hovorů?" "Tímto z historie smažete všechny hovory." "Mazání historie volání…" - "Telefon" "Zmeškaný hovor" "Zmeškaný pracovní hovor" "Zmeškané hovory" @@ -50,107 +45,68 @@ %1$d hlasových zpráv Hlasová zpráva - "Přehrát" "%1$s, %2$s" "Nová hlasová zpráva – %1$s" "Hlasovou schránku nelze přehrát." "Načítání hlasové schránky…" - "Archivace hlasové zprávy…" "Hlasovou schránku nelze načíst." - "Jen hovory s hlasovou schránkou" - "Jen příchozí hovory" - "Jen odchozí hovory" - "Jen zmeškané hovory" "(%1$d) %2$s" - "vyhledat" - "vytáčení" - "vytáčené číslo" - "Spuštění a zastavení přehrávání" "Zapnutí a vypnutí reproduktoru" "Vyhledání pozice přehrávání" - "Snížení rychlosti přehrávání" - "Zvýšení rychlosti přehrávání" "Historie volání" "Více možností" "klávesnice" - "Zobrazit pouze odchozí" - "Zobrazit pouze příchozí" - "Zobrazit pouze zmeškané" - "Zobrazit pouze hlas. schránku" - "Zobrazit všechny hovory" - "Přidat pauzu 2 s" - "Přidat čekání" "Nastavení" "Simulátor" - "Všechny kontakty" - "Použít dotykovou tónovou klávesnici" - "Návrat k probíhajícímu hovoru" - "Přidat hovor" - "Příchozí volání" - "Přehrát hlasovou schránku" - "Zobrazit kontakt %1$s" - "Volat kontakt %1$s" + "Vytv. zkratku na nové rozhraní" + "Vstupování do režimu hromadných akcí" + "Opustili jste režim hromadných akcí" + "Položka %1$s je vybrána" + "Položka %1$s není vybrána" "Podrobnosti kontaktu pro %1$s" "Kontaktní údaje volajícího podezřelého ze spamu: %1$s" "Počet hovorů: %1$s" "Videohovor" - "Odeslat SMS kontaktu %1$s" - "Nevyslechnutá hlasová zpráva" "Spustit hlasové vyhledávání" - "Zavolat %s" "Hlasová schránka" - "%s s" - "%s min %s s" - "vybranou hlasovou zprávu" - "vybrané hlasové zprávy" - "Ano" - "Ne" - "Smazat %1$s?" + "Zrušit režim hromadných akcí" + "Smazat" + "Zrušit" + "Vybráno: %1$s" + + ""Smazat tyto hlasové zprávy? "" + ""Smazat tyto hlasové zprávy? "" + ""Smazat tyto hlasové zprávy? "" + ""Smazat tuto hlasovou zprávu? "" + @string/call_log_header_today "%1$s%2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Na toto číslo nelze volat." - "Pokud chcete nastavit hlasovou schránku, přejděte na nabídku > Nastavení." - "Pokud chcete volat do hlasové schránky, vypněte nejdříve režim letadla." - "Načítá se..." - "IMEI" - "MEID" - "Načítání ze SIM karty..." - "Kontakty na SIM kartě" - "Není k dispozici žádná aplikace pro práci s kontakty." "Hlasové vyhledávání není k dispozici." - "Telefonický hovor nelze uskutečnit, protože aplikace Telefon byla zakázána." "Vyhledat kontakty" "Přidejte číslo nebo vyhledejte kontakty" "Historie volání je prázdná" "Zavolat" "Nemáte žádné zmeškané hovory." "Hlasová schránka je prázdná." - "Zobrazit pouze oblíbené" "Historie volání" "Všechny" "Zmeškané" - "Schránka" "Rychlá volba" "Historie volání" "Kontakty" "Hlasová schránka" - "Odebráno z oblíbených" - "Vrátit zpět" "Zavolat %s" "Vytvořit nový kontakt" "Přidat ke kontaktu" "Odeslat SMS" "Uskutečnit videohovor" "Blokovat číslo" - "Nové zmeškané hovory: %s" "V rychlém vytáčení zatím nemáte žádný kontakt." "Přidat oblíbený kontakt" - "Zatím nemáte žádné kontakty" - "Přidat kontakt" - "Klepnutím na obrázek zobrazíte všechna čísla. Podržením můžete změnit pořadí." "Odstranit" + "Vybrat všechny" "Videohovor" "Odeslat zprávu" "Podrobnosti hovoru" @@ -166,27 +122,14 @@ "Volat kontakt ^1" "Videohovor s kontaktem ^1" "Poslech hlasové schránky od ^1" - "Přehrát hlasovou zprávu od kontaktu ^1" - "Pozastavit hlasovou zprávu od kontaktu ^1" - "Smazat hlasovou zprávu od kontaktu ^1" - - %d nové zprávy v hlasové schránce - %d nové zprávy v hlasové schránce - %d nových zpráv v hlasové schránce - %d nová zpráva v hlasové schránce - "Pro záznam ^1 se vytvoří nový kontakt" "Záznam ^1 se přidá k existujícímu kontaktu" "Podrobnosti volání ^1" - "Smazáno z historie volání" "Dnes" "Včera" "Starší" - "Seznam volání" "Zapnout reproduktor." "Vypnout reproduktor." - "Přehrávat rychleji." - "Přehrávat pomaleji." "Spustit nebo pozastavit přehrávání." "Možnosti zobrazení" "Zvuky a vibrace" @@ -203,7 +146,6 @@ "Volání" "Blokování hovorů" "Hlasová schránka" - "Vyberte SIM kartu k nastavení hlasové schránky" "Blokování hovorů je dočasně vypnuto" "Protože jste z tohoto telefonu během posledních 48 hodin volali na tísňovou linku, bylo blokování hovorů vypnuto. Po uplynutí 48 hodin se automaticky znovu zapne." "Importovat čísla" @@ -217,12 +159,8 @@ "Blokovaná čísla" "Číslo %1$s je již blokováno." "Účty pro volání" - "Zapnout" - "Nastavit oprávnění" "Chcete-li povolit rychlé vytáčení, aktivujte oprávnění Kontakty." "Chcete-li zobrazit seznam hovorů, aktivujte oprávnění Telefon." - "Chcete-li zobrazit kontakty, aktivujte oprávnění Kontakty." - "Chcete-li přejít do hlasové schránky, aktivujte oprávnění Telefon." "Chcete-li vyhledat kontakty, zapněte oprávnění Kontakty." "Chcete-li uskutečnit hovor, aktivujte oprávnění Telefon." "Aplikace Telefon nemá oprávnění provádět zápis do nastavení systému." @@ -234,4 +172,10 @@ "Spam" "Uživatel %1$s je offline a není možné se s ním spojit" "O aplikaci" + "Přepsáno Googlem" + "Google přepisuje zprávu…" + "Přepis není k dispozici" + "Zobrazit" + "Hovor byl smazán. Přílohy sdílené během něj můžete zobrazit a smazat v aplikaci Zprávy." + "Hovory byly smazány. Přílohy sdílené během nich můžete zobrazit a smazat v aplikaci Zprávy." diff --git a/java/com/android/dialer/app/res/values-da/strings.xml b/java/com/android/dialer/app/res/values-da/strings.xml index 42aa66378..be2dd4867 100644 --- a/java/com/android/dialer/app/res/values-da/strings.xml +++ b/java/com/android/dialer/app/res/values-da/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Opkald" "Telefontastatur" - "Opkald" "Opkaldshistorik" - "Rapportér et forkert nummer" "Kopiér nummeret" "Kopiér transskriptionen" - "Bloker nummeret" - "Ophæv blokering af nummeret" "Rediger nummeret før opkald" "Ryd opkaldshistorik" "Slet talemeddelelsen" @@ -34,7 +30,6 @@ "Vil du rydde opkaldshistorikken?" "Dette vil slette alle opkald fra din historik" "Opkaldshistorik ryddes..." - "Telefon" "Ubesvarede opkald" "Ubesvaret arbejdsopkald" "Ubesvarede opkald" @@ -48,107 +43,66 @@ %1$d talebeskeder %1$d talebeskeder - "Spil" "%1$s, %2$s" "Ny besked fra %1$s" "Telefonsvarerbesked kan ikke afspilles" "Telefonsvarerbesked indlæses..." - "Arkiverer talebeskeden…" "Telefonsvarerbesked kan ikke indlæses" - "Kun opkald med telefonsvarer" - "Kun indgående opkald" - "Kun udgående opkald" - "Kun ubesvarede opkald" "(%1$d) %2$s" - "søg" - "ring op" - "nummer at ringe op" - "Start eller stop afspilning" "Slå medhør til eller fra" "Søg efter afspilningsposition" - "Skru ned for afspilningshastigheden" - "Skru op for afspilningshastigheden" "Opkaldshistorik" "Flere valgmuligheder" "tastatur" - "Vis kun udgående" - "Vis kun indgående" - "Vis kun ubesvarede" - "Vis kun telefonsvarerbeskeder" - "Vis alle opkald" - "Tilføj pause på 2 sek." - "Tilføj ventetid" "Indstillinger" "Simulator" - "Alle kontakter" - "Brug numerisk tastatur" - "Vend tilbage til igangværende opkald" - "Tilføj opkald" - "Indgående opkald" - "Afspil telefonsvarerbesked" - "Vis kontaktpersonen %1$s" - "Ring til %1$s" + "Opret ny brugerfladegenvej" + "Massehandlingstilstanden startes" + "Massehandlingstilstanden blev afsluttet" + "Valgt %1$s" + "Fravalgt %1$s" "Kontaktoplysninger for %1$s" "Kontaktoplysninger om formodet spammer %1$s" "%1$s opkald." "Videoopkald." - "Send sms-besked til %1$s" - "Uaflyttet besked på telefonsvareren" "Start talesøgning" - "Ring til %s" "Telefonsvarer" - "%s sek." - "%s min. %s sek." - "talebesked" - "talebeskeder" - "Ja" - "Nej" - "Vil du slette de valgte %1$s?" + "Annuller massehandlingstilstand" + "Slet" + "Annuller" + "%1$s er valgt" + + ""Vil du slette denne talebesked? "" + ""Vil du slette disse talebeskeder? "" + @string/call_log_header_today "%1$s kl. %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Det er ikke muligt at ringe til dette nummer" - "Hvis du vil konfigurere telefonsvareren, skal du gå til Menu > Indstillinger." - "Hvis du vil ringe til telefonsvareren, skal du først slå Flytilstand fra." - "Indlæser…" - "IMEI-nummer" - "MEID" - "Indlæser fra SIM-kort ..." - "Kontakter på SIM-kort" - "Der er ingen app til kontaktpersoner" "Talesøgning er ikke tilgængelig" - "Det er ikke muligt at foretage et telefonopkald, fordi applikationen Telefon er deaktiveret." "Søg i kontakter" "Tilføj nummer, eller søg i kontaktpersoner" "Din opkaldshistorik er tom" "Foretag et opkald" "Du har ingen ubesvarede opkald." "Indbakken for din telefonsvarer er tom." - "Vis kun foretrukne" "Opkaldshistorik" "Alle" "Ubesvarede" - "Talebesked" "Hurtigopkald" "Opkaldshistorik" "Kontaktpersoner" "Telefonsvarer" - "Fjernet fra foretrukne" - "Fortryd" "Ring til %s" "Opret ny kontaktperson" "Føj til en kontaktperson" "Send sms" "Foretag videoopkald" "Bloker nummer" - "%s nye ubesvarede opkald" "Der er endnu ingen kontaktpersoner i Hurtigopkald" "Angiv en kontaktperson som foretrukken" - "Du har endnu ikke nogen kontaktpersoner" - "Tilføj en kontaktperson" - "Tryk på billedet for at se alle numre, eller tryk og hold nede på billedet for at omarrangere" "Fjern" + "Vælg alt" "Videoopkald" "Send en sms-besked" "Opkaldsinfo" @@ -164,25 +118,14 @@ "Ring til ^1" "Videoopkald ^1." "Lyt til indtalt besked fra ^1" - "Afspil talemeddelelsen fra ^1" - "Sæt talemeddelelsen fra ^1 på pause" - "Slet talemeddelelsen fra ^1" - - %d nye talemeddelelser - %d nye talemeddelelser - "Opret en kontaktperson for ^1" "Føj ^1 til en eksisterende kontaktperson" "Opkaldsoplysninger for ^1" - "Slettet fra opkaldshistorik" "I dag" "I går" "Ældre" - "Opkaldsliste" "Slå højttaler til." "Slå højttaler fra." - "Afspil hurtigere." - "Afspil langsommere." "Start afspilningen, eller sæt den på pause." "Valgmuligheder for visning" "Lyde og vibration" @@ -199,7 +142,6 @@ "Opkald" "Opkaldsblokering" "Telefonsvarer" - "Vælg SIM til telefonsvarerindst." "Opkaldsblokering er midlertidigt slået fra" "Opkaldsblokering er blevet deaktiveret, da du inden for de sidste 48 timer har kontaktet en alarmcentral. Blokeringen aktiveres automatisk igen, når perioden på 48 timer er udløbet." "Importér numre" @@ -213,12 +155,8 @@ "Blokerede telefonnumre" "%1$s er allerede blokeret." "Opkaldskonti" - "Aktivér" - "Angiv tilladelser" "Slå tilladelsen Kontaktpersoner til for at aktivere hurtigopkald." "Slå tilladelsen Telefon til for at se din opkaldsliste." - "Slå tilladelsen Kontaktpersoner til for at se dine kontaktpersoner." - "Slå tilladelsen Telefon til for at få adgang til din telefonsvarer," "Hvis du vil søge i dine kontaktpersoner, skal du slå tilladelserne Kontaktpersoner til." "Slå tilladelsen Telefon til for at foretage et opkald." "Opkaldsappen har ikke tilladelse til at ændre systemindstillinger." @@ -230,4 +168,10 @@ "Spam" "%1$s er offline og kan ikke nås" "Om" + "Transskriberet af Google" + "Google transskriberer…" + "Transskription ej tilgængelig" + "Vis" + "Opkaldet er slettet. Du kan se og slette vedhæftede filer, der er delt i forbindelse med dette opkald, i Beskeder." + "Opkaldene er slettet. Du kan se og slette vedhæftede filer, der er delt i forbindelse med opkald, i Beskeder." diff --git a/java/com/android/dialer/app/res/values-de/strings.xml b/java/com/android/dialer/app/res/values-de/strings.xml index 5653e0f12..48732ef01 100644 --- a/java/com/android/dialer/app/res/values-de/strings.xml +++ b/java/com/android/dialer/app/res/values-de/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Wähltasten für Telefon" - "Telefon" "Anrufliste" - "Falsche Nummer melden" "Nummer kopieren" "Transkription kopieren" - "Nummer blockieren" - "Blockierung der Nummer aufheben" "Nummer vor Anruf bearbeiten" "Anrufliste löschen" "Mailboxnachricht löschen" @@ -34,7 +30,6 @@ "Anrufliste löschen?" "Alle Anrufe werden aus deinem Verlauf gelöscht." "Anrufliste wird gelöscht…" - "Telefon" "Entgangener Anruf" "Verpasster geschäftlicher Anruf" "Entgangene Anrufe" @@ -48,107 +43,66 @@ %1$d Mailboxnachrichten Mailboxnachricht - "Anhören" "%1$s, %2$s" "Neue Mailboxnachricht von %1$s" "Mailboxnachricht-Wiedergabe nicht möglich" "Mailboxnachricht wird geladen…" - "Mailboxnachricht wird archiviert…" "Laden der Mailboxnachricht nicht möglich" - "Nur Mailbox-Anrufe" - "Nur eingehende Anrufe" - "Nur ausgehende Anrufe" - "Nur entgangene Anrufe" "(%1$d) %2$s" - "Suchen" - "Wählen" - "Zu wählende Nummer" - "Wiedergabe starten oder stoppen" "Freisprechfunktion aktivieren oder deaktivieren" "Wiedergabeposition suchen" - "Wiedergabegeschwindigkeit verringern" - "Wiedergabegeschwindigkeit erhöhen" "Anrufliste" "Mehr Optionen" "Wähltasten" - "Nur ausgehende Anrufe anzeigen" - "Nur eingehende Anrufe anzeigen" - "Nur entgangene Anrufe anzeigen" - "Nur Mailbox-Nachr. anzeigen" - "Alle Anrufe anzeigen" - "2 Sekunden Pause hinzufügen" - "Warten hinzufügen" "Einstellungen" "Simulator" - "Alle Kontakte" - "Telefontastatur verwenden" - "Zurück zum aktuellen Anruf" - "Anruf hinzufügen" - "Eingehende Anrufe" - "Mailbox abhören" - "Kontakt %1$s anzeigen" - "%1$s anrufen" + "Verknüpfung für neue Benutzeroberfläche erstellen" + "Es wird in den Modus für Bulk-Aktionen gewechselt" + "Der Modus für Bulk-Aktionen wurde verlassen" + "%1$s ausgewählt" + "Auswahl für %1$s aufgehoben" "Kontaktdetails für %1$s" "Kontaktdetails für möglichen Spamanrufer %1$s" "%1$s Anrufe" "Videoanruf" - "SMS an %1$s senden" - "Nicht abgehörte Mailboxnachricht" "Sprachsuche starten" - "%s wählen" "Mailbox" - "%s s" - "%s min %s s" - "Mailboxnachricht" - "Mailboxnachrichten" - "Ja" - "Nein" - "Ausgewählte %1$s löschen?" + "Modus für Batch-Aktionen abbrechen" + "Löschen" + "Abbrechen" + "%1$s ausgewählt" + + ""Diese Mailboxnachrichten löschen? "" + ""Diese Mailboxnachricht löschen? "" + @string/call_log_header_today "%1$s um %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Diese Nummer kann nicht angerufen werden." - "Konfiguriere deine Mailbox unter \"Menü\" > \"Einstellungen\"." - "Deaktiviere zunächst den Flugmodus, um die Mailbox anzurufen." - "Wird geladen…" - "IMEI" - "MEID" - "Ladevorgang von SIM-Karte läuft..." - "Kontakte auf SIM-Karte" - "Keine Kontakte-App verfügbar" "Sprachsuche nicht verfügbar" - "Es kann kein Anruf getätigt werden, da die App \"Telefon\" deaktiviert wurde." "In Kontakten suchen" "Nummer hinzufügen oder in Kontakten suchen" "Deine Anrufliste ist leer" "Anrufen" "Keine verpassten Anrufe" "Dein Mailbox-Posteingang ist leer." - "Nur Favoriten anzeigen" "Anrufliste" "Alle" "Verpasst" - "Mailboxnachrichten" "Schnellauswahl" "Anrufliste" "Kontakte" "Mailbox" - "Aus Favoriten entfernt" - "Rückgängig machen" "%s wählen" "Neuen Kontakt erstellen" "Zu Kontakt hinzufügen" "SMS senden" "Videoanruf starten" "Nummer blockieren" - "%s neue entgangene Anrufe" "Du hast für noch niemanden eine Kurzwahl festgelegt" "Favoriten hinzufügen" - "Du hast noch keine Kontakte." - "Kontakt hinzufügen" - "Tippe auf das Bild, um alle Nummern zu sehen, oder halte das Bild länger gedrückt, um sie neu anzuordnen" "Entfernen" + "Alle auswählen" "Videoanruf" "SMS senden" "Anrufdetails" @@ -164,25 +118,14 @@ "^1 anrufen" "^1 über Videoanruf anrufen" "Mailboxnachricht von ^1 anhören" - "Mailboxnachricht von ^1 abhören" - "Mailboxnachricht von ^1 pausieren" - "Mailboxnachricht von ^1 löschen" - - %d neue Mailboxnachrichten - %d neue Mailboxnachricht - "Kontakt für ^1 erstellen" "^1 zu vorhandenem Kontakt hinzufügen" "Anrufdetails für ^1" - "Aus Anrufliste gelöscht" "Heute" "Gestern" "Ältere" - "Anrufliste" "Lautsprecher einschalten" "Lautsprecher ausschalten" - "Schneller wiedergeben" - "Langsamer wiedergeben" "Wiedergabe starten oder pausieren" "Anzeigeoptionen" "Töne und Vibration" @@ -199,7 +142,6 @@ "Anrufe" "Anrufblockierung" "Mailbox" - "SIM für Mailboxeinstellungen auswählen" "Anrufblockierung vorübergehend aus" "Die Anrufblockierung wurde deaktiviert, weil du innerhalb der letzten 48 Stunden mit diesem Telefon den Notruf gewählt hast. Nach Ablauf dieser 48-Stunden-Frist wird die Blockierung automatisch wieder aktiviert." "Nummern importieren" @@ -213,12 +155,8 @@ "Blockierte Nummern" "%1$s ist bereits blockiert." "Anrufkonten" - "Aktivieren" - "Berechtigungen festlegen" "Aktiviere die Berechtigung \"Kontakte\", um die Kurzwahlfunktion zu verwenden." "Aktiviere die Berechtigung \"Telefon\", um dein Anrufprotokoll abzurufen." - "Aktiviere die Berechtigung \"Kontakte\", um deine Kontakte abzurufen." - "Aktiviere die Berechtigung \"Telefon\", um auf deine Mailbox zuzugreifen." "Aktiviere die Berechtigungen \"Kontakte\", um deine Kontakte zu suchen." "Aktiviere die Berechtigung \"Telefon\", um einen Anruf zu tätigen." "Die App \"Telefon\" ist nicht berechtigt, die Systemeinstellungen zu überschreiben." @@ -230,4 +168,10 @@ "Spam" "%1$s ist offline und nicht erreichbar" "Info" + "Transkribiert von Google" + "Google transkribiert…" + "Transkript nicht verfügbar" + "Ansehen" + "Anruf gelöscht. Du kannst in diesem Anruf geteilte Anhänge unter \"Nachrichten\" ansehen und löschen." + "Anrufe gelöscht. Du kannst in diesen Anrufen geteilte Anhänge unter \"Nachrichten\" ansehen und löschen." diff --git a/java/com/android/dialer/app/res/values-el/strings.xml b/java/com/android/dialer/app/res/values-el/strings.xml index 847f60a26..da49db337 100644 --- a/java/com/android/dialer/app/res/values-el/strings.xml +++ b/java/com/android/dialer/app/res/values-el/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Τηλέφωνο" "Πληκτρολόγιο τηλεφώνου" - "Τηλέφωνο" "Ιστορικό κλήσεων" - "Αναφορά ανακριβούς αριθμού" "Αντιγραφή αριθμού" "Αντιγραφή μεταγραφής" - "Αποκλεισμός αριθμού" - "Κατάργηση αποκλεισμού αριθμού" "Επεξεργασία αριθμού πριν την κλήση" "Διαγραφή ιστορικού κλήσεων" "Διαγραφή αυτόματου τηλεφωνητή" @@ -34,7 +30,6 @@ "Διαγραφή ιστορικού κλήσεων;" "Αυτό θα διαγράψει όλες τις κλήσεις από το ιστορικό σας" "Διαγραφή ιστορικού κλήσεων…" - "Τηλέφωνο" "Αναπάντητη κλήση" "Αναπάντητη κλήση εργασίας" "Αναπάντητες κλήσεις" @@ -48,107 +43,66 @@ %1$d Μηνύματα αυτόμ. τηλεφωνητή Μήνυμα αυτόματου τηλεφωνητή - "Αναπαραγωγή" "%1$s, %2$s" "Νέα μην. αυτ. τηλεφ. από %1$s" "Αδύνατη αναπαραγωγή φωνητικού μηνύματος" "Φόρτωση φωνητικών μηνυμάτων…" - "Αρχειοθέτηση μηνυμ. αυτόμ. τηλεφωνητή…" "Αδύνατη φόρτωση φωνητικών μηνυμάτων" - "Μόνο κλήσεις με ηχητικά μηνύματα" - "Μόνο εισερχόμενες κλήσεις" - "Μόνο εξερχόμενες κλήσεις" - "Μόνο αναπάντητες κλήσεις" "(%1$d) %2$s" - "αναζήτηση" - "κλήση" - "αριθμός για κλήση" - "Αναπαραγωγή ή διακοπή αναπαραγωγής" "Ενεργοποίηση ή απενεργοποίηση μεγαφώνου" "Αναζήτηση θέσης αναπαραγωγής" - "Μείωση ρυθμού αναπαραγωγής" - "Αύξηση ρυθμού αναπαραγωγής" "Ιστορικό κλήσεων" "Περισσότερες επιλογές" "πληκτρολόγιο" - "Εμφάνιση μόνο εξερχόμενων" - "Εμφάνιση μόνο εισερχόμενων" - "Εμφάνιση μόνο αναπάντητων" - "Εμφ. μόνο μην. αυτόμ. τηλεφων." - "Εμφάνιση όλων" - "Προσθήκη παύσης 2 δευτερολέπτων" - "Προσθήκη αναμονής" "Ρυθμίσεις" "Προσομοιωτής" - "Όλες οι επαφές" - "Χρησιμοποιήστε το πληκτρολόγιο αφής ηχητικών τόνων" - "Επιστροφή στην κλήση που βρίσκεται σε εξέλιξη" - "Προσθήκη κλήσης" - "Εισερχόμενες κλήσεις" - "Αναπαραγωγή μηνύματος αυτόματου τηλεφωνητή" - "Προβολή επαφής %1$s" - "Κλήση %1$s" + "Δημ. νέας συντόμ. διεπαφής" + "Εισαγωγή στη λειτουργία μαζικών ενεργειών" + "Αποχώρηση από τη λειτουργία μαζικών ενεργειών" + "Έγινε επιλογή %1$s" + "Καταργήθηκε η επιλογή %1$s" "Στοιχεία επικοινωνίας του %1$s" "Στοιχεία επικοινωνίας για πιθανώς ανεπιθύμητο καλούντα %1$s" "%1$s κλήσεις." "Βιντεοκλήση." - "Αποστολή SMS στο χρήστη %1$s" - "Μηνύματα αυτόματου τηλεφωνητή που δεν έχετε ακούσει" "Έναρξη φωνητικής αναζήτησης" - "Κλήση %s" "Αυτόματος τηλεφωνητής" - "%s δευτερόλεπτα" - "%s λεπτά %s δευτερόλεπτα" - "φωνητικού μηνύματος αυτόματου τηλεφωνητή" - "φωνητικών μηνυμάτων αυτόματου τηλεφωνητή" - "Ναι" - "Όχι" - "Διαγραφή επιλεγμ. %1$s;" + "Ακύρωση λειτουργίας μαζικών ενεργειών" + "Διαγραφή" + "Ακύρωση" + "Έχουν επιλεγεί %1$s" + + ""Διαγραφή αυτών των μηνυμάτων αυτόματου τηλεφωνητή; "" + ""Διαγραφή αυτού του μηνύματος αυτόματου τηλεφωνητή; "" + @string/call_log_header_today "%1$s στις %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Δεν μπορείτε να καλέσετε αυτόν τον αριθμό" - "Για τη ρύθμιση του αυτόματου τηλεφωνητή, μεταβείτε στο στοιχείο Μενού > Ρυθμίσεις." - "Για κλήση αυτόματου τηλεφωνητή, πρώτα απενεργοποιήστε τη λειτουργία πτήσης." - "Φόρτωση…" - "Αριθμός ΙΜΕΙ" - "MEID" - "Φόρτωση από κάρτα SIM…" - "Επαφές στην κάρτα SIM" - "Δεν υπάρχουν διαθέσιμες εφαρμογές επαφών" "Η φωνητική αναζήτηση δεν είναι διαθέσιμη" - "Δεν είναι δυνατή η πραγματοποίηση τηλεφωνικής κλήσης επειδή η εφαρμογή \"Τηλέφωνο\" έχει απενεργοποιηθεί." "Αναζήτηση επαφών" "Προσθήκη αριθμού ή αναζήτηση επαφών" "Το ιστορικό κλήσεων είναι κενό" "Πραγματοποίηση κλήσης" "Δεν υπάρχουν αναπάντητες κλήσεις." "Ο φάκελος εισερχομένων του αυτόματου τηλεφωνητή σας είναι κενός." - "Εμφάνιση μόνο των αγαπημένων" "Ιστορικό κλήσεων" "Όλα" "Αναπάντητες" - "Φωνητικό μήνυμα" "Γρήγορη κλήση" "Ιστορικό κλήσεων" "Επαφές" "Αυτόματος τηλεφωνητής" - "Καταργήθηκε από τα αγαπημένα" - "Αναίρεση" "Κλήση %s" "Δημιουργία νέας επαφής" "Προσθήκη σε μια επαφή" "Αποστολή SMS" "Πραγματοποίηση βιντεοκλήσης" "Αποκλεισμός αριθμού" - "%s νέες αναπάντητες κλήσεις" "Δεν έχετε ορίσει ακόμη κάποια επαφή στις ταχείες κλήσεις" "Προσθέστε ένα αγαπημένο" - "Δεν έχετε επαφές ακόμη" - "Προσθήκη επαφής" - "Αγγίξτε την εικόνα για να δείτε όλους τους αριθμούς ή αγγίξτε παρατεταμένα για αναδιάταξη" "Κατάργηση" + "Επιλογή όλων" "Βιντεοκλήση" "Αποστολή μηνύματος" "Λεπτομέρειες κλήσης" @@ -164,25 +118,14 @@ "Κλήση ^1" "Βιντεοκλήση ^1." "Ακρόαση μηνύματος αυτόματου τηλεφωνητή από το χρήστη ^1" - "Ακρόαση μηνύματος αυτόματου τηλεφωνητή από ^1" - "Παύση μηνύματος αυτόματου τηλεφωνητή από ^1" - "Διαγραφή μηνύματος αυτόματου τηλεφωνητή από ^1" - - %d νέα φωνητικά μηνύματα - %d νέο φωνητικό μήνυμα - "Δημιουργία επαφής για ^1" "Προσθήκη ^1 σε υπάρχουσα επαφή" "Λεπτομέρειες κλήσης για ^1" - "Διαγράφηκε από το ιστορικό κλήσεων" "Σήμερα" "Χθες" "Παλαιότερες" - "Λίστα κλήσεων" "Ενεργοποίηση ηχείου." "Απενεργοποίηση ηχείου." - "Αναπαραγωγή πιο γρήγορα." - "Αναπαραγωγή πιο αργά." "Έναρξη ή παύση αναπαραγωγής." "Επιλογές εμφάνισης" "Ήχοι και δόνηση" @@ -197,9 +140,8 @@ "Γρήγορες απαντήσεις" "Κλήσεις" - "Φραγή κλήσεων" + "Αποκλεισμός κλήσεων" "Αυτόματος τηλεφωνητής" - "Επιλέξτε SIM για ρυθμ. τηλεφ/τη" "Προσωρινά απενεργοποιημένη φραγή κλήσεων" "Η φραγή κλήσεων έχει απενεργοποιηθεί προσωρινά επειδή επικοινωνήσατε με τις υπηρεσίες έκτακτης ανάγκης από αυτό το τηλέφωνο μέσα στις τελευταίες 48 ώρες. Θα ενεργοποιηθεί ξανά αυτόματα μόλις λήξει η περίοδος των 48 ωρών." "Εισαγωγή αριθμών" @@ -213,12 +155,8 @@ "Αποκλεισμένοι αριθμοί" "Ο αριθμός %1$s αποκλείστηκε ήδη." "Λογαριασμοί κλήσης" - "Ενεργοποίηση" - "Ορισμός αδειών" "Για να ενεργοποιήσετε την ταχεία κλήση, ενεργοποιήστε την άδεια επαφών." "Για να δείτε το αρχείο καταγραφής κλήσεών σας, ενεργοποιήστε την άδεια τηλεφώνου." - "Για να δείτε τις επαφές σας, ενεργοποιήστε την άδεια επαφών." - "Για να αποκτήσετε πρόσβαση στον τηλεφωνητή σας, ενεργοποιήστε την άδεια τηλεφώνου." "Για να κάνετε αναζήτηση στις επαφές σας, ενεργοποιήστε τις άδειες \"Επαφές\"." "Για να πραγματοποιήσετε μια κλήση, ενεργοποιήστε την άδεια τηλεφώνου." "Η εφαρμογή \"Τηλέφωνο\" δεν έχει άδεια εγγραφής στις ρυθμίσεις συστήματος." @@ -230,4 +168,10 @@ "Ανεπιθύμητα" "Ο χρήστης %1$s είναι εκτός σύνδεσης και δεν μπορείτε να έρθετε σε επικοινωνία μαζί του" "Πληροφορίες" + "Μεταγραφή από την Google" + "Μεταγραφή Google σε εξέλιξη…" + "Δεν υπάρχει απομαγνητοφώνηση" + "Προβολή" + "Η κλήση διαγράφηκε. Προβάλετε και διαγράψτε τα συνημμένα που κοινοποιήθηκαν κατά τη διάρκεια αυτής της κλήσης στο Messages." + "Οι κλήσεις διαγράφηκαν. Προβάλετε και διαγράψτε τα συνημμένα που κοινοποιήθηκαν κατά τη διάρκεια αυτών των κλήσεων στο Messages." diff --git a/java/com/android/dialer/app/res/values-en-rAU/strings.xml b/java/com/android/dialer/app/res/values-en-rAU/strings.xml index 28eea8b4d..45ab37e5c 100644 --- a/java/com/android/dialer/app/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/app/res/values-en-rAU/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Phone" "Phone keypad" - "Phone" "Call history" - "Report inaccurate number" "Copy number" "Copy transcription" - "Block number" - "Unblock number" "Edit number before call" "Clear call history" "Delete voicemail" @@ -34,7 +30,6 @@ "Clear call history?" "This will delete all calls from your history" "Clearing call history…" - "Phone" "Missed call" "Missed work call" "Missed calls" @@ -48,107 +43,66 @@ %1$d Voicemails Voicemail - "Play" "%1$s, %2$s" "New voicemail from %1$s" "Couldn\'t play voicemail" "Loading voicemail…" - "Archiving voicemail…" "Couldn\'t load voicemail" - "Calls with voicemail only" - "Incoming calls only" - "Outgoing calls only" - "Missed calls only" "(%1$d) %2$s" - "search" - "dial" - "number to dial" - "Play or stop playback" "Switch on or off speakerphone" "Seek playback position" - "Decrease playback rate" - "Increase playback rate" "Call history" "More options" "key pad" - "Show outgoing only" - "Show incoming only" - "Show missed only" - "Show voicemails only" - "Show all calls" - "Add 2-sec pause" - "Add wait" "Settings" "Simulator" - "All contacts" - "Use touch tone keypad" - "Return to call in progress" - "Add call" - "Incoming calls" - "Play voicemail" - "View contact %1$s" - "Call %1$s" + "Create new UI shortcut" + "Entering bulk action mode" + "Left bulk action mode" + "Selected %1$s" + "Unselected %1$s" "Contact details for %1$s" "Contact details for suspected spam caller %1$s" "%1$s calls." "Video call." - "Send SMS to %1$s" - "Unheard voicemail" "Start voice search" - "Call %s" "Voicemail" - "%s sec" - "%s min %s sec" - "voicemail" - "voicemails" - "Yes" - "No" - "Delete selected %1$s?" + "Cancel batch actions mode" + "Delete" + "Cancel" + "%1$s selected" + + ""Delete these voicemails? "" + ""Delete this voicemail? "" + @string/call_log_header_today "%1$s at %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Can\'t call this number" - "To set up voicemail, go to Menu > Settings." - "To call voicemail, turn off Aeroplane mode first." - "Loading…" - "IMEI" - "MEID" - "Loading from SIM card…" - "SIM card contacts" - "No contacts app available" "Voice search not available" - "Cannot make a phone call because the Phone application has been disabled." "Search contacts" "Add number or search contacts" "Your call history is empty" "Make a call" "You have no missed calls." "Your voicemail inbox is empty." - "Show favourites only" "Call history" "All" "Missed" - "Voicemail" "Speed dial" "Call history" "Contacts" "Voicemail" - "Removed from favourites" - "Undo" "Call %s" "Create new contact" "Add to a contact" "Send SMS" "Make video call" "Block number" - "%s new missed calls" "No one is on your speed dial yet" "Add a favourite" - "You don\'t have any contacts yet" - "Add a contact" - "Touch image to see all numbers, or touch & hold to re-arrange" "Remove" + "Select all" "Video call" "Send a message" "Call details" @@ -164,25 +118,14 @@ "Call ^1" "Video call ^1." "Listen to voicemail from ^1" - "Play voicemail from ^1" - "Pause voicemail from ^1" - "Delete voicemail from ^1" - - %d new voicemails - %d new voicemail - "Create contact for ^1" "Add ^1 to existing contact" "Call details for ^1" - "Deleted from call history" "Today" "Yesterday" "Older" - "Calls list" "Turn speaker on." "Turn speaker off." - "Play faster." - "Play slower." "Start or pause playback." "Display options" "Sounds and vibration" @@ -199,7 +142,6 @@ "Calls" "Call blocking" "Voicemail" - "Select SIM for voicemail settings" "Call blocking temporarily off" "Call blocking has been disabled because you contacted emergency services from this phone within the last 48 hours. It will be automatically re-enabled once the 48 hour period expires." "Import numbers" @@ -213,12 +155,8 @@ "Blocked numbers" "%1$s is already blocked." "Calling accounts" - "Turn on" - "Set permissions" "To enable speed dial, turn on the Contacts permission." "To see your call log, turn on the Phone permission." - "To see your contacts, turn on the Contacts permission." - "To access your voicemail, turn on the Phone permission." "To search your contacts, turn on the Contacts permissions." "To place a call, turn on the Phone permission." "Phone app does not have permission to write to system settings." @@ -230,4 +168,10 @@ "Spam" "%1$s is offline and can\'t be reached" "About" + "Transcribed by Google" + "Google is transcribing …" + "Transcript not available" + "View" + "Call deleted. View and delete attachments shared during this call in Messages." + "Calls deleted. View and delete attachments shared during calls in Messages." diff --git a/java/com/android/dialer/app/res/values-en-rGB/strings.xml b/java/com/android/dialer/app/res/values-en-rGB/strings.xml index 28eea8b4d..45ab37e5c 100644 --- a/java/com/android/dialer/app/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/app/res/values-en-rGB/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Phone" "Phone keypad" - "Phone" "Call history" - "Report inaccurate number" "Copy number" "Copy transcription" - "Block number" - "Unblock number" "Edit number before call" "Clear call history" "Delete voicemail" @@ -34,7 +30,6 @@ "Clear call history?" "This will delete all calls from your history" "Clearing call history…" - "Phone" "Missed call" "Missed work call" "Missed calls" @@ -48,107 +43,66 @@ %1$d Voicemails Voicemail - "Play" "%1$s, %2$s" "New voicemail from %1$s" "Couldn\'t play voicemail" "Loading voicemail…" - "Archiving voicemail…" "Couldn\'t load voicemail" - "Calls with voicemail only" - "Incoming calls only" - "Outgoing calls only" - "Missed calls only" "(%1$d) %2$s" - "search" - "dial" - "number to dial" - "Play or stop playback" "Switch on or off speakerphone" "Seek playback position" - "Decrease playback rate" - "Increase playback rate" "Call history" "More options" "key pad" - "Show outgoing only" - "Show incoming only" - "Show missed only" - "Show voicemails only" - "Show all calls" - "Add 2-sec pause" - "Add wait" "Settings" "Simulator" - "All contacts" - "Use touch tone keypad" - "Return to call in progress" - "Add call" - "Incoming calls" - "Play voicemail" - "View contact %1$s" - "Call %1$s" + "Create new UI shortcut" + "Entering bulk action mode" + "Left bulk action mode" + "Selected %1$s" + "Unselected %1$s" "Contact details for %1$s" "Contact details for suspected spam caller %1$s" "%1$s calls." "Video call." - "Send SMS to %1$s" - "Unheard voicemail" "Start voice search" - "Call %s" "Voicemail" - "%s sec" - "%s min %s sec" - "voicemail" - "voicemails" - "Yes" - "No" - "Delete selected %1$s?" + "Cancel batch actions mode" + "Delete" + "Cancel" + "%1$s selected" + + ""Delete these voicemails? "" + ""Delete this voicemail? "" + @string/call_log_header_today "%1$s at %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Can\'t call this number" - "To set up voicemail, go to Menu > Settings." - "To call voicemail, turn off Aeroplane mode first." - "Loading…" - "IMEI" - "MEID" - "Loading from SIM card…" - "SIM card contacts" - "No contacts app available" "Voice search not available" - "Cannot make a phone call because the Phone application has been disabled." "Search contacts" "Add number or search contacts" "Your call history is empty" "Make a call" "You have no missed calls." "Your voicemail inbox is empty." - "Show favourites only" "Call history" "All" "Missed" - "Voicemail" "Speed dial" "Call history" "Contacts" "Voicemail" - "Removed from favourites" - "Undo" "Call %s" "Create new contact" "Add to a contact" "Send SMS" "Make video call" "Block number" - "%s new missed calls" "No one is on your speed dial yet" "Add a favourite" - "You don\'t have any contacts yet" - "Add a contact" - "Touch image to see all numbers, or touch & hold to re-arrange" "Remove" + "Select all" "Video call" "Send a message" "Call details" @@ -164,25 +118,14 @@ "Call ^1" "Video call ^1." "Listen to voicemail from ^1" - "Play voicemail from ^1" - "Pause voicemail from ^1" - "Delete voicemail from ^1" - - %d new voicemails - %d new voicemail - "Create contact for ^1" "Add ^1 to existing contact" "Call details for ^1" - "Deleted from call history" "Today" "Yesterday" "Older" - "Calls list" "Turn speaker on." "Turn speaker off." - "Play faster." - "Play slower." "Start or pause playback." "Display options" "Sounds and vibration" @@ -199,7 +142,6 @@ "Calls" "Call blocking" "Voicemail" - "Select SIM for voicemail settings" "Call blocking temporarily off" "Call blocking has been disabled because you contacted emergency services from this phone within the last 48 hours. It will be automatically re-enabled once the 48 hour period expires." "Import numbers" @@ -213,12 +155,8 @@ "Blocked numbers" "%1$s is already blocked." "Calling accounts" - "Turn on" - "Set permissions" "To enable speed dial, turn on the Contacts permission." "To see your call log, turn on the Phone permission." - "To see your contacts, turn on the Contacts permission." - "To access your voicemail, turn on the Phone permission." "To search your contacts, turn on the Contacts permissions." "To place a call, turn on the Phone permission." "Phone app does not have permission to write to system settings." @@ -230,4 +168,10 @@ "Spam" "%1$s is offline and can\'t be reached" "About" + "Transcribed by Google" + "Google is transcribing …" + "Transcript not available" + "View" + "Call deleted. View and delete attachments shared during this call in Messages." + "Calls deleted. View and delete attachments shared during calls in Messages." diff --git a/java/com/android/dialer/app/res/values-en-rIN/strings.xml b/java/com/android/dialer/app/res/values-en-rIN/strings.xml index 28eea8b4d..45ab37e5c 100644 --- a/java/com/android/dialer/app/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/app/res/values-en-rIN/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Phone" "Phone keypad" - "Phone" "Call history" - "Report inaccurate number" "Copy number" "Copy transcription" - "Block number" - "Unblock number" "Edit number before call" "Clear call history" "Delete voicemail" @@ -34,7 +30,6 @@ "Clear call history?" "This will delete all calls from your history" "Clearing call history…" - "Phone" "Missed call" "Missed work call" "Missed calls" @@ -48,107 +43,66 @@ %1$d Voicemails Voicemail - "Play" "%1$s, %2$s" "New voicemail from %1$s" "Couldn\'t play voicemail" "Loading voicemail…" - "Archiving voicemail…" "Couldn\'t load voicemail" - "Calls with voicemail only" - "Incoming calls only" - "Outgoing calls only" - "Missed calls only" "(%1$d) %2$s" - "search" - "dial" - "number to dial" - "Play or stop playback" "Switch on or off speakerphone" "Seek playback position" - "Decrease playback rate" - "Increase playback rate" "Call history" "More options" "key pad" - "Show outgoing only" - "Show incoming only" - "Show missed only" - "Show voicemails only" - "Show all calls" - "Add 2-sec pause" - "Add wait" "Settings" "Simulator" - "All contacts" - "Use touch tone keypad" - "Return to call in progress" - "Add call" - "Incoming calls" - "Play voicemail" - "View contact %1$s" - "Call %1$s" + "Create new UI shortcut" + "Entering bulk action mode" + "Left bulk action mode" + "Selected %1$s" + "Unselected %1$s" "Contact details for %1$s" "Contact details for suspected spam caller %1$s" "%1$s calls." "Video call." - "Send SMS to %1$s" - "Unheard voicemail" "Start voice search" - "Call %s" "Voicemail" - "%s sec" - "%s min %s sec" - "voicemail" - "voicemails" - "Yes" - "No" - "Delete selected %1$s?" + "Cancel batch actions mode" + "Delete" + "Cancel" + "%1$s selected" + + ""Delete these voicemails? "" + ""Delete this voicemail? "" + @string/call_log_header_today "%1$s at %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Can\'t call this number" - "To set up voicemail, go to Menu > Settings." - "To call voicemail, turn off Aeroplane mode first." - "Loading…" - "IMEI" - "MEID" - "Loading from SIM card…" - "SIM card contacts" - "No contacts app available" "Voice search not available" - "Cannot make a phone call because the Phone application has been disabled." "Search contacts" "Add number or search contacts" "Your call history is empty" "Make a call" "You have no missed calls." "Your voicemail inbox is empty." - "Show favourites only" "Call history" "All" "Missed" - "Voicemail" "Speed dial" "Call history" "Contacts" "Voicemail" - "Removed from favourites" - "Undo" "Call %s" "Create new contact" "Add to a contact" "Send SMS" "Make video call" "Block number" - "%s new missed calls" "No one is on your speed dial yet" "Add a favourite" - "You don\'t have any contacts yet" - "Add a contact" - "Touch image to see all numbers, or touch & hold to re-arrange" "Remove" + "Select all" "Video call" "Send a message" "Call details" @@ -164,25 +118,14 @@ "Call ^1" "Video call ^1." "Listen to voicemail from ^1" - "Play voicemail from ^1" - "Pause voicemail from ^1" - "Delete voicemail from ^1" - - %d new voicemails - %d new voicemail - "Create contact for ^1" "Add ^1 to existing contact" "Call details for ^1" - "Deleted from call history" "Today" "Yesterday" "Older" - "Calls list" "Turn speaker on." "Turn speaker off." - "Play faster." - "Play slower." "Start or pause playback." "Display options" "Sounds and vibration" @@ -199,7 +142,6 @@ "Calls" "Call blocking" "Voicemail" - "Select SIM for voicemail settings" "Call blocking temporarily off" "Call blocking has been disabled because you contacted emergency services from this phone within the last 48 hours. It will be automatically re-enabled once the 48 hour period expires." "Import numbers" @@ -213,12 +155,8 @@ "Blocked numbers" "%1$s is already blocked." "Calling accounts" - "Turn on" - "Set permissions" "To enable speed dial, turn on the Contacts permission." "To see your call log, turn on the Phone permission." - "To see your contacts, turn on the Contacts permission." - "To access your voicemail, turn on the Phone permission." "To search your contacts, turn on the Contacts permissions." "To place a call, turn on the Phone permission." "Phone app does not have permission to write to system settings." @@ -230,4 +168,10 @@ "Spam" "%1$s is offline and can\'t be reached" "About" + "Transcribed by Google" + "Google is transcribing …" + "Transcript not available" + "View" + "Call deleted. View and delete attachments shared during this call in Messages." + "Calls deleted. View and delete attachments shared during calls in Messages." diff --git a/java/com/android/dialer/app/res/values-es-rUS/strings.xml b/java/com/android/dialer/app/res/values-es-rUS/strings.xml index 9d80bc9e2..f74fd7c85 100644 --- a/java/com/android/dialer/app/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/app/res/values-es-rUS/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teléfono" "Teclado del teléfono" - "Teléfono" "Historial de llamadas" - "Informar número incorrecto" "Copiar número" "Copiar transcripción" - "Bloquear número" - "Desbloquear número" "Editar número antes de realizar llamada" "Eliminar el historial de llamadas" "Borrar buzón de voz" @@ -34,7 +30,6 @@ "¿Eliminar el historial de llamadas?" "Se eliminarán todas las llamadas del historial." "Eliminando historial de llamadas…" - "Teléfono" "Llamada perdida" "Llamada de trabajo perdida" "Llamadas perdidas" @@ -48,107 +43,66 @@ %1$d mensajes de voz mensaje de voz - "Reproducir" "%1$s, %2$s" "Nuevo mensaje de voz de %1$s" "Error al reproducir el buzón de voz" "Cargando buzón de voz…" - "Archivando el mensaje de voz…" "Error al cargar el buzón de voz" - "Solo llamadas con buzón de voz" - "Solo llamadas entrantes" - "Solo llamadas salientes" - "Solo llamadas perdidas" "(%1$d) %2$s" - "búsqueda" - "marcar" - "número para marcar" - "Reproducir o detener la reproducción" "Activar o desactivar el altavoz" "Busca la posición de reproducción" - "Disminuir la velocidad de reproducción" - "Aumentar la velocidad de reproducción" "Historial de llamadas" "Más opciones" "teclado" - "Mostrar solo salientes" - "Mostrar solo entrantes" - "Mostrar solo perdidas" - "Mostrar solo mensajes de voz" - "Mostrar todas las llamadas" - "Agregar pausa de 2 segundos" - "Agregar espera" "Configuración" "Simulador" - "Todos los contactos" - "Usar teclado numérico" - "Regresar a la llamada en curso" - "Agregar llamada" - "Llamadas entrantes" - "Reproducir mensaje de voz" - "Ver contacto %1$s" - "Llamar a %1$s" + "Crear acceso a la nueva IU" + "Entrando al modo de acción masiva" + "Saliendo del modo de acción masiva" + "Se seleccionó %1$s" + "Se anuló la selección de %1$s" "Datos de contacto de %1$s" "Detalles de contacto de %1$s (posible generador de spam)" "%1$s llamadas" "Videollamada" - "Enviar SMS a %1$s" - "Buzón de voz no escuchado" "Iniciar búsqueda por voz" - "Llamar al %s" "Correo de voz" - "%s s" - "%s min %s s" - "el mensaje de voz" - "los mensajes de voz" - "Sí" - "No" - "¿Deseas borrar %1$s que seleccionaste?" + "Cancelar el modo de acción masiva" + "Borrar" + "Cancelar" + "%1$s seleccionada(s)" + + ""¿Deseas borrar estos mensajes de voz? "" + ""¿Deseas borrar este mensaje de voz? "" + @string/call_log_header_today "El %1$s a la hora %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "No se puede llamar a este número." - "Para configurar el buzón de voz, ve a Menú > Configuración." - "Para llamar al buzón de voz, desactiva primero el modo de avión." - "Cargando..." - "IMEI" - "MEID" - "Cargando desde tarjeta SIM..." - "Contactos de tarjeta SIM" - "No hay aplicaciones de contactos disponibles." "Búsqueda por voz no disponible" - "No se pueden realizar llamadas porque se inhabilitó la aplicación Teléfono." "Buscar contactos" "Agregar número o buscar contactos" "El historial de llamadas está vacío." "Hacer una llamada" "No tienes llamadas perdidas" "La bandeja de entrada del buzón de voz está vacía." - "Mostrar solo favoritos" "Historial de llamadas" "Todo" "Perdidas" - "Buzón voz" "Marcado rápido" "Historial de llamadas" "Contactos" "Buzón de voz" - "Eliminado de favoritos" - "Deshacer" "Llamar al %s" "Crear contacto nuevo" "Agregar a un contacto" "Enviar SMS" "Realizar videollamada" "Bloquear número" - "%s llamadas perdidas nuevas" "Aún no tienes contactos en la opción de marcado rápido" "Agregar un favorito" - "Aún no tienes contactos" - "Agregar un contacto" - "Toca la imagen para ver todos los números o mantenla presionada para reorganizar" "Eliminar" + "Seleccionar todo" "Videollamada" "Enviar un mensaje" "Detalles de la llamada" @@ -164,25 +118,14 @@ "Llamar a ^1" "Realizar una videollamada a ^1" "Escuchar buzón de voz de ^1" - "Reproducir buzón de voz de ^1" - "Pausar buzón de voz de ^1" - "Borrar buzón de voz de ^1" - - %d mensajes de voz nuevos - %d mensaje de voz nuevo - "Crear un contacto para ^1" "Agregar ^1 a un contacto existente" "Detalles de llamada de ^1" - "Se eliminó del historial de llamadas." "Hoy" "Ayer" "Antiguos" - "Lista de llamadas" "Activar altavoz" "Desactivar altavoz" - "Aumentar velocidad de reproducción" - "Disminuir velocidad de reproducción" "Iniciar o pausar la reproducción" "Opciones de visualización" "Sonidos y vibración" @@ -199,7 +142,6 @@ "Llamadas" "Bloqueo de llamadas" "Buzón de voz" - "Elige una SIM para configurar el buzón de voz" "Bloqueo de llamadas desactivado temporalmente" "Se inhabilitó el bloqueo de llamadas porque te comunicaste con servicios de emergencia en las últimas 48 horas desde este teléfono. Se volverá a habilitar de forma automática una vez que venza el período de 48 horas." "Importar números" @@ -213,12 +155,8 @@ "Números bloqueados" "%1$s ya está bloqueado." "Cuentas telefónicas" - "Activar" - "Configurar permisos" "Para habilitar el marcado rápido, activa el permiso Contactos." "Para ver el registro de llamadas, activa el permiso Teléfono." - "Para ver los contactos, activa el permiso Contactos." - "Para acceder al buzón de voz, activa el permiso Teléfono." "Para buscar contactos, activa el permiso Contactos." "Para realizar una llamada, activa el permiso Teléfono." "La aplicación de teléfono no tiene permiso para modificar la configuración del sistema." @@ -230,4 +168,10 @@ "Spam" "%1$s está sin conexión y no se lo puede contactar" "Acerca de" + "Transcrito por Google" + "Google está transcribiendo…" + "Transcripción no disponible." + "Ver" + "Llamada eliminada. En Mensajes, puedes ver y eliminar archivos adjuntos compartidos durante esta llamada." + "Llamadas eliminadas. En Mensajes, puedes ver y eliminar archivos adjuntos durante las llamadas." diff --git a/java/com/android/dialer/app/res/values-es/strings.xml b/java/com/android/dialer/app/res/values-es/strings.xml index b7383d970..961fc6f08 100644 --- a/java/com/android/dialer/app/res/values-es/strings.xml +++ b/java/com/android/dialer/app/res/values-es/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teléfono" "Teclado del teléfono" - "Teléfono" "Historial de llamadas" - "Informar sobre número incorrecto" "Copiar número" "Copiar transcripción" - "Bloquear número" - "Desbloquear número" "Editar número antes de llamar" "Borrar historial de llamadas" "Eliminar mensaje de voz" @@ -34,7 +30,6 @@ "¿Borrar historial de llamadas?" "Se eliminarán todas las llamadas del historial." "Borrando historial de llamadas…" - "Teléfono" "Llamada perdida" "Llamada de trabajo perdida" "Llamadas perdidas" @@ -48,107 +43,66 @@ %1$d mensajes de voz mensaje de voz - "Reproducir" "%1$s, %2$s" "Nuevo mensaje de voz de %1$s" "Error al reproducir el buzón de voz" "Cargando buzón de voz…" - "Archivando el mensaje de voz…" "Error al cargar el buzón de voz" - "Solo llamadas con mensajes de voz" - "Solo llamadas entrantes" - "Solo llamadas salientes" - "Solo llamadas perdidas" "(%1$d) %2$s" - "buscar" - "marcar" - "número que se va a marcar" - "Iniciar o detener la reproducción" "Activar o desactivar el altavoz" "Buscar posición de reproducción" - "Disminuir la velocidad de reproducción" - "Aumentar la velocidad de reproducción" "Historial de llamadas" "Más opciones" "teclado" - "Mostrar solo llamadas salientes" - "Mostrar solo llamadas entrantes" - "Mostrar solo llamadas perdidas" - "Solo mensajes de voz" - "Mostrar todas las llamadas" - "Añadir pausa de 2 segundos" - "Añadir espera" "Ajustes" "Simulador" - "Todos los contactos" - "Usar teclado táctil" - "Volver a la llamada" - "Añadir llamada" - "Llamadas entrantes" - "Reproducir mensaje de voz" - "Ver contacto %1$s" - "Llamar a %1$s" + "Crear acceso a la interfaz" + "Entrando en el modo de acción en bloque" + "Se ha salido del modo de acción en bloque" + "%1$s seleccionado" + "Selección de %1$s anulada" "Información de contacto de %1$s" "Información de contacto del posible spammer %1$s" "%1$s llamadas." "Videollamada." - "Enviar SMS a %1$s" - "Mensaje de voz sin oír" "Iniciar búsqueda por voz" - "Llamar a %s" "Buzón de voz" - "%s s" - "%s min y %s s" - "mensaje de voz" - "mensajes de voz" - "Sí" - "No" - "¿Eliminar la selección de %1$s?" + "Cancelar el modo de acciones en lote" + "Eliminar" + "Cancelar" + "Se han seleccionado %1$s" + + ""¿Eliminar estos mensajes de voz? "" + ""¿Eliminar este mensaje de voz? "" + @string/call_log_header_today "%1$s a las %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "No se puede llamar a este número" - "Para configurar el buzón de voz, ve a Menú > Ajustes." - "Para llamar al buzón de voz, debes desactivar el modo avión." - "Cargando..." - "IMEI" - "MEID" - "Cargando desde tarjeta SIM…" - "Contactos de tarjeta SIM" - "No hay aplicaciones de contactos disponibles" "La búsqueda por voz no está disponible" - "No se puede hacer llamadas porque se ha inhabilitado la aplicación Teléfono." "Buscar contactos" "Añade número o busca contactos" "Tu historial de llamadas está vacío" "Hacer una llamada" "No tienes llamadas perdidas." "La bandeja de entrada del buzón de voz está vacía." - "Mostrar solo favoritos" "Historial de llamadas" "Todas" "Perdidas" - "Mensaje de voz" "Marcación rápida" "Historial de llamadas" "Contactos" "Buzón de voz" - "Eliminado de favoritos" - "Deshacer" "Llamar a %s" "Crear nuevo contacto" "Añadir a un contacto" "Enviar SMS" "Hacer videollamada" "Bloquear número" - "%s llamadas perdidas nuevas" "Aún no tienes contactos en la función de marcación rápida" "Añadir un favorito" - "Aún no tienes contactos" - "Añadir un contacto" - "Tocar la imagen para ver todos los números o mantenerla pulsada para cambiar el orden" "Eliminar" + "Seleccionar todo" "Videollamada" "Enviar un mensaje" "Detalles de la llamada" @@ -164,25 +118,14 @@ "Llamar a ^1" "Videollamada a ^1." "Escuchar el buzón de voz de ^1" - "Reproducir mensaje de voz de ^1" - "Pausar mensaje de voz de ^1" - "Eliminar mensaje de voz de ^1" - - %d mensajes de voz nuevos - %d mensaje de voz nuevo - "Crear contacto para ^1" "Añadir ^1 a un contacto" "Detalles de llamada de ^1" - "Eliminada del historial de llamadas" "Hoy" "Ayer" "Más antiguo" - "Lista de llamadas" "Activar altavoz." "Desactivar altavoz." - "Reproducir más rápido." - "Reproducir más lento." "Iniciar o pausar reproducción." "Opciones de visualización" "Sonido y vibración" @@ -199,7 +142,6 @@ "Llamadas" "Bloqueo de llamadas" "Buzón de voz" - "Elegir SIM para ajustes del buzón" "Bloqueo de llamadas desactivado temporalmente" "Se ha inhabilitado el bloqueo de llamadas porque te has puesto en contacto con los servicios de emergencia desde este teléfono en las últimas 48 horas. Se volverá a habilitar automáticamente cuando finalice este periodo de tiempo." "Importar números" @@ -213,21 +155,23 @@ "Números bloqueados" "%1$s ya está bloqueado." "Cuentas de llamadas" - "Activar" - "Establecer permisos" "Para habilitar la marcación rápida, activa el permiso la aplicación Contactos." "Para ver el registro de llamadas, activa el permiso de la aplicación Teléfono." - "Para ver tus contactos, activa el permiso de la aplicación Contactos." - "Para acceder al buzón de voz, activa el permiso de la aplicación Teléfono." "Para poder buscar tus contactos, activa los permisos de contactos." "Para hacer una llamada, activa el permiso de la aplicación Teléfono." "La aplicación Teléfono no tiene permiso para editar los ajustes del sistema." "Bloqueado" - "Bloquear / Marcar como spam" + "Bloquear/Marcar como spam" "Bloquear número" "No es spam" "Desbloquear número" "Spam" "%1$s no tiene conexión y no se puede contactar" "Información" + "Transcrito por Google" + "Google está transcribiendo el mensaje…" + "Transcripción no disponible" + "Ver" + "Se ha eliminado la llamada. Si quieres ver y eliminar los archivos adjuntos compartidos durante esta llamada, ve a Mensajes." + "Se han eliminado las llamadas. Si quieres ver y eliminar los archivos adjuntos compartidos durante las llamadas, ve a Mensajes." diff --git a/java/com/android/dialer/app/res/values-et/strings.xml b/java/com/android/dialer/app/res/values-et/strings.xml index d4e4faa59..538e5b434 100644 --- a/java/com/android/dialer/app/res/values-et/strings.xml +++ b/java/com/android/dialer/app/res/values-et/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefoni klaviatuur" - "Telefon" "Kõneajalugu" - "Valest numbrist teavitamine" "Kopeeri number" "Kopeeri transkribeerimine" - "Blokeeri number" - "Deblokeeri number" "Muuda enne helistamist numbrit" "Kõneajaloo kustutamine" "Kustuta kõnepost" @@ -34,7 +30,6 @@ "Kas kustutada kõneajalugu?" "See kustutab ajaloost kõik kõned" "Kõneajaloo kustutamine ..." - "Telefon" "Vastamata kõne" "Vastamata kõne töölt" "Vastamata kõned" @@ -48,107 +43,66 @@ %1$d kõneposti teadet Kõneposti teade - "Esitamine" "%1$s, %2$s" "Uus kõnepostisõnum kasutajalt %1$s" "Kõneposti ei õnnestunud esitada" "Kõneposti laadimine ..." - "Kõnepostisõnumi arhiivimine …" "Kõneposti laadimine ebaõnnestus" - "Ainult kõnepostiga kõned" - "Ainult sissetulevad kõned" - "Ainult väljuvad kõned" - "Ainult vastamata kõned" "(%1$d) %2$s" - "otsing" - "helista" - "number valimiseks" - "Taasesituse alustamine või peatamine" "Valjuhääldi sisse- või väljalülitamine" "Taasesituse positsiooni otsimine" - "Taasesituse kiiruse vähendamine" - "Taasesituse kiiruse suurendamine" "Kõneajalugu" "Rohkem valikuid" "klaviatuur" - "Kuva ainult väljuvad" - "Kuva ainult sissetulevad" - "Kuva ainult vastamata" - "Kuva ainult kõnepostisõnumeid" - "Kuva kõik kõned" - "Lisa 2-sekundiline paus" - "Lisa ootamine" "Seaded" "Simulaator" - "Kõik kontaktid" - "Kasuta puutetooniga klahvistikku" - "Tagasi käimasolevale kõnele" - "Lisa kõne" - "Sissetulevad kõned" - "Esita kõnepostisõnum" - "Kuva kontakt %1$s" - "Helista kasutajale %1$s" + "Loo uue kasutajaliid. otsetee" + "Sisenemine hulgitoimingute režiimi" + "Lahkumine hulgitoimingute režiimist" + "%1$s on valitud" + "%1$s on valimata" "Kontakti %1$s üksikasjad" "Arvatava rämpskõnetegija %1$s kontaktandmed" "%1$s kõnet." "Videokõne." - "SMS-i saatmine kontaktile %1$s" - "Kuulamata kõnepostisõnum" "Häälotsingu alustamine" - "Helista: %s" "Kõnepost" - "%s s" - "%s min %s s" - "kõnepostisõnum" - "kõnepostisõnumid" - "Jah" - "Ei" - "Kas kustutada valitud kõnepostisõnumid %1$s?" + "Mitme toimigu režiimi tühistamine" + "Kustuta" + "Tühista" + "%1$s on valitud" + + ""Kas kustutada need kõnepostisõnumid? "" + ""Kas kustutada see kõnepostisõnum? "" + @string/call_log_header_today "%1$s kell %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Sellele numbrile ei saa helistada" - "Kõnepostisõnumite seadistamiseks tehke valikud Menüü > Seaded." - "Kõnepostisõnumite kuulamiseks lülitage esmalt välja lennurežiim." - "Laadimine ..." - "IMEI" - "MEID" - "Laadimine SIM-kaardilt ..." - "SIM-kaardi kontaktid" - "Kontaktide rakendus pole saadaval" "Häälotsing ei ole saadaval" - "Helistada ei saa, sest telefonirakendus on keelatud." "Otsige kontakte" "Lisage nr või otsige kontakte" "Teie kõneajalugu on tühi" "Helista" "Vastamata kõnesid pole." "Kõneposti postkast on tühi." - "Kuva ainult lemmikud" "Kõneajalugu" "Kõik" "Vastamata" - "Kõnepost" "Kiirvalimine" "Kõneajalugu" "Kontaktid" "Kõnepost" - "Eemaldatud lemmikute hulgast" - "Võta tagasi" "Helista: %s" "Loo uus kontakt" "Lisa kontaktile" "Saada SMS" "Videokõne tegemine" "Blokeeri number" - "%s uus/uut vastamata kõne(t)" "Te pole veel kedagi kiirvalimisse lisanud" "Lisa lemmik" - "Teil pole veel kontakte" - "Lisa kontakt" - "Puudutage kujutist kõigi numbrite nägemiseks või puudutage pikalt järjestuse muutmiseks" "Eemalda" + "Vali kõik" "Videokõne" "Saada sõnum" "Kõne üksikasjad" @@ -164,25 +118,14 @@ "Helistamine: ^1" "Videokõne kirjele ^1." "Kontakti ^1 kõneposti kuulamine" - "Kõnepostisõnumite esita kontaktilt ^1" - "Kõnepostisõnumite peatamine kontaktilt ^1" - "Kõnepostisõnumite kustutamine kontaktilt ^1" - - %d uut kõnepostisõnumit - %d uus kõnepostisõnum - "Kontakti loomine kirjele ^1" "Kirje ^1 lisamine olemasolevale kontaktile" "Kontakti ^1 kõne üksikasjad" - "Kustutatud kõneajaloost" "Täna" "Eile" "Vanem" - "Kõneloend" "Kõlari sisselülitamine." "Kõlari väljalülitamine." - "Kiirem esitus." - "Aeglasem esitus." "Esituse alustamine või peatamine." "Kuvamisvalikud" "Helid ja vibreerimine" @@ -199,7 +142,6 @@ "Kõned" "Kõnede blokeerimine" "Kõnepost" - "Kõnepostis. seadete SIM-kaart" "Kõnede blokeerimine on ajutiselt väljas" "Kõnede blokeerimine on keelatud, kuna võtsite sellelt telefonilt viimase 48 tunni jooksul ühendust hädaabiteenustega. See lubatakse 48 tunni möödumisel automaatselt uuesti." "Impordi numbrid" @@ -213,12 +155,8 @@ "Blokeeritud numbrid" "%1$s on juba blokeeritud." "Helistamiskontod" - "Lülita sisse" - "Määra load" "Kiirvalimise lubamiseks lülitage sisse kontaktiluba." "Kõnelogi vaatamiseks lülitage sisse telefoniluba." - "Kontaktide vaatamiseks lülitage sisse kontaktiluba." - "Kõnepostile juurdepääsemiseks lülitage sisse telefoniluba." "Kontaktide otsimiseks lülitage sisse kontaktiload." "Helistamiseks lülitage sisse telefoniluba." "Telefonirakendusel pole luba süsteemiseadetesse kirjutada." @@ -230,4 +168,10 @@ "Rämpspost" "%1$s ei ole võrgus ja temaga ei saa ühendust" "Teave" + "Google\'i transkribeeritud" + "Google transkribeerib …" + "Logifail pole saadaval" + "Kuva" + "Kõne kustutati. Selle kõne ajal jagatud manuseid saate vaadata ja kustutada rakenduses Messages." + "Kõned kustutati. Nende kõnede ajal jagatud manuseid saate vaadata ja kustutada rakenduses Messages." diff --git a/java/com/android/dialer/app/res/values-eu/strings.xml b/java/com/android/dialer/app/res/values-eu/strings.xml index 95f4621a4..e4f9f3f0c 100644 --- a/java/com/android/dialer/app/res/values-eu/strings.xml +++ b/java/com/android/dialer/app/res/values-eu/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefonoa" "Telefonoko teklatua" - "Telefonoa" "Deien historia" - "Jakinarazi zenbakia okerra dela" "Kopiatu zenbakia" "Kopiatu transkripzioa" - "Blokeatu zenbakia" - "Desblokeatu zenbakia" "Editatu zenbakia deitu aurretik" "Garbitu deien historia" "Ezabatu ahots-mezua" @@ -34,7 +30,6 @@ "Deien historia garbitu?" "Historiako dei guztiak ezabatuko dira" "Deien historia garbitzen…" - "Telefonoa" "Galdutako deia" "Laneko dei bat galdu duzu" "Dei galduak" @@ -48,107 +43,66 @@ Erantzungailuko %1$d mezu Erantzungailuko mezua - "Erreproduzitu" "%1$s, %2$s" "%1$s deitzailearen ahots-mezu berria" "Ezin izan dira erreproduzitu ahots-mezuak" "Erantzungailua kargatzen…" - "Ahots-mezua artxibatzen…" "Ezin izan da kargatu erantzungailua" - "Erantzungailuko deiak soilik" - "Sarrerako deiak soilik" - "Irteerako deiak soilik" - "Dei galduak soilik" "(%1$d) %2$s" - "bilatu" - "markatu" - "markatu beharreko zenbakia" - "Erreproduzitu edo pausatu erreprodukzioa" "Aktibatu edo desaktibatu bozgorailua" "Bilatu erreprodukzioaren posizioa" - "Mantsotu erreprodukzioaren abiadura" - "Bizkortu erreprodukzioaren abiadura" "Deien historia" "Aukera gehiago" "teklatua" - "Erakutsi irteerakoak soilik" - "Erakutsi sarrerakoak soilik" - "Erakutsi galduak soilik" - "Erakutsi erantzungailukoak soilik" - "Erakutsi dei guztiak" - "Gehitu 2 segundoko pausa" - "Gehitu itxaronaldia" "Ezarpenak" "Simulagailua" - "Kontaktu guztiak" - "Erabili ukipen-tonuak dituen teklatua" - "Itzuli abian den deira" - "Gehitu deia" - "Sarrerako deiak" - "Erreproduzitu erantzungailuko ahots-mezuak" - "Ikusi %1$s kontaktua" - "Deitu %1$s erabiltzaileari" + "Sortu interfazerako esteka" + "Ekintzak multzoka gauzatzeko modua aktibatzen" + "Ekintzak multzoka gauzatzeko modua desaktibatu da" + "%1$s hautatu da" + "%1$s desautatu da" "%1$s kontaktuaren xehetasunak" "Antza spam-igorlea den %1$s zenbakiaren harremanetarako datuak" "%1$s dei." "Bideo-deia." - "Bidali SMSa %1$s kontaktuari" - "Entzun ez diren erantzungailuko ahots-mezuak" "Hasi ahozko bilaketa" - "Deitu %s zenbakira" "Erantzungailua" - "%s s" - "%s min %s s" - "ahots-mezua" - "ahots-mezuak" - "Bai" - "Ez" - "Hautatutako %1$s ezabatu?" + "Utzi bertan behera ekintzak multzoka gauzatzeko modua" + "Ezabatu" + "Utzi" + "%1$s hautatu dira" + + ""Ahots-mezu hauek ezabatu nahi dituzu? "" + ""Ahots-mezu hau ezabatu nahi duzu? "" + @string/call_log_header_today "%1$s (%2$s)" "%1$02d:%2$02d" "%1$s%2$s" - "Ezin da zenbaki horretara deitu" - "Erantzungailua konfiguratzeko, joan Menua > Ezarpenak atalera." - "Erantzungailua entzuteko, Hegaldi modua desaktibatu behar duzu." - "Kargatzen…" - "IMEI" - "MEID" - "SIM txarteletik kargatzen…" - "SIM txarteleko kontaktuak" - "Ez dago kontaktuen aplikaziorik erabilgarri" "Ahozko bilaketa ez dago erabilgarri" - "Ezin da telefono-deirik egin Telefonoa aplikazioa desgaitu egin delako." "Bilatu kontaktuetan" "Gehitu zk. edo bilatu kontaktua" "Hutsik dago deien historia" "Deitu" "Ez duzu dei galdurik." "Erantzungailuaren sarrerako ontzia hutsik dago." - "Erakutsi gogokoak soilik" "Deien historia" "Guztiak" "Galduak" - "Erantzungailuko deiak" "Markatze bizkorra" "Deien historia" "Kontaktuak" "Erantzungailua" - "Gogokoetatik kendu da" - "Desegin" "Deitu %s zenbakira" "Sortu kontaktua" "Gehitu kontaktuetan" "Bidali SMS mezua" "Egin bideo-deia" "Blokeatu zenbakia" - "%s dei galdu berri" "Ez duzu inor markatze bizkorrean oraindik" "Gehitu gogokoak" - "Ez duzu kontakturik oraindik" - "Gehitu kontaktua" - "Ukitu irudia zenbaki guztiak ikusteko, edo eduki ezazu sakatuta berrantolatzeko" "Kendu" + "Hautatu guztiak" "Bideo-deia" "Bidali mezua" "Deiaren xehetasunak" @@ -164,25 +118,14 @@ "Deitu ^1 deitzaileari" "Egin bideo-deia (^1)." "Deitzaile honek erantzungailuan utzitako ahots-mezuak entzutea: ^1" - "Erreproduzitu erantzungailuko ^1 deitzailearen mezua" - "Pausatu erantzungailuko ^1 deitzailearen mezua" - "Ezabatu erantzungailuko ^1 deitzailearen mezua" - - %d ahots-postako mezu berri - %d ahots-postako mezu berri - "Sortu kontaktua (^1)" "Gehitu ^1 lehendik dagoen kontaktu batean" "^1 kontaktuaren xehetasunak" - "Ezabatu deien historiatik" "Gaur" "Atzo" "Zaharrak" - "Deien zerrenda" "Aktibatu bozgorailua." "Desaktibatu bozgorailua." - "Erreproduzitu bizkorrago." - "Erreproduzitu mantsoago." "Hasi edo gelditu erreprodukzioa." "Bistaratze-aukerak" "Soinuak eta dardara" @@ -199,7 +142,6 @@ "Deiak" "Deien blokeoa" "Erantzungailua" - "Hautatu erantzungailuaren ezarpenak aldatzeko SIM txartela" "Deien blokeoa aldi baterako desgaituta" "Deiak blokeatzeko aukera desgaitu egin da, azken 48 orduetan larrialdi-zerbitzuekin harremanetan jarri zarelako telefono honetatik. Berriro gaituko da 48 orduko epea igaro ondoren." "Inportatu zenbakiak" @@ -213,12 +155,8 @@ "Blokeatutako zenbakiak" "%1$s blokeatuta dago dagoeneko." "Deiak egiteko kontuak" - "Aktibatu" - "Ezarri baimenak" "Markatze bizkorra gaitzeko, aktibatu Kontaktuak erabiltzeko baimena." "Deien erregistroa ikusteko, aktibatu Telefonoa erabiltzeko baimena." - "Kontaktuak ikusteko, aktibatu Kontaktuak erabiltzeko baimena." - "Erantzungailuan sartzeko, aktibatu Telefonoa erabiltzeko baimena." "Kontaktuak bilatzeko, aktibatu kontaktuak atzitzeko baimenak." "Deiak egiteko, aktibatu Telefonoa erabiltzeko baimena." "Telefonoa aplikazioak ez du baimenik sistemaren ezarpenetan ezer idazteko." @@ -230,4 +168,10 @@ "Spama" "%1$s ez dago konektatuta, eta ezin zara jarri harremanetan berarekin" "Honi buruz" + "Google-k transkribatu du" + "Google ari da transkribatzen…" + "Ez dago transkripziorik" + "Ikusi" + "Ezabatu da deia. Ikusi eta ezabatu dei honetan partekatutako eranskinak Mezuak aplikazioan." + "Ezabatu dira deiak. Ikusi eta ezabatu dei hauetan partekatutako eranskinak Mezuak aplikazioan." diff --git a/java/com/android/dialer/app/res/values-fa/strings.xml b/java/com/android/dialer/app/res/values-fa/strings.xml index 9c8c01b64..51b02ff90 100644 --- a/java/com/android/dialer/app/res/values-fa/strings.xml +++ b/java/com/android/dialer/app/res/values-fa/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "تلفن" "صفحه کلید تلفن" - "تلفن" "سابقه تماس" - "گزارش شماره نادرست" "کپی کردن شماره" "کپی کردن آوانویسی" - "مسدود کردن شماره" - "رفع انسداد شماره" "ویرایش شماره قبل از تماس" "پاک کردن سابقه تماس" "حذف پست صوتی" @@ -34,7 +30,6 @@ "سابقه تماس پاک شود؟" "این کار همه تماس‌ها را از سابقه شما حذف می‌کند" "در حال پاک کردن سابقه تماس..." - "تلفن" "تماس بی پاسخ" "تماس کاری ازدست‌رفته" "تماس‌های بی‌پاسخ" @@ -48,107 +43,66 @@ %1$d پست صوتی %1$d پست صوتی - "پخش" "%1$s، %2$s" "پست صوتی جدید از %1$s" "پست صوتی پخش نشد" "در حال بارگیری پست صوتی..." - "در حال بایگانی کردن پست صوتی..." "پست صوتی بارگیری نشد" - "فقط تماس‌های دارای پست صوتی" - "فقط تماس‌های دریافتی" - "فقط تماس‌های خروجی" - "فقط تماس‌های بی‌پاسخ" "(%1$d) %2$s" - "جستجو" - "شماره گیری" - "شماره برای شماره گیری" - "پخش یا توقف بازپخش" "روشن یا خاموش کردن بلندگوی تلفن" "جستجوی موقعیت بازپخش" - "کاهش سرعت بازپخش" - "افزایش سرعت بازپخش" "سابقه تماس" "گزینه‌های بیشتر" "صفحه کلید" - "فقط نمایش خروجی" - "فقط نمایش ورودی" - "فقط نمایش بی‌پاسخ" - "فقط نمایش پست‌های صوتی" - "نمایش همه مکالمات" - "افزودن یک مکث ۲ ثانیه‌ای" - "افزودن انتظار" "تنظیمات" "شبیه‌ساز" - "همه مخاطبین" - "استفاده از صفحه‌کلید لمسی" - "برگشت به تماس درحال انجام" - "افزودن تماس" - "تماس‌های ورودی" - "پخش پست صوتی" - "مشاهده مخاطب %1$s" - "تماس با %1$s" + "ایجاد میان‌بر رابط کاربری جدید" + "درحال ورود به حالت اقدام انبوه" + "خروج از حالت اقدام انبوه" + "%1$s انتخاب شد" + "%1$s از حالت انتخاب خارج شد" "جزئیات تماس برای %1$s" "جزئیات تماس برای تماس‌گیرندگان هرزنامه پشتیبانی شده %1$s" "%1$s تماس." "تماس ویدئویی." - "ارسال پیامک به %1$s" - "پست صوتی شنیده نشده" "شروع جستجوی گفتاری" - "تماس با %s" "پست صوتی" - "%s ثانیه" - "%s دقیقه %s ثانیه" - "پست صوتی" - "پست‌های صوتی" - "بله" - "نه" - "%1$s انتخاب‌شده حذف شود؟" + "لغو حالت اقدام‌ دسته‌ای" + "حذف" + "لغو" + "%1$s مورد انتخاب شد" + + ""این پست‌های صوتی حذف شوند؟ "" + ""این پست‌های صوتی حذف شوند؟ "" + @string/call_log_header_today "%1$s ساعت %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "تماس با این شماره ممکن نیست" - "برای راه‌اندازی پست صوتی به منو > تنظیمات بروید." - "برای تماس با پست صوتی، ابتدا حالت هواپیما را غیرفعال کنید." - "در حال بارکردن…" - "IMEI" - "MEID" - "در حال بارگیری سیم کارت..." - "مخاطبین سیم کارت" - "هیچ برنامه مخاطبی در دسترس نیست" "جستجوی گفتاری در دسترس نیست" - "برقراری تماس تلفنی ممکن نیست، زیرا برنامه تلفن غیرفعال شده است." "جستجوی مخاطبین" "افزودن شماره یا جستجوی مخاطب" "سابقه تماستان خالی است" "برقراری تماس تلفنی" "تماس بی‌پاسخی ندارید." "صندوق پست صوتی‌تان خالی است." - "فقط نمایش موارد دلخواه" "سابقه تماس" "همه موارد" "بی‌پاسخ" - "پست صوتی" "شماره‌گیری سریع" "سابقه تماس" "مخاطبین" "پست صوتی" - "از موارد دلخواه حذف شد" - "واگرد" "تماس با %s" "ایجاد مخاطب جدید" "افزودن به مخاطب" "ارسال پیامک" "برقراری تماس ویدئویی" "مسدود کردن شماره" - "%s تماس‌ بی‌پاسخ جدید" "هنوز کسی در فهرست شماره‌گیری سریع شما نیست" "افزودن مورد دلخواه" - "هنوز هیچ مخاطبی ندارید" - "افزودن مخاطب" - "برای مشاهده همه شماره‌ها، تصویر را لمس کنید، یا برای ترتیب مجدد، لمس کنید و نگه‌دارید" "حذف" + "انتخاب همه" "تماس ویدئویی" "ارسال پیام" "جزئیات تماس" @@ -164,25 +118,14 @@ "تماس با ^1" "تماس ویدئویی با ^1." "گوش دادن به پست صوتی از ^1" - "پخش پست صوتی از ^1" - "مکث پست صوتی از ^1" - "حذف پست صوتی از ^1" - - %d پست صوتی جدید - %d پست صوتی جدید - "ایجاد مخاطب برای ^1" "افزودن ^1 به مخاطب موجود" "جزئیات تماس برای ^1" - "از سابقه تماس حذف شد" "امروز" "دیروز" "قدیمی‌تر" - "فهرست تماس‌ها" "روشن کردن بلندگو." "خاموش کردن بلندگو." - "پخش سریع‌تر" - "پخش آهسته‌تر." "شروع یا مکث بازپخش." "گزینه‌های نمایش" "صدا و لرزش" @@ -199,7 +142,6 @@ "تماس‌ها" "مسدود کردن تماس" "پست صوتی" - "انتخاب سیم‌کارت برای تنظیمات پست صوتی" "انسداد تماس موقتاً خاموش است" "چون در ۴۸ ساعت گذشته با این تلفن با سرویس‌های اضطراری تماس گرفتید، انسداد تماس غیرفعال شده است. پس از گذشت ۴۸ ساعت، این قابلیت دوباره فعال می‌شود." "وارد کردن شماره‌ها" @@ -213,12 +155,8 @@ "شماره‌های مسدود‌شده" "%1$s درحال‌حاضر مسدود شده است." "حساب‌های تماس" - "روشن کردن" - "تنظیم مجوزها" "برای فعال کردن شماره‌گیری سریع، مجوز «مخاطبین» را روشن کنید." "برای دیدن گزارش تماستان، مجوز «تلفن» را روشن کنید." - "برای دیدن مخاطبینتان، مجوز «مخاطبین» را روشن کنید." - "برای دسترسی به پست صوتی‌تان، مجوز «تلفن» را روشن کنید." "برای جستجوی مخاطبینتان، مجوزهای مخاطبین را روشن کنید." "برای برقراری تماس، مجوز «تلفن» را روشن کنید." "برنامه تلفن اجازه نوشتن در تنظیمات سیستم را ندارد." @@ -230,4 +168,10 @@ "هرزنامه" "%1$s آفلاین است و در دسترس نمی‌باشد" "درباره" + "‏رونویسی‌شده توسط Google" + "‏Google درحال ترانویسی است…" + "رونوشت موجود نیست" + "مشاهده" + "تماس حذف شد. پیوست‌های به اشتراک‌گذاشته‌شده درطول این تماس را در «پیام‌ها» مشاهده و حذف کنید." + "تماس‌ها حذف شدند. پیوست‌های به اشتراک‌گذاشته‌شده درطول تماس‌ها را در «پیام‌ها» مشاهده و حذف کنید." diff --git a/java/com/android/dialer/app/res/values-fi/strings.xml b/java/com/android/dialer/app/res/values-fi/strings.xml index c5a103d48..4586db73c 100644 --- a/java/com/android/dialer/app/res/values-fi/strings.xml +++ b/java/com/android/dialer/app/res/values-fi/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Puhelin" "Puhelimen näppäimistö" - "Puhelin" "Soittohistoria" - "Ilmoita epätarkasta numerosta" "Kopioi numero" "Kopioi transkriptio" - "Estä numero" - "Kumoa numeron esto" "Muokkaa numeroa ennen puhelua" "Tyhjennä soittohistoria" "Poista vastaajaviesti" @@ -34,7 +30,6 @@ "Tyhjennetäänkö soittohistoria?" "Kaikki soittohistorian tiedot poistetaan" "Tyhjennetään soittohistoriaa…" - "Puhelin" "Vastaamatta jäänyt puhelu" "Vastaamaton työpuhelu" "Vastaamattomat puhelut" @@ -48,107 +43,66 @@ %1$d vastaajaviestiä Vastaajaviesti - "Toista" "%1$s, %2$s" "Uusi vastaajaviesti: %1$s" "Viestin toistaminen epäonnistui" "Ladataan puhelinvastaajaa…" - "Arkistoidaan vastaajaviestiä…" "Puhelinvastaajan lataaminen epäonnistui" - "Vain vastaajaan menneet puhelut" - "Vain saapuvat puhelut" - "Vain soitetut puhelut" - "Vain vastaamattomat puhelut" "(%1$d) %2$s" - "haku" - "soita" - "numero johon soitetaan" - "Aloita tai lopeta toisto" "Ota kaiutin käyttöön tai poista käytöstä" "Toisto-osoitin" - "Hidasta toistoa" - "Nopeuta toistoa" "Soittohistoria" "Lisää vaihtoehtoja" "näppäimistö" - "Näytä vain soitetut" - "Näytä vain saapuneet" - "Näytä vain vastaamattomat" - "Näytä vain vastaajaviestit" - "Näytä kaikki puhelut" - "Lisää 2 sekunnin tauko" - "Lisää tauko" "Asetukset" "Simulaattori" - "Kaikki yhteystiedot" - "Käytä näppäimistöä" - "Palaa käynnissä olevaan puheluun" - "Lisää puhelu" - "Saapuvat puhelut" - "Toista vastaajaviesti" - "Näytä yhteystieto %1$s" - "Soita: %1$s" + "Luo uusi UI-pikakuvake" + "Siirrytään joukkotoimintotilaan." + "Poistuttiin joukkotoimintotilasta." + "%1$s valittiin." + "%1$s ei ole enää valittuna." "Yhteystiedot: %1$s" "Mahdollisen häirikkösoittajan yhteystiedot: %1$s" "%1$s puhelua." "Videopuhelu." - "Lähetä tekstiviesti: %1$s" - "Kuuntelematon vastaajaviesti" "Aloita puhehaku" - "Soita %s" "Vastaaja" - "%s s" - "%s min %s s" - "vastaajaviesti" - "vastaajaviestit" - "Kyllä" - "Ei" - "Poistetaanko %1$s?" + "Peruuta joukkotoimintotila." + "Poista" + "Peruuta" + "%1$s valittu" + + ""Poistetaanko nämä vastaajaviestit? "" + ""Poistetaanko tämä vastaajaviesti? "" + @string/call_log_header_today "%1$s klo %2$s" "%1$02d.%2$02d" "%1$s%2$s" - "Numeroon ei voi soittaa" - "Määritä vastaaja-asetukset valitsemalla Valikko > Asetukset." - "Poista lentokonetila käytöstä ennen vastaajaan soittamista." - "Ladataan..." - "IMEI-koodi" - "MEID" - "Ladataan SIM-kortilta…" - "SIM-kortin yhteystiedot" - "Ei käytettävissä olevaa yhteystietosovellusta" "Puhehaku ei ole käytettävissä" - "Puhelua ei voi soittaa, koska Puhelin-sovellus on poistettu käytöstä." "Hae yhteystiedoista" "Lisää numero tai hae yhteystiedoista" "Soittohistoriasi on tyhjä." "Soita puhelu" "Sinulla ei ole vastaamattomia puheluita." "Puhelinvastaajasi postilaatikko on tyhjä." - "Näytä vain suosikit" "Soittohistoria" "Kaikki" "Vastaamattomat" - "Vastaaja" "Pikavalinta" "Soittohistoria" "Yhteystiedot" "Puhelinvastaaja" - "Poistettu suosikeista" - "Kumoa" "Soita %s" "Luo uusi yhteystieto" "Lisää yhteystietoihin" "Lähetä tekstiviesti" "Soita videopuhelu" "Estä numero" - "%s uutta vastaamatonta puhelua" "Pikavalinnassa ei ole vielä yhtään yhteystietoa." "Lisää suosikki" - "Sinulla ei ole yhteystietoja." - "Lisää yhteystieto" - "Katso kaikki numerot koskettamalla kuvaa tai järjestele tietoja koskettamalla kuvaa pitkään." "Poista" + "Valitse kaikki" "Videopuhelu" "Lähetä viesti" "Puhelun tiedot" @@ -164,25 +118,14 @@ "Soita: ^1" "Soita videopuhelu: ^1." "Kuuntele vastaajaviesti: ^1" - "Toista vastaajaviesti lähettäjältä ^1" - "Keskeytä vastaajaviesti lähettäjältä ^1" - "Poista vastaajaviesti lähettäjältä ^1" - - %d uutta vastaajaviestiä - %d uusi vastaajaviesti - "Luo kontakti: ^1." "Lisää ^1 olemassa olevaan kontaktiin." "Yhteystiedon ^1 puhelutiedot" - "Poistettu soittohistoriasta" "Tänään" "Eilen" "Vanhempi" - "Puheluluettelo" "Ota kaiutin käyttöön." "Poista kaiutin käytöstä." - "Toista nopeammin." - "Toista hitaammin." "Aloita tai keskeytä toisto." "Näyttöasetukset" "Äänet ja värinä" @@ -199,7 +142,6 @@ "Puhelut" "Puhelujen esto" "Vastaaja" - "Valitse vastaajaviestien SIM" "Puheluesto väliaikaisesti pois käytöstä" "Puheluiden estäminen on poistettu käytöstä, koska olet ottanut yhteyttä hätäpalveluihin tästä puhelimesta viimeisen 48 tunnin aikana. Esto otetaan automaattisesti uudelleen käyttöön, kun puhelusta on kulunut 48 tuntia." "Tuo numerot" @@ -213,12 +155,8 @@ "Estetyt numerot" "%1$s on jo estetty." "Puhelutilit" - "Ota käyttöön" - "Määritä käyttöoikeudet" "Jos haluat käyttää pikavalintaa, ota Yhteystiedot-käyttöoikeus käyttöön." "Jos haluat katsella puhelulokiasi, ota Puhelin-käyttöoikeus käyttöön." - "Jos haluat katsella yhteystietojasi, ota Yhteystiedot-käyttöoikeus käyttöön." - "Jos haluat käyttää puhelinvastaajaa, ota Puhelin-käyttöoikeus käyttöön." "Jos haluat hakea kontaktejasi, ota käyttöön kontaktien käyttöoikeudet." "Jos haluat soittaa puheluja, ota Puhelin-käyttöoikeus käyttöön." "Puhelinsovelluksella ei ole oikeutta muokata järjestelmän asetuksia." @@ -230,4 +168,10 @@ "Roskaposti" "%1$s on offline-tilassa, eikä siihen saada yhteyttä." "Tietoja" + "Googlen litteroima" + "Google litteroi…" + "Litteraatti ei saatavilla" + "Näytä" + "Puhelu poistettu. Voit tarkastella ja poistaa puhelun aikana jaettuja liitteitä Viesteissä." + "Puhelut poistettu. Voit tarkastella ja poistaa puhelujen aikana jaettuja liitteitä Viesteissä." diff --git a/java/com/android/dialer/app/res/values-fr-rCA/strings.xml b/java/com/android/dialer/app/res/values-fr-rCA/strings.xml index d557d7442..c0c467e25 100644 --- a/java/com/android/dialer/app/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/app/res/values-fr-rCA/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Téléphone" "Clavier du téléphone" - "Téléphone" "Historique des appels" - "Signaler un numéro incorrect" "Copier le numéro" "Copier la transcription" - "Bloquer le numéro" - "Débloquer le numéro" "Modifier le numéro avant l\'appel" "Effacer l\'historique d\'appels" "Supprimer le message vocal" @@ -34,7 +30,6 @@ "Effacer l\'historique des appels?" "Tous les appels seront supprimés de votre historique." "Suppression historique des appels…" - "Téléphone" "Appel manqué" "Appel professionnel manqué" "Appels manqués" @@ -48,107 +43,66 @@ %1$d message vocal %1$d messages vocaux - "Lire" "%1$s, %2$s" "Nouveau message vocal de %1$s" "Impossible de lire le message vocal" "Chargement du message vocal en cours…" - "Archivage des messages vocaux en cours…" "Impossible de charger la messagerie vocale" - "Seulement les appels avec message vocal" - "Seulement les appels entrants" - "Seulement les appels sortants" - "Seulement les appels manqués" "(%1$d) %2$s" - "rechercher" - "composer" - "numéro à composer" - "Lire ou arrêter la lecture" "Activer ou désactiver le haut-parleur" "Rechercher une position de lecture" - "Réduire la vitesse de lecture" - "Accroître la vitesse de lecture" "Historique des appels" "Plus d\'options" "clavier" - "Afficher appels sortants uniq." - "Afficher appels entrants uniq." - "Afficher appels manqués uniq." - "Messages vocaux uniquement" - "Afficher tous les appels" - "Ajouter une pause de 2 s" - "Ajouter Attendre" "Paramètres" "Simulateur" - "Tous les contacts" - "Utiliser le clavier DTMF" - "Reprendre l\'appel en cours" - "Autre appel" - "Appels entrants" - "Écouter le message vocal" - "Afficher le contact %1$s" - "Appeler %1$s" + "Créer un raccourci vers l\'IU" + "Entrée du mode d\'action groupée en cours…" + "Mode d\'action groupée quitté" + "Sélection : %1$s" + "Désélection : %1$s" "Coordonnées de %1$s" "Coordonnées de l\'auteur de l\'appel suspect %1$s" "%1$s appels." "Appel vidéo." - "Envoyer un texto à %1$s" - "Nouveau message vocal" "Démarrer la recherche vocale" - "Appeler le %s" "Messagerie vocale" - "%s s" - "%s min et %s sec" - "message vocal" - "messages vocaux" - "Oui" - "Non" - "Supprimer la sélection (%1$s)?" + "Annuler le mode d\'action par lots" + "Supprimer" + "Annuler" + "%1$s sélection(s)" + + ""Supprimer ce message vocal? "" + ""Supprimer ces messages vocaux? "" + @string/call_log_header_today "%1$s à %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Vous ne pouvez pas appeler ce numéro" - "Pour configurer la messagerie vocale, accédez à Menu > Paramètres." - "Veuillez désactiver le mode Avion avant d\'appeler la messagerie vocale." - "Chargement en cours..." - "Code IIEM" - "MEID" - "Chargement depuis la carte SIM..." - "Contacts de carte SIM" - "Aucune application de gestion des contacts n\'est disponible" "Recherche vocale non disponible" - "Impossible d\'effectuer un appel téléphonique, car l\'application Téléphone a été désactivée." "Rechercher des contacts" "Ajouter nº ou chercher contact" "Votre historique des appels est vide" "Faire un appel" "Vous n\'avez aucun appel manqué." "La boîte de réception de votre messagerie vocale est vide." - "Afficher les contacts favoris uniquement" "Historique des appels" "Tous" "Manqués" - "Mess. voc." "Composition abrégée" "Historique des appels" "Contacts" "Messagerie vocale" - "Supprimé des favoris" - "Annuler" "Appeler le %s" "Créer un contact" "Ajouter à un contact" "Envoyer un texto" "Faire un appel vidéo" "Bloquer le numéro" - "%s nouveaux appels manqués" "Aucun contact ne figure dans vos numéros de composition abrégée" "Ajouter un favori" - "Vous n\'avez pas encore de contacts" - "Ajouter un contact" - "Touchez l\'image pour afficher tous les numéros, ou maintenez le doigt dessus pour les réorganiser" "Supprimer" + "Tout sélectionner" "Appel vidéo" "Envoyer un message" "Détails de l\'appel" @@ -164,25 +118,14 @@ "Appeler ^1" "Appel vidéo avec ^1" "Écouter le message vocal de ^1" - "Jouer le message vocal de ^1" - "Interrompre le message vocal de ^1" - "Supprimer le message vocal de ^1" - - %d nouveau message vocal - %d nouveaux messages vocaux - "Créer un contact pour ^1" "Ajouter ^1 à un contact existant" "Détails de l\'appel pour ^1" - "L\'appel a bien été supprimé de l\'historique" "Aujourd\'hui" "Hier" "Plus anciens" - "Liste des appels" "Activer le haut-parleur." "Désactiver le haut-parleur." - "Lire plus vite." - "Lire moins vite." "Lancer ou interrompre la lecture." "Options d\'affichage" "Sons et vibration" @@ -199,7 +142,6 @@ "Appels" "Blocage des appels" "Messagerie vocale" - "Choisir SIM pour mess. vocale" "Blocage appels désactivé temporairement" "Le blocage des appels a été désactivé, car vous avez communiqué avec les services d\'urgence à partir de ce téléphone au cours des dernières 48 heures. Le blocage sera réactivé automatiquement après 48 heures." "Importer les numéros" @@ -213,12 +155,8 @@ "Numéros bloqués" "Le numéro %1$s est déjà bloqué." "Comptes d\'appel" - "Activer" - "Définir les autorisations" "Pour activer la composition abrégée, activez l\'autorisation Contacts." "Pour consulter votre journal d\'appels, activez l\'autorisation Téléphone." - "Pour consulter vos contacts, activez l\'autorisation Contacts." - "Pour accéder à votre messagerie vocale, activez l\'autorisation Téléphone." "Pour rechercher vos contacts et les lieux à proximité, activez les autorisations Contacts." "Pour faire un appel, activez l\'autorisation Téléphone." "L\'application Téléphone n\'est pas autorisée à modifier les paramètres du système." @@ -230,4 +168,10 @@ "Pourriel" "%1$s est hors connexion et injoignable" "À propos" + "Transcrit par Google" + "Google transcrit…" + "Transcription non disponible" + "Afficher" + "Appel supprimé. Affichez et supprimez les pièces jointes partagées pendant cet appel dans les messages." + "Appels supprimés. Affichez et supprimez les pièces jointes partagées pendant ces appels dans les messages." diff --git a/java/com/android/dialer/app/res/values-fr/strings.xml b/java/com/android/dialer/app/res/values-fr/strings.xml index d8a59395b..c992ea950 100644 --- a/java/com/android/dialer/app/res/values-fr/strings.xml +++ b/java/com/android/dialer/app/res/values-fr/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Téléphone" "Clavier téléphonique" - "Tél." "Historique des appels" - "Signaler un numéro incorrect" "Copier le numéro" "Copier la transcription" - "Bloquer le numéro" - "Débloquer le numéro" "Modifier numéro avant d\'appeler" "Supprimer l\'historique des appels" "Supprimer le message vocal" @@ -34,7 +30,6 @@ "Supprimer l\'historique des appels ?" "Tous les appels seront supprimés de votre historique." "Suppression historique des appels…" - "Téléphoner" "Appel manqué" "Appel professionnel manqué" "Appels manqués" @@ -48,107 +43,66 @@ %1$d message vocal %1$d messages vocaux - "Lire" "%1$s, %2$s" "Nouveau message vocal de %1$s" "Impossible de lire le message vocal." "Chargement du message vocal en cours…" - "Archivage du message vocal…" "Impossible de charger le message vocal." - "Seulement les appels avec message vocal" - "Seulement les appels entrants" - "Seulement les appels sortants" - "Seulement les appels manqués" "(%1$d) %2$s" - "rechercher" - "composer" - "numéro à composer" - "Lancer ou interrompre la lecture" "Activer ou désactiver le haut-parleur" "Rechercher une position de lecture" - "Réduire la vitesse de lecture" - "Accroître la vitesse de lecture" "Historique des appels" "Plus d\'options" "Clavier" - "Afficher appels sortants uniq." - "Afficher appels entrants uniq." - "Afficher appels manqués uniq." - "Messages vocaux uniquement" - "Afficher tous les appels" - "Ajouter une pause de 2 s" - "Ajouter une attente" "Paramètres" "Simulateur" - "Tous les contacts" - "Utiliser le clavier DTMF" - "Reprendre l\'appel en cours" - "Autre appel" - "Appels entrants" - "Écouter le message vocal" - "Afficher le contact %1$s" - "Appeler %1$s" + "Créer un raccourci vers la nouvelle interface" + "Activation du mode d\'action groupée" + "Désactivation du mode d\'action groupée" + "%1$s sélectionné" + "%1$s désélectionné" "Coordonnées associées à %1$s" "Coordonnées correspondant à l\'appel indésirable suspecté (%1$s)" "%1$s appels" "Appel vidéo" - "Envoyer un SMS à %1$s" - "Nouveau message vocal" "Démarrer la recherche vocale" - "Appeler le %s" "Messagerie vocale" - "%s secondes" - "%s min et %s s" - "message vocal" - "messages vocaux" - "Oui" - "Non" - "Supprimer les messages vocaux sélectionnés (%1$s) ?" + "Annuler le mode d\'actions groupées" + "Supprimer" + "Annuler" + "%1$s sélectionnés" + + ""Supprimer ce message vocal ? "" + ""Supprimer ces message vocaux ? "" + @string/call_log_header_today "%1$s à %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Impossible d\'appeler ce numéro." - "Pour configurer la messagerie vocale, accédez à Menu > Paramètres." - "Veuillez désactiver le mode Avion avant d\'appeler la messagerie vocale." - "Chargement…" - "Code IMEI" - "MEID" - "Chargement depuis la carte SIM..." - "Contacts de carte SIM" - "Aucune application de gestion des contacts n\'est disponible." "Recherche vocale non disponible" - "Impossible d\'effectuer un appel téléphonique, car l\'application Téléphone a été désactivée." "Rech. des contacts" "Ajouter num. ou rech. contacts" "Votre historique des appels est vide." "Passer un appel" "Vous n\'avez aucun appel manqué." "La boîte de réception de la messagerie vocale est vide." - "Afficher les contacts ajoutés aux favoris uniquement" "Historique des appels" "Tous" "Manqués" - "Mess. vocale" "Numérotation abrégée" "Historique des appels" "Contacts" "Messagerie vocale" - "Supprimé des favoris." - "Annuler" "Appeler le %s" "Créer un contact" "Ajouter à un contact" "Envoyer un SMS" "Passer un appel vidéo" "Bloquer le numéro" - "Nouveaux appels manqués : %s" "Aucun contact pour la numérotation abrégée" "Ajouter un favori" - "Vous n\'avez pas encore de contacts." - "Ajouter un contact" - "Appuyer sur l\'image pour afficher tous les numéros, ou appuyer dessus de manière prolongée pour réorganiser ces derniers" "Supprimer" + "Tout sélectionner" "Appel vidéo" "Envoyer un message" "Informations sur l\'appel" @@ -164,25 +118,14 @@ "Appeler ^1" "Appel vidéo de \"^1\"" "Écouter le message vocal laissé par le numéro ou le contact \"^1\"" - "Lire le message vocal de ^1" - "Interrompre le message vocal de ^1" - "Supprimer le message vocal de ^1" - - %d nouveau message vocal - %d nouveaux messages vocaux - "Créer un contact pour \"^1\"" "Ajouter \"^1\" à un contact" "Informations sur l\'appel pour ^1" - "L\'appel a bien été supprimé de l\'historique." "Aujourd\'hui" "Hier" "Plus anciens" - "Liste des appels" "Activer le haut-parleur" "Désactiver le haut-parleur" - "Lire plus vite" - "Lire moins vite" "Lancer ou suspendre la lecture" "Options d\'affichage" "Sons et vibreur" @@ -199,7 +142,6 @@ "Appels" "Blocage des appels" "Messagerie vocale" - "Choisir une carte SIM pour la messagerie vocale" "Blocage appels désactivé temporairement" "Le blocage des appels a été désactivé, car vous avez contacté les services d\'urgence à l\'aide de ce téléphone au cours des dernières 48 heures. Le blocage sera réactivé automatiquement après 48 heures." "Importer les numéros" @@ -213,12 +155,8 @@ "Numéros bloqués" "Le numéro \"%1$s\" est déjà bloqué." "Comptes téléphoniques" - "Activer" - "Définir les autorisations" "Pour activer la numérotation abrégée, activez l\'autorisation Contacts." "Pour consulter votre journal d\'appels, activez l\'autorisation Téléphone." - "Pour consulter vos contacts, activez l\'autorisation Contacts." - "Pour accéder à votre messagerie vocale, activez l\'autorisation Téléphone." "Pour rechercher vos contacts, activez l\'autorisation Contacts." "Pour passer un appel, activez l\'autorisation Téléphone." "L\'application Téléphone n\'est pas autorisée à modifier les paramètres du système." @@ -230,4 +168,10 @@ "Spam" "%1$s est injoignable, car non connecté" "À propos" + "Message transcrit par Google" + "Transcription Google..." + "Transcription non disponible" + "Afficher" + "Appel supprimé. Affichez et supprimez les pièces jointes échangées au cours de cet appel dans Messages." + "Appels supprimés. Affichez et supprimez les pièces jointes échangées au cours de ces appels dans Messages." diff --git a/java/com/android/dialer/app/res/values-gl/strings.xml b/java/com/android/dialer/app/res/values-gl/strings.xml index 33b55a740..67d04ab36 100644 --- a/java/com/android/dialer/app/res/values-gl/strings.xml +++ b/java/com/android/dialer/app/res/values-gl/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Teléfono" "Teclado do teléfono" - "Teléfono" "Historial de chamadas" - "Informar dun número incorrecto" "Copiar número" "Copiar transcrición" - "Bloquear número" - "Desbloquear número" "Editar número antes de chamar" "Borrar historial de chamadas" "Eliminar correo de voz" @@ -34,7 +30,6 @@ "Borrar o historial de chamadas?" "Esta acción eliminará todas as chamadas do teu historial" "Borrando historial de chamadas…" - "Teléfono" "Chamada perdida" "Chamada de traballo perdida" "Chamadas perdidas" @@ -48,107 +43,66 @@ %1$d correos de voz Correo de voz - "Reproducir" "%1$s, %2$s" "Novo correo de voz de %1$s" "Non se puido reproducir o correo de voz" "Cargando correo de voz…" - "Arquivando correo de voz…" "Non se puido cargar o correo de voz" - "Só chamadas con correo de voz" - "Só chamadas entrantes" - "Só chamadas saíntes" - "Só chamadas perdidas" "(%1$d) %2$s" - "buscar" - "marcar" - "número que se vai marcar" - "Reproducir ou deter a reprodución" "Activar ou desactivar o altofalante" "Buscar posición de reprodución" - "Reducir a velocidade da reprodución" - "Aumentar a velocidade de reprodución" "Historial de chamadas" "Máis opcións" "Teclado" - "Mostrar só as saíntes" - "Mostrar só as entrantes" - "Mostrar só as perdidas" - "Mostrar só os correos de voz" - "Mostrar todas as chamadas" - "Engadir pausa de 2 segundos" - "Engadir espera" "Configuración" "Simulador" - "Todos os contactos" - "Usar teclado de tons táctiles" - "Volver á chamada en curso" - "Engadir chamada" - "Chamadas entrantes" - "Reproducir correo de voz" - "Ver contacto %1$s" - "Chamar a %1$s" + "Crear atallo para a nova IU" + "Entrando no modo de acción en bloque" + "Saíu do modo de acción en bloque" + "Seleccionouse: %1$s" + "Anulouse a selección de: %1$s" "Detalles de contacto de %1$s" "Detalles de contacto da chamada sospeitosa de spam: %1$s" "%1$s chamadas" "Videochamada" - "Envía unha SMS a %1$s" - "Correo de voz sen escoitar" "Iniciar busca por voz" - "Chamar ao %s" "Correo de voz" - "%s s" - "%s min %s s" - "correo de voz" - "correos de voz" - "Si" - "Non" - "Queres eliminar a selección (%1$s)?" + "Cancela o modo de accións en lote" + "Eliminar" + "Cancelar" + "Cantidade seleccionada: %1$s" + + ""Queres eliminar estes correos de voz? "" + ""Queres eliminar este correo de voz? "" + @string/call_log_header_today "%1$s ás %2$s" "%1$02d:%2$02d" "%1$s (%2$s)" - "Non é posible chamar a este número" - "Para configurar o correo de voz, accede a Menú > Configuración." - "Para chamar ao correo de voz, primeiro desactiva o modo avión." - "Cargando..." - "IMEI" - "MEID" - "Cargando da tarxeta SIM..." - "Contactos da tarxeta SIM" - "Non hai aplicacións de contactos dispoñibles" "Busca por voz non dispoñible" - "Non se pode facer unha chamada telefónica porque se desactivou a aplicación de teléfono." "Buscar contactos" "Engade número/busca contactos" "O teu historial de chamadas está baleiro" "Facer unha chamada" "Non tes chamadas perdidas." "A caixa de entrada do correo de voz está baleira." - "Mostrar só os favoritos" "Historial de chamadas" "Todas" "Perdidas" - "Correo de voz" "Marcación rápida" "Historial de chamadas" "Contactos" "Correo de voz" - "Eliminado dos favoritos" - "Desfacer" "Chamar ao %s" "Crear novo contacto" "Engadir a un contacto" "Enviar SMS" "Realizar unha videochamada" "Bloquear número" - "%s chamadas perdidas novas" "Aínda non tes ningún contacto na marcación directa" "Engade un favorito para a marcación directa" - "Aínda non tes contactos" - "Engade un contacto" - "Toca a imaxe para ver todos os números ou mantena premida para reordenalos" "Eliminar" + "Seleccionar todos" "Videochamada" "Enviar unha mensaxe" "Detalles da chamada" @@ -164,25 +118,14 @@ "Chamar a ^1" "Videochamada a ^1." "Escoitar o correo de voz de ^1" - "Reproducir correo de voz de ^1" - "Pausar correo de voz de ^1" - "Eliminar correo de voz de ^1" - - %d correos de voz novos - %d correo de voz novo - "Crear contacto para ^1" "Engadir ^1 ao contacto existente" "Detalles da chamada para ^1" - "Eliminouse do historial de chamadas" "Hoxe" "Onte" "Anteriores" - "Lista de chamadas" "Activar o altofalante." "Desactivar o altofalante." - "Reproducir máis rápido." - "Reproducir máis lento." "Iniciar ou pausar a reprodución." "Opcións de visualización" "Sons e vibración" @@ -199,7 +142,6 @@ "Chamadas" "Bloqueo de chamadas" "Correo de voz" - "Elixir SIM e configurar correo" "O bloqueo de chamadas desactivouse temporalmente" "O bloqueo de chamadas desactivouse porque contactaches cos servizos de emerxencias desde este teléfono nas últimas 48 horas. Volverase activar automaticamente unha vez que pase o período de 48 horas." "Importar números" @@ -213,12 +155,8 @@ "Números bloqueados" "O %1$s xa está bloqueado." "Contas de chamadas" - "Activar" - "Establecer permisos" "Para activar a marcación rápida, activa o permiso de Contactos." "Para ver o teu rexistro de chamadas, activa o permiso de Teléfono." - "Para ver os teus contactos, activa o permiso de Contactos." - "Para acceder ao correo de voz, activa o permiso de Teléfono." "Para buscar os teus contactos, activa os permisos de Contactos." "Para facer unha chamada, activa o permiso de Teléfono." "A aplicación Teléfono non ten permiso para modificar a configuración do sistema." @@ -230,4 +168,10 @@ "Spam" "Non se pode contactar con %1$s porque está sen conexión" "Acerca de" + "Transcrito por Google" + "Google está transcribindo…" + "Transcrición non dispoñible" + "Ver" + "Eliminouse a chamada. Podes ver e eliminar os anexos compartidos durante esta chamada en Mensaxes." + "Elimináronse as chamadas. Podes ver e eliminar os anexos compartidos durante as chamadas en Mensaxes." diff --git a/java/com/android/dialer/app/res/values-gu/strings.xml b/java/com/android/dialer/app/res/values-gu/strings.xml index 1df18269e..4424327bf 100644 --- a/java/com/android/dialer/app/res/values-gu/strings.xml +++ b/java/com/android/dialer/app/res/values-gu/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ફોન" "ફોન કીપેડ" - "ફોન" "કૉલ ઇતિહાસ" - "અચોક્કસ નંબરની જાણ કરો" "નંબર કૉપિ કરો" "ટ્રાંસ્ક્રિપ્શન કૉપિ કરો" - "નંબર અવરોધિત કરો" - "નંબર અનાવરોધિત કરો" "કૉલ કરતાં પહેલાં નંબર સંપાદિત કરો" "કૉલ ઇતિહાસ સાફ કરો" "વૉઇસમેઇલ કાઢી નાખો" @@ -34,7 +30,6 @@ "કૉલ ઇતિહાસ સાફ કરીએ?" "આ તમારા ઇતિહાસમાંથી તમામ કૉલ્સ કાઢી નાખશે" "કૉલ ઇતિહાસ સાફ કરી રહ્યાં છે…" - "ફોન" "છૂટેલો કૉલ" "ચૂકી ગયેલ કાર્ય કૉલ" "છૂટેલા કૉલ્સ" @@ -48,107 +43,66 @@ %1$d વૉઇસમેઇલ્સ %1$d વૉઇસમેઇલ્સ - "ચલાવો" "%1$s, %2$s" "%1$s તરફથી નવો વૉઇસમેઇલ." "વૉઇસમેઇલ ચલાવી શકાઈ નથી" "વૉઇસમેઇલ લોડ કરી રહ્યું છે…" - "વૉઇસમેઇલને આર્કાઇવ કરી રહ્યાં છે…" "વૉઇસમેઇલ લોડ કરી શકાઈ નથી" - "ફક્ત વૉઇસમેઇલ સાથેના કૉલ્સ" - "ફક્ત ઇનકમિંગ કૉલ્સ" - "ફક્ત આઉટગોઇંગ કૉલ્સ" - "ફક્ત છૂટી ગયેલ કૉલ્સ" "(%1$d) %2$s" - "શોધો" - "ડાયલ કરો" - "ડાયલ કરવા માટેનો નંબર" - "પ્લેબેક ચલાવો અથવા રોકો" "સ્પીકરફોન ચાલુ કે બંધ કરો" "પ્લેબેક સ્થિતિ શોધો" - "પ્લેબેક રેટ ઘટાડો" - "પ્લેબેક રેટ વધારો" "કૉલ ઇતિહાસ" "વધુ વિકલ્પો" "કી પેડ" - "ફક્ત આઉટગોઇંગ બતાવો" - "ફક્ત આવનારા બતાવો" - "ફક્ત છૂટેલ બતાવો" - "ફક્ત વૉઇસમેઇલ્સ બતાવો" - "તમામ કૉલ્સ બતાવો" - "2-સંકડનો વિરામ ઉમેરો" - "પ્રતીક્ષા ઉમેરો" "સેટિંગ્સ" "સિમ્યુલેટર" - "તમામ સંપર્કો" - "ટચ ટોન કીપેડનો ઉપયોગ કરો" - "કૉલ પર પાછા આવવું પ્રગતિ પર છે" - "કૉલ ઉમેરો" - "ઇનકમિંગ કૉલ્સ" - "વૉઇસમેઇલ ચલાવો" - "%1$s સંપર્ક જુઓ" - "%1$s ને કૉલ કરો" + "નવું UI શૉર્ટકટ્સ બનાવો" + "બલ્ક ક્રિયા મોડમાં દાખલ થઈ રહ્યાં છે" + "બલ્ક ક્રિયા મોડ છોડી દીધો" + "%1$s પસંદ કર્યો" + "%1$s પસંદગીમાંથી દૂર કર્યો" "%1$s માટે સંપર્ક વિગતો" "શંકાસ્પદ સ્પામ કૉલર %1$s માટેની સંપર્ક વિગતો" "%1$s કૉલ્સ." "વિડિઓ કૉલ." - "%1$s ને SMS મોકલો" - "વણસાંભળેલ વૉઇસમેઇલ" "વૉઇસ શોધ શરૂ કરો" - "%s ને કૉલ કરો" "વૉઇસમેઇલ" - "%s સેકંડ" - "%s મિ %s સે" - "વૉઇસમેઇલ" - "વૉઇસમેઇલ" - "હા" - "નહીં" - "પસંદ કરેલ %1$sને કાઢી નાખીએ?" + "બૅચ ક્રિયા મોડ રદ કરો" + "કાઢી નાખો" + "રદ કરો" + "%1$s પસંદ કરી" + + ""આ વૉઇસમેઇલ કાઢી નાખીએ? "" + ""આ વૉઇસમેઇલ કાઢી નાખીએ? "" + @string/call_log_header_today "%1$s નાં રોજ %2$s વાગ્યે" "%1$02d:%2$02d" "%1$s%2$s" - "આ નંબર પર કૉલ કરી શકતાં નથી" - "વૉઇસમેઇલ સેટ કરવા માટે, મેનૂ > સેટિંગ્સ પર જાઓ." - "વૉઇસમેઇલ પર કૉલ કરવા માટે, પહેલાં એરપ્લેન મોડને બંધ કરો." - "લોડ કરી રહ્યું છે..." - "IMEI" - "MEID" - "SIM કાર્ડમાંથી લોડ કરી રહ્યું છે…" - "SIM કાર્ડ સંપર્કો" - "કોઈ સંપર્કો ઍપ્લિકેશન ઉપલબ્ધ નથી" "વૉઇસ શોધ ઉપલબ્ધ નથી" - "ફોન કૉલ કરી શકાતો નથી કારણ કે ફોન ઍપ્લિકેશન અક્ષમ કરવામાં આવી છે." "સંપર્કો શોધો" "નંબર ઉમેરો અથવા સંપર્કો શોધો" "તમારો કૉલ ઇતિહાસ ખાલી છે" "કૉલ કરો" "તમારી પાસે કોઇ છૂટેલાં કૉલ્સ નથી." "તમારું વૉઇસમેઇલ ઇનબોક્સ ખાલી છે." - "ફક્ત મનપસંદ બતાવો" "કૉલ ઇતિહાસ" "તમામ" "છૂટેલ" - "વૉઇસમેઇલ" "સ્પીડ ડાયલ" "કૉલ ઇતિહાસ" "સંપર્કો" "વૉઇસમેઇલ" - "મનપસંદમાંથી દૂર કર્યું" - "પૂર્વવત્ કરો" "%s ને કૉલ કરો" "નવો સંપર્ક બનાવો" "સંપર્કમાં ઉમેરો" "SMS મોકલો" "વિડિઓ કૉલ કરો" "નંબર અવરોધિત કરો" - "%s નવા છૂટેલા કૉલ્સ" "તમારા ઝડપી ડાયલ પર હજી સુધી કોઇ નથી" "એક મનપસંદ ઉમેરો" - "તમે હજી સુધી કોઇપણ સંપર્કો ધરાવતાં નથી" - "સંપર્ક ઉમેરો" - "બધા નંબર્સ જોવા માટે છબી ટચ કરો અથવા પુનઃક્રમાંકિત કરવા માટે ટચ કરો અને પકડી રાખો" "દૂર કરો" + "તમામ પસંદ કરો" "વિડિઓ કૉલ" "એક સંદેશ મોકલો" "કૉલની વિગતો" @@ -164,25 +118,14 @@ "^1 ને કૉલ કરો" "^1 ને વિડિઓ કૉલ કરો." "^1 ના વૉઇસમેઇલને સાંભળો" - "^1 માંથી વૉઇસમેઇલ ચલાવો" - "^1 માંથી વૉઇસમેઇલ થોભાવો" - "^1 માંથી વૉઇસમેઇલ કાઢી નાખો" - - %d નવી વૉઇસમેઇલ્સ - %d નવી વૉઇસમેઇલ્સ - "^1 માટે સંપર્ક બનાવો" "^1 ને અસ્તિત્વમાંના સંપર્કમાં ઉમેરો" "^1 માટે કૉલ વિગતો" - "કૉલ ઇતિહાસમાંથી કાઢી નાખી" "આજે" "ગઈ કાલે" "જૂનું" - "કૉલ્સની સૂચિ" "સ્પીકર ચાલુ કરો." "સ્પીકર બંધ કરો." - "વધુ ઝડપથી ચલાવો." - "વધુ ધીરેથી ચલાવો." "પ્લેબેક ચલાવો અથવા થોભાવો" "પ્રદર્શન વિકલ્પો" "ધ્વનિ અને વાઇબ્રેશન" @@ -199,7 +142,6 @@ "કૉલ્સ" "કૉલ અવરોધ" "વૉઇસમેઇલ" - "વૉઇસમેઇલ સેટિંગ્સ માટે SIM પસંદ કરો" "કૉલ અવરોધિત કરવાનું અસ્થાયીરૂપે બંધ છે" "કૉલ અવરોધિત કરવાનું અક્ષમ કરવામાં આવ્યું છે કારણ કે તમે આ ફોનમાંથી છેલ્લા 48 કલાકમાં કટોકટીની સેવાઓનો સંપર્ક કર્યો હતો. એકવાર 48 કલાકનો સમયગાળો સમાપ્ત થાય, પછી તે આપમેળે ફરીથી સક્ષમ કરવામાં આવશે." "નંબર્સ આયાત કરો" @@ -213,12 +155,8 @@ "અવરોધિત નંબરો" "%1$s ને પહેલેથી અવરોધિત કરવામાં આવ્યો છે." "કૉલિંગ એકાઉન્ટ્સ" - "ચાલુ કરો" - "પરવાનગીઓ સેટ કરો" "ઝડપી ડાયલ સક્ષમ કરવા માટે, સંપર્કોની પરવાનગી ચાલુ કરો." "તમારો કૉલ લૉગ જોવા માટે, ફોન પરવાનગી ચાલુ કરો." - "તમારા સંપર્કો જોવા માટે, સંપર્કોની પરવાનગી ચાલુ કરો." - "તમારી વૉઇસમેઇલને ઍક્સેસ કરવા માટે, ફોન પરવાનગી ચાલુ કરો." "તમારા સંપર્કો શોધવા માટે, સંપર્કોની પરવાનગીઓ ચાલુ કરો." "કૉલ કરવા માટે, ફોન પરવાનગી ચાલુ કરો." "ફોન એપ્લિકેશનને સિસ્ટમ સેટિંગ્સ પર લખવાની પરવાનગી નથી." @@ -230,4 +168,10 @@ "સ્પામ" "%1$s ઑફલાઇન છે અને તેના સુધી પહોંચી શકતાં નથી" "વિશે" + "Google દ્વારા ટ્રાન્સ્ક્રાઇબ કરેલ" + "Google ટ્રાન્સ્ક્રાઇબ કરી રહ્યું છે..." + "ટ્રાન્સક્રિપ્ટ ઉપલબ્ધ નથી" + "જુઓ" + "કૉલ કાઢી નાખ્યો. આ કૉલ દરમિયાન સંદેશામાં શેર કરેલ જોડાણ જુઓ અને કાઢી નાખો." + "કૉલ કાઢી નાખ્યા. કૉલ દરમિયાન સંદેશામાં શેર કરેલ જોડાણ જુઓ અને કાઢી નાખો." diff --git a/java/com/android/dialer/app/res/values-hi/strings.xml b/java/com/android/dialer/app/res/values-hi/strings.xml index 84d2d974a..489d73bb4 100644 --- a/java/com/android/dialer/app/res/values-hi/strings.xml +++ b/java/com/android/dialer/app/res/values-hi/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "फ़ोन" "फ़ोन कीपैड" - "फ़ोन" "कॉल इतिहास" - "गलत नंबर की रिपोर्ट करें" "नंबर कॉपी करें" "ट्रांसक्रिप्शन को कॉपी करें" - "नंबर अवरुद्ध करें" - "नंबर अनवरोधित करें" "कॉल करने से पहले नंबर संपादित करें" "कॉल इतिहास साफ़ करें" "वॉइसमेल हटाएं" @@ -34,7 +30,6 @@ "कॉल इतिहास साफ़ करें?" "इससे आपके इतिहास से सभी कॉल हटा दिए जाएंगे" "कॉल इतिहास साफ़ किया जा रहा है…" - "फ़ोन" "छूटी कॉल" "कार्यस्थल का छूटा हुआ कॉल" "छूटे कॉल" @@ -48,107 +43,66 @@ %1$d वॉइसमेल %1$d वॉइसमेल - "चलाएं" "%1$s, %2$s" "%1$s की ओर से नया ध्‍वनिमेल" "वॉइसमेल नहीं चलाया जा सका" "वॉइसमेल लोड हो रहा है…" - "वॉइसमेल संग्रहित किया जा रहा है…" "वॉइसमेल लोड नहीं किया जा सका" - "केवल वॉयस मेल वाले कॉल" - "केवल इनकमिंग कॉल" - "केवल आउटगोइंग कॉल" - "केवल छूटे कॉल" "(%1$d) %2$s" - "खोजें" - "डायल करें" - "डायल करने के लिए नंबर" - "प्लेबैक चलाएं या बंद करें" "स्पीकरफ़ोन को चालू या बंद पर स्विच करें" "प्लेबैक स्थिति का पता लगाएं" - "प्लेबैक दर घटाएं" - "प्लेबैक दर बढ़ाएं" "कॉल इतिहास" "अधिक विकल्प" "कीपैड" - "केवल आउटगोइंग ही दिखाएं" - "केवल इनकमिंग ही दिखाएं" - "केवल छूटे हुए ही दिखाएं" - "केवल ध्‍वनि‍मेल दि‍खाएं" - "सभी कॉल दि‍खाएं" - "2-सेकंड का विराम जोड़ें" - "प्रतीक्षा का समय बढ़ाएं" "सेटिंग" "सिम्युलेटर" - "सभी संपर्क" - "टच टोन कीपैड का उपयोग करें" - "कॉल पर लौटना प्रगति पर है" - "कॉल जोड़ें" - "इनकमिंग कॉल" - "ध्‍वनिमेल चलाएं" - "%1$s संपर्क देखें" - "%1$s को कॉल करें" + "नया UI शॉर्टकट बनाएं" + "बल्क कार्रवाई मोड में प्रवेश कर रहे हैं" + "बल्क कार्रवाई मोड छोड़ा" + "%1$s को चुना गया" + "%1$s को नहीं चुना गया" "%1$s का संपर्क विवरण" "संदिग्ध स्पैम कॉलर %1$s के लिए संपर्क विवरण" "%1$s कॉल." "वीडियो कॉल." - "%1$s को SMS भेजें" - "नहीं सुना गया वॉयस मेल" "बोलकर खोजें शुरु करें" - "%s पर कॉल करें" "वॉयस मेल" - "%s सेकंड" - "%s मि. %s से." - "वॉयसमेल" - "वॉयसमेल" - "हां" - "नहीं" - "क्या चुने गए %1$s हटाना चाहते हैं?" + "बैच कार्रवाई मोड रद्द करें" + "हटाएं" + "रद्द करें" + "%1$s चयनित" + + ""ये वॉइसमेल हटाएं? "" + ""ये वॉइसमेल हटाएं? "" + @string/call_log_header_today "%1$s को %2$s बजे" "%1$02d:%2$02d" "%1$s%2$s" - "इस नंबर पर कॉल नहीं किया जा सकता" - "वॉइसमेल सेट करने के लिए, मेनू > सेटिंग पर जाएं." - "वॉइसमेल कॉल करने के लिए, पहले हवाई जहाज़ मोड बंद करें." - "लोड हो रही है..." - "IMEI" - "MEID" - "सिम कार्ड से लोड हो रहा है…" - "सिम कार्ड के संपर्क" - "कोई भी संपर्क ऐप उपलब्‍ध नहीं है" "बोलकर खोजना उपलब्‍ध नहीं है" - "फ़ोन कॉल नहीं किया जा सकता क्योंकि फ़ोन ऐप्लिकेशन अक्षम कर दिया गया है." "संपर्क खोजें" "नंबर जोड़ें या संपर्क खोजें" "आपका कॉल इतिहास खाली है" "कॉल करें" "आपके पास कोई भी छूटा हुआ कॉल नहीं है." "आपका वॉइसमेल इनबाॅक्‍स खाली है." - "केवल पसंदीदा दिखाएं" "कॉल इतिहास" "सभी" "छूटे हुए" - "वॉयस मेल" "स्पीड डायल" "कॉल इतिहास" "संपर्क" "वॉइसमेल" - "पसंदीदा से निकाल दिया गया" - "वापस लाएं" "%s पर कॉल करें" "नया संपर्क बनाएं" "किसी संपर्क में जोड़ें" "SMS भेजें" "वीडियो कॉल करें" "नंबर अवरुद्ध करें" - "%s छूटे हुए नए कॉल" "आपके स्‍पीड डायल पर अभी तक कोई भी नहीं है" "कोई पसंदीदा जोड़ें" - "आपके पास अभी कोई भी संपर्क नहीं है" - "कोई संपर्क जोड़ें" - "सभी नंबर देखने के लिए चित्र को स्‍पर्श करें या पुन: क्रमित करने के लिए स्‍पर्श करके रखें" "निकालें" + "सभी चुनें" "वीडियो कॉल" "संदेश भेजें" "कॉल विवरण" @@ -164,25 +118,14 @@ "^1 को कॉल करें" "^1 को वीडियो कॉल करें." "^1 की वॉयस मेल सुनें" - "^1 का वॉइसमेल चलाएं" - "^1 का वॉइसमेल रोकें" - "^1 का वॉइसमेल हटाएं" - - %d नए वॉइसमेल - %d नए वॉइसमेल - "^1 के लिए संपर्क बनाएं" "^1 को मौजूदा संपर्क में जोड़ें" "^1 के कॉल विवरण" - "कॉल इतिहास से हटाएं" "आज" "कल" "पुराना" - "कॉल की सूची" "स्पीकर चालू करें." "स्पीकर बंद करें." - "तेज़ी से चलाएं." - "धीरे चलाएं." "प्लेबैक प्रारंभ करें या रोकें." "प्रदर्शन विकल्प" "ध्‍वनि और कंपन" @@ -199,7 +142,6 @@ "कॉल" "कॉल अवरुद्ध करें" "वॉइसमेल" - "वॉइसमेल सेटिंग हेतु सिम चुनें" "कॉल अवरुद्ध करना अस्‍थायी रूप से बंद है" "कॉल अवरुद्ध किए जाने को अक्षम कर दिया गया है क्योंकि पिछले 48 घंटों में आपने इस फ़ोन से आपातकालीन सेवाओं से संपर्क किया है. 48 घंटे की अवधि बीत जाने पर यह अपने आप फिर से सक्षम हो जाएगी." "नंबर आयात करें" @@ -213,12 +155,8 @@ "अवरोधित नंबर" "%1$s पहले से अवरोधित है." "कॉलिंग खाते" - "चालू करें" - "अनुमतियां सेट करें" "स्पीड डायल सक्षम करने के लिए, संपर्क अनुमति चालू करें." "अपना कॉल लॉग देखने के लिए, फ़ोन अनुमति चालू करें." - "अपने संपर्क देखने के लिए, संपर्क अनुमति चालू करें." - "अपना वॉइसमेल ऐक्सेस करने के लिए, फ़ोन अनुमति चालू करें." "अपने संपर्कों की खोज करने के लिए, संपर्क अनुमतियों को चालू करें." "कॉल करने के लिए, फ़ोन अनुमति चालू करें." "फ़ोन ऐप को सिस्टम सेटिंग में लिखने की अनुमति नहीं है." @@ -230,4 +168,10 @@ "स्पैम" "%1$s ऑफ़लाइन हैं और उन तक नहीं पहुंचा जा सकता" "संक्षिप्त विवरण" + "यह ट्रांसक्रिप्शन Google ने किया है" + "Google प्रतिलेखन कर रहा है …" + "ट्रांसक्रिप्ट उपलब्‍ध नहीं है" + "देखें" + "कॉल हटाया गया. संदेश में जा कर इस कॉल के दौरान साझा किए गए अटैचमेंट देखें और हटाएं." + "कॉल हटाए गए. संदेश में जा कर इस कॉल के दौरान साझा किए गए अटैचमेंट देखें और हटाएं." diff --git a/java/com/android/dialer/app/res/values-hr/strings.xml b/java/com/android/dialer/app/res/values-hr/strings.xml index cd3535372..b08ff0993 100644 --- a/java/com/android/dialer/app/res/values-hr/strings.xml +++ b/java/com/android/dialer/app/res/values-hr/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefonska tipkovnica" - "Telefon" "Povijest poziva" - "Prijavi netočan broj" "Kopiraj broj" "Kopiraj prijepis" - "Blokiraj broj" - "Deblokiraj broj" "Uredi broj prije pozivanja" "Izbriši povijest poziva" "Izbriši govornu poštu" @@ -34,7 +30,6 @@ "Želite li izbrisati povijest poziva?" "Izbrisat će se svi pozivi iz vaše povijesti" "Brisanje povijesti poziva…" - "Telefon" "Propušteni poziv" "Propušten poslovni poziv" "Propušteni pozivi" @@ -49,107 +44,67 @@ %1$d poruke govorne pošte %1$d poruka govorne pošte - "Reproduciraj" "%1$s, %2$s" "Nova govorna pošta od kontakta %1$s" "Nije moguće reproducirati govornu poštu" "Učitavanje govorne pošte…" - "Arhiviranje govorne pošte..." "Govorna pošta nije učitana" - "Samo pozivi s govornom poštom" - "Samo dolazni pozivi" - "Samo odlazni pozivi" - "Samo propušteni pozivi" "(%1$d) %2$s" - "pretraži" - "biraj" - "broj za pozivanje" - "Pokretanje ili zaustavljanje reprodukcije" "Uključivanje ili isključivanje zvučnika" "Traženje položaja reprodukcije" - "Smanjenje brzine reprodukcije" - "Povećanje brzine reprodukcije" "Povijest poziva" "Više opcija" "tipkovnica" - "Prikaži samo odlazne" - "Prikaži samo dolazne" - "Prikaži samo propuštene" - "Prikaži samo govorne pošte" - "Prikaz svih poziva" - "Dodaj pauzu od 2 s." - "Dodaj čekanje" "Postavke" "Simulator" - "Svi kontakti" - "Koristi dodirnu zvučnu tipkovnicu" - "Natrag na poziv u tijeku" - "Dodaj poziv" - "Dolazni pozivi" - "Reprodukcija govorne pošte" - "Prikaz kontakta %1$s" - "Nazovi %1$s" + "Izrada prečaca novog sučelja" + "Ulazak u način skupne radnje" + "Napuštanje načina skupne radnje" + "Odabrano: %1$s" + "Poništen odabir: %1$s" "Pojedinosti o kontaktu %1$s" "Podaci za kontakt mogućeg neželjenog pozivatelja %1$s" "Broj poziva: %1$s." "Videopoziv." - "Slanje SMS-a kontaktu %1$s" - "Nepreslušana govorna pošta" "Pokretanje glasovnog pretraživanja" - "Nazovite %s" "Govorna pošta" - "%s s" - "%s min %s s" - "poruka govorne pošte" - "poruke govorne pošte" - "Da" - "Ne" - "Želite li izbrisati odabranu poruku/e govorne pošte %1$s?" + "Otkaži način skupnih radnji" + "Izbriši" + "Odustani" + "Odabrano: %1$s" + + ""Želite li izbrisati ove poruke govorne pošte? "" + ""Želite li izbrisati ove poruke govorne pošte? "" + ""Želite li izbrisati ove poruke govorne pošte? "" + @string/call_log_header_today "%1$s u %2$s" "%1$02d.%2$02d" "%1$s%2$s" - "Nije moguće nazvati taj broj" - "Da biste postavili govornu poštu, idite na Izbornik > Postavke." - "Da biste nazvali govornu poštu, najprije isključite način rada u zrakoplovu." - "Učitavanje..." - "IMEI" - "MEID" - "Učitavanje sa SIM kartice..." - "Kontakti SIM kartice" - "Nije dostupna nijedna aplikacija za kontakte" "Glasovno pretraživanje nije dostupno" - "Telefoniranje nije moguće jer je aplikacija Telefon onemogućena." "Pretraži kontakte" "Dodaj broj ili potraži kontakt" "Vaša je povijest poziva prazna" "Uputite poziv" "Nemate propuštene pozive." "Nemate pristiglih poruka govorne pošte." - "Prikaži samo favorite" "Povijest poziva" "Sve" "Propušteni" - "Gov. pošta" "Brzo biranje" "Povijest poziva" "Kontakti" "Govorna pošta" - "Uklonjeno iz favorita" - "Poništi" "Nazovite %s" "Izrada novog kontakta" "Dodaj kontaktu" "Pošalji SMS" "Uputite videopoziv" "Blokiraj broj" - "Broj novih propuštenih poziva: %s" "Još nemate nikog na brzom biranju" "Dodaj omiljeni kontakt" - "Još nemate nijedan kontakt" - "Dodajte kontakt" - "Dodirnite sliku da biste vidjeli sve brojeve ili dodirnite i zadržite da biste promijenili redoslijed" "Ukloni" + "Odaberi sve" "Videopoziv" "Pošalji poruku" "Pojedinosti poziva" @@ -165,26 +120,14 @@ "Pozovi ^1" "Videopoziv ^1." "Slušanje govorne pošte kontakta ^1" - "Reproduciranje govorne pošte od: ^1" - "Pauziranje govorne pošte od: ^1" - "Brisanje govorne pošte od: ^1" - - %d nova govorna pošta - %d nove govorne pošte - %d novih govornih pošta - "Izrada kontakta za ^1" "Dodavanje kontakta ^1 postojećem kontaktu" "Pojedinosti o pozivu za kontakt ^1" - "Izbrisano iz povijesti poziva" "Danas" "Jučer" "Stariji" - "Popis poziva" "Uključivanje zvučnika." "Isključivanje zvučnika." - "Brža reprodukcija." - "Sporija reprodukcija." "Pokretanje ili pauziranje reprodukcije." "Opcije prikaza" "Zvukovi i vibracije" @@ -201,7 +144,6 @@ "Pozivi" "Blokiranje poziva" "Govorna pošta" - "Odabir SIM-a za postavke govorne pošte" "Blokiranje poziva privremeno isključeno" "Blokiranje poziva onemogućeno je jer ste kontaktirali hitne službe s ovog telefona u posljednjih 48 sati. Automatski će se ponovo omogućiti kada prođe 48 sati." "Uvoz brojeva" @@ -215,12 +157,8 @@ "Blokirani brojevi" "Broj %1$s već je blokiran." "Pozivanje računa" - "Uključi" - "Postavi dopuštenja" "Da biste omogućili brzo biranje, uključite dopuštenje za kontakte." "Da biste vidjeli zapisnik poziva, uključite dopuštenje za telefon." - "Da biste vidjeli svoje kontakte, uključite dopuštenje za kontakte." - "Da biste pristupili govornoj pošti, uključite dopuštenje za telefon." "Da biste pretraživali kontakte, uključite dopuštenja za kontakte." "Da biste nazvali nekog, uključite dopuštenje za telefon." "Aplikacija Telefon nema dopuštenje za pisanje u postavke sustava." @@ -232,4 +170,10 @@ "Neželjena pošta" "%1$s nije online i nije dostupan" "O aplikaciji" + "Prijepis: Google" + "Google provodi prijepis..." + "Prijepis nije dostupan" + "Prikaži" + "Poziv je izbrisan. U Porukama pregledajte i izbrišite privitke podijeljene tijekom ovog poziva." + "Pozivi su izbrisani. U Porukama pregledajte i izbrišite privitke podijeljene tijekom poziva." diff --git a/java/com/android/dialer/app/res/values-hu/strings.xml b/java/com/android/dialer/app/res/values-hu/strings.xml index 2e64d745d..6171d57e3 100644 --- a/java/com/android/dialer/app/res/values-hu/strings.xml +++ b/java/com/android/dialer/app/res/values-hu/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefonbillenyűzet" - "Telefon" "Híváslista" - "Pontatlan szám jelentése" "Szám másolása" "Átírás másolása" - "Szám tiltása" - "Szám tiltásának feloldása" "Szám szerkesztése hívás előtt" "A híváslista törlése" "Hangposta törlése" @@ -34,7 +30,6 @@ "Törli a híváslistát?" "Ezzel törli az összes hívást az előzmények közül" "Híváslista törlése…" - "Telefonhívás" "Nem fogadott hívás" "Nem fogadott munkahelyi hívás" "Elmulasztott hívások" @@ -48,107 +43,66 @@ %1$d hangpostaüzenet Hangpostaüzenet - "Lejátszás" "%1$s, %2$s" "Új hangüzenet tőle: %1$s" "Nem sikerült lejátszani a hangpostát" "Hangposta betöltése…" - "Hangpostaüzenet archiválása…" "Nem sikerült betölteni a hangpostát" - "Csak hangpostahívások" - "Csak bejövő hívások" - "Csak kimenő hívások" - "Csak nem fogadott hívások" "(%1$d) %2$s" - "keresés" - "tárcsázás" - "a tárcsázandó szám" - "Lejátszás indítása vagy leállítása" "Kihangosító be- vagy kikapcsolása" "Lejátszási pozíció módosítása" - "Lejátszás sebességének csökkentése" - "Lejátszás sebességének növelése" "Híváslista" "További beállítások" "billentyűzet" - "Csak a kimenők megjelenítése" - "Csak a bejövők megjelenítése" - "Csak a nem fogadottak" - "Csak a hangüzenetek" - "Összes hívás megjelenítése" - "2 mp-es szünet hozzáadása" - "Várakozás hozzáadása" "Beállítások" "Szimulátor" - "Összes névjegy" - "Hangkódos telefonbillentyűzet használata" - "Vissza a folyamatban lévő híváshoz" - "Hívás hozzáadása" - "Bejövő hívások" - "Hangposta lejátszása" - "%1$s névjegyének megtekintése" - "%1$s hívása" + "Új felh. felület-parancsikon" + "Belépés tömeges műveleti módba" + "Kilépett a tömeges műveleti módból" + "Kijelölés: %1$s" + "Kijelölés megszüntetve: %1$s" "%1$s részletes adatai." "%1$s (feltételezett spamhívó) részletes adatai" "%1$s hívás" "Videohívás." - "SMS küldése %1$s részére" - "Nem lejátszott hangüzenet" "Hangalapú keresés indítása" - "Hívás: %s" "Hangposta" - "%s másodperc" - "%s perc %s másodperc" - "hangpostaüzenetet" - "hangpostaüzeneteket" - "Igen" - "Nem" - "Törli a kiválasztott %1$s?" + "Köteges művelet mód leállítva" + "Törlés" + "Mégse" + "%1$s kiválasztva" + + ""Törli ezeket a hangpostaüzeneteket? "" + ""Törli ezt a hangpostaüzenetet? "" + @string/call_log_header_today "%1$s, %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Nem lehet felhívni ezt a számot" - "A hangposta beállításához válassza a Menü > Beállítások lehetőséget." - "Hangposta hívásához kapcsolja ki a Repülőgép üzemmódot." - "Betöltés..." - "IMEI" - "MEID" - "Betöltés a SIM kártyáról..." - "Névjegyek a SIM kártyán" - "Nincs elérhető névjegyek alkalmazás" "A hangalapú keresés nem érhető el" - "Nem lehet telefonhívást kezdeményezni, mert a Telefon alkalmazást letiltották." "Keresés a névjegyek között" "Adjon meg egy számot, vagy keressen a névjegyek között" "A híváslista üres" "Hívásindítás" "Nincsenek nem fogadott hívások." "Hangpostafiókjában nincsenek beérkezett üzenetek." - "Csak kedvencek megjelenítése" "Hívási előzmények" "Összes" "Nem fogadott" - "Hangposta" "Gyorshívó" "Híváslista" "Címtár" "Hangposta" - "Eltávolítva a kedvencek közül" - "Visszavonás" "Hívás: %s" "Új névjegy létrehozása" "Hozzáadás névjegyhez" "SMS küldése" "Videohívás kezdeményezése" "Szám tiltása" - "%s új nem fogadott hívás" "Még semelyik telefonszám sincs gyorshívón" "Kedvenc hozzáadása" - "Még nem rendelkezik egyetlen névjeggyel sem" - "Névjegy hozzáadása" - "Koppintson a képre az összes szám megjelenítéséhez, vagy tartsa nyomva az átrendezéshez" "Eltávolítás" + "Az összes kijelölése" "Videohívás" "Üzenet küldése" "Hívás adatai" @@ -164,25 +118,14 @@ "^1 hívása" "A következő hívása videokapcsolattal: ^1." "^1 hangpostaüzenetének meghallgatása" - "Hangposta lejátszása a következőnél: ^1" - "Hangposta szüneteltetése a következőnél: ^1" - "Hangposta törlése a következőnél: ^1" - - %d új hangpostaüzenet - %d új hangpostaüzenet - "Névjegy létrehozása a következőhöz: ^1" "A(z) ^1 hozzáadása meglévő névjegyhez" "^1 – hívásrészletek" - "Törölve a híváslistáról" "Ma" "Tegnap" "Korábbi" - "Híváslista" "Hangszóró bekapcsolása." "Hangszóró kikapcsolása." - "Gyorsabb lejátszás." - "Lassabb lejátszás." "Lejátszás indítása vagy szüneteltetése." "Megjelenítési beállítások" "Hangok és rezgés" @@ -199,7 +142,6 @@ "Hívások" "Hívásletiltás" "Hangposta" - "Válassza ki a SIM-kártyát" "Hívástiltás átmenetileg felfüggesztve" "Felfüggesztettük a hívások tiltását, mert az elmúlt 48 órában tárcsázta a segélyhívót erről a telefonról. A funkciót automatikusan újból engedélyezzük 48 óra elteltével." "Számok importálása" @@ -213,12 +155,8 @@ "Letiltott számok" "A következő szám már le van tiltva: %1$s." "Telefonos fiókok" - "Engedélyezés" - "Engedélyek beállítása" "Gyorshívás engedélyezéséhez kapcsolja be a Névjegyek engedélyt." "A hívásnapló megtekintéséhez kapcsolja be a Telefon engedélyt." - "A névjegyek megtekintéséhez kapcsolja be a Névjegyek engedélyt." - "A hangposta eléréséhez kapcsolja be a Telefon engedélyt." "A névjegyek kereséséhez adja meg a Névjegyek engedélyeket." "Hívásindításhoz kapcsolja be a Telefon engedélyt." "A Telefon alkalmazásnak nincs engedélye szerkeszteni a rendszerbeállításokat." @@ -230,4 +168,10 @@ "Spam" "%1$s offline, és nem érhető el." "Névjegy" + "Az átirat készítője a Google" + "A Google átiratot készít…" + "Nincs elérhető átirat" + "Megtekintés" + "Hívás törölve. A hívás során megosztott mellékleteket az Üzenetek alkalmazásban tekintheti meg és törölheti." + "Hívások törölve. A hívások során megosztott mellékleteket az Üzenetek alkalmazásban tekintheti meg és törölheti." diff --git a/java/com/android/dialer/app/res/values-hy/strings.xml b/java/com/android/dialer/app/res/values-hy/strings.xml index 6f3931c9f..73e350182 100644 --- a/java/com/android/dialer/app/res/values-hy/strings.xml +++ b/java/com/android/dialer/app/res/values-hy/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Հեռախոս" "Հեռախոսի ստեղնաշար" - "Հեռախոս" "Զանգերի պատմություն" - "Հաղորդել սխալ համարի մասին" "Պատճենել համարը" "Պատճենել տառադարձությունը" - "Արգելափակել համարը" - "Արգելաբացել համարը" "Փոփոխել համարը զանգելուց առաջ" "Մաքրել զանգերի պատմությունը" "Ջնջել ձայնային փոստը" @@ -34,7 +30,6 @@ "Մաքրե՞լ զանգերի պատմությունը:" "Այս գործողությունը ամբողջովին կջնջի զանգերի պատմությունը" "Զանգերի պատմության մաքրում…" - "Հեռախոս" "Բաց թողնված զանգ" "Բաց թողնված աշխատանքային զանգ" "Բաց թողնված զանգեր" @@ -48,107 +43,66 @@ %1$d ձայնային փոստ %1$d ձայնային փոստ - "Նվագարկել" "%1$s, %2$s" "Նոր ձայնային փոստ %1$s-ից" "Հաղորդագրությունը չհաջողվեց նվագարկել" "Ձայնային հաղորդագրության բեռնում…" - "Ձայնային փոստի արխիվացում…" "Հաղորդագրությունը չհաջողվեց բեռնել" - "Միայն ձայնային փոստով զանգերը" - "Միայն մուտքային զանգեր" - "Միայն ելքային զանգերը" - "Միայն բաց թողնված զանգերը" "(%1$d) %2$s" - "որոնել" - "համարհավաքել" - "համարհավաքման հեռախոսահամարը" - "Միացնել կամ անջատել նվագարկումը" "Միացնել կամ անջատել բարձրախոսը" "Փնտրել նվագարկման դիրքը" - "Իջեցնել նվագարկման վարկանիշը" - "Բարձրացնել նվագարկման վարկանիշը" "Զանգերի պատմություն" "Այլ ընտրանքներ" "ստեղնաշար" - "Ցույց տալ միայն ելքայինները" - "Ցույց տալ միայն մուտքայինները" - "Ցույց տալ միայն բաց թողնվածները" - "Ցուցադրել միայն ձայնային փոստերը" - "Ցուցադրել բոլոր զանգերը" - "Ավելացնել 2 վայրկյան դադար" - "Ավելացնել սպասում" "Կարգավորումներ" "Նմանակիչ" - "Բոլոր կոնտակտները" - "Օգտագործել հնչերանգներով ստեղնաշարը" - "Վերադառնալ ընթացիկ զանգին" - "Ավելացնել զանգ" - "Մուտքային զանգեր" - "Նվագարկել ձայնային փոստը" - "Դիտել %1$s կոնտակտը" - "Զանգել %1$s-ին" + "Ստեղծել միջերեսի նոր դյուրանցում" + "Դուք մտել եք զանգվածային գործողության ռեժիմ" + "Դուք դուրս եկաք զանգվածային գործողությունների ռեժիմից" + "Ընտրվեց՝ %1$s" + "Ապընտրվեց՝ %1$s" "%1$s-ի կոնտակտային տվյալները" "%1$s-ի կոնտակտային տվյալներ (լցոնի կասկած)" "%1$s զանգ:" "Տեսազանգ" - "Ուղարկել SMS %1$s-ին" - "Չլսված ձայնային փոստ" "Սկսկեք ձայնային որոնումը" - "Զանգել %s-ին" "Ձայնային փոստ" - "%s վրկ" - "%s րոպե %s վայրկյան" - "ձայնային հաղորդագրություն" - "ձայնային հաղորդագրություններ" - "Այո" - "Ոչ" - "Ջնջե՞լ նշված %1$sը" + "Չեղարկել փաթեթային գործողությունների ռեժիմը" + "Ջնջել" + "Չեղարկել" + "Ընտրվել է՝ %1$s" + + ""Delete these voicemails? "" + ""Ջնջե՞լ այս ձայնային հաղորդագրությունները "" + @string/call_log_header_today "%1$s-ին, ժամը %2$s-ին" "%1$02d:%2$02d" "%1$s%2$s" - "Հնարավոր չէ զանգահարել այս համարով" - "Ձայնային փոստը կարգավորելու համար անցեք Ընտրացնակ > Կարգավորումներ:" - "Ձայնային փոստին զանգելու համար նախ անջատեք Ինքնաթիռի ռեժիմը:" - "Բեռնում..." - "IMEI" - "MEID" - "SIM քարտը բեռնվում է..." - "SIM քարտի կոնտակտները" - "Կոնտակտների հավելված չկա" "Ձայնային որոնումը հասանելի չէ" - "Հնարավոր չէ զանգահարել, քանի որ Հեռախոս հավելվածն անջատված է:" "Կոնտակտների որոնում" "Ավելացրեք համար/որոնեք կոնտակտներ" "Զանգերի մատյանը դատարկ է" "Զանգել" "Բաց թողնված զանգեր չունեք:" "Ձայնային փոստի մուտքի արկղը դատարկ է:" - "Ցույց տալ միայն ընտրյալները" "Զանգերի պատմությունը" "Բոլորը" "Բաց թողնված" - "Ձայնափոստ" "Արագ համարարկում" "Զանգերի պատմությունը" "Կոնտակտներ" "Ձայնային փոստ" - "Հեռացված է ընտրյալներից" - "Հետարկել" "Զանգել %s-ին" "Ստեղծել նոր կոնտակտ" "Ավելացնել կոնտակտին" "Ուղարկել SMS" "Տեսազանգ սկսել" "Արգելափակել համարը" - "%s նոր բաց թողնված զանգ" "Արագ համարահավաքման ցանկը դատարկ է" "Ավելացնել կոնտակտ" - "Դեռ կոնտակտներ չունեք" - "Ավելացնել կոնտակտ" - "Բոլոր համարները տեսնելու համար հպեք պատկերին: Վերադասավորելու համար հպեք և պահեք:" "Հեռացնել" + "Ընտրել բոլորը" "Տեսազանգ" "Ուղարկել հաղորդագրություն" "Զանգի մանրամասները" @@ -164,25 +118,14 @@ "Զանգել ^1-ին" "Տեսազանգ ^1 կոնտակտին:" "Լսել ձայնային փոստը ^1-ից" - "Նվագարկել ^1-ի ձայնային փոստի հաղորդագրությունները" - "Դադարեցնել ^1-ից ձայնային փոստի հաղորդագրությունների ստացումը" - "Ջնջել ^1-ի ձայնային փոստի հաղորդագրությունները" - - %d նոր ձայնային փոստ - %d նոր ձայնային փոստ - "Ստեղծել ^1 կոնտակտը" "Ավելացնել ^1-ը առկա կոնտակտին" "^1 զանգի մասին տվյալներ" - "Ջնջվել է զանգերի պատմությունից" "Այսօր" "Երեկ" "Ավելի հին" - "Զանգերի ցանկ" "Միացնել խոսափողը:" "Անջատել բարձրախոսը:" - "Նվագարկել ավելի արագ:" - "Նվագարկել ավելի դանդաղ:" "Սկսել կամ դադարեցնել նվագարկումը:" "Ցուցադրման ընտրանքներ" "Ձայներ և թրթռոց" @@ -199,7 +142,6 @@ "Զանգեր" "Զանգերի արգելափակում" "Ձայնային փոստ" - "Ընտրեք SIM քարտը՝ ձայնային փոստը կարգավորելու համար" "Զանգերի արգելափակումը կասեցվել է" "Զանգերի արգելափակումը կասեցվել է, քանի որ վերջին 48 ժամվա ընթացքում դուք այս հեռախոսից զանգել եք արտակարգ իրավիճակների ծառայություններին: 48 ժամ տևողությամբ ժամանակահատվածի ավարտից հետո այն ավտոմատ կերպով կվերամիացվի:" "Ներմուծել համարները" @@ -213,12 +155,8 @@ "Արգելափակված համարներ" "%1$s համարն արդեն արգելափակված է:" "Հաշիվներ զանգերի համար" - "Միացնել" - "Թույլտվությունների սահմանում" "Արագ համարահավաքը թույլատրելու համար միացրեք Կոնտակտների թույլտվությունը:" "Ձեր զանգերի մատյանը տեսնելու համար միացրեք Հեռախոսի թույլտվությունը:" - "Ձեր կոնտակտները տեսնելու համար միացրեք Կոնտակտների թույլտվությունը:" - "Ձայնային փոստն օգտագործելու համար միացրեք Հեռախոսի թույլտվությունը:" "Կոնտակտները որոնելու համար միացրեք Կոնտակտների թույլտվությունները:" "Զանգ կատարելու համար միացրեք Հեռախոսի թույլտվությունը:" "Հեռախոս հավելվածը համակարգի կարգավորումները գրելու թույլտվություն չունի:" @@ -230,4 +168,10 @@ "Լցոն" "%1$s օգտատերը միացած չէ ցանցին և անհասանելի է" "Հավելվածի մասին" + "Տառադրումն ըստ Google-ի" + "Տառադրում…" + "Տառադրումն անհասանելի է" + "Դիտել" + "Զանգը ջնջվեց: Դիտեք և ջնջեք զանգի ընթացքում ստացված կցորդները Messages հավելվածում:" + "Զանգերը ջնջվեցին: Դիտեք և ջնջեք զանգերի ընթացքում ստացված կցորդները Messages հավելվածում:" diff --git a/java/com/android/dialer/app/res/values-in/strings.xml b/java/com/android/dialer/app/res/values-in/strings.xml index c0de9b3b4..0db472cd6 100644 --- a/java/com/android/dialer/app/res/values-in/strings.xml +++ b/java/com/android/dialer/app/res/values-in/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telepon" "Keypad Ponsel" - "Telepon" "Riwayat panggilan" - "Laporkan nomor yang tidak akurat" "Salin nomor" "Salin transkripsi" - "Blokir nomor" - "Bebaskan nomor" "Edit nomor sebelum memanggil" "Hapus riwayat panggilan" "Hapus pesan suara" @@ -34,7 +30,6 @@ "Hapus riwayat panggilan?" "Tindakan ini akan menghapus semua panggilan telepon dari riwayat" "Menghapus riwayat panggilan..." - "Telepon" "Panggilan tak terjawab" "Panggilan tak terjawab di telepon kerja" "Panggilan tak terjawab" @@ -48,107 +43,66 @@ %1$d Pesan suara Pesan suara - "Putar" "%1$s, %2$s" "Pesan suara baru dari %1$s" "Tidak dapat memutar pesan suara" "Memuat pesan suara..." - "Mengarsipkan pesan suara…" "Tidak dapat memuat pesan suara" - "Hanya panggilan dengan pesan suara" - "Hanya panggilan masuk" - "Hanya panggilan keluar" - "Hanya panggilan tak terjawab" "(%1$d) %2$s" - "telusuri" - "panggil" - "nomor untuk dipanggil" - "Memutar atau menghentikan pemutaran" "Mengaktifkan/menonaktifkan pengeras suara ponsel" "Mencari posisi pemutaran" - "Menurunkan laju pemutaran" - "Meningkatkan laju pemutaran" "Riwayat panggilan" "Opsi lainnya" "keypad" - "Tampilkan panggilan keluar" - "Tampilkan panggilan masuk saja" - "Tampilkan panggilan terlewat" - "Tampilkan pesan suara saja" - "Tampilkan semua panggilan" - "Tambahkan jeda 2 dtk" - "Tambahkan tunggu" "Setelan" "Simulator" - "Semua kontak" - "Gunakan keypad nada sentuh" - "Kembali ke panggilan sedang berlangsung" - "Tambahkan panggilan" - "Panggilan masuk" - "Putar pesan suara" - "Lihat kontak %1$s" - "Telepon %1$s" + "Buat Pintasan UI Baru" + "Masuk ke mode tindakan massal" + "Keluar dari mode tindakan massal" + "%1$s dipilih" + "%1$s tidak dipilih" "Detail kontak untuk %1$s" "Detail kontak untuk penelepon spam yang dicurigai %1$s" "%1$s panggilan." "Video call." - "Kirim SMS ke %1$s" - "Pesan suara yang belum didengar" "Memulai penelusuran suara" - "Telepon %s" "Kotak Pesan" - "%s dtk" - "%s mnt %s dtk" - "pesan suara" - "pesan suara" - "Ya" - "Tidak" - "Hapus %1$s yang dipilih?" + "Membatalkan mode tindakan kelompok" + "Hapus" + "Batal" + "%1$s dipilih" + + ""Hapus pesan suara ini? "" + ""Hapus pesan suara ini? "" + @string/call_log_header_today "%1$s pukul %2$s" "%1$02d.%2$02d" "%1$s%2$s" - "Tidak dapat menelepon nomor ini" - "Untuk menyiapkan pesan suara, buka Menu > Setelan." - "Untuk memanggil pesan suara, pertama-tama matikan mode Pesawat." - "Memuat..." - "IMEI" - "MEID" - "Memuat dari kartu SIM..." - "Kontak pada kartu SIM" - "Aplikasi kontak tidak tersedia" "Penelusuran suara tidak tersedia" - "Tidak dapat melakukan panggilan telepon karena aplikasi Telepon telah dinonaktifkan." "Telusuri kontak" "Tambahkan nomor atau telusuri kontak" "Riwayat panggilan kosong" "Lakukan panggilan telepon" "Tidak ada panggilan yang tidak terjawab." "Kotak masuk pesan suara kosong." - "Hanya tampilkan favorit" "Riwayat Panggilan" "Semua" "Tak Dijawab" - "PesanSuara" "Panggilan cepat" "Riwayat Panggilan" "Kontak" "Pesan suara" - "Dihapus dari favorit" - "Batalkan" "Telepon %s" "Buat kontak baru" "Tambahkan ke kontak" "Kirim SMS" "Lakukan video call" "Blokir nomor" - "%s panggilan tidak terjawab baru" "Daftar panggilan cepat masih kosong" "Tambahkan favorit" - "Anda belum memiliki kontak" - "Tambahkan kontak" - "Sentuh foto untuk melihat semua nomor atau sentuh & tahan untuk menyusun ulang" "Hapus" + "Pilih semua" "Panggilan video" "Kirim pesan" "Detail panggilan" @@ -164,25 +118,14 @@ "Telepon ^1" "Lakukan panggilan video ke ^1." "Dengarkan kotak pesan dari ^1" - "Putar pesan suara dari ^1" - "Jeda pesan suara dari ^1" - "Hapus pesan suara dari ^1" - - %d pesan suara baru - %d pesan suara baru - "Buat kontak untuk ^1" "Tambahkan ^1 ke akun yang ada" "Detail panggilan telepon untuk ^1" - "Dihapus dari riwayat panggilan" "Hari ini" "Kemarin" "Lebih lama" - "Daftar panggilan telepon" "Aktifkan pengeras suara." "Nonaktifkan pengeras suara." - "Putar lebih cepat." - "Putar lebih lambat." "Mulai atau jeda pemutaran." "Opsi tampilan" "Suara dan getaran" @@ -199,7 +142,6 @@ "Panggilan telepon" "Pemblokiran panggilan telepon" "Pesan Suara" - "Memilih SIM untuk setelan pesan suara" "Blokir panggilan dinonaktifkan sementara" "Pemblokiran panggilan telepon telah dinonaktifkan karena Anda menghubungi layanan darurat dari telepon ini dalam 48 jam terakhir. Akan diaktifkan kembali secara otomatis setelah masa 48 jam berakhir." "Impor nomor" @@ -213,12 +155,8 @@ "Nomor yang diblokir" "%1$s sudah diblokir." "Akun panggilan" - "Aktifkan" - "Setel izin" "Untuk mengaktifkan panggilan cepat, aktifkan izin Kontak." "Untuk melihat log panggilan, aktifkan izin Telepon." - "Untuk melihat kontak, aktifkan izin Kontak." - "Untuk mengakses pesan suara, aktifkan izin Telepon." "Untuk menelusuri kontak, aktifkan izin Kontak." "Untuk melakukan panggilan, aktifkan izin Telepon." "Aplikasi telepon tidak memiliki izin untuk menulis ke setelan sistem." @@ -230,4 +168,10 @@ "Spam" "%1$s sedang offline dan tidak dapat dijangkau" "Tentang" + "Ditranskripsi oleh Google" + "Google sedang membuat transkripsi …" + "Transkrip tidak tersedia" + "Tampilkan" + "Panggilan dihapus. Lihat dan hapus lampiran yang dibagikan selama panggilan ini di Message." + "Panggilan dihapus. Lihat dan hapus lampiran yang dibagikan selama panggilan ini di Message." diff --git a/java/com/android/dialer/app/res/values-is/strings.xml b/java/com/android/dialer/app/res/values-is/strings.xml index fdd635668..a87605eb5 100644 --- a/java/com/android/dialer/app/res/values-is/strings.xml +++ b/java/com/android/dialer/app/res/values-is/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Sími" "Talnaborð á síma" - "Sími" "Símtalaferill" - "Tilkynna rangt númer" "Afrita númer" "Afrita umritun" - "Setja númer á bannlista" - "Taka númer af bannlista" "Breyta númeri áður en hringt er" "Hreinsa símtalaferil" "Eyða talhólfsskilaboðum" @@ -34,7 +30,6 @@ "Hreinsa símtalaferil?" "Þetta eyðir öllum símtölum af ferlinum" "Hreinsar símtalaferil…" - "Sími" "Ósvarað símtal" "Ósvarað vinnusímtal" "Ósvöruð símtöl" @@ -48,107 +43,66 @@ %1$d talhólfsskilaboð %1$d talhólfsskilaboð - "Spila" "%1$s, %2$s" "Ný talhólfsskilaboð frá %1$s" "Ekki tókst að spila talhólfsskilaboð" "Hleður talhólfsskilaboð…" - "Setur talhólfsskilaboð í geymslu..." "Ekki tókst að hlaða talhólfsskilaboð" - "Símtöl með talhólfi eingöngu" - "Móttekin símtöl eingöngu" - "Hringd símtöl eingöngu" - "Ósvöruð símtöl eingöngu" "(%1$d) %2$s" - "leita" - "hringja" - "númer til að hringja í" - "Hefja eða stöðva spilun" "Kveikja eða slökkva á hátalara" "Breyta spilunarstöðu" - "Draga úr spilunarhraða" - "Auka spilunarhraða" "Símtalaferill" "Fleiri valkostir" "talnaborð" - "Sýna hringd símtöl eingöngu" - "Sýnir móttekin símtöl eingöngu" - "Sýna ósvöruð símtöl eingöngu" - "Sýna talhólfsskilaboð eingöngu" - "Sýna öll símtöl" - "Bæta við 2 sekúndna töf" - "Bæta töf við" "Stillingar" "Hermir" - "Allir tengiliðir" - "Nota snertitónatakkaborð" - "Fara aftur í símtal í gangi" - "Bæta við símtali" - "Móttekin símtöl" - "Spila talhólfsskilaboð" - "Skoða tengiliðinn %1$s" - "Hringja í %1$s" + "Stofna flýtileið í nýtt viðmót" + "Opnar fjöldaaðgerðastillingu" + "Fjöldaaðgerðastillingu lokað" + "Valdi %1$s" + "Fjarlægði val á %1$s" "Tengiliðaupplýsingar um %1$s" "Tengiliðaupplýsingar fyrir mögulegt ruslnúmer %1$s" "%1$s símtöl." "Myndsímtal" - "Senda SMS til %1$s" - "Óspiluð talhólfsskilaboð" "Hefja raddleit" - "Hringja í %s" "Talhólf" - "%s sek." - "%s mín. og %s sek." - "talhólfsskilaboð" - "talhólfsskilaboð" - "Já" - "Nei" - "Eyða völdum %1$s?" + "Hætta við runuaðgerðastillingu" + "Eyða" + "Hætta við" + "%1$s valin" + + ""Eyða þessum talhólfsskilaboðum? "" + ""Eyða þessum talhólfsskilaboðum? "" + @string/call_log_header_today "%1$s kl. %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Ekki er hægt að hringja í þetta númer" - "Til að setja upp talhólf þarftu að opna valmyndina og velja Stillingar." - "Til að hringja í talhólfið þarftu fyrst að slökkva á flugstillingu." - "Hleður…" - "IMEI" - "MEID" - "Hleður af SIM-kortinu…" - "Tengiliðir á SIM-korti" - "Ekkert tengiliðaforrit í boði" "Raddleit er ekki í boði" - "Ekki er hægt að hringja vegna þess að forritið Sími hefur verið gert óvirkt." "Leita í tengiliðum" "Bættu við númeri eða tengilið" "Símtalaferillinn er auður" "Hringja" "Þú ert ekki með nein ósvöruð símtöl." "Talhólfið þitt er tómt." - "Sýna aðeins uppáhaldstengiliði" "Símtalaferill" "Allt" "Ósvöruð" - "Talhólf" "Hraðval" "Símtalaferill" "Tengiliðir" "Talhólf" - "Fjarlægður úr uppáhaldi" - "Afturkalla" "Hringja í %s" "Búa til nýjan tengilið" "Bæta við tengilið" "Senda SMS-skilaboð" "Hringja myndsímtal" "Setja númer á bannlista" - "%s ný ósvöruð símtöl" "Þú ert ekki með neinn í hraðvali enn sem komið er" "Bæta uppáhaldi við" - "Þú ert ekki með neina tengiliði enn sem komið er" - "Bæta tengilið við" - "Snertu myndina til að sjá öll númer eða haltu henni inni til að endurraða" "Fjarlægja" + "Velja allt" "Myndsímtal" "Senda skilaboð" "Símtalsupplýsingar" @@ -164,25 +118,14 @@ "Hringja í ^1" "Hringja myndsímtal í ^1." "Hlusta á talhólfsskilaboð frá ^1" - "Spila talhólfsskilaboð sem ^1 sendi" - "Gera hlé á talhólfsskilaboðum sem ^1 sendi" - "Eyða talhólfsskilaboðum sem ^1 sendi" - - %d ný talhólfsskilaboð - %d ný talhólfsskilaboð - "Búa til tengilið fyrir ^1" "Bæta ^1 við fyrirliggjandi tengilið" "Símtalsupplýsingar fyrir ^1" - "Eytt af símtalaferli" "Í dag" "Í gær" "Eldra" - "Símtalalisti" "Kveikja á hátalara." "Slökkva á hátalara." - "Spila hraðar." - "Spila hægar." "Hefja eða gera hlé á spilun." "Birtingarvalkostir" "Hljóð og titringur" @@ -199,7 +142,6 @@ "Símtöl" "Lokað fyrir símtöl" "Talhólf" - "Veldu SIM-kort fyrir talhólf" "Tímabundið slökkt á lokun fyrir símtöl" "Lokun fyrir símtöl hefur verið gerð óvirk vegna þess að þú hafðir samband við neyðarþjónustu úr þessum síma á undanförnum tveimur sólarhringum. Lokunin verður aftur virk að þessum tveimur sólarhringum liðnum." "Flytja inn númer" @@ -213,12 +155,8 @@ "Númer á bannlista" "%1$s er nú þegar á bannlista." "Símtalareikningar" - "Kveikja" - "Stilla heimildir" "Kveiktu á tengiliðaheimildinni til að gera hraðval virkt." "Kveiktu á heimild símaforritsins til að sjá símtalaskrána þína." - "Kveiktu á tengiliðaheimildinni til að sjá tengiliðina þína." - "Kveiktu á heimild símaforritsins til að fá aðgang að talhólfinu þínu." "Kveiktu á heimildunum fyrir tengiliði til að leita að tengiliðum." "Kveiktu á heimild símaforritsins til að hringja símtal." "Símaforritið hefur ekki heimild til að breyta kerfisstillingum." @@ -230,4 +168,10 @@ "Ruslnúmer" "%1$s er án nettengingar og ekki er hægt að ná í viðkomandi" "Um forritið" + "Umritað af Google" + "Google er að umrita …" + "Textauppskrift er ekki í boði" + "Skoða" + "Símtali eytt. Skoðaðu og eyddu viðhengjum sem var deilt í þessu símtali í Messages." + "Símtölum eytt. Skoðaðu og eyddu viðhengjum sem var deilt í þessum símtölum í Messages." diff --git a/java/com/android/dialer/app/res/values-it/strings.xml b/java/com/android/dialer/app/res/values-it/strings.xml index 9bd8cd359..9642751c7 100644 --- a/java/com/android/dialer/app/res/values-it/strings.xml +++ b/java/com/android/dialer/app/res/values-it/strings.xml @@ -19,14 +19,10 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefono" "Tastierino del telefono" - "Telefono" "Cronologia chiamate" - "Segnala numero sbagliato" "Copia numero" "Copia trascrizione" - "Blocca numero" - "Sblocca numero" - "Modifica numero prima di effettuare la chiamata" + "Modifica numero prima di chiamare" "Cancella cronologia chiamate" "Elimina messaggi della segreteria" "Mes vocali eliminati" @@ -34,7 +30,6 @@ "Cancellare la cronologia chiamate?" "Verranno eliminate tutte le chiamate dalla cronologia" "Cancellazione cronologia chiamate…" - "Telefono" "Chiamata persa" "Chiamata di lavoro persa" "Chiamate perse" @@ -48,107 +43,66 @@ %1$d messaggi in segreteria Messaggio in segreteria - "Riproduci" "%1$s, %2$s" "Nuovo messaggio vocale da %1$s" "Impossibile riprodurre i messaggi vocali" "Caricamento dei messaggi vocali…" - "Archiviazione messaggio vocale…" "Impossibile caricare i messaggi vocali" - "Solo chiamate con segreteria" - "Solo chiamate in arrivo" - "Solo chiamate in uscita" - "Solo chiamate perse" "(%1$d) %2$s" - "cerca" - "componi" - "numero da comporre" - "Avvia o interrompi riproduzione" "Attiva o disattiva vivavoce" "Cerca posizione di riproduzione" - "Diminuisci velocità di riproduzione" - "Aumenta velocità di riproduzione" "Cronologia chiamate" "Altre opzioni" "tastierino" - "Mostra solo in uscita" - "Mostra solo in arrivo" - "Mostra solo senza risposta" - "Mostra solo messaggi vocali" - "Mostra tutte le chiamate" - "Aggiungi pausa 2 sec" - "Aggiungi attesa" "Impostazioni" "Simulatore" - "Tutti i contatti" - "Usa tastierino per selezione a toni" - "Torna alla chiamata in corso" - "Aggiungi chiamata" - "Chiamate in arrivo" - "Riproduci messaggio vocale" - "Visualizza %1$s contatto" - "Chiama %1$s" + "Crea nuova scorciatoia UI" + "Attivazione della modalità di azione collettiva" + "Disttivazione della modalità di azione collettiva" + "%1$s selezionato" + "%1$s deselezionato" "Dettagli contatto %1$s" "Dettagli di contatto del sospetto spammer: %1$s" "%1$s chiamate." "Videochiamata." - "Invia SMS a %1$s" - "Messaggio vocale non ascoltato" "Avvia la ricerca vocale" - "Chiama %s" "Segreteria" - "%s secondi" - "%s min %s s" - "messaggio vocale" - "messaggi vocali" - "Sì" - "No" - "Eliminare i %1$s selezionati?" + "Annulla modalità di azione collettiva" + "Elimina" + "Annulla" + "%1$s selezionate" + + ""Eliminare questi messaggi vocali? "" + ""Eliminare questo messaggio vocale? "" + @string/call_log_header_today "%1$s alle ore %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Impossibile chiamare questo numero" - "Per configurare la segreteria, seleziona Menu > Impostazioni." - "Per chiamare la segreteria, disattiva la modalità aereo." - "Caricamento..." - "IMEI" - "MEID" - "Caricamento da SIM..." - "Contatti SIM" - "Nessuna app di contatti disponibile" "Ricerca vocale non disponibile" - "Impossibile effettuare una telefonata perché l\'applicazione Telefono è stata disattivata." "Cerca contatti" "Aggiungi numero/cerca contatti" "La cronologia delle chiamate è vuota" "Fai una chiamata" "Nessuna chiamata persa." "La casella della segreteria è vuota." - "Mostra solo i preferiti" "Cronologia chiamate" "Tutte" "Perse" - "Segreteria" "Composizione rapida" "Cronologia chiamate" "Contatti" "Segreteria" - "Rimosso dai preferiti" - "Annulla" "Chiama %s" "Crea nuovo contatto" "Aggiungi a un contatto" "Invia SMS" "Fai una videochiamata" "Blocca numero" - "%s nuove chiamate perse" "Nessun preferito disponibile nella Composizione rapida" "Aggiungi un preferito" - "Nessun contatto disponibile" - "Aggiungi un contatto" - "Tocca l\'immagine per visualizzare tutti i numeri oppure tieni premuto per cambiare l\'ordine" "Rimuovi" + "Seleziona tutto" "Videochiamata" "Invia un messaggio" "Dettagli chiamata" @@ -164,25 +118,14 @@ "Chiama ^1" "Videochiamata ^1." "Ascolta il messaggio vocale di: ^1" - "Riproduci i messaggi di ^1 in segreteria" - "Metti in pausa i messaggi di ^1 in segreteria" - "Elimina i messaggi di ^1 dalla segreteria" - - %d nuovi messaggi vocali - %d nuovo messaggio vocale - "Crea contatto per ^1" "Aggiungi ^1 al contatto esistente" "Dettagli chiamata per ^1" - "Eliminato dalla cronologia chiamate" "Oggi" "Ieri" "Meno recenti" - "Elenco chiamate" "Attiva altoparlante." "Disattiva altoparlante." - "Riproduci più velocemente." - "Riproduci più lentamente." "Avvia o metti in pausa la riproduzione." "Opzioni di visualizzazione" "Suoni e vibrazione" @@ -199,7 +142,6 @@ "Chiamate" "Blocco delle chiamate" "Messaggi vocali" - "Seleziona SIM per impostazioni messaggi vocali" "Blocco chiamate temporaneam. disattivato" "Il blocco chiamate è stato disattivato perché hai contattato servizi di emergenza da questo telefono nelle ultime 48 ore. Verrà riattivato automaticamente una volta trascorso il periodo di 48 ore." "Importa numeri" @@ -213,12 +155,8 @@ "Numeri bloccati" "%1$s è già bloccato." "Account di chiamata" - "Attiva" - "Imposta autorizzazioni" "Per attivare la composizione rapida, attiva l\'autorizzazione Contatti." "Per accedere al registro chiamate, attiva l\'autorizzazione sul telefono." - "Per accedere ai tuoi contatti, attiva l\'autorizzazione Contatti." - "Per accedere alla segreteria, attiva l\'autorizzazione sul telefono." "Per cercare nei tuoi contatti, attiva le autorizzazioni Contatti." "Per fare una chiamata, attiva l\'autorizzazione sul telefono." "L\'app Telefono non dispone dell\'autorizzazione per modificare le impostazioni di sistema." @@ -230,4 +168,10 @@ "Spam" "%1$s è offline e non può essere raggiunto" "Informazioni" + "Trascritto da Google" + "Google sta trascrivendo…" + "Trascrizione non disponibile" + "Visualizza" + "Chiamata eliminata. Visualizza ed elimina gli allegati condivisi durante questa chiamata in Messaggi." + "Chiamate eliminate. Visualizza ed elimina gli allegati condivisi durante queste chiamate in Messaggi." diff --git a/java/com/android/dialer/app/res/values-iw/strings.xml b/java/com/android/dialer/app/res/values-iw/strings.xml index bb115e2f8..6186289a3 100644 --- a/java/com/android/dialer/app/res/values-iw/strings.xml +++ b/java/com/android/dialer/app/res/values-iw/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "טלפון" "לוח החיוג של הטלפון" - "טלפון" "היסטוריית שיחות" - "דווח על מספר לא מדויק" "העתק מספר" "העתק תמלול" - "חסום מספר" - "בטל חסימת מספר" "ערוך את המספר לפני השיחה" "נקה את היסטוריית השיחות" "מחק דואר קולי" @@ -34,7 +30,6 @@ "האם לנקות את היסטוריית השיחות?" "פעולה זו תמחק את כל השיחות מההיסטוריה שלך" "מנקה היסטוריית שיחות…" - "טלפון" "שיחה שלא נענתה" "שיחה עסקית שלא נענתה" "שיחות שלא נענו" @@ -50,107 +45,68 @@ %1$d הודעות דואר קולי הודעת דואר קולי - "הפעל" "%1$s, %2$s" "דואר קולי חדש מאת %1$s" "לא ניתן היה להשמיע דואר קולי" "טוען דואר קולי…" - "מעביר את הדואר הקולי לארכיון..." "לא ניתן היה לטעון דואר קולי" - "שיחות עם דואר קולי בלבד" - "שיחות נכנסות בלבד" - "שיחות יוצאות בלבד" - "שיחות שלא נענו בלבד" "(%1$d) %2$s" - "חפש" - "חייג" - "מספר לחיוג" - "הפעל או הפסק הפעלה" "הפעל או כבה את רמקול הטלפון" "חפש מיקום בהפעלה" - "האט את מהירות ההפעלה" - "הגבר את מהירות ההפעלה" "היסטוריית שיחות" "אפשרויות נוספות" "לוח חיוג" - "הצג רק שיחות יוצאות" - "הצג רק שיחות נכנסות" - "הצג רק שיחות שלא נענו" - "הצג הודעות דואר קולי בלבד" - "הצג את כל השיחות" - "הוסף השהיה של 2 שניות" - "הוסף המתנה" "הגדרות" "סימולטור" - "כל אנשי הקשר" - "השתמש במקלדת עם חיוג צלילים" - "חזור לשיחה פעילה" - "הוסף שיחה" - "שיחות נכנסות" - "הפעל דואר קולי" - "הצג את איש הקשר %1$s" - "התקשר אל %1$s" + "יצירת קיצור דרך לממשק החדש" + "עברת למצב של ביצוע פעולות בכמות גדולה" + "עזבת את המצב של ביצוע פעולות בכמות גדולה" + "בחרת את %1$s" + "ביטלת את הבחירה של %1$s" "פרטי יצירת קשר עבור %1$s" "פרטי התקשרות לשיחה שחשודה כספאם %1$s" "%1$s שיחות." "שיחת וידאו." - "‏שלח SMS אל %1$s" - "דואר קולי שעדיין לא נשמע" "התחל חיפוש קולי" - "התקשר אל %s" "דואר קולי" - "%s שניות" - "%s דק\' %s שנ\'" - "ההודעה הקולית" - "ההודעות הקוליות" - "כן" - "לא" - "האם למחוק את %1$s שבחרת?" + "ביטול המצב של ביצוע פעולות בכמות גדולה" + "מחיקה" + "ביטול" + "%1$s נבחרו" + + ""האם למחוק את ההודעות הקוליות האלה? "" + ""האם למחוק את ההודעות הקוליות האלה? "" + ""האם למחוק את ההודעות הקוליות האלה? "" + ""האם למחוק את ההודעה הקולית הזו? "" + @string/call_log_header_today "%1$s ב-%2$s" "%1$02d:%2$02d" "%1$s%2$s" - "לא ניתן להתקשר אל המספר הזה" - "כדי להגדיר את הדואר הקולי, עבור אל \'תפריט > הגדרות\'." - "כדי להתקשר לדואר קולי, קודם עליך להשבית את מצב הטיסה." - "טוען..." - "IMEI" - "MEID" - "‏טוען מכרטיס SIM…" - "‏אנשי קשר בכרטיס SIM" - "אין אפליקציה זמינה עבור אנשי קשר" "חיפוש קולי אינו זמין" - "לא ניתן לבצע שיחת טלפון מפני שאפליקציית הטלפון הושבתה." "חפש אנשי קשר" "הוסף מספר או חפש אנשי קשר" "היסטוריית השיחות שלך ריקה" "התקשר" "אין שיחות שלא נענו." "תיבת הדואר הקולי ריקה." - "הצג מועדפים בלבד" "היסטוריית שיחות" "הכל" "שיחות שלא נענו" - "דואר קולי" "חיוג מהיר" "היסטוריית שיחות" "אנשי קשר" "דואר קולי" - "הוסר מהמועדפים" - "בטל" "התקשר אל %s" "איש קשר חדש" "הוסף לאיש קשר" "‏שלח SMS" "בצע שיחת וידאו" "חסום מספר" - "%s שיחות חדשות שלא נענו" "עדיין לא הוגדר חיוג מהיר לאף איש קשר" "הוסף פריט מועדף" - "עדיין אין לך אנשי קשר" - "הוסף איש קשר" - "גע בתמונה כדי להציג את כל המספרים או גע והחזק כדי לשנות את הסדר" "הסר" + "בחירת הכל" "שיחת וידאו" "שלח הודעה" "פרטי שיחה" @@ -166,27 +122,14 @@ "התקשר אל ^1" "שיחת וידאו עם ^1." "האזן לדואר קולי מאת ^1" - "השמע דואר קולי מאת ^1" - "השהה דואר קולי מאת ^1" - "מחק דואר קולי מאת ^1" - - %d הודעות דואר קולי חדשות - %d הודעות דואר קולי חדשות - %d הודעות דואר קולי חדשות - הודעת דואר קולי חדשה %d - "צור איש קשר בשביל ^1" "הוסף את ^1 לאיש קשר קיים" "פרטי שיחה עבור ^1" - "נמחקה מהיסטוריית השיחות" "היום" "אתמול" "ישנות יותר" - "רשימת שיחות" "הפעל את הרמקול." "כבה את הרמקול." - "הפעל מהר יותר." - "הפעל לאט יותר." "התחל או השהה הפעלה." "אפשרויות תצוגה" "צלילים ורטט" @@ -203,7 +146,6 @@ "שיחות" "חסימת שיחות" "דואר קולי" - "‏בחר כרטיס SIM להגדרות הדואר הקולי" "חסימת השיחות מושבתת באופן זמני" "חסימת השיחות הושבתה מפני שיצרת קשר מטלפון זה עם שירותי חירום במהלך 48 השעות האחרונות. הפונקציה תופעל מחדש באופן אוטומטי בתום 48 השעות." "יבא מספרים" @@ -217,12 +159,8 @@ "מספרים חסומים" "%1$s כבר חסום." "חשבונות לביצוע שיחות" - "הפעל" - "הגדר הרשאות" "כדי להפעיל חיוג מהיר, הפעל את ההרשאה \'אנשי קשר\'." "כדי לראות את יומן השיחות, הפעל את ההרשאה \'טלפון\'." - "כדי להציג את אנשי הקשר, הפעל את ההרשאה \'אנשי קשר\'." - "כדי לגשת לדואר הקולי, הפעל את ההרשאה \'טלפון\'." "כדי לחפש באנשי הקשר, הפעל את ההרשאה \'אנשי קשר\'." "כדי להתקשר, הפעל את ההרשאה \'טלפון\'." "לאפליקציית הטלפון אין הרשאה לכתוב בהגדרות המערכת." @@ -234,4 +172,10 @@ "ספאם" "לא ניתן להתקשר כי המכשיר של %1$s לא מחובר כרגע" "מידע כללי" + "‏התעתוק בוצע על ידי Google" + "‏ההודעה מתומללת על ידי Google…" + "התעתיק אינו זמין" + "הצג" + "השיחה נמחקה. כדי להציג ולמחוק קבצים מצורפים ששותפו בזמן השיחה, עבור ל\'הודעות\'." + "השיחות נמחקו. כדי להציג ולמחוק קבצים מצורפים ששותפו בזמן השיחות, עבור ל\'הודעות\'." diff --git a/java/com/android/dialer/app/res/values-ja/strings.xml b/java/com/android/dialer/app/res/values-ja/strings.xml index 63b15cbed..5f92a8e1f 100644 --- a/java/com/android/dialer/app/res/values-ja/strings.xml +++ b/java/com/android/dialer/app/res/values-ja/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "電話" "スマートフォンのキーパッド" - "電話" "通話履歴" - "不正確な番号を報告" "番号をコピー" "音声文字変換をコピー" - "番号をブロック" - "番号のブロックを解除" "発信前に番号を編集" "通話履歴を消去" "ボイスメールを削除" @@ -34,7 +30,6 @@ "通話履歴を消去しますか?" "消去すると、すべての通話が履歴から削除されます" "通話履歴の消去中…" - "電話" "不在着信" "仕事の通話の不在着信" "不在着信" @@ -48,107 +43,66 @@ %1$d件のボイスメール 1件のボイスメール - "再生" "%1$s%2$s" "%1$sから新着ボイスメール" "ボイスメールを再生できませんでした" "ボイスメールを読み込んでいます…" - "ボイスメールをアーカイブしています…" "ボイスメールを読み込めませんでした" - "ボイスメールのある着信のみ" - "着信のみ" - "発信のみ" - "不在着信のみ" "(%1$d%2$s" - "検索" - "発信" - "発信番号" - "再生を開始または停止する" "スピーカーフォンのON/OFFを切り替える" "再生位置を探す" - "再生速度を下げる" - "再生速度を上げる" "通話履歴" "その他のオプション" "キーパッド" - "発信のみを表示" - "着信のみを表示" - "不在着信のみを表示" - "ボイスメールのみ表示" - "すべての通話を表示" - "2秒間の停止を追加" - "待機を追加" "設定" "シミュレーション" - "すべての連絡先" - "プッシュホン式キーパッドを使う" - "通話に戻る" - "別の通話を追加" - "着信" - "ボイスメールを再生" - "%1$sの連絡先を表示" - "%1$sに発信" + "新しいUIのショートカットを作成" + "一括操作モードを開始します" + "一括操作モードを終了しました" + "%1$s を選択しました" + "%1$s を選択解除しました" "%1$sの連絡先の詳細" "迷惑電話の疑いがある発信者 %1$s の連絡先の詳細" "通話回数は%1$s回。" "ビデオハングアウト" - "%1$sさんにSMSを送信" - "未再生のボイスメール" "音声検索を開始" - "%sに発信" "ボイスメール" - "%s秒" - "%s%s秒" - "ボイスメール" - "ボイスメール" - "はい" - "いいえ" - "選択した%1$sを削除しますか?" + "一括操作モードをキャンセルします" + "削除" + "キャンセル" + "%1$s 件選択済み" + + ""これらのボイスメールを削除しますか?"" + ""このボイスメールを削除しますか?"" + @string/call_log_header_today "%1$s%2$s" "%1$02d%2$02d 秒" "%1$s%2$s)" - "この番号に電話できません" - "ボイスメールを設定するには、[メニュー] > [設定] の順に開いてください。" - "機内モードを OFF にしてからボイスメールを呼び出してください。" - "読み込んでいます..." - "IMEI(端末識別番号)" - "MEID" - "SIMカードから読み取り中..." - "SIMカードの連絡先" - "連絡先アプリがありません" "音声検索を利用できません" - "電話アプリが無効になっているため発信できません。" "連絡先を検索" "番号を追加するか連絡先を検索" "通話履歴はありません" "発信" "不在着信はありません。" "ボイスメール受信トレイは空です。" - "お気に入りのみを表示" "通話履歴" "すべて" "不在着信" - "ボイスメール" "クイックアクセス" "通話履歴" "連絡先" "ボイスメール" - "お気に入りから削除されました" - "元に戻す" "%sに発信" "新しい連絡先を作成" "連絡先に追加" "SMSを送信" "ビデオハングアウト" "番号をブロック" - "%s件の不在着信" "クイックアクセスに登録済みの連絡先はまだありません" "お気に入りを追加" - "連絡先はまだありません" - "連絡先を追加" - "画像をタップするとすべての番号が表示され、押し続けると番号を並べ替えることができます" "削除" + "すべて選択" "ビデオハングアウト" "メッセージを送信" "通話の詳細" @@ -164,25 +118,14 @@ "^1に発信します" "^1にビデオハングアウト発信します。" "^1からのボイスメールを再生" - "^1からのボイスメールを再生" - "^1からのボイスメールを一時停止" - "^1からのボイスメールを削除" - - %d件の新着ボイスメール - %d件の新着ボイスメール - "^1の連絡先を作成します" "既存の連絡先に^1を追加します" "^1の通話の詳細" - "通話履歴から削除しました" "今日" "昨日" "以前の着信" - "通話リスト" "スピーカーをONにします。" "スピーカーをOFFにします。" - "速く再生します。" - "遅く再生します。" "再生を開始または一時停止します。" "表示オプション" "音とバイブレーション" @@ -199,7 +142,6 @@ "通話" "着信のブロック" "ボイスメール" - "ボイスメール設定の変更を行う SIM の選択" "着信のブロックは一時的にOFFです" "このスマートフォンから緊急通報番号への発信が過去48時間以内に行われているため、着信のブロックは無効になっています。48時間経過すると、着信のブロックは自動的に有効になります。" "番号をインポート" @@ -213,12 +155,8 @@ "ブロックした番号" "%1$sは既にブロックしています。" "通話アカウント" - "ONにする" - "権限を設定" "クイックアクセスを有効にするには、連絡先権限をONにしてください。" "通話履歴を表示するには、電話権限をONにしてください。" - "連絡先を表示するには、連絡先権限をONにしてください。" - "ボイスメールにアクセスするには、電話権限をONにしてください。" "連絡先を検索するには、連絡先権限をONにしてください。" "電話をかけるには、電話権限をONにしてください。" "電話アプリにはシステム設定への書き込み権限がありません。" @@ -230,4 +168,10 @@ "スパム" "%1$s さんはオフラインのため、通話を受信できません" "電話アプリについて" + "文字変換: Google" + "Google が文字に変換しています…" + "文字変換を利用できません" + "表示" + "通話を削除しました。通話中に共有した添付ファイルを、メッセージで確認して削除してください。" + "通話を削除しました。通話中に共有した添付ファイルを、メッセージで確認して削除してください。" diff --git a/java/com/android/dialer/app/res/values-ka/strings.xml b/java/com/android/dialer/app/res/values-ka/strings.xml index ae89505b5..597082b42 100644 --- a/java/com/android/dialer/app/res/values-ka/strings.xml +++ b/java/com/android/dialer/app/res/values-ka/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ტელეფონი" "ტელეფონის კლავიატურა" - "ტელეფონი" "საუბრის ისტორია" - "არაზუსტი ნომრის შეტყობინება" "ნომრის კოპირება" "ტრანსკრიპტის კოპირება" - "ნომრის დაბლოკვა" - "ნომრის განბლოკვა" "ნომრის რედაქტირება დარეკვამდე" "ზარის ისტორიის გასუფთავება" "ხმოვანი ფოსტის წაშლა" @@ -34,7 +30,6 @@ "გასუფთავდეს ზარის ისტორია?" "ეს წაშლის ყველა ზარს თქვენი ისტორიიდან" "მიმდ. ზარ. ისტ. გასუფთავება…" - "დარეკვა" "გამოტოვებული ზარი" "გამოტოვებული ზარი (სამსახური)" "გამოტოვებული ზარები" @@ -48,107 +43,66 @@ %1$d ხმოვანი ფოსტა ხმოვანი ფოსტა - "დაკვრა" "%1$s, %2$s" "ახალი ხმოვანი ფოსტა %1$s-ისგან" "ვერ ხორციელდება ხმოვანი ფოსტა ჩართვა" "ხმოვანი ფოსტა იტვირთება…" - "ხმოვანი ფოსტის დაარქივება…" "ვერ ხორციელდება ხმოვანი ფოსტის ჩატვირთვა" - "მხოლოდ ზარები ხმოვანი ფოსტით" - "მხოლოდ შემომავალი ზარები" - "მხოლოდ გამავალი ზარები" - "მხოლოდ გამოტოვებული ზარები" "(%1$d) %2$s-ში" - "ძიება" - "დარეკვა" - "ასაკრეფი ნომერი" - "დაკვრის შეჩერება ან გაშვება" "სპიკერები შეგიძლიათ ჩართოთ და გამორთოთ." "დაკვრის პოზიციის მოძებნა" - "დაკვრის კოეფიციენტის შემცირება" - "დაკვრის კოეფიციენტის გაზრდა" "ზარების ისტორია" "სხვა პარამეტრები" "კლავიატურა" - "მხოლოდ გამავალის ჩვენება" - "მხოლოდ შემომავალის ჩვენება" - "მხოლოდ გამოტოვებულის ჩვენება" - "მხოლოდ ხმოვანი ფოსტის ჩვენება" - "ყველა ზარის ჩვენება" - "ორწამიანი პაუზის დამატება" - "ლოდინის დამატება" "პარამეტრები" "სიმულატორი" - "ყველა კონტაქტი" - "ტონალური კლავიატურის გამოყენება" - "მიმდინარე ზარზე დაბრუნება" - "ზარის დამატება" - "შემომავალი ზარები" - "ხმოვანი ფოსტის ჩართვა" - "კონტაქტის %1$s ნახვა" - "%1$s-თან დარეკვა" + "ახალი UI მალსახმობის შექმნა" + "მიმდინარეობს ერთიანი ქმედების რეჟიმში შესვლა" + "ერთიანი ქმედების რეჟიმიდან გამოხვედით" + "არჩეულია %1$s" + "%1$s-ის არჩევა გაუქმდა" "%1$s-ის კონტაქტის დეტალები" "სავარაუდოდ სპამერი აბონენტის %1$s საკონტაქტო დეტალები" "%1$s ზარი." "ვიდეოზარი." - "გააგზავნეთ SMS %1$s" - "მოსასმენი ხმოვანი ფოსტა" "ხმოვანი ძიების დაწყება" - "დარეკვა %s-ზე" "ხმოვანი ფოსტა" - "%s წმ" - "%s მინ %s წამ" - "ხმოვანი ფოსტა" - "ხმოვანი ფოსტა" - "დიახ" - "არა" - "გსურთ, წაშალოთ არჩეული %1$s?" + "ერთიანი ქმედების რეჟიმის გაუქმება" + "წაშლა" + "გაუქმება" + "არჩეულია %1$s" + + ""გსურთ ამ ხმოვანი შეტყობინებების წაშლა? "" + ""გსურთ ამ ხმოვანი შეტყობინების წაშლა? "" + @string/call_log_header_today "%1$s, %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "ვერ ხორციელდება ამ ნომერზე დარეკვა" - "ხმოვანი ფოსტის დასაყენებლად გადადით: მენიუ > პარამეტრები." - "ხმოვან ფოსტასთან დასაკავშირებლად, პირველ რიგში, გამორთეთ თვითმფრინავის რეჟიმი." - "იტვირთება…" - "IMEI" - "MEID" - "იტვირთება SIM ბარათიდან…" - "SIM ბარათის კონტაქტები" - "კონტაქტების აპლიკაცია არ არის ხელმისაწვდომი" "ხმოვანი ძიება არ არის ხელმისაწვდომი" - "სატელეფონო ზარის განხორციელება ვერ ხერხდება, ვინაიდან ტელეფონის აპლიკაცია გაუქმებულია." "კონტაქტებში ძიება" "დაამატეთ ნომერი ან მოიძიეთ კონტაქტებიდან" "თქვენი საუბრის ისტორია ცარიელია" "დარეკვა" "გამოტოვებული ზარები არ გაქვთ." "თქვენი ხმოვანი ელფოსტის შემოსულები ცარიელია." - "მხოლოდ რჩეულების ჩვენება" "საუბრის ისტორია" "ყველა" "გამოტოვებული" - "ხმოვანი ფოსტა" "სწრაფი დარეკვა" "საუბრის ისტორია" "კონტაქტები" "ხმოვანი ფოსტა" - "წაიშალა რჩეულებიდან" - "დაბრუნება" "დარეკვა %s-ზე" "ახალი კონტაქტის შექმნა" "კონტაქტისადმი დამატება" "SMS-ის გაგზავნა" "ვიდეოზარის განხორციელება" "ნომრის დაბლოკვა" - "%s ახალი გაცდენილი ზარი" "სწრაფი აკრეფისთვის რჩეულები ჯერ არ გყავთ" "რჩეული კონტაქტის დამატება" - "კონტაქტები ჯერ არ გაქვთ" - "კონტაქტის დამატება" - "ყველა ნომრის სანახავად შეეხეთ სურათს ან შეეხეთ და დააყოვნეთ მიმდევრობის შესაცვლელად" "ამოშლა" + "ყველას არჩევა" "ვიდეო ზარი" "შეტყობინების გაგზავნა" "ზარის მონაცემები" @@ -164,25 +118,14 @@ "დარეკვა ^1" "ვიდეო ზარი ^1-თან." "^1-ის ხმოვანი ფოსტის მოსმენა" - "^1-გან ხმოვანი ფოსტის მოსმენა" - "^1-გან ხმოვანი ფოსტის დაპაუზება" - "^1-გან ხმოვანი ფოსტის წაშლა" - - %d ახალი ხმოვანი ფოსტა - %d ახალი ხმოვანი ფოსტა - "^1-ისთვის კონტაქტის შექმნა" "^1-ის დამატება არსებულ კონტაქტზე" "^1 ზარის დეტალები" - "ზარის ისტორიიდან წაშლილი" "დღეს" "გუშინ" "უფრო ძველი" - "ზარების სია" "სპიკერის ჩართვა." "სპიკერის გამორთვა." - "დაკვრის აჩქარება." - "დაკვრის შენელება." "დაკვრის დაწყება ან პაუზა." "ეკრანის პარამეტრები" "ხმა და ვიბრაცია" @@ -199,7 +142,6 @@ "ზარები" "ზარების დაბლოკვა" "ხმოვანი ფოსტა" - "აირჩ.SIM ხმოვ.ფოსტ.პარამ.-თვის" "ზარების დაბლოკვა დროებით გამოირთო" "ზარების დაბლოკვა გაითიშა, რადგან ბოლო 48 საათში ამ ტელეფონიდან საგანგებო სამსახურებს დაუკავშირდით. 48 საათის გასვლის შემდეგ ის ავტომატურად ჩაირთვება." "ნომრების იმპორტი" @@ -213,12 +155,8 @@ "დაბლოკილი ნომრები" "%1$s უკვე დაბლოკილია." "ანგარიშების გამოძახება" - "ჩართვა" - "ნებართვების დაყენება" "სწრაფი აკრეფის გასააქტიურებლად, ჩართეთ კონტაქტების ნებართვა." "ზარების ჟურნალის სანახავად, ჩართეთ ტელეფონის ნებართვა." - "კონტაქტების სანახავად, ჩართეთ კონტაქტების ნებართვა." - "ხმოვან ფოსტაზე წვდომისთვის, ჩართეთ ტელეფონის ნებართვა." "თქვენი კონტაქტების მოსაძებნად ჩართეთ კონტაქტების ნებართვები." "ზარის განსახორციელებლად, ჩართეთ ტელეფონის ნებართვა." "ტელეფონის აპს სისტემის პარამეტრებში ჩაწერის ნებართვა არ აქვს." @@ -230,4 +168,10 @@ "სპამი" "%1$s ხაზგარეშეა და ვერ დაუკავშირდებით" "აპის შესახებ" + "ტრასკრიბ. შეასრულა Google-მა" + "Google ტრანსკრიბირებას ასრულებს …" + "ტრანსკრიფტი მიუწვდომელია" + "ნახვა" + "ზარი წაიშალა. ამ ზარის დროს გაზიარებული დანართები იხილეთ და წაშალეთ Messages-ში." + "ზარები წაიშალა. ამ ზარის დროს გაზიარებული დანართები იხილეთ და წაშალეთ Messages-ში." diff --git a/java/com/android/dialer/app/res/values-kk/strings.xml b/java/com/android/dialer/app/res/values-kk/strings.xml index ba4238692..0adc55655 100644 --- a/java/com/android/dialer/app/res/values-kk/strings.xml +++ b/java/com/android/dialer/app/res/values-kk/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Телефон" "Телефон пернетақтасы" - "Телефон" "Қоңыраулар тарихы" - "Қате нөмір туралы есеп беру" "Нөмірді көшіру" "Транскрипцияны көшіру" - "Нөмірді бөгеу" - "Нөмірге рұқсат беру" "Қоңырау алдында нөмірді өзгерту" "Қоңыраулар тарихын тазалау" "Дауыстық хабарды жою" @@ -34,7 +30,6 @@ "Қоңыраулар тарихын тазалау керек пе?" "Бұл тарихтан барлық қоңырауларды жояды" "Қоңыраулар тарихы тазалануда…" - "Телефон" "Қабылданбаған қоңырау" "Өткізіп алынған жұмыс қоңырауы" "Қабылданбаған қоңыраулар" @@ -48,107 +43,66 @@ %1$d дауыстық хабар Дауыстық хабар - "Ойнау" "%1$s, %2$s" "%1$s жіберген жаңа дауыс-хабар" "Дауыстық хабарды ойнату мүмкін болмады" "Дауыстық хабар жүктелуде…" - "Дауыстық пошта мұрағатталуда…" "Дауыстық хабарды жүктеу мүмкін болмады" - "Дауыс хабары бар қоңыраулар ғана" - "Келген қоңыраулар ғана" - "Шығыс қоңыраулары ғана" - "Қабылданбаған қоңыраулар ғана" "(%1$d) %2$s" - "іздеу" - "теру" - "теретін нөмір" - "Ойнату немесе ойнатуды тоқтату" "Спикерфонды қосу немесе өшіру" "Ойнату орнын іздеу" - "Ойнату жылдамдығын азайту" - "Ойнату жылдамдығын арттыру" "Қоңыраулар тарихы" "Басқа опциялар" "пернетақта" - "Шығыс қоңырауларды ғана көрсету" - "Келгендерді ғана көрсету" - "Қабылданбағандарды ғана көрсету" - "Дауыс-хабарларын ғана көрсету" - "Барлық қоңырауларды көрсету" - "2 сек үзіліс қосу" - "Күтуді қосу" "Параметрлер" "Симулятор" - "Барлық контактілер" - "Сенсорлы әуенді пернетақта" - "Қосылып тұрған қоңырауға оралу" - "Қоңырау қосу" - "Келген қоңыраулар" - "Дауыс-хабарды ойнату" - "%1$s контактісін көру" - "%1$s нөміріне қоңырау шалу" + "Жаңа пайдаланушы интерфейсінің пернелер тіркесімін жасау" + "Жаппай әрекет режиміне өту" + "Жаппай әрекет режиімінен шығу" + "%1$s таңдалды" + "%1$s таңдауы алынды" "%1$s контакт деректері" "Күдікті %1$s спам қоңырау шалушының байланысу мәліметтері" "%1$s қоңыраулар." "Бейне қоңырау." - "Мынаған SMS жіберу: %1$s" - "Естілмеген дауыс-хабар" "Дауыс іздеуді бастау" - "%s нөміріне қоңырау шалу" "Дауыстық пошта" - "%s сек." - "%s мин %s сек" - "дауыстық хабар" - "дауыстық хабарлар" - "Иә" - "Жоқ" - "Таңдалған %1$s хабарларын жою қажет пе?" + "Топтама әрекеттер режимін жабу" + "Жою" + "Жабу" + "%1$s таңдалды" + + ""Осы дауыстық хабарларды жою қажет пе? "" + ""Осы дауыстық хабарды жою қажет пе? "" + @string/call_log_header_today "%1$s, %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Бұл нөмірге қоңырау шалу мүмкін емес" - "Дауыстық поштаны орнату үшін \"Mәзір > Параметрлер\" тармағына өтіңіз." - "Дауыстық поштаға қоңырау шалу үшін ұшақ режимін өшіру қажет." - "Жүктелуде..." - "IMEI (Халықаралық мобильдік құрылғы анықтағышы)" - "MEID (ұялы жабдық анықтағыш)" - "SIM картасынан жүктеу…" - "SIM картасының контактілері" - "Контактілер қолданбасы қол жетімді емес" "Дауыс арқылы іздеу қол жетімді емес" - "Телефон қоңырауын шалу мүмкін емес, өйткені «Телефон» қолданбасы өшірілген." "Контактілерді іздеу" "Нөмірді енгізіңіз немесе контактілерден іздеп табыңыз" "Қоңыраулар тарихы бос" "Қоңырау шалу" "Қабылданбаған қоңыраулар жоқ." "Дауыс поштасының \"Кіріс\" қалтасы бос." - "Сүйіктілерді ғана көрсету" "Қоңырау тарихы" "Барлық" "Қабылданбаған" - "Дауыстық хабар" "Жылдам теру" "Қоңыраулар тарихы" "Контактілер" "Дауыстық хабар" - "Сүйіктілерден алынған" - "Кері орындау" "%s нөміріне қоңырау шалу" "Жаңа контакт жасау" "Контактіге қосу" "SMS жіберу" "Бейне қоңырау шалу" "Нөмірді бөгеу" - "%s жаңа қабылданбаған қоңыраулар" "Жылдам теруде әлі ешкім жоқ" "Таңдаулыны қосу" - "Әлі ешқандай контактілер жоқ" - "Контакт қосу" - "Барлық нөмірлерді көру үшін кескінді түртіңіз, ал ретін өзгерту үшін түртіп, ұстап тұрыңыз" "Алып тастау" + "Барлығын таңдау" "Бейне қоңырау" "Хабар жіберу" "Қоңырау мәліметтері" @@ -164,25 +118,14 @@ "^1 нөміріне қоңырау шалу" "^1 бейне қоңырау шалу." "^1 дауыстық хабарын тыңдау" - "^1 дауыстық хабары ойнатылады" - "^1 дауыстық хабары кідіртіледі" - "^1 жіберген дауыстық хабар жойылады" - - %d жаңа дауыс поштасы - %d жаңа дауыс поштасы - "^1 үшін контакт жасау" "^1 бар контактіге қосу" "^1 үшін қоңырау мәліметтері" - "Қоңыраулар тарихынан жойылды" "Бүгін" "Кеше" "Ескілеу" - "Қоңыраулар тізімі" "Динамикті қосу." "Динамикті өшіру." - "Тезірек ойнату." - "Баяуырақ ойнату." "Ойнатуды бастау немесе кідірту." "Көрсету опциялары" "Дыбыстар мен діріл" @@ -199,7 +142,6 @@ "Қоңыраулар" "Қоңырауларға тыйым салу" "Дауыстық хабар" - "Дауыстық пошта параметрлері үшін SIM картасын таңдаңыз" "Қоңырауларға тыйым салу уақытша өшірулі" "Қоңырауларға тыйым салу өшірілді, өйткені сіз соңғы 48 сағат ішінде осы телефоннан төтенше қызметтерге хабарластыңыз. Ол 48 сағаттық кезең өткеннен кейін автоматты түрде қайта қосылады." "Нөмірлерді импорттау" @@ -213,12 +155,8 @@ "Бөгелген нөмірлер" "%1$s бөгеліп қойылған." "Қоңырау шалу есептік жазбалары" - "Қосу" - "Рұқсаттар орнату" "Жылдам теруді қосу үшін \"Контактілер\" рұқсатын қосыңыз." "Қоңыраулар журналы көру үшін \"Телефон\" рұқсатын қосыңыз." - "Контактілерді көру үшін \"Контактілер\" рұқсатын қосыңыз." - "Дауыс поштасына қатынасу үшін \"Телефон\" рұқсатын қосыңыз." "Контактілерді іздеу үшін \"Контактілер\" рұқсаттарын қосыңыз." "Қоңырауды шалу үшін \"Телефон\" рұқсатын қосыңыз." "Телефон қолданбасында жүйелік параметрлерге жазуға рұқсат жоқ." @@ -230,4 +168,10 @@ "Спам" "%1$s желіден тыс және байланысу мүмкін емес" "Мәліметтер" + "Транскрипцияны жасаған – Google" + "Google транскрипциясын жасап жатыр..." + "Tранскрипция жасау мүмкіндігі жоқ" + "Көру" + "Қоңырау жойылды. Осы қоңырау кезінде жіберілген тіркемелерді \"Хабарлар\" бөлімінен тауып жойыңыз." + "Қоңыраулар жойылды. Осы қоңыраулар кезінде жіберілген тіркемелерді \"Хабарлар\" бөлімінен тауып жойыңыз." diff --git a/java/com/android/dialer/app/res/values-km/strings.xml b/java/com/android/dialer/app/res/values-km/strings.xml index bdc91cf0b..b55b9ccc3 100644 --- a/java/com/android/dialer/app/res/values-km/strings.xml +++ b/java/com/android/dialer/app/res/values-km/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ទូរស័ព្ទ" "បន្ទះ​ចុច​លេខទូរសព្ទ" - "ទូរស័ព្ទ" "ប្រវត្តិ​ហៅ" - "រាយការណ៍ពីលេខដែលមិនត្រឹមត្រូវ" "ថតចម្លងលេខទូរស័ព្ទ" "ថតចម្លងសំណៅពីសារសម្លេង" - "រារាំងលេខ" - "ឈប់រារាំងលេខ" "កែ​លេខ​មុន​ពេល​ហៅ" "ជម្រះប្រវត្តិហៅ" "លុប​សារ​ជា​សំឡេង" @@ -34,7 +30,6 @@ "ជម្រះប្រវត្តិហៅ?" "វានឹងលុបការហៅទាំងអស់ចេញពីប្រវត្តិរបស់អ្នក" "កំពុងជម្រះប្រវត្តិហៅ…" - "ទូរស័ព្ទ" "ខកខាន​ទទួល" "បានខកខានការហៅចូលពីកន្លែងការងារ" "ខកខាន​ទទួល" @@ -48,107 +43,66 @@ សារជាសម្លេង %1$d សារជាសម្លេង - "ចាក់" "%1$s, %2$s" "សារ​ជា​សំឡេង​ថ្មី​ពី %1$s" "មិនអាចចាក់សារជាសម្លេងបានទេ" "កំពុងផ្ទុកសារជាសម្លេង…" - "កំពុង​​រក្សាទុក​សារ​ជាសំឡេង​ក្នុង​ប័ណ្ណសារ..." "មិនអាចផ្ទុកសារជាសម្លេងបានទេ" - "តែ​ការ​ហៅ​ជា​សារ​សំឡេង" - "តែ​ការ​ហៅ​ចូល" - "តែ​ការ​ហៅ​ចេញ​ប៉ុណ្ណោះ" - "តែ​លេខ​ខកខាន​ទទួល" "(%1$d) %2$s" - "ស្វែងរក" - "ចុច" - "លេខ​ដែល​ត្រូវ​ហៅ" - "ចាក់ ឬ​បញ្ឈប់​ការ​ចាក់​ឡើងវិញ" "បិទ ឬ​បើក​អូប៉ាល័រទូរស័ព្ទ" "រកមើល​ទីតាំង​ចាក់​ឡើងវិញ" - "បន្ថយ​អត្រា​ចាក់​ឡើង​វិញ" - "បង្កើន​អត្រា​ចាក់​ឡើងវិញ" "ប្រវត្តិហៅ" "ជម្រើស​បន្ថែម" "បន្ទះ​​ចុច​លេខ" - "បង្ហាញ​តែ​ការ​ហៅ​ចេញ" - "បង្ហាញ​តែ​ការ​ហៅ​ចូល" - "បង្ហាញ​តែ​ការ​ខកខាន​ទទួល" - "បង្ហាញ​តែ​សារ​ជា​សំឡេង" - "បង្ហាញ​ការ​ហៅ​ទាំងអស់" - "បន្ថែម​ការ​ផ្អាក ២វិ." - "បញ្ចូល​ការ​រង់ចាំ" "ការកំណត់" "កម្មវិធីធ្វើ​ដូច​មែនទែន" - "ទំនាក់ទំនង​ទាំងអស់" - "ប្រើ​សំឡេង​ប៉ះ​បន្ទះ​លេខ" - "កំពុង​ត្រឡប់​ទៅកាន់​ការ​ហៅ" - "បន្ថែម​ការ​ហៅ" - "ការ​ហៅ​ចូល" - "ចាក់​សារ​ជា​សំឡេង" - "មើល​ទំ​នាក់ទំនង %1$s" - "ហៅ %1$s" + "បង្កើត​ផ្លូវកាត់ UI ថ្មី" + "ចូល​មុខងារ​សកម្មភាព​ច្រើន" + "បាន​ចាកចេញ​ពី​មុខងារ​សកម្មភាព​ច្រើន" + "បាន​ជ្រើសរើស %1$s" + "បាន​ដក​ការជ្រើសរើស %1$s" "ព័ត៌មាន​លម្អិត​ទំនាក់ទំនង​សម្រាប់ %1$s" "ព័ត៌មាន​លម្អិត​ទំនាក់ទំនង​សម្រាប់​អ្នក​ហៅ​ឥត​បាន​ការ​ដែល​សង្ស័យ %1$s" "ការ​ហៅ %1$s ។" "ការ​ហៅ​ជា​វីដេអូ​។" - "ផ្ញើសារ SMS ទៅ %1$s" - "សារ​ជា​សំឡេង​ដែល​មិន​បាន​ឮ" "ចាប់ផ្ដើម​ស្វែងរក​ជា​សំឡេង" - "ហៅ %s" "សារ​ជា​សំឡេង" - "%s វិនាទី" - "%s នាទី %s វិនាទី" - "សារ​ជា​សំឡេង" - "សារ​ជា​សំឡេង" - "បាទ/ចាស" - "ទេ" - "លុប %1$s ដែល​បាន​ជ្រើសរើស?" + "បោះបង់​មុខងារ​សកម្មភាព​ជា​ក្រុម" + "លុប" + "បោះបង់" + "បាន​ជ្រើសរើស %1$s" + + ""លុប​សារ​ជា​សំឡេង​ទាំងនេះ? "" + ""លុប​សារ​ជា​សំឡេង​នេះ? "" + @string/call_log_header_today "%1$s នៅម៉ោង %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "មិនអាចហៅលេខនេះបានទេ" - "ដើម្បី​កំណត់​សារ​ជា​សំឡេង សូម​ចូល​ទៅ ម៉ឺនុយ > ការកំណត់។" - "ដើម្បី​ហៅ​សារ​ជា​សំឡេង ដំបូង​ត្រូវ​បិទ​របៀប​ពេល​ជិះ​យន្តហោះ។" - "កំពុង​ផ្ទុក..." - "IMEI" - "MEID" - "កំពុង​ផ្ទុក​ពី​ស៊ីម​កាត..." - "ទំនាក់ទំនង​នៅ​ក្នុង​ស៊ីម​កាត" - "មិនមានកម្មវិធីទំនាក់ទំនងទេ" "ការស្វែងរកជាសម្លេងមិនមានទេ" - "មិន​អាច​ហៅ​បាន​ទេ​ ព្រោះ​កម្មវិធី​ទូរស័ព្ទ​ត្រូវ​បាន​បិទ។" "រក​ទំនាក់ទំនង" "បន្ថែមលេខទូរស័ព្ទ ឬស្វែងរកទំនាក់ទំនង" "ប្រវត្តិហៅរបស់អ្នកទទេ" "ហៅទូរសព្ទ" "អ្នកមិនមានការខកខានទទួលទូរសព្ទទេ។" "ប្រអប់ទទួលសារជាសំឡេងរបស់អ្នកទទេ។" - "បង្ហាញ​តែ​​និយម​ប្រើ​ប៉ុណ្ណោះ" "ប្រវត្តិ​ហៅ" "ទាំង​អស់" "ខកខាន​ទទួល" - "សារ​ជា​សំឡេង" "ហៅទូរស័ព្ទល្បឿនលឿន" "ប្រវត្តិហៅ" "ទំនាក់ទំនង" "សារជាសំឡេង" - "បាន​លុប​ចេញពី​ទំនាក់ទំនង​ដែល​និយម​ប្រើ" - "មិនធ្វើវិញ" "ហៅ %s" "បង្កើតទំនាក់ទំនងថ្មី" "បន្ថែមទៅទំនាក់ទំនង" "ផ្ញើសារ SMS" "ការ​ហៅ​ជា​វីដេអូ" "រារាំងលេខ" - "ខកខាន​ទទួល​ថ្មី %s" "គ្មាននរណាម្នាក់នៅក្នុងការហៅរហ័សរបស់អ្នកនៅឡើយទេ" "បញ្ចូលសំណព្វ" - "អ្នកមិនទាន់មានទំនាក់ទំនងនៅឡើយទេ" - "បន្ថែមទំនាក់ទំនង" - "ប៉ះរូបភាពដើម្បីមើលលេខទាំងអស់ ឬប៉ះ & សង្កត់ឲ្យជាប់ដើម្បីតម្រៀបឡើងវិញ" "លុបចេញ" + "ជ្រើសរើស​​ទាំងអស់" "ហៅជាវីដេអូ" "ផ្ញើសារ" "ព័ត៌មានលម្អិតអំពីការហៅ" @@ -164,25 +118,14 @@ "ហៅ ^1" "ហៅទៅ ^1 ជាវីដេអូ។" "ស្ដាប់​សារ​ជា​សំឡេង​ពី ^1" - "ចាក់ការហៅជាសំឡេងពី ^1" - "ផ្អាកសារជាសំឡេងពី ^1" - "លុបសារជាសំឡេងពី ^1" - - សារជាសំឡេងថ្មី %d - សារជាសំឡេងថ្មី %d - "បង្កើតទំនាក់ទំនងសម្រាប់ ^1" "បន្ថែម ^1 ទៅទំនាក់ទំនងដែលមានស្រាប់" "ព័ត៌មាន​លម្អិត​អំពីការហៅ​សម្រាប់ ^1" - "បានលុបចេញពីប្រវត្តិហៅ" "ថ្ងៃនេះ" "ម្សិលមិញ" "ចាស់ៗ" - "បញ្ជីការហៅ" "បើក​អូប៉ាល័រ។" "បិទ​អូប៉ាល័រ។" - "ចាក់​កាន់តែ​លឿន" - "ចាក់​កាន់តែ​យឺត។" "ចាប់ផ្ដើម ឬ​ផ្អាក​ការ​ចាក់​ឡើងវិញ។" "ជម្រើសបង្ហាញ" "សំឡេង និងរំញ័រ" @@ -199,7 +142,6 @@ "ការហៅ" "ការរារាំងការហៅ" "សារ​ជា​សំឡេង" - "ជ្រើសរើស SIM សម្រាប់​ការកំណត់​សារ​ជា​សំឡេង" "ការរារាំងការហៅត្រូវបានបិទជាបណ្តោះអាសន្ន" "ការរារាំងការហៅត្រូវបានបិទដំណើរការ ដោយសារតែអ្នកបានទាក់ទងទៅសេវាអាសន្នចេញពីទូរស័ព្ទនេះក្នុងចន្លោះពេល 48 ម៉ោងកន្លងមកនេះ។ វានឹងបើកដំណើរការឡើងវិញ បន្ទាប់ពីរយៈពេល 48 ម៉ោងផុតកំណត់។" "នាំចូលលេខ" @@ -213,12 +155,8 @@ "លេខបានរារាំង" "%1$s ត្រូវបានទប់ស្កាត់រួចហើយ" "គណនីហៅទូរសព្ទ" - "បើក" - "កំណត់សិទ្ធិអនុញ្ញាត" "ដើម្បីបើកដំណើរការហៅរហ័ស សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីទំនាក់ទំនង។" "ដើម្បីមើលកំណត់ហេតុហៅទូរស័ព្ទរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីហៅទូរស័ព្ទ។" - "ដើម្បីមើលទំនាក់ទំនងរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីទំនាក់ទំនង។" - "ដើម្បីចូលដំណើរការសារជាសំឡេងរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីហៅទូរស័ព្ទ។" "ដើម្បីស្វែងរកទំនាក់ទំនងរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតទំនាក់ទំនង។" "ដើម្បីធ្វើការហៅទូរស័ព្ទ សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីហៅទូរស័ព្ទ។" "កម្មវិធីទូរស័ព្ទមិនមានសិទ្ធិអនុញ្ញាតដើម្បីសរសេរការកំណត់ប្រព័ន្ធទេ។" @@ -230,4 +168,10 @@ "សារ​ឥតបានការ" "%1$s មិន​នៅ​លើ​អ៊ីនធឺណិត និង​មិន​អាច​ទាក់ទង​បាន​ទេ" "អំពី" + "បាន​ធ្វើ​ប្រតិចារឹក​ដោយ Google" + "Google កំពុង​ធ្វើ​ប្រតិចារឹក..." + "មិន​មាន​ប្រតិចារឹក​ទេ" + "មើល" + "បាន​លុប​ការហៅទូរសព្ទ។ មើល និង​លុប​ឯកសារ​ភ្ជាប់​ដែល​បាន​ចែករំលែក​នៅ​អំឡុង​ពេល​ហៅ​ទូរសព្ទ​នេះ​នៅ​ក្នុង Messages ។" + "បាន​លុប​ការហៅទូរសព្ទ។ មើល និង​លុប​ឯកសារ​ភ្ជាប់​ដែល​បាន​ចែករំលែក​នៅ​អំឡុង​ពេល​ហៅ​ទូរសព្ទ​នៅ​ក្នុង Messages ។" diff --git a/java/com/android/dialer/app/res/values-kn/strings.xml b/java/com/android/dialer/app/res/values-kn/strings.xml index dae544d3f..8e213c12f 100644 --- a/java/com/android/dialer/app/res/values-kn/strings.xml +++ b/java/com/android/dialer/app/res/values-kn/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ಫೋನ್" "ಫೋನ್ ಕೀಪ್ಯಾಡ್" - "ಫೋನ್" "ಕರೆ ಇತಿಹಾಸ" - "ನಿಖರವಾಗಿಲ್ಲದ ಸಂಖ್ಯೆಯನ್ನು ವರದಿಮಾಡಿ" "ಸಂಖ್ಯೆಯನ್ನು ನಕಲಿಸಿ" "ಟ್ರಾನ್ಸ್‌ಕ್ರಿಪ್ಶನ್ ನಕಲಿಸಿ" - "ಸಂಖ್ಯೆಯನ್ನು ನಿರ್ಬಂಧಿಸು" - "ಸಂಖ್ಯೆಯನ್ನು ಅನಿರ್ಬಂಧಿಸು" "ಕರೆ ಮಾಡುವ ಮೊದಲು ಸಂಖ್ಯೆಯನ್ನು ಎಡಿಟ್ ಮಾಡಿ" "ಕರೆ ಇತಿಹಾಸ ತೆರವುಗೊಳಿಸಿ" "ಧ್ವನಿಮೇಲ್‌ ಅಳಿಸಿ" @@ -34,7 +30,6 @@ "ಕರೆ ಇತಿಹಾಸವನ್ನು ತೆರವುಗೊಳಿಸುವುದೇ?" "ಇದು ನಿಮ್ಮ ಇತಿಹಾಸದಿಂದ ಎಲ್ಲಾ ಕರೆಗಳನ್ನು ಅಳಿಸುತ್ತದೆ" "ಕರೆ ಇತಿಹಾಸವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತಿದೆ…" - "ಫೋನ್" "ಮಿಸ್ಡ್‌ ಕಾಲ್‌" "ಮಿಸ್ಡ್‌ ಕೆಲಸದ ಕರೆ" "ಮಿಸ್ಡ್‌ ಕರೆಗಳು" @@ -48,107 +43,66 @@ %1$d ಧ್ವನಿಮೇಲ್‌ಗಳು %1$d ಧ್ವನಿಮೇಲ್‌ಗಳು - "ಪ್ಲೇ ಮಾಡು" "%1$s, %2$s" "%1$s ಇವರಿಂದ ಹೊಸ ಧ್ವನಿಮೇಲ್‌" "ಧ್ವನಿಮೇಲ್‌ ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ" "ಧ್ವನಿಮೇಲ್‌ ಲೋಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…" - "ಧ್ವನಿಮೇಲ್ ಆರ್ಕೈವ್ ಮಾಡಲಾಗುತ್ತಿದೆ…" "ಧ್ವನಿಮೇಲ್‌ ಲೋಡ್‌ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ" - "ಧ್ವನಿಮೇಲ್‌ ಕರೆಗಳು ಮಾತ್ರ" - "ಒಳಬರುವ ಕರೆಗಳು ಮಾತ್ರ" - "ಹೊರಹೋಗುವ ಕರೆಗಳು ಮಾತ್ರ" - "ಮಿಸ್ಡ್‌ ಕರೆಗಳು ಮಾತ್ರ" "(%1$d) %2$s" - "ಹುಡುಕಾಟ" - "ಡಯಲ್" - "ಡಯಲ್‌ ಮಾಡಬೇಕಾದ ಸಂಖ್ಯೆ" - "ಪ್ಲೇಬ್ಯಾಕ್ ಅನ್ನು ಪ್ಲೇ ಮಾಡಿ ಅಥವಾ ನಿಲ್ಲಿಸಿ" "ಸ್ಪೀಕರ್‌ಫೋನ್ ಸ್ವಿಚ್ ಆನ್ ಅಥವಾ ಆಫ್ ಮಾಡಿ" "ಪ್ಲೇಬ್ಯಾಕ್ ಸ್ಥಾನವನ್ನು ಪಡೆಯಿರಿ" - "ಪ್ಲೇಬ್ಯಾಕ್ ರೇಟ್ ಅನ್ನು ಕಡಿಮೆ ಮಾಡು" - "ಪ್ಲೇಬ್ಯಾಕ್ ರೇಟ್ ಅನ್ನು ಹೆಚ್ಚು ಮಾಡು" "ಕರೆ ಇತಿಹಾಸ" "ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು" "ಕೀ ಪ್ಯಾಡ್‌" - "ಹೊರಹೋಗುವುದನ್ನು ಮಾತ್ರ ತೋರಿಸು" - "ಒಳಬರುವುದನ್ನು ಮಾತ್ರ ತೋರಿಸು" - "ತಪ್ಪಿಹೋದದ್ದನ್ನು ಮಾತ್ರ ತೋರಿಸು" - "ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು" - "ಎಲ್ಲಾ ಕರೆಗಳನ್ನು ತೋರಿಸು" - "2-ಸೆ ವಿರಾಮವನ್ನು ಸೇರಿಸಿ" - "ನಿರೀಕ್ಷೆಯನ್ನು ಸೇರಿಸಿ" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಸಿಮ್ಯುಲೇಟರ್" - "ಎಲ್ಲಾ ಸಂಪರ್ಕಗಳು" - "ಸ್ಪರ್ಶ ಟೋನ್ ಕೀಪ್ಯಾಡ್ ಬಳಸಿ" - "ಪ್ರತ್ಯತ್ತರ ಕರೆಯು ಪ್ರಗತಿಯಲ್ಲಿದೆ" - "ಕರೆಯನ್ನು ಸೇರಿಸಿ" - "ಒಳಬರುವ ಕರೆಗಳು" - "ಧ್ವನಿಮೇಲ್‌ ಪ್ಲೇ ಮಾಡಿ" - "%1$s ಸಂಪರ್ಕ ವೀಕ್ಷಿಸಿ" - "%1$s ಕರೆ ಮಾಡಿ" + "ಹೊಸ UI ಶಾರ್ಟ್‌ಕಟ್ ರಚಿಸಿ" + "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಕ್ರಿಯೆಯ ಮೋಡ್‌ಗೆ ಪ್ರವೇಶಿಸಲಾಗುತ್ತಿದೆ" + "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಕ್ರಿಯೆಯ ಮೋಡ್ ತೊರೆಯಲಾಗಿದೆ" + "%1$s ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ" + "%1$s ಆಯ್ಕೆಯನ್ನು ರದ್ದುಮಾಡಲಾಗಿದೆ" "%1$s ಗೆ ಸಂಪರ್ಕ ವಿವರಗಳು" "%1$s ಶಂಕಿತ ಸ್ಪ್ಯಾಮ್ ಕರೆದಾರರಿಗಾಗಿ ಸಂಪರ್ಕ ವಿವರಗಳು" "%1$s ಕರೆಗಳು." "ವೀಡಿಯೊ ಕರೆ." - "%1$s ಅವರಿಗೆ SMS ಕಳುಹಿಸಿ" - "ಆಲಿಸಲಾಗದ ಧ್ವನಿಮೇಲ್‌" "ಧ್ವನಿ ಹುಡುಕಾಟ ಪ್ರಾರಂಭಿಸಿ" - "%s ಕರೆ ಮಾಡಿ" "ಧ್ವನಿಮೇಲ್" - "%s ಸೆಕೆಂ" - "%s ನಿಮಿ %s ಸೆಕೆಂ" - "ಧ್ವನಿಮೇಲ್" - "ಧ್ವನಿಮೇಲ್‌ಗಳು" - "ಹೌದು" - "ಇಲ್ಲ" - "ಆಯ್ಕೆ ಮಾಡಲಾದ %1$s ಅನ್ನು ಅಳಿಸುವುದೇ?" + "ಬ್ಯಾಚ್ ಕ್ರಿಯೆಗಳ ಮೋಡ್ ಅನ್ನು ರದ್ದುಮಾಡಿ" + "ಅಳಿಸಿ" + "ರದ್ದುಮಾಡಿ" + "%1$s ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ" + + ""ಈ ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಅಳಿಸುವುದೇ? "" + ""ಈ ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಅಳಿಸುವುದೇ? "" + @string/call_log_header_today "%1$s ರಂದು %2$s ಗಂಟೆಗೆ" "%1$02d:%2$02d" "%1$s%2$s" - "ಈ ಸಂಖ್ಯೆಗೆ ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ" - "ಧ್ವನಿಮೇಲ್‌ ಹೊಂದಿಸಲು, ಮೆನು > ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಗೆ ಹೋಗಿ." - "ಧ್ವನಿಮೇಲ್‌ಗೆ ಕರೆ ಮಾಡಲು, ಮೊದಲು ಏರ್‌ಪ್ಲೇನ್‌‌ ಮೋಡ್‌‌ ಆಫ್‌ ಮಾಡಿ." - "ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." - "IMEI" - "MEID" - "ಸಿಮ್‌ ಕಾರ್ಡ್‌ನಿಂದ ಲೋಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…" - "ಸಿಮ್‌ ಕಾರ್ಡ್‌ ಸಂಪರ್ಕಗಳು" - "ಯಾವುದೇ ಸಂಪರ್ಕಗಳ ಅಪ್ಲಿಕೇಶನ್‌ ಲಭ್ಯವಿಲ್ಲ" "ಧ್ವನಿ ಹುಡುಕಾಟ ಲಭ್ಯವಿಲ್ಲ" - "ಫೋನ್ ಅಪ್ಲಿಕೇಶನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುವುದರಿಂದ ಫೋನ್ ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ." "ಸಂಪರ್ಕಗಳನ್ನು ಹುಡುಕಿ" "ಸಂ. ಸೇರಿಸಿ ಅಥವಾ ಸಂಪರ್ಕ ಹುಡುಕಿ" "ನಿಮ್ಮ ಕರೆ ಇತಿಹಾಸ ಖಾಲಿಯಾಗಿದೆ" "ಕರೆ ಮಾಡಿ" "ನೀವು ಯಾವುದೇ ಮಿಸ್ಡ್ ಕರೆಗಳನ್ನು ಹೊಂದಿಲ್ಲ." "ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಇನ್‌ಬಾಕ್ಸ್ ಖಾಲಿ ಇದೆ." - "ಮೆಚ್ಚಿನವುಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು" "ಕರೆ ಇತಿಹಾಸ" "ಎಲ್ಲಾ ಕರೆಗಳು" "ಮಿಸ್ಡ್‌ ಕರೆಗಳು" - "ಧ್ವನಿಮೇಲ್" "ಸ್ಪೀಡ್ ಡಯಲ್" "ಕರೆ ಇತಿಹಾಸ" "ಸಂಪರ್ಕಗಳು" "ಧ್ವನಿಮೇಲ್" - "ಮೆಚ್ಚಿನವುಗಳಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ" - "ರದ್ದುಮಾಡಿ" "%s ಕರೆ ಮಾಡಿ" "ಹೊಸ ಸಂಪರ್ಕ ರಚಿಸು" "ಸಂಪರ್ಕಕ್ಕೆ ಸೇರಿಸು" "SMS ಕಳುಹಿಸು" "ವೀಡಿಯೊ ಕರೆ ಮಾಡಿ" "ಸಂಖ್ಯೆಯನ್ನು ನಿರ್ಬಂಧಿಸು" - "%s ಹೊಸ ಮಿಸ್ಡ್‌ ಕರೆಗಳು" "ನಿಮ್ಮ ತ್ವರಿತ ಡಯಲ್‌ನಲ್ಲಿ ಇದುವರೆಗೆ ಯಾರೂ ಇಲ್ಲ" "ಮೆಚ್ಚಿನದನ್ನು ಸೇರಿಸಿ" - "ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಸಂಪರ್ಕಗಳನ್ನು ಹೊಂದಿಲ್ಲ" - "ಸಂಪರ್ಕ ಸೇರಿಸಿ" - "ಎಲ್ಲಾ ಸಂಖ್ಯೆಗಳನ್ನು ನೋಡಲು ಚಿತ್ರವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಅಥವಾ ಮರುಕ್ರಮಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್‌‌ ಮಾಡಿ" "ತೆಗೆದುಹಾಕು" + "ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆ ಮಾಡಿ" "ವೀಡಿಯೊ ಕರೆ" "ಸಂದೇಶ ಕಳುಹಿಸಿ" "ಕರೆಯ ವಿವರಗಳು" @@ -164,25 +118,14 @@ "^1 ಕರೆ ಮಾಡಿ" "^1 ಗೆ ವೀಡಿಯೊ ಕರೆ ಮಾಡಿ." "^1 ರಿಂದ ಧ್ವನಿಮೇಲ್ ಆಲಿಸಿ" - "^1 ರಿಂದ ಧ್ವನಿಮೇಲ್ ಪ್ಲೇ ಮಾಡಿ" - "^1 ನಿಂದ ಧ್ವನಿಮೇಲ್ ವಿರಾಮಗೊಳಿಸಿ" - "^1 ನಿಂದ ಧ್ವನಿಮೇಲ್ ಅಳಿಸಿ" - - %d ಹೊಸ ಧ್ವನಿಮೇಲ್‌ಗಳು - %d ಹೊಸ ಧ್ವನಿಮೇಲ್‌ಗಳು - "^1 ಗೆ ಸಂಪರ್ಕವನ್ನು ರಚಿಸಿ" "ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಸಂಪರ್ಕಕ್ಕೆ ^1 ಸೇರಿಸಿ" "^1 ಗೆ ಸಂಪರ್ಕದ ವಿವರಗಳು" - "ಕರೆ ಇತಿಹಾಸದಿಂದ ಅಳಿಸಲಾಗಿದೆ" "ಇಂದು" "ನಿನ್ನೆ" "ಹಳೆಯದು" - "ಕರೆಗಳ ಪಟ್ಟಿ" "ಸ್ಪೀಕರ್ ಆನ್ ಮಾಡಿ." "ಸ್ಪೀಕರ್ ಆಫ್ ಮಾಡಿ." - "ವೇಗವಾಗಿ ಪ್ಲೇ ಮಾಡಿ." - "ನಿಧಾನವಾಗಿ ಪ್ಲೇ ಮಾಡಿ." "ಪ್ಲೇಬ್ಯಾಕ್‌ ಪ್ರಾರಂಭಿಸಿ ಅಥವಾ ವಿರಾಮಗೊಳಿಸಿ." "ಡಿಸ್‌ಪ್ಲೇ ಆಯ್ಕೆಗಳು" "ಧ್ವನಿ ಮತ್ತು ವೈಬ್ರೇಷನ್‌" @@ -199,7 +142,6 @@ "ಕರೆಗಳು" "ಕರೆ ನಿರ್ಬಂಧಿಸುವಿಕೆ" "ಧ್ವನಿಮೇಲ್" - "ಧ್ವನಿಮೇಲ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಸಿಮ್ ಆಯ್ಕೆ ಮಾಡಿ" "ಕರೆ ನಿರ್ಬಂಧಿಸುವಿಕೆ ತಾತ್ಕಾಲಿಕ ಆಫ್ ಮಾಡಲಾಗಿದೆ" "ನೀವು ಕಳೆದ 48 ಗಂಟೆಗಳಲ್ಲಿ ಈ ಫೋನ್‌ನಿಂದ ತುರ್ತು ಸೇವೆಗಳಿಗೆ ಸಂಪರ್ಕಿಸಿರುವ ಕಾರಣದಿಂದ ಕರೆ ನಿರ್ಬಂಧಿಸುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಒಮ್ಮೆ 48 ಗಂಟೆಗಳ ಅವಧಿಯು ಮುಕ್ತಾಯಗೊಂಡ ನಂತರ ಅದನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರುಸಕ್ರಿಯಗೊಳಿಸಲಾಗುವುದು." "ಸಂಖ್ಯೆಗಳನ್ನು ಆಮದು ಮಾಡಿ" @@ -213,12 +155,8 @@ "ನಿರ್ಬಂಧಿಸಲಾದ ಸಂಖ್ಯೆಗಳು" "%1$s ಈಗಾಗಲೇ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ." "ಕರೆ ಮಾಡುವ ಖಾತೆಗಳು" - "ಆನ್‌ ಮಾಡಿ" - "ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿಸು" "ವೇಗ ಡಯಲ್ ಸಕ್ರಿಯಗೊಳಿಸಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." "ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ವೀಕ್ಷಿಸಲು, ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." - "ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ವೀಕ್ಷಿಸಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." - "ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಪ್ರವೇಶಿಸಲು, ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." "ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಹುಡುಕಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಗಳನ್ನು ಆನ್ ಮಾಡಿ." "ಕರೆ ಮಾಡಲು, ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." "ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಬರೆಯಲು ಫೋನ್ ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಯನ್ನು ಹೊಂದಿಲ್ಲ." @@ -230,4 +168,10 @@ "ಸ್ಪ್ಯಾಮ್" "%1$s ಆಫ್‌ಲೈನ್ ಆಗಿದ್ದಾರೆ ಮತ್ತು ಅವರನ್ನು ತಲುಪಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ" "ಕುರಿತು" + "Google ನಿಂದ ಲಿಪ್ಯಂತರ ಮಾಡಲಾಗಿದೆ" + "Google ಲಿಪ್ಯಂತರ ಮಾಡುತ್ತಿದೆ …" + "ಪ್ರತಿಲಿಪಿ ಲಭ್ಯವಿಲ್ಲ" + "ವೀಕ್ಷಿಸಿ" + "ಕರೆ ಅಳಿಸಲಾಗಿದೆ. ಈ ಕರೆಯ ಸಮಯದಲ್ಲಿ ಸಂದೇಶಗಳಲ್ಲಿ ಹಂಚಿಕೊಳ್ಳಲಾದ ಲಗತ್ತುಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ಅಳಿಸಿ." + "ಕರೆಗಳನ್ನು ಅಳಿಸಲಾಗಿದೆ. ಈ ಕರೆಗಳನ್ನು ಮಾಡುವ ಸಮಯದಲ್ಲಿ ಸಂದೇಶಗಳಲ್ಲಿ ಹಂಚಿಕೊಳ್ಳಲಾದ ಲಗತ್ತುಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ಅಳಿಸಿ." diff --git a/java/com/android/dialer/app/res/values-ko/strings.xml b/java/com/android/dialer/app/res/values-ko/strings.xml index 1850b6ce1..96cde6fa5 100644 --- a/java/com/android/dialer/app/res/values-ko/strings.xml +++ b/java/com/android/dialer/app/res/values-ko/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "전화" "휴대전화 키패드" - "휴대전화" "통화 기록" - "잘못된 번호 신고하기" "전화번호 복사" "텍스트 변환 복사" - "번호 차단" - "번호 차단 해제" "통화하기 전에 번호 수정" "통화 기록 삭제" "음성사서함 삭제" @@ -34,7 +30,6 @@ "통화 기록을 삭제하시겠습니까?" "모든 통화가 기록에서 삭제됩니다." "통화 기록을 삭제하는 중…" - "전화" "부재중 전화" "부재중 업무 통화" "부재중 전화" @@ -48,107 +43,66 @@ 음성메일 %1$d 음성메일 - "재생" "%1$s, %2$s" "%1$s님이 보낸 새 음성사서함" "음성사서함을 재생할 수 없습니다." "음성사서함 로드 중…" - "음성사서함 보관처리 중…" "음성사서함을 로드할 수 없습니다." - "음성사서함 메시지만" - "수신 전화만" - "발신 전화만" - "부재중 전화만" "%2$s에 통화 %1$d통" - "검색" - "전화걸기" - "전화를 걸 번호" - "재생 실행 또는 중지" "스피커폰 켜고 끄기" "재생 위치 찾기" - "재생 속도 낮추기" - "재생 속도 높이기" "통화 기록" "옵션 더보기" "키패드" - "발신 전화만 표시" - "수신 전화만 표시" - "부재중 전화만 표시" - "음성사서함만 표시" - "모든 통화 표시" - "2초 간 일시 정지 추가" - "대기 시간 추가" "설정" "시뮬레이터" - "모든 연락처" - "터치톤 키패드 사용" - "진행 중인 통화로 돌아가기" - "통화 추가" - "수신전화" - "음성사서함 재생" - "%1$s님의 연락처 보기" - "전화걸기: %1$s" + "새 UI 바로가기 만들기" + "일괄 작업 모드 시작 중" + "일괄 작업 모드 종료됨" + "%1$s 선택됨" + "%1$s 선택 취소됨" "%1$s의 연락처 세부정보" "스팸으로 의심되는 발신자 %1$s의 연락처 세부정보" "통화 횟수: %1$s번" "화상 통화" - "%1$s님에게 SMS 보내기" - "듣지 않은 음성사서함" "음성 검색 시작" - "%s에 전화" "음성사서함" - "%s초" - "%s%s초" - "음성사서함" - "음성사서함" - "예" - "아니요" - "선택한 %1$s을(를) 삭제하시겠습니까?" + "일괄 작업 모드 취소" + "삭제" + "취소" + "%1$s개 선택됨" + + ""이 음성사서함을 삭제하시겠습니까? "" + ""이 음성사서함을 삭제하시겠습니까? "" + @string/call_log_header_today "%1$s %2$s" "%1$02d%2$02d초" "%1$s%2$s" - "이 번호로 전화를 걸 수 없습니다." - "음성사서함을 설정하려면 메뉴 > 설정으로 이동하세요." - "음성사서함에 메시지를 남기려면 먼저 비행기 모드를 해제하세요." - "로드 중…" - "IMEI" - "MEID" - "SIM 카드에서 로딩 중..." - "SIM 카드 주소록" - "사용할 수 있는 주소록 앱이 없습니다." "음성검색이 지원되지 않습니다." - "전화 애플리케이션을 사용 중지했으므로 전화를 걸 수 없습니다." "주소록 검색" "번호 추가 또는 연락처 검색" "통화 기록이 비어있습니다." "전화 걸기" "부재중 전화가 없습니다." "음성사서함 받은편지함이 비어 있습니다." - "즐겨찾는 연락처만 표시" "통화 기록" "전체" "부재중 전화" - "음성사서함" "단축번호" "통화 기록" "주소록" "음성사서함" - "즐겨찾기에서 삭제됨" - "실행취소" "%s에 전화" "새 연락처 만들기" "연락처에 추가" "SMS 보내기" "화상 통화하기" "번호 차단" - "새로운 부재중 전화 %s건" "아직 단축 다이얼이 설정된 연락처가 없습니다." "단축 다이얼 추가" - "아직 연락처가 없습니다." - "연락처 추가" - "이미지를 터치하여 모든 번호를 확인하거나 길게 터치하여 재정렬합니다." "삭제" + "모두 선택" "화상 통화" "메시지 보내기" "통화 세부정보" @@ -164,25 +118,14 @@ "^1에 전화 걸기" "^1에 화상 통화 걸기" "^1 음성사서함 듣기" - "^1에서 발신한 음성사서함 재생" - "^1에서 발신한 음성사서함 일시중지" - "^1에서 발신한 음성사서함 삭제" - - 새 음성사서함 %d - 새 음성사서함 %d - "^1 연락처 만들기" "^1님을 기존 연락처에 추가합니다." "^1의 통화 세부정보" - "통화 기록에서 삭제했습니다." "오늘" "어제" "이전" - "통화 목록" "스피커를 켭니다." "스피커를 끕니다." - "더 빠르게 재생합니다." - "더 느리게 재생합니다." "재생을 시작하거나 일시중지합니다." "표시 옵션" "소리 및 진동" @@ -199,7 +142,6 @@ "통화" "통화 차단" "음성사서함" - "음성사서함 설정을 변경할 SIM 선택" "통화 차단 기능이 일시적으로 중지됨" "지난 48시간 이내에 이 휴대전화를 사용해 응급 서비스에 연락했으므로 통화 차단 기능이 중지되었습니다. 48시간이 지나면 통화 차단 기능이 자동으로 다시 사용 설정됩니다." "번호 가져오기" @@ -213,12 +155,8 @@ "차단된 번호" "%1$s번은 이미 차단되었습니다." "통화 계정" - "사용" - "권한 설정" "단축번호를 사용하려면 주소록 권한을 사용하도록 설정하세요." "통화 기록을 보려면 전화 권한을 사용하도록 설정하세요." - "주소록을 보려면 주소록 권한을 사용하도록 설정하세요." - "음성사서함에 액세스하려면 전화 권한을 사용하도록 설정하세요." "주소록을 검색하려면 주소록 권한을 사용하도록 설정하세요." "전화를 걸려면 전화 권한을 사용하도록 설정하세요." "전화 앱은 시스템 설정에 쓸 수 있는 권한이 없습니다." @@ -230,4 +168,10 @@ "스팸" "%1$s님은 오프라인 상태이며 연락할 수 없습니다." "정보" + "텍스트 변환 Google 제공" + "Google에서 텍스트 변환 중…" + "텍스트 변환을 사용할 수 없음" + "보기" + "통화가 삭제되었습니다. 메시지에서 이 통화 중에 공유된 첨부파일을 확인하고 삭제하세요." + "통화가 삭제되었습니다. 메시지에서 통화 중에 공유된 첨부파일을 확인하고 삭제하세요." diff --git a/java/com/android/dialer/app/res/values-ky/strings.xml b/java/com/android/dialer/app/res/values-ky/strings.xml index 9e80e29ee..d0e28039f 100644 --- a/java/com/android/dialer/app/res/values-ky/strings.xml +++ b/java/com/android/dialer/app/res/values-ky/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Телефон" "Телефондун номер тергичи" - "Телефон" "Чалуулар таржымалы" - "Номер туура эмес" "Номерди көчүрүү" "Транскрипцияны көчүрүү" - "Номерди бөгөттөө" - "Номерди бөгөттөн чыгаруу" "Чалуудан мурун номерди түзөтүү" "Чалуулар таржымалын тазалоо" "Үн почтасын жок кылуу" @@ -34,7 +30,6 @@ "Чалуулар таржымалы тазалансынбы?" "Ушуну менен бул таржымалдагы бардык чалуулар жок болот" "Чалуулар таржымалы тазаланууда…" - "Телефон" "Кабыл алынбаган чалуу" "Кабыл алынбай калган чалуу (жумуш)" "Кабыл алынбаган чалуулар" @@ -48,107 +43,66 @@ %1$d Үн каты Үн каты - "Угуу" "%1$s, %2$s" "%1$s жаңы үнкат калтырды" "Үн почтасы ойнолгон жок" "Үн почтасы жүктөлүүдө…" - "Үн каттары архивделүүдө…" "Үн почтасы жүктөлгөн жок" - "Үнкат чалуулары" - "Кириш чалуулар" - "Чыккан чалуулар" - "Өткөзүлгөн чалуулар гана" "(%1$d) %2$s" - "издөө" - "терүү" - "терүү үчүн номер" - "Ойнотууну иштетүү же токтотуу" "Катуу сүйлөткүчтү күйгүзүү же өчүрүү" "Ойнотуунун жайгашкан жерин издөө" - "Ойнотуу ылдамдыгын жайлатуу" - "Ойнотуу ылдамдыгын тездетүү" "Чалуулар таржымалы" "Көбүрөөк мүмкүнчүлүктөр" "номер тергич" - "Чыккан чалуу-ды гана көрсөтүү" - "Кириш чалууларды гана көрсөтүү" - "Өткөз. чалуу-ды гана көрсөтүү" - "Үнкаттарды гана көрсөтүү" - "Бардык чалууларды көрсөтүү" - "2-сек. тыныгууну кошуңуз" - "Тыныгуу кошуу" "Жөндөөлөр" "Симулятор" - "Бардык байланыштар" - "Тоналдык терүү тактасын колдонуу" - "Токтотулган чалууга кайтуу" - "Чалууну кошуу" - "Кирүүчү чалуулар" - "Үнкатты угуу" - "Байланышты кароо %1$s" - "Чалуу %1$s" + "Жаңы интерфейс үчүн кыска жол түзүү" + "Жапырт аракет режимине кирдиңиз" + "Жапырт аракет режиминен чыктыңыз" + "%1$s объект тандалды" + "%1$s объект тандоодон чыгарылды" "%1$s байланыш маалыматтары" "Спам деп шектелип жаткан чалуучунун байланыш маалыматы %1$s" "%1$s чалуу." "Видео чалуу." - "%1$s дегенге SMS жөнөтүү" - "Угула элек үнкат" "Үн менен издеп баштоо" - "Чалуу %s" "Үн почтасы" - "%s сек." - "%s мүн. %s сек." - "үн почтасы" - "үн почталары" - "Ооба" - "Жок" - "Тандалган %1$s жок кылынсынбы?" + "Жапырт аракет режимин жокко чыгаруу" + "Жок кылуу" + "Жокко чыгаруу" + "%1$s тандалды" + + ""Бул үн почталар жок кылынсынбы? "" + ""Бул үн почта жок кылынсынбы? "" + @string/call_log_header_today "%1$s саат %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Бул номурга чалуу мүмкүн болбой жатат" - "Үн почтасын жөндөө үчүн Меню > Жөндөөлөргө кириңиз." - "Үн почтасын текшерүү үчүн, алгач Учак режимин өчүрүңүз." - "Жүктөлүүдө…" - "IMEI" - "MEID" - "SIM картадан жүктөлүүдө..." - "SIM картадагы байланыштар" - "Жеткиликтүү байланыштар колдонмосу жок" "Үн менен издөө жеткиликтүү эмес" - "Телефон колдонмосу өчүрүлгөндүктөн, чалуу мүмкүн болбой жатат." "Байланыштарды издөө" "Номер кошуңуз же байлнш издңз" "Чалуулар таржымалыңыз бош" "Чалуу" "Кабыл алынбаган чалуулар жок." "Үн почтаңыздын келген билдирүүлөр куржуну бош." - "Тандамалдарды гана көрсөтүү" "Чалуулар таржымалы" "Бардыгы" "Кабыл алынбагандар" - "Үнкат" "Тез терүү" "Чалуулар таржымалы" "Байланыштар" "Үн почтасы" - "Тандамалдардан өчүрүлдү" - "Кайтаруу" "Чалуу %s" "Жаңы байланыш түзүү" "Байланышка кошуу" "SMS жөнөтүү" "Видео түрүндө чалуу" "Номерди бөгөттөө" - "%s жаңы өткөзүлгөн чалуу" "Азырынча тез териле турган номерлер жок" "Сүйүктүү номер кошуу" - "Азырынча бир дагы байланышыңыз жок" - "Байланыш кошуу" - "Бардык номерлерди көрүү үчүн, сүрөткө тийип коюңуз же коё бербей басып туруп иретин өзгөртсөңүз болот." "Алып салуу" + "Баарын тандоо" "Видео чалуу" "Билдирүү жөнөтүү" "Чалуунун чоо-жайы" @@ -164,25 +118,14 @@ "^1 чалуу" "^1 видео чалуу." "^1 үн катын угуу" - "Үн почтасын ^1 дегенден ойнотуу" - "Үн почтасын ^1 дегенден тындыруу" - "Үн почтасын ^1 дегенден жок кылуу" - - %d жаңы үн почтасы - %d жаңы үн почтасы - "^1 номери үчүн байланыш түзүү" "^1 учурдагы байланышка кошуу" "^1 чалуу чоо-жайы" - "Чалуулар таржымалынан жок кылынды" "Бүгүн" "Кечээ" "Мурункураак" - "Чалуулар тизмеси" "Катуу сүйлөткүч күйгүзүлгөн." "Катуу сүйлөткүч өчүрүлгөн." - "Тезирээк ойнотуу." - "Жайыраак ойнотуу." "Ойнотуп баштоо же бир азга токтотуу" "Көрсөтүү параметрлери" "Үндөр жана дирилдөө" @@ -199,7 +142,6 @@ "Чалуулар" "Чалууларды бөгөттөө" "Үн почтасы" - "Үн почтанын жөндөөлөрү үчүн SIM картаны тандаңыз" "Чалууну бөгөттөө убактылуу өчүрүлгөн" "Акыркы 48 саат ичинде бул телефондон өзгөчө кырдаал кызматына байланышкандыктан чалууну бөгөттөө өчүрүлдү. 48 сааттык мөөнөтү аяктагандан кийин ал автоматтык түрдө кайра иштетилет." "Номерлерди импорттоо" @@ -213,12 +155,8 @@ "Бөгөттөлгөн номерлер" "%1$s мурунтан эле бөгөттөлгөн." "Чалуу каттоо эсептери" - "Күйгүзүү" - "Уруксаттарды берүү" "Тез терүүнү иштетүү үчүн, \"Байланыштар\" колдонмосуна уруксат бериңиз." "Чалуулар таржымалыңызды көрүү үчүн, \"Телефон\" колдонмосуна уруксат бериңиз." - "Байланыштар тизмесин көрүү үчүн, \"Байланыштар\" колдонмосуна уруксат бериңиз." - "Үн почтаңызга кирүү үчүн, \"Телефон\" колдонмосуна уруксат бериңиз." "Байланыштарыңызды издөө үчүн, Байланыштарга уруксатты күйгүзүңүз." "Чалуу үчүн, \"Телефон\" колдонмосуна уруксат бериңиз." "Телефон колдонмосунун Тутум жөндөөлөрүнө жазууга уруксаты жок." @@ -230,4 +168,10 @@ "Спам" "%1$s оффлайн режиминде болгондуктан, байланышууга болбойт" "Колдонмо жөнүндө" + "Google тарабынан чечмеленди" + "Күтө туруңуз..." + "Чечмелөө жеткиликсиз." + "Карап көрүү" + "Чалуу жок кылынды. Билдирүүлөр колдонмосунда чалуу убагында жөнөтүлгөн файлдарды текшерип, жок кылыңыз." + "Чалуулар жок кылынды. Билдирүүлөр колдонмосунда чалуулар убагында жөнөтүлгөн файлдарды текшерип, жок кылыңыз." diff --git a/java/com/android/dialer/app/res/values-lo/strings.xml b/java/com/android/dialer/app/res/values-lo/strings.xml index 8284e8de0..cecb84344 100644 --- a/java/com/android/dialer/app/res/values-lo/strings.xml +++ b/java/com/android/dialer/app/res/values-lo/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ໂທລະສັບ" "ແປ້ນກົດໂທລະສັບ" - "ໂທລະສັບ" "ປະຫວັດການໂທ" - "ລາຍງານໝາຍເລກທີ່ບໍ່ຖືກຕ້ອງ" "ອັດ​ສຳ​ເນົາ​ໝາຍເລກ" "ອັດ​ສຳ​ເນົາ​ການ​ກ່າຍ​ເປັນ​ໜັງ​ສື" - "ບ​ລັອກ​ໝາຍເລກ" - "ປົດ​ບ​ລັອກ​ໝາຍເລກ" "ແກ້ໄຂໝາຍເລກກ່ອນໂທ" "ລຶບ​ປະ​ຫວັດ​ການ​ໂທ​" "ລຶບຂໍ້ຄວາມສຽງ" @@ -34,7 +30,6 @@ "ລຶບ​ປະ​ຫວັດ​ການ​ໂທ​ບໍ?" "ອັນ​ນີ້​ຈະ​ລຶບ​ທຸກ​ສາຍ​ໂທ​ຈາກ​ປະ​ຫວັດ​ຂອງ​ທ່ານ" "ກຳ​ລັງ​ລຶບ​ປະ​ຫວັດ​ການ​ໂທ…" - "ໂທລະສັບ" "ສາຍທີ່ບໍ່ໄດ້ຮັບ" "ສາຍບໍ່ໄດ້ຮັບຈາກບ່ອນເຮັດວຽກ" "ສາຍທີ່ບໍ່ໄດ້ຮັບ" @@ -48,107 +43,66 @@ %1$d ຂໍ້ຄວາມສຽງ ຂໍ້ຄວາມສຽງ - "ຫຼິ້ນ" "%1$s, %2$s" "ບໍ່ມີຂໍ້ຄວາມສຽງຈາກ %1$s" "ບໍ່​ສາ​ມາດ​ຫຼິ້ນ​ຂໍ້​ຄວາມ​ສຽງ​ໄດ້" "ກຳ​ລັງ​ໂຫຼດ​ຂໍ້​ຄວາມ​ສຽງ…" - "ກຳລັງຈັດເກັບຂໍ້ຄວາມສຽງເຂົ້າແຟ້ມ…" "ບໍ່​ສາ​ມາດ​ໂຫຼດ​ຂໍ້​ຄວາມ​ສຽງ​ໄດ້" - "ເບີໂທຂໍ້ຄວາມສຽງເທົ່ານັ້ນ" - "ສາຍໂທເຂົ້າເທົ່ານັ້ນ" - "ເບີໂທອອກເທົ່ານັ້ນ" - "ສະເພາະສາຍທີ່ບໍ່ໄດ້ຮັບ" "(%1$d) %2$s" - "ຊອກຫາ" - "ປຸ່ມໂທ" - "ໝາຍເລກທີ່ຈະໂທ" - "​ຫຼິ້ນ ຫຼື​ຢຸດ​ການຫຼິ້ນ" "​ປິດຫຼື​ເປີດ​ລຳ​ໂພງ​ມື​ຖື" "​ຊອກ​ຫາ​ຕຳ​​ແໜ່ງ​ຫຼິ້ນ" - "ຫຼ​ຸດ​ອັດ​ຕາ​ການຫຼິ້ນ" - "​ເພີ​່ມ​ອັດ​ຕາ​ການຫຼິ້ນ" "ປະຫວັດການໂທ" "ໂຕເລືອກເພີ່ມເຕີມ" "ແປ້ນກົດ" - "ສະແດງສະເພາະສາຍໂທອອກ" - "ສະແດງສະເພາະສາຍໂທເຂົ້າ" - "ສະແດງສະເພາະສາຍບໍ່ໄດ້ຮັບ" - "ສະແດງສະເພາະຂໍ້ຄວາມສຽງ" - "ສະແດງການໂທທັງໝົດ" - "ເພີ່ມການຂັ້ນເວລາ 2 ວິນາທີ" - "ເພີ່ມການລໍຖ້າ" "ການ​ຕັ້ງ​ຄ່າ" "ຕົວຈຳລອງ" - "ລາຍຊື່ຜູ່ຕິດຕໍ່ທັງໝົດ" - "ໃຊ້ປຸ່ມກົດສັນຍານສຽງ" - "ກັບໄປການໂທທີ່ກຳລັງດຳເນີນຢູ່" - "ເພີ່ມການໂທ" - "ສາຍໂທເຂົ້າ" - "ເປີດຂໍ້ຄວາມສຽງ" - "ເບິ່ງລາຍຊື່ຜູ່ຕິດຕໍ່ %1$s" - "ໂທຫາ %1$s" + "ສ້າງປຸ່ມລັດສ່ວນຕິດຕໍ່ຜູ້ໃຊ້ໃໝ່" + "ກຳລັງເຂົ້າໂໝດຄຳສັ່ງຈຳນວນຫຼາຍ" + "ອອກຈາກໂໝດຄຳສັ່ງຈຳນວນຫຼາຍແລ້ວ" + "ເລືອກ %1$s ແລ້ວ" + "ເຊົາເລືອກ %1$s ແລ້ວ" "ລາຍລະອຽດ​ລາຍຊື່​ຜູ່ຕິດຕໍ່​ສຳລັບ %1$s" "ລາຍລະອຽດການຕິດຕໍ່ສຳລັບຜູ້ໂທທີ່ສົງໄສວ່າເປັນສະແປມ %1$s" "%1$s ການໂທ." "ການ​ໂທ​ດ້ວຍ​ວິ​ດີ​ໂອ." - "ສົ່ງ SMS ຫາ %1$s" - "ຂໍ້ຄວາມສຽງທີ່ຍັງບໍ່ໄດ້ຟັງ" "ເລີ່ມການຊອກຫາດ້ວຍສຽງ" - "ໂທ​ຫາ %s" "ຂໍ້ຄວາມສຽງ" - "%s ວິນາທີ" - "%s ນ​ທ %s ວິ" - "ຂໍ້ຄວາມສຽງ" - "ຂໍ້ຄວາມສຽງ" - "ແມ່ນແລ້ວ" - "ບໍ່" - "ລຶບ %1$s ທີ່ເລືອກອອກໄປບໍ?" + "ຍົກເລີກໂໝດຄຳສັ່ງເປັນຊຸດ" + "ລຶບ" + "ຍົກເລີກ" + "ເລືອກ %1$s ລາຍການແລ້ວ" + + ""ລຶບຂໍ້ຄວາມສຽງເຫຼົ່ານີ້ບໍ? "" + ""ລຶບຂໍ້ຄວາມສຽງນີ້ບໍ? "" + @string/call_log_header_today "%1$s ເວລາ %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "ບໍ່​ສາ​ມາດ​ໂທ​ຫາ​ເບີ​ນີ້​ໄດ້" - "ເພື່ອຕັ້ງຄ່າຂໍ້ຄວາມສຽງ, ໃຫ້ໄປທີ່ ເມນູ > ການຕັ້ງຄ່າ." - "ເພື່ອໂທຫາເບີຂໍ້ຄວາມສຽງ, ທ່ານຕ້ອງປິດໂໝດຢູ່ໃນຍົນກ່ອນ." - "ກຳລັງໂຫລດ..." - "IMEI" - "MEID" - "ກຳລັງໂຫລດຈາກ SIM card..." - "ລາຍຊື່ຜູ່ຕິດຕໍ່ SIM card" - "ບໍ່​ມີ​ແອັບຯ​ລາຍ​ຊື່​ຕິດ​ຕໍ່​ຢູ່" "ບໍ່​ມີ​ການ​ຊອກ​ຫາ​ດ້ວຍ​ສຽງ​ຢູ່" - "ບໍ່​ສາ​ມາດ​ໂທ​ໄດ​້​ເນື່ອງ​ຈາກ​ແອັບ​ພ​ລິ​ເຄ​ຊັນ​ໂທ​ລະ​ສັບ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໄວ້." "ຊອກຫາລາຍຊື່ຜູ່ຕິດຕໍ່" "ເພີ່ມ​ເບີ​ໂທ​ລະ​ສັບ ຫຼື ຊອກ​ຫາ​ລາຍ​ຊື່​ຕິດ​ຕໍ່" "ປະ​ຫວັດ​ການ​ໂທ​ຂອງ​ທ່ານ​ຫວ່າງ​ເປົ່າ" "​ໂທ​ອອກ" "ທ່ານບໍ່ມີສາຍທີ່ບໍ່ໄດ້ຮັບ." "ກ່ອງເຂົ້າ​ຂໍ້​ຄວາມ​ສຽງ​ຂອງ​ທ່ານ​ຫວ່າງ​ເປົ່າ." - "ສະ​ແດງ​ສະເພາະລາຍການທີ່ນິຍົມເທົ່ານັ້ນ" "ປະຫວັດການໂທ" "ທັງໝົດ" "ສາຍທີ່ບໍ່ໄດ້ຮັບ" - "ຂໍ້ຄວາມສຽງ" "ການ​ໂທ​ດ່ວນ" "ປະຫວັດການໂທ" "ລາຍ​ຊື່​ຜູ່​ຕິດ​ຕໍ່" "ຂໍ້ຄວາມສຽງ" - "ລຶບອອກຈາກລາຍການທີ່ມັກແລ້ວ" - "ຍົກເລີກ" "ໂທ​ຫາ %s" "ສ້າງລາຍຊື່ຜູ້ຕິດຕໍ່ໃໝ່" "ເພີ່ມ​ໃສ່​ລາຍ​ຊື່" "ສົ່ງ SMS" "​ໂທ​ອອກ​ດ້ວຍ​ວິ​ດີ​ໂອ" "ບ​ລັອກ​ໝາຍ​ເລກ" - "%s ສາຍທີ່ບໍ່ໄດ້ຮັບໃໝ່" "ບໍ່​ມີ​ຜູ້​ໃດ​ຢູ່​ໃນ​ການ​ໂທ​ດ່ວນ​ຂອງ​ທ່ານ​ເທື່ອ" "ເພີ່ມ​ລາຍ​ການ​ທີ່​ມັກ" - "ທ່ານ​ບໍ່​ມີ​ລາຍ​ຊື່​ໃດ​ເທື່ອ" - "ເພີ່ມ​ລາຍ​ຊື່" - "ແຕະຮູບເພື່ອເບິ່ງເບີໂທທັງໝົດ ຫຼື ແຕະຄ້າງໄວ້ເພື່ອຈັດລຳດັບໃໝ່" "​ລຶບ​ອອກ" + "ເລືອກທັງໝົດ" "​ໂທ​ດ້ວຍ​ວິ​ດີ​ໂອ" "ສົ່ງຂໍ້ຄວາມ" "ລາຍລະອຽດ​ການໂທ" @@ -164,25 +118,14 @@ "ໂທ​ຫາ ^1" "ການ​ໂທວິ​ດີ​ໂອ ^1." "​ຟັງ​ຂໍ້​ຄວາມ​ສຽງ​ຈາກ ^1" - "ຫຼິ້ນຂໍ້ຄວາມສຽງຈາກ ^1" - "ຢຸດຂໍ້ຄວາມສຽງຈາກ ^1" - "ລຶບຂໍ້ຄວາມສຽງຈາກ ^1" - - %d ຂໍ້​ຄວາມ​ສຽງ​ໃໝ່ - %d ຂໍ້​ຄວາມ​ສຽງ​ໃໝ່ - "ສ້າງ​ລາຍ​ຊື່​ສຳ​ລັບ ^1" "ເພີ່ມ ^1 ໃສ່​ລາຍ​ຊື່​ທີ່​ມີ​ຢູ່" "ລາຍລະອຽດ​ການ​ໂທ​ສຳລັບ ^1" - "ລຶບ​ຈາກ​ປະ​ຫວັດ​ການ​ໂທ​ແລ້ວ" "ມື້ນີ້" "ມື້​ວານ​ນີ້" "ເກົ່າກວ່າ" - "ບັນ​ຊີ​ລາຍ​ຊື່​ໂທ" "ເປີດ​ລຳໂພງ." "ປິດ​ລຳໂພງ." - "ຫຼິ້ນໄວຂຶ້ນ." - "ຫຼິ້ນຊ້າລົງ." "ເລີ່ມຫຼືຢຸດ​ການ​ຫຼິ້ນຊົ່ວຄາວ." "ຕົວເລືອກການສະແດງຜົນ" "ສຽງ ແລະ ການສັ່ນ" @@ -199,7 +142,6 @@ "​ການ​ໂທ" "ການບລັອກສາຍ" "ຂໍ້ຄວາມສຽງ" - "ເລືອກຊິມສຳລັບການຕັ້ງຄ່າຂໍ້ຄວາມສຽງ" "ການບ​ລັອກ​ສາຍ​ໂທ​ປິດ​ຊົ່ວ​ຄາວ" "ການບ​ລັອກ​ສາຍ​ໂທ​ຖືກ​ປິດ​ໃຊ້​ງານ​ແລ້ວ ເພາະ​ວ່າ​ທ່ານ​ໄດ້​ຕິດ​ຕໍ່​ຫາ​ຝ່າຍ​ບໍ​ລິ​ການ​ສຸກ​ເສີນ​ຈາກ​ໂທ​ລະ​ສັບ​ນີ້​ພາຍ​ໃນ 48 ຊົ່ວ​ໂມງ​ສຸດ​ທ້າຍ. ມັນ​ຈະ​ຖືກ​ເປີດ​ໃຊ້​ງານ​ອີກ​ໂດຍ​ອັດ​ຕະ​ໂນ​ມັດ ເມື່ອ​ໝົດ​ໄລ​ຍະ 48 ຊົ່ວ​ໂມງ​ໄປ​ແລ້ວ." "ນຳ​ຕົວ​ເລກ​ເຂົ້າ" @@ -213,12 +155,8 @@ "ເບີໂທລະສັບທີ່ບລັອກໄວ້" "%1$s ຖືກ​ບ​ລັອກ​ແລ້ວ." "ບັນ​ຊີ​ໂທ" - "ເປີດ​" - "ຕັ້ງ​ການ​ອະ​ນຸ​ຍາດ" "ເພື່ອ​ເປີດ​ໃຊ້​ງານ​ການໂທດ່ວນ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ລາຍ​ຊື່." "ເພື່ອ​ເບິ່ງ​ບັນ​ທຶກ​ການ​ໂທ​ຂອງ​ທ່ານ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ." - "ເພື່ອ​ເບິ່ງ​ລາຍ​ຊື່​ຂອງ​ທ່ານ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ລາຍ​ຊື່" - "ເພື່ອ​ເຂົ້າ​ຫາ​ຂໍ້​ຄວາມ​ສຽງ​ຂອງ​ທ່ານ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ." "ເພື່ອຄົ້ນຫາລາຍາຊື່ຂອງທ່ານ, ໃຫ້ເປີດການອະນຸຍາດລາຍຊື່." "ເພື່ອ​ເຮັດການໂທ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ." "ແອັບໂທລະສັບບໍ່ມີການອະນຸຍາດໃຫ້ຂຽນໃສ່ການຕັ້ງຄ່າລະບົບ." @@ -230,4 +168,10 @@ "ສະແປມ" "%1$s ອອບລາຍຢູ່ ແລະ ບໍ່ສາມາດຕິດຕໍ່ຫາໄດ້" "ກ່ຽວກັບ" + "ຖອດຂໍ້ຄວາມໂດຍ Google" + "Google ກຳລັງຖອດຂໍ້ຄວາມ..." + "ບໍ່ມີການຖອດຂໍ້ຄວາມ" + "ເບິ່ງ" + "ລຶບການໂທແລ້ວ. ເບິ່ງ ແລະ ລຶບໄຟລ໌ແນບທີ່ແບ່ງປັນໃນລະຫວ່າງການໂທນີ້ຢູ່ Messages ໄດ້." + "ລຶບການໂທແລ້ວ. ເບິ່ງ ແລະ ລຶບໄຟລ໌ແນບທີ່ແບ່ງປັນໃນລະຫວ່າງການໂທຕ່າງໆຢູ່ Messages ໄດ້." diff --git a/java/com/android/dialer/app/res/values-lt/strings.xml b/java/com/android/dialer/app/res/values-lt/strings.xml index a346d5d0a..d68a4735e 100644 --- a/java/com/android/dialer/app/res/values-lt/strings.xml +++ b/java/com/android/dialer/app/res/values-lt/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefonas" "Telefono klaviatūra" - "Telefonas" "Skambučių istorija" - "Pranešti apie netikslų numerį" "Kopijuoti numerį" "Kopijuoti transkribuotą tekstą" - "Blokuoti numerį" - "Panaikinti numerio blokavimą" "Redaguoti numerį prieš skambinant" "Išvalyti skambučių istoriją" "Ištrinti balso pašto pranešim." @@ -34,7 +30,6 @@ "Išvalyti skambučių istoriją?" "Bus ištrinti visi skambučiai iš istorijos" "Išvaloma skambučių istorija..." - "Telefonas" "Praleistas skambutis" "Praleistas darbo skambutis" "Praleisti skambučiai" @@ -50,107 +45,68 @@ %1$d balso pašto pranešimo %1$d balso pašto pranešimų - "Paleisti" "%1$s, %2$s" "Nauji b. pašto pran. iš %1$s" "Nepavyko paleisti balso pašto pranešimo" "Įkeliamas balso pašto pranešimas..." - "Archyvuojami balso pašto pranešimai…" "Nepavyko įkelti balso pašto pranešimo" - "Tik skambučiai su balso paštu" - "Tik gaunami skambučiai" - "Tik siunčiami skambučiai" - "Tik praleisti skambučiai" "(%1$d) %2$s" - "ieškoti" - "rinkti numerį" - "renkamas numeris" - "Paleisti arba sustabdyti atkūrimą" "Įjungti arba išjungti garsiakalbį" "Ieškoti atkūrimo pozicijos" - "Sumažinti atkūrimo spartą" - "Padidinti atkūrimo spartą" "Skambučių istorija" "Daugiau parinkčių" "klaviatūra" - "Rodyti tik išsiunčiamus" - "Rodyti tik gaunamus" - "Rodyti tik praleistus" - "Rodyti tik balso pšt. praneš." - "Rodyti visus skambučius" - "Pridėti 2 sek. pauzę" - "Pridėti laukimą" "Nustatymai" "Simuliatorius" - "Visi kontaktai" - "Naudoti jutiklinę klaviatūrą" - "Grįžti prie vykdomo skambučio" - "Pridėti skambutį" - "Gaunami skambučiai" - "Paleisti balso pašto pranešimus" - "Žiūrėti kontaktą %1$s" - "Skambinti %1$s" + "Sukurti naują NS spart. klav." + "Įjungiamas masinių veiksmų režimas" + "Masinių veiksmų režimas išjungtas" + "Pasirinkta: %1$s" + "Pasirinkimas atšauktas: %1$s" "Išsami kontaktinė informacija: %1$s" "Išsami kontaktinė įtartino skambintojo dėl šlamšto informacija: %1$s" "Skambučių: %1$s." "Vaizdo skambutis." - "Siųsti SMS %1$s" - "Neklausytas balso pašto pranešimas" "Pradėti paiešką balsu" - "Skambinti %s" "Balso paštas" - "%s sek." - "%s min. %s sek." - "balso pašto praneš." - "balso pašto praneš." - "Taip" - "Ne" - "Ištrinti pasir. %1$s?" + "Atšaukti masinių veiksmų režimą" + "Ištrinti" + "Atšaukti" + "Pasirinkta: %1$s" + + ""Ištrinti šiuos balso pašto pranešimus? "" + ""Ištrinti šiuos balso pašto pranešimus? "" + ""Ištrinti šiuos balso pašto pranešimus? "" + ""Ištrinti šiuos balso pašto pranešimus? "" + @string/call_log_header_today "%1$s, %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Negalima skambinti šiuo numeriu" - "Jei norite nustatyti balso paštą, eikite į meniu > „Nustatymai“." - "Jei norite skambinti į balso paštą, išjunkite lėktuvo režimą." - "Įkeliama..." - "IMEI" - "MEID" - "Įkeliama iš SIM kortelės..." - "SIM kortelės adresatai" - "Nepasiekiama jokia kontaktų programa" "Paieška balsu nepasiekiama" - "Negalima skambinti telefonu, nes Telefono programa išjungta." "Ieškoti adresatų" "Prid. nr. arba iešk. kontaktų" "Skambučių istorija yra tuščia" "Skambinti" "Nėra jokių praleistų skambučių." "Balso pašto gautųjų aplankas yra tuščias." - "Rodyti tik mėgstamiausius" "Skambučių istorija" "Visi" "Praleisti" - "Balso paštas" "Spartusis rinkimas" "Skambučių istorija" "Kontaktai" "Balso paštas" - "Pašalintas iš adresyno" - "Anuliuoti" "Skambinti %s" "Kurti naują kontaktą" "Pridėti prie kontakto" "Siųsti SMS" "Atlikti vaizdo skambutį" "Blokuoti numerį" - "Naujų praleistų skambučių: %s" "Dar nieko neįtraukėte į sparčiojo rinkimo sąrašą" "Pridėti mėgstamiausią" - "Dar neturite kontaktų" - "Pridėti kontaktą" - "Palieskite vaizdą, kad peržiūrėtumėte visus numerius, arba palieskite ir palaikykite, kad pertvarkytumėte" "Pašalinti" + "Pasirinkti viską" "Vaizdo skambutis" "Siųsti pranešimą" "Išsami skambučio informacija" @@ -166,27 +122,14 @@ "Skambinti ^1" "Vaizdo skambutis ^1." "Klausyti balso pašto nuo ^1" - "Leisti balso pašto pranešimą iš ^1" - "Pristabdyti balso pašto pranešimą iš ^1" - "Ištrinti balso pašto pranešimą iš ^1" - - %d naujas balso pašto pranešimas - %d nauji balso pašto pranešimai - %d naujo balso pašto pranešimo - %d naujų balso pašto pranešimų - "Sukurti ^1 kontaktą" "Pridėti ^1 prie esamo kontakto" "Išsami skambučio informacija (^1)" - "Ištrinta iš skambučių istorijos" "Šiandien" "Vakar" "Senesni" - "Skambučių sąrašas" "Įjungti garsiakalbį." "Išjungti garsiakalbį." - "Leisti greičiau." - "Leisti lėčiau." "Pradėti arba pristabdyti atkūrimą." "Pateikties parinktys" "Garsai ir vibravimas" @@ -203,7 +146,6 @@ "Skambučiai" "Skambučių blokavimas" "Balso paštas" - "Pasir. balso pšt. nust. SIM k." "Skamb. blokavimo funkcija laikinai išj." "Skambučių blokavimo funkcija buvo išjungta, nes iš šio telefono buvote susisiekę su pagalbos tarnybomis per pastarąsias 48 val. Ši funkcija bus automatiškai įgalinta iš naujo, kai 48 val. laikotarpis pasibaigs." "Importuoti numerius" @@ -217,12 +159,8 @@ "Užblokuoti numeriai" "%1$s jau užblokuotas." "Skambinimo paskyros" - "Įjungti" - "Nustatyti leidimus" "Jei norite įgalinti spartųjį rinkimą, įjunkite Kontaktų programos leidimą." "Jei norite peržiūrėti skambučių žurnalą, įjunkite Telefono programos leidimą." - "Jei norite peržiūrėti kontaktus, įjunkite Kontaktų programos leidimą." - "Jei norite pasiekti balso paštą, įjunkite Telefono programos leidimą." "Kad galėtumėte ieškoti kontaktų, įjunkite Kontaktų leidimus." "Jei norite paskambinti, įjunkite Telefono programos leidimą." "Telefono programa neturi leidimo keisti sistemos nustatymų." @@ -234,4 +172,10 @@ "Šlamštas" "%1$s yra neprisijungęs (-usi) ir su juo (ja) negalima susisiekti" "Apie" + "Transkribavo „Google“" + "„Google“ transkribuoja..." + "Scenarijus nepasiekiamas" + "Peržiūrėti" + "Skambutis ištrintas. Peržiūrėkite ir ištrinkite priedus, kurie buvo bendrinti per šį skambutį programoje „Messages“." + "Skambučiai ištrinti. Peržiūrėkite ir ištrinkite priedus, kurie buvo bendrinti per skambučius programoje „Messages“." diff --git a/java/com/android/dialer/app/res/values-lv/strings.xml b/java/com/android/dialer/app/res/values-lv/strings.xml index 808d7bfb7..e12ade02a 100644 --- a/java/com/android/dialer/app/res/values-lv/strings.xml +++ b/java/com/android/dialer/app/res/values-lv/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Tālrunis" "Tālruņa cipartastatūra" - "Zvanīt" "Zvanu vēsture" - "Ziņot par nepareizu numuru" "Kopēt numuru" "Kopēt transkripciju" - "Bloķēt numuru" - "Atbloķēt numuru" "Rediģēt numuru pirms zvanīšanas" "Dzēst zvanu vēsturi" "Dzēst balss pasta ziņojumu" @@ -34,7 +30,6 @@ "Vai dzēst zvanu vēsturi?" "Tiks dzēsti visi vēsturē saglabātie zvani." "Notiek zvanu vēstures dzēšana…" - "Tālruņa zvans" "Neatbildēts zvans" "Neatbildēts darba zvans" "Neatbildēti zvani" @@ -49,107 +44,67 @@ %1$d balss pasta ziņojums %1$d balss pasta ziņojumi - "Atskaņot" "%1$s, %2$s" "Jauns b. pasta ziņ. no: %1$s" "Nevarēja atskaņot balss pasta ziņojumu." "Notiek balss pasta ziņojumu ielāde…" - "Tiek arhivēts balss pasta ziņojums…" "Nevarēja ielādēt balss pasta ziņojumu." - "Tikai balss pasta zvani" - "Tikai ienākošie zvani" - "Tikai izejošie zvani" - "Tikai neatbildētie zvani" "(%1$d) %2$s" - "meklēt" - "sastādīt numuru" - "sastādītais numurs" - "Atskaņot vai apturēt atskaņošanu" "Ieslēgt vai izslēgt mikrofonu ar skaļruni" "Meklēt atskaņošanas pozīciju" - "Samazināt atskaņošanas ātrumu" - "Palielināt atskaņošanas ātrumu" "Zvanu vēsture" "Vairāk opciju" "cipartastatūra" - "Rādīt tikai izejošos zvanus" - "Rādīt tikai ienākošos zvanus" - "Rādīt tikai neatbildētos zvanus" - "Rādīt tikai balss pasta ziņ." - "Rādīt visus zvanus" - "Pievienot 2 sekundes ilgu pauzi" - "Pievienot gaidīšanu" "Iestatījumi" "Simulators" - "Visas kontaktpersonas" - "Izmantot skārientoņu tastatūru" - "Atgriezties pie pašreizējā zvana" - "Pievienot zvanu" - "Ienākošie zvani" - "Atskaņot balss pasta ziņojumu" - "Skatīt kontaktpersonu %1$s" - "Zvanīt: %1$s" + "Jaunās liet. saskarnes saīsne" + "Tiek atvērts lielapjoma darbību režīms" + "Tika aizvērts lielapjoma darbību režīms" + "Atlasīt: %1$s" + "Noņemt atlasi: %1$s" "Kontaktpersonas informācija: %1$s" "Nevēlama zvanītāja (%1$s) kontaktinformācija" "%1$s zvani." "Videozvans" - "Sūtīt īsziņu šai kontaktpersonai: %1$s" - "Nenoklausīti balss pasta ziņojumi" "Sākt meklēšanu ar balsi" - "Zvanīt: %s" "Balss pasts" - "%s s" - "%s min %s s" - "balss pasta ziņojums" - "balss pasta ziņojumi" - "Jā" - "Nē" - "Vai dzēst atlasi: %1$s?" + "Iziet no grupas darbību režīma" + "Dzēst" + "Atcelt" + "Atlasīti: %1$s" + + ""Vai dzēst šos balss pasta ziņojumus? "" + ""Vai dzēst šos balss pasta ziņojumus? "" + ""Vai dzēst šos balss pasta ziņojumus? "" + @string/call_log_header_today "%1$s plkst. %2$s" "%1$02d:%2$02d" "%1$s • %2$s" - "Uz šo numuru nevar piezvanīt." - "Lai iestatītu balss pastu, pārejiet uz sadaļu Izvēlne > Iestatījumi." - "Lai piekļūtu balss pastam, vispirms izslēdziet lidojuma režīmu." - "Notiek ielāde..." - "IMEI" - "MEID" - "Notiek ielāde no SIM kartes..." - "Kontaktpersonas SIM kartē" - "Nav pieejama neviena kontaktpersonu lietotne." "Meklēšana ar balsi nav pieejama." - "Nevar veikt tālruņa zvanu, jo lietojumprogramma Tālrunis tika atspējota." "Meklēt kontaktpersonas" "Pievienojiet numuru vai meklējiet kontaktpersonas" "Jūsu zvanu vēsturē nav ierakstu." "Zvanīt" "Jums nav neatbildētu zvanu." "Jūsu balss pasta iesūtne ir tukša." - "Rādīt tikai izlasi" "Zvanu vēsture" "Visi" "Neatb." - "Balss p." "Ātrie zvani" "Zvanu vēsture" "Kontaktpersonas" "Balss pasts" - "Noņemts no izlases" - "Atsaukt" "Zvanīt: %s" "Izveidot jaunu kontaktpersonu" "Pievienot kontaktpersonai" "Sūtīt īsziņu" "Veikt videozvanu" "Bloķēt numuru" - "Jauni neatbildēti zvani: %s" "Ātro zvanu sarakstā vēl nav nevienas kontaktpersonas." "Pievienot izlasei" - "Jums vēl nav nevienas kontaktpersonas." - "Pievienot kontaktpersonu" - "Pieskarieties attēlam, lai skatītu visus numurus, vai pieskarieties attēlam un turiet to, lai veiktu pārkārtošanu." "Noņemt" + "Atlasīt visu" "Videozvans" "Sūtīt ziņojumu" "Informācija par zvanu" @@ -165,26 +120,14 @@ "Zvanīt: ^1" "Zvaniet kontaktpersonai ^1, izmantojot videozvanu." "Klausīties balss pasta ziņojumu no: ^1" - "Atskaņot balss pasta ziņojumu no: ^1" - "Pārtraukt balss pasta ziņojuma atskaņošanu no: ^1" - "Dzēst balss pasta ziņojumu no: ^1" - - %d jauni balss pasta ziņojumi - %d jauns balss pasta ziņojums - %d jauni balss pasta ziņojumi - "Izveidojiet kontaktpersonu, izmantojot vienumu ^1." "Pievienojiet vienumu ^1 esošai kontaktpersonai." "Zvanu informācija par šādu numuru: ^1" - "Dzēsts no zvanu vēstures." "Šodien" "Vakar" "Vecāki zvani" - "Zvanu saraksts" "Ieslēgt skaļruni." "Izslēgt skaļruni." - "Atskaņot ātrāk." - "Atskaņot lēnāk." "Sākt vai apturēt atskaņošanu." "Attēlojuma opcijas" "Skaņas un vibrācija" @@ -201,7 +144,6 @@ "Zvani" "Zvanu bloķēšana" "Balss pasts" - "SIM — balss pasta iestatījumi" "Zvanu bloķēšana ir īslaicīgi izslēgta" "Zvanu bloķēšana ir atspējota, jo pēdējo 48 stundu laikā jūs sazinājāties ar ārkārtas palīdzības dienestiem, izmantojot šo tālruni. Zvanu bloķēšana tiks automātiski iespējota, tiklīdz beigsies 48 stundu periods." "Importēt numurus" @@ -215,12 +157,8 @@ "Bloķētie numuri" "%1$s jau ir bloķēts." "Zvanu konti" - "Ieslēgt" - "Iestatīt atļaujas" "Lai iespējotu ātros zvanus, ieslēdziet atļauju Kontaktpersonas." "Lai skatītu zvanu žurnālu, ieslēdziet atļauju Tālrunis." - "Lai skatītu kontaktpersonas, ieslēdziet atļauju Kontaktpersonas." - "Lai piekļūtu balss pastam, ieslēdziet atļauju Tālrunis." "Lai meklētu savas kontaktpersonas, ieslēdziet atļauju Kontaktpersonas." "Lai veiktu zvanu, ieslēdziet atļauju Tālrunis." "Tālruņa lietotnei nav atļaujas rakstīt sistēmas iestatījumos." @@ -232,4 +170,10 @@ "Nevēlami zvani" "Lietotājs %1$s ir bezsaistē un nav sasniedzams" "Par" + "Transkribēja: Google" + "Google transkribē…" + "Transkripcija nav pieejama" + "Skatīt" + "Zvans izdzēsts. Skatiet un dzēsiet pielikumus, kas kopīgoti šī zvana laikā, izmantojot lietotni Ziņojumi." + "Zvani izdzēsti. Skatiet un dzēsiet pielikumus, kas kopīgoti šo zvanu laikā, izmantojot lietotni Ziņojumi." diff --git a/java/com/android/dialer/app/res/values-mk/strings.xml b/java/com/android/dialer/app/res/values-mk/strings.xml index 6d2e533a5..6e3512c28 100644 --- a/java/com/android/dialer/app/res/values-mk/strings.xml +++ b/java/com/android/dialer/app/res/values-mk/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Телефон" "Тастатура за бирање на телефон" - "Телефон" "Историја на повици" - "Пријави неточен број" "Копирај го бројот" "Копирај транскрипција" - "Блокирај го бројот" - "Одблокирај го бројот" "Уредете го бројот пред повикот" "Избришете историја на повици?" "Избришете ја говорната пошта" @@ -34,7 +30,6 @@ "Избришете историја на повици?" "Ова ќе ги избрише сите повици од историјата" "Се чисти историјата на повици…" - "Телефон" "Пропуштен повик" "Пропуштен работен повик" "Пропуштени повици" @@ -48,107 +43,66 @@ %1$d говорна порака %1$d говорни пораки - "Пушти" "%1$s, %2$s" "Нова говорна пошта од %1$s" "Говорната пошта не можеше да се репродуцира" "Се вчитува говорната пошта…" - "Говорната пошта се архивира…" "Говорната пошта не можеше да се вчита" - "Само повици со говорна пошта" - "Само дојдовни повици" - "Само појдовни повици" - "Само пропуштени повици" "(%1$d) %2$s" - "пребарај" - "бирај" - "број за бирање" - "Пуштете или запрете репродукција" "Вклучете или исклучете интерфон" "Барајте позиција на репродукција" - "Намалете брзина на репродукција" - "Зголемете брзина на репродукција" "Историја на повици" "Повеќе опции" "тастатура за бирање" - "Прикажи само појдовни" - "Прикажи само дојдовни" - "Прикажи само пропуштени" - "Прикажи само говорни пораки" - "Прикажи ги сите повици" - "Додај пауза од 2 сек" - "Додај почекај" "Поставки" "Симулатор" - "Сите контакти" - "Користи тастатура со звуци на допир" - "Врати се на повик во тек" - "Додај повик" - "Дојдовни повици" - "Преслушај говорна пошта" - "Прикажи контакт %1$s" - "Повикај %1$s" + "Создај крат. за нов интерфејс" + "Влегувате во режим на групно дејство" + "Излеговте од режим на групно дејство" + "Избрано е %1$s" + "Поништен е изборот на %1$s" "Детали за контакт за %1$s" "Детали за контакт за повици што се можен спам %1$s" "%1$s повици." "Видеоповик." - "Испратете SMS до %1$s" - "Непреслушана говорна пошта" "Започни гласовно пребарување" - "Повикај %s" "Говорна пошта" - "%s сек." - "%s мин. %s сек." - "говорна пошта" - "говорни пораки" - "Да" - "Не" - "Да се избришат избраните %1$s?" + "Откажи го режимот на групни дејства" + "Избриши" + "Откажи" + "Избрани се %1$s" + + ""Да се избришат говорните пораки? "" + ""Да се избришат говорните пораки? "" + @string/call_log_header_today "%1$s во %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Бројот не може да се повика" - "За поставување говорна пошта, одете во Мени > Поставки." - "За да се јавите во говорна пошта, прво исклучете Авионски режим." - "Се вчитува..." - "IMEI" - "MEID" - "Вчитување од SIM картичка..." - "Контакти од SIM картичка" - "Не е достапна апликација за контакти" "Гласовното пребарување не е достапно" - "Не може да се воспостави телефонски повик, бидејќи апликацијата Телефон е оневозможена." "Пребарај контакти" "Додајте број или побарајте контакти" "Историјата на повици е празна" "Повикај" "Немате пропуштени повици." "Приемното сандаче на говорната пошта е празно." - "Прикажи само омилени" "Историја на повици" "Сите" "Пропуштени" - "Говорна пошта" "Брзо бирање" "Историја на повици" "Контакти" "Говорна пошта" - "Отстранет од омилени" - "Врати" "Повикај %s" "Создај нов контакт" "Додај на контакт" "Испрати SMS" "Остварете видеоповик" "Блокирај го бројот" - "%s нови пропуштени повици" "Сè уште немате никого на брзо бирање" "Додај омилено" - "Сè уште немате контакти" - "Додај контакт" - "Допрете ја сликата за да ги видите сите броеви или допрете и држете за промена на редоследот" "Отстрани" + "Изберете ги сите" "Видеоповик" "Испрати порака" "Детали на повик" @@ -164,25 +118,14 @@ "Повикај ^1" "Видеоповик до ^1." "Слушајте говорна пошта од ^1" - "Пушти говорна порака од ^1" - "Паузирај говорна порака од ^1" - "Избриши говорна пошта од ^1" - - %d нова говорна порака - %d нови говорни пораки - "Создај контакт за ^1" "Додај ^1 во постоечки контакт" "Информации на повикот за ^1" - "Избришано од историјата на повици" "Денес" "Вчера" "Постари" - "Список со повици" "Вклучете го звучникот." "Исклучете го звучникот." - "Репродуцирајте побрзо." - "Репродуцирајте побавно." "Запрете ја или паузирајте ја репродукцијата." "Опции за приказ" "Звуци и вибрации" @@ -199,7 +142,6 @@ "Повици" "Блокирање повик" "Говорна пошта" - "SIM за поставки за гов. пошта" "Блокирањето повик е привремено исклучено" "Блокирањето повици е исклучено бидејќи ја контактиравте службата за итни случаи од телефонов во изминатите 48 часа. Повторно ќе се овозможи автоматски откако ќе истече периодот од 48 часа." "Увези броеви" @@ -213,12 +155,8 @@ "Блокирани броеви" "%1$s веќе е блокиран." "Сметки за повикување" - "Вклучи" - "Постави дозволи" "За да овозможите брзо бирање, вклучете ја дозволата за контакти." "За да ја видите евиденцијата на повици, вклучете ја дозволата за телефон." - "За да ги видите контактите, вклучете ја дозволата за контакти." - "За да пристапите кон говорната пошта, вклучете ја дозволата за телефон." "За да ги пребарувате контактите, вклучете ги дозволите за контакти." "За да воспоставите повик, вклучете ја дозволата за телефон." "Апликацијата на телефонот нема дозвола да пишува во поставките на системот." @@ -230,4 +168,10 @@ "Спам" "Контактот %1$s е офлајн и недостапен" "За" + "Транскрибирано од Google" + "Google транскрибира…" + "Не е достапна транскрипција" + "Прикажи" + "Повикот е избришан. За преглед и бришење на прилозите споделени во текот на разговоров, одете во „Пораки“." + "Повиците се избришани. За преглед и бришење на прилозите споделени во текот на разговорите, одете во „Пораки“." diff --git a/java/com/android/dialer/app/res/values-ml/strings.xml b/java/com/android/dialer/app/res/values-ml/strings.xml index 91accf442..444a4d54d 100644 --- a/java/com/android/dialer/app/res/values-ml/strings.xml +++ b/java/com/android/dialer/app/res/values-ml/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ഫോണ്‍" "ഫോൺ കീപാഡ്" - "ഫോണ്‍" "കോള്‍‌ ചരിത്രം" - "കൃത്യമല്ലാത്ത നമ്പർ റിപ്പോർട്ടുചെയ്യുക" "നമ്പർ പകർത്തുക" "ട്രാൻസ്ക്രിപ്ഷൻ പകർത്തുക" - "നമ്പർ ബ്ലോക്കുചെയ്യുക" - "നമ്പർ അൺബ്ലോക്കുചെയ്യുക" "കോൾ ചെയ്യുംമുമ്പ് നമ്പർ എഡിറ്റുചെയ്യൂ" "കോൾ ചരിത്രം മായ്‌ക്കുക" "വോയ്‌സ്മെയിൽ ഇല്ലാതാക്കുക" @@ -34,7 +30,6 @@ "കോൾ ചരിത്രം മായ്‌ക്കണോ?" "ഇത് നിങ്ങളുടെ ചരിത്രത്തിൽ നിന്ന് എല്ലാ കോളുകളും ഇല്ലാതാക്കും" "കോൾ ചരിത്രം മായ്‌ക്കുന്നു..." - "ഫോൺ" "മിസ്‌ഡ് കോൾ" "മിസ്ഡ് ഔദ്യോഗിക കോൾ" "മിസ്‌ഡ് കോളുകൾ" @@ -48,107 +43,66 @@ %1$d വോയ്‌സ്‌മെയിലുകൾ വോയ്‌സ്‌മെയിൽ - "പ്ലേ ചെയ്യുക" "%1$s, %2$s" "%1$s എന്നയാളിൽ നിന്നുള്ള പുതിയ വോയ്‌സ്‌മെയിൽ" "വോയ്‌സ്‌മെയിൽ പ്‌ലേ ചെയ്യാനായില്ല" "വോയ്‌സ്‌മെയിൽ ലോഡുചെയ്യുന്നു..." - "വോയ്‌സ്‌മെയിൽ ആർക്കൈവുചെയ്യുന്നു…" "വോയ്‌സ്‌മെയിൽ ലോഡുചെയ്യാനായില്ല" - "വോയ്‌സ്മെയിൽ ഉള്ള കോളുകൾ മാത്രം" - "ഇൻകമിംഗ് കോളുകൾ മാത്രം" - "ഔട്ട്‌ഗോയിംഗ് കോളുകൾ മാത്രം" - "മിസ്‌ഡ് കോളുകൾ മാത്രം" "(%1$d) %2$s" - "തിരയുക" - "ഡയൽ ചെയ്യുക" - "ഡയൽ ചെയ്യാനുള്ള നമ്പർ" - "പ്ലേബാക്ക് പ്ലേ ചെയ്യുക അല്ലെങ്കിൽ നിർത്തുക" "സ്‌പീക്കർ ഫോൺ ഓണാക്കുക അല്ലെങ്കിൽ ഓഫാക്കുക" "പ്ലേബാക്ക് സ്ഥാനം തിരയുക" - "പ്ലേബാക്ക് നിരക്ക് കുറയ്‌ക്കുക" - "പ്ലേബാക്ക് നിരക്ക് വർദ്ധിപ്പിക്കുക" "കോള്‍‌ ചരിത്രം" "കൂടുതൽ‍ ഓപ്‌ഷനുകള്‍" "കീപാഡ്" - "ഔട്ട്‌ഗോയിംഗ് മാത്രം കാണിക്കുക" - "ഇൻ‌കമിംഗ് മാത്രം കാണിക്കുക" - "മിസ്‌ഡ് മാത്രം കാണിക്കുക" - "വോയ്‌സ്‌മെയിലുകൾ മാത്രം കാണിക്കുക" - "എല്ലാ കോളുകളും കാണിക്കുക" - "2 സെക്കൻഡ് താൽക്കാലികമായി നിർത്തൽ ചേർക്കുക" - "കാത്തിരിക്കൽ ചേർക്കുക" "ക്രമീകരണം" "സിമുലേറ്റർ" - "എല്ലാ കോൺടാക്റ്റുകളും" - "ടച്ച് ടോൺ കീപാഡ് ഉപയോഗിക്കുക" - "വിളിച്ചുകൊണ്ടിരിക്കുന്ന കോളിലേക്ക് മടങ്ങുക" - "കോൾ ചേർക്കുക" - "ഇൻകമിംഗ് കോളുകൾ" - "വോയ്‌സ്‌മെയിൽ പ്ലേ ചെയ്യുക" - "%1$s എന്ന കോൺടാക്റ്റ് കാണുക" - "വിളിക്കുക %1$s" + "പുതിയ UI കുറുക്കുവഴി സൃഷ്‌ടിക്കുക" + "ബൾക്ക് പ്രവർത്തന മോഡിലേക്ക് പ്രവേശിക്കുന്നു" + "ബൾക്ക് പ്രവർത്തന മോഡ് വിട്ടു" + "%1$s തിരഞ്ഞെടുത്തു" + "%1$s തിരഞ്ഞെടുത്തത് മാറ്റി" "%1$s എന്നതിന്റെ കോൺ‌ടാക്റ്റ് വിശദാംശങ്ങൾ" "സംശയമുള്ള %1$s സ്‌പാം കോളറിന്റെ കോൺടാക്‌റ്റ് വിശദാംശങ്ങൾ" "%1$s കോളുകൾ." "വീഡിയോ കോൾ." - "%1$s എന്നയാൾക്ക് SMS അയയ്‌ക്കുക" - "കേൾക്കാത്ത വോയ്‌സ്‌മെയിൽ" "ശബ്ദ തിരയൽ ആരംഭിക്കുക" - "വിളിക്കുക %s" "വോയ്‌സ്‌മെയിൽ" - "%s സെക്കൻഡ്" - "%s മി. %s സെ." - "വോയ്‌സ്‌മെയിൽ" - "വോയ്‌സ്മെയിലുകൾ" - "അതെ" - "ഇല്ല" - "തിരഞ്ഞെടുത്ത %1$s ഇല്ലാതാക്കണോ?" + "\'ബാച്ച് പ്രവർത്തനങ്ങൾ\' മോഡ് റദ്ദാക്കുക" + "ഇല്ലാതാക്കുക" + "റദ്ദാക്കൂ" + "%1$s എണ്ണം തിരഞ്ഞെടുത്തു" + + ""ഈ വോയ്‌സ്‌മെയിലുകൾ ഇല്ലാതാക്കണോ? "" + ""ഈ വോയ്‌സ്‌മെയിൽ ഇല്ലാതാക്കണോ? "" + @string/call_log_header_today "%1$s, %2$s-ന്" "%1$02d:%2$02d" "%1$s%2$s" - "ഈ നമ്പറിലേക്ക് കോൾ ചെയ്യാനാവില്ല" - "വോയ്‌സ്‌മെയിൽ സജ്ജമാക്കാൻ, മെനു > ക്രമീകരണം എന്നതിലേക്ക് പോകുക." - "വോയ്‌സ്‌മെയിൽ വിളിക്കാൻ ആദ്യം ഫ്ലൈറ്റ് മോഡ് ഓഫാക്കുക." - "ലോഡുചെയ്യുന്നു..." - "IMEI" - "MEID" - "സിം കാർഡിൽ നിന്നും ലോഡുചെയ്യുന്നു…" - "സിം കാർഡ് കോൺടാക്റ്റുകൾ" - "കോൺടാക്റ്റ് അപ്ലിക്കേഷനൊന്നും ലഭ്യമല്ല" "വോയ്‌സ് തിരയൽ ലഭ്യമല്ല" - "ഫോൺ അപ്ലിക്കേഷൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നതിനാൽ ഫോൺ കോൾ ചെയ്യാനാകില്ല." "കോണ്‍‌ടാക്റ്റുകള്‍ തിരയുക" "നമ്പർ ചേർക്കുക അല്ലെങ്കിൽ കോൺടാക്റ്റുകൾ തിരയുക" "നിങ്ങളുടെ കോൾ ചരിത്രം ശൂന്യമാണ്" "ഒരു കോൾ ചെയ്യുക" "നിങ്ങൾക്ക് മിസ്‌ഡ് കോളുകളൊന്നുമില്ല." "നിങ്ങളുടെ വോയ്സ്മെയിൽ ഇൻബോക്സ് ശൂന്യമാണ്." - "പ്രിയപ്പെട്ടവ മാത്രം കാണിക്കുക" "കോള്‍‌ ചരിത്രം" "എല്ലാം" "മിസ്‌ഡ്" - "വോയ്‌സ്‌മെയിൽ" "സ്‌പീഡ് ഡയൽ" "കോൾ ചരിത്രം" "കോണ്‍ടാക്റ്റുകള്‍" "വോയ്‌സ്‌മെയിൽ" - "പ്രിയപ്പെട്ടവയിൽ നിന്നും നീക്കംചെയ്‌തു" - "പഴയപടിയാക്കുക" "വിളിക്കുക %s" "പുതിയകോൺടാക്റ്റ് സൃഷ്‌ടിക്കൂ" "ഒരുകോൺടാക്റ്റിൽ ചേർക്കൂ" "SMS അയയ്ക്കുക" "വീഡിയോ കോൾ ചെയ്യുക" "നമ്പർ ബ്ലോക്കുചെയ്യുക" - "%s പുതിയ മിസ്‌ഡ് കോളുകൾ" "ഇതുവരെ ആരും നിങ്ങളുടെ സ്പീഡ് ഡയലിൽ ഇല്ല" "പ്രിയപ്പെട്ടത് ചേർക്കുക" - "നിങ്ങൾക്ക് ഇതുവരെയും കോൺടാക്റ്റുകൾ ഒന്നുമില്ല." - "ഒരു കോണ്‍ടാക്റ്റ് ചേര്‍ക്കുക" - "എല്ലാ നമ്പറുകളും കാണാൻ ചിത്രം സ്‌പർശിക്കുക അല്ലെങ്കിൽ വീണ്ടും ക്രമീകരിക്കാൻ സ്‌പർശിച്ച് പിടിക്കുക" "നീക്കംചെയ്യുക" + "എല്ലാം തിരഞ്ഞെടുക്കുക" "വീഡിയോ കോള്‍" "ഒരു സന്ദേശം അയയ്‌ക്കുക" "കോൾ വിശദാംശങ്ങൾ" @@ -164,25 +118,14 @@ "^1 വിളിക്കുക" "^1 എന്നതുമായി വീഡിയോ കോൾ നടത്തുക." "^1 എന്നയാളിൽ നിന്നുള്ള വോയ്‌സ്മെയിൽ കേൾക്കുക" - "^1 എന്ന നമ്പറിൽ/വ്യക്തിയിൽ നിന്നുള്ള വോയ്സ്‌മെയിൽ പ്ലേ ചെയ്യുക" - "^1 എന്ന നമ്പറിൽ/വ്യക്തിയിൽ നിന്നുള്ള വോയ്സ്‌മെയിൽ തൽക്കാലം നിർത്തുക" - "^1 എന്ന നമ്പറിൽ/വ്യക്തിയിൽ നിന്നുള്ള വോയ്സ്മെയിൽ ഇല്ലാതാക്കുക" - - %d പുതിയ വോയ്‌സ്‌മെയിലുകൾ - %d പുതിയ വോയ്‌സ്‌മെയിൽ - "^1 എന്നതിനായി കോൺടാക്റ്റ് സൃഷ്‌ടിക്കുക" "നിലവിലുള്ള കോൺടാക്റ്റിലേക്ക് ^1 ചേർക്കുക" "^1 എന്നയാളുടെ കോൾ വിശദാംശങ്ങൾ" - "കോൾ ചരിത്രത്തിൽ നിന്ന് ഇല്ലാതാക്കി" "ഇന്ന്" "ഇന്നലെ" "പഴയത്" - "കോൾ ലിസ്‌റ്റ്" "സ്‌പീക്കർ ഓണാക്കുക." "സ്‌പീക്കർ ഓഫാക്കുക." - "വേഗത്തിൽ പ്ലേചെയ്യുക." - "കുറഞ്ഞവേഗതയിൽ പ്ലേചെയ്യുക." "പ്ലേബാക്ക് ആരംഭിക്കുകയോ താൽക്കാലികമായി നിർത്തുകയോ ചെയ്യുക." "ഡിസ്‌പ്ലേ ഓപ്‌ഷനുകൾ" "ശബ്‌ദവും വൈബ്രേഷനും" @@ -199,7 +142,6 @@ "കോളുകൾ" "കോൾ ബ്ലോക്കുചെയ്യൽ" "വോയ്സ് മെയില്‍" - "വോയ്‌സ്മെയിൽ ക്രമീകരണത്തിന്, സിം തിരഞ്ഞെടുക്കുക" "കോൾ ബ്ലോക്കുചെയ്യൽ താൽക്കാലികമായി ഓഫാണ്" "കഴിഞ്ഞ 48 മണിക്കൂറിനുള്ളിൽ നിങ്ങൾ ഈ ഫോണിൽ നിന്ന് അടിയന്തിര സേവനങ്ങളുമായി ബന്ധപ്പെട്ടതിനാൽ കോൾ ബ്ലോക്കുചെയ്യൽ പ്രവർത്തനരഹിതമാക്കി. 48 മണിക്കൂർ സമയപരിധി കഴിഞ്ഞയുടൻ ഇത് സ്വയമേവ പ്രവർത്തനക്ഷമമാക്കപ്പെടും." "നമ്പറുകൾ ഇമ്പോർട്ടുചെയ്യുക" @@ -213,12 +155,8 @@ "ബ്ലോക്കുചെയ്ത നമ്പറുകൾ" "ഇതിനകം തന്നെ %1$s ബ്ലോക്കുചെയ്തിരിക്കുന്നു" "കോളിംഗ് അക്കൗണ്ട്" - "ഓണാക്കുക" - "അനുമതികൾ സജ്ജമാക്കുക" "സ്പീഡ് ഡയൽ പ്രവർത്തനക്ഷമാക്കുന്നതിന്, \'കോൺടാക്റ്റുകൾ\' അനുമതി ഓണാക്കുക." "നിങ്ങളുടെ കോൾ ലോഗ് കാണുന്നതിന്, \'ഫോൺ\' അനുമതി ഓണാക്കുക." - "നിങ്ങളുടെ കോൺടാക്റ്റുകൾ കാണുന്നതിന്, \'കോൺടാക്റ്റുകൾ\' അനുമതി ഓണാക്കുക." - "നിങ്ങളുടെ വോയ്‌സ്‌മെയിൽ ആക്സസ് ചെയ്യുന്നതിന്, \'ഫോൺ\' അനുമതി ഓണാക്കുക." "നിങ്ങളുടെ കോൺടാക്റ്റുകൾ തിരയുന്നതിന് കോൺടാക്റ്റുകൾക്കുള്ള അനുമതികൾ ഓണാക്കുക." "കോൾ വിളിക്കുന്നതിന്, \'ഫോൺ\' അനുമതി ഓണാക്കുക." "സിസ്റ്റം ക്രമീകരണത്തിലേക്ക് എഴുതാൻ ഫോൺ ആപ്പിന് അനുമതിയില്ല." @@ -230,4 +168,10 @@ "സ്‌പാം" "%1$s ഓഫ്‌ലൈനായതിനാൽ കോൾ ചെയ്യാനാവില്ല" "ആമുഖം" + "Google ട്രാൻസ്‌ക്രൈബ് ചെയ്‌തത്" + "Google കേട്ടെഴുതുന്നു..." + "ട്രാൻസ്‌ക്രിപ്‌റ്റ് ലഭ്യമല്ല" + "കാണുക" + "കോൾ ഇല്ലാതാക്കി. ഈ കോൾ ചെയ്യുമ്പോൾ പങ്കിട്ട അറ്റാച്ച്‌മെന്റുകൾ മെസേജിൽ കാണുകയും ഇല്ലാതാക്കുകയും ചെയ്യുക." + "കോളുകൾ ഇല്ലാതാക്കി. ഈ കോളുകൾ ചെയ്യുമ്പോൾ പങ്കിട്ട അറ്റാച്ച്‌മെന്റുകൾ മെസേജിൽ കാണുകയും ഇല്ലാതാക്കുകയും ചെയ്യുക." diff --git a/java/com/android/dialer/app/res/values-mn/strings.xml b/java/com/android/dialer/app/res/values-mn/strings.xml index a07a826d5..016b12914 100644 --- a/java/com/android/dialer/app/res/values-mn/strings.xml +++ b/java/com/android/dialer/app/res/values-mn/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Гар утас" "Утасны товчлуур" - "Утас" "Дуудлагын түүх" - "Тохиромжгүй дугаарыг мэдээлэх" "Дугаар хуулах" "Галиглалыг хуулах" - "Дугаар блоклох" - "Дугаар блокноос гаргах" "Залгахын өмнө дугаар засах" "Дуудлагын түүхийг устгах уу?" "Дуут шууданг устгах" @@ -34,7 +30,6 @@ "Дуудлагын түүхийг устгах уу?" "Энэ нь таны хийсэн бүх дуудлагыг түүхээс устгана." "Дуудлагын түүхийг устгаж байна..." - "Утас" "Аваагүй дуудлага" "Аваагүй албаны дуудлага" "Аваагүй дуудлага" @@ -48,107 +43,66 @@ %1$d Дуут шуудан Дуут шуудан - "Тоглуулах" "%1$s, %2$s" "%1$s-с ирсэн шинэ дуут шуудан" "Дуут шууданг тоглуулж чадсангүй" "Дуут шууданг ачаалж байна..." - "Дуут шууданг архивлаж байна..." "Дуут шууданг ачаалж чадсангүй" - "Зөвхөн дуут шуудантай дуудлагуудыг" - "Зөвхөн ирсэн дуудлага" - "Зөвхөн залгасан дуудлагуудыг" - "Зөвхөн аваагүй дуудлагуудыг" "(%1$d) %2$s" - "хайх" - "залгах" - "залгах дугаар" - "Тоглуулах эсхүл зогсоох" "Чанга яригчийг асаах буюу унтраах" "Тоглуулах байрлалыг хайх" - "Тоглуулах хурдыг бууруулах" - "Тоглуулах хурдыг нэмэгдүүлэх" "Дуудлагын түүх" "Нэмэлт сонголтууд" "Товчлуур" - "Зөвхөн залгасан дуудлагуудыг харуулах" - "Зөвхөн ирсэн дуудлагуудыг харуулах" - "Зөвхөн аваагүй дуудлагуудыг харуулах" - "Зөвхөн дуут шуудангуудыг харуулах" - "Бүх дуудлагыг харуулах" - "2-сек зогсолт нэмэх" - "Хүлээлт нэмэх" "Тохиргоо" "Симулятор" - "Бүх харилцагчид" - "Хүрэлтээр дуугардаг гар ашиглах" - "Үргэлжилж буй дуудлага руу буцах" - "Дуудлага нэмэх" - "Ирж буй дуудлага" - "Дуут шууданг тоглуулах" - "%1$s харилцагчийг харах" - "%1$s руу залгах" + "Шинэ UI үүсгэх товчлол" + "Багц үйлдлийн горимд орж байна" + "Багц үйлдлийн горимоос гарсан" + "%1$s сонгосон" + "%1$s сонголтыг болиулсан" "%1$s-н харилцагчийн мэдээлэл" "Спам тараагч байж болзошгүй %1$s-н дэлгэрэнгүй мэдээлэл" "%1$s дуудлага." "Видео дуудлага." - "%1$s-д мессеж илгээх" - "Сонсоогүй дуут шуудан" "Дуун хайлтыг эхлүүлэх" - "%s руу залгах" "Дуут шуудан" - "%s сек" - "%s минут %s секунд" - "дуут шуудан" - "дуут шуудан" - "Тийм" - "Үгүй" - "Сонгосон %1$s-г устгах уу?" + "Багц үйлдлийн горимыг цуцлах" + "Устгах" + "Цуцлах" + "%1$s сонгосон" + + ""Эдгээр дуут шууданг устгах уу? "" + ""Энэ дуут шууданг устгах уу? "" + @string/call_log_header_today "%1$s %2$s-д" "%1$02d:%2$02d" "%1$s%2$s" - "Энэ дугаар луу залгах боломжгүй байна" - "Дуут шууданг тохируулахын тулд Цэс > Тохиргоо руу очно уу." - "Дуут шуудан руу залгахын тулд эхлээд Нислэгийн горимыг идэвхгүй болгоно уу." - "Ачааллаж байна..." - "IMEI" - "MEID" - "SIM картаас уншиж байна…" - "SIM картны харилцагчид" - "Ямар ч харилцагчдын апликейшн байхгүй байна." "Дуут хайлт хийх боломжгүй байна" - "Утас аппликешныг идэвхгүйжүүлсэн тул утасны дуудлага хийх боломжгүй." "Харилцагчдаас хайх" "Дугаар нэмэх болон харилцагч хайх" "Таны дуудлагын түүх хоосон байна" "Дуудлага хийх" "Танд аваагүй дуудлага байхгүй байна." "Таны дуут шуудангийн хайрцаг хоосон байна." - "Зөвхөн дуртайнуудыг харуулах" "Дуудлагын түүх" "Бүгд" "Аваагүй" - "Дуут шуудан" "Түргэн залгалт" "Дуудлагын түүх" "Харилцагчид" "Дуут шуудан" - "Дуртай жагсаалтаас хасав" - "Буцаах" "%s руу залгах" "Шинэ хаяг үүсгэх" "Харилцагчийн хаягт нэмэх" "Мессеж илгээх" "Видео дуудлага хийх" "Дугаар блоклох" - "%s шинэ аваагүй дуудлага" "Таны яаралтай залгах тохиргоон дээр одоогоор харилцагч байхгүй байна" "Таалагдсан хэсэгт нэмэх" - "Танд одоогоор харилцагч байхгүй байна" - "Харилцагч нэмэх" - "Бүх дугаарыг харахын тулд зурганд хүрнэ үү эсвэл жагсаалтыг өөрчлөхийн тулд удаан дарна уу." "Хасах" + "Бүгдийг сонгох" "Видео дуудлага" "Зурвас илгээх" "Дуудлагын мэдээлэл" @@ -164,25 +118,14 @@ "^1 руу дуудлага хийх" "^1-ын видео дуудлага." "^1-н дуут шууданг сонсох" - "^1-н дуут шууданг тоглуулах" - "^1-н дуут шууданг зогсоох" - "^1-н дуут шууданг устгах" - - %d шинэ дуут шуудан - %d шинэ дуут шуудан - "^1-д харилцагч шинээр үүсгэх" "^1-ыг одоогийн харилцагч руугаа нэмнэ" "^1 дуудлагын дэлгэрэнгүй мэдээлэл" - "Дуудлагын түүхээс устгагдсан" "Өнөөдөр" "Өчигдөр" "Хуучин" - "Дуудлагын жагсаалт" "Чанга яригчийг асаах." "Чанга яригчийг унтраах." - "Хурдан тоглуулах." - "Удаан тоглуулах." "Тоглуулахыг эхлүүлэх буюу түр зогсоох." "Сонголтуудыг харуулах" "Дуу болон чичиргээ" @@ -199,7 +142,6 @@ "Дуудлага" "Дуудлага блоклох" "Дуут шуудан" - "Дуут шуудангийн тохиргооны SIM" "Дуудлага блоклох тохиргоог түр хугацаагаар унтраасан" "Та сүүлийн 48 цагийн дотор энэ утсаар тусламжийн дуудлага хийсэн тул дуудлага блоклох тохиргоог идэвхгүй болгосон. Энэ тохиргоо нь 48 цагийн хугацаа дуусахад автоматаар идэвхэжнэ." "Импортын тоо" @@ -213,12 +155,8 @@ "Блоклосон дугаар" "%1$s-г аль хэдийн блоклосон байна." "Дуудах бүртгэл" - "Идэвхжүүлэх" - "Зөвшөөрөл тохируулах" "Яаралтай дуудлагыг идэвхжүүлэхийн тулд Харилцагчдын зөвшөөрлийг идэвхжүүлнэ үү." "Дуудлагын жагсаалтыг харахын тулд утасны зөвшөөрлийг идэвхжүүлнэ үү." - "Харилцагчдаа харахын тулд Харилцагчдын зөвшөөрлийг идэвхжүүлнэ үү." - "Дуут шууданд хандахын тулд Утасны зөвшөөрлийг идэвхжүүлнэ үү." "Харилцагчаа хайхын тулд, Харилцагчийн жагсаалтын зөвшөөрлийг идэвхжүүлнэ үү." "Залгахын тулд Утасны зөвшөөрлийг идэвхжүүлнэ үү." "Гар утасны апп-д системийн тохиргоо бичих зөвшөөрөл алга." @@ -230,4 +168,10 @@ "Спам" "%1$s офлайн, холбогдох боломжгүй байна" "Тухай" + "Google-с сийрүүлсэн" + "Google сийрүүлж байна..." + "Сийрүүлэг ашиглах боломжгүй" + "Үзэх" + "Дуудлагыг устгасан. Энэ дуудлагын явцад Зурвас дотор хуваалцсан хавсралтуудыг үзэх болон устгах." + "Дуудлагуудыг устгасан. Энэ дуудлагын явцад Зурвас дотор хуваалцсан хавсралтуудыг үзэх болон устгах." diff --git a/java/com/android/dialer/app/res/values-mr/strings.xml b/java/com/android/dialer/app/res/values-mr/strings.xml index 5aca7a5e2..5f4110cf3 100644 --- a/java/com/android/dialer/app/res/values-mr/strings.xml +++ b/java/com/android/dialer/app/res/values-mr/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "फोन" "फोन कीपॅड" - "फोन" "कॉल इतिहास" - "चुकीच्या नंबरचा अहवाल द्या" "नंबर कॉपी करा" "प्रतिलेखन कॉपी करा" - "नंबर अवरोधित करा" - "नंबर अनावरोधित करा" "कॉल करण्यापूर्वी नंबर संपादित करा" "कॉल इतिहास साफ करा" "व्हॉइसमेल हटवा" @@ -34,7 +30,6 @@ "कॉल इतिहास साफ करायचा?" "हे आपल्या कॉल इतिहासातून सर्व कॉल हटवेल" "कॉल इतिहास साफ करत आहे…" - "फोन" "सुटलेला कॉल" "कार्याचा कॉल चुकविला" "सुटलेले कॉल" @@ -48,107 +43,66 @@ %1$d व्हॉइसमेल %1$d व्हॉइसमेल - "प्ले करा" "%1$s, %2$s" "%1$s कडील नवीन व्हॉइसमेल" "व्हॉइसमेल प्ले करू शकलो नाही" "व्हॉइसमेल लोड करत आहे…" - "व्हॉइसमेल संग्रहित करीत आहे..." "व्हॉइसमेल लोड करू शकलो नाही" - "केवळ व्हॉइसमेल सह कॉल" - "केवळ येणारे कॉल" - "केवळ केले जाणारे कॉल" - "केवळ सुटलेले कॉल" "(%1$d) %2$s" - "शोधा" - "डायल करा" - "डायल करण्यासाठी नंबर" - "प्‍ले करा किंवा प्‍लेबॅक थांबवा" "स्‍पीकरफोन चालू किंवा बंद करा" "प्लेबॅक स्थान शोधतात" - "प्‍लेबॅक दर कमी करा" - "प्‍लेबॅक दर वाढवा" "कॉल इतिहास" "अधिक पर्याय" "की पॅड" - "केवळ केले जाणारे दर्शवा" - "केवळ येणारे दर्शवा" - "केवळ सुटलेले दर्शवा" - "केवळ व्हॉइसमेल दर्शवा" - "सर्व कॉल दर्शवा" - "2-सेकंद विराम जोडा" - "प्रतीक्षा करा जोडा" "सेटिंग्ज" "सिम्युलेटर" - "सर्व संपर्क" - "स्‍पर्श टोन कीपॅडचा वापर करा" - "चालू असलेल्या कॉलवर परत जा" - "कॉल जोडा" - "येणारे कॉल" - "व्हॉइसमेल प्ले करा" - "%1$s संपर्क पहा" - "%1$s ला कॉल करा" + "नवीन UI शॉर्टकट तयार करा" + "मोठ्या प्रमाणात क्रिया मोडमध्ये प्रवेश करीत आहे" + "मोठ्या प्रमाणात क्रिया मोड सोडत आहे" + "%1$s निवडले" + "%1$s ची निवड रद्द केली" "%1$s साठी संपर्क तपशील" "संशयास्पद स्पॅम कॉलर %1$s साठी संपर्क तपशील" "%1$s कॉल." "व्हिडिओ कॉल." - "%1$s वर SMS पाठवा" - "न ऐकलेला व्हॉइसमेल" "व्हॉइस शोध प्रारंभ करा" - "%s ला कॉल करा" "व्हॉइसमेल" - "%s सेकंद" - "%s मिनिट %s सेकंद" - "व्हॉइसमेल" - "व्हॉइसमेल" - "होय" - "नाही" - "निवडलेले %1$s हटवायचेे?" + "बॅच क्रिया मोड रद्द करा" + "हटवा" + "रद्द करा" + "%1$s निवडले" + + ""हा व्हॉइसमेल हटवायचा? "" + ""हे व्हॉइसमेल हटवायचे? "" + @string/call_log_header_today "%1$s रोजी %2$s वाजता" "%1$02d:%2$02d" "%1$s%2$s" - "या नंबरवर कॉल करू शकत नाही" - "व्हॉइसमेल सेट करण्‍यासाठी, मेनू > सेटिंग्‍ज वर जा." - "व्हॉइसमेलला कॉल करण्यासाठी, प्रथम विमान मोड बंद करा." - "लोड करीत आहे..." - "IMEI" - "MEID" - "सिम कार्ड मधून लोड करीत आहे..." - "सिम कार्ड संपर्क" - "कोणताही संपर्क अॅप उपलब्ध नाही" "व्हॉइस शोध उपलब्ध नाही" - "फोन अनुप्रयोग अक्षम केला गेला असल्याने फोन कॉल करणे शक्य नाही." "संपर्क शोधा" "नंबर जोडा किंवा संपर्क शोधा" "आपला कॉल इतिहास रिक्त आहे" "एक कॉल करा" "आपल्‍याकडे कोणतेही सुटलेले कॉल नाहीत." "आपला व्हॉइसमेल इनबॉक्स रिक्त आहे." - "केवळ आवडीचे दर्शवा" "कॉल इतिहास" "सर्व" "सुटलेले" - "व्हॉइसमेल" "स्पीड डायल" "कॉल इतिहास" "संपर्क" "व्हॉइसमेल" - "आवडी मधून काढले" - "पूर्ववत करा" "%s ला कॉल करा" "नवीन संपर्क तयार करा" "संपर्कांमध्‍ये जोडा" "SMS पाठवा" "व्‍हिडिओ कॉल करा" "नंबर अवरोधित करा" - "%s नवीन सुटलेले कॉल" "अद्याप आपल्‍या स्पीड डायलवर कोणीही नाही" "एक आवडते जोडा" - "आपल्‍याकडे अद्याप कोणतेही संपर्क नाहीत" - "एक संपर्क जोडा" - "सर्व नंबर पाहण्यासाठी प्रतिमेस स्पर्श करा किंवा पुन्हा क्रम लावण्यासाठी स्पर्श करा आणि धरून ठेवा" "काढा" + "सर्व निवडा" "व्हिडिओ कॉल" "एक संदेश पाठवा" "कॉल तपशील" @@ -164,25 +118,14 @@ "^1 वर कॉल करा" "व्हिडिओ कॉल ^1." "^1 कडील व्हॉइसमेल ऐका" - "^1 कडील व्हॉइसमेल प्ले करा" - "^1 कडील व्हॉइसमेल ला विराम द्या" - "^1 वरील व्हॉइसमेल हटवा" - - %d नवीन व्हॉइसमेल - %d नवीन व्हॉइसमेल - "^1 साठी संपर्क तयार करा" "विद्यमान संपर्कांमध्ये ^1 जोडा" "^1 साठी कॉल तपशील" - "कॉल इतिहासातून हटविले" "आज" "काल" "अधिक जुने" - "कॉल सूची" "स्पीकर चालू करा." "स्पीकर बंद करा." - "अधिक जलद प्ले करा." - "अधिक धीमे प्ले करा." "प्लेबॅक प्रारंभ करा किंवा त्यास विराम द्या." "प्रदर्शन पर्याय" "ध्वनी आणि कंपने" @@ -199,7 +142,6 @@ "कॉल" "कॉल अवरोधित करणे" "व्हॉइसमेल" - "व्हॉइसमेल सेटिंग्जसाठी सिम निवडा" "कॉल अवरोधित करणे तात्पुरते बंद" "आपण मागील 48 तासात या फोनवरून आणीबाणी सेवांशी संपर्क साधला असल्याने कॉल अवरोधित करणे अक्षम केले गेले आहे. एकदा 48 तासांचा कालावधी कालबाह्य झाला की ते स्वयंचलितपणे पुन्हा सक्षम केले जाईल." "नंबर अायात करा" @@ -213,12 +155,8 @@ "अवरोधित केलेले नंबर" "%1$s आधीच अवरोधित केलेला आहे." "कॉल करण्याची खाती" - "चालू करा" - "परवानग्या सेट करा" "स्पीड डायल सक्षम करण्‍यासाठी, संपर्क परवानगी चालू करा." "आपला कॉल लॉग पाहण्‍यासाठी, फोन परवानगी चालू करा." - "आपले संपर्क पाहण्‍यासाठी, संपर्क परवानगी चालू करा." - "आपल्‍या व्हॉइसमेलमध्‍ये प्रवेश करण्‍यासाठी, फोन परवानगी चालू करा." "आपले संपर्क शोधण्‍यासाठी, संपर्क परवानग्या चालू करा." "कॉल करण्यासाठी, फोन परवानगी चालू करा." "फोन अॅपला सिस्टीम स‍ेटिंग्जमध्ये लिहिण्याची परवानगी नाही." @@ -230,4 +168,10 @@ "स्पॅम" "%1$s ऑफलाइन आहे आणि त्यांच्याशी संपर्क साधू शकत नाही" "बद्दल" + "Google ने प्रतिलेखन केलेले" + "Google प्रतिलेखित करत आहे ..." + "प्रतिलेखन उपलब्ध नाही" + "पहा" + "कॉल हटविला. या कॉल दरम्यान Messages मध्ये सामायिक केलेली संलग्नके पहा आणि हटवा." + "कॉल हटविला. कॉल दरम्यान Messages मध्ये सामायिक केलेली संलग्नके पहा आणि हटवा." diff --git a/java/com/android/dialer/app/res/values-ms/strings.xml b/java/com/android/dialer/app/res/values-ms/strings.xml index 9dbe541d9..a00010ed9 100644 --- a/java/com/android/dialer/app/res/values-ms/strings.xml +++ b/java/com/android/dialer/app/res/values-ms/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Pad Kekunci Telefon" - "Telefon" "Sejarah panggilan" - "Laporkan nombor yang tidak tepat" "Salin nombor" "Salin transkripsi" - "Sekat nombor" - "Nyahsekat nombor" "Edit nombor sebelum memanggil" "Kosongkan sejarah panggilan" "Padamkan mel suara" @@ -34,7 +30,6 @@ "Kosongkan sejarah panggilan?" "Tindakan ini akan memadamkan semua panggilan daripada sejarah anda" "Mengosongkan sejarah panggilan..." - "Telefon" "Panggilan tidak dijawab" "Panggilan terlepas daripada tempat kerja" "Panggilan terlepas" @@ -48,107 +43,66 @@ %1$d Mel suara Mel suara - "Main" "%1$s, %2$s" "Mel suara baharu daripada %1$s" "Tidak dapat memainkan mel suara" "Memuatkan mel suara..." - "Mengarkib mel suara…" "Tidak dapat memuatkan mel suara" - "Panggilan dengan mel suara sahaja" - "Panggilan masuk sahaja" - "Panggilan keluar sahaja" - "Panggilan terlepas sahaja" "(%1$d) %2$s" - "cari" - "dail" - "nombor untuk didail" - "Mainkan atau berhenti main balik" "Hidupkan atau matikan pembesar suara" "Dapatkan kedudukan main balik" - "Kurangkan kadar main balik" - "Tingkatkan kadar main balik" "Sejarah panggilan" "Lagi pilihan" "pad kekunci" - "Tunjuk panggilan keluar shj" - "Tunjuk panggilan masuk shj" - "Tunjuk panggilan terlepas shj" - "Tunjukkan mel suara sahaja" - "Tunjukkan semua panggilan" - "Tambah jeda 2 saat" - "Tambah penungguan" "Tetapan" "Simulator" - "Semua kenalan" - "Gunakan pad kekunci nada sentuh" - "Kembali ke panggilan yang sedang berlangsung" - "Tambah panggilan" - "Panggilan masuk" - "Mainkan mel suara" - "Lihat kenalan %1$s" - "Panggil %1$s" + "Buat Pintasan UI Baharu" + "Memasuki mod tindakan pukal" + "Meninggalkan mod tindakan pukal" + "%1$s dipilih" + "%1$s dinyahpilih" "Butiran hubungan untuk %1$s" "Butiran hubungan pemanggil spam yang disyaki %1$s" "%1$s panggilan." "Panggilan video." - "Hantar SMS kepada %1$s" - "Mel suara belum didengar" "Mulakan carian suara" - "Panggil %s" "Mel suara" - "%s saat" - "%s min %s saat" - "mel suara" - "mel suara" - "Ya" - "Tidak" - "Padam %1$s yang dipilih?" + "Batalkan mod tindakan kelompok" + "Padam" + "Batal" + "%1$s dipilih" + + ""Padamkan mel suara ini? "" + ""Padamkan mel suara ini? "" + @string/call_log_header_today "%1$s pada %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Tidak dapat menghubungi nombor ini" - "Untuk menyediakan mel suara, pergi ke Menu > Tetapan." - "Untuk memanggil mel suara, matikan mod Pesawat terlebih dahulu." - "Memuatkan…" - "IMEI" - "MEID" - "Memuatkan dari kad SIM..." - "Kenalan kad SIM" - "Tiada apl kenalan tersedia" "Carian suara tidak tersedia" - "Tidak boleh membuat panggilan telefon kerana aplikasi Telefon telah dilumpuhkan." "Cari dalam kenalan" "Tambahkn no. atau cari kenalan" "Sejarah panggilan anda kosong" "Buat panggilan" "Anda tiada panggilan terlepas." "Peti masuk mel suara anda kosong." - "Tunjukkan kegemaran sahaja" "Sejarah Panggilan" "Semua" "Tidak dijawab" - "Mel suara" "Dail laju" "Sejarah Panggilan" "Kenalan" "Mel suara" - "Dialih keluar daripada kegemaran" - "Buat asal" "Panggil %s" "Buat kenalan baharu" "Tambahkan pada kenalan" "Hantar SMS" "Buat panggilan video" "Sekat nombor" - "%s panggilan terlepas baharu" "Belum ada sesiapa pada dail pantas anda" "Tambahkan kegemaran" - "Anda belum mempunyai sebarang kenalan" - "Tambahkan kenalan" - "Sentuh imej untuk melihat semua nombor atau sentuh & tahan untuk menyusun semula" "Alih keluar" + "Pilih semua" "Panggilan video" "Hantar mesej" "Butiran panggilan" @@ -164,25 +118,14 @@ "Panggil ^1" "Panggilan video ^1." "Dengar mel suara daripada ^1" - "Mainkan mel suara daripada ^1" - "Jeda mel suara daripada ^1" - "Padamkan mel suara daripada ^1" - - %d mel suara baharu - %d mel suara baharu - "Buat kenalan untuk ^1" "Tambahkan ^1 pada kenalan yang sedia ada" "Butiran panggilan untuk ^1" - "Dipadamkan dari sejarah panggilan" "Hari ini" "Semalam" "Lebih lama" - "Senarai panggilan" "Hidupkan pembesar suara." "Matikan pembesar suara." - "Main lebih cepat." - "Main lebih perlahan." "Mulakan atau jeda main balik." "Pilihan paparan" "Bunyi dan getaran" @@ -199,7 +142,6 @@ "Panggilan" "Sekatan panggilan" "Mel suara" - "Pilih SIM untuk tetapan mel suara" "Sekatan panggilan dimatikan sementara" "Sekatan panggilan telah dilumpuhkan kerana anda menghubungi perkhidmatan kecemasan daripada telefon ini dalam masa 48 jam yang lalu. Ciri ini akan didayakan semula secara automatik apabila tempoh 48 jam berakhir." "Import nombor" @@ -213,12 +155,8 @@ "Nombor yang disekat" "%1$s sudah disekat." "Akaun panggilan" - "Hidupkan" - "Tetapkan kebenaran" "Untuk mendayakan dail laju, hidupkan kebenaran Kenalan." "Untuk melihat log panggilan anda, hidupkan kebenaran Telefon." - "Untuk melihat kenalan anda, hidupkan kebenaran Kenalan." - "Untuk mengakses mel suara anda, hidupkan kebenaran Telefon." "Untuk mencari kenalan anda, hidupkan kebenaran Kenalan." "Untuk membuat panggilan, hidupkan kebenaran Telefon." "Apl telefon tiada kebenaran untuk menulis ke tetapan sistem." @@ -230,4 +168,10 @@ "Spam" "%1$s di luar talian dan tidak dapat dihubungi" "Perihal" + "Ditranskripsikan oleh Google" + "Google sedang mentranskripsi…" + "Transkrip tidak tersedia" + "Lihat" + "Panggilan dipadam. Lihat dan padam lampiran yang dikongsi semasa panggilan ini dalam Mesej." + "Panggilan dipadam. Lihat dan padam lampiran yang dikongsi semasa panggilan dalam Mesej." diff --git a/java/com/android/dialer/app/res/values-my/strings.xml b/java/com/android/dialer/app/res/values-my/strings.xml index 2b51b2054..204eda59e 100644 --- a/java/com/android/dialer/app/res/values-my/strings.xml +++ b/java/com/android/dialer/app/res/values-my/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ဖုန်း" "ဖုန်းခလုတ်ခုံ" - "ဖုန်း" "ခေါ်ဆိုမှု မှတ်တမ်း" - "မမှန်ကန်သည့် နံပါတ်အား သတင်းပို့ပါ" "နံပါတ်ကိုကူးရန်" "အသံမှစာအဖြစ်ဘာသာပြန်ခြင်းကို ကူးရန်" - "နံပါတ်ကို ပိတ်ရန်" - "နံပါတ်ကို ဖွင့်မည်" "မခေါ်ဆိုမီ နံပါတ်ကိုတည်းဖြတ်ရန်" "ခေါ်ဆိုမှု မှတ်တမ်း ရှင်းရန်" "အသံပို့စာ အားဖျက်ရန်" @@ -34,7 +30,6 @@ "ခေါ်ဆိုမှု မှတ်တမ်းကို ဖယ်ရှားရမလား။" "ဒါက သင့် မှတ်တမ်းထဲက ခေါ်ဆိုမှုများ အားလုံးကို ဖျက်ပစ်မည်" "ခေါ်ဆိုမှု မှတ်တမ်းကို ရှင်းနေ…" - "ဖုန်း" "လွဲသွားသော ဖုန်းခေါ်မှု" "လွတ်သွားသည့် အလုပ်ဆိုင်ရာ ခ​ေါ်ဆိုမှု" "လွတ်သွားသော ခေါ်ဆိုမှုများ" @@ -48,107 +43,66 @@ %1$d အသံမေးလ်များ အသံမေးလ် - "နားထောင်သည်" "%1$s, %2$s" "%1$s ဆီမှ အသံစာ အသစ်" "အသံမေးလ်ကို ဖွင့်မပေးနိုင်ခဲ့" "အသံမေးလ်ကို တင်ပေးနေ…" - "အသံစာတိုကို သိမ်းနေသည်..." "အသံမေးလ်ကို တင်မပေးနိုင်ခဲ့" - "အသံမေးလ်ပါသော အဝင်ခေါ်ဆိုမှုများသာ" - "အဝင်ဖုန်းသာ" - "အထွက်ခေါ်ဆိုမှုများသာ" - "လွတ်သွားသော ဖုန်းသာ" "(%1$d) %2$s" - "ရှာဖွေရန်" - "ဖုန်းခေါ်ခြင်း" - "ခေါ်ရန် နံပါတ်" - "ပြန်ဖွင့်ပြမှုကို ဖွင့်ရန် သို့မဟုတ် ရပ်ရန်" "စပီကာဖုန်းကို ဖွင့် သို့မဟုတ် ပိတ်ရန်" "အသံပြန်ဖွင့်ရေး နေရာကို ရှာရန်" - "ပြန်ဖွင့်မှု နှုန်းကို လျှော့ချရန်" - "ပြန်ဖွင့်မှု နှုန်းကို မြှင့်ရန်" "ခေါ်ဆိုမှုမှတ်တမ်း" "ပိုမိုရွေးချယ်စရာများ" "ခလုတ်ခုံ" - "အထွက်ခေါ်ဆိုခြင်းများသာပြပါ" - "အဝင်ခေါ်ဆိုမှုသာ ပြပါ" - "လွတ်သွားသော ခေါ်ဆိုမှုများသာပြပါ" - "အသံပို့စာများသာ ပြပါ" - "ဖုန်းခေါ်မှုအားလုံးပြရန်" - "၂စက္ကန့်ရပ်ဆိုင်းရန် ထည့်ပါ" - "စောင့်ဆိုင်းခြင်း ထည့်ပါ" "ဆက်တင်များ" "အသစ်ကဲ့သို့ တုပသည့်စနစ်" - "လိပ်စာများအားလုံး" - "touch tone ကီးခလုတ် ကိုအသုံးပြုပါ" - "ဖုန်းပြန်ခေါ်မှု ပြုလုပ်နေစဉ်" - "ဖုန်းခေါ်မှု ထပ်ထည့်ပါ" - "အဝင်ခေါ်ဆိုမှုများ" - "အသံပို့စာ နားထောင်ရန်" - "%1$s လိပ်စာကြည့်ရန်" - "%1$s ကိုခေါ်ပါ" + "UI ဖြတ်လမ်းလင့်ခ်အသစ် လုပ်ရန်" + "တပြိုင်နက်တည်း စုပြုံလုပ်ဆောင်ချက်မုဒ်ကို ထည့်သွင်းခြင်း" + "တပြိုင်နက်တည်း စုပြုံလုပ်ဆောင်ချက်မုဒ်မှ ထွက်လိုက်သည်" + "ရွေးချယ်ထားသော %1$s" + "မရွေးချယ်ထားသော %1$s" "%1$s ရဲ့ အဆက်အသွယ် အသေးစိတ်" "သံသယဖြစ်ဖွယ်စပမ်းခေါ်ဆိုသူ %1$s အတွက် အဆက်အသွယ်အသေးစိတ်" "%1$s ခါ" "ဗီဒီယို ခေါ်ဆိုမှု" - "%1$sထံသို့ SMS ပို့ရန်" - "မနားထောင်ရသေးသော အသံပို့စာ" "အသံဖွင့်ရှာဖွေမှု စရန်" - "%s ကိုခေါ်ပါ" "အသံစာပို့စနစ်" - "%s စက္ကန့်" - "%s မိနစ် %s စက္ကန့်" - "အသံမေးလ်" - "အသံမေးလ်များ" - "Yes" - "No" - "ရွေးထားသော %1$s ကို ဖျက်လိုပါသလား။" + "တပြိုင်နက်တည်း စုပြုံလုပ်ဆောင်ချက်များမုဒ်ကိ ပယ်ဖျက်ရန်" + "ဖျက်ပါ" + "မလုပ်တော့" + "%1$s ကို ရွေးချယ်ထားသည်" + + ""ဤအသံမေးလ်များကို ဖျက်မလား။ "" + ""ဤအသံမေးလ်ကို ဖျက်မလား။ "" + @string/call_log_header_today "%1$s %2$s ၌" "%1$02d:%2$02d" "%1$s%2$s" - "ဒီနံပါတ်ကို မခေါ်ဆိုနိုင်ပါ" - "အသံမေးလ်စနစ်ကိုသတ်မှတ်ရန် မီနူးမှတစ်ဆင့် ဆက်တင်များသို့သွားပါ။" - "အသံမေးလ်ခေါ်ဆိုနိုင်ရန် လေယာဉ်ပျံပေါ်သုံးစနစ်ကို ပိတ်ပါ။" - "ဖွင့်နေစဉ်" - "IMEI" - "MEIDနံပါတ်" - "ဆင်းမ်ကဒ်မှ ဖွင့်နေပါသည်..." - "ဆင်းမ်ကဒ်မှ အဆက်အသွယ်များ" - "အဆက်အသွယ်များ app မရှိ" "အသံဖြင့် ရှာဖွေမှု မရှိ" - "ဖုန်း အပလီကေးရှင်းကို ပိတ်ထား၍ ဖုန်း ခေါ်ဆိုမှု မပြုလုပ်နိုင်ခဲ့ပါ။" "အဆက်အသွယ်များရှာပါ" "နံပါတ်ပေါင်းထည့်ပါ သို့မဟုတ် အဆက်အသွယ်များ ရှာဖွေပါ" "သင့်ခေါ်ဆိုမှတ်တမ်းတွင် ဘာမှမရှိပါ" "ဖုန်းခေါ်ရန်" "သင့်တွင် လွတ်သွားသည့်ခေါ်ဆိုမှုများ မရှိပါ။" "သင့်အသံမေးလ် စာတိုက်ပုံးတွင် ဘာမှမရှိပါ။" - "အနှစ်သက်ဆုံးများသာ ပြပါ" "ယခင်ခေါ်ဆိုမှုများ" "အားလုံး" "လွတ်သွားသော" - "အသံစာ" "အမြန် နံပါတ်လှည့်မှု" "ခေါ်ဆိုမှု မှတ်တမ်း" "အဆက်အသွယ်များ" "အသံမေးလ်" - "အနှစ်သက်ဆုံးများထဲမှာ ထုတ်လိုက်ပါပြီ" - "နောက်ပြန်လုပ်ပါ" "%s ကိုခေါ်ပါ" "အဆက်အသွယ် အသစ် ဖန်တီးရန်" "အဆက်အသွယ်သို့ ပေါင်းထည့်ရန်" "စာတို ပို့ရန်" "ဗီဒီယို ဖုန်းခေါ်ရန်" "နံပါတ်ကို ပိတ်ဆို့ရန်" - "လွတ်သွားသောဖုန်း %s ခါ" "သင်၏အမြန်ခေါ်စာရင်းတွင် မည်သူမျှ မရှိသေးပါ" "အနှစ်သက်ဆုံးတစ်ခု ထည့်ရန်" - "သင့်တွင် မည်သည့်အဆက်အသွယ်မျှ မရှိသေးပါ" - "အဆက်အသွယ်တစ်ယောက် ထည့်မည်" - "နံပါတ်အားလုံးကိုကြည့်ရန် ပုံကိုထိပါ (သို့) ပြန်စီရန် ထိပြီးဖိထားပါ" "ဖယ်ရှာခြင်း" + "အားလုံးကို ရွေးချယ်ပါ" "ဗီဒီယို ခေါ်ဆိုမှု" "စာ တစ်စောင် ပို့ပါ" "ဖုန်းခေါ်မှု အသေးစိတ်အချက်အလက်" @@ -164,25 +118,14 @@ "^1 အားခေါ်ရန်" "^1 ကိုဗီဒီယိုခေါ်ဆိုမည်။" "^1ထံမှ အသံစာကို နားထောင်ရန်" - "^1 မှ အသံအသုံးပြုစာအား ဖွင့်ပါ" - "^1 မှ အသံအသုံးပြုစာအား ရပ်ပါ" - "^1 မှ အသံအသုံးပြုစာအား ဖျက်ပါ" - - အသံသုံးပို့စာ အသစ် %d ခု - အသံသုံးပို့စာ အသစ် %d ခု - "^1 အတွက် အဆက်အသွယ် ဖန်တီးမည်" "^1 အားလက်ရှိ အဆက်အသွယ်သို့ ပေါင်းထည့်မည်" "^1၏ ခေါ်ဆိုမှု အသေးစိတ်များ" - "ခေါ်ဆိုမှု မှတ်တမ်းထဲမှ ဖျက်ပစ်ခဲ့" "ယနေ့" "မနေ့က" "ပိုဟောင်းသော" - "ခေါ်ဆိုမှုများ စာရင်း" "စပီကာကို ဖွင့်ပါ။" "စပီကာကို ပိတ်ပါ။" - "ပိုမြန်စွာ ကစားရန်" - "ပိုနှေးစွာ ကစားရန်" "ဖွင့်မှု စတင် သို့မဟုတ် ဆိုင်းငံ့ရန်" "ပြသမှုအတွက်ရွေးစရာများ" "အသံများနှင့် တုန်ခါမှု" @@ -199,7 +142,6 @@ "ခေါ်ဆိုမှုများ" "ခေါ်ဆိုမှု ပိတ်ဆို့ခြင်း" "အသံမေးလ်" - "အသံမေးလ်ဆက်တင်အတွက် SIM ရွေးပါ" "ခေါ်ဆိုမှုပိတ်ဆို့ခြင်း ယာယီပိတ်ထားသည်" "သင်သည် လွန်ခဲ့သည့် ၄၈ နာရီအတွင်း ဤဖုန်းဖြင့် အရေးပေါ်ဌာနကိုဖုန်း ခေါ်ဆိုခဲ့သောကြောင့် ခေါ်ဆိုမှုပိတ်ဆို့ခြင်းကို ဖြုတ်ထားသည်။ ၄၈ နာရီကျော်လွန်သည်နှင့် ၎င်းကိုအလိုအလျောက် ပြန်ဖွင့်ပေးပါမည်။" "နံပါတ်များ သွင်းရန်" @@ -213,12 +155,8 @@ "ပိတ်ထားသည့် နံပါတ်များ" "%1$s အားပိတ်ဆို့ထားပြီးပါပြီ။" "ခေါ်ဆိုသော အကောင့်များ" - "ဖွင့်ထားရန်" - "ခွင့်ပြုချက်များ သတ်မှတ်မည်" "မြန်နှုန်းမြင့်ဖုန်းခေါ်ဆိုမှုကို ဖွင့်ရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်ကို ဖွင့်ပါ။" "ခေါ်ဆိုမှုမှတ်တမ်းကို ကြည့်ရန်၊ ဖုန်းခွင့်ပြုချက်ကို ဖွင့်ပါ။" - "အဆက်အသွယ်များကိုကြည့်ရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်ကို ဖွင့်ပါ။" - "အသံမေးလ်ကိုအသုံးပြုရန်၊ ဖုန်းခွင့်ပြုချက်ကိုဖွင့်ပါ။" "သင့်အဆက်အသွယ်များကို ရှာဖွေရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်များကို ဖွင့်ပါ။" "ဖုန်းခေါ်ဆိုရန်၊ ဖုန်းခွင့်ပြုချက်ကိုဖွင့်ပါ။" "ဖုန်း အက်ပ်ဆီတွင် စနစ် ဆက်တင်များသို့ ရေးသားခွင့် မရှိပါ။" @@ -230,4 +168,10 @@ "စပမ်း" "%1$s သည် အော့ဖ်လိုင်းဖြစ်နေသောကြောင့် ဆက်သွယ်၍ မရနိုင်ပါ" "အကြောင်း" + "Google ၏ စာသားမှတ်တမ်း" + "Google က ကူးယူနေသည်…" + "စာသားမှတ်တမ်း မရရှိနိုင်ပါ" + "ကြည့်ရန်" + "ခေါ်ဆိုမှုကို ဖျက်လိုက်ပါပြီ။ မက်ဆေ့ဂျ်များရှိ ဤခေါ်ဆိုမှုအတောအတွင်း မျှဝေထားသော ပူးတွဲပါဖိုင်များကို ကြည့်ရှုပြီး ဖျက်ပါ။" + "ခေါ်ဆိုမှုကို ဖျက်လိုက်ပါပြီ။ မက်ဆေ့ဂျ်များရှိ ဤခေါ်ဆိုမှုများအတွင်း မျှဝေထားသော ပူးတွဲပါဖိုင်များကို ကြည့်ရှုပြီး ဖျက်ပါ။" diff --git a/java/com/android/dialer/app/res/values-nb/strings.xml b/java/com/android/dialer/app/res/values-nb/strings.xml index d92edc649..2c0965c2e 100644 --- a/java/com/android/dialer/app/res/values-nb/strings.xml +++ b/java/com/android/dialer/app/res/values-nb/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefontastatur" - "Telefon" "Anropslogg" - "Rapportér feil nummer" "Kopiér nummeret" "Kopiér transkripsjonen" - "Blokkér nummeret" - "Opphev blokkeringen av nummeret" "Endre nummeret før du ringer" "Slett anropsloggen" "Slett talepost" @@ -34,7 +30,6 @@ "Vil du slette anropsloggen?" "Dette sletter alle anrop fra loggen" "Sletter anropsloggen …" - "Ring" "Tapt anrop" "Tapt jobbanrop" "Tapte anrop" @@ -48,107 +43,66 @@ %1$d talemeldinger talemelding - "Spill av" "%1$s, %2$s" "Ny talemelding fra %1$s" "Kunne ikke spille av talepost" "Laster inn talepost …" - "Arkiverer taleposten …" "Kunne ikke laste inn taleposten" - "Bare anrop som gikk til talepostkasse" - "Bare innkommende anrop" - "Bare utgående anrop" - "Bare ubesvarte anrop" "(%1$d) %2$s" - "søk" - "ring" - "ring til" - "Spill av eller stopp avspillingen" "Slå høyttaleren på eller av" "Søk etter avspillingsposisjon" - "Reduser avspillingshastigheten" - "Øk avspillingshastigheten" "Anropslogg" "Flere alternativer" "Tastatur" - "Vis bare utgående" - "Vis bare innkommende" - "Vis bare tapte" - "Vis bare talemeldinger" - "Vis alle samtaler" - "Legg til pause på 2 sek." - "Legg til Vent" "Innstillinger" "Simulator" - "Alle kontakter" - "Bruk tonetastatur" - "Gå tilbake til aktiv samtale" - "Legg til en samtale" - "Innkommende samtaler" - "Spill av talemelding" - "Se kontakten %1$s" - "Ring %1$s" + "Nytt grensesnitt – lag snarvei" + "Starter massehandlingsmodus" + "Massehandlingsmodus er avsluttet" + "Du har valgt %1$s" + "Du har valgt bort %1$s" "Kontaktinformasjon for %1$s" "Kontaktdetaljer for den potensielt useriøse oppringeren %1$s" "%1$s samtaler." "Videoanrop." - "Send SMS til %1$s" - "Ikke avspilt talepost" "Start talesøk" - "Ring %s" "Telefonsvarer" - "%s sek" - "%s min %s sek" - "talepost" - "talepost" - "Ja" - "Nei" - "Slett markert %1$s?" + "Avbryt massehandlinsmodus" + "Slett" + "Avbryt" + "%1$s er valgt" + + ""Vil du slette disse talemeldingene? "" + ""Vil du slette denne talemeldingen? "" + @string/call_log_header_today "%1$s kl. %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Kan ikke ringe dette nummeret" - "For å konfigurere talepostfunksjonen, gå til Meny > Innstillinger." - "Du må slå av flymodus før du kan sjekke talepostkassen." - "Laster inn …" - "IMEI" - "MEID" - "Henter fra SIM-kort…" - "Kontakter på SIM-kort" - "Ingen kontaktapper er tilgjengelige" "Talesøk er ikke tilgjengelig" - "Kan ikke ringe fordi Telefon-appen er deaktivert." "Søk i kontakter" "Legg til nummer eller søk etter kontakter" "Anropsloggen er tom" "Start en samtale" "Du har ingen tapte anrop." "Talepostkassen din er tom." - "Vis bare favoritter" "Anropslogg" "Alle" "Ubesvarte" - "Talemeldinger" "Hurtigvalg" "Anropslogg" "Kontakter" "Talepostkasse" - "Fjernet fra favoritter" - "Angre" "Ring %s" "Opprett ny kontakt" "Legg til for en kontakt" "Send SMS" "Start en videosamtale" "Blokkér nummeret" - "%s nye tapte anrop" "Du har ingen på hurtigoppringning ennå" "Legg til en favoritt" - "Du har ingen kontakter ennå" - "Legg til en kontakt" - "Trykk på bildet for å se alle numrene, eller trykk og hold for å omorganisere" "Fjern" + "Velg alle" "Videoanrop" "Send en melding" "Samtaleinformasjon" @@ -164,25 +118,14 @@ "Ring ^1" "Start videoanrop med ^1." "Lytt til talepostkasse fra ^1" - "Spill av talemelding fra ^1" - "Sett talemelding fra ^1 på pause" - "Slett talemelding fra ^1" - - %d nye taleposter - %d ny talepost - "Opprett kontakt for ^1" "Legg ^1 til en eksisterende kontakt" "Samtaledetaljer for ^1" - "Slettet fra anropsloggen" "I dag" "I går" "Eldre" - "Anropsliste" "Slå på høyttaleren." "Slå av høyttaleren." - "Spill av raskere." - "Spill av saktere." "Start eller stopp avspillingen." "Visningsalternativer" "Lyder og vibrasjon" @@ -199,7 +142,6 @@ "Anrop" "Anropsblokkering" "Talepost" - "Velg SIM for talepostinnstillinger" "Blokkering av anrop er midlertidig slått av" "Blokkering av anrop er slått av fordi du kontaktet nødtjenester fra denne telefonen i løpet av de siste 48 timene. Funksjonen blir automatisk slått på igjen når perioden på 48 timer er utløpt." "Importér numre" @@ -213,12 +155,8 @@ "Blokkerte numre" "%1$s er allerede blokkert." "Ringekontoer" - "Slå på" - "Angi tillatelser" "For å slå på hurtigoppringning, slå på Kontakter-tillatelsen." "For å se samtaleloggen din, slå på Telefon-tillatelsen." - "For å se kontaktene dine, slå på Kontakter-tillatelsen." - "For å få tilgang til talepostkassen, slå på Telefon-tillatelsen." "For å søke i kontaktene dine, slå på tillatelser for Kontakter." "For å ringe, slå på Telefon-tillatelsen." "Telefonappen har ikke tillatelse til å skrive til systeminnstillinger." @@ -230,4 +168,10 @@ "Nettsøppel" "%1$s er frakoblet og kan ikke nås" "Om" + "Transkribert av Google" + "Google transkriberer …" + "Ingen transkripsjon" + "Se" + "Anropet er slettet. Se og slett vedleggene som ble delt i denne samtalen, i Meldinger." + "Anropene er slettet. Se og slett vedleggene som ble delt i samtalene, i Meldinger." diff --git a/java/com/android/dialer/app/res/values-ne/strings.xml b/java/com/android/dialer/app/res/values-ne/strings.xml index 90a3016e2..5a7d0c6ba 100644 --- a/java/com/android/dialer/app/res/values-ne/strings.xml +++ b/java/com/android/dialer/app/res/values-ne/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "फोन" "फोनको किप्याड" - "फोन" "कल इतिहास" - "गलत नम्बर रिपोर्ट गर्नुहोस्" "नम्बर प्रतिलिपि गर्नुहोस्" "ट्रान्सक्रिप्शनको प्रतिलिपि बनाउँनुहोस्" - "नम्बरलाई रोक्नुहोस्" - "नम्बर माथिको रोक हटाउनुहोस्" "कल गर्न अगाडि नम्बर सम्पादन गर्नुहोस्" "कल इतिहास हटाउनुहोस्" "भ्वाइसमेल हटाउनुहोस्" @@ -34,7 +30,6 @@ "कल इतिहास मेटाउने हो?" "यस कार्यले तपाईँको इतिहासबाट सबै कल मेट्नेछ" "कल इतिहास हाटउँदै..." - "फोन" "छुटेका कल" "छुटेको कार्यको कल" "छुटेका कलहरू" @@ -48,107 +43,66 @@ %1$d भ्वाइसमेलहरू भ्वाइसमेल - "बजाउनुहोस्" "%1$s , %2$s" "%1$s बाट नयाँ भ्वाइसमेल" "भ्वाइस मेललाई बजाउन सकिएन" "भ्वाइस मेल लोड हुँदै ..." - "भ्वाइस मेलको अभिलेख राख्दै..." "भ्वाइस मेललाई लोड गर्न सकिएन" - "भ्वाइसमेलका साथ मात्र कल गर्नुहोस्" - "आगमन कलहरू मात्र" - "बहिर्गमन कलहरू मात्र" - "छुटेका कलहरू मात्र" "( %1$d ) %2$s" - "खोजी गर्नुहोस्" - "डायल" - "डायल गर्न संख्या" - "प्लेब्याक चलाउनुहोस वा रोक्नुहोस्" "स्पीकरफोन खोल्नुहोस् वा बन्द गर्नुहोस्" "प्लेब्याक स्थिति खोज्नुहोस्" - "प्लेब्याक दर कम गर्नुहोस्" - "प्लेब्याक दर बढाउनुहोस्" "कलको इतिहास" "थप विकल्पहरू" "किप्याड" - "बहिर्गमन मात्र देखाउनुहोस्" - "आगमन कल मात्र देखाउनुहोस्" - "छुटेकाहरू मात्र देखाउनुहोस्" - "भ्वाइसमेलहरू मात्र देखाउनुहोस्" - "सबै कलहरू देखाउनुहोस्" - "२ सेकन्डको रोकाइ थप्नुहोस्" - "पर्खाइ थप्नुहोस्" "सेटिङ्हरू" "सिम्युलेटर" - "सबै सम्पर्कहरू" - "स्पर्श टोन किप्याडको प्रयोग गर्नुहोस्" - "हुदै गरेको कलमा फर्कनुहोस्" - "कल थप्नुहोस्" - "आगमन कलहरू" - "भ्वाइसमेल बजाउनुहोस्" - "%1$s सम्पर्क हेर्नुहोस्" - "कल %1$s" + "नयाँ UI सर्टकट सिर्जना गर्ने" + "बल्क कारबाही सम्बन्धी मोडमा प्रवेश गर्दै" + "बल्क कारबाही सम्बन्धी मोड छोडियो" + "%1$s चयन गरियो" + "%1$s चयन हटाइयो" "%1$s को लागि सम्पर्क विवरणहरू" "शंकास्पद स्प्याम कलर %1$s का सम्पर्क सम्बन्धी विवरणहरू" "%1$s कल।" "भिडियो कल।" - "%1$sलाई SMS पठाउनुहोस्" - "नसुनिएका भ्वाइसमेल" "आवाज खोजी सुरु गर्नुहोस्" - "%s कल गर्नुहोस्" "भ्वाइसमेल" - "%s सेकेन्ड" - "%s मिनेट %s सकेन्ड" - "भ्वाइस मेल" - "भ्वाइस मेलहरू" - "हो" - "होइन" - "चयन गरिएका %1$s लाई मेटाउने हो?" + "ब्याच सम्बन्धी कारबाहीको मोडलाई रद्द गर्नुहोस्" + "मेट्नुहोस्" + "रद्द गर्नुहोस्" + "%1$s चयन गरियो" + + ""यी भ्वाइस मेलहरू मेट्ने हो? "" + ""यो भ्वाइस मेल मेट्ने हो? "" + @string/call_log_header_today "%1$s मा %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "यस नम्बरलाई कल गर्न सकिंदैन" - "भ्वाइसमेल सेट गर्न मेनु > सेटिङहरूमा जानुहोस्।" - "भ्वाइसमेल कल गर्न पहिले हवाइजहाज मोडलाई निष्क्रिय पार्नुहोस्।" - "लोड हुँदै..." - "IMEI" - "MEID" - "SIM कार्डबाट लोड हुँदै" - "SIM कार्ड सम्पर्कहरू" - "कुनै पनि सम्पर्क अनुप्रयोग उपलब्ध छैन" "आवाज खोजी उपलब्ध छैन" - "फोन अनुप्रयोग असक्षम गरिएकोले फोन गर्न सकिँदैन।" "सम्पर्कहरू खोज्नुहोस्" "नम्बर थप्नुहोस् वा सम्पर्कहरू खोज्नुहोस्" "तपाईँको कल इतिहास खाली छ" "कल गर्नुहोस्" "तपाईँसँग कुनै पनि छुटेका कलहरू छैनन्।" "तपाईँको भ्वाइस मेल खाली छ।" - "मनपर्ने मात्र देखाउनुहोस्" "कल इतिहास" "सबै" "छुटेको" - "Voicemail" "द्रूत डायल" "कल इतिहास" "सम्पर्कहरू" "भ्वाइसमेल" - "मनपर्नेहरूबाट हटाइयो" - "अनडु गर्नुहोस्" "%s कल गर्नुहोस्" "नयाँ सम्पर्क सिर्जना गर्नुहोस्" "सम्पर्कमा थप्नुहोस्" "SMS पठाउनुहोस्" "भिडियो कल बनाउनुहोस्" "नम्बरलाई निषेध गर्नुहोस्" - "%s नयाँ छुटेका कलहरु" "तपाईँको स्पिड डायलमा अझसम्म कोही छैन" "एक मनपर्ने थप्नुहोस्" - "तपाईँसँग अझसम्म कुनै सम्पर्कहरू छैनन्" - "एउटा सम्पर्क थप्नुहोस्" - "सबै नम्बरहरू हेर्न छविलाई छुनुहोस् वा पुन:क्रमबद्ध गर्न छोइराख्नुहोस्" "हटाउँनुहोस्" + "सबैलाई चयन गर्नुहोस्" "भिडियो कल" "सन्देश पठाउनुहोस्" "कल विवरणहरु" @@ -164,25 +118,14 @@ "^1 कल गर्नुहोस्" "^1 भिडियो कल गर्नुहोस्।" "^1 बाट भ्वाइसमेल सुन्नुहोस्" - "^1 बाट भ्वाइस मेल बजाउनुहोस्" - "^1 बाट भ्वाइस मेल रोक्नुहोस्" - "^1 बाट भ्वाइस मेल मेटाउनुहोस्" - - %d नयाँ भ्वाइस मेलहरू - %d नयाँ भ्वाइस मेल - "^1 का लागि नयाँ सम्पर्क बनाउँनुहोस्" "विद्यमान सम्पर्कमा ^1 थप्नुहोस्" "^1 का लागि कल विवरणहरू" - "कल इतिहासबाट मेटाइयो" "आज" "हिजो" "अझ पुरानो" - "कल सूची" "स्पिकर खोल्नुहोस्।" "स्पिकर बन्द गर्नुहोस्।" - "छिटो चलाउनुहोस्।" - "ढिलो चलाउनुहोस्।" "दोहर्याउने सुरु गर्नुहोस् वा रोक्नुहोस्।" "विकल्पहरू प्रदर्शन गर्नुहोस्" "ध्वनि र कम्पन" @@ -199,7 +142,6 @@ "कलहरू" "कल रोक्दै" "भ्वाइस मेल" - "भ्वाइस मेल सेटिङ गर्न SIM छान्ने" "कल अवरुद्ध अस्थायी रुपमा निष्क्रिय" "कल अवरुद्ध अस्थायी रुपमा असक्षम गरिएको छ किनभने तपाईँले अन्तिम ४८ घन्टा भित्र यस फोनबाट आपत्कालीन सेवाहरू सम्पर्क गर्नुभयो। एकपटक ४८ घन्टा अवधि समाप्त भएपछि यो स्वचालित रूपले पुनः सक्रिय हुनेछ।" "नम्बरहरू आयात गर्नुहोस्" @@ -213,12 +155,8 @@ "रोकिएका नम्बरहरू" "%1$s पहिले नै रोकिएको छ।" "खाता कलिङ" - "सक्रिय पार्नुहोस्" - "अनुमतिहरू सेट गर्नुहोस्" "तीव्र डायल सक्षम गर्न, सम्पर्क अनुमति सक्षम गर्नुहोस्।" "आफ्नो कल लग हेर्न, फोन अनुमति सक्रिय गर्नुहोस्।" - "आफ्नो सम्पर्क हेर्न सम्पर्क अनुमति सक्रिय गर्नुहोस्।" - "आफ्नो भ्वाइस मेल पहुँच गर्न, फोन अनुमति सक्रिय गर्नुहोस्" "तपाईँको सम्पर्कहरू खोज गर्न सम्पर्क अनुमतिहरू सक्रिय गर्नुहोस्।" "कल गर्न फोन अनुमति सक्रिय गर्नुहोस्।" "प्रणाली सेटिङहरूमा लेख्न फोन अनुप्रयोगसँग अनुमति छैन।" @@ -230,4 +168,10 @@ "स्प्याम" "%1$s अफलाइन हुनुहुन्छ र वहाँलाई भेट्न सकिँदैन" "बारेमा" + "Google द्वारा ट्रान्सक्राइब गरिएको" + "Google ले ट्रान्सक्राइब गर्दैछ …" + "ट्रान्स्क्रिप्ट उपलब्ध छैन" + "हेर्नुहोस्" + "कल मेटाइयो। Messages मा गरिएको यो कलका क्रममा समावेश गरी आदान-प्रदान गरिएका कागजातलाई हेर्नुहोस् र मेटाउनुहोस्।" + "कलहरू मेटाइए। Messages मा गरिएका कलहरूमा समावेश गरी आदान-प्रदान गरिएका कागजातलाई हेर्नुहोस् र मेटाउनुहोस्।" diff --git a/java/com/android/dialer/app/res/values-nl/strings.xml b/java/com/android/dialer/app/res/values-nl/strings.xml index 5f41b8063..0e3c0c0d6 100644 --- a/java/com/android/dialer/app/res/values-nl/strings.xml +++ b/java/com/android/dialer/app/res/values-nl/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefoon" "Toetsenblok van telefoon" - "Telefoon" "Oproepgeschiedenis" - "Onjuist nummer melden" "Nummer kopiëren" "Transcriptie kopiëren" - "Nummer blokkeren" - "Blokkeren van nummer opheffen" "Nummer bewerken vóór bellen" "Oproepgeschiedenis wissen" "Voicemail verwijderen" @@ -34,7 +30,6 @@ "Oproepgeschiedenis wissen?" "Hiermee worden alle oproepen uit je geschiedenis verwijderd" "Oproepgeschiedenis wissen…" - "Telefoon" "Gemiste oproep" "Gemiste zakelijke oproep" "Gemiste oproepen" @@ -48,107 +43,66 @@ %1$d voicemails Voicemail - "Afspelen" "%1$s, %2$s" "Nieuwe voicemail van %1$s" "Kan voicemail niet afspelen" "Voicemail laden…" - "Voicemail archiveren…" "Kan voicemail niet laden" - "Alleen oproepen met voicemail" - "Alleen inkomende oproepen" - "Alleen uitgaande oproepen" - "Alleen gemiste oproepen" "(%1$d) %2$s" - "zoeken" - "bellen" - "nummer om te bellen" - "Afspelen starten of stoppen" "Luidsprekertelefoon in- of uitschakelen" "Afspeelpositie zoeken" - "Afspeelsnelheid verlagen" - "Afspeelsnelheid verhogen" "Oproepgeschiedenis" "Meer opties" "toetsenblok" - "Alleen uitgaand weergeven" - "Alleen inkomend weergeven" - "Alleen gemist weergeven" - "Alleen voicemails weergeven" - "Alle oproepen weergeven" - "Pauze van 2 seconden toevoegen" - "Wachten toevoegen" "Instellingen" "Simulator" - "Alle contacten" - "Toetsen voor toonkiezen gebruiken" - "Terug naar actief gesprek" - "Oproep toevoegen" - "Inkomende oproepen" - "Voicemail afspelen" - "Contact %1$s bekijken" - "%1$s bellen" + "Snelkoppeling voor nieuwe UI" + "Modus voor bulkacties openen" + "Modus voor bulkacties verlaten" + "%1$s geselecteerd" + "Selectie van %1$s opgeheven" "Contactgegevens voor %1$s" "Contactgegevens voor vermoedelijke spambeller %1$s" "%1$s telefoongesprekken." "Videogesprek." - "Sms verzenden naar %1$s" - "Niet-beluisterde voicemail" "Gesproken zoekopdracht" - "%s bellen" "Voicemail" - "%s sec." - "%s min. %s sec." - "voicemail" - "voicemails" - "Ja" - "Nee" - "Geselecteerde %1$s verwijderen?" + "Modus voor batchacties annuleren" + "Verwijderen" + "Annuleren" + "%1$s geselecteerd" + + ""Deze voicemails verwijderen? "" + ""Deze voicemail verwijderen? "" + @string/call_log_header_today "%1$s om %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Kan dit nummer niet bellen" - "Voor het instellen van voicemail ga je naar Menu > Instellingen." - "Als je je voicemail wilt bellen, moet je eerst de Vliegtuigmodus uitschakelen." - "Laden..." - "IMEI-nummer" - "MEID" - "Laden vanaf SIM-kaart..." - "Contacten op SIM-kaart" - "Geen app voor contacten beschikbaar" "Gesproken zoekopdracht niet beschikbaar" - "Kan niet bellen omdat de Telefoon-app is uitgeschakeld." "Contacten zoeken" "Voeg nummer toe of zoek contacten" "Je oproepgeschiedenis is leeg" "Bellen" "Je hebt geen gemiste oproepen." "Je voicemail-inbox is leeg." - "Alleen favorieten weergeven" "Oproepgeschiedenis" "Alle" "Gemist" - "Voicemail" "Snelkeuze" "Oproepgeschiedenis" "Contacten" "Voicemail" - "Verwijderd uit favorieten" - "Ongedaan maken" "%s bellen" "Nieuw contact maken" "Toevoegen aan een contact" "Sms verzenden" "Videogesprek starten" "Nummer blokkeren" - "%s nieuwe gemiste oproepen" "Er staat nog niemand in je snelkeuzelijst" "Een favoriet toevoegen" - "Je hebt nog geen contacten" - "Contact toevoegen" - "Tik op de afbeelding om alle nummers te bekijken of tik op de afbeelding en houd vast om opnieuw te rangschikken" "Verwijderen" + "Alles selecteren" "Videogesprek" "Een bericht verzenden" "Oproepdetails" @@ -164,25 +118,14 @@ "^1 bellen" "Videogesprek ^1." "Voicemail beluisteren van ^1" - "Voicemail van ^1 afspelen" - "Voicemail van ^1 onderbreken" - "Voicemail van ^1 verwijderen" - - %d nieuwe voicemails - %d nieuwe voicemail - "Contact maken voor ^1" "^1 toevoegen aan bestaand contact" "Oproepgegevens voor ^1" - "Verwijderd uit oproepgeschiedenis" "Vandaag" "Gisteren" "Ouder" - "Lijst met oproepen" "Luidspreker inschakelen." "Luidspreker uitschakelen." - "Sneller afspelen." - "Langzamer afspelen." "Afspelen starten of onderbreken." "Weergaveopties" "Geluiden en trillingen" @@ -199,7 +142,6 @@ "Oproepen" "Oproepen blokkeren" "Voicemail" - "Selecteer simkaart voor voicemail" "Oproepblokkering tijdelijk uitgeschakeld" "Oproepblokkering is uitgeschakeld omdat je in de afgelopen 48 uur contact met de noodhulpdiensten hebt opgenomen via deze telefoon. De functie wordt automatisch weer ingeschakeld nadat de periode van 48 uur is verstreken." "Nummers importeren" @@ -213,12 +155,8 @@ "Geblokkeerde nummers" "%1$s is al geblokkeerd." "Oproepaccounts" - "Inschakelen" - "Toestemmingen instellen" "Als je de snelkeuzefunctie wilt inschakelen, schakel je de machtiging voor Contacten in." "Als je je gesprekkenlijst wilt bekijken, schakel je de machtiging voor Telefoon in." - "Als je je contacten wilt bekijken, schakel je de machtiging voor Contacten in." - "Als je je voicemail wilt beluisteren, schakel je de machtiging voor Telefoon in." "Als je naar contacten wilt zoeken, schakel je de contacttoestemming in." "Als je iemand wilt bellen, schakel je de machtiging voor Telefoon in." "Telefoon-app heeft geen toestemming om systeeminstellingen te schrijven." @@ -230,4 +168,10 @@ "Spam" "%1$s is offline en kan niet worden bereikt" "Over" + "Getranscribeerd door Google" + "Bezig met transcriberen…" + "Transcript niet beschikbaar" + "Weergeven" + "Gesprek verwijderd. Bijlagen die in dit gesprek zijn gedeeld, kun je bekijken en verwijderen via Berichten." + "Gesprekken verwijderd. Bijlagen die in deze gesprekken zijn gedeeld, kun je bekijken en verwijderen via Berichten." diff --git a/java/com/android/dialer/app/res/values-no/strings.xml b/java/com/android/dialer/app/res/values-no/strings.xml index d92edc649..2c0965c2e 100644 --- a/java/com/android/dialer/app/res/values-no/strings.xml +++ b/java/com/android/dialer/app/res/values-no/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefontastatur" - "Telefon" "Anropslogg" - "Rapportér feil nummer" "Kopiér nummeret" "Kopiér transkripsjonen" - "Blokkér nummeret" - "Opphev blokkeringen av nummeret" "Endre nummeret før du ringer" "Slett anropsloggen" "Slett talepost" @@ -34,7 +30,6 @@ "Vil du slette anropsloggen?" "Dette sletter alle anrop fra loggen" "Sletter anropsloggen …" - "Ring" "Tapt anrop" "Tapt jobbanrop" "Tapte anrop" @@ -48,107 +43,66 @@ %1$d talemeldinger talemelding - "Spill av" "%1$s, %2$s" "Ny talemelding fra %1$s" "Kunne ikke spille av talepost" "Laster inn talepost …" - "Arkiverer taleposten …" "Kunne ikke laste inn taleposten" - "Bare anrop som gikk til talepostkasse" - "Bare innkommende anrop" - "Bare utgående anrop" - "Bare ubesvarte anrop" "(%1$d) %2$s" - "søk" - "ring" - "ring til" - "Spill av eller stopp avspillingen" "Slå høyttaleren på eller av" "Søk etter avspillingsposisjon" - "Reduser avspillingshastigheten" - "Øk avspillingshastigheten" "Anropslogg" "Flere alternativer" "Tastatur" - "Vis bare utgående" - "Vis bare innkommende" - "Vis bare tapte" - "Vis bare talemeldinger" - "Vis alle samtaler" - "Legg til pause på 2 sek." - "Legg til Vent" "Innstillinger" "Simulator" - "Alle kontakter" - "Bruk tonetastatur" - "Gå tilbake til aktiv samtale" - "Legg til en samtale" - "Innkommende samtaler" - "Spill av talemelding" - "Se kontakten %1$s" - "Ring %1$s" + "Nytt grensesnitt – lag snarvei" + "Starter massehandlingsmodus" + "Massehandlingsmodus er avsluttet" + "Du har valgt %1$s" + "Du har valgt bort %1$s" "Kontaktinformasjon for %1$s" "Kontaktdetaljer for den potensielt useriøse oppringeren %1$s" "%1$s samtaler." "Videoanrop." - "Send SMS til %1$s" - "Ikke avspilt talepost" "Start talesøk" - "Ring %s" "Telefonsvarer" - "%s sek" - "%s min %s sek" - "talepost" - "talepost" - "Ja" - "Nei" - "Slett markert %1$s?" + "Avbryt massehandlinsmodus" + "Slett" + "Avbryt" + "%1$s er valgt" + + ""Vil du slette disse talemeldingene? "" + ""Vil du slette denne talemeldingen? "" + @string/call_log_header_today "%1$s kl. %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Kan ikke ringe dette nummeret" - "For å konfigurere talepostfunksjonen, gå til Meny > Innstillinger." - "Du må slå av flymodus før du kan sjekke talepostkassen." - "Laster inn …" - "IMEI" - "MEID" - "Henter fra SIM-kort…" - "Kontakter på SIM-kort" - "Ingen kontaktapper er tilgjengelige" "Talesøk er ikke tilgjengelig" - "Kan ikke ringe fordi Telefon-appen er deaktivert." "Søk i kontakter" "Legg til nummer eller søk etter kontakter" "Anropsloggen er tom" "Start en samtale" "Du har ingen tapte anrop." "Talepostkassen din er tom." - "Vis bare favoritter" "Anropslogg" "Alle" "Ubesvarte" - "Talemeldinger" "Hurtigvalg" "Anropslogg" "Kontakter" "Talepostkasse" - "Fjernet fra favoritter" - "Angre" "Ring %s" "Opprett ny kontakt" "Legg til for en kontakt" "Send SMS" "Start en videosamtale" "Blokkér nummeret" - "%s nye tapte anrop" "Du har ingen på hurtigoppringning ennå" "Legg til en favoritt" - "Du har ingen kontakter ennå" - "Legg til en kontakt" - "Trykk på bildet for å se alle numrene, eller trykk og hold for å omorganisere" "Fjern" + "Velg alle" "Videoanrop" "Send en melding" "Samtaleinformasjon" @@ -164,25 +118,14 @@ "Ring ^1" "Start videoanrop med ^1." "Lytt til talepostkasse fra ^1" - "Spill av talemelding fra ^1" - "Sett talemelding fra ^1 på pause" - "Slett talemelding fra ^1" - - %d nye taleposter - %d ny talepost - "Opprett kontakt for ^1" "Legg ^1 til en eksisterende kontakt" "Samtaledetaljer for ^1" - "Slettet fra anropsloggen" "I dag" "I går" "Eldre" - "Anropsliste" "Slå på høyttaleren." "Slå av høyttaleren." - "Spill av raskere." - "Spill av saktere." "Start eller stopp avspillingen." "Visningsalternativer" "Lyder og vibrasjon" @@ -199,7 +142,6 @@ "Anrop" "Anropsblokkering" "Talepost" - "Velg SIM for talepostinnstillinger" "Blokkering av anrop er midlertidig slått av" "Blokkering av anrop er slått av fordi du kontaktet nødtjenester fra denne telefonen i løpet av de siste 48 timene. Funksjonen blir automatisk slått på igjen når perioden på 48 timer er utløpt." "Importér numre" @@ -213,12 +155,8 @@ "Blokkerte numre" "%1$s er allerede blokkert." "Ringekontoer" - "Slå på" - "Angi tillatelser" "For å slå på hurtigoppringning, slå på Kontakter-tillatelsen." "For å se samtaleloggen din, slå på Telefon-tillatelsen." - "For å se kontaktene dine, slå på Kontakter-tillatelsen." - "For å få tilgang til talepostkassen, slå på Telefon-tillatelsen." "For å søke i kontaktene dine, slå på tillatelser for Kontakter." "For å ringe, slå på Telefon-tillatelsen." "Telefonappen har ikke tillatelse til å skrive til systeminnstillinger." @@ -230,4 +168,10 @@ "Nettsøppel" "%1$s er frakoblet og kan ikke nås" "Om" + "Transkribert av Google" + "Google transkriberer …" + "Ingen transkripsjon" + "Se" + "Anropet er slettet. Se og slett vedleggene som ble delt i denne samtalen, i Meldinger." + "Anropene er slettet. Se og slett vedleggene som ble delt i samtalene, i Meldinger." diff --git a/java/com/android/dialer/app/res/values-pa/strings.xml b/java/com/android/dialer/app/res/values-pa/strings.xml index 76d4b9b70..31b2a276a 100644 --- a/java/com/android/dialer/app/res/values-pa/strings.xml +++ b/java/com/android/dialer/app/res/values-pa/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ਫ਼ੋਨ" "ਫ਼ੋਨ ਕੀਪੈਡ" - "ਫੋਨ" "ਕਾਲ ਇਤਿਹਾਸ" - "ਗਲਤ ਨੰਬਰ ਦੀ ਰਿਪੋਰਟ ਕਰੋ" "ਨੰਬਰ ਕਾਪੀ ਕਰੋ" "ਲਿਪੀ ਬਦਲਣਾ ਕਾਪੀ ਕਰੋ" - "ਨੰਬਰ ਨੂੰ ਬਲੌਕ ਕਰੋ" - "ਨੰਬਰ ਨੂੰ ਅਨਬਲੌਕ ਕਰੋ" "ਕਾਲ ਤੋਂ ਪਹਿਲਾਂ ਨੰਬਰ ਸੰਪਾਦਿਤ ਕਰੋ" "ਕਾਲ ਇਤਿਹਾਸ ਹਟਾਓ" "ਵੌਇਸਮੇਲ ਮਿਟਾਓ" @@ -34,7 +30,6 @@ "ਕੀ ਕਾਲ ਇਤਿਹਾਸ ਹਟਾਉਣਾ ਹੈ?" "ਇਹ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਤੋਂ ਸਾਰੀਆਂ ਕਾਲਾਂ ਮਿਟਾ ਦੇਵੇਗਾ" "ਕਾਲ ਇਤਿਹਾਸ ਹਟਾ ਰਿਹਾ ਹੈ…" - "ਫੋਨ" "ਮਿਸਡ ਕਾਲ" "ਕੰਮ ਨਾਲ ਸਬੰਧਿਤ ਖੁੰਝੀ ਕਾਲ" "ਮਿਸ ਹੋਈਆਂ ਕਾਲਾਂ" @@ -48,107 +43,66 @@ %1$d ਵੌਇਸਮੇਲਾਂ %1$d ਵੌਇਸਮੇਲਾਂ - "ਪਲੇ ਕਰੋ" "%1$s, %2$s" "%1$s ਦੀ ਨਵੀਂ ਵੌਇਸਮੇਲ" "ਵੌਇਸਮੇਲ ਪਲੇ ਨਹੀਂ ਕਰ ਸਕਿਆ" "ਵੌਇਸਮੇਲ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ…" - "ਵੌਇਸਮੇਲ ਪੁਰਾਲੇਖਬੱਧ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…" "ਵੌਇਸਮੇਲ ਲੋਡ ਨਹੀਂ ਕਰ ਸਕਿਆ" - "ਕੇਵਲ ਵੌਇਸਮੇਲ ਵਾਲੀਆਂ ਕਾਲਾਂ" - "ਕੇਵਲ ਇਨਕਮਿੰਗ ਕਾਲਾਂ" - "ਕੇਵਲ ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ" - "ਕੇਵਲ ਮਿਸਡ ਕਾਲਾਂ" "(%1$d) %2$s" - "ਖੋਜੋ" - "ਡਾਇਲ ਕਰੋ" - "ਡਾਇਲ ਕਰਨ ਲਈ ਨੰਬਰ" - "ਪਲੇਬੈਕ ਪਲੇ ਕਰੋ ਜਾਂ ਰੋਕੋ" "ਸਪੀਕਰਫੋਨ ਨੂੰ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕਰੋ" "ਪਲੇਬੈਕ ਪੋਜੀਸ਼ਨ ਖੋਜੋ" - "ਪਲੇਬੈਕ ਰੇਟ ਘਟਾਓ" - "ਪਲੇਬੈਕ ਰੇਟ ਵਧਾਓ" "ਕਾਲ ਇਤਿਹਾਸ" "ਹੋਰ ਚੋਣਾਂ" "ਕੀ-ਪੈਡ" - "ਕੇਵਲ ਆਊਟਗੋਇੰਗ ਦਿਖਾਓ" - "ਕੇਵਲ ਇਨਕਮਿੰਗ ਦਿਖਾਓ" - "ਕੇਵਲ ਮਿਸਡ ਦਿਖਾਓ" - "ਕੇਵਲ ਵੌਇਸਮੇਲਾਂ ਦਿਖਾਓ" - "ਸਾਰੀਆਂ ਕਾਲਾਂ ਦਿਖਾਓ" - "2-ਸਕਿੰਟ ਦਾ ਪੌਜ ਜੋੜੋ" - "ਉਡੀਕ ਜੋੜੋ" "ਸੈਟਿੰਗਾਂ" "ਸਿਮੁਲੇਟਰ" - "ਸਾਰੇ ਸੰਪਰਕ" - "ਟਚ ਟੋਨ ਕੀਪੈਡ ਵਰਤੋ" - "ਪ੍ਰਗਤੀ ਵਿੱਚ ਕਾਲ ਤੇ ਵਾਪਸ ਜਾਓ" - "ਕਾਲ ਜੋੜੋ" - "ਇਨਕਮਿੰਗ ਕਾਲਾਂ" - "ਵੌਇਸਮੇਲ ਪਲੇ ਕਰੋ" - "ਸੰਪਰਕ %1$s ਦੇਖੋ" - "%1$s ਨੂੰ ਕਾਲ ਕਰੋ" + "ਨਵਾਂ UI ਸ਼ਾਰਟਕੱਟ ਬਣਾਓ" + "ਬਲਕ ਕਾਰਵਾਈ ਮੋਡ ਵਿੱਚ ਦਾਖਲ ਹੋਇਆ ਜਾ ਰਿਹਾ ਹੈ" + "ਬਲਕ ਕਾਰਵਾਈ ਮੋਡ ਨੂੰ ਛੱਡਿਆ" + "%1$s ਨੂੰ ਚੁਣਿਆ ਗਿਆ" + "%1$s ਨੂੰ ਅਣ-ਚੁਣਿਆ ਕੀਤਾ ਗਿਆ" "%1$s ਲਈ ਸੰਪਰਕ ਵੇਰਵੇ" "ਸ਼ੱਕੀ ਸਪੈਮ ਕਾਲਰ %1$s ਲਈ ਸੰਪਰਕ ਵੇਰਵੇ" "%1$s ਕਾਲਾਂ।" "ਵੀਡੀਓ ਕਾਲ।" - "%1$s ਨੂੰ SMS ਭੇਜੋ" - "ਅਣਸੁਣੀ ਵੌਇਸਮੇਲ" "ਵੌਇਸ ਖੋਜ ਚਾਲੂ ਕਰੋ" - "%s ਨੂੰ ਕਾਲ ਕਰੋ" "ਵੌਇਸਮੇਲ" - "%s ਸਕਿੰਟ" - "%s ਮਿੰਟ %s ਸਕਿੰਟ" - "ਵੌਇਸਮੇਲ" - "ਵੌਇਸਮੇਲਾਂ" - "ਹਾਂ" - "ਨਹੀਂ" - "ਕੀ ਚੁਣੀ(ਆਂ) ਹੋਈ(ਆਂ) %1$s ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?" + "ਬੈਚ ਕਾਰਵਾਈਆਂ ਮੋਡ ਨੂੰ ਰੱਦ ਕਰੋ" + "ਮਿਟਾਓ" + "ਰੱਦ ਕਰੋ" + "%1$s ਨੂੰ ਚੁਣਿਆ ਗਿਆ" + + ""ਕੀ ਇਸ ਵੌਇਸਮੇਲ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ? "" + ""ਕੀ ਇਹਨਾਂ ਵੌਇਸਮੇਲਾਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ? "" + @string/call_log_header_today "%1$s ਨੂੰ %2$s ਵਜੇ" "%1$02d:%2$02d" "%1$s%2$s" - "ਇਸ ਨੰਬਰ ਤੇ ਕਾਲ ਨਹੀਂ ਕਰ ਸਕਦਾ" - "ਵੌਇਸਮੇਲ ਸਥਾਪਤ ਕਰਨ ਲਈ, ਮੀਨੂ > ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।" - "ਵੌਇਸਮੇਲ ਕਾਲ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਜਹਾਜ਼ ਮੋਡ ਬੰਦ ਕਰੋ।" - "ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ…" - "IMEI" - "MEID" - "SIM ਕਾਰਡ ਵਿੱਚੋਂ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ…" - "SIM ਕਾਰਡ ਸੰਪਰਕ" - "ਕੋਈ ਸੰਪਰਕ ਐਪ ਉਪਲਬਧ ਨਹੀਂ" "ਵੌਇਸ ਖੋਜ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" - "ਇੱਕ ਫੋਨ ਕਾਲ ਨਹੀਂ ਕਰ ਸਕਦਾ ਕਿਉਂਕਿ ਫੋਨ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।" "ਸੰਪਰਕ ਖੋਜੋ" "ਨੰਬਰ ਜੋੜੋ ਜਾਂ ਸੰਪਰਕ ਖੋਜੋ" "ਤੁਹਾਡਾ ਕਾਲ ਇਤਿਹਾਸ ਖਾਲੀ ਹੈ" "ਇੱਕ ਕਾਲ ਕਰੋ" "ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਵੀ ਖੁੰਝੀਆਂ ਕਾਲਾਂ ਨਹੀਂ ਹਨ।" "ਤੁਹਾਡਾ ਵੌਇਸਮੇਲ ਇਨਬਾਕਸ ਖਾਲੀ ਹੈ।" - "ਕੇਵਲ ਮਨਪਸੰਦ ਦਿਖਾਓ" "ਕਾਲ ਇਤਿਹਾਸ" "ਸਭ" "ਮਿਸਡ" - "ਵੌਇਸਮੇਲ" "ਸਪੀਡ ਡਾਇਲ" "ਕਾਲ ਇਤਿਹਾਸ" "ਸੰਪਰਕ" "ਵੌਇਸਮੇਲ" - "ਮਨਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਇਆ ਗਿਆ" - "ਪਹਿਲਾਂ ਵਰਗਾ ਕਰੋ" "%s ਨੂੰ ਕਾਲ ਕਰੋ" "ਨਵਾਂ ਸੰਪਰਕ ਬਣਾਓ" "ਕਿਸੇ ਸੰਪਰਕ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" "SMS ਭੇਜੋ" "ਵੀਡੀਓ ਕਾਲ ਕਰੋ" "ਨੰਬਰ ਨੂੰ ਬਲੌਕ ਕਰੋ" - "%s ਨਵੀਆਂ ਮਿਸਡ ਕਾਲਾਂ" "ਅਜੇ ਤੁਹਾਡੇ ਸਪੀਡ ਡਾਇਲ \'ਤੇ ਕੋਈ ਵੀ ਵਿਅਕਤੀ ਨਹੀਂ ਹੈ" "ਕੋਈ ਮਨਪਸੰਦ ਸ਼ਾਮਲ ਕਰੋ" - "ਤੁਹਾਡੇ ਕੋਲ ਅਜੇ ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ ਹਨ।" - "ਕੋਈ ਸੰਪਰਕ ਸ਼ਾਮਲ ਕਰੋ" - "ਸਾਰੇ ਨੰਬਰਾਂ ਨੂੰ ਵੇਖਣ ਲਈ ਚਿਤਰ ਨੂੰ ਸਪਰਸ਼ ਕਰੋ ਜਾਂ ਦੁਬਾਰਾ ਕ੍ਰਮਬੱਧ ਕਰਨ ਲਈ ਸਪਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ" "ਹਟਾਓ" + "ਸਭ ਚੁਣੋ" "ਵੀਡੀਓ ਕਾਲ" "ਇੱਕ ਸੁਨੇਹਾ ਭੇਜੋ" "ਕਾਲ ਵੇਰਵੇ" @@ -164,25 +118,14 @@ "^1 ਨੂੰ ਕਾਲ ਕਰੋ" "ਵੀਡੀਓ ਕਾਲ ^1।" "^1 ਦੀ ਵੌਇਸਮੇਲ ਚੁਣੋ" - "^1 ਤੋਂ ਵੌਇਸਮੇਲ ਪਲੇ ਕਰੋ" - "^1 ਤੋਂ ਵੌਇਸਮੇਲ ਰੋਕੋ" - "^1 ਤੋਂ ਵੌਇਸਮੇਲ ਮਿਟਾਓ" - - %d ਨਵੀਆਂ ਵੌਇਸਮੇਲਾਂ - %d ਨਵੀਆਂ ਵੌਇਸਮੇਲਾਂ - "^1 ਲਈ ਸੰਪਰਕ ਬਣਾਓ" "^1 ਨੂੰ ਮੌਜੂਦਾ ਸੰਪਰਕ ਵਿੱਚ ਜੋੜੋ" "^1 ਲਈ ਕਾਲ ਵੇਰਵੇ" - "ਕਾਲ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਇਆ ਗਿਆ" "ਅੱਜ" "ਕੱਲ੍ਹ" "ਪੁਰਾਣੇ" - "ਕਾਲਸ ਸੂਚੀ" "ਸਪੀਕਰ ਚਾਲੂ ਕਰੋ।" "ਸਪੀਕਰ ਬੰਦ ਕਰੋ।" - "ਵੱਧ ਤੇਜ਼ ਪਲੇ ਕਰੋ।" - "ਵੱਧ ਹੌਲੀ ਪਲੇ ਕਰੋ।" "ਪਲੇਬੈਕ ਚਾਲੂ ਕਰੋ ਜਾਂ ਰੋਕੋ।" "ਡਿਸਪਲੇ ਚੋਣਾਂ" "ਧੁਨੀਆਂ ਅਤੇ ਥਰਥਰਾਹਟ" @@ -199,7 +142,6 @@ "ਕਾਲਾਂ" "ਕਾਲ ਬਲੌਕ ਕਰਨਾ" "ਵੌਇਸਮੇਲ" - "ਵੌਇਸਮੇਲ ਸੈਟਿੰਗਾਂ ਲਈ SIM ਚੁਣੋ" "ਕਾਲ ਬਲੌਕਿੰਗ ਆਰਜ਼ੀ ਤੌਰ ਤੇ ਬੰਦ ਹੈ" "ਕਾਲ ਬਲੌਕਿੰਗ ਅਸਮਰੱਥ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ ਕਿਉਂਕਿ ਤੁਸੀਂ ਇਸ ਫੋਨ ਦੁਆਰਾ ਪਿਛਲੇ 48 ਘੰਟਿਆਂ ਤੋਂ ਐਮਰਜੈਂਸੀ ਸੇਵਾਵਾਂ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ ਹੈ। ਇਹ 48 ਘੰਟਿਆਂ ਦਾ ਸਮਾਂ ਪੂਰਾ ਹੋਣ ਤੇੋਂ ਬਾਅਦ ਆਟੋਮੈਟਿਕਲੀ ਮੁੜ-ਸਮਰੱਥ ਹੋ ਜਾਵੇਗੀ।" "ਆਯਾਤ ਨੰਬਰ" @@ -213,12 +155,8 @@ "ਬਲੌਕ ਕੀਤੇ ਗਏ ਨੰਬਰ" "%1$s ਪਹਿਲਾਂ ਹੀ ਬਲੌਕ ਕੀਤਾ ਹੋਇਆ ਹੈ।" "ਕਾਲਿੰਗ ਖਾਤੇ" - "ਚਾਲੂ ਕਰੋ" - "ਅਨੁਮਤੀਆਂ ਸੈੱਟ ਕਰੋ" "ਸਪੀਡ ਡਾਇਲ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਲਈ, ਸੰਪਰਕ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" "ਆਪਣਾ ਕਾਲ ਲੌਗ ਵੇਖਣ ਲਈ, ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" - "ਆਪਣੇ ਸੰਪਰਕਾਂ ਨੂੰ ਵੇਖਣ ਲਈ, ਸੰਪਰਕ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" - "ਆਪਣੀ ਵੌਇਸਮੇਲ ਐਕਸੈਸ ਕਰਨ ਲਈ, ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" "ਆਪਣੇ ਸੰਪਰਕਾਂ ਦੀ ਖੋਜ ਕਰਨ ਲਈ,, ਸੰਪਰਕ ਅਨੁਮਤੀਆਂ ਨੂੰ ਚਾਲੂ ਕਰੋ।" "ਕਾਲ ਕਰਨ ਲਈ, ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" "ਫ਼ੋਨ ਐਪ ਦੇ ਕੋਲ ਸਿਸਟਮ ਸੈਟਿੰਗਜ਼ ਵਿੱਚ ਲਿੱਖਣ ਦੀ ਅਨੁਮਤੀ ਨਹੀਂ ਹੁੰਦੀ ਹੈ।" @@ -230,4 +168,10 @@ "ਸਪੈਮ" "%1$s ਔਫਲਾਈਨ ਹੈ ਅਤੇ ਉਸ \'ਤੇ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ" "ਇਸ ਬਾਰੇ" + "ਇਹ ਟ੍ਰਾਂਸਕ੍ਰਾਈਬ Google ਵੱਲੋਂ ਕੀਤਾ ਗਿਆ ਹੈ" + "Google ਵੱਲੋਂ ਪ੍ਰਤਿਲਿਪੀ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ …" + "ਟ੍ਰਾਂਸਕ੍ਰਿਪਟ ਉਪਲਬਧ ਨਹੀਂ" + "ਦੇਖੋ" + "ਕਾਲ ਮਿਟਾਈ ਗਈ। ਇਸ ਕਾਲ ਦੌਰਾਨ &quot;ਸੁਨੇਹੇ&quot; ਐਪ ਵਿੱਚ ਸਾਂਝੀਆਂ ਕੀਤੀਆਂ ਅਟੈਚਮੈਂਟਾਂ ਨੂੰ ਦੇਖੋ ਅਤੇ ਮਿਟਾਓ।" + "ਕਾਲ ਮਿਟਾਈ ਗਈ। ਕਾਲਾਂ ਦੌਰਾਨ &quot;ਸੁਨੇਹੇ&quot; ਐਪ ਵਿੱਚ ਸਾਂਝੀਆਂ ਕੀਤੀਆਂ ਅਟੈਚਮੈਂਟਾਂ ਨੂੰ ਦੇਖੋ ਅਤੇ ਮਿਟਾਓ।" diff --git a/java/com/android/dialer/app/res/values-pl/strings.xml b/java/com/android/dialer/app/res/values-pl/strings.xml index 76adfe579..f6502868d 100644 --- a/java/com/android/dialer/app/res/values-pl/strings.xml +++ b/java/com/android/dialer/app/res/values-pl/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Klawiatura telefonu" - "Telefon" "Historia połączeń" - "Zgłoś niedokładny numer" "Kopiuj numer" "Kopiuj zapis" - "Zablokuj numer" - "Odblokuj numer" "Edytuj numer przed połączeniem" "Wyczyść historię połączeń" "Usuń pocztę głosową" @@ -34,7 +30,6 @@ "Wyczyścić historię połączeń?" "Spowoduje to usunięcie wszystkich połączeń z historii." "Czyszczę historię połączeń…" - "Telefon" "Nieodebrane połączenie" "Nieodebrane połączenie (praca)" "Nieodebrane połączenia" @@ -50,107 +45,68 @@ Wiadomości głosowe: %1$d Wiadomość głosowa - "Odtwórz" "%1$s, %2$s" "Nowa poczta głosowa od: %1$s" "Nie można odtworzyć wiadomości głosowej" "Wczytuję zawartość poczty głosowej…" - "Archiwizuję pocztę głosową…" "Nie można wczytać zawartości poczty głosowej" - "Tylko połączenia z pocztą głosową" - "Tylko połączenia przychodzące" - "Tylko połączenia wychodzące" - "Tylko połączenia nieodebrane" "(%1$d) %2$s" - "szukaj" - "wybierz numer" - "numer do wybrania" - "Uruchom lub zatrzymaj odtwarzanie" "Włącz lub wyłącz tryb głośnomówiący" "Szukaj pozycji odtwarzania" - "Zmniejsz szybkość odtwarzania" - "Zwiększ szybkość odtwarzania" "Historia połączeń" "Więcej opcji" "klawiatura" - "Pokaż tylko wychodzące" - "Pokaż tylko przychodzące" - "Pokaż tylko nieodebrane" - "Pokaż tylko pocztę głosową" - "Pokaż wszystkie połączenia" - "Dodaj 2-sekundową pauzę" - "Dodaj oczekiwanie" "Ustawienia" "Symulator" - "Wszystkie kontakty" - "Użyj klawiatury tonowej" - "Wróć do aktywnego połączenia" - "Dodaj połączenie" - "Połączenia przychodzące" - "Odtwórz pocztę głosową" - "Wyświetl kontakt %1$s" - "Zadzwoń do: %1$s" + "Utwórz skrót do nowego interfejsu" + "Włączono tryb działań zbiorczych" + "Wyłączono tryb działań zbiorczych" + "Wybrano: %1$s" + "Anulowano wybór: %1$s" "Szczegóły kontaktu: %1$s" "Szczegóły kontaktu %1$s, który jest podejrzany o spam" "Połączenia: %1$s." "Rozmowa wideo." - "Wyślij SMS-a do: %1$s" - "Nieodsłuchana poczta głosowa" "Wyszukiwanie głosowe" - "Zadzwoń: %s" "Poczta głosowa" - "%s s" - "%s min %s s" - "wiadomości głosowe" - "wiadomości głosowe" - "Tak" - "Nie" - "Usunąć wybrane %1$s?" + "Anuluj tryb działań zbiorczych" + "Usuń" + "Anuluj" + "Wybrane: %1$s" + + ""Usunąć te wiadomości głosowe? "" + ""Usunąć te wiadomości głosowe? "" + ""Usunąć te wiadomości głosowe? "" + ""Usunąć tę wiadomość głosową? "" + @string/call_log_header_today "%1$s o %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Nie można zadzwonić pod ten numer" - "Aby skonfigurować pocztę głosową, otwórz Menu > Ustawienia." - "Aby połączyć się z pocztą głosową, najpierw wyłącz tryb samolotowy." - "Wczytuję…" - "IMEI" - "Numer MEID" - "Wczytuję z karty SIM…" - "Kontakty z karty SIM" - "Nie jest dostępna aplikacja do obsługi kontaktów" "Wyszukiwanie głosowe jest niedostępne" - "Nie można zadzwonić, ponieważ aplikacja Telefon została wyłączona." "Przeszukuj kontakty" "Dodaj numer lub wyszukaj kontakty" "Twoja historia połączeń jest pusta" "Zadzwoń" "Nie masz nieodebranych połączeń." "Skrzynka odbiorcza poczty głosowej jest pusta." - "Pokaż tylko ulubione" "Historia połączeń" "Wszystkie" "Nieodebrane" - "Poczta gł." "Szybkie wybieranie" "Historia połączeń" "Kontakty" "Poczta głosowa" - "Usunięto z ulubionych" - "Cofnij" "Zadzwoń: %s" "Utwórz nowy kontakt" "Dodaj do kontaktu" "Wyślij SMS-a" "Rozmowa wideo" "Zablokuj numer" - "Nowe nieodebrane połączenia: %s" "Lista szybkiego wybierania jest pusta" "Dodaj do ulubionych" - "Nie masz jeszcze żadnych kontaktów" - "Dodaj kontakt" - "Kliknij obraz, by zobaczyć wszystkie numery, lub kliknij go i przytrzymaj, by zmienić kolejność" "Usuń" + "Zaznacz wszystkie" "Rozmowa wideo" "Wyślij wiadomość" "Szczegóły połączenia" @@ -166,27 +122,14 @@ "Zadzwoń: ^1" "Rozpocznij rozmowę wideo z: ^1." "Posłuchaj wiadomości głosowej od: ^1" - "Odtwórz wiadomości głosowe od ^1" - "Wstrzymaj odtwarzanie wiadomości głosowych od ^1" - "Usuń wiadomości głosowe od ^1" - - %d nowe wiadomości głosowe - %d nowych wiadomości głosowych - %d nowej wiadomości głosowej - %d nowa wiadomość głosowa - "Utwórz kontakt ^1" "Dodaj: ^1 do istniejącego kontaktu" "Szczegóły połączeń: ^1" - "Usunięto z historii połączeń" "Dzisiaj" "Wczoraj" "Starsze" - "Lista połączeń" "Włącz głośnik." "Wyłącz głośnik." - "Odtwarzaj szybciej." - "Odtwarzaj wolniej." "Rozpocznij lub wstrzymaj odtwarzanie." "Opcje wyświetlania" "Dźwięki i wibracje" @@ -203,7 +146,6 @@ "Połączenia" "Blokowanie połączeń" "Poczta głosowa" - "Wybierz kartę SIM, aby zmienić ustawienia poczty głosowej" "Blokada połączeń tymczasowo wyłączona" "Blokada połączeń została wyłączona, ponieważ w ciągu ostatnich 48 godzin dzwoniono z tego telefonu na numer alarmowy. Blokada zostanie automatycznie przywrócona po upływie 48 godzin." "Zaimportuj numery" @@ -217,12 +159,8 @@ "Zablokowane numery" "Numer %1$s jest już zablokowany." "Konta telefoniczne" - "Włącz" - "Ustaw uprawnienia" "Aby włączyć szybkie wybieranie, włącz uprawnienie Kontakty." "Aby zobaczyć swój rejestr połączeń, włącz uprawnienie Telefon." - "Aby zobaczyć swoje kontakty, włącz uprawnienie Kontakty." - "Aby uzyskać dostęp do poczty głosowej, włącz uprawnienie Telefon." "Aby wyszukać kontakty, włącz uprawnienia Kontakty." "Aby nawiązać połączenie, włącz uprawnienie Telefon." "Aplikacja Telefon nie ma uprawnień do zapisu w ustawieniach systemowych." @@ -234,4 +172,10 @@ "Spam" "Użytkownik %1$s jest offline i nie można się z nim skontaktować" "Informacje" + "Transkrypcja: Google" + "Google tworzy transkrypcję…" + "Transkrypcja niedostępna" + "Wyświetl" + "Połączenie zostało usunięte. Załączniki udostępnione podczas tego połączenia możesz wyświetlić i usunąć w Wiadomościach." + "Połączenia zostały usunięte. Załączniki udostępnione podczas połączeń możesz wyświetlić i usunąć w Wiadomościach." diff --git a/java/com/android/dialer/app/res/values-pt-rBR/strings.xml b/java/com/android/dialer/app/res/values-pt-rBR/strings.xml index 780ca07db..1bf38d015 100644 --- a/java/com/android/dialer/app/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/app/res/values-pt-rBR/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefone" "Teclado do smartphone" - "Telefone" "Histórico de chamadas" - "Informar número incorreto" "Copiar número" "Copiar transcrição" - "Bloquear número" - "Desbloquear número" "Editar número antes de chamar" "Limpar histórico de chamadas" "Excluir mensagem de voz" @@ -34,7 +30,6 @@ "Limpar histórico de chamadas?" "Esta ação excluirá todas as chamadas do seu histórico" "Limpando histórico de chamadas…" - "Smartphone" "Chamada perdida" "Chamada de trabalho perdida" "Chamadas perdidas" @@ -48,107 +43,66 @@ %1$d Correios de voz %1$d Correios de voz - "Reproduzir" "%1$s, %2$s" "Nova mensagem de voz de %1$s" "Não foi possível repr. correio de voz" "Carregando correio de voz..." - "Arquivando correio de voz..." "Não foi possível carregar correio de voz" - "Somente chamadas com correio de voz" - "Somente chamadas recebidas" - "Somente chamadas de saída" - "Somente chamadas perdidas" "(%1$d) %2$s" - "pesquisar" - "discar" - "número para discagem" - "Iniciar ou interromper a reprodução" - "Ligar ou desligar o vivavoz" + "Ligar ou desligar o viva-voz" "Procurar posição de reprodução" - "Reduzir a taxa de reprodução" - "Aumentar a taxa de reprodução" "Histórico de chamadas" "Mais opções" "Teclado" - "Mostrar apenas enviadas" - "Mostrar apenas recebidas" - "Mostrar apenas perdidas" - "Exibir apenas mensagens de voz" - "Mostrar todas as chamadas" - "Adicionar pausa de 2 segundos" - "Adicionar espera" "Configurações" "Simulador" - "Todos os contatos" - "Usar teclado multifrequencial" - "Retornar para a chamada em espera" - "Ad. cham." - "Chamadas recebidas" - "Reproduzir mensagem de voz" - "Visualizar contato %1$s" - "Ligar para %1$s" + "Criar atalho para a nova IU" + "Entrando no modo de ação em massa" + "Saindo do modo de ação em massa" + "%1$s selecionado" + "%1$s não selecionado" "Detalhes de contato para %1$s" "Detalhes do contato do autor da chamada suspeito de spam %1$s" "%1$s chamadas." "Videochamada." - "Enviar SMS para %1$s" - "Nova mensagem de voz" "Iniciar pesquisa por voz" - "Ligar para %s" "Correio de voz" - "%s seg" - "%s m %s s" - "correio de voz" - "correios de voz" - "Sim" - "Não" - "Excluir a seleção de %1$s?" + "Cancelar modo de ações em lote" + "Excluir" + "Cancelar" + "Itens selecionados: %1$s" + + ""Excluir este correio de voz? "" + ""Excluir estes correios de voz? "" + @string/call_log_header_today "%1$s às %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Não é possível ligar para este número" - "Para configurar o correio de voz, acesse Menu > Configurações." - "Para ligar para o correio de voz, primeiro desative o modo avião." - "Carregando…" - "IMEI" - "MEID" - "Carregando do cartão SIM..." - "Contatos do cartão SIM" - "Nenhum app de contatos disponível" "A pesquisa por voz não está disponível" - "Não é possível fazer uma chamada porque o app Telefone foi desativado." "Pesquisar contatos" "Adicionar número ou pesquisar contatos" "Seu histórico de chamadas está vazio" "Fazer uma chamada" "Você não tem chamadas perdidas." "Sua caixa de entrada de correio de voz está vazia." - "Mostrar somente favoritos" "Histórico de chamadas" "Todas" "Perdidas" - "Correio de voz" "Discagem rápida" "Histórico de chamadas" "Contatos" "Correio de voz" - "Removido dos favoritos" - "Desfazer" "Ligar para %s" "Criar novo contato" "Adicionar a um contato" "Enviar SMS" "Fazer videochamada" "Bloquear número" - "%s novas chamadas perdidas" "Ainda não há ninguém na sua discagem rápida" "Adicionar favorito" - "Você ainda não tem contatos" - "Adicionar um contato" - "Toque na imagem para ver todos os números ou toque e segure para reordenar" "Remover" + "Selecionar tudo" "Videochamada" "Enviar uma mensagem" "Detalhes da chamada" @@ -164,25 +118,14 @@ "Ligar para ^1" "Videochamada ^1." "Ouvir mensagem de voz de ^1" - "Reproduzir correio de voz de ^1" - "Pausar correio de voz de ^1" - "Excluir correio de voz de ^1" - - %d novos correios de voz - %d novos correios de voz - "Criar contato para ^1" "Adicionar ^1 a um contato já existente" "Detalhes de chamada para ^1" - "Excluída do histórico de chamadas" "Hoje" "Ontem" "Antiga" - "Lista de chamadas" "Ative o alto-falante." "Desative o alto-falante." - "Reprodução mais rápida." - "Reprodução mais lenta." "Inicie ou pause a reprodução." "Opções de exibição" "Sons e vibração" @@ -199,7 +142,6 @@ "Chamadas" "Bloqueio de chamadas" "Correio de voz" - "Selecionar SIM p/ config correio voz" "Bloqueio de chamadas temporiamente desativado" "O bloqueio de chamadas foi desativado porque você entrou em contato com serviços de emergência usando este telefone nas últimas 48 horas. Ele será reativado automaticamente depois de um período de 48 horas." "Importar números" @@ -213,12 +155,8 @@ "Números bloqueados" "O número %1$s já está bloqueado." "Contas de chamadas" - "Ativar" - "Definir permissões" "Para ativar a discagem rápida, ative a permissão para o app Contatos." "Para ver seu registro de chamadas, ative a permissão para o app Telefone." - "Para ver seus contatos, ative a permissão para o app Contatos." - "Para acessar seu correio de voz, ative a permissão para o app Telefone." "Para pesquisar seus contatos, ative as permissões para \"Contatos\"." "Para fazer uma chamada, ative a permissão para o app Telefone." "O app Telefone não tem permissão para gravar nas configurações do sistema." @@ -230,4 +168,10 @@ "Spam" "%1$s está off-line e não é possível entrar em contato" "Sobre" + "Transcrito pelo Google" + "O Google está transcrevendo..." + "Transcrição indisponível" + "Ver" + "A chamada foi excluída. Veja e exclua os anexos compartilhados durante a chamada no Mensagens." + "As chamadas foram excluídas. Veja e exclua os anexos compartilhados durante as chamadas no Mensagens." diff --git a/java/com/android/dialer/app/res/values-pt-rPT/strings.xml b/java/com/android/dialer/app/res/values-pt-rPT/strings.xml index 95fa75c7e..af6dc1e59 100644 --- a/java/com/android/dialer/app/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/app/res/values-pt-rPT/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telemóvel" "Teclado do telemóvel" - "Telefone" "Histórico de chamadas" - "Denunciar número incorreto" "Copiar número" "Copiar transcrição" - "Bloquear número" - "Desbloquear número" "Editar número antes de ligar" "Limpar histórico de chamadas" "Eliminar correio de voz" @@ -34,7 +30,6 @@ "Limpar histórico de chamadas?" "Todas as chamadas serão eliminadas do histórico" "A limpar histórico de chamadas…" - "Telemóvel" "Chamada não atendida" "Chamada de trabalho não atendida" "Chamadas não atendidas" @@ -45,110 +40,69 @@ "Marcar %s" "Número do correio de voz desconhecido" - %1$d Voicemails + Mensagem de correio de voz %1$d mensagens de correio de voz - "Reproduzir" "%1$s , %2$s" "Nova msg de correio de voz de %1$s" "Não foi poss. reprod. o correio de voz" "A carregar o correio de voz..." - "A arquivar mensagem de correio de voz…" "Não foi poss. carregar o correio de voz" - "Apenas chamadas com correio de voz" - "Apenas chamadas recebidas" - "Apenas chamadas efetuadas" - "Apenas chamadas não atendidas" "(%1$d) %2$s" - "pesquisar" - "marcar" - "número a marcar" - "Reproduzir ou interromper a reprodução" "Ligar ou desligar o altifalante" "Procurar a posição da reprodução" - "Diminuir a velocidade de reprodução" - "Aumentar a velocidade de reprodução" "Histórico de chamadas" "Mais opções" "teclado" - "Mostrar apenas cham. efetuadas" - "Mostrar apenas cham. recebidas" - "Mostrar apenas cham. n. atend." - "Mostrar apenas msgs corr. voz" - "Mostrar todas as chamadas" - "Adicionar pausa de 2 seg." - "Adicionar espera" "Definições" "Simulador" - "Todos os contactos" - "Utilizar teclado numérico com tons de toque" - "Voltar à chamada em curso" - "Adicionar chamada" - "Chamadas recebidas" - "Reproduzir mensagem de correio de voz" - "Ver o contacto %1$s" - "Ligar a %1$s" + "Criar novo atalho de IU" + "A entrar no modo de ação em massa…" + "Saiu do modo de ação em massa" + "%1$s selecionado" + "%1$s não selecionado" "Detalhes de contacto para %1$s" "Detalhes de contacto para um autor de chamadas de spam suspeito: %1$s" "%1$s chamadas." "Videochamada." - "Enviar SMS para %1$s" - "Mensagem de correio de voz ainda não ouvida" "Iniciar pesquisa por voz" - "Telefonar para %s" "Correio de voz" - "%s seg" - "%s min. %s seg." - "mensagem de correio de voz" - "mensagens de correio de voz" - "Sim" - "Não" - "Pretende eliminar a(s) %1$s selecionada(s)?" + "Cancelar modo de ações em lote" + "Eliminar" + "Cancelar" + "%1$s selecionada(s)" + + ""Pretende eliminar esta mensagem de correio de voz? "" + ""Pretende eliminar estas mensagens de correio de voz? "" + @string/call_log_header_today "%1$s às %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Não é possível ligar para este número" - "Para configurar o correio de voz, aceda a Menu > Definições." - "Para efetuar uma chamada para o correio de voz, desative primeiro o modo de avião." - "A carregar…" - "IMEI" - "MEID" - "A carregar a partir do cartão SIM..." - "Contactos no cartão SIM" - "Não existe nenhuma aplicação de contactos disponível" "Pesquisa por voz não disponível" - "Não é possível efetuar uma chamada porque a aplicação Telefone foi desativada." "Pesquisar contactos" "Adic. n.º ou pesq. contactos" "O seu histórico de chamadas está vazio" "Efetuar uma chamada" "Não tem chamadas não atendidas." "A caixa de entrada do correio de voz está vazia." - "Mostrar apenas os favoritos" "Histórico de chamadas" "Todas" "Não atendidas" - "Corr. Voz" "Marcação rápida" "Histórico de Chamadas" "Contactos" "Correio de voz" - "Removido dos favoritos" - "Anular" "Telefonar para %s" "Criar novo contacto" "Adicionar a um contacto" "Enviar SMS" "Fazer videochamada" "Bloquear número" - "%s chamadas não atendidas novas" "Ainda não tem ninguém na marcação rápida" "Adicionar um favorito" - "Ainda não tem nenhum contacto" - "Adicionar um contacto" - "Toque na imagem para ver todos os números ou toque sem soltar para reordenar" "Remover" + "Selecionar tudo" "Videochamada" "Enviar uma mensagem" "Detalhes da chamada" @@ -164,25 +118,14 @@ "Telefonar a ^1" "Fazer videochamada com ^1." "Ouvir o correio de voz de ^1" - "Reproduzir mensagem de correio de voz de ^1" - "Colocar a mensagem de correio de voz de ^1 em pausa" - "Eliminar mensagem de correio de voz de ^1" - - %d new voicemails - %d novas mensagens de correio de voz - "Criar contacto para ^1" "Adicionar ^1 ao contacto existente" "Detalhes de chamadas de ^1" - "Eliminado do histórico de chamadas" "Hoje" "Ontem" "Mais antigas" - "Lista de chamadas" "Ligar altifalante." "Desligar altifalante" - "Reproduzir mais rápido." - "Reproduzir mais lento." "Iniciar ou interromper a reprodução." "Opções de visualização" "Sons e vibração" @@ -199,7 +142,6 @@ "Chamadas" "Bloqueio de chamadas" "Correio de voz" - "Selecionar SIM p/ correio de voz" "Bloqueio de chamadas tempor. desativado" "O bloqueio de chamadas foi desativado porque contactou os serviços de emergência a partir deste telemóvel nas últimas 48 horas. O bloqueio será automaticamente reativado assim que expirar o período de 48 horas." "Importar números" @@ -213,12 +155,8 @@ "Números bloqueados" "%1$s já está bloqueado." "Contas de chamadas" - "Ativar" - "Definir autorizações" "Para ativar a marcação rápida, ative a autorização Contactos." "Para ver o registo de chamadas, ative a autorização Telemóvel." - "Para ver os seus contactos, ative a autorização Contactos." - "Para aceder ao correio de voz, ative a autorização Telemóvel." "Para pesquisar os seus contactos, ative as autorizações Contactos." "Para efetuar uma chamada, ative a autorização Telemóvel." "A aplicação Telefone não tem autorização para gravar nas definições do sistema." @@ -230,4 +168,10 @@ "Spam" "%1$s está offline e não pode ser contactado" "Acerca de" + "Transcrito pelo Google" + "O Google está a transcrever…" + "Transcrição não disponível" + "Ver" + "A chamada foi eliminada. Veja e elimine os anexos partilhados durante esta chamada na aplicação Mensagens." + "As chamadas foram eliminadas. Veja e elimine os anexos partilhados durante as chamadas na aplicação Mensagens." diff --git a/java/com/android/dialer/app/res/values-pt/strings.xml b/java/com/android/dialer/app/res/values-pt/strings.xml index 780ca07db..1bf38d015 100644 --- a/java/com/android/dialer/app/res/values-pt/strings.xml +++ b/java/com/android/dialer/app/res/values-pt/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefone" "Teclado do smartphone" - "Telefone" "Histórico de chamadas" - "Informar número incorreto" "Copiar número" "Copiar transcrição" - "Bloquear número" - "Desbloquear número" "Editar número antes de chamar" "Limpar histórico de chamadas" "Excluir mensagem de voz" @@ -34,7 +30,6 @@ "Limpar histórico de chamadas?" "Esta ação excluirá todas as chamadas do seu histórico" "Limpando histórico de chamadas…" - "Smartphone" "Chamada perdida" "Chamada de trabalho perdida" "Chamadas perdidas" @@ -48,107 +43,66 @@ %1$d Correios de voz %1$d Correios de voz - "Reproduzir" "%1$s, %2$s" "Nova mensagem de voz de %1$s" "Não foi possível repr. correio de voz" "Carregando correio de voz..." - "Arquivando correio de voz..." "Não foi possível carregar correio de voz" - "Somente chamadas com correio de voz" - "Somente chamadas recebidas" - "Somente chamadas de saída" - "Somente chamadas perdidas" "(%1$d) %2$s" - "pesquisar" - "discar" - "número para discagem" - "Iniciar ou interromper a reprodução" - "Ligar ou desligar o vivavoz" + "Ligar ou desligar o viva-voz" "Procurar posição de reprodução" - "Reduzir a taxa de reprodução" - "Aumentar a taxa de reprodução" "Histórico de chamadas" "Mais opções" "Teclado" - "Mostrar apenas enviadas" - "Mostrar apenas recebidas" - "Mostrar apenas perdidas" - "Exibir apenas mensagens de voz" - "Mostrar todas as chamadas" - "Adicionar pausa de 2 segundos" - "Adicionar espera" "Configurações" "Simulador" - "Todos os contatos" - "Usar teclado multifrequencial" - "Retornar para a chamada em espera" - "Ad. cham." - "Chamadas recebidas" - "Reproduzir mensagem de voz" - "Visualizar contato %1$s" - "Ligar para %1$s" + "Criar atalho para a nova IU" + "Entrando no modo de ação em massa" + "Saindo do modo de ação em massa" + "%1$s selecionado" + "%1$s não selecionado" "Detalhes de contato para %1$s" "Detalhes do contato do autor da chamada suspeito de spam %1$s" "%1$s chamadas." "Videochamada." - "Enviar SMS para %1$s" - "Nova mensagem de voz" "Iniciar pesquisa por voz" - "Ligar para %s" "Correio de voz" - "%s seg" - "%s m %s s" - "correio de voz" - "correios de voz" - "Sim" - "Não" - "Excluir a seleção de %1$s?" + "Cancelar modo de ações em lote" + "Excluir" + "Cancelar" + "Itens selecionados: %1$s" + + ""Excluir este correio de voz? "" + ""Excluir estes correios de voz? "" + @string/call_log_header_today "%1$s às %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Não é possível ligar para este número" - "Para configurar o correio de voz, acesse Menu > Configurações." - "Para ligar para o correio de voz, primeiro desative o modo avião." - "Carregando…" - "IMEI" - "MEID" - "Carregando do cartão SIM..." - "Contatos do cartão SIM" - "Nenhum app de contatos disponível" "A pesquisa por voz não está disponível" - "Não é possível fazer uma chamada porque o app Telefone foi desativado." "Pesquisar contatos" "Adicionar número ou pesquisar contatos" "Seu histórico de chamadas está vazio" "Fazer uma chamada" "Você não tem chamadas perdidas." "Sua caixa de entrada de correio de voz está vazia." - "Mostrar somente favoritos" "Histórico de chamadas" "Todas" "Perdidas" - "Correio de voz" "Discagem rápida" "Histórico de chamadas" "Contatos" "Correio de voz" - "Removido dos favoritos" - "Desfazer" "Ligar para %s" "Criar novo contato" "Adicionar a um contato" "Enviar SMS" "Fazer videochamada" "Bloquear número" - "%s novas chamadas perdidas" "Ainda não há ninguém na sua discagem rápida" "Adicionar favorito" - "Você ainda não tem contatos" - "Adicionar um contato" - "Toque na imagem para ver todos os números ou toque e segure para reordenar" "Remover" + "Selecionar tudo" "Videochamada" "Enviar uma mensagem" "Detalhes da chamada" @@ -164,25 +118,14 @@ "Ligar para ^1" "Videochamada ^1." "Ouvir mensagem de voz de ^1" - "Reproduzir correio de voz de ^1" - "Pausar correio de voz de ^1" - "Excluir correio de voz de ^1" - - %d novos correios de voz - %d novos correios de voz - "Criar contato para ^1" "Adicionar ^1 a um contato já existente" "Detalhes de chamada para ^1" - "Excluída do histórico de chamadas" "Hoje" "Ontem" "Antiga" - "Lista de chamadas" "Ative o alto-falante." "Desative o alto-falante." - "Reprodução mais rápida." - "Reprodução mais lenta." "Inicie ou pause a reprodução." "Opções de exibição" "Sons e vibração" @@ -199,7 +142,6 @@ "Chamadas" "Bloqueio de chamadas" "Correio de voz" - "Selecionar SIM p/ config correio voz" "Bloqueio de chamadas temporiamente desativado" "O bloqueio de chamadas foi desativado porque você entrou em contato com serviços de emergência usando este telefone nas últimas 48 horas. Ele será reativado automaticamente depois de um período de 48 horas." "Importar números" @@ -213,12 +155,8 @@ "Números bloqueados" "O número %1$s já está bloqueado." "Contas de chamadas" - "Ativar" - "Definir permissões" "Para ativar a discagem rápida, ative a permissão para o app Contatos." "Para ver seu registro de chamadas, ative a permissão para o app Telefone." - "Para ver seus contatos, ative a permissão para o app Contatos." - "Para acessar seu correio de voz, ative a permissão para o app Telefone." "Para pesquisar seus contatos, ative as permissões para \"Contatos\"." "Para fazer uma chamada, ative a permissão para o app Telefone." "O app Telefone não tem permissão para gravar nas configurações do sistema." @@ -230,4 +168,10 @@ "Spam" "%1$s está off-line e não é possível entrar em contato" "Sobre" + "Transcrito pelo Google" + "O Google está transcrevendo..." + "Transcrição indisponível" + "Ver" + "A chamada foi excluída. Veja e exclua os anexos compartilhados durante a chamada no Mensagens." + "As chamadas foram excluídas. Veja e exclua os anexos compartilhados durante as chamadas no Mensagens." diff --git a/java/com/android/dialer/app/res/values-ro/strings.xml b/java/com/android/dialer/app/res/values-ro/strings.xml index 725ff4a3c..b6adfe7b3 100644 --- a/java/com/android/dialer/app/res/values-ro/strings.xml +++ b/java/com/android/dialer/app/res/values-ro/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Tastatura telefonului" - "Telefon" "Istoricul apelurilor" - "Raportați numărul ca incorect" "Copiați numărul" "Copiați transcrierea" - "Blocați numărul" - "Deblocați numărul" "Modificați numărul înainte de apelare" "Ștergeți istoricul apelurilor" "Ștergeți mesajul vocal" @@ -34,7 +30,6 @@ "Ștergeți istoricul apelurilor?" "Vor fi șterse toate apelurile din istoric" "Se șterge istoricul apelurilor…" - "Telefon" "Apel nepreluat" "Apel de serviciu nepreluat" "Apeluri nepreluate" @@ -49,107 +44,67 @@ %1$d de mesaje vocale Mesaj vocal - "Redați" "%1$s, %2$s" "Mesaj vocal nou de la %1$s" "Nu s-a putut reda mesageria vocală" "Se încarcă mesageria vocală…" - "Se arhivează mesajul vocal…" "Nu s-a putut încărca mesageria vocală" - "Numai apelurile cu mesaje vocale" - "Numai apelurile primite" - "Numai apelurile efectuate" - "Numai apelurile nepreluate" "(%1$d) %2$s" - "căutare" - "apelare" - "numărul de apelat" - "Porniți sau opriți redarea" "Activați sau dezactivați difuzorul" "Căutați poziția de redare" - "Reduceți viteza redării" - "Măriți viteza redării" "Istoricul apelurilor" "Mai multe opțiuni" "tastatură" - "Numai apelurile efectuate" - "Numai apelurile primite" - "Numai apelurile nepreluate" - "Afișați numai mesajele vocale" - "Afișați toate apelurile" - "Adăugați o pauză de 2 secunde" - "Adăugați interval de așteptare" "Setări" "Simulator" - "Toată agenda" - "Tastatura tactilă cu sunet" - "Reveniți la apelul în curs" - "Adăugați un apel" - "Apeluri de intrare" - "Redați mesajul vocal" - "Afișați persoana din agendă %1$s" - "Apelați %1$s" + "Creați comandă rapidă IU nouă" + "Se intră în modul acțiune în bloc" + "Ați ieșit din modul acțiune în bloc" + "S-a selectat %1$s" + "S-a deselectat %1$s" "Detalii de contact pentru %1$s" "Detalii de contact pentru apelantul suspectat de spam %1$s" "%1$s (de) apeluri." "Apel video." - "Trimiteți SMS la %1$s" - "Mesaje vocale neascultate" "Începeți căutarea vocală" - "Apelați %s" "Mesagerie vocală" - "%s secunde" - "%s min. %s sec." - "mesagerie vocală" - "mesaje vocale" - "Da" - "Nu" - "Ștergeți cele %1$s selectate?" + "Anulați modul de acțiuni în lot" + "Ștergeți" + "Anulați" + "%1$s selectate" + + ""Ștergeți aceste mesaje vocale? "" + ""Ștergeți aceste mesaje vocale? "" + ""Ștergeți acest mesaj vocal? "" + @string/call_log_header_today "%1$s la %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Nu puteți apela acest număr" - "Pentru a configura mesageria vocală, accesați Meniu > Setări." - "Pentru a apela mesageria vocală, mai întâi dezactivați modul Avion." - "Se încarcă..." - "IMEI" - "MEID" - "Se încarcă de pe cardul SIM..." - "Persoanele din agendă de pe cardul SIM" - "Nu este disponibilă nicio aplicație pentru agendă" "Căutarea vocală nu este disponibilă" - "Nu se poate efectua un apel telefonic, deoarece aplicația Telefon a fost dezactivată." "Căutați în Agendă" "Adăugați număr/căutați contacte" "Istoricul apelurilor este gol" "Apelați" "Nu aveți niciun apel nepreluat." "Nu există mesaje primite în mesageria vocală." - "Afișați numai preferate" "Istoricul apelurilor" "Toate" "Nepreluate" - "Mesagerie vocală" "Apelare rapidă" "Istoricul apelurilor" "Agendă" "Mesagerie vocală" - "S-a eliminat din preferate" - "Anulați" "Apelați %s" "Creați o intrare nouă" "Adăugați la o intrare" "Trimiteți SMS" "Inițiați un apel video" "Blocați numărul" - "%s apeluri nepreluate noi" "Nicio persoană de contact setată pentru apelarea rapidă" "Adăugați o persoană de contact preferată" - "Nu aveți încă persoane de contact" - "Adăugați o persoană de contact" - "Atingeți imaginea pentru a vedea toate numerele sau atingeți lung pentru reordonare" "Eliminați" + "Selectați tot" "Apel video" "Trimiteți un mesaj" "Detaliile apelului" @@ -165,26 +120,14 @@ "Apelați ^1" "Apelați video ^1." "Ascultați mesajul vocal de la ^1" - "Redați mesajul vocal de la ^1" - "Întrerupeți mesajul vocal de la ^1" - "Ștergeți mesajul vocal de la ^1" - - %d mesaje vocale noi - %d de mesaje vocale noi - %d mesaj vocal nou - "Creați o persoană de contact pentru ^1" "Adăugați ^1 la o persoană de contact existentă" "Detaliile apelului pentru ^1" - "S-a șters din istoricul apelurilor" "Astăzi" "Ieri" "Mai vechi" - "Lista de apeluri" "Porniți difuzorul." "Opriți difuzorul." - "Jucați mai repede." - "Jucați mai lent." "Porniți sau întrerupeți redarea." "Opțiuni de afișare" "Sunete și vibrații" @@ -201,7 +144,6 @@ "Apeluri" "Blocarea apelurilor" "Mesagerie vocală" - "Selectați SIM pt. mesageria vocală" "Blocarea apelurilor e dezactivată temporar" "Blocarea apelurilor a fost dezactivată, deoarece ați contactat serviciile de urgență de pe acest telefon în ultimele 48 de ore. Funcția va fi reactivată automat după ce perioada de 48 de ore va expira." "Importați numere" @@ -215,12 +157,8 @@ "Numere blocate" "%1$s este deja blocat." "Conturi pentru apelare" - "Activați" - "Setați permisiunile" "Pentru a activa apelarea rapidă, activați permisiunea Agendă." "Pentru a vedea jurnalul de apeluri, activați permisiunea Telefon." - "Pentru a vedea persoanele de contact, activați permisiunea Agendă." - "Pentru a accesa mesageria vocală, activați permisiunea Telefon." "Pentru a căuta în persoanele de contact, activați permisiunea Agendă." "Pentru a apela, activați permisiunea Telefon." "Aplicația Telefon nu are permisiunea să modifice setările de sistem." @@ -232,4 +170,10 @@ "Spam" "%1$s este offline și nu poate fi contactat(ă)" "Despre" + "Transcris de Google" + "Google transcrie…" + "Transcrierea nu e disponibilă" + "Afișați" + "Apelul a fost șters. Afișați și ștergeți atașamentele trimise în timpul acestui apel în Messages." + "Apelurile au fost șterse. Afișați și ștergeți atașamentele trimise în timpul apelurilor în Messages." diff --git a/java/com/android/dialer/app/res/values-ru/strings.xml b/java/com/android/dialer/app/res/values-ru/strings.xml index 557832bcd..950f9f870 100644 --- a/java/com/android/dialer/app/res/values-ru/strings.xml +++ b/java/com/android/dialer/app/res/values-ru/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Телефон" "Набор номера" - "Кнопки" "Журнал звонков." - "Ошибка в номере" "Скопировать номер" "Скопировать транскрипцию" - "Заблокировать номер" - "Разблокировать номер" "Изменить номер и позвонить" "Очистить журнал звонков" "Удалить голосовое сообщение" @@ -34,7 +30,6 @@ "Очистить журнал звонков?" "Журнал звонков будет удален." "Очистка журнала звонков…" - "Вызов" "Пропущенный вызов" "Пропущенный звонок (работа)" "Пропущенные вызовы" @@ -50,107 +45,68 @@ %1$d голосовых сообщений %1$d голосового сообщения - "Прослушать" "%1$s, %2$s" "Новое гол. сообщение: %1$s" "Не удалось воспроизвести сообщения" "Загрузка сообщений…" - "Архивирование…" "Не удалось загрузить голосовую почту" - "Только звонки с голосовой почтой" - "Только входящие звонки" - "Только исходящие звонки" - "Только пропущенные звонки" "(%1$d) %2$s" - "поиск" - "набор номера" - "набираемый номер" - "Начать или остановить воспроизведение" "Включить или отключить громкую связь" "Выбрать позицию для воспроизведения" - "Уменьшить скорость воспроизведения" - "Увеличить скорость воспроизведения" "Журнал звонков" "Ещё" "клавиатура" - "Исходящие" - "Входящие" - "Пропущенные" - "Показать голосовые сообщения" - "Все вызовы" - "Добавить двухсекундную паузу" - "Добавить паузу" "Настройки" "Симулятор" - "Все контакты" - "Панель тонального набора" - "Вернуться к текущему вызову" - "Добавить вызов" - "Входящие вызовы" - "Прослушать голосовую почту" - "Просмотреть данные: %1$s" - "Вызов: %1$s" + "Создать ярлык для нового интерфейса" + "Вы вошли в режим массового действия" + "Вы вышли из режима массового действия" + "Выбран объект %1$s" + "Выбор объекта %1$s отменен" "Сведения о контакте %1$s" "Сведения о контакте %1$s (подозрение на спам)" "Вызовов: %1$s." "Видеовстреча" - "Отправить SMS пользователю %1$s." - "Непрослушанные сообщения голосовой почты" "Начать голосовой поиск" - "Позвонить: %s" "Голосовая почта" - "%s сек." - "%s мин. %s сек." - "голосовое сообщение" - "голосовые сообщения" - "Да" - "Нет" - "Удалить %1$s?" + "Отмена режима массового действия" + "Удалить" + "Отмена" + "Выбрано: %1$s" + + ""Удалить эти голосовые сообщения? "" + ""Удалить эти голосовые сообщения? "" + ""Удалить эти голосовые сообщения? "" + ""Удалить эти голосовые сообщения? "" + @string/call_log_header_today "%1$s в %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "На этот номер нельзя позвонить." - "Чтобы настроить голосовую почту, выберите \"Меню > Настройки\"." - "Сначала отключите режим полета." - "Загрузка..." - "IMEI" - "MEID" - "Загрузка с SIM-карты…" - "Контакты на SIM-карте" - "Нет приложения для работы с контактами" "Голосовой поиск недоступен" - "Нельзя совершать телефонные звонки, поскольку приложение \"Телефон\" отключено." "Поиск в контактах" "Найдите контакт или введите номер" "В журнале пока нет звонков" "Вызов" "Нет пропущенных звонков" "Нет входящих голосовых сообщений" - "Только часто используемые" "Журнал звонков" "Все" "Пропущенные" - "Г. почта" "Быстрый набор" "Журнал звонков" "Контакты" "Голосовая почта" - "Контакт удален из избранных" - "Отмена" "Позвонить: %s" "Создать контакт" "Добавить к контакту" "Отправить SMS" "Начать видеовстречу" "Заблокировать номер" - "Пропущенных вызовов: %s" "Нет номеров для быстрого набора" "Настроить быстрый набор" - "Нет контактов" - "Добавить контакт" - "Коснитесь изображения, чтобы увидеть все номера, или нажмите и удерживайте, чтобы изменить порядок" "Удалить" + "Выбрать все" "Видеовстреча" "Отправить сообщение" "Сведения о вызове" @@ -166,27 +122,14 @@ "Позвонить: ^1" "Видеовстреча: ^1" "Прослушать сообщение от контакта ^1." - "Прослушать голосовое сообщение от контакта ^1" - "Приостановить голосовое сообщение от контакта ^1" - "Удалить голосовое сообщение от контакта ^1" - - %d новое голосовое сообщение - %d новых голосовых сообщения - %d новых голосовых сообщений - %d нового голосового сообщения - "Добавить контакт: ^1" "Добавить \"^1\" к контакту" "^1 – сведения о вызове" - "Вызов удален из журнала" "Сегодня" "Вчера" "Предыдущие записи" - "Вызовы" "Включить динамик." "Выключить динамик." - "Увеличить скорость воспроизведения." - "Уменьшить скорость воспроизведения." "Начать или приостановить воспроизведение." "Отображение контактов" "Звуки и вибрация" @@ -203,7 +146,6 @@ "Вызовы" "Блокировка вызовов" "Голосовая почта" - "Выбор SIM-карты для настроек голосовой почты" "Блокировка вызовов временно отключена" "Блокировка вызовов отключена, поскольку вы недавно набирали номер экстренной службы. Когда с момента звонка пройдет 48 часов, эта функция включится автоматически." "Импортировать номера" @@ -217,12 +159,8 @@ "Заблокированные номера" "%1$s уже заблокирован." "Аккаунты для звонков" - "Включить" - "Задать разрешения" "Чтобы настроить быстрый набор, предоставьте приложению разрешение \"Контакты\"." "Чтобы открыть список вызовов, предоставьте приложению разрешение \"Телефон\"." - "Чтобы открыть список контактов, предоставьте приложению разрешение \"Контакты\"." - "Чтобы получить доступ к голосовой почте, предоставьте приложению разрешение \"Телефон\"." "Для поиска контактов включите разрешение \"Контакты\"." "Чтобы позвонить, предоставьте приложению разрешение \"Телефон\"." "У приложения \"Телефон\" нет разрешения на изменение системных настроек." @@ -234,4 +172,10 @@ "Спам" "%1$s сейчас офлайн и не ответит на вызов" "О приложении" + "Расшифровано Google" + "Подождите…" + "Транскрипция недоступна" + "Посмотреть" + "Вызов удален. Посмотреть и удалить прикрепленные к нему файлы можно в приложении \"Сообщения\"." + "Вызовы удалены. Посмотреть и удалить прикрепленные к ним файлы можно в приложении \"Сообщения\"." diff --git a/java/com/android/dialer/app/res/values-si/strings.xml b/java/com/android/dialer/app/res/values-si/strings.xml index 329d89e8d..6e32bc8f7 100644 --- a/java/com/android/dialer/app/res/values-si/strings.xml +++ b/java/com/android/dialer/app/res/values-si/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "දුරකථනය" "දුරකථන යතුරු පුවරුව" - "දුරකථනය" "ඇමතුම් ඉතිහාසය" - "වැරදි අංකය වාර්තා කරන්න" "අංකය පිටපත් කරන්න" "පිටපත් කිරීම පිටපත් කරන්න" - "අංකය අවහිර කරන්න" - "අංකය අවහිර නොකරන්න" "ඇමතුමට පෙර අංකය සංස්කරණය" "ඇමතුම් ඉතිහාසය හිස් කරන්න" "හඬ තැපෑල මකන්න" @@ -34,7 +30,6 @@ "ඇමතුම් ඉතිහාසය හිස් කරන්නද?" "මෙය ඔබේ ඉතිහාසයෙන් සියලු ඇමතුම් මකනු ඇත" "ඇමතුම් ඉතිහාසය හිස් කරමින්…" - "දුරකථනය" "මඟ හැරුණු ඇමතුම" "මග හැරුණ කාර්යාල ඇමතුම" "මඟ හැරුණු ඇමතුම්" @@ -48,107 +43,66 @@ හඬ තැපැල් %1$d හඬ තැපැල් %1$d - "ධාවනය කරන්න" "%1$s, %2$s" "%1$s වෙතින් නව හඬ තැපැලක්" "හඬ තැපෑල වාදනය කිරීමට නොහැකි විය" "හඬ තැපෑල ප්‍රවේශනය වෙමින්…" - "හඬ තැපෑල සංරක්ෂණය කරමින්…" "හඬ තැපෑල ප්‍රවේශනය කිරීමට නොහැකි විය" - "හඬ තැපෑල සහිත ඇමතුම් පමණි" - "එන ඇමතුම් පමණි" - "පිටතට යන ඇමතුම් පමණි" - "මඟ හැරුණු ඇමතුම් පමණි" "(%1$d) %2$s" - "සෙවීම" - "අමතන්න" - "ඇමතීමට අංකය" - "Playback ධාවනය කරන්න හෝ නවත්වන්න" "ස්පීකර්ෆෝන් ක්‍රියා කරන්න හෝ නොකරන්න" "Playback ස්ථානය සොයාබලන්න" - "Playback අනුපාතය අඩුවේ" - "Playback අනුපාතය වැඩිවේ" "ඇමතුම් ඉතිහාසය" "තවත් විකල්ප" "යතුරු පුවරුව" - "පිටතට යන ඒවා පමණක් පෙන්වන්න" - "එන ඒවා පමණක් පෙන්වන්න" - "මඟ හැරුණු ඒවා පමණක් පෙන්වන්න" - "හඬ තැපැල් පමණක් පෙන්වන්න" - "සියලු ඇමතුම් පෙන්වන්න" - "තත්පර 2 ක විරාමයක් එක් කරන්න" - "රැඳී සිටීම එක් කරන්න" "සැකසීම්" "සමාකෘතිය" - "සියලුම සම්බන්ධතා" - "ස්පර්ශ නාද යතුරුපෑඩය භාවිතා කරන්න" - "පවතින ඇමතුමට නැවත යන්න" - "ඇමතුමක් එක් කරන්න" - "එන ඇමතුම්" - "හඬ තැපෑල ධාවනය කිරීම" - "%1$s සම්බන්ධතාවය බලන්න" - "%1$s අමතන්න" + "නව UI කෙටිමග තනන්න" + "තොග ක්‍රියා ප්‍රකාරය ඇතුළු කරමින්" + "තොග ක්‍රියා ප්‍රකාරය හැර යන ලදී" + "%1$s තෝරා ගන්නා ලදී" + "%1$s තෝරා ගැනීම ඉවත් කරන ලදී" "%1$s සඳහා ඇමතුම් විස්තර" "සැකසහිත අයාචිත තැපැල්කරු %1$s සඳහා ඇමතුම් විස්තර" "ඇමතුම් %1$s." "වීඩියෝ ඇමතුම." - "%1$s වෙත SMS යවන්න" - "අසා නොමැති හඬ තැපෑල" "හඬ සෙවීම අරඹන්න" - "%s අමතන්න" "හඬ තැපෑල" - "තත් %s" - "මිනි %s තත් %s" - "හඬ තැපෑල" - "හඬ තැපැල්" - "ඔව්" - "නැත" - "තෝරා ගත් %1$s මකන්නද?" + "කාණ්ඩ ක්‍රියා ප්‍රකාරය අවලංගු කරන්න" + "මකන්න" + "අවලංගු කරන්න" + "%1$s තෝරා ගන්නා ලදි" + + ""මෙම හඬ තැපැල් මකන්නද? "" + ""මෙම හඬ තැපැල් මකන්නද? "" + @string/call_log_header_today "%1$s දින %2$sට" "%1$02d:%2$02d" "%1$s%2$s" - "මෙම අංකයට ඇමතිය නොහැකිය" - "හඬ තැපෑල පිහිටුවීමට, මෙනුව > සැකසීම් වෙත යන්න." - "හඬ තැපෑල ඇමතීමට, මුලින්ම ගුවන්යානා ප්‍රකාරය වසන්න." - "පූරණය වෙමින්..." - "IMEI" - "MEID" - "SIM පතෙන් පූරණය කරමින්…" - "SIM පත් සම්බන්ධතා" - "සබඳතා යෙදුමක් ලබාගත නොහැකිය" "හඬ සෙවුම ලබාගත නොහැකිය" - "දුරකථන යෙදුම අබල කර ඇති නිසා දුරකථන ඇමතුම ලබාගැනීම කළ නොහැක." "සම්බන්ධතා සෙවීම" "අංකය එක් කරන්න හෝ සම්බන්ධතා සොයන්න" "ඔබගේ ඇමතුම් ඉතිහාසය හිස්ය" "ඇමතුමක් සිදු කරන්න" "ඔබට මඟ හැරුණු ඇමතුම් නැත." "ඔබේ හඬ තැපැල් එන ලිපි හිස්ය." - "ප්‍රියතමයන් පමණක් පෙන්වන්න" "ඇමතුම් ඉතිහාසය" "සියලු" "මග හැරුණේය" - "හඬ තැපෑල" "වේග ඩයල් කිරීම" "ඇමතුම් ඉතිහාසය" "සම්බන්ධතා" "හඬ තැපෑල" - "ප්‍රියතමයන්ගෙන් ඉවත් කරන්න" - "අස් කරන්න" "%s අමතන්න" "නව සම්බන්ධතාවයක් සාදන්න" "සම්බන්ධතාවකට එක් කරන්න" "SMS යවන්න" "වීඩියෝ ඇමතුමක් ලබාගන්න" "අංකය අවහිර කරන්න" - "නව මඟ හැරුණු ඇමතුම් %s" "ඔබගේ වේග ඩයල් එකේ තවමත් කවුරුවත් නැහැ" "ප්‍රියතම ලෙස එක් කරන්න" - "ඔබ තවමත් සම්බන්ධතා නැහැ" - "සම්බන්ධතාවයක් එක් කරන්න" - "සියලු අංක බැලීමට රූපය ස්පර්ශ කරන්න නැතහොත් නැවත අනුපිළිවෙළට සැකසීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න" "ඉවත් කරන්න" + "සියල්ල තෝරන්න" "වීඩියෝ ඇමතුම" "පණිවිඩයක් යවන්න" "ඇමතුම් විස්තර" @@ -164,25 +118,14 @@ "^1 අමතන්න" "^1. වීඩියෝ ඇමතුම" "^1 වෙතින් හඬ තැපෑලට සවන් දෙන්න" - "^1 වෙතින් වන හඬ තැපෑල ධාවනය කරන්න" - "^1 වෙතින් වන හඬ තැපෑල විරාම කරන්න" - "^1 වෙතින් වන හඬ තැපෑල මකන්න" - - නව හඬ තැපැල් %d - නව හඬ තැපැල් %d - "^1 සඳහා සම්බන්ධතාවක් සාදන්න" "පවතින සම්බන්ධතාව වෙත ^1 එක් කරන්න" "^1 සඳහා ඇමතුම් විස්තර" - "ඇමතුම් ඉතිහාසයෙන් මකන ලදී" "අද" "ඊයේ" "වඩා පරණ" - "ඇමතුම් ලැයිස්තුව" "ශබ්දවාහිනී සක්‍රිය කරන්න." "ශබ්දවාහිනී අක්‍රිය කරන්න." - "වේගයෙන් ධාවනය කරන්න." - "හෙමින් ධාවනය කරන්න." "නැවත ධාවනයෙදී ආරම්භ කරන්න හෝ විරාමය කරන්න." "විකල්ප පෙන්වන්න" "ශබ්ද සහ කම්පන" @@ -199,7 +142,6 @@ "ඇමතුම්" "ඇමතුම් අවහිර කිරීම" "හඬ තැපෑල" - "හඬ තැපැල් සැකසීම්වලට SIM තෝර." "ඇමතුම් අවහිර කිරීම තාවකාලිකව අක්‍රියයි" "ඔබ පසුගිය පැය 48 ඇතුළත මෙම දුරකථනයෙන් හදිසි අවස්ථා සේවා ඇමතූ බැව්න් ඇමතුම් අවහිර කිරීම අබල කර ඇත. පැය 48ක කාල සීමාව ඉකුත් වූ විට එය ස්වයංක්‍රියව යළි සබල කෙරේ." "අංක ආයාත කරන්න" @@ -213,12 +155,8 @@ "අවහිර කළ අංක" "%1$s දැනටමත් අවහිර කර ඇත." "ගිණුම් ඇමතීම" - "ක්‍රියාත්මක කරන්න" - "අවසර සකසන්න" "වේග ඩයල් කිරීම සබල කිරීමට, සම්බන්ධතා අවසරය ක්‍රියාත්මක කරන්න." "ඔබේ ඇමතුම් ලොගය බැලීමට, දුරකථන අවසරය ක්‍රියාත්මක කරන්න." - "ඔබේ සම්බන්ධතා බැලීමට, සම්බන්ධතා අවසරය ක්‍රියාත්මක කරන්න." - "ඔබේ හඬ තැපෑල වෙත ප්‍රවේශ වීමට, දුරකථන අවසරය ක්‍රියාත්මක කරන්න." "ඔබේ සම්බන්ධතා සෙවීමට, සම්බන්ධතා අවසර ක්‍රියාත්මක කරන්න." "ඇමතුමක් ලබා ගැනීමට, දුරකථන අවසරය ක්‍රියාත්මක කරන්න." "දුරකථන යෙදුමට පද්ධති සැකසීම් වෙත ලිවීමට අවසර නැත." @@ -230,4 +168,10 @@ "අයාචිත තැපෑල" "%1$s නොබැඳි අතර ළඟා වීමට නොහැකිය" "ගැන" + "Google මගින් පිටපත් කරන ලදී" + "Google පිටපත් කරමින් සිටී..." + "අනුපිටපතක් නොමැත" + "බලන්න" + "ඇමතුම මකන ලදී. Messages වල මෙම ඇමතුම අතරතුර බෙදා ගත් ඇමුණුම් බලා මකන්න." + "ඇමතුම මකන ලදී. Messages වල මෙම ඇමතුම් අතරතුර බෙදා ගත් ඇමුණුම් බලා මකන්න." diff --git a/java/com/android/dialer/app/res/values-sk/strings.xml b/java/com/android/dialer/app/res/values-sk/strings.xml index 60b63d520..ebed27977 100644 --- a/java/com/android/dialer/app/res/values-sk/strings.xml +++ b/java/com/android/dialer/app/res/values-sk/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefón" "Klávesnica telefónu" - "Telefón" "História hovorov" - "Nahlásiť nesprávne číslo" "Kopírovať číslo" "Kopírovať prepis" - "Blokovať číslo" - "Zrušiť blokovanie čísla" "Pred volaním upraviť číslo" "Vymazať históriu hovorov" "Odstrániť hlasovú správu" @@ -34,7 +30,6 @@ "Chcete vymazať históriu hovorov?" "Týmto z histórie odstránite všetky hovory." "Vymazáva sa história hovorov..." - "Telefón" "Zmeškaný hovor" "Zmeškaný pracovný hovor" "Zmeškané hovory" @@ -50,107 +45,68 @@ %1$d odkazov v hlasovej schránke Odkaz v hlasovej schránke - "Prehrať" "%1$s, %2$s" "Nová hlasová správa – %1$s" "Hlasovú schránku sa nepodarilo prehrať" "Načítava sa hlasová schránka…" - "Archivuje sa hlasová správa…" "Hlasovú schránku sa nepodarilo načítať" - "Iba volania do hlasovej schránky" - "Iba prichádzajúce hovory" - "Iba odchádzajúce hovory" - "Iba zmeškané hovory" "(%1$d) %2$s" - "hľadať" - "vytáčanie" - "číslo, ktoré chcete vytočiť" - "Spustiť alebo zastaviť prehrávanie" "Zapnúť alebo vypnúť reproduktor" "Hľadať pozíciu prehrávania" - "Znížiť počet snímok za sekundu" - "Zvýšiť počet snímok za sekundu" "História hovorov" "Ďalšie možnosti" "klávesnica" - "Zobraziť len odchádzajúce" - "Zobraziť len prichádzajúce" - "Zobraziť len zmeškané" - "Zobraziť len hlasové správy" - "Zobraziť všetky hovory" - "Pridať dvojsekundovú pauzu" - "Pridať čakanie" "Nastavenia" "Simulátor" - "Všetky kontakty" - "Použiť dotykovú tónovú klávesnicu" - "Návrat k prebiehajúcemu hovoru" - "Pridať hovor" - "Prichádzajúce hovory" - "Prehrať hlasovú správu" - "Zobraziť kontakt %1$s" - "Zavolať kontakt %1$s" + "Vyt. skratku na nové rozhranie" + "Vstupuje sa do režimu hromadných akcií" + "Odišli ste z režimu hromadných akcií" + "Položka %1$s bola vybraná" + "Výber položky %1$s bol zrušený" "Podrobnosti kontaktu pre %1$s" "Podrobnosti kontaktu pri podozrení, že volajúci %1$s je šíriteľ spamu" "Počet volaní: %1$s." "Videohovor" - "Poslať SMS kontaktu %1$s" - "Nevypočutá hlasová správa" "Spustenie hlasového vyhľadávania" - "Volať %s" "Hlasová schránka" - "%s s" - "%s min. %s s" - "hlasová správa" - "hlasové správy" - "Áno" - "Nie" - "Chcete odstrániť vybraté položky (%1$s)?" + "Zrušiť režim hromadných akcií" + "Odstrániť" + "Zrušiť" + "Vybraté: %1$s" + + ""Chcete odstrániť tieto hlasové správy? "" + ""Chcete odstrániť tieto hlasové správy? "" + ""Chcete odstrániť tieto hlasové správy? "" + ""Chcete odstrániť túto hlasovú správu? "" + @string/call_log_header_today "%1$s%2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Na toto číslo nie je možné volať" - "Ak chcete nastaviť hlasovú schránku, prejdite na ponuku > Nastavenia." - "Ak chcete volať hlasovú schránku, najprv vypnite režim v lietadle." - "Načítava sa…" - "IMEI" - "MEID" - "Prebieha načítavanie z SIM karty..." - "Kontakty na SIM karte" - "Nie je k dispozícii žiadna aplikácia na kontakty" "Hlasové vyhľadávanie nie je k dispozícii" - "Nie je možné volať, pretože aplikácia Telefón bola deaktivovaná." "Hľadať v kontaktoch" "Pridajte číslo / vyhľadajte v kontaktoch" "História hovorov je prázdna" "Zavolať" "Nemáte žiadne zmeškané hovory." "Hlasová schránka je prázdna." - "Zobraziť iba obľúbené" "História hovorov" "Všetky" "Zmeškané" - "Schránka" "Rýchla voľba" "História hovorov" "Kontakty" "Hlasová schránka" - "Odstránené z obľúbených" - "Späť" "Volať %s" "Vytvoriť nový kontakt" "Pridať ku kontaktu" "Odoslať SMS" "Uskutočniť videohovor" "Blokovať číslo" - "Nové zmeškané hovory: %s" "V rýchlej voľbe zatiaľ nemáte žiadny kontakt" "Pridať obľúbený kontakt" - "Zatiaľ nemáte žiadne kontakty" - "Pridať kontakt" - "Klepnutím na obrázok môžete zobraziť všetky čísla. Pridržaním obrázka môžete zmeniť poradie." "Odstrániť" + "Vybrať všetko" "Videohovor" "Odoslať správu" "Podrobnosti hovoru" @@ -166,27 +122,14 @@ "Zavolať kontakt ^1" "Spustiť videohovor s kontaktom ^1" "Vypočuť si správu v hlasovej schránke od používateľa ^1" - "Prehrať hlasovú schránku kontaktu ^1" - "Pozastaviť hlasovú schránku kontaktu ^1" - "Odstrániť hlasovú schránku kontaktu ^1" - - %d nové odkazy v hlasovej schránke - %d nového odkazu v hlasovej schránke - %d nových odkazov v hlasovej schránke - %d nový odkaz v hlasovej schránke - "Vytvoriť kontakt pre ^1" "Pridať údaj ^1 ku kontaktu" "Podrobnosti hovoru pre kontakt ^1" - "Odstránené z histórie hovorov" "Dnes" "Včera" "Staršie" - "Zoznam hovorov" "Zapnúť reproduktor" "Vypnúť reproduktor" - "Prehrať rýchlejšie" - "Prehrať pomalšie" "Spustiť alebo pozastaviť prehrávanie" "Možnosti zobrazenia" "Zvuky a vibrovanie" @@ -203,7 +146,6 @@ "Hovory" "Blokovanie hovorov" "Hlasová schránka" - "Vyberte SIM na nastavenia hlasovej schránky" "Blokovanie hovorov je dočasne vypnuté" "Pretože ste z tohto telefónu počas posledných 48 hodín volali na tiesňovú linku, blokovanie hovorov bolo vypnuté. Po uplynutí 48 hodín sa automaticky znova zapne." "Importovať čísla" @@ -217,12 +159,8 @@ "Blokované čísla" "Číslo %1$s je už blokované." "Telefónne účty" - "Zapnúť" - "Nastaviť povolenia" "Ak chcete aktivovať rýchlu voľbu, zapnite povolenie Kontakty." "Ak si chcete zobraziť denník hovorov, zapnite povolenie Telefón." - "Ak si chcete zobraziť kontakty, zapnite povolenie Kontakty." - "Ak chcete používať hlasovú schránku, zapnite povolenie Telefón." "Ak chcete hľadať kontakty, zapnite povolenie Kontakty." "Ak chcete volať, zapnite povolenie Telefón." "Telefónna aplikácia nemá povolenie na zápis do nastavení systému." @@ -234,4 +172,10 @@ "Spam" "%1$s je offline a nedá sa zastihnúť" "Informácie" + "Prepísané Googlom" + "Google prepisuje…" + "Prepis nie je k dispozícii" + "Zobraziť" + "Hovor bol odstránený. Prílohy zdieľané počas neho si môžete pozrieť a odstrániť v aplikácii Správy." + "Hovory boli odstránené. Prílohy zdieľané počas nich si môžete pozrieť a odstrániť v aplikácii Správy." diff --git a/java/com/android/dialer/app/res/values-sl/strings.xml b/java/com/android/dialer/app/res/values-sl/strings.xml index b46b99ab5..520d0032f 100644 --- a/java/com/android/dialer/app/res/values-sl/strings.xml +++ b/java/com/android/dialer/app/res/values-sl/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Tipkovnica telefona" - "Telefon" "Zgodovina klicev" - "Prijavi netočno številko" "Kopiranje številke" "Kopiraj prepis" - "Blokiranje številke" - "Odblokiranje telefonske številke" "Urejanje številke pred klicem" "Izbriši zgodovino klicev" "Brisanje sporočil iz odzivnika" @@ -34,7 +30,6 @@ "Želite izbrisati zgodovino klicev?" "S tem boste iz zgodovine izbrisali vse klice" "Izbris zgodovine klicev …" - "Telefoniranje" "Neodgovorjeni klic" "Zgrešen delovni klic" "Neodgovorjeni klici" @@ -50,107 +45,68 @@ %1$d sporočila v odzivniku %1$d sporočil v odzivniku - "Predvajaj" "%1$s , %2$s" "Nova glasovna pošta od %1$s" "Sporočil v odzivniku ni mogoče predv." "Nalaganje sporočil v odzivniku …" - "Arhiviranje sporočila v odzivniku …" "Sporočil v odzivniku ni mogoče naložiti" - "Samo klici z odzivnikom" - "Samo dohodni klici" - "Samo odhodni klici" - "Samo neodgovorjeni klici" "(%1$d) %2$s" - "iskanje" - "klicanje" - "številka, ki bo poklicana" - "Začetek ali konec predvajanja" "Vklop ali izklop zvočnika" "Iskanje položaja predvajanja" - "Zmanjšanje hitrosti predvajanja" - "Povečanje hitrosti predvajanja" "Zgodovina klicev" "Več možnosti" "tipkovnica" - "Pokaži samo odhodne" - "Pokaži samo dohodne" - "Pokaži samo neodgovorjene" - "Pokaži samo spor. glasovne pošte" - "Pokaži vse klice" - "Dodaj 2 sekundi premora" - "Dodaj premor" "Nastavitve" "Simulator" - "Vsi stiki" - "Uporabi številčnico za tonsko klicanje" - "Nazaj na klic, ki poteka" - "Dodaj klic" - "Dohodni klici" - "Predvajanje sporočil glasovne pošte" - "Ogled stika %1$s" - "Pokliči %1$s" + "Ustvari bliž. za novi up. vm." + "Prehod v način množičnega dejanja" + "Prehod iz načina množičnega dejanja" + "Izbrano: %1$s" + "Preklican izbor: %1$s" "Podrobnosti stika za %1$s" "Podrobnosti stika za domnevnega neželenega klicatelja %1$s" "Št. klicev: %1$s." "Videoklic." - "Pošlji SMS prejemniku %1$s" - "Neodprta glasovna pošta" "Začni glasovno iskanje" - "Pokliči %s" "Glasovna pošta" - "%s s" - "%s min %s s" - "sporočilo v odzivniku" - "sporočila v odzivniku" - "Da" - "Ne" - "Želite izbrisati %1$s?" + "Prekliči način množičnega dejanja" + "Izbriši" + "Prekliči" + "Št. izbranih: %1$s" + + ""Želite izbrisati ta sporočila v odzivniku? "" + ""Želite izbrisati ta sporočila v odzivniku? "" + ""Želite izbrisati ta sporočila v odzivniku? "" + ""Želite izbrisati ta sporočila v odzivniku? "" + @string/call_log_header_today "%1$s ob %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Te številke ni mogoče klicati" - "Če želite nastaviti odzivnik, pojdite v »Meni« > »Nastavitve«." - "Če želite poklicati odzivnik, najprej izklopite način za letalo." - "Nalaganje …" - "IMEI" - "MEID" - "Nalaganje s kartice SIM ..." - "Stiki na kartici SIM" - "Ni aplikacije za stike" "Glasovno iskanje ni na voljo" - "Ni mogoče opraviti telefonskega klica, ker je aplikacija Telefon onemogočena." "Iskanje stikov" "Dodajte št. ali iščite med st." "Zgodovina klicev je prazna" "Klicanje" "Nimate neodgovorjenih klicev." "Vaša mapa s sporočili v odzivniku je prazna." - "Pokaži samo priljubljene" "Zgodovina klicev" "Vsi" "Neodgovorjeni" - "Odzivnik" "Hitro izbiranje" "Zgodovina klicev" "Stiki" "Odzivnik" - "Odstranjeno iz priljubljenih" - "Razveljavi" "Pokliči %s" "Ustvari nov stik" "Dodaj stiku" "Pošlji SMS" "Opravi videoklic" "Blokiraj številko" - "Št. novih zgrešenih klicev: %s" "Na seznamu za hitro klicanje nimate še nikogar" "Dodajte priljubljenega" - "Nimate še stikov" - "Dodajte stik" - "Dotaknite se slike, da prikažete vse številke, ali pa se je dotaknite in pridržite, da spremenite vrstni red." "Odstrani" + "Izberi vse" "Videoklic" "Pošljite sporočilo" "Podrobnosti klica" @@ -166,27 +122,14 @@ "Klicanje: ^1" "Videoklic: ^1." "Poslušajte sporočilo v odzivniku od: ^1" - "Predvajanje sporočil v odzivniku od osebe/številke ^1" - "Zaustavitev prejemanja sporočil v odzivnik od osebe/številke ^1" - "Brisanje sporočil iz odzivnika od osebe/številke ^1" - - %d sporočilo v odzivniku - %d sporočili v odzivniku - %d sporočila v odzivniku - %d sporočil v odzivniku - "Ustvarjanja stika za: ^1" "Dodajanje tega obstoječemu stiku: ^1" "Podrobnosti klica za: ^1" - "Izbrisano iz zgodovine klicev" "Danes" "Včeraj" "Starejši" - "Seznam klicev" "Vklopi zvočnik." "Izklopi zvočnik." - "Predvajaj hitreje." - "Predvajaj počasneje." "Začni ali zaustavi predvajanje." "Možnosti prikaza" "Zvoki in vibriranje" @@ -203,7 +146,6 @@ "Klici" "Blokiranje klicev" "Odzivnik" - "Izberi SIM za nast. odzivnika" "Blokiranje klicev je začasno izklopljeno" "Blokiranje klicev je onemogočeno, ker ste se v zadnjih 48 urah s tem telefonom obrnili na nujno pomoč. Ko 48-urno obdobje poteče, bo blokiranje klicev samodejno znova omogočeno." "Uvoz številk" @@ -217,12 +159,8 @@ "Blokirane številke" "Telefonska številka %1$s je že blokirana." "Računi za klicanje" - "Vklop" - "Nastavi dovoljenja" "Če želite omogočiti hitro klicanje, vklopite dovoljenje za stike." "Če si želite ogledati dnevnik klicev, vklopite dovoljenje za telefon." - "Če si želite ogledati stike, vklopite dovoljenje za stike." - "Če želite dostopati do sporočil v odzivniku, vklopite dovoljenje za telefon." "Če želite iskati po stikih, vklopite dovoljenje za stike." "Če želite klicati, vklopite dovoljenje za telefon." "Aplikacija Telefon nima dovoljenja za pisanje v sistemske nastavitve." @@ -234,4 +172,10 @@ "Vsiljena pošta" "Oseba %1$s nima vzpostavljene povezave in ni dosegljiva" "Vizitka" + "Prepis je zagotovil Google" + "Google ustvarja prepis …" + "Prepis ni na voljo" + "Prikaži" + "Klic je izbrisan. Priloge, ki so bile dane v skupno rabo v tem klicu, si lahko ogledate in izbrišete v aplikaciji Messages." + "Klici so izbrisani. Priloge, ki so bile dane v skupno rabo v teh klicih, si lahko ogledate in izbrišete v aplikaciji Messages." diff --git a/java/com/android/dialer/app/res/values-sq/strings.xml b/java/com/android/dialer/app/res/values-sq/strings.xml index 6a274fcd2..dab79542b 100644 --- a/java/com/android/dialer/app/res/values-sq/strings.xml +++ b/java/com/android/dialer/app/res/values-sq/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefoni" "Blloku i tasteve i telefonit" - "Telefoni" "Historiku i telefonatave" - "Raporto numrin e pasaktë" "Kopjo numrin" "Kopjo transkriptimin" - "Blloko numrin" - "Zhblloko numrin" "Redakto numrin para telefonatës" "Pastro historikun e telefonatave" "Fshije postën zanore" @@ -34,7 +30,6 @@ "Të pastrohet historiku i telefonatave?" "Kjo do të fshijë të gjitha telefonatat nga historiku yt" "Po pastron historikun e telefonatave…" - "Telefoni" "Telefonatë e humbur" "Telefonatë pune e humbur" "Telefonata të humbura" @@ -48,107 +43,66 @@ %1$d posta zanore postë zanore - "Luaj" "%1$s, %2$s" "Postë e re zanore nga %1$s" "Posta zanore nuk mund të luhej" "Po ngarkon postën zanore…" - "Po arkivon postën zanore..." "Posta zanore nuk mund të ngarkohej" - "Vetëm telefonatat me mesazhe zanore" - "Vetëm telefonatat hyrëse" - "Vetëm telefonatat dalëse" - "Vetëm telefonatat e humbura" "(%1$d) %2$s" - "kërko" - "formo numrin" - "numri për t\'u formuar" - "Luaj ose ndalo luajtjen" "Aktivizo ose çaktivizo altoparlantin" "Kërko pozicionin e luajtjes" - "Ule shpejtësinë e luajtjes" - "Rrite shpejtësinë e luajtjes" "Historiku i telefonatave" "Opsione të tjera" "blloku i tasteve" - "Shfaq vetëm dalëset" - "Shfaq vetëm hyrëset" - "Shfaq vetëm të humburat" - "Shfaq vetëm postën zanore" - "Shfaqi të gjitha telefonatat" - "Shto një ndërprerje 2-sekondëshe" - "Shto një pritje" "Cilësimet" "Simuluesi" - "Të gjitha kontaktet" - "Përdor bllokun e tasteve" - "Kthehu te telefonata" - "Shto një telefonatë" - "Telefonatat hyrëse" - "Luaj postën zanore" - "Shiko kontaktin %1$s" - "Telefono %1$s" + "Krijo një shkurtore për ndërfaqen e re të përdoruesit" + "Po hyn në modalitetin e veprimit në masë" + "U largove nga modaliteti i veprimit në masë" + "U zgjodh %1$s" + "Zgjedhja e %1$s u anulua" "Detajet e kontaktit për %1$s" "Detajet e kontaktit për telefonuesin e dyshuar si të padëshiruar %1$s" "%1$s telefonata." "Telefonatë me video." - "Dërgo SMS te %1$s" - "Postë zanore e padëgjuar" "Nis kërkimin me zë" - "Telefono %s" "Posta zanore" - "%s sekonda" - "%s min. e %s sek." - "posta zanore" - "postat zanore" - "Po" - "Jo" - "Të fshihen %1$s të zgjedhura?" + "Anulo modalitetin e veprimeve në grup" + "Fshi" + "Anulo" + "%1$s të zgjedhura" + + ""Të fshihen këto posta zanore? "" + ""Të fshihet kjo postë zanore? "" + @string/call_log_header_today "%1$s%2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Ky numër nuk mund të telefonohet" - "Për të konfiguruar postën zanore, shko te \"Menyja\" > \"Cilësimet\"." - "Për të shtuar një postë zanore, në fillim çaktivizo modalitetin \"në aeroplan\"." - "Po ngarkon..." - "IMEI" - "MEID" - "Po ngarkon nga karta SIM…" - "Kontaktet e kartës SIM" - "Nuk mund të përdoret asnjë aplikacion për kontaktet" "Kërkimi me zë nuk mundësohet" - "Telefonata nuk mund të bëhet sepse aplikacioni \"Telefoni\" është i çaktivizuar." "Kërko për kontakte" "Shto një numër ose kërko te kontaktet" "Historiku i telefonatave është bosh" "Bëj një telefonatë" "Nuk ke thirrje të humbura." "Kutia hyrëse e postës tënde zanore është bosh." - "Shfaq vetëm të preferuarat" "Historiku i telefonatave" "Të gjitha" "Të humbura" - "Posta zanore" "Telefonatë e shpejtë" "Historiku i telefonatave" "Kontaktet" "Posta zanore" - "U hoq nga të preferuarat" - "Zhbëj" "Telefono %s" "Krijo një kontakt të ri" "Shto te një kontakt" "Dërgo SMS" "Bëj një telefonatë me video" "Blloko numrin" - "%s telefonata të reja të humbura" "Askush nuk është ende në thirrjen tënde të shpejtuar" "Shto një të preferuar" - "Nuk ke ende kontakte" - "Shto një kontakt" - "Prek imazhin për të parë të gjithë numrat ose mbaje të shtypur për ta pozicionuar përsëri" "Hiq" + "Zgjidh të gjitha" "Telefonatë me video" "Dërgo një mesazh" "Detajet e telefonatës" @@ -164,25 +118,14 @@ "Telefono ^1" "Telefono me video ^1." "Dëgjo postën zanore nga ^1" - "Luaj postën zanore nga ^1" - "Ndërprit postën zanore nga ^1" - "Fshi postën zanore nga ^1" - - %d posta të reja zanore - %d postë e re zanore - "Krijo një kontakt për ^1" "Shtoje ^1 te një kontakt ekzistues" "Detajet e telefonatës për ^1" - "U fshi nga historiku i telefonatave" "Sot" "Dje" "Më të vjetra" - "Lista e telefonatave" "Aktivizo altoparlantin." "Çaktivizo altoparlantin." - "Luaj më shpejt." - "Luaj më ngadalë." "Nis ose ndërprit luajtjen." "Opsionet e paraqitjes" "Tingujt dhe dridhjet" @@ -199,7 +142,6 @@ "Telefonatat" "Bllokimi i telefonatave" "Posta zanore" - "Zgjidh SIM për postën zanore" "Bllokimi i telefonatave është përkohësisht joaktiv" "Bllokimi i telefonatave është çaktivizuar sepse kontaktove me shërbimet e urgjencës nga ky telefon brenda 48 orëve të fundit. Ai do të riaktivizohet automatikisht pas skadimit të periudhës prej 48 orë." "Importo numrat" @@ -213,12 +155,8 @@ "Numrat e bllokuar" "%1$s është i bllokuar tashmë." "Llogaritë e telefonatave" - "Aktivizo" - "Cakto lejet" "Për të aktivizuar thirrjen e shpejtuar, aktivizo lejen e Kontakteve." "Për të parë evidencën e telefonatave, aktivizo lejen e Telefonit." - "Për të parë kontaktet, aktivizo lejen e Kontakteve." - "Për të pasur qasje në postën zanore, aktivizo lejen e Telefonit." "Për të kërkuar kontaktet, aktivizo lejet e Kontakteve" "Për të kryer një telefonatë, aktivizo lejen e Telefonit." "Aplikacionet e telefonit nuk kanë leje të shkruajnë në cilësimet e sistemit." @@ -230,4 +168,10 @@ "E bezdisshme" "%1$s është jashtë linje dhe nuk mund të kontaktohet" "Rreth" + "Transkriptuar nga Google" + "Google po transkripton..." + "Transkripti nuk ofrohet" + "Shiko" + "Telefonata u fshi. Shiko dhe fshi bashkëngjitjet e ndara gjatë kësaj telefonate te Messages." + "Telefonatat u fshinë. Shiko dhe fshi bashkëngjitjet e ndara gjatë telefonatave te Messages." diff --git a/java/com/android/dialer/app/res/values-sr/strings.xml b/java/com/android/dialer/app/res/values-sr/strings.xml index 0def958d4..e9a6b24da 100644 --- a/java/com/android/dialer/app/res/values-sr/strings.xml +++ b/java/com/android/dialer/app/res/values-sr/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Телефон" "Телефонска тастатура" - "Телефон" "Историја позива" - "Пријави нетачан број" "Копирај број" "Копирај транскрипцију" - "Блокирај број" - "Деблокирај број" "Измени број пре позива" "Обриши историју позива" "Избриши говорну поруку" @@ -34,7 +30,6 @@ "Желите да обришете историју позива?" "Ово ће избрисати све позиве из историје" "Брише се историја позива…" - "Телефон" "Пропуштен позив" "Пропуштен позив за Work" "Пропуштени позиви" @@ -49,107 +44,67 @@ %1$d говорне поруке %1$d говорних порука - "Пусти" "%1$s, %2$s" "Нова говорна порука од %1$s" "Пуштање говорне поште није успело" "Говорна пошта се учитава…" - "Говорна пошта се архивира…" "Учитавање говорне поште није успело" - "Само позиви са говорном поштом" - "Само долазни позиви" - "Само одлазни позиви" - "Само пропуштени позиви" "(%1$d) %2$s" - "претражи" - "бирање" - "број за бирање" - "Покретање или заустављање репродукције" "Укључивање или искључивање спикерфона" "Тражење позиције у репродукцији" - "Смањивање брзине репродукције" - "Повећавање брзине репродукције" "Историја позива" "Још опција" "тастатура" - "Прикажи само одлазне" - "Прикажи само долазне" - "Прикажи само пропуштене" - "Прикажи само говорне поруке" - "Прикажи све позиве" - "Додај паузу од 2 секунде" - "Додај чекање" "Подешавања" "Симулатор" - "Сви контакти" - "Употребите бројчаник за тонско бирање" - "Врати се на позив који је у току" - "Додај позив" - "Долазни позиви" - "Пуштање говорне поште" - "Прикажи контакт %1$s" - "Позови %1$s" + "Направите пречицу за нови UI" + "Улазите у режим групних радњи" + "Изашли сте из режима групних радњи" + "Изабрано је %1$s" + "Опозван је избор %1$s" "Детаљи о контакту за %1$s" "Контакт информације потенцијалног непожељног позиваоца %1$s" "%1$s позива." "Видео позив." - "Слање SMS-а за %1$s" - "Непреслушана говорна пошта" "Покретање гласовне претраге" - "Позови %s" "Говорна пошта" - "%s сек" - "%s мин %s сек" - "говорну поруку" - "говорне поруке" - "Да" - "Не" - "Желите ли да избришете изабрану(е) %1$s?" + "Откажите режим групних радњи" + "Избриши" + "Откажи" + "Изабраних: %1$s" + + ""Желите ли да избришете ове говорне поруке? "" + ""Желите ли да избришете ове говорне поруке? "" + ""Желите ли да избришете ове говорне поруке? "" + @string/call_log_header_today "%1$s у %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Није могуће позвати овај број" - "Да бисте подесили говорну пошту, идите у Мени > Подешавања." - "Да бисте позвали говорну пошту, прво искључите режим рада у авиону." - "Учитава се…" - "IMEI" - "MEID" - "Учитава се са SIM картице…" - "Контакти на SIM картици" - "Нема доступне апликације за контакте" "Гласовна претрага није доступна" - "Није могуће упутити телефонски позив јер је апликација Телефон онемогућена." "Претражи контакте" "Додајте број или претражите контакте" "Историја позива је празна" "Позови" "Немате ниједан пропуштен позив." "Пријемно сандуче говорне поште је празно." - "Прикажи само омиљене" "Историја позива" "Сви" "Пропуштени" - "Говорна пошта" "Брзо бирање" "Историја позива" "Контакти" "Говорна пошта" - "Уклоњено је из омиљених" - "Опозови" "Позови %s" "Направи нови контакт" "Додај у контакт" "Пошаљи SMS" "Упути видео позив" "Блокирај број" - "Нових пропуштених позива: %s" "Немате ниједан контакт на брзом бирању" "Додај омиљен контакт" - "Још увек немате ниједан контакт" - "Додај контакт" - "Додирните слику да бисте видели све бројеве или додирните и задржите да бисте им променили распоред" "Уклони" + "Изабери све" "Видео позив" "Пошаљи поруку" "Детаљи позива" @@ -165,26 +120,14 @@ "Позови ^1" "Упутите видео позив контакту ^1." "Пусти говорну пошту од ^1" - "Репродукуј говорну пошту контакта ^1" - "Паузирај говорну пошту контакта ^1" - "Избриши говорну пошту контакта ^1" - - %d нова порука говорне поште - %d нове поруке говорне поште - %d нових порука говорне поште - "Направите контакт за ^1" "Додајте ^1 постојећем контакту" "Детаљи позива за ^1" - "Избрисано из историје позива" "Данас" "Јуче" "Старији" - "Листа позива" "Укључите звучник." "Искључите звучник." - "Бржа репродукција." - "Спорија репродукција." "Започните или паузирајте репродукцију." "Опције приказа" "Звуци и вибрација" @@ -201,7 +144,6 @@ "Позиви" "Блокирање позива" "Говорна пошта" - "Избор SIM-а – подешав. гов. поште" "Блокирање позива је привремено искључено" "Блокирање позива је онемогућено зато што сте контактирали службе за помоћ у хитним случајевима са овог телефона у последњих 48 сати. Аутоматски ће бити поново омогућено када истекне период од 48 сати." "Увези бројеве" @@ -215,12 +157,8 @@ "Блокирани бројеви" "%1$s је већ блокиран." "Налози за позивање" - "Укључи" - "Подеси дозволе" "Да бисте омогућили брзо бирање, укључите дозволу за Контакте." "Да бисте видели евиденцију позива, укључите дозволу за Телефон." - "Да бисте видели контакте, укључите дозволу за Контакте." - "Да бисте приступили говорној пошти, укључите дозволу за Телефон." "Да бисте претражили контакте, укључите дозволе за Контакте." "Да бисте упутили позив, укључите дозволу за Телефон." "Апликација Телефон нема дозволу за уписивање у системска подешавања." @@ -232,4 +170,10 @@ "Непожељан" "%1$s је офлајн и не можете да га/је контактирате" "Основни подаци" + "Транскрипт је направио Google" + "Google прави транскрипт…" + "Транскрипт није доступан" + "Прикажи" + "Позив је избрисан. Прегледајте и избришите прилоге дељене током овог позива у Messages-у." + "Позиви су избрисани. Прегледајте и избришите прилоге дељене током позива у Messages-у." diff --git a/java/com/android/dialer/app/res/values-sv/strings.xml b/java/com/android/dialer/app/res/values-sv/strings.xml index 75aa731f9..86217cd3f 100644 --- a/java/com/android/dialer/app/res/values-sv/strings.xml +++ b/java/com/android/dialer/app/res/values-sv/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefonens knappsats" - "Telefon" "Samtalshistorik" - "Rapportera fel nummer" "Kopiera nummer" "Kopiera transkription" - "Blockera nummer" - "Häv blockeringen av numret" "Redigera nummer före samtal" "Rensa samtalshistorik" "Radera röstmeddelande" @@ -34,7 +30,6 @@ "Vill du rensa samtalshistoriken?" "Alla samtal raderas från historiken" "Rensar samtalshistoriken ..." - "Ringa" "Missat samtal" "Missat jobbsamtal" "Missade samtal" @@ -48,107 +43,66 @@ %1$d röstmeddelanden röstmeddelande - "Spela upp" "%1$s, %2$s" "Nytt röstmeddelande från %1$s" "Det gick inte att spela upp röstmeddelandet" "Läser in röstmeddelande ..." - "Arkiverar röstmeddelande ..." "Det gick inte att läsa in röstmeddelandet" - "Endast samtal med röstmeddelande" - "Endast inkommande samtal" - "Endast utgående samtal" - "Endast missade samtal" "(%1$d) %2$s" - "sök" - "ring upp" - "nummer att ringa" - "Starta eller stoppa uppspelning" "Slå på eller av högtalartelefon" "Sök uppspelningsläge" - "Minska uppspelningshastighet" - "Öka uppspelningshastighet" "Samtalshistorik" "Fler alternativ" "knappsats" - "Visa endast utgående samtal" - "Visa endast inkommande samtal" - "Visa endast missade samtal" - "Visa bara röstmeddelanden" - "Visa alla samtal" - "Lägg till en paus på 2 sek." - "Lägg till väntetid" "Inställningar" "Simulator" - "Alla kontakter" - "Använd tonvalstelefon" - "Återvänd till pågående samtal" - "Lägg t. samt." - "Inkommande samtal" - "Spela upp röstmeddelande" - "Visa kontakten %1$s" - "Ring %1$s" + "Skapa genväg till anv.gränssn." + "Öppnar läget för massåtgärd" + "Stängde läget för massåtgärd" + "Markerade %1$s" + "Avmarkerade %1$s" "Kontaktuppgifter för %1$s" "Kontaktuppgifter för misstänkt spamsamtal %1$s" "%1$s samtal." "Videosamtal." - "Skicka sms till %1$s" - "Ej hört röstmeddelande" "Starta röstsökning" - "Ring %s" "Röstbrevlåda" - "%s sekund" - "%s min %s sek" - "röstbrevlåda" - "röstmeddelanden" - "Ja" - "Nej" - "Vill du radera markerade %1$s?" + "Avbryt läget för massåtgärd" + "Radera" + "Avbryt" + "%1$s har markerats" + + ""Vill du ta bort dessa röstmeddelanden? "" + ""Vill du ta bort det här röstmeddelandet? "" + @string/call_log_header_today "%1$s kl. %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Det går inte att ringa det här numret" - "Välj Meny > Inställningar om du vill konfigurera röstbrevlådan." - "Om du vill ringa röstbrevlådan måste du först inaktivera flygplansläget." - "Läser in …" - "IMEI-kod" - "MEID" - "Läser in från SIM-kort…" - "Kontakter från SIM-kort" - "Det finns inga appar för kontakter" "Röstsökning är inte tillgänglig" - "Det går inte att ringa eftersom appen Telefon har inaktiverats." "Sök efter kontakter" "Ange nummer eller kontakt" "Samtalshistoriken är tom" "Ring ett samtal" "Du har inga missade samtal." "Din röstbrevlåda är tom." - "Visa endast favoriter" "Samtalshistorik" "Alla" "Missade" - "Röstbrevlåda" "Kortnummer" "Samtalshistorik" "Kontakter" "Röstbrevlåda" - "Borttagen från favoriter" - "Ångra" "Ring %s" "Skapa ny kontakt" "Lägg till i kontakt" "Skicka sms" "Ring videosamtal" "Blockera nummer" - "%s nya missade samtal" "Du har ingen kontakt som snabbval ännu" "Lägg till en favorit" - "Du har inga kontakter ännu" - "Lägg till en kontakt" - "Tryck på bilden för att visa alla nummer eller tryck länge för att ändra ordningen" "Ta bort" + "Markera alla" "Videosamtal" "Skicka ett meddelande" "Samtalsinfo" @@ -164,25 +118,14 @@ "Ring ^1" "Ring videosamtal till ^1." "Lyssna på ett röstmeddelande från ^1" - "Spela upp röstmeddelande från ^1" - "Pausa röstmeddelande från ^1" - "Radera röstmeddelande från ^1" - - %d nya röstmeddelanden - %d nytt röstmeddelande - "Skapa en kontakt för ^1" "Lägg till ^1 i befintliga kontakter" "Samtalsinformation för ^1" - "Har raderats från samtalshistoriken" "I dag" "I går" "Äldre" - "Samtalslista" "Slå på högtalaren." "Stäng av högtalaren." - "Spela upp snabbare." - "Spela upp långsammare." "Starta eller pausa uppspelning." "Visningsalternativ" "Ljud och vibration" @@ -199,7 +142,6 @@ "Samtal" "Samtalsblockering" "Röstbrevlåda" - "Välj SIM för röstbrevlåda" "Blockeringen har inaktiverats tillfälligt" "Samtalsblockering har inaktiverats eftersom du ringde ett larmnummer från den här mobilen under de senaste 48 timmarna. Blockeringen aktiveras igen när 48 timmar har gått." "Importera nummer" @@ -213,12 +155,8 @@ "Blockerade nummer" "%1$s är redan blockerat." "Konton för samtal" - "Aktivera" - "Ange behörigheter" "Du måste aktivera behörigheten Kontakter för att kunna använda snabbuppringning." "Du måste aktivera behörigheten Telefon för att kunna visa samtalsloggen." - "Du måste aktivera behörigheten Kontakter för att kunna visa kontakterna." - "Du måste aktivera behörigheten Telefon för att kunna komma åt röstmeddelanden." "Aktivera behörigheter för Kontakter om du vill söka bland kontakterna." "Du måste aktivera behörigheten Telefon för att kunna ringa." "Telefonappen har inte skrivbehörighet i systeminställningarna." @@ -230,4 +168,10 @@ "Spam" "%1$s är offline och går inte att nå" "Om" + "Transkriberat av Google" + "Google transkriberar …" + "Transkription inte tillgänglig" + "Visa" + "Samtalet har raderats. Visa och radera bilagor som delats under samtalet i Messages." + "Samtalen har raderats. Visa och radera bilagor som delats under samtal i Messages." diff --git a/java/com/android/dialer/app/res/values-sw/strings.xml b/java/com/android/dialer/app/res/values-sw/strings.xml index d3b8392d4..2eca65e21 100644 --- a/java/com/android/dialer/app/res/values-sw/strings.xml +++ b/java/com/android/dialer/app/res/values-sw/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Simu" "Vitufe vya Simu" - "Simu" "Rekodi ya simu zilizopigwa" - "Ripoti nambari isiyo sahihi" "Nakili nambari" "Nakili unukuzi" - "Zuia nambari" - "Ondolea nambari kizuizi" "Badilisha nambari kabla ya kupiga simu" "Futa rekodi ya simu zilizopigwa" "Futa ujumbe wa sauti" @@ -34,7 +30,6 @@ "Rekodi ya simu zilizopigwa ifutwe?" "Hatua hii itafuta rekodi yote ya simu" "Inafuta rekodi ya simu zilizopigwa..." - "Simu" "Simu uliyokosa" "Simu ya kazini ambayo hukujibu" "Simu zisizojibiwa" @@ -48,107 +43,66 @@ Ujumbe %1$d wa sauti Ujumbe wa sauti - "Cheza" "%1$s, %2$s" "Barua mpya ya sauti kutoka %1$s" "Haikuweza kucheza ujumbe wa sauti" "Inapakia ujumbe wa sauti..." - "Ujumbe unawekwa kwenye kumbukumbu…" "Haikuweza kupakia ujumbe wa sauti" - "Simu zilizo na ujumbe wa sauti tu" - "Simu zinazoingia tu" - "Simu zinazotoka tu" - "Simu zisizojibiwa tu" "( %1$d ) %2$s" - "tafuta" - "piga simu" - "nambari ya kupiga" - "Cheza au usimamishe uchezaji wa ujumbe wa sauti" "Washa au uzime spika ya simu" "Tafuta sehemu ya kucheza ujumbe wa sauti" - "Punguza kasi ya kucheza ujumbe wa sauti" - "Ongeza kasi ya kucheza ujumbe wa sauti" "Rekodi ya simu zilizopigwa" "Chaguo zaidi" "vitufe vya simu" - "Onyesha zinazotoka pekee" - "Onyesha zinazoingia pekee" - "Onyesha zilizokosa kupokewa pekee" - "Onyesha barua za sauti pekee" - "Onyesha simu zote" - "Ongeza usitishaji wa sekunde 2" - "Ongeza kusubiri" "Mipangilio" "Kielelezo" - "Anwani zote" - "Tumia kibao cha kuchapa cha sauti na kugusa" - "Rudi kwa simu inayoendelea" - "Ongeza simu" - "Simu zinazoingia" - "Sikiliza ujumbe wa sauti" - "Angalia anwani %1$s" - "Pigia %1$s" + "Unda Mkato Mpya wa Kiolesura" + "Unaingia katika hali ya kutekeleza vitendo vingi" + "Umeondoka katika hali ya kutekeleza vitendo vingi" + "Umeteua %1$s" + "Umebatilisha uteuzi wa %1$s" "Maelezo ya %1$s" "Maelezo ya mawasiliano ya anayeshukiwa kupiga simu taka %1$s" "Simu %1$s." "Hangout ya video." - "Tuma SMS kwa %1$s" - "Barua sauti ambayo haijasikizwa" "Anza kutafuta kwa kutamka" - "Piga simu %s" "Ujumbe wa sauti" - "Sekunde %s" - "Dak %s sek %s" - "ujumbe wa sauti" - "ujumbe wa sauti" - "Ndiyo" - "Hapana" - "Je, ungependa kufuta %1$s uliochagua?" + "Ghairi hali ya kutekeleza vitendo vingi" + "Futa" + "Ghairi" + "%1$s zimechaguliwa" + + ""Je, unataka kufuta kila ujumbe wa sauti ulioonyeshwa? "" + ""Je, unataka kufuta ujumbe huu wa sauti? "" + @string/call_log_header_today "%1$s saa %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Haiwezi kupiga simu kwa nambari hii" - "Ili kuweka mipangilio ya ujumbe wa sauti, nenda kwenye Menyu > Mipangilio." - "Ili usikilize ujumbe wa sauti, kwanza zima Hali ya Ndegeni." - "Inapakia…" - "IMEI" - "MEID" - "Inapakia kutoka SIM kadi..." - "Anwani za SIM kadi" - "Hakuna programu za mawasiliano zinazopatikana" "Kutafuta kwa kutamka hakupatikani" - "Haiwezi kupiga simu kwa sababu programu ya Simu imezimwa." "Tafuta anwani" "Ongeza nambari au utafute anwani" "Rekodi yako ya simu zilizopigwa haina chochote" "Piga simu" "Huna simu ulizokosa kupokea" "Kikasha chako cha ujumbe wa sauti hakina ujumbe." - "Onyesha zinazopendwa tu" "Historia ya Simu" "Zote" "Ambazo hazikupokewa" - "Ujumbe wa sauti" "Unaowasiliana nao zaidi" "Rekodi ya Simu Zilizopigwa" "Anwani zote" "Ujumbe wa sauti" - "Imeondolowa kwenye vipendwa" - "Tendua" "Piga simu %s" "Ongeza anwani mpya" "Ongeza kwenye anwani" "Tuma SMS" "Piga Hangout ya video" "Zuia nambari" - "Simu %s za karibuni ambazo hazikujibiwa" "Hakuna mtu aliye katika orodha yako ya watu unaowasiliana nao zaidi" "Ongeza anwani unazopenda zaidi" - "Bado huna anwani zozote" - "Ongeza anwani" - "Gusa picha ili uone nambari zote ama uguse na kushikilia ili upange upya" "Ondoa" + "Chagua zote" "Hangout ya Video" "Tuma SMS" "Maelezo ya simu" @@ -164,25 +118,14 @@ "Piga simu kwa ^1" "Hangout ya video ^1." "Sikiliza ujumbe wa sauti kutoka kwa ^1" - "Cheza ujumbe wa sauti kutoka kwa ^1" - "Sitisha ujumbe wa sauti kutoka kwa ^1" - "Futa ujumbe wa sauti kutoka kwa ^1" - - Ujumbe %d mpya wa sauti - Ujumbe %d mpya wa sauti - "Unda anwani ya ^1" "Ongeza ^1 kwenye anwani iliyopo" "Maelezo ya simu ya ^1" - "Ilifutwa kutoka rekodi ya simu zilizopigwa" "Leo" "Jana" "Nzee zaidi" - "Orodha ya simu" "Washa spika." "Zima spika." - "Cheza kwa kasi zaidi." - "Cheza polepole." "Anzisha au usitishe kucheza." "Chaguo za kuonyesha" "Sauti na mtetemo" @@ -199,7 +142,6 @@ "Simu zilizopigwa" "Kuzuia simu" "Ujumbe wa sauti" - "Chagua SIM ya mipangilio ya ujumbe wa sauti" "Kuzuia simu kumezimwa kwa muda" "Kipengele cha kuzuia simu kimezimwa kwa sababu uliwasiliana na huduma za dharura kwenye simu hii ndani ya saa 48 zilizopita. Kipengele hiki kitawashwa kiotomatiki baada ya kipindi cha saa 48 kumalizika." "Leta nambari" @@ -213,12 +155,8 @@ "Nambari zilizozuiwa" "%1$s tayari imezuiwa." "Akaunti za simu" - "Washa" - "Weka ruhusa" "Ili kuwasha kipengele cha unaowasiliana nao zaidi, washa ruhusa ya Anwani." "Ili uone rekodi yako ya nambari za simu, washa ruhusa ya Simu." - "Ili uone anwani zako, washa ruhusa ya Anwani." - "Ili ufikie ujumbe wako wa sauti, washa ruhusa ya Simu." "Ili utafute anwani zako, washa ruhusa za Anwani." "Ili upige simu, washa ruhusa ya Simu." "Programu ya simu haina ruhusa ya kuandika kwenye mipangilio ya mfumo." @@ -230,4 +168,10 @@ "Taka" "%1$s hayuko mtandaoni na hapatikani" "Kuhusu" + "Unukuzi umefanywa na Google" + "Google inanukuu …" + "Nukuu haipatikani" + "Angalia" + "Mazungumzo ya simu yamefutwa. Angalia na ufute viambatisho vilivyoshirikiwa kwenye mazungumzo haya ya simu katika Programu ya Messages." + "Mazungumzo ya simu yamefutwa. Angalia na ufute viambatisho vilivyoshirikiwa kwenye mazungumzo ya simu katika Programu ya Messages." diff --git a/java/com/android/dialer/app/res/values-ta/strings.xml b/java/com/android/dialer/app/res/values-ta/strings.xml index afb852b6d..6c2e64e19 100644 --- a/java/com/android/dialer/app/res/values-ta/strings.xml +++ b/java/com/android/dialer/app/res/values-ta/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ஃபோன்" "ஃபோன் விசைத்தளம்" - "ஃபோன்" "அழைப்பு பதிவு" - "தவறான எண் எனப் புகாரளி" "எண்ணை நகலெடு" "டிரான்ஸ்கிரிப்ஷனை நகலெடு" - "எண்ணைத் தடு" - "எண்ணை அனுமதி" "அழைக்கும் முன் எண்ணை மாற்று" "அழைப்பு வரலாற்றை அழி" "குரலஞ்சலை நீக்கு" @@ -34,7 +30,6 @@ "அழைப்பு பதிவை அழிக்கவா?" "பதிவிலிருந்து எல்லா அழைப்புகளும் நீக்கப்படும்" "அழைப்பு வரலாற்றை அழிக்கிறது…" - "ஃபோன்" "தவறிய அழைப்பு" "தவறிய அழைப்பு (பணி)" "தவறிய அழைப்புகள்" @@ -48,107 +43,66 @@ %1$d குரலஞ்சல்கள் குரலஞ்சல் - "இயக்கு" "%1$s, %2$s" "%1$s இன் புதிய குரலஞ்சல்" "குரலஞ்சலை இயக்க முடியவில்லை" "குரலஞ்சலை ஏற்றுகிறது…" - "குரலஞ்சலைக் காப்பகப்படுத்துகிறது…" "குரலஞ்சலை ஏற்ற முடியவில்லை" - "குரலஞ்சலுடனான அழைப்புகள் மட்டும்" - "உள்வரும் அழைப்புகள் மட்டும்" - "வெளிச்செல்லும் அழைப்புகள் மட்டும்" - "தவறிய அழைப்புகள் மட்டும்" "(%1$d) %2$s" - "தேடு" - "டயல்" - "டயல் செய்வதற்கான எண்" - "பிளேபேக்கை இயக்கு அல்லது நிறுத்து" "ஸ்பீக்கர்போனை இயக்கு அல்லது முடக்கு" "பிளேபேக் நிலையைத் தேடு" - "பிளேபேக் விகிதத்தைக் குறை" - "பிளேபேக் விகிதத்தை அதிகரி" "அழைப்பு வரலாறு" "மேலும் விருப்பங்கள்" "விசைத்தளம்" - "வெளிச்செல்லுவதை மட்டும் காட்டு" - "உள்வருவதை மட்டும் காட்டு" - "தவறியதை மட்டும் காட்டு" - "குரலஞ்சல்களை மட்டும் காட்டு" - "எல்லா அழைப்புகளையும் காட்டு" - "2-வினாடி இடைநிறுத்தத்தைச் சேர்" - "காத்திருப்பைச் சேர்" "அமைப்பு" "சிமுலேட்டர்" - "எல்லா தொடர்புகளும்" - "டச் டோன் விசைப்பலகையைப் பயன்படுத்தவும்" - "செயலிலுள்ள அழைப்பிற்குத் திரும்பு" - "அழைப்பைச் சேர்" - "உள்வரும் அழைப்புகள்" - "குரலஞ்சலை இயக்கு" - "%1$s தொடர்பைக் காட்டு" - "%1$s ஐ அழை" + "புதிய UI குறுக்குவழியை உருவாக்கு" + "மொத்தச் செயல் பயன்முறையில் நுழைகிறீர்கள்" + "மொத்தச் செயல் பயன்முறையிலிருந்து வெளியேறிவிட்டீர்கள்" + "தேர்ந்தெடுத்த %1$s" + "தேர்வுநீக்கிய %1$s" "%1$s க்கான தொடர்பு விவரங்கள்" "சந்தேகத்திற்குரிய ஸ்பேம் அழைப்பாளர் %1$sக்கான தொடர்பு விவரங்கள்" "%1$s அழைப்புகள்." "வீடியோ அழைப்பு." - "%1$sக்கு SMS அனுப்பு" - "கேட்கப்படாத குரலஞ்சல்" "குரல் தேடலைத் தொடங்கு" - "%s ஐ அழை" "குரலஞ்சல்" - "%s வி" - "%s நிமிடம் %s வினாடி" - "குரலஞ்சல்" - "குரலஞ்சல்கள்" - "ஆம்" - "வேண்டாம்" - "தேர்ந்தெடுத்த %1$sஐ நீக்கவா?" + "தொகுப்புச் செயல்கள் பயன்முறையை ரத்துசெய்யும்" + "நீக்கு" + "ரத்துசெய்" + "%1$s தேர்ந்தெடுக்கப்பட்டன" + + ""இந்தக் குரலஞ்சல்களை நீக்கவா? "" + ""இந்தக் குரலஞ்சலை நீக்கவா? "" + @string/call_log_header_today "%1$s அன்று %2$s மணிக்கு" "%1$02d:%2$02d" "%1$s%2$s" - "இந்த எண்ணை அழைக்க முடியாது" - "குரலஞ்சலை அமைக்க, மெனு > அமைப்புகள் என்பதற்குச் செல்லவும்." - "குரலஞ்சலை அழைப்பதற்கு, முதலில் விமானப் பயன்முறையை முடக்கவும்." - "ஏற்றுகிறது..." - "IMEI" - "MEID" - "சிம் கார்டிலிருந்து ஏற்றுகிறது…" - "சிம் கார்டின் தொடர்புகள்" - "தொடர்புகள் பயன்பாடு எதுவுமில்லை" "குரல் தேடல் இல்லை" - "Phone பயன்பாடு முடக்கப்பட்டுள்ளதால், ஃபோன் அழைப்பைச் செய்ய முடியாது." "தொடர்புகளைத் தேடு" "எண்ணைச் சேர்க்கவும் அல்லது தொடர்புகளில் தேடவும்" "அழைப்பு வரலாறு காலியாக உள்ளது" "அழை" "தவறிய அழைப்புகள் இல்லை." "குரலஞ்சல் இன்பாக்ஸ் காலியாக உள்ளது." - "பிடித்தவற்றை மட்டும் காட்டு" "அழைப்பு பட்டியல்" "எல்லாம்" "தவறியவை" - "குரலஞ்சல்" "விரைவு டயல்" "அழைப்பு வரலாறு" "தொடர்புகள்" "குரலஞ்சல்" - "பிடித்தவற்றிலிருந்து அகற்றப்பட்டது" - "செயல்தவிர்" "%s ஐ அழை" "புதிய தொடர்பை உருவாக்கு" "தொடர்பில் சேர்" "SMS அனுப்பு" "வீடியோவில் அழை" "எண்ணைத் தடு" - "%s புதிய தவறிய அழைப்புகள்" "இன்னும் விரைவு டயலில் யாரையும் சேர்க்கவில்லை" "முக்கியமானவர்களைச் சேர்" - "இதுவரை எந்தத் தொடர்புகளும் இல்லை" - "ஒரு தொடர்பைச் சேர்க்கவும்" - "எல்லா எண்களையும் பார்க்க, படத்தைத் தொடவும் அல்லது மறுவரிசைப்படுத்த, தொட்டுப் பிடித்திருக்கவும்" "அகற்று" + "அனைத்தையும் தேர்ந்தெடு" "வீடியோ அழைப்பு" "செய்தி அனுப்பவும்" "அழைப்பு விவரங்கள்" @@ -164,25 +118,14 @@ "^1ஐ அழை" "^1ஐ வீடியோவில் அழைக்கும்." "^1 இன் குரலஞ்சலைக் கேள்" - "^1 இன் குரலஞ்சலை இயக்கும்" - "^1 இன் குரலஞ்சலை இடைநிறுத்தும்" - "^1 இன் குரலஞ்சலை நீக்கும்" - - %d புதிய குரலஞ்சல்கள் - %d புதிய குரலஞ்சல் - "^1க்கான தொடர்பை உருவாக்கும்" "இருக்கும் தொடர்பில் ^1ஐச் சேர்க்கும்" "^1 இன் அழைப்பு விவரங்கள்" - "அழைப்பு வரலாற்றிலிருந்து நீக்கப்பட்டது" "இன்று" "நேற்று" "பழையது" - "அழைப்புகள் பட்டியல்" "ஸ்பீக்கரை இயக்கு." "ஸ்பீக்கரை முடக்கு." - "வேகமாக இயக்கு." - "மெதுவாக இயக்கு." "பிளேபேக்கைத் தொடங்கு அல்லது இடைநிறுத்து." "காட்சி விருப்பத்தேர்வு" "ஒலிகளும் அதிர்வும்" @@ -199,7 +142,6 @@ "அழைப்புகள்" "அழைப்புத் தடுப்பு" "குரலஞ்சல்" - "குரலஞ்சல் அமைப்பிற்கு, சிம் தேர்வுசெய்க" "அழைப்புத் தடுப்பு அம்சம் தற்காலிகமாக முடக்கப்பட்டுள்ளது" "கடந்த 48 மணிநேரத்தில், இந்த ஃபோனிலிருந்து அவசர அழைப்பு எண்ணைத் தொடர்புகொண்டதால் அழைப்புத் தடுப்பு அம்சம் முடக்கப்பட்டுள்ளது. 48 மணிநேரம் கழித்து, இந்த அம்சம் தானாகவே மீண்டும் இயக்கப்படும்." "எண்களை இறக்கு" @@ -213,12 +155,8 @@ "தடுக்கப்பட்ட எண்கள்" "%1$s ஏற்கனவே தடுக்கப்பட்டுள்ளது." "அழைப்பு கணக்குகள்" - "இயக்கு" - "அனுமதிகளை அமை" "விரைவு டயலை இயக்க, தொடர்புகள் அனுமதியை இயக்கவும்." "அழைப்புப் பதிவைப் பார்க்க, ஃபோன் அனுமதியை இயக்கவும்." - "தொடர்புகளைப் பார்க்க, தொடர்புகள் அனுமதியை இயக்கவும்." - "குரலஞ்சலை அணுக, ஃபோன் அனுமதியை இயக்கவும்." "தொடர்புகளைத் தேட, தொடர்புகள் அனுமதிகளை இயக்கவும்." "அழைக்க, ஃபோன் அனுமதியை இயக்கவும்." "முறைமை அமைப்புகளில் எழுதுவதற்கான அனுமதி ஃபோன் பயன்பாட்டுக்கு இல்லை." @@ -230,4 +168,10 @@ "ஸ்பேம்" "%1$s ஆஃப்லைனில் உள்ளதால், தொடர்புகொள்ள முடியாது" "அறிமுகம்" + "Google டிரான்ஸ்கிரைப் செய்தது" + "Google டிரான்ஸ்கிரைப் செய்கிறது …" + "டிரான்ஸ்கிரிப்ட் இல்லை" + "காட்டு" + "அழைப்பு நீக்கப்பட்டது. இந்த அழைப்பின் போது பகிர்ந்த இணைப்புகளை மெசேஜஸ் பயன்பாட்டில் பார்க்கலாம், நீக்கலாம்." + "அழைப்புகள் நீக்கப்பட்டன. அழைப்புகளின் போது பகிர்ந்த இணைப்புகளை மெசேஜஸ் பயன்பாட்டில் பார்க்கலாம், நீக்கலாம்." diff --git a/java/com/android/dialer/app/res/values-te/strings.xml b/java/com/android/dialer/app/res/values-te/strings.xml index ffc046f69..14041976b 100644 --- a/java/com/android/dialer/app/res/values-te/strings.xml +++ b/java/com/android/dialer/app/res/values-te/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ఫోన్" "ఫోన్ కీప్యాడ్" - "ఫోన్" "కాల్ చరిత్ర" - "సరికాని నంబర్‌ను నివేదించు" "నంబర్‌ను కాపీ చేయి" "లిప్యంతరీకరణను కాపీ చేయి" - "నంబర్‌ను బ్లాక్ చేయి" - "నంబర్‌ను అన్‌బ్లాక్ చేయి" "కాల్ చేయడానికి ముందు నంబర్‌ను సవరించు" "కాల్ చరిత్రను క్లియర్ చేయి" "వాయిస్ మెయిల్‌ను తొలగించు" @@ -34,7 +30,6 @@ "కాల్ చరిత్రను తీసివేయాలా?" "దీని వలన మీ చరిత్ర నుండి అన్ని కాల్‌లు తొలగించబడతాయి" "కాల్ చరిత్రను క్లియర్ చేస్తోంది…" - "ఫోన్" "సమాధానం ఇవ్వని కాల్" "మిస్డ్ కార్యాలయ కాల్" "మిస్డ్ కాల్‌లు" @@ -48,107 +43,66 @@ %1$d వాయిస్ మెయిల్‌లు వాయిస్ మెయిల్ - "ప్లే చేయి" "%1$s, %2$s" "%1$s నుండి కొత్త వాయిస్ మెయిల్" "వాయిస్ మెయిల్‌ను ప్లే చేయడం సాధ్యపడలేదు" "వాయిస్ మెయిల్‌ను లోడ్ చేస్తోంది…" - "వాయిస్ మెయిల్‌ను ఆర్కైవ్ చేస్తోంది…" "వాయిస్ మెయిల్‌ను లోడ్ చేయడం సాధ్యపడలేదు" - "వాయిస్ మెయిల్ కాల్‌లు మాత్రమే" - "ఇన్‌కమింగ్ కాల్‌లు మాత్రమే" - "అవుట్‌గోయింగ్ కాల్‌లు మాత్రమే" - "సమాధానం ఇవ్వని కాల్‌లు మాత్రమే" "(%1$d) %2$s" - "శోధించు" - "డయల్ చేయి" - "డయల్ చేయాల్సిన నంబర్" - "ప్లేబ్యాక్‌ని ప్లే చేయి లేదా ఆపివేయి" "స్పీకర్‌ఫోన్‌ను స్విచ్ ఆన్ లేదా స్విచ్ ఆఫ్ చేయి" "ప్లేబ్యాక్ స్థానాన్ని కావాల్సిన చోటుకి జరపండి" - "ప్లేబ్యాక్ రేటుని తగ్గించు" - "ప్లేబ్యాక్ రేటుని పెంచు" "కాల్ చరిత్ర" "మరిన్ని ఎంపికలు" "కీ ప్యాడ్" - "అవుట్‌గోయింగ్ మాత్రమే చూపు" - "ఇన్‌కమింగ్ మాత్రమే చూపు" - "సమాధానం ఇవ్వనివి మాత్రమే చూపు" - "వాయిస్ మెయిల్‌లు మాత్రమే చూపు" - "అన్ని కాల్‌లను చూపు" - "2-సెకన్ల పాజ్‌ను జోడించండి" - "నిరీక్షణ సమయాన్ని జోడించు" "సెట్టింగ్‌లు" "సిములేటర్" - "అన్ని పరిచయాలు" - "టచ్ టోన్ కీప్యాడ్‌ను ఉపయోగించండి" - "ప్రోగ్రెస్‌లో ఉన్న కాల్‌కు వెళ్లు" - "కాల్‌ను జోడించు" - "ఇన్‌కమింగ్ కాల్‌లు" - "వాయిస్ మెయిల్ ప్లే చేయండి" - "%1$s పరిచయాన్ని వీక్షించండి" - "%1$sకు కాల్ చేయి" + "కొత్త UI సత్వరమార్గం సృష్టించు" + "బల్క్ చర్య మోడ్‌లోకి ప్రవేశిస్తున్నారు" + "బల్క్ చర్య మోడ్ నుండి నిష్క్రమించారు" + "%1$s ఎంచుకోబడింది" + "%1$s ఎంపిక తీసివేయబడింది" "%1$s యొక్క సంప్రదింపు వివరాలు" "అనుమానాస్పద స్పామ్ కాలర్ %1$s సంప్రదింపు వివరాలు" "%1$s కాల్‌లు." "వీడియో కాల్." - "%1$sకి SMS పంపు" - "వినని వాయిస్ మెయిల్" "వాయిస్ శోధనను ప్రారంభించండి" - "%sకు కాల్ చేయి" "వాయిస్ మెయిల్" - "%s సెక" - "%s నిమి %s సెక" - "వాయిస్ మెయిల్" - "వాయిస్ మెయిల్‌లు" - "అవును" - "వద్దు" - "ఎంచుకున్న %1$sను తొలగించాలా?" + "సమూహ చర్యల మోడ్‌ను రద్దు చేస్తుంది" + "తొలగించు" + "రద్దు చేయి" + "%1$s ఎంచుకోబడ్డాయి" + + ""ఈ వాయిస్ మెయిల్‌లను తొలగించాలా? "" + ""ఈ వాయిస్ మెయిల్‌ను తొలగించాలా? "" + @string/call_log_header_today "%1$s %2$sకి" "%1$02d:%2$02d" "%1$s%2$s" - "ఈ నంబర్‌కు కాల్ చేయలేరు" - "వాయిస్ మెయిల్ సెటప్ చేయడానికి, మెను > సెట్టింగ్‌లకు వెళ్లండి." - "వాయిస్ మెయిల్‌కు కాల్ చేయడానికి, ముందుగా ఎయిర్‌ప్లైన్ మోడ్‌ను ఆఫ్ చేయండి." - "లోడ్ చేస్తోంది…" - "IMEI" - "MEID" - "సిమ్ కార్డు నుండి లోడ్ చేస్తోంది…" - "సిమ్ కార్డు పరిచయాలు" - "పరిచయాల అనువర్తనం ఏదీ అందుబాటులో లేదు" "వాయిస్ శోధన అందుబాటులో లేదు" - "ఫోన్ అనువర్తనం నిలిపివేయబడినందున ఫోన్ కాల్ చేయలేరు." "పరిచయాలను శోధించు" "నంబర్ జోడించండి లేదా పరిచయాల్లో శోధించండి" "మీ కాల్ చరిత్ర ఖాళీగా ఉంది" "కాల్ చేయి" "మీరు సమాధానమివ్వని కాల్‌లు ఏవీ కలిగి లేరు." "మీ వాయిస్‌మెయిల్ ఇన్‌బాక్స్ ఖాళీగా ఉంది." - "ఇష్టమైనవాటిని మాత్రమే చూపు" "కాల్ చరిత్ర" "అన్నీ" "సమాధానం ఇవ్వనవి" - "వాయిస్ మెయిల్" "స్పీడ్ డయల్" "కాల్ చరిత్ర" "పరిచయాలు" "వాయిస్ మెయిల్" - "ఇష్టమైనవాటి నుండి తీసివేయబడింది" - "చర్య రద్దు చేయి" "%sకు కాల్ చేయి" "కొత్త పరిచయాన్ని సృష్టించు" "పరిచయానికి జోడించు" "SMS పంపు" "వీడియో కాల్ చేయండి" "నంబర్‌ను బ్లాక్ చేయి" - "%s కొత్త సమాధానం ఇవ్వని కాల్‌లు" "మీ స్పీడ్ డయల్‌లో ఇంకా ఎవరూ లేరు" "ఇష్టమైన వారిని జోడించండి" - "మీకు ఇప్పటికీ పరిచయాలేవీ లేవు" - "పరిచయాన్ని జోడించండి" - "అన్ని నంబర్‌లను చూడటానికి చిత్రాన్ని తాకండి లేదా క్రమం మార్చడానికి తాకి, కాసేపు అలాగే ఉంచండి" "తీసివేయి" + "అన్నీ ఎంచుకోండి" "వీడియో కాల్" "సందేశాన్ని పంపు" "కాల్ వివరాలు" @@ -164,25 +118,14 @@ "^1కి కాల్ చేయి" "^1కి వీడియో కాల్." "^1 నుండి వచ్చిన వాయిస్ మెయిల్‌ను వినండి" - "^1 నుండి వచ్చిన వాయిస్ మెయిల్‌ను ప్లే చేయండి" - "^1 నుండి వచ్చిన వాయిస్ మెయిల్‌ను పాజ్ చేయండి" - "^1 నుండి వచ్చిన వాయిస్ మెయిల్‌ను తొలగించండి" - - %d కొత్త వాయిస్‌మెయిల్‌లు - %d కొత్త వాయిస్‌మెయిల్ - "^1 కోసం పరిచయాన్ని సృష్టించండి" "^1ని ఇప్పటికే ఉన్న పరిచయానికి జోడించండి" "^1 యొక్క కాల్ వివరాలు" - "కాల్ చరిత్ర నుండి తొలగించబడింది" "ఈ రోజు" "నిన్న" "పాతది" - "కాల్‌ల జాబితా" "స్పీకర్‌ను ఆన్ చేయి." "స్పీకర్‌ను ఆఫ్ చేయి." - "వేగంగా ప్లే చేయి." - "నెమ్మదిగా ప్లే చేయి." "ప్లేబ్యాక్‌ను ప్రారంభించు లేదా పాజ్ చేయి." "ప్రదర్శన ఎంపికలు" "ధ్వనులు మరియు వైబ్రేషన్" @@ -199,7 +142,6 @@ "కాల్‌లు" "కాల్ బ్లాక్ చేయడం" "వాయిస్ మెయిల్" - "వాయిస్ మెయిల్ సెట్టింగ్‌ల కోసం SIM ఎంచుకోండి" "కాల్ బ్లాకింగ్ తాత్కాలికంగా ఆఫ్ అయ్యింది" "మీరు గత 48 గంటల వ్యవధిలో ఈ ఫోన్ నుండి అత్యవసర సేవలను సంప్రదించినందున కాల్ బ్లాకింగ్ నిలిపివేయబడింది. 48 గంటల వ్యవధి ముగిసిన తర్వాత ఇది స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది." "నంబర్‌లను దిగుమతి చేయి" @@ -213,12 +155,8 @@ "బ్లాక్ చేయబడిన నంబర్‌లు" "%1$s ఇప్పటికే బ్లాక్ చేయబడింది." "కాల్ చేసే ఖాతాలు" - "ఆన్ చేయి" - "అనుమతులను సెట్ చేయి" "స్పీడ్ డయల్‌ను ప్రారంభించడానికి, పరిచయాల అనుమతిని ఆన్ చేయండి." "మీ కాల్ లాగ్‌ను చూడటానికి, ఫోన్ అనుమతిని ఆన్ చేయండి." - "మీ పరిచయాలను చూడటానికి, పరిచయాల అనుమతిని ఆన్ చేయండి." - "మీ వాయిస్ మెయిల్‌ను ప్రాప్యత చేయడానికి, ఫోన్ అనుమతిని ఆన్ చేయండి." "మీ పరిచయాలను శోధించడానికి, పరిచయాల అనుమతులను ఆన్ చేయండి." "కాల్ చేయడానికి, ఫోన్ అనుమతిని ఆన్ చేయండి." "సిస్టమ్ సెట్టింగ్‌లకు వ్రాయడం కోసం ఫోన్ అనువర్తనానికి అనుమతి లేదు." @@ -230,4 +168,10 @@ "స్పామ్" "%1$s ఆఫ్‌లైన్‌లో ఉన్నందున వారిని చేరుకోవడం సాధ్యపడదు" "పరిచయం" + "Google లిప్యంతరీకరించింది" + "Google లిప్యంతరీకరిస్తోంది …" + "లిప్యంతరీకరణ అందుబాటులో లేదు" + "వీక్షించండి" + "కాల్ తొలగించబడింది. ఈ కాల్‌లో భాగస్వామ్యం చేయబడిన జోడింపులను సందేశాల అనువర్తనంలో వీక్షించండి మరియు తొలగించండి." + "కాల్ తొలగించబడింది. కాల్‌ల్లో భాగస్వామ్యం చేయబడిన జోడింపులను సందేశాల అనువర్తనంలో వీక్షించండి మరియు తొలగించండి." diff --git a/java/com/android/dialer/app/res/values-th/strings.xml b/java/com/android/dialer/app/res/values-th/strings.xml index 13916a51d..22c752c7a 100644 --- a/java/com/android/dialer/app/res/values-th/strings.xml +++ b/java/com/android/dialer/app/res/values-th/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "โทรศัพท์" "ปุ่มกดโทรศัพท์" - "โทรศัพท์" "ประวัติการโทร" - "รายงานหมายเลขที่ไม่ถูกต้อง" "คัดลอกหมายเลข" "คัดลอกการถอดเสียงเป็นคำ" - "บล็อกหมายเลข" - "เลิกบล็อกหมายเลข" "แก้ไขหมายเลขก่อนโทร" "ล้างประวัติการโทร" "ลบข้อความเสียง" @@ -34,7 +30,6 @@ "ล้างประวัติการโทรไหม" "การดำเนินการนี้จะลบการโทรทั้งหมดออกจากประวัติของคุณ" "กำลังล้างประวัติการโทร…" - "โทรศัพท์" "สายที่ไม่ได้รับ" "มีสายจากที่ทำงานที่ไม่ได้รับ" "สายที่ไม่ได้รับ" @@ -48,107 +43,66 @@ %1$d ข้อความเสียง ข้อความเสียง - "เล่น" "%1$s, %2$s" "ข้อความเสียงใหม่จาก %1$s" "ไม่สามารถเล่นข้อความเสียงได้" "กำลังโหลดข้อความเสียง…" - "กำลังเก็บข้อความเสียง…" "ไม่สามารถโหลดข้อความเสียงได้" - "เฉพาะสายที่มีข้อความเสียง" - "เฉพาะสายเรียกเข้า" - "เฉพาะสายโทรออก" - "เฉพาะสายที่ไม่ได้รับ" "(%1$d) %2$s" - "ค้นหา" - "หมุนหมายเลข" - "หมายเลขที่จะโทร" - "เล่นหรือหยุดเล่น" "เปิดหรือปิดลำโพง" "ค้นหาตำแหน่งการเล่น" - "ลดอัตราการเล่น" - "เพิ่มอัตราการเล่น" "ประวัติการโทร" "ตัวเลือกเพิ่มเติม" "ปุ่มกด" - "แสดงสายที่โทรออกเท่านั้น" - "แสดงสายโทรเข้าเท่านั้น" - "แสดงสายที่ไม่ได้รับเท่านั้น" - "แสดงเฉพาะข้อความเสียง" - "แสดงการโทรทั้งหมด" - "เพิ่มช่วงคั่น 2 วินาที" - "เพิ่มการรอ" "การตั้งค่า" "เครื่องมือจำลอง" - "รายชื่อติดต่อทั้งหมด" - "ใช้ปุ่มกดสัญญาณเสียง" - "กลับไปคุยสายต่อ" - "เพิ่มการโทร" - "สายโทรเข้า" - "เล่นข้อความเสียง" - "ดูรายชื่อติดต่อ %1$s" - "โทรหา %1$s" + "สร้างทางลัด UI ใหม่" + "กำลังเข้าสู่โหมดการดำเนินการแบบกลุ่ม" + "ออกจากโหมดการทำงานแบบกลุ่มแล้ว" + "เลือก %1$s แล้ว" + "ยกเลิกการเลือก %1$s แล้ว" "รายละเอียดรายชื่อติดต่อสำหรับ %1$s" "รายละเอียดการติดต่อของผู้โทรที่สงสัยว่าจะเป็นสแปม %1$s" "%1$s สาย" "แฮงเอาท์วิดีโอ" - "ส่ง SMS ไปยัง %1$s" - "ข้อความเสียงที่ยังไม่ได้ฟัง" "เริ่มต้นการค้นหาด้วยเสียง" - "โทร %s" "ข้อความเสียง" - "%s วินาที" - "%s นาที %s วินาที" - "ข้อความเสียง" - "ข้อความเสียง" - "ใช่" - "ไม่" - "ลบ%1$sที่เลือกหรือไม่" + "ยกเลิกโหมดการทำงานแบบกลุ่ม" + "ลบ" + "ยกเลิก" + "เลือกไว้ %1$s รายการ" + + ""ลบข้อความเสียงเหล่านี้ไหม "" + ""ลบข้อความเสียงนี้ไหม "" + @string/call_log_header_today "วันที่ %1$s เวลา %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "ไม่สามารถโทรไปยังหมายเลขนี้" - "เมื่อต้องการตั้งค่าข้อความเสียง ให้ไปที่เมนู > การตั้งค่า" - "หากต้องการฟังข้อความเสียง ให้ปิดโหมดใช้งานบนเครื่องบินก่อน" - "กำลังโหลด..." - "IMEI" - "MEID" - "กำลังโหลดจากซิมการ์ด…" - "รายชื่อบนซิมการ์ด" - "ไม่มีแอปรายชื่อติดต่อที่พร้อมใช้งาน" "การค้นหาด้วยเสียงไม่พร้อมใช้งาน" - "ไม่สามารถโทรศัพท์ได้เนื่องจากแอปพลิเคชันโทรศัพท์ถูกปิดใช้งาน" "ค้นหารายชื่อติดต่อ" "เพิ่มหมายเลขหรือค้นหาผู้ติดต่อ" "ประวัติการโทรว่างเปล่า" "โทรออก" "คุณไม่มีสายที่ไม่ได้รับ" "กล่องข้อความเสียงว่างเปล่า" - "แสดงเฉพาะรายชื่อที่ชื่นชอบ" "ประวัติการโทร" "ทั้งหมด" "ไม่ได้รับ" - "ข้อความเสียง" "การโทรด่วน" "ประวัติการโทร" "รายชื่อติดต่อ" "ข้อความเสียง" - "ลบจากรายการโปรด" - "เลิกทำ" "โทร %s" "สร้างรายชื่อติดต่อใหม่" "เพิ่มในรายชื่อติดต่อ" "ส่ง SMS" "ใช้แฮงเอาท์วิดีโอ" "บล็อกหมายเลข" - "สายที่ไม่ได้รับใหม่ %s สาย" "ยังไม่ได้กำหนดผู้ใดในการโทรด่วน" "เพิ่มรายการโปรด" - "คุณยังไม่มีรายชื่อติดต่อ" - "เพิ่มรายชื่อติดต่อ" - "แตะรูปภาพเพื่อดูหมายเลขทั้งหมด หรือแตะค้างไว้เพื่อจัดเรียงใหม่" "ลบ" + "เลือกทั้งหมด" "แฮงเอาท์วิดีโอ" "ส่งข้อความ" "รายละเอียดการโทร" @@ -164,25 +118,14 @@ "โทรไปที่ ^1" "เรียกแฮงเอาท์วิดีโอไปยัง ^1" "ฟังข้อความเสียงจาก ^1" - "เล่นข้อความเสียงจาก ^1" - "หยุดข้อความเสียงจาก ^1 ชั่วคราว" - "ลบข้อความเสียงจาก ^1" - - %d ข้อความเสียงใหม่ - %d ข้อความเสียงใหม่ - "สร้างรายชื่อติดต่อสำหรับ ^1" "เพิ่ม ^1 ไปยังรายชื่อติดต่อที่มีอยู่" "รายละเอียดการโทรสำหรับ ^1" - "ลบออกจากประวัติการโทรแล้ว" "วันนี้" "เมื่อวานนี้" "เก่ากว่า" - "รายการโทร" "เปิดลำโพง" "ปิดลำโพง" - "เล่นเร็วขึ้น" - "เล่นช้าลง" "เริ่มหรือหยุดเล่นชั่วคราว" "ตัวเลือกการแสดง" "เสียงและการสั่น" @@ -199,9 +142,8 @@ "การโทร" "การบล็อกสายเรียกเข้า" "ข้อความเสียง" - "เลือกซิมสำหรับการตั้งค่าข้อความเสียง" "การบล็อกสายเรียกเข้าปิดชั่วคราว" - "ระบบปิดใช้การบล็อกสายเรียกเข้าเนื่องจากคุณติดต่อบริการฉุกเฉินจากโทรศัพท์เครื่องนี้ภายใน 48 ชั่วโมงที่ผ่านมา ระบบจะเปิดใช้คุณลักษณะนี้อีกครั้งโดยอัตโนมัติเมื่อครบ 48 ชั่วโมง" + "ระบบปิดใช้การบล็อกสายเรียกเข้าเนื่องจากคุณติดต่อบริการฉุกเฉินจากโทรศัพท์เครื่องนี้ภายใน 48 ชั่วโมงที่ผ่านมา ระบบจะเปิดใช้ฟีเจอร์นี้อีกครั้งโดยอัตโนมัติเมื่อครบ 48 ชั่วโมง" "นำเข้าหมายเลข" "ก่อนหน้านี้คุณได้ทำเครื่องหมายว่าให้ส่งผู้โทรบางคนไปยังข้อความเสียงโดยอัตโนมัติผ่านแอปอื่นๆ" "ดูหมายเลข" @@ -213,12 +155,8 @@ "หมายเลขที่ถูกบล็อก" "%1$s ถูกบล็อกอยู่แล้ว" "บัญชีการโทร" - "เปิด" - "ตั้งค่าสิทธิ์" "หากต้องการเปิดใช้การโทรด่วน ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ" "หากต้องการดูประวัติการโทร ให้เปิดสิทธิ์เข้าถึงโทรศัพท์" - "หากต้องการดูรายชื่อติดต่อ ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ" - "หากต้องการเข้าถึงข้อความเสียง ให้เปิดสิทธิ์เข้าถึงโทรศัพท์" "หากต้องการค้นหารายชื่อติดต่อ ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ" "หากต้องการโทรออก ให้เปิดสิทธิ์เข้าถึงโทรศัพท์" "แอปโทรศัพท์ไม่ได้รับอนุญาตให้เขียนไปยังการตั้งค่าระบบ" @@ -230,4 +168,10 @@ "สแปม" "%1$s ออฟไลน์อยู่และไม่สามารถติดต่อได้" "เกี่ยวกับ" + "ถอดเสียงโดย Google" + "Google กำลังถอดเสียง..." + "การถอดเสียงไม่พร้อมใช้งาน" + "ดู" + "ลบการโทรแล้ว ดูและลบไฟล์แนบที่แชร์ระหว่างการโทรนี้ใน Messages" + "ลบการโทรแล้ว ดูและลบไฟล์แนบที่แชร์ระหว่างการโทรใน Messages" diff --git a/java/com/android/dialer/app/res/values-tl/strings.xml b/java/com/android/dialer/app/res/values-tl/strings.xml index cc44cb5f2..02fdeaa04 100644 --- a/java/com/android/dialer/app/res/values-tl/strings.xml +++ b/java/com/android/dialer/app/res/values-tl/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telepono" "Keypad ng Telepono" - "Telepono" "History ng tawag" - "Iulat ang hindi wastong numero" "Kopyahin ang numero" "Kopyahin ang transkripsyon" - "I-block ang numero" - "Alisin sa pagkaka-block ang numero" "I-edit ang numero bago tumawag" "I-clear ang history ng tawag" "I-delete ang voicemail" @@ -34,7 +30,6 @@ "I-clear ang history ng tawag?" "Idi-delete nito ang lahat ng tawag mula sa iyong history" "Kini-clear ang history ng tawag…" - "Telepono" "Hindi nasagot na tawag" "Hindi nasagot na tawag sa trabaho" "Mga hindi nasagot na tawag" @@ -48,107 +43,66 @@ %1$d Voicemail %1$d na Voicemail - "I-play" "%1$s, %2$s" "Bagong voicemail mula kay %1$s" "Hindi ma-play ang voicemail" "Nilo-load ang voicemail…" - "Ina-archive ang voicemail…" "Hindi ma-load ang voicemail" - "Mga tawag lang na may voicemail" - "Mga papasok na tawag lang" - "Mga papalabas na tawag lang" - "Mga hindi nasagot na tawag lang" "(%1$d) %2$s" - "maghanap" - "Mag-dial" - "numerong ida-dial" - "I-play o ihinto ang playback" "I-on o i-off ang speakerphone" "Hanapin ang posisyon ng playback" - "Bagalan ang playback" - "Bilisan ang playback" "History ng tawag" "Higit pang mga pagpipilian" "keypad" - "Ipakita lang ang papalabas" - "Ipakita lang ang paparating" - "Ipakita lang ang hindi nasagot" - "Ipakita lamang ang mga voicemail" - "Ipakita ang lahat ng tawag" - "Magdagdag ng pag-pause na 2-seg" - "Magdagdag ng paghihintay" "Mga Setting" "Simulator" - "Lahat ng mga contact" - "Gumamit ng touch tone na keypad" - "Bumalik sa kasalukuyang tawag" - "Mag-add: tawag" - "Mga paparating na tawag" - "I-play ang voicemail" - "Tingnan ang contact na si %1$s" - "Tawagan si %1$s" + "Gawa ng Shortcut ng Bagong UI" + "Pumapasok sa bulk action mode" + "Umalis sa bulk action mode" + "Napili %1$s" + "Inalis sa pagkakapili %1$s" "Mga detalye sa pakikipag-ugnayan para kay/sa %1$s" "Mga detalye sa pakikipag-ugnayan para sa pinaghihinalaang spam na tumatawag%1$s" "%1$s (na) tawag." "Video call." - "Magpadala ng SMS kay %1$s" - "Hindi pa naririnig na voicemail" "Simulan ang paghahanap gamit ang boses" - "Tumawag sa %s" "Voicemail" - "%s sec" - "%s min %s sec" - "voicemail" - "mga voicemail" - "Oo" - "Hindi" - "I-delete ang napiling %1$s?" + "Kanselahin ang batch actions mode" + "I-delete" + "Kanselahin" + "%1$s ang napili" + + ""I-delete ang mga voicemail na ito? "" + ""I-delete ang mga voicemail na ito? "" + @string/call_log_header_today "%1$s ng %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Hindi matawagan ang numerong ito" - "Upang mag-set up ng voicemail, pumunta sa Menu > Mga Setting." - "Upang tumawag sa voicemail, i-off muna ang Airplane mode." - "Naglo-load…" - "IMEI" - "MEID" - "Naglo-load mula sa SIM card…" - "Mga contact sa SIM card" - "Walang available na app ng mga contact" "Hindi available ang paghahanap gamit ang boses" - "Hindi makagawa ng tawag sa telepono dahil naka-disable ang application na Telepono." "Maghanap ng mga contact" "Magdagdag ng numero, maghanap sa contact" "Walang laman ang iyong history ng tawag" "Tumawag" "Wala kang mga hindi nasagot na tawag." "Walang laman ang iyong voicemail inbox." - "Mga paborito lang ang ipakita" "History ng Tawag" "Lahat" "Di nasagot" - "Voicemail" "Speed dial" "History ng Tawag" "Mga Contact" "Voicemail" - "Inalis sa mga paborito" - "I-undo" "Tumawag sa %s" "Gumawa ng bagong contact" "Idagdag sa isang contact" "Magpadala ng SMS" "Gumawa ng video call" "I-block ang numero" - "%s (na) bagong hindi nasagot na tawag" "Wala pang tao sa iyong speed dial" "Magdagdag ng paborito" - "Wala ka pang sinumang mga contact" - "Magdagdag ng contact" - "Pindutin ang larawan upang makita ang lahat ng numero o pindutin nang matagal upang ayusing muli" "Alisin" + "Piliin lahat" "Mag-video call" "Magpadala ng mensahe" "Mga detalye ng tawag" @@ -164,25 +118,14 @@ "Tawagan ang/si ^1" "I-video call si/ang ^1." "Makinig sa voicemail mula sa/kay ^1" - "I-play ang voicemail mula sa/kay ^1" - "I-pause ang voicemail mula sa/kay ^1" - "I-delete ang voicemail mula sa/kay ^1" - - %d bagong voicemail - %d na bagong voicemail - "Gumawa ng contact para kay/sa ^1" "Idagdag si/ang ^1 sa umiiral nang contact" "Mga detalye ng tawag para sa/kay ^1" - "Na-delete mula sa history ng tawag" "Ngayon" "Kahapon" "Mas Luma" - "Listahan ng mga tawag" "I-on ang speaker." "I-off ang speaker." - "Mag-play nang mas mabilis." - "Mag-play nang mas mabagal." "Simulan o i-pause ang pag-playback." "Mga display option" "Tunog at pag-vibrate" @@ -199,7 +142,6 @@ "Mga Tawag" "Pagba-block ng tawag" "Voicemail" - "Pili ng SIM para sa voicemail" "Pansamantalang na-off ang call blocking" "Na-disable ang pagba-block ng tawag dahil nakipag-ugnayan ka sa mga pang-emergency na serbisyo mula sa teleponong ito sa nakalipas na 48 oras. Awtomatiko itong muling i-enable kapag nag-expire na ang 48 oras." "I-import ang mga numero" @@ -213,12 +155,8 @@ "Mga naka-block na numero" "Naka-block na ang %1$s" "Account sa pagtawag" - "I-on" - "Magtakda ng mga pahintulot" "Upang i-enable ang speed dial, i-on ang pahintulot ng Mga Contact." "Upang makita ang iyong log ng tawag, i-on ang pahintulot ng Telepono." - "Upang makita ang iyong mga contact, i-on ang pahintulot ng Mga Contact." - "Upang ma-access ang iyong voicemail, i-on ang pahintulot ng Telepono." "Upang hanapin ang iyong mga contact, i-on ang mga pahintulot sa Mga Contact." "Upang tumawag, i-on ang pahintulot ng Telepono." "Walang pahintulot ang app ng Telepono na mag-write sa mga setting ng system." @@ -230,4 +168,10 @@ "Spam" "Offline si %1$s at hindi makontak" "Tungkol dito" + "Na-transcribe ng Google" + "Nagta-transcribe ang Google …" + "Hindi available ang transcript" + "Tingnan" + "Dinelete ang tawag. Tingnan at i-delete ang mga attachment na ibinahagi sa tawag na ito sa Messages." + "Dinelete ang mga tawag. Tingnan at i-delete ang mga attachment na ibinahagi sa mga tawag sa Messages." diff --git a/java/com/android/dialer/app/res/values-tr/strings.xml b/java/com/android/dialer/app/res/values-tr/strings.xml index 2f6f704f8..d49f11850 100644 --- a/java/com/android/dialer/app/res/values-tr/strings.xml +++ b/java/com/android/dialer/app/res/values-tr/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefon Tuş Takımı" - "Telefon" "Çağrı geçmişi" - "Hatalı numarayı bildir" "Numarayı kopyala" "Çeviri yazıyı kopyala" - "Numarayı engelle" - "Numaranın engellemesini kaldır" "Telefon etmeden önce numarayı düzenle" "Çağrı geçmişini temizle" "Sesli mesajı sil" @@ -34,7 +30,6 @@ "Çağrı geçmişi temizlensin mi?" "Bu işlem, geçmişinizdeki tüm çağrıları silecek" "Çağrı geçmişi temizleniyor…" - "Telefon" "Cevapsız çağrı" "İşle ilgili cevapsız çağrı" "Cevapsız çağrılar" @@ -48,107 +43,66 @@ %1$d Sesli Mesaj Sesli Mesaj - "Oynat" "%1$s, %2$s" "Yeni sesli mesj gönderen: %1$s" "Sesli mesaj oynatılamadı" "Sesli mesaj yükleniyor…" - "Sesli mesaj arşivleniyor…" "Sesli mesaj yüklenemedi" - "Yalnızca sesli mesaj içeren çağrılar" - "Yalnızca gelen çağrılar" - "Yalnızca giden çağrılar" - "Yalnızca cevapsız çağrılar" "(%1$d) %2$s" - "ara" - "çevir" - "çevrilecek numara" - "Oynatmayı başlat veya durdur" "Hoperlörü aç veya kapat" "Oynatma konumunu ayarla" - "Oynatma hızını azalt" - "Oynatma hızını artır" "Çağrı geçmişi" "Diğer seçenekler" "tuş takımı" - "Yalnızca gidenleri göster" - "Yalnızca gelenleri göster" - "Yalnızca cevapsızları göster" - "Yalnızca sesli msajları göster" - "Tüm çağrıları göster" - "2 saniyelik duraklama ekle" - "Bekleme ekle" "Ayarlar" "Simülatör" - "Tüm kişiler" - "Telefon tuş takımını kullan" - "Çağrıya dön" - "Çağrı ekle" - "Gelen çağrılar" - "Sesli mesajı oynat" - "Kişiyi görüntüle: %1$s" - "Ara: %1$s" + "Kull. Arayüzü Kısayolu Oluştur" + "Toplu işlem moduna giriliyor" + "Toplu işlem modundan çıkıldı" + "Seçildi: %1$s" + "Seçimi kaldırıldı: %1$s" "%1$s için kişi ayrıntıları" "Spam olduğundan şüphelenilen arayanın (%1$s) kişi ayrıntıları" "%1$s çağrı." "Video görüşmesi." - "Şuraya SMS gönder: %1$s" - "Dinlenilmemiş sesli mesaj" "Sesli arama başlat" - "Çağrı yap: %s" "Sesli Mesaj" - "%s sn." - "%s dk. %s sn." - "sesli mesaj" - "sesli mesajlar" - "Evet" - "Hayır" - "Seçili %1$s silinsin mi?" + "Toplu işlemler modu iptal edilir" + "Sil" + "İptal" + "%1$s öğe seçildi" + + ""Bu sesli mesajlar silinsin mi? "" + ""Bu sesli mesaj silinsin mi? "" + @string/call_log_header_today "%1$s, %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Bu numara aranamaz" - "Sesli mesajı yapılandırmak için Menü > Ayarlar\'a gidin." - "Sesli mesaja çağrı yapmak için öncelikle Uçak modunu kapatın." - "Yükleniyor..." - "IMEI" - "MEID" - "SIM karttan yükleniyor..." - "SIM kart kişileri" - "Kullanılabilir rehber uygulaması yok" "Sesli arama kullanılamaz" - "Telefon uygulaması devre dışı bırakıldığından telefon edilemiyor." "Kişilerde ara" "Numara ekleyin veya kişi arayın" "Çağrı geçmişiniz boş" "Telefon et" "Cevapsız çağrınız yok." "Sesli mesaj gelen kutunuz boş." - "Yalnızca favori kişileri göster" "Çağrı Geçmişi" "Tümü" "Cevapsız" - "Sesli Mesaj" "Hızlı arama" "Çağrı Geçmişi" "Kişiler" "Sesli mesaj" - "Favorilerden kaldırıldı" - "Geri al" "Çağrı yap: %s" "Yeni kişi oluştur" "Bir kişiye ekle" "SMS gönder" "Video görüşmesi yap" "Numarayı engelle" - "%s yeni cevapsız çağrı" "Hızlı arama listenizde henüz kimse yok" "Favori ekle" - "Henüz kayıtlı kişi yok" - "Kişi ekle" - "Tüm numaraları görmek için resme dokunun veya yeniden sıralamak için dokunup basılı tutun" "Kaldır" + "Tümünü seç" "Video görüşmesi" "İleti gönder" "Çağrı ayrıntıları" @@ -164,25 +118,14 @@ "Telefon et: ^1" "^1 ile video görüşmesi yap." "Şu numaradan gelen sesli mesajı dinle: ^1" - "^1 tarafından kaydedilmiş sesli mesajı çal" - "^1 tarafından kaydedilmiş sesli mesajı duraklat" - "^1 tarafından kaydedilmiş sesli mesajı sil" - - %d yeni sesli mesaj - %d yeni sesli mesaj - "^1 için kişi oluştur" "^1 bilgisini mevcut kişiye ekle" "^1 için çağrı ayrıntıları" - "Çağrı geçmişinden silindi" "Bugün" "Dün" "Daha eski" - "Çağrı listesi" "Hoparlörü açın." "Hoparlörü kapatın." - "Daha hızlı çalın." - "Daha yavaş çalın." "Çalmayı başlatın veya duraklatın." "Görüntüleme seçenekleri" "Ses ve titreşim" @@ -199,7 +142,6 @@ "Çağrılar" "Çağrı engelleme" "Sesli mesaj" - "Sesli mesaj ayarl. için SIM seçin" "Çağrı engelleme geçici olarak kapalı" "Son 48 saat içinde bu telefondan acil servislerle iletişimde bulunduğunuz için çağrı engelleme modu devre dışı bırakıldı. 48 saatlik süre dolduktan sonra çağrı engelleme modu otomatik olarak tekrar etkinleştirilecektir." "Numaraları içe aktar" @@ -213,12 +155,8 @@ "Engellenen numaralar" "%1$s numaralı telefon zaten engellendi." "Çağrı hesapları" - "Aç" - "İzinleri ayarla" "Hızlı aramayı etkinleştirmek için Kişiler iznini açın." "Çağrı günlüğünüzü görmek için Telefon iznini açın." - "Kişilerinizi görmek için Kişiler iznini açın." - "Sesli mesajınıza erişmek için Telefon iznini açın." "Kişilerinizde arama yapmak için Kişiler izinlerini açın." "Telefon etmek için Telefon iznini açın." "Telefon uygulamasının sistem ayarlarına yazma izni yok." @@ -230,4 +168,10 @@ "Spam" "%1$s çevrimdışı olduğundan ulaşılamıyor" "Hakkında" + "Çeviri yazı Google\'a aittir" + "Google çeviri yazı oluşturuyor…" + "Çeviri yazı yok" + "Göster" + "Çağrı silindi. Bu çağrı sırasında paylaşılan ekleri Mesajlar\'da görebilir ve silebilirsiniz." + "Çağrılar silindi. Çağrılar sırasında paylaşılan ekleri Mesajlar\'da görebilir ve silebilirsiniz." diff --git a/java/com/android/dialer/app/res/values-uk/strings.xml b/java/com/android/dialer/app/res/values-uk/strings.xml index 9a790125b..cbfe01456 100644 --- a/java/com/android/dialer/app/res/values-uk/strings.xml +++ b/java/com/android/dialer/app/res/values-uk/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Телефон" "Клавіатура телефона" - "Тел." "Історія дзвінків" - "Повідомити про неправильний номер" "Копіювати номер" "Копіювати транскрипцію" - "Заблокувати номер" - "Розблокувати номер" "Редагувати номер перед викликом" "Очистити історію дзвінків" "Видалити голосову пошту" @@ -34,7 +30,6 @@ "Очистити історію дзвінків?" "З історії буде видалено всі дзвінки" "Очищення історії дзвінків…" - "Номер телефону" "Пропущений виклик" "Пропущений дзвінок на робочий телефон" "Пропущені виклики" @@ -50,107 +45,68 @@ %1$d голосових повідомлень %1$d голосових повідомлень - "Відтворити" "%1$s, %2$s" "Нова голосова пошта від %1$s" "Не вдалося відтворити голосову пошту" "Завантаження голосової пошти…" - "Архівування голосової пошти…" "Не вдалося завантажити голосову пошту" - "Лише виклики з голосовою поштою" - "Лише вхідні виклики" - "Лише вихідні виклики" - "Лише пропущені виклики" "(%1$d) %2$s" - "пошук" - "дзвонити" - "номер для набору" - "Почати або зупинити відтворення" "Увімкнути або вимкнути гучний зв’язок" "Шукати місце відтворення" - "Зменшити швидкість відтворення" - "Збільшити швидкість відтворення" "Історія викликів" "Інші варіанти" "клавіатура" - "Показувати лише вихідні" - "Показувати лише вхідні" - "Показувати лише пропущені" - "Показувати лише голосову пошту" - "Показувати всі виклики" - "Додати 2-сек. паузу" - "Додати паузу" "Налаштування" "Симулятор" - "Усі контакти" - "Використовувати тональний набір" - "Повернутися до поточного виклику" - "Додати виклик" - "Вхідні виклики" - "Відтворити голосову пошту" - "Переглянути контакт %1$s" - "Набрати %1$s" + "Створити ярлик для нової дії" + "Перехід у режим масових дій" + "Ви вийшли з режиму масових дій" + "Вибрано користувача %1$s" + "Скасовано вибір користувача %1$s" "Відомості про контакт %1$s" "Відомості про підозрілого абонента %1$s (може бути спамом)" "Викликів: %1$s." "Відеодзвінок." - "Надіслати SMS контакту %1$s" - "Непрослухана голосова пошта" "Розпочати голосовий пошук" - "Подзвонити на %s" "Голосова пошта" - "%s с" - "%s хв %s с" - "голосова пошта" - "голосова пошта" - "Так" - "Ні" - "Видалити вибране (%1$s)?" + "Скасувати режим масових дій" + "Видалити" + "Скасувати" + "Вибрано %1$s" + + ""Видалити ці повідомлення голосової пошти? "" + ""Видалити ці повідомлення голосової пошти? "" + ""Видалити ці повідомлення голосової пошти? "" + ""Видалити ці повідомлення голосової пошти? "" + @string/call_log_header_today "%1$s о %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Не можна телефонувати на цей номер" - "Щоб установити параметри голосової пошти, відкрийте \"Меню\" та виберіть \"Налаштування\"." - "Щоб перевірити голосову пошту, спочатку вимкніть режим польоту." - "Завантаження..." - "IMEI" - "MEID" - "Завантаж. із SIM-карти…" - "Контакти SIM-карти" - "Немає додатка з контактами" "Голосовий пошук недоступний" - "Не вдається здійснити дзвінок, оскільки додаток Телефон вимкнено." "Пошук контактів" "Введіть або знайдіть номер" "Немає історії дзвінків" "Телефонувати" "Немає пропущених дзвінків." "Немає голосової пошти." - "Показати лише вибрані" "Історія викликів" "Усі" "Пропущені" - "Голосова пошта" "Швидкий набір" "Історія дзвінків" "Контакти" "Голосова пошта" - "Вилучено з вибраного" - "Відмінити" "Подзвонити на %s" "Створити контакт" "Додати в контакти" "Надіслати SMS" "Здійснити відеодзвінок" "Заблокувати номер" - "Нових пропущених дзвінків: %s" "Немає номерів для швидкого набору" "Додати номер" - "Ще немає контактів" - "Додати контакт" - "Торкніться зображення, щоб побачити всі номери, або натисніть і утримуйте, щоб змінити порядок." "Видалити" + "Вибрати все" "Відеодзвінок" "Надіслати повідомлення" "Деталі виклику" @@ -166,27 +122,14 @@ "Телефонувати: ^1" "Запросити контакт ^1 на відеодзвінок." "Слухати голосову пошту: ^1" - "^1: слухати голосову пошту" - "^1: призупинити голосову пошту" - "^1: видалити голосову пошту" - - %d нове повідомлення голосової пошти - %d нові повідомлення голосової пошти - %d нових повідомлень голосової пошти - %d нового повідомлення голосової пошти - "^1: створити контакт" "^1: додати до наявного контакта" "^1: деталі виклику" - "Видалено з історії дзвінків" "Сьогодні" "Учора" "Старіші" - "Список дзвінків" "Увімкнути динамік." "Вимкнути динамік." - "Відтворювати швидше." - "Відтворювати повільніше." "Почати або призупинити відтворення." "Параметри відображення" "Звуки та вібрація" @@ -203,7 +146,6 @@ "Дзвінки" "Блокування викликів" "Голосова пошта" - "Виберіть SIM-карту для гол. пошти" "Блокування дзвінків тимчасово вимкнено" "Блокування дзвінків вимкнено, оскільки ви зверталися з цього телефона в екстрені служби протягом останніх 48 годин. Ця функція автоматично ввімкнеться, коли мине 48 годин." "Імпортувати номери" @@ -217,12 +159,8 @@ "Заблоковані номери" "Номер %1$s уже заблоковано." "Обл. записи для дзвінків" - "Увімкнути" - "Налаштувати дозволи" "Щоб активувати швидкий набір, увімкніть дозвіл \"Контакти\"." "Щоб переглянути журнал викликів, увімкніть дозвіл \"Телефон\"." - "Щоб переглянути контакти, увімкніть дозвіл \"Контакти\"." - "Щоб користуватися голосовою поштою, увімкніть дозвіл \"Телефон\"." "Щоб шукати контакти, увімкніть дозвіл \"Контакти\"." "Щоб зателефонувати, увімкніть дозвіл \"Телефон\"." "Додаток Телефон не має дозволу змінювати системні налаштування." @@ -234,4 +172,10 @@ "Спам" "%1$s не в мережі, неможливо встановити зв’язок" "Про додаток" + "Транскрипція від Google" + "Google транскрибує…" + "Транскрипція недоступна" + "Переглянути" + "Виклик видалено. Переглянути й видалити файли, надіслані під час цього виклику, можна в Повідомленнях." + "Виклики видалено. Переглянути й видалити файли, надіслані під час цих викликів, можна в Повідомленнях." diff --git a/java/com/android/dialer/app/res/values-ur/strings.xml b/java/com/android/dialer/app/res/values-ur/strings.xml index 25198711b..d0ad5d2f6 100644 --- a/java/com/android/dialer/app/res/values-ur/strings.xml +++ b/java/com/android/dialer/app/res/values-ur/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "فون" "فون کی پیڈ" - "فون" "کال کی سرگزشت" - "غلط نمبر کی رپورٹ کریں" "نمبر کاپی کریں" "ٹرانسکرپشن کاپی کریں" - "نمبر مسدود کریں" - "نمبر غیر مسدود کریں" "کال کرنے سے پہلے نمبر میں ترمیم کریں" "کال کی سرگزشت صاف کریں" "صوتی میل حذف کریں" @@ -34,7 +30,6 @@ "کال کی سرگزشت صاف کریں؟" "یہ آپ کی سرگزشت سے سبھی کالز کو حذف کر دے گا" "کال کی سرگزشت صاف کی جا رہی ہے…" - "فون" "چھوٹی ہوئی کال" "کام سے متعلق چھوٹی ہوئی کال" "چھوٹی ہوئی کالیں" @@ -48,107 +43,66 @@ %1$d صوتی میلز صوتی میل - "چلائیں" "%1$s، %2$s" "%1$s کی جانب سے نیا صوتی میل" "صوتی میل نہیں چلا سکا" "صوتی میل لوڈ ہو رہا ہے…" - "صوتی میل آرکائیو ہو رہی ہے…" "صوتی میل لوڈ نہیں کیا جا سکا" - "صرف صوتی میل والی کالیں" - "صرف آنے والی کالیں" - "صرف باہر جانے والی کالیں" - "صرف چھوٹی ہوئی کالیں" "(%1$d) %2$s" - "تلاش کریں" - "ڈائل کریں" - "ڈائل کرنے کیلئے نمبر" - "پلے بیک چلائیں یا روکیں" "اسپیکر فون آن یا آف کریں" "پلے بیک پوزیشن طلب کریں" - "پلے بیک کی شرح گھٹائیں" - "پلے بیک کی شرح بڑھائیں" "کال کی سرگزشت" "مزید اختیارات" "کی پیڈ" - "صرف باہر جانے والی دکھائیں" - "صرف آنے والی دکھائیں" - "صرف چھوٹی ہوئی دکھائیں" - "صرف صوتی میلز دکھائیں" - "سبھی کالیں دکھائیں" - "2 سیکنڈ کا توقف شامل کریں" - "انتظار شامل کریں" "ترتیبات" "Simulator" - "سبھی رابطے" - "ٹچ ٹون کی پیڈ کا استعمال کریں" - "جاری کال پر واپس لوٹیں" - "کال شامل کریں" - "آنے والی کالیں" - "صوتی میل چلائیں" - "رابطہ %1$s دیکھیں" - "%1$s کو کال کریں" + "‏نیا UI شارٹ کٹ تخلیق کریں" + "بلک کاروائی موڈ میں داخل ہو رہا ہے" + "بلک کاروائی موڈ چھوڑ دیا" + "منتخب کردہ %1$s" + "غیر منتخب کردہ %1$s" "%1$s کیلئے رابطہ کی تفصیلات" "مشتبہ سپام کالر کی رابطہ تفصیلات %1$s" "%1$s کالیں۔" "ویڈیو کال۔" - "‏%1$s پر SMS بھیجیں" - "نہ سنا ہوا صوتی میل" "صوتی تلاش شروع کریں" - "%s کو کال کریں" "صوتی میل" - "%s سیکنڈ" - "%s منٹ %s سیکنڈ" - "صوتی میل" - "صوتی میلز" - "ہاں" - "نہیں" - "منتخب کردہ %1$s حذف کریں؟" + "بیچ کاروائی موڈ منسوخ کریں" + "حذف کریں" + "منسوخ کریں" + "%1$s منتخب کردہ" + + ""ان صوتی میلز کو حذف کریں؟ "" + ""اس صوتی میل کو حذف کریں؟ "" + @string/call_log_header_today "%1$s بوقت %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "اس نمبر پر کال نہیں کر سکتے ہیں" - "صوتی میل سیٹ اپ کرنے کیلئے، مینو > ترتیبات پر جائیں۔" - "صوتی میل کو کال کرنے کیلئے، پہلے ہوائی جہاز موڈ آف کریں۔" - "لوڈ ہو رہا ہے…" - "IMEI" - "MEID" - "‏SIM کارڈ سے لوڈ ہو رہا ہے…" - "‏SIM کارڈ کے رابطے" - "رابطوں کی کوئی ایپ دستیاب نہیں ہے" "صوتی تلاش دستیاب نہیں ہے" - "فون کال نہیں کی جا سکتی ہے کیونکہ فون ایپلیکیشن کو غیر فعال کر دیا گیا ہے۔" "رابطے تلاش کریں" "نمبر شامل کریں یا رابطے تلاش کریں" "آپ کی کال کی سرگزشت خالی ہے" "ایک کال کریں" "آپ کے پاس کوئی چھوٹی ہوئی کالز نہیں ہیں۔" "آپ کا صوتی میل ان باکس خالی ہے۔" - "صرف پسندیدہ دکھائیں" "کال کی سرگزشت" "سبھی" "چھوٹی ہوئی" - "صوتی میل" "اسپیڈ ڈائل" "کال کی سرگزشت" "رابطے" "صوتی میل" - "پسندیدہ سے ہٹا دیا گیا" - "کالعدم کریں" "%s کو کال کریں" "نیا رابطہ بنائیں" "رابطے میں شامل کریں" "‏SMS بھیجیں" "ویڈیو کال کریں" "نمبر مسدود کریں" - "%s نئی چھوٹی ہوئی کالیں" "آپ کے اسپیڈ ڈائل پر ابھی تک کوئی نہیں ہے" "ایک پسندیدہ شامل کریں" - "آپ کے پاس ابھی تک کوئی رابطے نہیں ہیں" - "ایک رابطہ شامل کریں" - "سبھی نمبرز دیکھنے کیلئے تصویر ٹچ کریں یا دوبارہ ترتیب دینے کیلئے ٹچ کریں اور پکڑے رہیں" "ہٹائیں" + "سبھی کو منتخب کریں" "ویڈیو کال" "پیغام بھیجیں" "کال کی تفصیلات" @@ -164,25 +118,14 @@ "^1 کو کال کریں" "^1 کو ویڈیو کال کریں۔" "^1 سے صوتی میل سنیں" - "^1 سے صوتی میل چلائیں" - "^1 سے صوتی میل موقوف کریں" - "^1 سے صوتی میل حذف کریں" - - %d نئی صوتی میلز - %d نئی صوتی میل - "^1 کیلئے رابطہ بنائیں" "^1 کو موجودہ رابطہ میں شامل کریں" "^1 کیلئے کال کی تفصیلات" - "کال کی سرگزشت سے حذف کر دیا گیا" "ﺁﺝ" "گزشتہ کل" "قدیم تر" - "کالز کی فہرست" "اسپیکر کو آن کر دیں۔" "اسپیکر کو آف کر دیں۔" - "تیزی سے چلائیں۔" - "آہستہ چلائیں۔" "پلے بیک شروع یا موقوف کریں۔" "ڈسپلے کے اختیارات" "آوازیں اور وائبریشن" @@ -199,7 +142,6 @@ "کالز" "کال مسدود کرنا" "صوتی میل" - "‏صوتی میل سیٹنگز کیلئے SIM منتخب کریں" "کال مسدود کرنا عارضی طور پر آف ہے" "کال مسدود کرنا غیر فعال کر دیا گیا ہے کیونکہ آپ نے پچھلے 48 گھنٹوں میں اس فون سے ہنگامی سروسز کے ساتھ رابطہ کیا تھا۔ جب 48 گھنٹے کا دورانیہ ختم ہوگا تو یہ خودکار طور پر دوبارہ فعال ہو جائے گا۔" "نمبرز درآمد کریں" @@ -213,12 +155,8 @@ "مسدود کردہ نمبرز" "%1$s پہلے ہی مسدود ہے۔" "کالنگ اکاؤنٹس" - "آن کریں" - "اجازتیں طے کریں" "اسپیڈ ڈائل کو فعال کرنے کیلئے رابطوں کی اجازت آن کریں۔" "اپنا کال لاگ دیکھنے کیلئے فون کی اجازت آن کریں۔" - "اپنے رابطے دیکھنے کیلئے رابطوں کی اجازت آن کریں۔" - "اپنی صوتی میل تک رسائی کیلئے فون کی اجازت آن کریں۔" "اپنے رابطوں کو تلاش کرنے کیلئے رابطوں کی اجازتیں آن کریں۔" "کال کرنے کیلئے فون کی اجازت آن کریں۔" "فون ایپ کے پاس سسٹم ترتیبات کو لکھنے کی اجازت نہیں ہے۔" @@ -230,4 +168,10 @@ "سپام" "%1$s آف لائن ہے اور اس تک پہنچا نہیں جا سکتا" "تفصیل" + "‏Google کی جانب سے ٹرانسکرائب کردہ" + "‏Google نقل حرفی کر رہا ہے…" + "ٹرانسکرپٹ دستیاب نہیں ہے" + "دیکھیں" + "کال حذف ہو گئی۔ اس کال کے دوران اشتراک کردہ منسلکہ جات کو \'پیغامات \' میں ملاحظہ کریں اور حذف کریں۔" + "کالیں حذف ہو گئیں۔ کالوں کے دوران اشتراک کردہ منسلکہ جات کو \'پیغامات \' میں ملاحظہ کریں اور حذف کریں۔" diff --git a/java/com/android/dialer/app/res/values-uz/strings.xml b/java/com/android/dialer/app/res/values-uz/strings.xml index 705cae765..4e55577bb 100644 --- a/java/com/android/dialer/app/res/values-uz/strings.xml +++ b/java/com/android/dialer/app/res/values-uz/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Telefon" "Telefon klaviaturasi" - "Raqam tergich" "Chaqiruvlar tarixi" - "Raqam noto‘g‘ri aniqlandi" "Raqamdan nusxa olish" "Transkripsiyadan nusxa olish" - "Raqamni bloklash" - "Raqamni blokdan chiqarish" "Tahrirlash va telefon qilish" "Qo‘ng‘iroqlar tarixini tozalash" "Ovozli xabarni o‘chirish" @@ -34,7 +30,6 @@ "Qo‘ng‘iroqlar tarixi tozalansinmi?" "Barcha qo‘ng‘iroqlar tarixi o‘chib ketadi." "Qo‘ng‘iroqlar tarixi tozalanmoqda…" - "Chaqiruv" "Javobsiz chaqiruv" "Javobsiz chaqiruv (ish)" "Javobsiz chaqiruvlar" @@ -48,112 +43,71 @@ %1$d ta ovozli xabar Ovozli xabar - "Tinglash" "%1$s, %2$s" "%1$sdan yangi ovozli xabar" "Ovozli xabarni eshitib bo‘lmadi" "Ovozli xabar yuklanmoqda…" - "Ovozli pochta arxivlanmoqda…" "Ovozli xabarni yuklab bo‘lmadi" - "Faqat ovozli xabar qo‘ng‘iroqlari" - "Faqat kiruvchi qo‘ng‘iroqlar" - "Faqat chiquvchi qo‘ng‘iroqlar" - "Faqat javobsiz chaqiruvlar" "(%1$d) %2$s" - "qidiruv" - "terish" - "terish uchun raqam" - "Ijroni boshlash yoki to‘xtatish" "Karnayni yoqish yoki o‘chirish" "Ijro vaziyatini qidirish" - "Ijro tezligini kamaytirish" - "Ijro tezligini oshirish" "Chaqiruvlar tarixi" "Boshqa parametrlar" "klaviatura" - "Chiquvchi qo‘ng‘-ni ko‘rsatish" - "Kiruvchi qo‘n-larni ko‘rsatish" - "Javobsiz qo‘n-larni ko‘rsatish" - "Ovozli xabarlarni ko‘rsatish" - "Barcha qo‘n-larni ko‘rsatish" - "2 soniyalik pauza qo‘shish" - "Kutishni qo‘shish" "Sozlamalar" "Simulyator" - "Barcha kontaktlar" - "Tovushli raqam tergich" - "Amaldagi chaqiruvga qaytish" - "Chaqiruv qo‘shish" - "Kiruvchi qo‘ng‘iroqlar" - "Ovozli xabarni eshitish" - "%1$s kontaktini ko‘rish" - "Qo‘ng‘iroq: %1$s" + "Yangi interfeys uchun yorliq" + "Yoppasiga bajariladigan amallar rejimiga o‘tilmoqda" + "Yoppasiga bajariladigan amallar rejimidan chiqib ketildi" + "%1$s tanlandi" + "%1$s tanlovi bekor qilindi" "%1$s uchun kontakt ma’lumotlari" "%1$s abonentining ma’lumotlari (spam deb taxmin qilinmoqda)" "%1$s ta qo‘ng‘iroq." "Video qo‘ng‘iroq." - "%1$sga SMS yuborish" - "Ochilmagan ovozli xabar" "Ovozli qidiruvni boshlash" - "Qo‘ng‘iroq: %s" "Ovozli pochta" - "%s soniya" - "%s daq %s son" - "ovozli xabar" - "ovozli xabarlar" - "Ha" - "Yo‘q" - "Tanlangan %1$s o‘chirib tashlansinmi?" + "Yoppasiga bajariladigan amallar rejimini bekor qilish" + "O‘chirish" + "Bekor qilish" + "Tanlandi: %1$s" + + ""Bu ovozli xabarlar o‘chirib tashlansinmi? "" + ""Bu ovozli xabar o‘chirib tashlansinmi? "" + @string/call_log_header_today "%1$s, %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Bu raqamga qo‘ng‘iroq qilib bo‘lmaydi" - "Ovozli pochtani sozlab olish uchun Menyu > Sozlamalarga o‘ting." - "Ovozli pochtaga qo‘ng‘iroq qilish uchun avval Parvoz rejimini o‘chiring." - "Yuklanmoqda…" - "IMEI" - "MEID" - "SIM kartadan yuklanmoqda…" - "SIM karta kontaktlari" - "Hech qanday kontakt ilovasi yo‘q" "Ovozli qidiruv mavjud emas" - "Telefon ilovasi o‘chirib qo‘yilgani sababli telefon qo‘ng‘iroqlarini amalga oshirib bo‘lmaydi." "Kontaktlar ichidan qidirish" "Raqam qo‘shish yoki kontaktlardan qidirish" "Chaqiruvlar tarixida hech narsa yo‘q" "Telefon qilish" "Hech qanday javobsiz chaqiruv yo‘q." "Sizning ovozli pochta qutingiz bo‘m-bo‘sh." - "Faqat saralar ko‘rsatilsin" "Chaqiruvlar tarixi" "Hammasi" "Javobsiz" - "Ovozli pochta" "Tezkor terish" "Chaqiruvlar tarixi" "Kontaktlar" "Ovozli pochta" - "Tanlanganlardan o‘chirilgan" - "Bekor qilish" "Qo‘ng‘iroq: %s" "Yangi kontakt yaratish" "Mavjud kontaktga saqlash" "SMS yuborish" "Videoqo‘ng‘iroq qilish" "Raqamni bloklash" - "%s ta javobsiz chaqiruv" "Tezkor terish uchun hech kim yo‘q" "Tezkor raqam terishni sozlang" - "Sizda hali hech qanday kontakt yo‘q" - "Yangi kontakt qo‘shing" - "Barcha raqamlarni ko‘rish uchun rasm ustiga bosing yoki joyini o‘zgartirish uchun rasmni bosib turing." "O‘chirish" + "Hammasini tanlash" "Video qo‘ng‘iroq" "Xabar yuborish" "Chaqiruv tafsilotlari" "Yuborish:" - "Qo‘ng‘iroq qilish: ^1" + "Chaqiruv: ^1" "Javobsiz chaqiruv: ^1, ^2, ^3, ^4." "Qo‘ng‘iroqqa javob berildi: ^1, ^2, ^3, ^4." "O‘qilmagan ovozli xabar (^1, ^2, ^3, ^4)." @@ -161,28 +115,17 @@ "Chaqiruv: ^1. ^2, ^3, ^4." "%1$s raqami orqali" "%1$s, %2$s raqami orqali" - "Qo‘ng‘iroq qilish: ^1" + "Chaqiruv: ^1" "Video qo‘ng‘iroq qilish: ^1." "^1 kontaktidan kelgan ovozli xabarni tinglash" - "^1 tomonidan yuborilgan ovozli xabarni eshitish" - "^1 tomonidan yuborilgan ovozli xabarni pauza qilish" - "^1 tomonidan yuborilgan ovozli xabarni o‘chirish" - - %d ta yangi ovozli xabar - %d ta yangi ovozli xabar - "Yangi kontakt yaratish: ^1" "Mavjud kontaktlarga qo‘shish: ^1" "^1 – qo‘ng‘iroq tafsilotlari" - "Qo‘ng‘iroqlar tarixidan o‘chirib tashlandi" "Bugun" "Kecha" "Eskiroq" - "Qo‘ng‘iroqlar ro‘yxati" "Karnayni yoqish." "Karnayni o‘chirib qo‘yish." - "Tezro ijro etish." - "Sekinroq ijro etish." "Ijroni boshlash yoki to‘xtatish" "Kontaktlarning ko‘rinishi" "Ovoz va tebranish" @@ -199,7 +142,6 @@ "Chaqiruvlar" "Chaqiruvlarni bloklash" "Ovozli pochta" - "Ovozli pochta uchun SIM karta" "Qo‘ng‘iroqlarni bloklash o‘chirilgan" "Oxirgi 48 soat ichida ushbu telefon orqali favqulodda xizmatlar bilan bog‘lanilganligi uchun qo‘ng‘iroqlarni bloklash o‘chirib qo‘yildi. 48 soatlik muddat tugagandan so‘ng bu avtomatik qayta yoqiladi." "Raqamlarni import qilish" @@ -213,14 +155,10 @@ "Bloklangan raqamlar" "%1$s raqami allaqachon bloklangan." "Chaqiruv uchun hisoblar" - "Yoqish" - "Ruxsatnomalarni sozlash" "Tezkor raqam terish uchun “Kontaktlar” ruxsatnomasini yoqing." "Qo‘ng‘iroqlaringiz ro‘yxatini ko‘rish uchun “Telefon” ruxsatnomasini yoqing." - "Kontaktlaringizni ko‘rish uchun “Kontaktlar” ruxsatnomasini yoqing." - "Ovozli pochtaga kirish uchun “Telefon” ruxsatnomasini yoqing." "Kontaktlarni qidirish uchun “Kontaktlar” ruxsatnomasini yoqing." - "Qo‘ng‘iroq qilish uchun “Telefon” ruxsatnomasini yoqing." + "Chaqiruv uchun “Telefon” ruxsatnomasini yoqing." "Telefon ilovasida tizim sozlamalarini o‘zgartirish uchun ruxsat yo‘q." "Bloklandi" "Bloklash/spam deb belgilash" @@ -230,4 +168,10 @@ "Spam" "%1$s hozir oflayn va u bilan bog‘lanishning imkoni yo‘q" "Ilova haqida" + "Google tomon. trans-ya qilindi" + "Google transkripsiya qilmoqda…" + "Transkripsiya mavjud emas" + "Ko‘rish" + "Chaqiruv o‘chirildi. Android Xabarlar ilovasi orqali bu qo‘ng‘iroq davomida ulashilgan biriktirmalarni ko‘rish va o‘chirsh mumkin." + "Chaqiruvlar o‘chirildi. Android Xabarlar ilovasi orqali bu qo‘ng‘iroqlar davomida ulashilgan biriktirmalarni ko‘rish va o‘chirsh mumkin." diff --git a/java/com/android/dialer/app/res/values-vi/strings.xml b/java/com/android/dialer/app/res/values-vi/strings.xml index 5a60e0ac3..57801796c 100644 --- a/java/com/android/dialer/app/res/values-vi/strings.xml +++ b/java/com/android/dialer/app/res/values-vi/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Điện thoại" "Bàn phím điện thoại" - "Điện thoại" "Nhật ký cuộc gọi" - "Báo cáo số không chính xác" "Sao chép số" "Sao chép bản ghi âm" - "Chặn số" - "Bỏ chặn số" "Chỉnh sửa số trước khi gọi" "Xóa nhật ký cuộc gọi" "Xóa thư thoại" @@ -34,7 +30,6 @@ "Xóa nhật ký cuộc gọi?" "Thao tác này sẽ xóa tất cả cuộc gọi khỏi nhật ký của bạn" "Đang xóa nhật ký cuộc gọi…" - "Điện thoại" "Cuộc gọi nhỡ" "Cuộc gọi nhỡ về công việc" "Cuộc gọi nhỡ" @@ -48,107 +43,66 @@ %1$d Thư thoại Thư thoại - "Phát" "%1$s, %2$s" "Thư thoại mới từ %1$s" "Không thể phát thư thoại" "Đang tải thư thoại…" - "Đang lưu trữ thư thoại…" "Không thể tải thư thoại" - "Chỉ cuộc gọi có thư thoại" - "Chỉ cuộc gọi đến" - "Chỉ cuộc gọi đi" - "Chỉ cuộc gọi nhỡ" "(%1$d) %2$s" - "tìm kiếm" - "quay số" - "số để quay" - "Phát hoặc dừng phát lại" "Bật hoặc tắt loa ngoài" "Tìm kiếm vị trí phát lại" - "Giảm tốc độ phát lại" - "Tăng tốc độ phát lại" "Nhật ký cuộc gọi" "Tùy chọn khác" "bàn phím" - "Chỉ hiển thị cuộc gọi đi" - "Chỉ hiển thị cuộc gọi đến" - "Chỉ hiển thị cuộc gọi nhỡ" - "Chỉ hiển thị thư thoại" - "Hiển thị tất cả cuộc gọi" - "Thêm 2 giây dừng" - "Thêm chờ" "Cài đặt" "Trình mô phỏng" - "Tất cả liên hệ" - "Sử dụng bàn phím số cảm ứng có âm" - "Quay lại cuộc gọi đang thực hiện" - "Thêm cuộc gọi" - "Cuộc gọi đến" - "Phát thư thoại" - "Xem thông tin liên hệ của %1$s" - "Gọi %1$s" + "Tạo phím tắt giao diện người dùng mới" + "Truy cập chế độ tác vụ hàng loạt" + "Đã rời khỏi chế độ tác vụ hàng loạt" + "Đã chọn %1$s" + "Đã bỏ chọn %1$s" "Chi tiết liên lạc cho %1$s" "Chi tiết liên hệ cho người gọi điện spam đáng ngờ %1$s" "%1$s cuộc gọi." "Gọi điện video." - "Gửi SMS cho %1$s" - "Thư thoại chưa nghe" "Bắt đầu tìm kiếm bằng giọng nói" - "Gọi %s" "Thư thoại" - "%s giây" - "%s phút %s giây" - "thư thoại" - "thư thoại" - "Có" - "Không" - "Xóa %1$s đã chọn?" + "Hủy chế độ tác vụ hàng loạt" + "Xóa" + "Hủy" + "Đã chọn %1$s" + + ""Xóa các thư thoại này? "" + ""Xóa thư thoại này? "" + @string/call_log_header_today "%1$s lúc %2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Không thể gọi số này" - "Để thiết lập thư thoại, chuyển tới Menu > Cài đặt." - "Để gọi thư thoại, trước tiên hãy tắt chế độ trên Máy bay." - "Đang tải…" - "IMEI" - "MEID" - "Đang tải từ thẻ SIM…" - "Danh bạ trên thẻ SIM" - "Không có ứng dụng danh bạ" "Không có tính năng tìm kiếm bằng giọng nói" - "Không thể thực hiện cuộc gọi điện thoại vì ứng dụng Điện thoại đã bị tắt." "Tìm kiếm trong danh bạ" "Thêm số hoặc tìm kiếm danh bạ" "Nhật ký cuộc gọi của bạn trống" "Gọi điện" "Bạn không có cuộc gọi nhỡ nào." "Hộp thư thoại đến của bạn trống." - "Chỉ hiển thị liên hệ ưa thích" "Nhật ký cuộc gọi" "Tất cả" "Bị nhỡ" - "Thư thoại" "Quay số nhanh" "Nhật ký cuộc gọi" "Danh bạ" "Thư thoại" - "Đã xóa khỏi liên hệ yêu thích" - "Hoàn tác" "Gọi %s" "Tạo liên hệ mới" "Thêm vào liên hệ" "Gửi SMS" "Gọi điện video" "Chặn số" - "%s cuộc gọi nhỡ mới" "Chưa có ai trong danh bạ quay số nhanh của bạn" "Thêm liên hệ quay số nhanh yêu thích" - "Bạn chưa có bất kỳ liên hệ nào" - "Thêm liên hệ" - "Chạm vào hình ảnh để xem tất cả các số hoặc chạm và giữ để sắp xếp lại" "Xóa" + "Chọn tất cả" "Cuộc gọi điện video" "Gửi tin nhắn" "Chi tiết cuộc gọi" @@ -164,25 +118,14 @@ "Gọi ^1" "Gọi điện video cho ^1." "Nghe thư thoại từ ^1" - "Phát thư thoại từ ^1" - "Tạm dừng thư thoại từ ^1" - "Xóa thư thoại từ ^1" - - %d thư thoại mới - %d thư thoại mới - "Tạo địa chỉ liên hệ cho ^1" "Thêm ^1 vào địa chỉ liên hệ hiện có" "Chi tiết cuộc gọi cho ^1" - "Đã xóa khỏi nhật ký cuộc gọi" "Hôm nay" "Hôm qua" "Cũ hơn" - "Danh sách cuộc gọi" "Bật loa." "Tắt loa." - "Phát nhanh hơn." - "Phát chậm hơn." "Bắt đầu hoặc tạm dừng phát lại." "Tùy chọn hiển thị" "Âm thanh và rung" @@ -199,7 +142,6 @@ "Cuộc gọi" "Chặn cuộc gọi" "Thư thoại" - "Chọn SIM cho cài đặt thư thoại" "Tạm thời tắt chặn cuộc gọi" "Tính năng chặn cuộc gọi đã bị tắt vì bạn đã liên hệ với dịch vụ khẩn cấp từ điện thoại này trong vòng 48 giờ qua. Tính năng này sẽ được bật lại tự động sau khi khoảng thời gian 48 giờ kết thúc." "Nhập số" @@ -213,12 +155,8 @@ "Số bị chặn" "%1$s đã bị chặn." "Tài khoản gọi" - "Bật" - "Đặt quyền" "Để bật quay số nhanh, bật quyền đối với Danh bạ." "Để xem nhật ký cuộc gọi của bạn, bật quyền đối với Điện thoại." - "Để xem danh bạ của bạn, bật quyền đối với Danh bạ." - "Để truy cập thư thoại của bạn, bật quyền đối với Điện thoại." "Để tìm kiếm liên hệ của bạn, hãy bật quyền đối với Danh bạ." "Để thực hiện cuộc gọi, bật quyền đối với Điện thoại." "Ứng dụng Điện thoại không có quyền ghi vào cài đặt hệ thống." @@ -230,4 +168,10 @@ "Spam" "%1$s ngoại tuyến và không liên hệ được" "Giới thiệu" + "Do Google phiên âm" + "Google đang phiên âm ..." + "Bản phiên âm không sẵn có" + "Xem" + "Đã xóa cuộc gọi. Hãy xem và xóa tệp đính kèm được chia sẻ trong cuộc gọi này trong Messages." + "Đã xóa cuộc gọi. Hãy xem và xóa tệp đính kèm được chia sẻ trong các cuộc gọi này trong Messages." diff --git a/java/com/android/dialer/app/res/values-zh-rCN/strings.xml b/java/com/android/dialer/app/res/values-zh-rCN/strings.xml index 98abc396a..84aa06dcb 100644 --- a/java/com/android/dialer/app/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/app/res/values-zh-rCN/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "电话" "电话拨号键盘" - "拨号" "通话记录" - "报告错误的号码" "复制号码" "复制转录内容" - "屏蔽号码" - "取消屏蔽号码" "拨打之前修改号码" "清除通话记录" "删除语音邮件" @@ -34,7 +30,6 @@ "要清除通话记录吗?" "这会删除您的所有通话记录" "正在清除通话记录…" - "打电话" "未接电话" "未接工作来电" "未接电话" @@ -48,107 +43,66 @@ %1$d 封语音邮件 1 封语音邮件 - "播放" "%1$s%2$s" "来自%1$s的新语音邮件" "无法播放语音邮件" "正在加载语音邮件…" - "正在归档语音邮件…" "无法加载语音邮件" - "只显示语音信箱留言" - "只显示来电" - "只显示外拨电话" - "只显示未接来电" "(%1$d) %2$s" - "搜索" - "拨号" - "要拨打的号码" - "开始或停止播放" "打开或关闭扬声器" "拖动到播放位置" - "减慢播放速度" - "加快播放速度" "通话记录" "更多选项" "拨号键盘" - "仅显示外拨电话" - "只显示来电" - "只显示未接来电" - "只显示语音邮件" - "显示所有通话" - "延长暂停时间2秒" - "延长等待时间" "设置" "模拟器" - "所有联系人" - "使用按键式键盘" - "返回正在进行的通话" - "添加通话" - "来电" - "播放语音邮件" - "查看联系人%1$s" - "呼叫%1$s" + "创建可在新界面中使用的快捷键" + "正在进入批量操作模式" + "已退出批量操作模式" + "已选择 %1$s" + "已取消选择 %1$s" "%1$s的详细联系信息" "疑似骚扰电话来电者“%1$s”的详细联系信息" "%1$s次通话。" "视频通话。" - "向%1$s发送短信" - "未收听的语音邮件" "开始语音搜索" - "拨打 %s" "语音信箱" - "%s 秒" - "%s 分钟 %s 秒" - "语音邮件" - "语音邮件" - "是" - "否" - "要删除所选的%1$s吗?" + "取消批量操作模式" + "删除" + "取消" + "已选择 %1$s 封" + + ""要删除这些语音邮件吗?"" + ""要删除这封语音邮件吗?"" + @string/call_log_header_today "%1$s%2$s" "%1$02d:%2$02d" "%1$s%2$s" - "无法拨打此号码" - "要设置语音信箱,请转到“菜单”>“设置”。" - "要呼叫语音信箱,请先关闭飞行模式。" - "正在加载..." - "移动通信国际识别码" - "MEID" - "正从 SIM 卡中加载..." - "SIM卡联系人" - "没有可用的通讯录应用" "无法使用语音搜索" - "“电话”应用已被停用,因此无法拨打电话。" "搜索联系人" "添加号码或搜索联系人" "您没有任何通话记录" "拨打电话" "您没有任何未接电话。" "您未收到任何语音邮件。" - "仅显示收藏的联系人" "通话记录" "全部" "未接电话" - "语音邮件" "快速拨号" "通话记录" "通讯录" "语音邮件" - "已从收藏中移除" - "撤消" "拨打 %s" "新建联系人" "添加到联系人" "发送短信" "发起视频通话" "屏蔽号码" - "%s个新的未接电话" "尚未给任何联系人设定快速拨号" "添加常用联系人" - "您还没有任何联系人" - "添加联系人" - "触摸图片可查看所有号码,触摸并按住可重新排序" "移除" + "全选" "视频通话" "发送短信" "通话详情" @@ -164,25 +118,14 @@ "呼叫^1" "与^1进行视频通话。" "听取来自^1的语音邮件" - "播放来自^1的语音邮件" - "暂停来自^1的语音邮件" - "删除来自^1的语音邮件" - - %d 封新的语音邮件 - %d 封新的语音邮件 - "为^1创建联系人信息" "将^1添加到现有联系人" "与^1的通话详情" - "已从通话记录中删除" "今天" "昨天" "更早" - "通话清单" "打开扬声器。" "关闭扬声器。" - "快放。" - "慢放。" "开始或暂停播放。" "显示选项" "提示音和振动" @@ -199,7 +142,6 @@ "通话" "来电屏蔽" "语音邮件" - "选择要更改其语音信箱设置的 SIM 卡" "来电拦截功能已暂时关闭" "来电拦截功能已停用,因为您在过去 48 小时内使用该手机拨打了紧急服务电话。系统会在 48 小时的期限结束后自动重新启用该功能。" "导入号码" @@ -213,12 +155,8 @@ "已屏蔽的号码" "%1$s 已被屏蔽。" "通话帐号" - "开启" - "设置权限" "要启用快速拨号功能,请开启“通讯录”权限。" "要查看您的通话记录,请开启“电话”权限。" - "要查看您的联系人,请开启“通讯录”权限。" - "要使用您的语音信箱,请开启“电话”权限。" "要搜索您的联系人,请开启“通讯录”权限。" "要拨打电话,请开启“电话”权限。" "电话应用不具备写入系统设置的权限。" @@ -230,4 +168,10 @@ "骚扰电话号码" "%1$s不在线,无法接通" "应用信息" + "由 Google 转录" + "Google 正在转录…" + "转录失败" + "查看" + "通话已删除。请前往“信息”应用查看和删除通过此通话分享的附件。" + "通话已删除。请前往“信息”应用查看和删除通过通话分享的附件。" diff --git a/java/com/android/dialer/app/res/values-zh-rHK/strings.xml b/java/com/android/dialer/app/res/values-zh-rHK/strings.xml index 2a96ce045..54f14bc8d 100644 --- a/java/com/android/dialer/app/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/app/res/values-zh-rHK/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "手機" "手機小鍵盤" - "電話" "通話記錄" - "報告錯誤號碼" "複製號碼" "複製內容轉錄" - "封鎖號碼" - "解除封鎖號碼" "致電前編輯號碼" "清除通話記錄" "刪除留言" @@ -34,7 +30,6 @@ "要清除通話記錄嗎?" "這會刪除所有通話記錄" "正在清除通話記錄…" - "撥打電話" "未接來電" "未接工作來電" "未接來電" @@ -48,107 +43,66 @@ %1$d 個留言 留言 - "播放" "%1$s%2$s" "來自%1$s的新語音留言" "無法播放留言" "正在載入留言…" - "正在封存留言…" "無法載入留言" - "只顯示有留言的來電" - "只顯示來電" - "只顯示撥出電話" - "只顯示未接來電" "( %1$d%2$s" - "搜尋" - "撥號" - "致電號碼" - "播放或停止播放" "開啟或關閉揚聲器" "指定播放位置" - "減慢播放速度" - "加快播放速度" "通話記錄" "更多選項" "小鍵盤" - "只顯示撥出電話" - "只顯示來電" - "只顯示未接來電" - "僅顯示語音留言" - "顯示所有通話" - "新增 2 秒暫停功能" - "新增插播功能" "設定" "模擬器" - "所有聯絡人" - "使用觸控音頻按鍵" - "返回進行中的通話" - "新增通話" - "來電" - "播放語音留言" - "查看聯絡人%1$s" - "打電話給%1$s" + "建立新使用者介面捷徑" + "正在進入大量操作模式" + "已離開大量操作模式" + "已選取%1$s" + "已取消選取%1$s" "「%1$s」的聯絡人詳細資料" "疑似垃圾來電者 %1$s 的聯絡人詳細資料" "%1$s 次通話次數。" "視像通話。" - "向 %1$s 傳送短訊" - "未聽取的語音留言" "開始語音搜尋" - "撥打 %s" "留言" - "%s 秒" - "%s%s 秒" - "留言" - "留言" - "是" - "否" - "要刪除所選的%1$s嗎?" + "取消批量操作模式" + "刪除" + "取消" + "已選取 %1$s 個" + + ""要刪除這些留言嗎?"" + ""要刪除此留言嗎?"" + @string/call_log_header_today "%1$s%2$s" "%1$02d:%2$02d" "%1$s%2$s" - "無法撥打這個電話號碼" - "若要設定留言信箱,請前往 [選單] > [設定]。" - "若要致電留言信箱,請先關閉飛行模式。" - "正在載入..." - "IMEI" - "MEID" - "正在從 SIM 卡載入..." - "SIM 卡聯絡人" - "沒有可用的聯絡人應用程式" "無法使用語音搜尋" - "由於「電話」應用程式已停用,因此無法打電話。" "搜尋聯絡人" "新增號碼或搜尋聯絡人" "沒有通話記錄" "撥號" "您沒有未接來電。" "您的留言信箱沒有留言。" - "只顯示我的最愛" "通話記錄" "全部" "未接來電" - "留言信箱" "快速撥號" "通話記錄" "聯絡人" "留言信箱" - "已從「我的最愛」中移除" - "復原" "撥打 %s" "建立新聯絡人" "加至現有聯絡人資料" "傳送短訊" "進行視像通話" "封鎖號碼" - "%s 個新的未接來電" "快速撥號名單中沒有聯絡人" "新增常用聯絡人" - "暫時沒有聯絡人" - "新增聯絡人" - "輕觸圖片以查看所有電話號碼,或輕觸並按住圖片以重新排序" "移除" + "全選" "視像通話" "傳送訊息" "通話詳情" @@ -164,25 +118,14 @@ "致電 ^1" "與^1進行視像通話。" "收聽來自「^1」的留言信箱" - "播放來自 ^1 的語音留言" - "暫停來自 ^1 的語音留言" - "刪除來自 ^1 的語音留言" - - %d個新留言 - %d個新留言 - "為^1建立聯絡人" "加入^1至現有的聯絡人" "與「^1」的通話詳情" - "已從通話記錄中刪除" "今天" "昨天" "較早" - "通話清單" "開啟揚聲器。" "關閉揚聲器。" - "加快播放速度。" - "放慢播放速度。" "開始或暫停播放。" "顯示選項" "聲音和震動" @@ -199,7 +142,6 @@ "通話" "來電封鎖" "留言" - "為留言設定選擇 SIM" "暫時關閉來電封鎖功能" "您在過去 48 小時內曾經使用此手機聯絡緊急服務,因此來電封鎖功能已停用。系統會在 48 小時期限結束後自動重新啟用功能。" "匯入號碼" @@ -213,12 +155,8 @@ "已封鎖的號碼" "已封鎖 %1$s。" "通話帳戶" - "開放權限" - "設定權限" "如要啟用快速撥號功能,請開放「通訊錄」權限。" "如要查看通話記錄,請開放「手機」權限。" - "如要查看聯絡人,請開放「通訊錄」權限。" - "如要存取留言信箱,請開放「手機」權限。" "如要搜尋聯絡人,請開啟「通訊錄」權限。" "如要撥打電話,請開放「手機」權限。" "手機應用程式沒有系統設定的寫入權限。" @@ -230,4 +168,10 @@ "垃圾號碼" "%1$s已離線,無法取得聯繫" "關於" + "已由 Google 轉錄" + "Google 正在轉錄…" + "找不到轉錄文字" + "查看" + "已刪除通話。在「訊息」中查看及刪除此通話期間所分享的附件。" + "已刪除通話。在「訊息」中查看及刪除通話期間所分享的附件。" diff --git a/java/com/android/dialer/app/res/values-zh-rTW/strings.xml b/java/com/android/dialer/app/res/values-zh-rTW/strings.xml index 917452133..d35b2dc4f 100644 --- a/java/com/android/dialer/app/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/app/res/values-zh-rTW/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "電話" "電話撥號鍵盤" - "電話" "通話紀錄" - "回報號碼錯誤" "複製號碼" "複製留言轉錄內容" - "封鎖號碼" - "解除封鎖號碼" "撥打前編輯號碼" "清除通話紀錄" "刪除語音留言" @@ -34,7 +30,6 @@ "清除通話紀錄?" "這項操作會將所有通話從您的紀錄中刪除" "正在清除通話紀錄…" - "撥打電話" "未接來電" "未接公司來電" "未接來電" @@ -48,107 +43,66 @@ %1$d 則語音留言 語音留言 - "播放" "%1$s%2$s" "最新語音留言者:%1$s" "無法播放語音留言" "正在載入語音留言…" - "正在封存語音留言…" "無法載入語音留言" - "僅顯示語音信箱留言" - "僅顯示來電" - "僅顯示已撥電話" - "僅顯示未接來電" "(%1$d) %2$s" - "搜尋" - "撥號" - "撥號號碼" - "播放或停止播放" "切換擴音器開關" "指定播放時間點" - "降低播放速率" - "提高播放速率" "通話紀錄" "更多選項" "撥號鍵盤" - "僅顯示撥出電話" - "僅顯示來電" - "僅顯示未接來電" - "僅顯示語音留言" - "顯示所有通話" - "暫停時間延長 2 秒" - "延長等待時間" "設定" "模擬工具" - "所有聯絡人" - "使用觸控音按鍵" - "返回進行中的通話" - "新增通話" - "來電" - "播放語音留言" - "查看聯絡人%1$s" - "撥電話給%1$s" + "建立新版 UI 捷徑" + "已進入大量操作模式" + "已離開大量操作模式" + "已選取:%1$s" + "已取消選取:%1$s" "「%1$s」的聯絡詳細資料" "可疑的騷擾/廣告電話來電者 (%1$s) 的聯絡資訊" "通話 %1$s 次。" "視訊通話。" - "傳送簡訊給%1$s" - "未聽取的語音留言" "開始進行語音搜尋" - "撥打 %s" "語音留言" - "%s 秒" - "%s%s 秒" - "語音留言" - "語音留言" - "是" - "否" - "要刪除選取的%1$s嗎?" + "取消批次操作模式" + "刪除" + "取消" + "已選取 %1$s 個" + + ""要刪除這些語音留言嗎?"" + ""要刪除這則語音留言嗎?"" + @string/call_log_header_today "%1$s%2$s" "%1$02d:%2$02d" "%1$s%2$s" - "無法撥打這個號碼" - "如要設定語音信箱,請前往 [選單] > [設定]。" - "如要聽取語音留言,請先關閉飛航模式。" - "載入中…" - "IMEI" - "MEID" - "從 SIM 卡讀取中…" - "SIM 卡聯絡人" - "沒有可用的聯絡人應用程式" "無法使用語音搜尋" - "「電話」應用程式已遭停用,因此無法撥打電話。" "搜尋聯絡人" "新增號碼或搜尋聯絡人" "沒有任何通話紀錄" "撥打電話" "您沒有任何未接來電。" "您沒有任何語音留言。" - "只顯示我的收藏" "通話紀錄" "全部" "未接來電" - "語音留言" "快速撥號" "通話紀錄" "聯絡人" "語音信箱" - "已從常用聯絡人移除" - "復原" "撥打 %s" "建立新聯絡人" "新增至聯絡人" "傳送簡訊" "進行視訊通話" "封鎖號碼" - "%s 通新的未接來電" "您的快速撥號功能尚未設定任何聯絡人" "新增常用聯絡人" - "您尚未加入任何聯絡人" - "新增聯絡人" - "輕觸圖片即可查看所有號碼,按住則可重新排序" "移除" + "全選" "視訊通話" "傳送簡訊" "通話詳細資料" @@ -164,25 +118,14 @@ "撥號給「^1」" "與「^1」視訊通話。" "聽取「^1」的語音留言" - "播放來自「^1」的語音留言" - "暫停來自「^1」的語音留言" - "刪除來自「^1」的語音留言" - - %d 則新的語音留言 - %d 則新的語音留言 - "建立「^1」的聯絡人資訊" "將「^1」新增到現有的聯絡人" "與「^1」通話的詳細資料" - "已從通話紀錄中刪除" "今天" "昨天" "較舊" - "通話清單" "開啟喇叭。" "關閉喇叭。" - "加快播放速度。" - "放慢播放速度。" "開始或暫停播放。" "顯示選項" "音效與振動" @@ -199,7 +142,6 @@ "通話" "來電封鎖" "語音留言" - "選取 SIM 卡以變更語音信箱設定" "來電封鎖功能已暫時關閉" "由於您曾在過去 48 小時內使用這支手機撥打緊急服務電話,因此來電封鎖功能已停用。此功能停用達 48 小時後,將由系統自動重新啟用。" "匯入電話號碼" @@ -213,12 +155,8 @@ "已封鎖的號碼" "%1$s 已在封鎖清單中。" "通話帳戶" - "開啟" - "設定權限" "如要啟用快速撥號,請開啟「聯絡人」存取權限。" "如要查看您的通話紀錄,請開啟「電話」存取權限。" - "如要查看您的聯絡人,請開啟「聯絡人」存取權限。" - "如要存取您的語音信箱,請開啟「電話」存取權限。" "如要搜尋您的聯絡人,請開啟「聯絡人」存取權限。" "如要撥打電話,請開啟「電話」存取權限。" "電話應用程式的權限不足,無法寫入系統設定。" @@ -230,4 +168,10 @@ "騷擾/廣告電話" "%1$s已離線,無法接聽來電" "關於" + "由 Google 轉錄" + "Google 正在轉錄…" + "無法轉錄" + "查看" + "已刪除這筆通話紀錄。你可以在「訊息」應用程式中查看及刪除通話期間分享的附件。" + "已刪除這些通話紀錄。你可以在「訊息」應用程式中查看及刪除通話期間分享的附件。" diff --git a/java/com/android/dialer/app/res/values-zu/strings.xml b/java/com/android/dialer/app/res/values-zu/strings.xml index 9c8a6b8e1..9818c287b 100644 --- a/java/com/android/dialer/app/res/values-zu/strings.xml +++ b/java/com/android/dialer/app/res/values-zu/strings.xml @@ -19,13 +19,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Ifoni" "Ikhiphedi yefoni" - "Ifoni" "Umlando wekholi" - "Bika inombolo engalungile" "Kopisha inombolo" "Kopisha ukukhiphela" - "Vimba inombolo" - "Vulela inombolo" "Hlela inombolo ngaphambi kwekholi" "Sula umlando wekholi" "Susa ivoyisimeyili" @@ -34,7 +30,6 @@ "Sula umlando wekholi?" "Lokhu kuzosusa wonke amakholi kusukela kumlando wakho" "Isula umlando wekholi…" - "Ifoni" "Ikholi ekulahlekele" "Ugeje ikholi yomsebenzi" "Amakholi akuphuthele" @@ -48,107 +43,66 @@ %1$d Amavoyisimeyili %1$d Amavoyisimeyili - "Dlala" "%1$s, %2$s" "I-imeyli entsha esuka ku %1$s" "Ayikwazanga ukudlala ivoyisimeyili" "Ilayisha ivoyisimeyili…" - "Ifaka kungobo yomlando yevoyisimeyili…" "Ayikwazi ukulayisha ivoyisimeyili" - "Amakholi anevoyisimeyili kuphela" - "Amakholi angenayo kuphela" - "Amakholi aphumayo kuphela" - "Amakholi agejiwe kuphela" "(%1$d) %2$s" - "sesha" - "dayela" - "inombolo okumele uyidayele" - "Dlala noma misa ukudlala" "Vula noma vala isipikha sefoni" "Funa indawo yokudlala" - "Yehlisa isilinganiso sokudlala" - "Yenyusa isilinganiso sokudlala" "Umlando wekholi" "Izinketho eziningi" "ikhiphedi" - "Bonisa eziphumayo kuphela" - "Bonisa okungenayo kuphela" - "Bonisa okugejiwe kuphela" - "Bonisa ama-imeyli ezwi kuphela" - "Bonisa zonke izingcingo ezenziwe" - "Faka ukumisa okwesikhashana kwamasekhondi angu-2" - "Yengeza ukulinda" "Izilungiselelo" "Isilingisi" - "Bonke othintana nabo" - "Sebenzisa ikhiphedi yethoni yokuthinta" - "Buyela kukholi eqhubekayo" - "Yengeza ikholi" - "Amakholi angenayo" - "Dlala i-imeyli yezwi" - "Bheka oxhumana naye %1$s" - "Shayela %1$s" + "Dala isinqamuleli esisha se-UI" + "Kungenwa kumodi yesenzo senqwaba" + "Ishiye imodi yesenzo senqwaba" + "Kukhethwe i-%1$s" + "Akukhethiwe i-%1$s" "Imininingwane yokuxhumana ka-%1$s" "Imininingwane yokuxhumana yofonayo ongugaxekile osolwayo %1$s" "%1$s amakholi." "Ikholi yevidiyo." - "Thumela i-SMS ku-%1$s" - "I-imeyli yezwi engazwakalanga" "Qalisa ukusesha ngezwi" - "Shayela %s" "Ivoyisimeyili" - "%s isekhondi" - "%s amaminithi %s amasekhondi" - "ivoyisimeyili" - "ama-meyli ezwi" - "Yebo" - "Cha" - "Susa okukhethiwe %1$s?" + "Khansela imodi lezenzo zeqoqo" + "Susa" + "Khansela" + "Engu-%1$s ekhethiwe" + + ""Sula lawa mavoyisimeyili? "" + ""Sula lawa mavoyisimeyili? "" + @string/call_log_header_today "%1$s ngo-%2$s" "%1$02d:%2$02d" "%1$s%2$s" - "Ayikwazi ukushayela le nombolo" - "Ukuze umise ivoyisimeyili, iya kokuthi Imenyu > Izilungiselelo." - "Ukushayela ivoyisimeyili, vala kuqala imodi Yendiza." - "Iyalayisha…" - "IMEI" - "I-MEID" - "Ilayisha kusuka ekhadini le-SIM..." - "Othintana nabo bekhadi le-SIM" - "Alukho uhlelo lokusebenza loxhumana nabo olutholakalayo" "Usesho lwezwi alutholakali" - "Ayikwazi ukwenza ikholi yefoni ngoba uhlelo lokusebenza lwefoni likhutshaziwe." "Sesha othintana nabo" "Engeza inombolo noma useshe oxhumana nabo" "Umlando wakho wekholi awunalutho" "Yenza ikholi" "Awunawo amakholi aphuthelwe." "Ibhokisi lokungenayo kwakho levoyisimeyili alinalutho." - "Bonisa izintandokazi kuphela" "Umlando wekholi" "Konke" "Phuthelwe" - "Ivoyisimeyili" "Ukudayela okusheshayo" "Umlando wekholi" "Oxhumana nabo" "Ivoyisimeyili" - "Kukhishiwe kusuka kuzintandokazi" - "Hlehlisa" "Shayela %s" "Dala oxhumana naye omusha" "Engeza koxhumana naye" "Thumela i-SMS" "Yenza ikholi yevidiyo" "Vimba inombolo" - "%s amakholi amasha owaphuthelwe" "Akekho umuntu osekudayeleni kwakho okusheshayo okwamanje" "Engeza intandokazi" - "Awunabo oxhumana nabo okwamanje" - "Engeza oxhumana naye" - "Thinta isithombe ukuze ubone zonke izinombolo noma thinta bese ubambe ukuze uhlele kabusha" "Susa" + "Khetha konke" "Ikholi yevidiyo" "Thumela umlayezo" "Imininingwane yekholi" @@ -164,25 +118,14 @@ "Shayela ku-^1" "Ikholi yevidiyo ka-^1." "Lalela ivoyisimeyili esuka ku-^1" - "Dlala ivoyisimeyili kusuka ku-^1" - "Misa okwesikhashana ivoyisimeyili kusuka ku-^1" - "Sula ivoyisimeyili kusuka ku-^1" - - %d amavoyisimeyili amasha - %d amavoyisimeyili amasha - "Dalela oxhumana naye u-^1" "Engeza u-^1 koxhumana naye okhona" "Imininingwane yekholi ye-^1" - "Isusiwe kusukela kumlando wekholi" "Namhlanje" "Izolo" "Okudala" - "Uhlu lwamakholi" "Vula isipikha." "Vala isipikha." - "Dala ngokushesha." - "Dlala ngokungasheshi." "Qala noma misa isikhashana ukudlala." "Izinketho zokubukeka" "Imisindo nokudlidliza" @@ -199,7 +142,6 @@ "Amakholi" "Ukuvimbela ikholi" "Ivoyisimeyili" - "Khetha i-SIM yezilungiselelo zevoyisimeyili" "Ukuvimbela ikholi kuvalwe isikhashana" "Ukuvimbela ikholi kukhutshaziwe ngoba uxhumane nabosizo oluphuthumayo kusukela kule foni phakathi kwamahora angu-48 wokugcina. Kuzophinda kunikwe amandla ngokuzenzakalela uma sokuphele isikhathi samahora angu-48." "Ngenisa izinombolo" @@ -213,12 +155,8 @@ "Izinombolo ezivinjiwe" "%1$s isivinjiwe kakade." "Ama-akhawunti wokushaya" - "Vula" - "Setha izimvume" "Nika amandla ukudayela okusheshayo, vula imvume yoxhumana nabo." "Ukuze ubone irekhodi lakho lamakholi, vuma imvume yefoni." - "Ukuze ubone oxhumana nabo, vula imvume yoxhumana nabo." - "Ukuze ufinyelele ivoyisimeyili, vula imvume yefoni." "Ukuze useshe oxhumana nabo, vula izimvume zoxhumana nabo." "Ukuze ubeke ikholi, vula imvume yefoni." "Uhlelo lokusebenza lefoni alinayo imvume yokubhalela kuzilungiselelo zesistimu." @@ -230,4 +168,10 @@ "Ugaxekile" "U-%1$s akaxhunyiwe kwi-inthanethi futhi akakwazi ukufinyelelwa" "Mayelana" + "Kubhalwe ngokuloba i-Google" + "I-Google ibhala ngokuloba..." + "Ukubhalwa ngokuloba akutholakali" + "Buka" + "Ikholi isusiwe. Buka uphinde ususe okunamathiselwe ku-imeyili okwabiwe ngesikhathi sale kholi kumilayezo." + "Amakholi asusiwe. Buka uphinde ususe okunamathiselwe kwi-imeyili okwabiwe ngesikhathi samakholi kumilayezo." diff --git a/java/com/android/dialer/app/res/values/animation_constants.xml b/java/com/android/dialer/app/res/values/animation_constants.xml index 91230cd54..4029e772d 100644 --- a/java/com/android/dialer/app/res/values/animation_constants.xml +++ b/java/com/android/dialer/app/res/values/animation_constants.xml @@ -16,15 +16,4 @@ --> 300 - - - 100 - 200 - 400 - 2000 - 350 - 2 - 0dip - 10dip - 20dip diff --git a/java/com/android/dialer/app/res/values/colors.xml b/java/com/android/dialer/app/res/values/colors.xml index cf6b926be..f1f5002ed 100644 --- a/java/com/android/dialer/app/res/values/colors.xml +++ b/java/com/android/dialer/app/res/values/colors.xml @@ -15,9 +15,6 @@ --> - #ff1744 - - #fff @color/dialer_theme_color @@ -26,7 +23,6 @@ @color/dialer_secondary_text_color #aaaaaa #ffffff - #eee #8a000000 @@ -36,6 +32,8 @@ #8a000000 #de000000 + + #8a000000 #b3000000 @@ -52,41 +50,21 @@ @color/dialer_theme_color - - #fafafa #f9f9f9 - @color/background_dialer_light - - - #d0d0d0 #ffffff @color/dialer_primary_text_color - - #4d4d4d - - #b2b2b2 - #ffffff #FF3F3B - - #16000000 - - - @color/dialer_theme_color - @color/dialer_theme_color_20pct - #80ffffff - #eeeeee #D8D8D8 @@ -97,11 +75,7 @@ #FFFFFF #F44336 @color/dialer_theme_color - #616161 #E0E0E0 #bdbdbd - - #616161 - @color/call_detail_footer_text_color diff --git a/java/com/android/dialer/app/res/values/dimens.xml b/java/com/android/dialer/app/res/values/dimens.xml index 7da29c7a3..5f252ee89 100644 --- a/java/com/android/dialer/app/res/values/dimens.xml +++ b/java/com/android/dialer/app/res/values/dimens.xml @@ -14,9 +14,8 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> - + 16dp - 1dp 16dp + + 14sp + 16dp + 18dp + 8dp - 32dp - 54dp - 13dp 8dp 8dp - 24dp 2dp 2dp 8dp - 56dp 16dp - 72dp 48dp - 2dip - 20dp - 16dp - 16dp - 20dp - 9dp - 0.5dp - 28dp - 16dp - 28dp - 16sp - 18dp - 18dp - - - 12dp - - - 74dp 1dp @@ -68,20 +47,14 @@ 12dp 9dp 1dp - 0dp 1dp 0dp - 32dp 12dp - - 20dip - 28dip - 8dp @@ -98,22 +71,6 @@ 16dp 3dp - - 8dp - - - 10dp - - 20dp - 16sp - - - 16dp - 16dp - 16dp - 4dp - 48dp @@ -137,9 +94,7 @@ 8dp 8dp 16sp - 12sp 32dp 14sp 14sp - 48dp diff --git a/java/com/android/dialer/app/res/values/donottranslate_config.xml b/java/com/android/dialer/app/res/values/donottranslate_config.xml deleted file mode 100644 index e7a8e6fc3..000000000 --- a/java/com/android/dialer/app/res/values/donottranslate_config.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - true - - - true - - - - - diff --git a/java/com/android/dialer/app/res/values/strings.xml b/java/com/android/dialer/app/res/values/strings.xml index 9e1fdeb5a..50e717492 100644 --- a/java/com/android/dialer/app/res/values/strings.xml +++ b/java/com/android/dialer/app/res/values/strings.xml @@ -16,21 +16,14 @@ --> - + - Phone + Phone Phone Keypad - - Phone - Call history - - - Report inaccurate number + Call history Copy number @@ -49,12 +39,6 @@ Copy transcription - - Block number - - - Unblock number - Edit number before call @@ -79,10 +63,6 @@ Clearing call history\u2026 - - Phone - Missed call @@ -114,15 +94,12 @@ Voicemail - + %1$d Voicemails - - Play - - %1$s, + %1$s, %2$s - New voicemail from + New voicemail from %1$s @@ -146,54 +123,14 @@ Loading voicemail\u2026 - - Archiving voicemail\u2026 - Couldn\'t load voicemail - - Calls with voicemail only - - - Incoming calls only - - - Outgoing calls only - - - Missed calls only - - (%1$d) + (%1$d) %2$s - - search - - - dial - - - number to dial - - - Play or stop playback - Seek playback position - - Decrease playback rate - - - Increase playback rate - Call history @@ -232,25 +157,6 @@ [CHAR LIMIT=NONE] --> key pad - - Show outgoing only - - - Show incoming only - - - Show missed only - - - Show voicemails only - - - Show all calls - - - Add 2-sec pause - Add wait - Settings @@ -258,47 +164,36 @@ and testing. [CHAR LIMIT=30]--> Simulator - - All contacts + + Create New UI Shortcut - - Use touch tone keypad + - Return to call in progress + Note: AccessibilityServices use this attribute to announce what the view represents. + This is especially valuable for views without textual representation like ImageView. +--> + Entering bulk action mode - - Add call + - Incoming calls + Note: AccessibilityServices use this attribute to announce what the view represents. + This is especially valuable for views without textual representation like ImageView. +--> + Left bulk action mode - - Play voicemail + Selected %1$s - - View contact %1$s - - - Call %1$s + Unselected %1$s Video call. - - Send SMS to %1$s - - - Unheard voicemail - Start voice search - - Call %s - Voicemail - - %s sec + + Cancel batch actions mode + + Delete + Cancel - - %s min %s sec + %1$s selected - voicemail - voicemails - Yes - No - Delete selected %1$s? + + + Delete this voicemail? + Delete these voicemails? + %1$s \u2022 %2$s - - Can\'t call this number - - - To set up voicemail, go to Menu > Settings. - - - To call voicemail, first turn off Airplane mode. - - - Loading\u2026 - - - IMEI - - - MEID - - - Loading from SIM card\u2026 - - - SIM card contacts - - - No contacts app available - Voice search not available - - Cannot make a phone call because the Phone application has been disabled. - Search contacts @@ -429,12 +273,6 @@ [CHAR LIMIT=45] --> Add number or search contacts - - sans-serif-light - - - sans-serif - Your call history is empty @@ -447,11 +285,8 @@ Your voicemail inbox is empty. - - Show favorites only - - Call History + Call History @@ -461,10 +296,6 @@ [CHAR LIMIT=30] --> Missed - - Voicemail - Speed dial @@ -478,13 +309,8 @@ Voicemail - - Removed from favorites - - Undo - - Call + Call %s @@ -505,30 +331,18 @@ Block number - - %s new missed calls - No one is on your speed dial yet Add a favorite - - You don\'t have any contacts yet - - - Add a contact - - - Touch image to see all numbers or touch & hold to reorder - Remove + + Select all + @@ -550,13 +364,13 @@ - + Call ^1 + Note: AccessibilityServices uses this attribute to announce what the view represents. + [CHAR LIMIT=NONE] --> Missed call from ^1, ^2, ^3, ^4. - + Call ^1 @@ -600,7 +414,7 @@ action triggers a return video call to the named person/number. Note: AccessibilityServices uses this attribute to announce the purpose of the button. [CHAR LIMIT=NONE] --> - + Video call ^1. @@ -609,50 +423,20 @@ triggers playing back the voicemail. Note: AccessibilityServices uses this attribute to announce the purpose of the button. [CHAR LIMIT=NONE] --> - + Listen to voicemail from ^1 - - - Play voicemail from ^1 - - - - - Pause voicemail from ^1 - - - - - - Delete voicemail from ^1 - - - - - %d new voicemail - %d new voicemails - - - + Create contact for ^1 - + Add ^1 to existing contact @@ -660,14 +444,10 @@ displays the call details screen for an entry in the call log. This shows the calls to and from the specified number associated with the call log entry. [CHAR LIMIT=NONE] --> - + Call details for ^1 - - Deleted from call history - Today @@ -680,11 +460,6 @@ [CHAR LIMIT=65] --> Older - - Calls list - Turn speaker off. - - Play faster. - - - Play slower. - Voicemail - - Select SIM for voicemail settings - - + Call blocking temporarily off - + Call blocking has been disabled because you contacted emergency services from this phone within the last 48 hours. It will be automatically reenabled once the 48 hour period expires. @@ -789,7 +549,7 @@ - + You previously marked some callers to be automatically sent to voicemail via other apps. @@ -811,13 +571,13 @@ - + Calls from these numbers will be blocked and voicemails will be automatically deleted. - + Calls from these numbers will be blocked, but they may still be able to leave you voicemails. @@ -826,7 +586,7 @@ - %1$s + %1$s is already blocked. @@ -841,24 +601,12 @@ button_dtmf_settings - - Turn on - - - Set permissions - To enable speed dial, turn on the Contacts permission. To see your call log, turn on the Phone permission. - - To see your contacts, turn on the Contacts permission. - - - To access your voicemail, turn on the Phone permission. - To search your contacts, turn on the Contacts permissions. @@ -900,4 +648,23 @@ About + + Transcribed by Google + + + Google is transcribing … + + + Transcript not available + + + View + + + Call deleted. View and delete attachments shared during this call in Messages. + + + Calls deleted. View and delete attachments shared during calls in Messages. diff --git a/java/com/android/dialer/app/res/values/styles.xml b/java/com/android/dialer/app/res/values/styles.xml index 7adf7ca2c..d464ca7f2 100644 --- a/java/com/android/dialer/app/res/values/styles.xml +++ b/java/com/android/dialer/app/res/values/styles.xml @@ -16,6 +16,11 @@ --> + + - - + + - - - - + + - \ No newline at end of file + diff --git a/java/com/android/dialer/app/widget/DialpadSearchEmptyContentView.java b/java/com/android/dialer/app/widget/DialpadSearchEmptyContentView.java index 85fd5ec6a..5846b1f73 100644 --- a/java/com/android/dialer/app/widget/DialpadSearchEmptyContentView.java +++ b/java/com/android/dialer/app/widget/DialpadSearchEmptyContentView.java @@ -21,6 +21,7 @@ import android.view.LayoutInflater; import android.widget.LinearLayout; import com.android.dialer.app.R; import com.android.dialer.util.OrientationUtil; +import com.android.dialer.widget.EmptyContentView; /** Empty content view to be shown when dialpad is visible. */ public class DialpadSearchEmptyContentView extends EmptyContentView { diff --git a/java/com/android/dialer/app/widget/EmptyContentView.java b/java/com/android/dialer/app/widget/EmptyContentView.java deleted file mode 100644 index cfc8665a2..000000000 --- a/java/com/android/dialer/app/widget/EmptyContentView.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.app.widget; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; -import com.android.dialer.app.R; - -public class EmptyContentView extends LinearLayout implements View.OnClickListener { - - /** Listener to call when action button is clicked. */ - public interface OnEmptyViewActionButtonClickedListener { - void onEmptyViewActionButtonClicked(); - } - - public static final int NO_LABEL = 0; - public static final int NO_IMAGE = 0; - - private ImageView mImageView; - private TextView mDescriptionView; - private TextView mActionView; - private OnEmptyViewActionButtonClickedListener mOnActionButtonClickedListener; - - public EmptyContentView(Context context) { - this(context, null); - } - - public EmptyContentView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public EmptyContentView(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public EmptyContentView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - inflateLayout(); - - // Don't let touches fall through the empty view. - setClickable(true); - mImageView = (ImageView) findViewById(R.id.emptyListViewImage); - mDescriptionView = (TextView) findViewById(R.id.emptyListViewMessage); - mActionView = (TextView) findViewById(R.id.emptyListViewAction); - mActionView.setOnClickListener(this); - } - - public void setDescription(int resourceId) { - if (resourceId == NO_LABEL) { - mDescriptionView.setText(null); - mDescriptionView.setVisibility(View.GONE); - } else { - mDescriptionView.setText(resourceId); - mDescriptionView.setVisibility(View.VISIBLE); - } - } - - public void setImage(int resourceId) { - if (resourceId == NO_LABEL) { - mImageView.setImageDrawable(null); - mImageView.setVisibility(View.GONE); - } else { - mImageView.setImageResource(resourceId); - mImageView.setVisibility(View.VISIBLE); - } - } - - public void setActionLabel(int resourceId) { - if (resourceId == NO_LABEL) { - mActionView.setText(null); - mActionView.setVisibility(View.GONE); - } else { - mActionView.setText(resourceId); - mActionView.setVisibility(View.VISIBLE); - } - } - - public boolean isShowingContent() { - return mImageView.getVisibility() == View.VISIBLE - || mDescriptionView.getVisibility() == View.VISIBLE - || mActionView.getVisibility() == View.VISIBLE; - } - - public void setActionClickedListener(OnEmptyViewActionButtonClickedListener listener) { - mOnActionButtonClickedListener = listener; - } - - @Override - public void onClick(View v) { - if (mOnActionButtonClickedListener != null) { - mOnActionButtonClickedListener.onEmptyViewActionButtonClicked(); - } - } - - protected void inflateLayout() { - setOrientation(LinearLayout.VERTICAL); - final LayoutInflater inflater = - (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - inflater.inflate(R.layout.empty_content_view, this); - } - -} diff --git a/java/com/android/dialer/app/widget/SearchEditTextLayout.java b/java/com/android/dialer/app/widget/SearchEditTextLayout.java index f83c48288..95bd12aa1 100644 --- a/java/com/android/dialer/app/widget/SearchEditTextLayout.java +++ b/java/com/android/dialer/app/widget/SearchEditTextLayout.java @@ -52,7 +52,6 @@ public class SearchEditTextLayout extends FrameLayout { private View mVoiceSearchButtonView; private View mOverflowButtonView; private View mBackButtonView; - private View mExpandedSearchBox; private View mClearButtonView; private ValueAnimator mAnimator; @@ -90,20 +89,27 @@ public class SearchEditTextLayout extends FrameLayout { mVoiceSearchButtonView = findViewById(R.id.voice_search_button); mOverflowButtonView = findViewById(R.id.dialtacts_options_menu_button); mBackButtonView = findViewById(R.id.search_back_button); - mExpandedSearchBox = findViewById(R.id.search_box_expanded); + mBackButtonView + .getResources() + .getDrawable(R.drawable.quantum_ic_arrow_back_vd_theme_24, null) + .setAutoMirrored(true); mClearButtonView = findViewById(R.id.search_close_button); - // Convert a long click into a click to expand the search box, and then long click on the - // search view. This accelerates the long-press scenario for copy/paste. + // Convert a long click into a click to expand the search box. Touch events are also + // forwarded to the searchView. This accelerates the long-press scenario for copy/paste. mCollapsed.setOnLongClickListener( new OnLongClickListener() { @Override public boolean onLongClick(View view) { mCollapsed.performClick(); - mSearchView.performLongClick(); return false; } }); + mCollapsed.setOnTouchListener( + (v, event) -> { + mSearchView.onTouchEvent(event); + return false; + }); mSearchView.setOnFocusChangeListener( new OnFocusChangeListener() { @@ -212,7 +218,7 @@ public class SearchEditTextLayout extends FrameLayout { AnimUtils.crossFadeViews(mExpanded, mCollapsed, ANIMATION_DURATION); mAnimator = ValueAnimator.ofFloat(EXPAND_MARGIN_FRACTION_START, 0f); setMargins(EXPAND_MARGIN_FRACTION_START); - prepareAnimator(true); + prepareAnimator(); } else { mExpanded.setVisibility(View.VISIBLE); mExpanded.setAlpha(1); @@ -241,7 +247,7 @@ public class SearchEditTextLayout extends FrameLayout { if (animate) { AnimUtils.crossFadeViews(mCollapsed, mExpanded, ANIMATION_DURATION); mAnimator = ValueAnimator.ofFloat(0f, 1f); - prepareAnimator(false); + prepareAnimator(); } else { mCollapsed.setVisibility(View.VISIBLE); mCollapsed.setAlpha(1); @@ -279,7 +285,7 @@ public class SearchEditTextLayout extends FrameLayout { } } - private void prepareAnimator(final boolean expand) { + private void prepareAnimator() { if (mAnimator != null) { mAnimator.cancel(); } diff --git a/java/com/android/dialer/backup/AndroidManifest.xml b/java/com/android/dialer/backup/AndroidManifest.xml index 1cbbe5339..84992c0ee 100644 --- a/java/com/android/dialer/backup/AndroidManifest.xml +++ b/java/com/android/dialer/backup/AndroidManifest.xml @@ -1,5 +1,5 @@ - + - - + + + + \ No newline at end of file diff --git a/java/com/android/dialer/backup/DialerBackupAgent.java b/java/com/android/dialer/backup/DialerBackupAgent.java deleted file mode 100644 index dec1ca1a7..000000000 --- a/java/com/android/dialer/backup/DialerBackupAgent.java +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.backup; - -import android.annotation.TargetApi; -import android.app.backup.BackupAgent; -import android.app.backup.BackupDataInput; -import android.app.backup.BackupDataOutput; -import android.app.backup.FullBackupDataOutput; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.database.Cursor; -import android.net.Uri; -import android.os.Build.VERSION_CODES; -import android.os.ParcelFileDescriptor; -import android.provider.CallLog; -import android.provider.CallLog.Calls; -import android.provider.VoicemailContract; -import android.provider.VoicemailContract.Voicemails; -import android.telecom.PhoneAccountHandle; -import android.util.Pair; -import com.android.dialer.common.Assert; -import com.android.dialer.common.ConfigProviderBindings; -import com.android.dialer.common.LogUtil; -import com.android.dialer.logging.DialerImpression; -import com.android.dialer.logging.Logger; -import com.android.dialer.telecom.TelecomUtil; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.util.List; -import java.util.Locale; - -/** - * The Dialer backup agent to backup voicemails, and files under files, shared prefs and databases - */ -public class DialerBackupAgent extends BackupAgent { - // File names suffix for backup/restore. - private static final String VOICEMAIL_BACKUP_FILE_SUFFIX = "_voicemail_backup.proto"; - // File name formats for backup. It looks like 000000_voicemail_backup.proto, 0000001... - private static final String VOICEMAIL_BACKUP_FILE_FORMAT = "%06d" + VOICEMAIL_BACKUP_FILE_SUFFIX; - // Order by Date entries from database. We start backup from the newest. - private static final String ORDER_BY_DATE = "date DESC"; - // Voicemail Uri Column - public static final String VOICEMAIL_URI = "voicemail_uri"; - // Voicemail packages to backup - public static final String VOICEMAIL_SOURCE_PACKAGE = "com.google.android.dialer"; - - private long voicemailsBackedupSoFar = 0; - private long sizeOfVoicemailsBackedupSoFar = 0; - private boolean maxVoicemailBackupReached = false; - - /** - * onBackup is used for Key/Value backup. Since we are using Dolly/Android Auto backup, we do not - * need to implement this method and Dolly should not be calling this. Instead Dolly will be - * calling onFullBackup. - */ - @Override - public void onBackup( - ParcelFileDescriptor parcelFileDescriptor, - BackupDataOutput backupDataOutput, - ParcelFileDescriptor parcelFileDescriptor1) - throws IOException { - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_ON_BACKUP); - Assert.fail("Android Backup should not call DialerBackupAgent.onBackup"); - } - - /** - * onRestore is used for Key/Value restore. Since we are using Dolly/Android Auto backup/restore, - * we need to implement this method only for backwards compatibility. Dolly should be calling - * onFileRestore during its restore. - */ - @Override - public void onRestore( - BackupDataInput backupDataInput, int i, ParcelFileDescriptor parcelFileDescriptor) - throws IOException { - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_ON_RESTORE); - } - - @TargetApi(VERSION_CODES.M) - @Override - public void onFullBackup(FullBackupDataOutput data) throws IOException { - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_ON_FULL_BACKUP); - LogUtil.i("DialerBackupAgent.onFullBackup", "performing dialer backup"); - boolean autoBackupEnabled = - ConfigProviderBindings.get(this).getBoolean("enable_autobackup", true); - boolean vmBackupEnabled = ConfigProviderBindings.get(this).getBoolean("enable_vm_backup", true); - List phoneAccountsToArchive = - DialerBackupUtils.getPhoneAccountsToArchive(this); - - if (autoBackupEnabled) { - if (!maxVoicemailBackupReached && vmBackupEnabled && !phoneAccountsToArchive.isEmpty()) { - voicemailsBackedupSoFar = 0; - sizeOfVoicemailsBackedupSoFar = 0; - - LogUtil.i("DialerBackupAgent.onFullBackup", "autoBackup is enabled"); - ContentResolver contentResolver = getContentResolver(); - int limit = 1000; - - Uri uri = - TelecomUtil.getCallLogUri(this) - .buildUpon() - .appendQueryParameter(Calls.LIMIT_PARAM_KEY, Integer.toString(limit)) - .build(); - - LogUtil.i("DialerBackupAgent.onFullBackup", "backing up from: " + uri); - - try (Cursor cursor = - contentResolver.query( - uri, - null, - String.format( - "(%s = ? AND deleted = 0 AND %s = ? AND ?)", - Calls.TYPE, Voicemails.SOURCE_PACKAGE), - new String[] { - Integer.toString(CallLog.Calls.VOICEMAIL_TYPE), - VOICEMAIL_SOURCE_PACKAGE, - DialerBackupUtils.getPhoneAccountClause(phoneAccountsToArchive) - }, - ORDER_BY_DATE, - null)) { - - if (cursor == null) { - LogUtil.i("DialerBackupAgent.onFullBackup", "cursor was null"); - return; - } - - LogUtil.i("DialerBackupAgent.onFullBackup", "cursor count: " + cursor.getCount()); - if (cursor.moveToFirst()) { - int fileNum = 0; - do { - backupRow( - data, cursor, String.format(Locale.US, VOICEMAIL_BACKUP_FILE_FORMAT, fileNum++)); - } while (cursor.moveToNext() && !maxVoicemailBackupReached); - } else { - LogUtil.i("DialerBackupAgent.onFullBackup", "cursor.moveToFirst failed"); - } - } - } - LogUtil.i( - "DialerBackupAgent.onFullBackup", - "vm files backed up: %d, vm size backed up:%d, " - + "max vm backup reached:%b, vm backup enabled:%b phone accounts to archive: %d", - voicemailsBackedupSoFar, - sizeOfVoicemailsBackedupSoFar, - maxVoicemailBackupReached, - vmBackupEnabled, - phoneAccountsToArchive.size()); - super.onFullBackup(data); - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_FULL_BACKED_UP); - } else { - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_ON_BACKUP_DISABLED); - LogUtil.i("DialerBackupAgent.onFullBackup", "autoBackup is disabled"); - } - } - - private void backupRow(FullBackupDataOutput data, Cursor cursor, String fileName) - throws IOException { - - VoicemailInfo cursorRowInProto = - DialerBackupUtils.convertVoicemailCursorRowToProto(cursor, getContentResolver()); - - File file = new File(getFilesDir(), fileName); - DialerBackupUtils.writeProtoToFile(file, cursorRowInProto); - - if (sizeOfVoicemailsBackedupSoFar + file.length() - > DialerBackupUtils.maxVoicemailSizeToBackup) { - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_MAX_VM_BACKUP_REACHED); - maxVoicemailBackupReached = true; - file.delete(); - return; - } - - backupFile(file, data); - } - - // TODO: Write to FullBackupDataOutput directly (b/33849960) - private void backupFile(File file, FullBackupDataOutput data) throws IOException { - try { - super.fullBackupFile(file, data); - sizeOfVoicemailsBackedupSoFar = sizeOfVoicemailsBackedupSoFar + file.length(); - voicemailsBackedupSoFar++; - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_VOICEMAIL_BACKED_UP); - LogUtil.i("DialerBackupAgent.backupFile", "file backed up:" + file.getAbsolutePath()); - } finally { - file.delete(); - } - } - - // Being tracked in b/33839952 - @Override - public void onQuotaExceeded(long backupDataBytes, long quotaBytes) { - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_ON_QUOTA_EXCEEDED); - LogUtil.i("DialerBackupAgent.onQuotaExceeded", "does nothing"); - } - - @TargetApi(VERSION_CODES.M) - @Override - public void onRestoreFile( - ParcelFileDescriptor data, long size, File destination, int type, long mode, long mtime) - throws IOException { - LogUtil.i("DialerBackupAgent.onRestoreFile", "size:" + size + " destination: " + destination); - - String fileName = destination.getName(); - LogUtil.i("DialerBackupAgent.onRestoreFile", "file name: " + fileName); - - if (ConfigProviderBindings.get(this).getBoolean("enable_autobackup", true)) { - if (fileName.endsWith(VOICEMAIL_BACKUP_FILE_SUFFIX) - && ConfigProviderBindings.get(this).getBoolean("enable_vm_restore", true)) { - if (DialerBackupUtils.canRestoreVoicemails(getContentResolver(), this)) { - try { - super.onRestoreFile(data, size, destination, type, mode, mtime); - restoreVoicemail(destination); - destination.delete(); - } catch (IOException e) { - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_ON_RESTORE_IO_EXCEPTION); - LogUtil.e( - "DialerBackupAgent.onRestoreFile", - "could not restore voicemail - IOException: ", - e); - } - } else { - LogUtil.i( - "DialerBackupAgent.onRestoreFile", "build does not support restoring voicemails"); - } - - } else { - super.onRestoreFile(data, size, destination, type, mode, mtime); - LogUtil.i("DialerBackupAgent.onRestoreFile", "restored: " + fileName); - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_RESTORED_FILE); - } - } else { - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_ON_RESTORE_DISABLED); - LogUtil.i("DialerBackupAgent.onRestoreFile", "autoBackup is disabled"); - } - } - - @Override - public void onRestoreFinished() { - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_ON_RESTORE_FINISHED); - LogUtil.i("DialerBackupAgent.onRestoreFinished", "do nothing"); - } - - @TargetApi(VERSION_CODES.M) - private void restoreVoicemail(File file) throws IOException { - Pair pair = - DialerBackupUtils.convertVoicemailProtoFileToContentValueAndAudioBytes( - file, getApplicationContext()); - - if (pair == null) { - LogUtil.i("DialerBackupAgent.restoreVoicemail", "not restoring VM due to duplicate"); - Logger.get(this) - .logImpression(DialerImpression.Type.BACKUP_ON_RESTORE_VM_DUPLICATE_NOT_RESTORING); - return; - } - - // TODO: Uniquely identify backup agent as the creator of this voicemail b/34084298 - try (OutputStream restoreStream = - getContentResolver() - .openOutputStream( - getContentResolver() - .insert(VoicemailContract.Voicemails.CONTENT_URI, pair.first))) { - DialerBackupUtils.copyAudioBytesToContentUri(pair.second, restoreStream); - Logger.get(this).logImpression(DialerImpression.Type.BACKUP_RESTORED_VOICEMAIL); - } - } -} diff --git a/java/com/android/dialer/backup/DialerBackupUtils.java b/java/com/android/dialer/backup/DialerBackupUtils.java deleted file mode 100644 index 17e82e45d..000000000 --- a/java/com/android/dialer/backup/DialerBackupUtils.java +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.backup; - -import android.annotation.TargetApi; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.os.Build.VERSION_CODES; -import android.provider.VoicemailContract; -import android.provider.VoicemailContract.Voicemails; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.telecom.PhoneAccountHandle; -import android.telecom.TelecomManager; -import android.util.Pair; -import com.android.dialer.common.Assert; -import com.android.dialer.common.ConfigProviderBindings; -import com.android.dialer.common.LogUtil; -import com.android.voicemail.VoicemailComponent; -import com.google.common.io.ByteStreams; -import com.google.common.io.Files; -import com.google.protobuf.ByteString; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - -/** Helper functions for DialerBackupAgent */ -public class DialerBackupUtils { - // Backup voicemails up to 20MB - static long maxVoicemailSizeToBackup = 20000000L; - static final String RESTORED_COLUMN = "restored"; - - private DialerBackupUtils() {} - - public static void copyAudioBytesToContentUri( - @NonNull byte[] audioBytesArray, @NonNull OutputStream restoreStream) throws IOException { - LogUtil.i("DialerBackupUtils.copyStream", "audioByteArray length: " + audioBytesArray.length); - - ByteArrayInputStream decodedStream = new ByteArrayInputStream(audioBytesArray); - LogUtil.i( - "DialerBackupUtils.copyStream", "decodedStream.available: " + decodedStream.available()); - - ByteStreams.copy(decodedStream, restoreStream); - } - - public static @Nullable ByteString audioStreamToByteString(@NonNull InputStream stream) - throws IOException { - if (stream.available() > 0) { - return ByteString.readFrom(stream); - } else { - LogUtil.i("DialerBackupUtils.audioStreamToByteArray", "no audio stream to backup"); - } - return ByteString.EMPTY; - } - - public static void writeProtoToFile(@NonNull File file, @NonNull VoicemailInfo voicemailInfo) - throws IOException { - LogUtil.i( - "DialerBackupUtils.writeProtoToFile", - "backup " + voicemailInfo + " to " + file.getAbsolutePath()); - - byte[] bytes = voicemailInfo.toByteArray(); - Files.write(bytes, file); - } - - /** Only restore voicemails that have the restored column in calllog (NMR2+ builds) */ - @TargetApi(VERSION_CODES.M) - public static boolean canRestoreVoicemails(ContentResolver contentResolver, Context context) { - try (Cursor cursor = contentResolver.query(Voicemails.CONTENT_URI, null, null, null, null)) { - // Restored column only exists in NMR2 and above builds. - if (cursor.getColumnIndex(RESTORED_COLUMN) != -1) { - LogUtil.i("DialerBackupUtils.canRestoreVoicemails", "Build supports restore"); - return true; - } else { - LogUtil.i("DialerBackupUtils.canRestoreVoicemails", "Build does not support restore"); - return false; - } - } - } - - public static VoicemailInfo protoFileToVoicemailInfo(@NonNull File file) throws IOException { - byte[] byteArray = Files.toByteArray(file); - return VoicemailInfo.parseFrom(byteArray); - } - - @TargetApi(VERSION_CODES.M) - public static VoicemailInfo convertVoicemailCursorRowToProto( - @NonNull Cursor cursor, @NonNull ContentResolver contentResolver) throws IOException { - - VoicemailInfo.Builder voicemailInfo = VoicemailInfo.newBuilder(); - - for (int i = 0; i < cursor.getColumnCount(); ++i) { - String name = cursor.getColumnName(i); - String value = cursor.getString(i); - - LogUtil.i( - "DialerBackupUtils.convertVoicemailCursorRowToProto", - "column index: %d, column name: %s, column value: %s", - i, - name, - value); - - switch (name) { - case Voicemails.DATE: - voicemailInfo.setDate(value); - break; - case Voicemails.DELETED: - voicemailInfo.setDeleted(value); - break; - case Voicemails.DIRTY: - voicemailInfo.setDirty(value); - break; - case Voicemails.DIR_TYPE: - voicemailInfo.setDirType(value); - break; - case Voicemails.DURATION: - voicemailInfo.setDuration(value); - break; - case Voicemails.HAS_CONTENT: - voicemailInfo.setHasContent(value); - break; - case Voicemails.IS_READ: - voicemailInfo.setIsRead(value); - break; - case Voicemails.ITEM_TYPE: - voicemailInfo.setItemType(value); - break; - case Voicemails.LAST_MODIFIED: - voicemailInfo.setLastModified(value); - break; - case Voicemails.MIME_TYPE: - voicemailInfo.setMimeType(value); - break; - case Voicemails.NUMBER: - voicemailInfo.setNumber(value); - break; - case Voicemails.PHONE_ACCOUNT_COMPONENT_NAME: - voicemailInfo.setPhoneAccountComponentName(value); - break; - case Voicemails.PHONE_ACCOUNT_ID: - voicemailInfo.setPhoneAccountId(value); - break; - case Voicemails.SOURCE_DATA: - voicemailInfo.setSourceData(value); - break; - case Voicemails.SOURCE_PACKAGE: - voicemailInfo.setSourcePackage(value); - break; - case Voicemails.TRANSCRIPTION: - voicemailInfo.setTranscription(value); - break; - case DialerBackupAgent.VOICEMAIL_URI: - try (InputStream audioStream = contentResolver.openInputStream(Uri.parse(value))) { - voicemailInfo.setEncodedVoicemailKey(audioStreamToByteString(audioStream)); - } - break; - default: - LogUtil.i( - "DialerBackupUtils.convertVoicemailCursorRowToProto", - "Not backing up column: %s, with value: %s", - name, - value); - break; - } - } - return voicemailInfo.build(); - } - - public static Pair convertVoicemailProtoFileToContentValueAndAudioBytes( - @NonNull File file, Context context) throws IOException { - - VoicemailInfo voicemailInfo = DialerBackupUtils.protoFileToVoicemailInfo(file); - LogUtil.i( - "DialerBackupUtils.convertVoicemailProtoFileToContentValueAndEncodedAudio", - "file name: " - + file.getName() - + " voicemailInfo size: " - + voicemailInfo.getSerializedSize()); - - if (isDuplicate(context, voicemailInfo)) { - LogUtil.i( - "DialerBackupUtils.convertVoicemailProtoFileToContentValueAndEncodedAudio", - "voicemail already exists"); - return null; - } else { - ContentValues contentValues = new ContentValues(); - - if (voicemailInfo.hasDate()) { - contentValues.put(Voicemails.DATE, voicemailInfo.getDate()); - } - if (voicemailInfo.hasDeleted()) { - contentValues.put(Voicemails.DELETED, voicemailInfo.getDeleted()); - } - if (!voicemailInfo.hasDirty()) { - contentValues.put(Voicemails.DIRTY, voicemailInfo.getDirty()); - } - if (!voicemailInfo.hasDuration()) { - contentValues.put(Voicemails.DURATION, voicemailInfo.getDuration()); - } - if (!voicemailInfo.hasIsRead()) { - contentValues.put(Voicemails.IS_READ, voicemailInfo.getIsRead()); - } - if (!voicemailInfo.hasLastModified()) { - contentValues.put(Voicemails.LAST_MODIFIED, voicemailInfo.getLastModified()); - } - if (!voicemailInfo.hasMimeType()) { - contentValues.put(Voicemails.MIME_TYPE, voicemailInfo.getMimeType()); - } - if (!voicemailInfo.hasNumber()) { - contentValues.put(Voicemails.NUMBER, voicemailInfo.getNumber()); - } - if (!voicemailInfo.hasPhoneAccountComponentName()) { - contentValues.put( - Voicemails.PHONE_ACCOUNT_COMPONENT_NAME, voicemailInfo.getPhoneAccountComponentName()); - } - if (!voicemailInfo.hasPhoneAccountId()) { - contentValues.put(Voicemails.PHONE_ACCOUNT_ID, voicemailInfo.getPhoneAccountId()); - } - if (!voicemailInfo.hasSourceData()) { - contentValues.put(Voicemails.SOURCE_DATA, voicemailInfo.getSourceData()); - } - if (!voicemailInfo.hasSourcePackage()) { - contentValues.put(Voicemails.SOURCE_PACKAGE, voicemailInfo.getSourcePackage()); - } - if (!voicemailInfo.hasTranscription()) { - contentValues.put(Voicemails.TRANSCRIPTION, voicemailInfo.getTranscription()); - } - contentValues.put(VoicemailContract.Voicemails.HAS_CONTENT, 1); - contentValues.put(RESTORED_COLUMN, "1"); - contentValues.put(Voicemails.SOURCE_PACKAGE, getSourcePackage(context, voicemailInfo)); - - LogUtil.i( - "DialerBackupUtils.convertVoicemailProtoFileToContentValueAndEncodedAudio", - "cv: " + contentValues); - - return Pair.create(contentValues, voicemailInfo.getEncodedVoicemailKey().toByteArray()); - } - } - - /** - * We should be using the system package name as the source package if there is no endless VM/VM - * archive present on the device. This is to separate pre-O (no endless VM) and O+ (endless VM) - * devices. This ensures that the source of truth for VMs is the VM server when endless VM is not - * enabled, and when endless VM/archived VMs is present, the source of truth for VMs is the device - * itself. - */ - private static String getSourcePackage(Context context, VoicemailInfo voicemailInfo) { - if (ConfigProviderBindings.get(context) - .getBoolean("voicemail_restore_force_system_source_package", false)) { - LogUtil.i("DialerBackupUtils.getSourcePackage", "forcing system source package"); - return "com.android.phone"; - } - if (ConfigProviderBindings.get(context) - .getBoolean("voicemail_restore_check_archive_for_source_package", true)) { - if ("1".equals(voicemailInfo.getArchived())) { - LogUtil.i( - "DialerBackupUtils.getSourcePackage", - "voicemail was archived, using app source package"); - // Using our app's source package will prevent the archived voicemail from being deleted by - // the system when it syncs with the voicemail server. In most cases the user will not see - // duplicate voicemails because this voicemail was archived and likely deleted from the - // voicemail server. - return context.getPackageName(); - } else { - // Use the system source package. This means that if the voicemail is not present on the - // voicemail server then the system will delete it when it syncs. - LogUtil.i( - "DialerBackupUtils.getSourcePackage", - "voicemail was not archived, using system source package"); - return "com.android.phone"; - } - } - // Use our app's source package. This means that if the system syncs voicemail from the server - // the user could potentially get duplicate voicemails. - LogUtil.i("DialerBackupUtils.getSourcePackage", "defaulting to using app source package"); - return context.getPackageName(); - } - - @TargetApi(VERSION_CODES.M) - private static boolean isDuplicate(Context context, VoicemailInfo voicemailInfo) { - // This checks for VM that might already exist, and doesn't restore them - try (Cursor cursor = - context - .getContentResolver() - .query( - VoicemailContract.Voicemails.CONTENT_URI, - null, - String.format( - "(%s = ? AND %s = ? AND %s = ?)", - Voicemails.NUMBER, Voicemails.DATE, Voicemails.DURATION), - new String[] { - voicemailInfo.getNumber(), voicemailInfo.getDate(), voicemailInfo.getDuration() - }, - null, - null)) { - if (cursor.moveToFirst() - && ConfigProviderBindings.get(context) - .getBoolean("enable_vm_restore_no_duplicate", true)) { - return true; - } - } - return false; - } - - public static String getPhoneAccountClause(List phoneAccountsToArchive) { - Assert.checkArgument(!phoneAccountsToArchive.isEmpty()); - StringBuilder whereQuery = new StringBuilder(); - - whereQuery.append("("); - - for (int i = 0; i < phoneAccountsToArchive.size(); i++) { - whereQuery.append( - Voicemails.PHONE_ACCOUNT_ID + " = " + phoneAccountsToArchive.get(i).getId()); - - if (phoneAccountsToArchive.size() > 1 && i < phoneAccountsToArchive.size() - 1) { - whereQuery.append(" OR "); - } - } - whereQuery.append(")"); - return whereQuery.toString(); - } - - public static List getPhoneAccountsToArchive(Context context) { - List phoneAccountsToBackUp = new ArrayList<>(); - - for (PhoneAccountHandle handle : - context.getSystemService(TelecomManager.class).getCallCapablePhoneAccounts()) { - - if (VoicemailComponent.get(context) - .getVoicemailClient() - .isVoicemailArchiveEnabled(context, handle)) { - phoneAccountsToBackUp.add(handle); - LogUtil.i( - "DialerBackupUtils.getPhoneAccountsToArchive", "enabled for: " + handle.toString()); - } else { - LogUtil.i( - "DialerBackupUtils.getPhoneAccountsToArchive", "not enabled for: " + handle.toString()); - } - } - return phoneAccountsToBackUp; - } -} diff --git a/java/com/android/dialer/backup/DialerPersistentBackupAgent.java b/java/com/android/dialer/backup/DialerPersistentBackupAgent.java new file mode 100644 index 000000000..18cb084c2 --- /dev/null +++ b/java/com/android/dialer/backup/DialerPersistentBackupAgent.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.dialer.backup; + +import android.app.backup.BackupDataInput; +import android.app.backup.BackupDataOutput; +import android.os.ParcelFileDescriptor; +import android.support.annotation.NonNull; +import android.support.annotation.VisibleForTesting; +import android.util.ArrayMap; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; +import com.google.android.libraries.backup.BackupKeyPredicate; +import com.google.android.libraries.backup.BackupKeyPredicates; +import com.google.android.libraries.backup.PersistentBackupAgentHelper; +import java.io.IOException; +import java.util.Map; + +/** Implementation of Key/Value Backup that powers Dialer's backup and restore. */ +public class DialerPersistentBackupAgent extends PersistentBackupAgentHelper { + + private static final String[] BACKUP_NAMED_SHARED_PREFS = { + "com.google.android.dialer_preferences", "com.google.android.dialer", "com.android.dialer" + }; + + @NonNull private final String[] sharedPreferencesToBackup; + + @VisibleForTesting(otherwise = VisibleForTesting.NONE) + DialerPersistentBackupAgent(@NonNull String[] sharedPrefs) { + this.sharedPreferencesToBackup = Assert.isNotNull(sharedPrefs); + Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_BACKUP_AGENT_CONSTRUCTOR); + } + + public DialerPersistentBackupAgent() { + this(BACKUP_NAMED_SHARED_PREFS); + } + + @Override + public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor stateFile) + throws IOException { + Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_ON_RESTORE); + LogUtil.i("DialerPersistentBackupAgent.onRestore", "restore from version: " + appVersionCode); + super.onRestore(data, appVersionCode, stateFile); + } + + @Override + public void onBackup( + ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) + throws IOException { + Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_ON_BACKUP); + LogUtil.i("DialerPersistentBackupAgent.onBackup", "onBackup being performed"); + super.onBackup(oldState, data, newState); + } + + @Override + public Map getBackupSpecification() { + Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_GET_BACKUP_SPECIFICATION); + LogUtil.i( + "DialerPersistentBackupAgent.getBackupSpecification", + "number of files being backed up: " + sharedPreferencesToBackup.length); + + Map arrayMap = new ArrayMap<>(); + for (String fileName : sharedPreferencesToBackup) { + LogUtil.i("DialerPersistentBackupAgent.getBackupSpecification", "arrayMap.put: " + fileName); + arrayMap.put(fileName, BackupKeyPredicates.alwaysTrue()); + } + + return arrayMap; + } + + @Override + public void onRestoreFinished() { + Logger.get(this).logImpression(DialerImpression.Type.BACKUP_KEY_VALUE_ON_RESTORE_FINISHED); + super.onRestoreFinished(); + } +} diff --git a/java/com/android/dialer/backup/proto/voicemail_info.proto b/java/com/android/dialer/backup/proto/voicemail_info.proto deleted file mode 100644 index b74cce954..000000000 --- a/java/com/android/dialer/backup/proto/voicemail_info.proto +++ /dev/null @@ -1,30 +0,0 @@ -syntax = "proto2"; - -option java_package = "com.android.dialer.backup"; -option java_multiple_files = true; -option optimize_for = LITE_RUNTIME; - -package com.android.dialer.backup; - -// Next id: 20 -message VoicemailInfo { - optional string date = 1; - optional string deleted = 2; - optional string dirty = 3; - optional string dir_type = 4; - optional string duration = 5; - optional string has_content = 6; - optional string is_read = 7; - optional string item_type = 8; - optional string last_modified = 9; - optional string mime_type = 10; - optional string number = 11; - optional string phone_account_component_name = 12; - optional string phone_account_id = 13; - optional string source_data = 14; - optional string source_package = 15; - optional string transcription = 16; - optional string voicemail_uri = 17; - optional bytes encoded_voicemail_key = 18; - optional string archived = 19; -} diff --git a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java index 595401c70..50db7f751 100644 --- a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java +++ b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java @@ -18,10 +18,14 @@ package com.android.dialer.binary.aosp; import com.android.dialer.binary.basecomponent.BaseDialerRootComponent; import com.android.dialer.calllog.CallLogModule; +import com.android.dialer.common.concurrent.DialerExecutorModule; +import com.android.dialer.configprovider.SharedPrefConfigProviderModule; import com.android.dialer.enrichedcall.stub.StubEnrichedCallModule; import com.android.dialer.inject.ContextModule; import com.android.dialer.lightbringer.stub.StubLightbringerModule; +import com.android.dialer.phonenumbergeoutil.impl.PhoneNumberGeoUtilModule; import com.android.dialer.simulator.impl.SimulatorModule; +import com.android.dialer.storage.StorageModule; import com.android.incallui.calllocation.stub.StubCallLocationModule; import com.android.incallui.maps.stub.StubMapsModule; import com.android.voicemail.impl.VoicemailModule; @@ -34,7 +38,11 @@ import javax.inject.Singleton; modules = { CallLogModule.class, ContextModule.class, + DialerExecutorModule.class, + PhoneNumberGeoUtilModule.class, + SharedPrefConfigProviderModule.class, SimulatorModule.class, + StorageModule.class, StubCallLocationModule.class, StubEnrichedCallModule.class, StubMapsModule.class, diff --git a/java/com/android/dialer/binary/aosp/testing/AndroidManifest.xml b/java/com/android/dialer/binary/aosp/testing/AndroidManifest.xml new file mode 100644 index 000000000..15870cb85 --- /dev/null +++ b/java/com/android/dialer/binary/aosp/testing/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/java/com/android/dialer/binary/aosp/testing/TestActivity.java b/java/com/android/dialer/binary/aosp/testing/TestActivity.java new file mode 100644 index 000000000..9cb26dab7 --- /dev/null +++ b/java/com/android/dialer/binary/aosp/testing/TestActivity.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.binary.aosp.testing; + +import android.app.Activity; + +/** + * An empty Activity to use in tests. This can be useful when UI needs to be tested outside an + * Activity, either as a background or to keep the test framework running. + */ +public class TestActivity extends Activity {} diff --git a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java index 2deb7fdc4..30b1e8a15 100644 --- a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java +++ b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java @@ -17,9 +17,15 @@ package com.android.dialer.binary.basecomponent; import com.android.dialer.calllog.CallLogComponent; +import com.android.dialer.calllog.database.CallLogDatabaseComponent; +import com.android.dialer.common.concurrent.DialerExecutorComponent; +import com.android.dialer.configprovider.ConfigProviderComponent; import com.android.dialer.enrichedcall.EnrichedCallComponent; import com.android.dialer.lightbringer.LightbringerComponent; +import com.android.dialer.main.MainComponent; +import com.android.dialer.phonenumbergeoutil.PhoneNumberGeoUtilComponent; import com.android.dialer.simulator.SimulatorComponent; +import com.android.dialer.storage.StorageComponent; import com.android.incallui.calllocation.CallLocationComponent; import com.android.incallui.maps.MapsComponent; import com.android.voicemail.VoicemailComponent; @@ -31,8 +37,14 @@ import com.android.voicemail.VoicemailComponent; public interface BaseDialerRootComponent extends CallLocationComponent.HasComponent, CallLogComponent.HasComponent, + CallLogDatabaseComponent.HasComponent, + ConfigProviderComponent.HasComponent, + DialerExecutorComponent.HasComponent, + MainComponent.HasComponent, EnrichedCallComponent.HasComponent, MapsComponent.HasComponent, + PhoneNumberGeoUtilComponent.HasComponent, SimulatorComponent.HasComponent, + StorageComponent.HasComponent, VoicemailComponent.HasComponent, LightbringerComponent.HasComponent {} diff --git a/java/com/android/dialer/binary/common/DialerApplication.java b/java/com/android/dialer/binary/common/DialerApplication.java index a4c2e7d6f..580e0a3a5 100644 --- a/java/com/android/dialer/binary/common/DialerApplication.java +++ b/java/com/android/dialer/binary/common/DialerApplication.java @@ -17,17 +17,17 @@ package com.android.dialer.binary.common; import android.app.Application; -import android.os.StrictMode; import android.os.Trace; import android.support.annotation.NonNull; +import android.support.v4.os.BuildCompat; import com.android.dialer.blocking.BlockedNumbersAutoMigrator; import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; -import com.android.dialer.buildtype.BuildType; import com.android.dialer.calllog.CallLogComponent; import com.android.dialer.common.concurrent.DefaultDialerExecutorFactory; import com.android.dialer.inject.HasRootComponent; import com.android.dialer.notification.NotificationChannelManager; import com.android.dialer.persistentlog.PersistentLogger; +import com.android.dialer.strictmode.DialerStrictMode; /** A common application subclass for all Dialer build variants. */ public abstract class DialerApplication extends Application implements HasRootComponent { @@ -37,9 +37,8 @@ public abstract class DialerApplication extends Application implements HasRootCo @Override public void onCreate() { Trace.beginSection("DialerApplication.onCreate"); - if (BuildType.get() == BuildType.BUGFOOD) { - enableStrictMode(); - } + DialerStrictMode.onApplicationCreate(this); + super.onCreate(); new BlockedNumbersAutoMigrator( this.getApplicationContext(), @@ -49,16 +48,12 @@ public abstract class DialerApplication extends Application implements HasRootCo CallLogComponent.get(this).callLogFramework().registerContentObservers(getApplicationContext()); PersistentLogger.initialize(this); - NotificationChannelManager.getInstance().firstInitIfNeeded(this); + if (BuildCompat.isAtLeastO()) { + NotificationChannelManager.initChannels(this); + } Trace.endSection(); } - private void enableStrictMode() { - StrictMode.setThreadPolicy( - new StrictMode.ThreadPolicy.Builder().detectAll().penaltyDeath().build()); - StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyDeath().build()); - } - /** * Returns a new instance of the root component for the application. Sub classes should define a * root component that extends all the sub components "HasComponent" intefaces. The component diff --git a/java/com/android/dialer/binary/google/AndroidManifest.xml b/java/com/android/dialer/binary/google/AndroidManifest.xml new file mode 100644 index 000000000..12abe82ac --- /dev/null +++ b/java/com/android/dialer/binary/google/AndroidManifest.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com/android/dialer/binary/google/GoogleStubDialerApplication.java b/java/com/android/dialer/binary/google/GoogleStubDialerApplication.java new file mode 100644 index 000000000..e9289af73 --- /dev/null +++ b/java/com/android/dialer/binary/google/GoogleStubDialerApplication.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.binary.google; + +import android.support.annotation.NonNull; +import com.android.dialer.binary.common.DialerApplication; +import com.android.dialer.inject.ContextModule; + +/** + * The application class for the Google Stub Dialer. This is a version of the Dialer app that + * depends on Google Play Services. + */ +public class GoogleStubDialerApplication extends DialerApplication { + + /** Returns a new instance of the root component for the Google Stub Dialer. */ + @Override + @NonNull + protected Object buildRootComponent() { + return DaggerGoogleStubDialerRootComponent.builder() + .contextModule(new ContextModule(this)) + .build(); + } +} diff --git a/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java new file mode 100644 index 000000000..cf513777c --- /dev/null +++ b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.binary.google; + +import com.android.dialer.binary.basecomponent.BaseDialerRootComponent; +import com.android.dialer.calllog.CallLogModule; +import com.android.dialer.common.concurrent.DialerExecutorModule; +import com.android.dialer.configprovider.SharedPrefConfigProviderModule; +import com.android.dialer.enrichedcall.stub.StubEnrichedCallModule; +import com.android.dialer.inject.ContextModule; +import com.android.dialer.lightbringer.stub.StubLightbringerModule; +import com.android.dialer.phonenumbergeoutil.impl.PhoneNumberGeoUtilModule; +import com.android.dialer.simulator.impl.SimulatorModule; +import com.android.dialer.storage.StorageModule; +import com.android.incallui.calllocation.impl.CallLocationModule; +import com.android.incallui.maps.impl.MapsModule; +import com.android.voicemail.impl.VoicemailModule; +import dagger.Component; +import javax.inject.Singleton; + +/** + * Root component for the Google Stub Dialer application. Unlike the AOSP variant, this component + * can pull in modules that depend on Google Play Services like the maps module. + */ +@Singleton +@Component( + modules = { + CallLocationModule.class, + CallLogModule.class, + ContextModule.class, + DialerExecutorModule.class, + PhoneNumberGeoUtilModule.class, + SharedPrefConfigProviderModule.class, + SimulatorModule.class, + StorageModule.class, + StubEnrichedCallModule.class, + MapsModule.class, + VoicemailModule.class, + StubLightbringerModule.class + } +) +public interface GoogleStubDialerRootComponent extends BaseDialerRootComponent {} diff --git a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java index fa74850ba..62bb9f39b 100644 --- a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java +++ b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java @@ -262,7 +262,7 @@ public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler { } /* - * TODO: b/27779827, non-e164 numbers can be blocked in the new form of blocking. As a + * TODO(maxwelb): b/27779827, non-e164 numbers can be blocked in the new form of blocking. As a * temporary workaround, determine which column of the database to query based on whether the * number is e164 or not. */ @@ -297,7 +297,9 @@ public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler { public void blockNumber(final OnBlockNumberListener listener, ContentValues values) { blockedNumberCache.clear(); if (!FilteredNumberCompat.canAttemptBlockOperations(context)) { - listener.onBlockComplete(null); + if (listener != null) { + listener.onBlockComplete(null); + } return; } startInsert( diff --git a/java/com/android/dialer/blocking/FilteredNumberCompat.java b/java/com/android/dialer/blocking/FilteredNumberCompat.java index 9e0112762..548c965ad 100644 --- a/java/com/android/dialer/blocking/FilteredNumberCompat.java +++ b/java/com/android/dialer/blocking/FilteredNumberCompat.java @@ -38,6 +38,7 @@ import com.android.dialer.database.FilteredNumberContract.FilteredNumber; import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns; import com.android.dialer.database.FilteredNumberContract.FilteredNumberSources; import com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes; +import com.android.dialer.strictmode.DialerStrictMode; import com.android.dialer.telecom.TelecomUtil; import java.util.ArrayList; import java.util.List; @@ -124,8 +125,10 @@ public class FilteredNumberCompat { * android.provider.BlockedNumberContract} blocking, {@code false} otherwise. */ public static boolean hasMigratedToNewBlocking(Context context) { - return PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false); + return DialerStrictMode.bypass( + () -> + PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false)); } /** @@ -270,7 +273,7 @@ public class FilteredNumberCompat { } // Great Wall blocking, must be primary user and the default or system dialer - // TODO: check that we're the system Dialer + // TODO(maxwelb): check that we're the system Dialer return TelecomUtil.isDefaultDialer(context) && safeBlockedNumbersContractCanCurrentUserBlockNumbers(context); } diff --git a/java/com/android/dialer/blocking/FilteredNumbersUtil.java b/java/com/android/dialer/blocking/FilteredNumbersUtil.java index cdcf1f78d..fba3b86db 100644 --- a/java/com/android/dialer/blocking/FilteredNumbersUtil.java +++ b/java/com/android/dialer/blocking/FilteredNumbersUtil.java @@ -16,7 +16,6 @@ package com.android.dialer.blocking; import android.app.Notification; -import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ContentValues; import android.content.Context; @@ -27,6 +26,7 @@ import android.provider.ContactsContract.Contacts; import android.provider.Settings; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; +import android.support.v4.os.BuildCompat; import android.support.v4.os.UserManagerCompat; import android.telephony.PhoneNumberUtils; import android.text.TextUtils; @@ -35,8 +35,8 @@ import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnHasBlockedN import com.android.dialer.common.LogUtil; import com.android.dialer.logging.InteractionEvent; import com.android.dialer.logging.Logger; -import com.android.dialer.notification.NotificationChannelManager; -import com.android.dialer.notification.NotificationChannelManager.Channel; +import com.android.dialer.notification.DialerNotificationManager; +import com.android.dialer.notification.NotificationChannelId; import com.android.dialer.util.DialerUtils; import com.android.dialer.util.PermissionsUtil; import java.util.concurrent.TimeUnit; @@ -45,8 +45,7 @@ import java.util.concurrent.TimeUnit; public class FilteredNumbersUtil { public static final String CALL_BLOCKING_NOTIFICATION_TAG = "call_blocking"; - public static final int CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID = - R.id.notification_call_blocking_disabled_by_emergency_call; + public static final int CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID = 10; // Pref key for storing the time of end of the last emergency call in milliseconds after epoch.\ @VisibleForTesting public static final String LAST_EMERGENCY_CALL_MS_PREF_KEY = "last_emergency_call_ms"; @@ -243,8 +242,6 @@ public class FilteredNumbersUtil { return; } - NotificationManager notificationManager = - (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); Notification.Builder builder = new Notification.Builder(context) .setSmallIcon(R.drawable.quantum_ic_block_white_24) @@ -254,7 +251,9 @@ public class FilteredNumbersUtil { context.getString(R.string.call_blocking_disabled_notification_text)) .setAutoCancel(true); - NotificationChannelManager.applyChannel(builder, context, Channel.DEFAULT, null); + if (BuildCompat.isAtLeastO()) { + builder.setChannelId(NotificationChannelId.DEFAULT); + } builder.setContentIntent( PendingIntent.getActivity( context, @@ -262,7 +261,8 @@ public class FilteredNumbersUtil { FilteredNumberCompat.createManageBlockedNumbersIntent(context), PendingIntent.FLAG_UPDATE_CURRENT)); - notificationManager.notify( + DialerNotificationManager.notify( + context, CALL_BLOCKING_NOTIFICATION_TAG, CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID, builder.build()); diff --git a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png deleted file mode 100644 index 2ccc89d24..000000000 Binary files a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png and /dev/null differ diff --git a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png deleted file mode 100644 index dc0c995c1..000000000 Binary files a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png and /dev/null differ diff --git a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png deleted file mode 100644 index 919a872e0..000000000 Binary files a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png and /dev/null differ diff --git a/java/com/android/dialer/blocking/res/values-hu/strings.xml b/java/com/android/dialer/blocking/res/values-hu/strings.xml index 10704546d..7981d6c14 100644 --- a/java/com/android/dialer/blocking/res/values-hu/strings.xml +++ b/java/com/android/dialer/blocking/res/values-hu/strings.xml @@ -33,7 +33,7 @@ "VISSZAVONÁS" "Az importálás nem sikerült" "A hívások tiltása funkció kikapcsolva 48 órára" - "Letiltva vészhívás miatt." + "Letiltva segélyhívás miatt." "Letiltja a következő számot: %1$s?" "A jövőben nem fogad hívásokat erről a számról." "%1$s A hívást spamként jelentjük be." diff --git a/java/com/android/dialer/buildtype/bugfood/BuildTypeAccessorImpl.java b/java/com/android/dialer/buildtype/bugfood/BuildTypeAccessorImpl.java new file mode 100644 index 000000000..45d72e05c --- /dev/null +++ b/java/com/android/dialer/buildtype/bugfood/BuildTypeAccessorImpl.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.buildtype; + +import com.android.dialer.proguard.UsedByReflection; + +/** Gets the build type. */ +@UsedByReflection(value = "BuildType.java") +public class BuildTypeAccessorImpl implements BuildTypeAccessor { + + @Override + @BuildType.Type + public int getBuildType() { + return BuildType.BUGFOOD; + } +} diff --git a/java/com/android/dialer/buildtype/dogfood/BuildTypeAccessorImpl.java b/java/com/android/dialer/buildtype/dogfood/BuildTypeAccessorImpl.java new file mode 100644 index 000000000..e1f2cdc79 --- /dev/null +++ b/java/com/android/dialer/buildtype/dogfood/BuildTypeAccessorImpl.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.buildtype; + +import com.android.dialer.proguard.UsedByReflection; + +/** Gets the build type. */ +@UsedByReflection(value = "BuildType.java") +public class BuildTypeAccessorImpl implements BuildTypeAccessor { + + @Override + @BuildType.Type + public int getBuildType() { + return BuildType.DOGFOOD; + } +} diff --git a/java/com/android/dialer/buildtype/fishfood/BuildTypeAccessorImpl.java b/java/com/android/dialer/buildtype/fishfood/BuildTypeAccessorImpl.java new file mode 100644 index 000000000..e5ad9015f --- /dev/null +++ b/java/com/android/dialer/buildtype/fishfood/BuildTypeAccessorImpl.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.buildtype; + +import com.android.dialer.proguard.UsedByReflection; + +/** Gets the build type. */ +@UsedByReflection(value = "BuildType.java") +public class BuildTypeAccessorImpl implements BuildTypeAccessor { + + @Override + @BuildType.Type + public int getBuildType() { + return BuildType.FISHFOOD; + } +} diff --git a/java/com/android/dialer/buildtype/test/BuildTypeAccessorImpl.java b/java/com/android/dialer/buildtype/test/BuildTypeAccessorImpl.java new file mode 100644 index 000000000..80a1cb728 --- /dev/null +++ b/java/com/android/dialer/buildtype/test/BuildTypeAccessorImpl.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.buildtype; + +import com.android.dialer.proguard.UsedByReflection; + +/** Gets the build type. */ +@UsedByReflection(value = "BuildType.java") +public class BuildTypeAccessorImpl implements BuildTypeAccessor { + + @Override + @BuildType.Type + public int getBuildType() { + return BuildType.TEST; + } +} diff --git a/java/com/android/dialer/callcomposer/AndroidManifest.xml b/java/com/android/dialer/callcomposer/AndroidManifest.xml index 369db6f4a..cce71105f 100644 --- a/java/com/android/dialer/callcomposer/AndroidManifest.xml +++ b/java/com/android/dialer/callcomposer/AndroidManifest.xml @@ -17,7 +17,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.dialer.callcomposer"> - + { + LogUtil.i("CallComposerActivity.sessionStartedTimedOutRunnable", "session never started"); + setFailedResultAndFinish(); + }; + private final Runnable placeTelecomCallRunnable = + () -> { + LogUtil.i("CallComposerActivity.placeTelecomCallRunnable", "upload timed out."); + placeTelecomCall(); + }; + // Counter for the number of message sent updates received from EnrichedCallManager + private int messageSentCounter; + private boolean pendingCallStarted; + + private DialerContact contact; private Long sessionId = Session.NO_SESSION_ID; private TextView nameView; @@ -113,23 +141,25 @@ public class CallComposerActivity extends AppCompatActivity private View sendAndCall; private TextView sendAndCallText; + private ProgressBar loading; private ImageView cameraIcon; private ImageView galleryIcon; private ImageView messageIcon; - private ViewPager pager; + private LockableViewPager pager; private CallComposerPagerAdapter adapter; private FrameLayout background; private LinearLayout windowContainer; + private DialerExecutor copyAndResizeExecutor; private FastOutSlowInInterpolator interpolator; private boolean shouldAnimateEntrance = true; private boolean inFullscreenMode; private boolean isSendAndCallHidingOrHidden = true; - private boolean layoutChanged; + private boolean sendAndCallReady; private int currentIndex; - public static Intent newIntent(Context context, CallComposerContact contact) { + public static Intent newIntent(Context context, DialerContact contact) { Intent intent = new Intent(context, CallComposerActivity.class); ProtoParsers.put(intent, ARG_CALL_COMPOSER_CONTACT, contact); return intent; @@ -140,19 +170,20 @@ public class CallComposerActivity extends AppCompatActivity super.onCreate(savedInstanceState); setContentView(R.layout.call_composer_activity); - nameView = (TextView) findViewById(R.id.contact_name); - numberView = (TextView) findViewById(R.id.phone_number); - contactPhoto = (QuickContactBadge) findViewById(R.id.contact_photo); - cameraIcon = (ImageView) findViewById(R.id.call_composer_camera); - galleryIcon = (ImageView) findViewById(R.id.call_composer_photo); - messageIcon = (ImageView) findViewById(R.id.call_composer_message); - contactContainer = (RelativeLayout) findViewById(R.id.contact_bar); - pager = (ViewPager) findViewById(R.id.call_composer_view_pager); - background = (FrameLayout) findViewById(R.id.background); - windowContainer = (LinearLayout) findViewById(R.id.call_composer_container); - toolbar = (DialerToolbar) findViewById(R.id.toolbar); + nameView = findViewById(R.id.contact_name); + numberView = findViewById(R.id.phone_number); + contactPhoto = findViewById(R.id.contact_photo); + cameraIcon = findViewById(R.id.call_composer_camera); + galleryIcon = findViewById(R.id.call_composer_photo); + messageIcon = findViewById(R.id.call_composer_message); + contactContainer = findViewById(R.id.contact_bar); + pager = findViewById(R.id.call_composer_view_pager); + background = findViewById(R.id.background); + windowContainer = findViewById(R.id.call_composer_container); + toolbar = findViewById(R.id.toolbar); sendAndCall = findViewById(R.id.send_and_call_button); - sendAndCallText = (TextView) findViewById(R.id.send_and_call_text); + sendAndCallText = findViewById(R.id.send_and_call_text); + loading = findViewById(R.id.call_composer_loading); interpolator = new FastOutSlowInInterpolator(); adapter = @@ -162,7 +193,6 @@ public class CallComposerActivity extends AppCompatActivity pager.setAdapter(adapter); pager.addOnPageChangeListener(this); - background.addOnLayoutChangeListener(this); cameraIcon.setOnClickListener(this); galleryIcon.setOnClickListener(this); messageIcon.setOnClickListener(this); @@ -172,17 +202,13 @@ public class CallComposerActivity extends AppCompatActivity if (savedInstanceState != null) { shouldAnimateEntrance = savedInstanceState.getBoolean(ENTRANCE_ANIMATION_KEY); + sendAndCallReady = savedInstanceState.getBoolean(SEND_AND_CALL_READY_KEY); pager.onRestoreInstanceState(savedInstanceState.getParcelable(VIEW_PAGER_STATE_KEY)); currentIndex = savedInstanceState.getInt(CURRENT_INDEX_KEY); sessionId = savedInstanceState.getLong(SESSION_ID_KEY, Session.NO_SESSION_ID); onPageSelected(currentIndex); } - int adjustMode = - isLandscapeLayout() - ? LayoutParams.SOFT_INPUT_ADJUST_PAN - : LayoutParams.SOFT_INPUT_ADJUST_RESIZE; - getWindow().setSoftInputMode(adjustMode); // Since we can't animate the views until they are ready to be drawn, we use this listener to // track that and animate the call compose UI as soon as it's ready. ViewUtil.doOnPreDraw( @@ -194,13 +220,42 @@ public class CallComposerActivity extends AppCompatActivity }); setMediaIconSelected(currentIndex); + + copyAndResizeExecutor = + DialerExecutors.createUiTaskBuilder( + getFragmentManager(), + "copyAndResizeImageToSend", + new CopyAndResizeImageWorker(this.getApplicationContext())) + .onSuccess(this::onCopyAndResizeImageSuccess) + .onFailure(this::onCopyAndResizeImageFailure) + .build(); + } + + private void onCopyAndResizeImageSuccess(Pair output) { + Uri shareableUri = + FileProvider.getUriForFile( + CallComposerActivity.this, Constants.get().getFileProviderAuthority(), output.first); + + placeRCSCall( + MultimediaData.builder().setImage(grantUriPermission(shareableUri), output.second)); + } + + private void onCopyAndResizeImageFailure(Throwable throwable) { + // TODO(b/34279096) - gracefully handle message failure + LogUtil.e("CallComposerActivity.onCopyAndResizeImageFailure", "copy Failed", throwable); } @Override protected void onResume() { super.onResume(); getEnrichedCallManager().registerStateChangedListener(this); - if (sessionId == Session.NO_SESSION_ID) { + if (pendingCallStarted) { + // User went into incall ui and pressed disconnect before the image was done uploading. + // Kill the activity and cancel the telecom call. + timeoutHandler.removeCallbacks(placeTelecomCallRunnable); + setResult(RESULT_OK); + finish(); + } else if (sessionId == Session.NO_SESSION_ID) { LogUtil.i("CallComposerActivity.onResume", "creating new session"); sessionId = getEnrichedCallManager().startCallComposerSession(contact.getNumber()); } else if (getEnrichedCallManager().getSession(sessionId) == null) { @@ -218,11 +273,16 @@ public class CallComposerActivity extends AppCompatActivity } @Override - protected void onPause() { - super.onPause(); + protected void onDestroy() { + super.onDestroy(); getEnrichedCallManager().unregisterStateChangedListener(this); + timeoutHandler.removeCallbacksAndMessages(null); } + /** + * This listener is registered in onResume and removed in onDestroy, meaning that calls to this + * method can come after onStop and updates to UI could cause crashes. + */ @Override public void onEnrichedCallStateChanged() { refreshUiForCallComposerState(); @@ -240,12 +300,50 @@ public class CallComposerActivity extends AppCompatActivity "state: %s", StateExtension.toString(state)); - if (state == EnrichedCallManager.STATE_START_FAILED - || state == EnrichedCallManager.STATE_CLOSED) { - setFailedResultAndFinish(); + switch (state) { + case Session.STATE_STARTING: + timeoutHandler.postDelayed(sessionStartedTimedOut, getSessionStartedTimeoutMillis()); + if (sendAndCallReady) { + showLoadingUi(); + } + break; + case Session.STATE_STARTED: + timeoutHandler.removeCallbacks(sessionStartedTimedOut); + if (sendAndCallReady) { + sendAndCall(); + } + break; + case Session.STATE_START_FAILED: + case Session.STATE_CLOSED: + if (pendingCallStarted) { + placeTelecomCall(); + } else { + setFailedResultAndFinish(); + } + break; + case Session.STATE_MESSAGE_SENT: + if (++messageSentCounter == 3) { + // When we compose EC with images, there are 3 steps: + // 1. Message sent with no data + // 2. Image uploaded + // 3. url sent + // Once we receive 3 message sent updates, we know that we can proceed with the call. + timeoutHandler.removeCallbacks(placeTelecomCallRunnable); + placeTelecomCall(); + } + break; + case Session.STATE_MESSAGE_FAILED: + case Session.STATE_NONE: + default: + break; } } + @VisibleForTesting + public long getSessionStartedTimeoutMillis() { + return ConfigProviderBindings.get(this).getLong("ec_session_started_timeout", 10_000); + } + @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -264,13 +362,15 @@ public class CallComposerActivity extends AppCompatActivity } else if (view == sendAndCall) { sendAndCall(); } else { - Assert.fail(); + throw Assert.createIllegalStateFailException("View on click not implemented: " + view); } } @Override public void sendAndCall() { if (!sessionReady()) { + sendAndCallReady = true; + showLoadingUi(); LogUtil.i("CallComposerActivity.onClick", "sendAndCall pressed, but the session isn't ready"); Logger.get(this) .logImpression( @@ -292,28 +392,8 @@ public class CallComposerActivity extends AppCompatActivity GalleryComposerFragment galleryComposerFragment = (GalleryComposerFragment) fragment; // If the current data is not a copy, make one. if (!galleryComposerFragment.selectedDataIsCopy()) { - DialerExecutors.createUiTaskBuilder( - getFragmentManager(), - "copyAndResizeImageToSend", - new CopyAndResizeImageWorker(this.getApplicationContext())) - .onSuccess( - output -> { - Uri shareableUri = - FileProvider.getUriForFile( - CallComposerActivity.this, - Constants.get().getFileProviderAuthority(), - output.first); - - builder.setImage(grantUriPermission(shareableUri), output.second); - placeRCSCall(builder); - }) - .onFailure( - throwable -> { - // TODO(b/34279096) - gracefully handle message failure - LogUtil.e("CallComposerActivity.onCopyFailed", "copy Failed", throwable); - }) - .build() - .executeParallel(galleryComposerFragment.getGalleryData().getFileUri()); + copyAndResizeExecutor.executeParallel( + galleryComposerFragment.getGalleryData().getFileUri()); } else { Uri shareableUri = FileProvider.getUriForFile( @@ -338,19 +418,65 @@ public class CallComposerActivity extends AppCompatActivity } } + private void showLoadingUi() { + loading.setVisibility(View.VISIBLE); + pager.setSwipingLocked(true); + } + private boolean sessionReady() { Session session = getEnrichedCallManager().getSession(sessionId); - if (session == null) { - return false; + return session != null && session.getState() == Session.STATE_STARTED; + } + + @VisibleForTesting + public void placeRCSCall(MultimediaData.Builder builder) { + MultimediaData data = builder.build(); + LogUtil.i("CallComposerActivity.placeRCSCall", "placing enriched call, data: " + data); + Logger.get(this).logImpression(DialerImpression.Type.CALL_COMPOSER_ACTIVITY_PLACE_RCS_CALL); + + getEnrichedCallManager().sendCallComposerData(sessionId, data); + maybeShowPrivacyToast(data); + if (data.hasImageData() + && ConfigProviderBindings.get(this).getBoolean("enable_delayed_ec_images", true) + && !TelecomUtil.isInCall(this)) { + timeoutHandler.postDelayed(placeTelecomCallRunnable, getRCSTimeoutMillis()); + startActivity( + CallPendingActivity.getIntent( + this, + contact.getNameOrNumber(), + contact.getDisplayNumber(), + contact.getNumberLabel(), + UriUtils.getLookupKeyFromUri(Uri.parse(contact.getContactUri())), + getString(R.string.call_composer_image_uploading), + Uri.parse(contact.getPhotoUri()), + sessionId)); + pendingCallStarted = true; + } else { + placeTelecomCall(); } + } - return session.getState() == EnrichedCallManager.STATE_STARTED; + private void maybeShowPrivacyToast(MultimediaData data) { + SharedPreferences preferences = + DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(this); + // Show a toast for privacy purposes if this is the first time a user uses call composer. + if (preferences.getBoolean(KEY_IS_FIRST_CALL_COMPOSE, true)) { + int privacyMessage = + data.hasImageData() ? R.string.image_sent_messages : R.string.message_sent_messages; + Toast toast = Toast.makeText(this, privacyMessage, Toast.LENGTH_LONG); + int yOffset = getResources().getDimensionPixelOffset(R.dimen.privacy_toast_y_offset); + toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 0, yOffset); + toast.show(); + preferences.edit().putBoolean(KEY_IS_FIRST_CALL_COMPOSE, false).apply(); + } } - private void placeRCSCall(MultimediaData.Builder builder) { - LogUtil.i("CallComposerActivity.placeRCSCall", "placing enriched call"); - Logger.get(this).logImpression(DialerImpression.Type.CALL_COMPOSER_ACTIVITY_PLACE_RCS_CALL); - getEnrichedCallManager().sendCallComposerData(sessionId, builder.build()); + @VisibleForTesting + public long getRCSTimeoutMillis() { + return ConfigProviderBindings.get(this).getLong("ec_image_upload_timeout", 15_000); + } + + private void placeTelecomCall() { TelecomUtil.placeCall( this, new CallIntentBuilder(contact.getNumber(), CallInitiationType.Type.CALL_COMPOSER).build()); @@ -360,7 +486,7 @@ public class CallComposerActivity extends AppCompatActivity /** Give permission to Messenger to view our image for RCS purposes. */ private Uri grantUriPermission(Uri uri) { - // TODO: Move this to the enriched call manager. + // TODO(sail): Move this to the enriched call manager. grantUriPermission( "com.google.android.apps.messaging", uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); return uri; @@ -376,10 +502,6 @@ public class CallComposerActivity extends AppCompatActivity } if (currentIndex == CallComposerPagerAdapter.INDEX_MESSAGE) { UiUtil.hideKeyboardFrom(this, windowContainer); - } else if (position == CallComposerPagerAdapter.INDEX_MESSAGE - && inFullscreenMode - && !isLandscapeLayout()) { - UiUtil.openKeyboardFrom(this, windowContainer); } currentIndex = position; CallComposerFragment fragment = (CallComposerFragment) adapter.instantiateItem(pager, position); @@ -398,6 +520,7 @@ public class CallComposerActivity extends AppCompatActivity super.onSaveInstanceState(outState); outState.putParcelable(VIEW_PAGER_STATE_KEY, pager.onSaveInstanceState()); outState.putBoolean(ENTRANCE_ANIMATION_KEY, shouldAnimateEntrance); + outState.putBoolean(SEND_AND_CALL_READY_KEY, sendAndCallReady); outState.putInt(CURRENT_INDEX_KEY, currentIndex); outState.putLong(SESSION_ID_KEY, sessionId); } @@ -424,28 +547,6 @@ public class CallComposerActivity extends AppCompatActivity animateSendAndCall(fragment.shouldHide()); } - // To detect when the keyboard changes. - @Override - public void onLayoutChange( - View view, - int left, - int top, - int right, - int bottom, - int oldLeft, - int oldTop, - int oldRight, - int oldBottom) { - // To prevent infinite layout change loops - if (layoutChanged) { - layoutChanged = false; - return; - } - - layoutChanged = true; - showFullscreen(contactContainer.getTop() < 0 || inFullscreenMode); - } - /** * Reads arguments from the fragment arguments and populates the necessary instance variables. * Copied from {@link com.android.contacts.common.dialog.CallSubjectDialog}. @@ -456,14 +557,14 @@ public class CallComposerActivity extends AppCompatActivity byte[] bytes = Base64.decode(intent.getStringExtra(ARG_CALL_COMPOSER_CONTACT_BASE64), Base64.DEFAULT); try { - contact = CallComposerContact.parseFrom(bytes); + contact = DialerContact.parseFrom(bytes); } catch (InvalidProtocolBufferException e) { throw Assert.createAssertionFailException(e.toString()); } } else { contact = ProtoParsers.getTrusted( - intent, ARG_CALL_COMPOSER_CONTACT, CallComposerContact.getDefaultInstance()); + intent, ARG_CALL_COMPOSER_CONTACT, DialerContact.getDefaultInstance()); } updateContactInfo(); } @@ -634,12 +735,20 @@ public class CallComposerActivity extends AppCompatActivity public void onAnimationStart(Animator animation) { isSendAndCallHidingOrHidden = shouldHide; sendAndCall.setVisibility(View.VISIBLE); + cameraIcon.setVisibility(View.VISIBLE); + galleryIcon.setVisibility(View.VISIBLE); + messageIcon.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animator animation) { if (isSendAndCallHidingOrHidden) { sendAndCall.setVisibility(View.INVISIBLE); + } else { + // hide buttons to prevent overdrawing and talkback discoverability + cameraIcon.setVisibility(View.GONE); + galleryIcon.setVisibility(View.GONE); + messageIcon.setVisibility(View.GONE); } } diff --git a/java/com/android/dialer/callcomposer/CameraComposerFragment.java b/java/com/android/dialer/callcomposer/CameraComposerFragment.java index f65207fa3..a5c65fd9d 100644 --- a/java/com/android/dialer/callcomposer/CameraComposerFragment.java +++ b/java/com/android/dialer/callcomposer/CameraComposerFragment.java @@ -17,7 +17,6 @@ package com.android.dialer.callcomposer; import android.Manifest; -import android.Manifest.permission; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.drawable.Animatable; @@ -89,17 +88,17 @@ public class CameraComposerFragment extends CallComposerFragment LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle bundle) { View root = inflater.inflate(R.layout.fragment_camera_composer, container, false); permissionView = root.findViewById(R.id.permission_view); - loading = (ProgressBar) root.findViewById(R.id.loading); - cameraView = (CameraMediaChooserView) root.findViewById(R.id.camera_view); + loading = root.findViewById(R.id.loading); + cameraView = root.findViewById(R.id.camera_view); shutter = cameraView.findViewById(R.id.camera_shutter_visual); - exitFullscreen = (ImageButton) cameraView.findViewById(R.id.camera_exit_fullscreen); - fullscreen = (ImageButton) cameraView.findViewById(R.id.camera_fullscreen); - swapCamera = (ImageButton) cameraView.findViewById(R.id.swap_camera_button); - capture = (ImageButton) cameraView.findViewById(R.id.camera_capture_button); - cancel = (ImageButton) cameraView.findViewById(R.id.camera_cancel_button); - focus = (RenderOverlay) cameraView.findViewById(R.id.focus_visual); - preview = (CameraPreviewHost) cameraView.findViewById(R.id.camera_preview); - previewImageView = (ImageView) root.findViewById(R.id.preview_image_view); + exitFullscreen = cameraView.findViewById(R.id.camera_exit_fullscreen); + fullscreen = cameraView.findViewById(R.id.camera_fullscreen); + swapCamera = cameraView.findViewById(R.id.swap_camera_button); + capture = cameraView.findViewById(R.id.camera_capture_button); + cancel = cameraView.findViewById(R.id.camera_cancel_button); + focus = cameraView.findViewById(R.id.focus_visual); + preview = cameraView.findViewById(R.id.camera_preview); + previewImageView = root.findViewById(R.id.preview_image_view); exitFullscreen.setOnClickListener(this); fullscreen.setOnClickListener(this); @@ -107,11 +106,12 @@ public class CameraComposerFragment extends CallComposerFragment capture.setOnClickListener(this); cancel.setOnClickListener(this); - if (!PermissionsUtil.hasPermission(getContext(), permission.CAMERA)) { + + if (!PermissionsUtil.hasCameraPermissions(getContext())) { LogUtil.i("CameraComposerFragment.onCreateView", "Permission view shown."); Logger.get(getContext()).logImpression(DialerImpression.Type.CAMERA_PERMISSION_DISPLAYED); - ImageView permissionImage = (ImageView) permissionView.findViewById(R.id.permission_icon); - TextView permissionText = (TextView) permissionView.findViewById(R.id.permission_text); + ImageView permissionImage = permissionView.findViewById(R.id.permission_icon); + TextView permissionText = permissionView.findViewById(R.id.permission_text); allowPermission = permissionView.findViewById(R.id.allow); allowPermission.setOnClickListener(this); @@ -131,6 +131,9 @@ public class CameraComposerFragment extends CallComposerFragment } private void setupCamera() { + if (!PermissionsUtil.hasCameraPrivacyToastShown(getContext())) { + PermissionsUtil.showCameraPermissionToast(getContext()); + } CameraManager.get().setListener(this); preview.setShown(); CameraManager.get().setRenderOverlay(focus); @@ -323,7 +326,11 @@ public class CameraComposerFragment extends CallComposerFragment /** Updates the state of the buttons and overlays based on the current state of the view */ private void updateViewState() { Assert.isNotNull(cameraView); - Assert.isNotNull(getContext()); + if (isDetached() || getContext() == null) { + LogUtil.i( + "CameraComposerFragment.updateViewState", "Fragment detached, cannot update view state"); + return; + } boolean isCameraAvailable = CameraManager.get().isCameraAvailable(); boolean uriReadyOrProcessing = cameraUri != null || processingUri; @@ -336,6 +343,12 @@ public class CameraComposerFragment extends CallComposerFragment previewImageView.setVisibility(View.GONE); } + if (cameraDirection == CameraInfo.CAMERA_FACING_FRONT) { + swapCamera.setContentDescription(getString(R.string.description_camera_switch_camera_rear)); + } else { + swapCamera.setContentDescription(getString(R.string.description_camera_switch_camera_facing)); + } + if (cameraUri == null && isCameraAvailable) { CameraManager.get().resetPreview(); cancel.setVisibility(View.GONE); @@ -384,6 +397,7 @@ public class CameraComposerFragment extends CallComposerFragment Logger.get(getContext()).logImpression(DialerImpression.Type.CAMERA_PERMISSION_GRANTED); LogUtil.i("CameraComposerFragment.onRequestPermissionsResult", "Permission granted."); permissionView.setVisibility(View.GONE); + PermissionsUtil.setCameraPrivacyToastShown(getContext()); setupCamera(); } else if (requestCode == CAMERA_PERMISSION) { Logger.get(getContext()).logImpression(DialerImpression.Type.CAMERA_PERMISSION_DENIED); diff --git a/java/com/android/dialer/callcomposer/CopyAndResizeImageWorker.java b/java/com/android/dialer/callcomposer/CopyAndResizeImageWorker.java index aeb8e0388..725cea723 100644 --- a/java/com/android/dialer/callcomposer/CopyAndResizeImageWorker.java +++ b/java/com/android/dialer/callcomposer/CopyAndResizeImageWorker.java @@ -21,6 +21,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; +import android.media.ExifInterface; import android.net.Uri; import android.os.Build.VERSION_CODES; import android.support.annotation.NonNull; @@ -47,17 +48,26 @@ class CopyAndResizeImageWorker implements Worker> { } /** - * @param input The input Uri is expected to be a image openable by {@link - * android.content.ContentResolver#openInputStream(Uri)}. + * @param input The filepath where the image is located. * @return a Pair where the File contains the resized image, and the String is the result File's * MIME type. */ @Nullable @Override public Pair doInBackground(@Nullable Uri input) throws Throwable { + // BitmapFactory.decodeStream strips exif data, so we need to save it here and apply it later. + int rotation = 0; + try { + rotation = + new ExifInterface(input.getPath()) + .getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + } catch (Exception ignored) { + // Couldn't get exif tags, not the end of the world + } + try (InputStream inputStream = context.getContentResolver().openInputStream(input)) { Bitmap bitmap = BitmapFactory.decodeStream(inputStream); - bitmap = BitmapResizer.resizeForEnrichedCalling(bitmap); + bitmap = BitmapResizer.resizeForEnrichedCalling(bitmap, exifToDegrees(rotation)); File outputFile = DialerUtils.createShareableFile(context); try (OutputStream outputStream = new FileOutputStream(outputFile)) { @@ -67,4 +77,17 @@ class CopyAndResizeImageWorker implements Worker> { } } } + + private static int exifToDegrees(int exifOrientation) { + switch (exifOrientation) { + case ExifInterface.ORIENTATION_ROTATE_90: + return 90; + case ExifInterface.ORIENTATION_ROTATE_180: + return 180; + case ExifInterface.ORIENTATION_ROTATE_270: + return 270; + default: + return 0; + } + } } diff --git a/java/com/android/dialer/callcomposer/GalleryCursorLoader.java b/java/com/android/dialer/callcomposer/GalleryCursorLoader.java index f9990e167..d33bfb398 100644 --- a/java/com/android/dialer/callcomposer/GalleryCursorLoader.java +++ b/java/com/android/dialer/callcomposer/GalleryCursorLoader.java @@ -16,7 +16,6 @@ package com.android.dialer.callcomposer; -import android.annotation.SuppressLint; import android.content.Context; import android.net.Uri; import android.provider.MediaStore.Files; @@ -28,7 +27,7 @@ import android.support.v4.content.CursorLoader; public class GalleryCursorLoader extends CursorLoader { public static final String MEDIA_SCANNER_VOLUME_EXTERNAL = "external"; public static final String[] ACCEPTABLE_IMAGE_TYPES = - new String[] {"image/jpeg", "image/jpg", "image/png", "image/gif", "image/webp"}; + new String[] {"image/jpeg", "image/jpg", "image/png", "image/webp"}; private static final Uri STORAGE_URI = Files.getContentUri(MEDIA_SCANNER_VOLUME_EXTERNAL); private static final String SORT_ORDER = Media.DATE_MODIFIED + " DESC"; @@ -44,11 +43,10 @@ public class GalleryCursorLoader extends CursorLoader { SORT_ORDER); } - @SuppressLint("DefaultLocale") private static String createSelection() { - return String.format( - "mime_type IN ('image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp')" - + " AND media_type in (%d)", - FileColumns.MEDIA_TYPE_IMAGE); + return "mime_type IN ('image/jpeg', 'image/jpg', 'image/png', 'image/webp')" + + " AND media_type in (" + + FileColumns.MEDIA_TYPE_IMAGE + + ")"; } } diff --git a/java/com/android/dialer/callcomposer/MessageComposerFragment.java b/java/com/android/dialer/callcomposer/MessageComposerFragment.java index 2a342bb08..392f6e716 100644 --- a/java/com/android/dialer/callcomposer/MessageComposerFragment.java +++ b/java/com/android/dialer/callcomposer/MessageComposerFragment.java @@ -24,11 +24,8 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.view.KeyEvent; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; -import android.view.View.OnLongClickListener; -import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.EditText; import android.widget.TextView; @@ -36,17 +33,12 @@ import android.widget.TextView.OnEditorActionListener; /** Fragment used to compose call with message fragment. */ public class MessageComposerFragment extends CallComposerFragment - implements OnClickListener, - TextWatcher, - OnTouchListener, - OnLongClickListener, - OnEditorActionListener { + implements OnClickListener, TextWatcher, OnEditorActionListener { private static final String CHAR_LIMIT_KEY = "char_limit"; public static final int NO_CHAR_LIMIT = -1; private EditText customMessage; - private boolean isLongClick = false; private int charLimit; public static MessageComposerFragment newInstance(int charLimit) { @@ -73,8 +65,6 @@ public class MessageComposerFragment extends CallComposerFragment customMessage = (EditText) view.findViewById(R.id.custom_message); urgent.setOnClickListener(this); - customMessage.setOnTouchListener(this); - customMessage.setOnLongClickListener(this); customMessage.addTextChangedListener(this); customMessage.setOnEditorActionListener(this); if (charLimit != NO_CHAR_LIMIT) { @@ -118,30 +108,6 @@ public class MessageComposerFragment extends CallComposerFragment getListener().composeCall(this); } - /** - * EditTexts take two clicks to dispatch an onClick() event, so instead we add an onTouchListener - * to listen for them. The caveat to this is that it also requires listening for onLongClicks to - * distinguish whether a MotionEvent came from a click or a long click. - */ - @Override - public boolean onTouch(View view, MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_UP) { - if (isLongClick) { - isLongClick = false; - } else { - getListener().showFullscreen(true); - } - } - view.performClick(); - return false; - } - - @Override - public boolean onLongClick(View v) { - isLongClick = true; - return false; - } - @Override public boolean shouldHide() { return TextUtils.isEmpty(getMessage()); diff --git a/java/com/android/dialer/callcomposer/camera/CameraManager.java b/java/com/android/dialer/callcomposer/camera/CameraManager.java index 4cc08ba32..f79f6548c 100644 --- a/java/com/android/dialer/callcomposer/camera/CameraManager.java +++ b/java/com/android/dialer/callcomposer/camera/CameraManager.java @@ -35,6 +35,7 @@ import com.android.dialer.callcomposer.camera.camerafocus.FocusOverlayManager; import com.android.dialer.callcomposer.camera.camerafocus.RenderOverlay; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DialerExecutors; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -118,7 +119,7 @@ public class CameraManager implements FocusOverlayManager.Listener { /** * The task for opening the camera, so it doesn't block the UI thread Using AsyncTask rather than * SafeAsyncTask because the tasks need to be serialized, but don't need to be on the UI thread - * TODO: If we have other AyncTasks (not SafeAsyncTasks) this may contend and we may need + * TODO(blemmon): If we have other AyncTasks (not SafeAsyncTasks) this may contend and we may need * to create a dedicated thread, or synchronize the threads in the thread pool */ private AsyncTask mOpenCameraTask; @@ -457,9 +458,9 @@ public class CameraManager implements FocusOverlayManager.Listener { int height; if (mRotation == 90 || mRotation == 270) { // Is rotated, so swapping dimensions is desired - //noinspection SuspiciousNameCombination + // noinspection SuspiciousNameCombination width = size.height; - //noinspection SuspiciousNameCombination + // noinspection SuspiciousNameCombination height = size.width; } else { width = size.width; @@ -467,9 +468,20 @@ public class CameraManager implements FocusOverlayManager.Listener { } LogUtil.i( "CameraManager.onPictureTaken", "taken picture size: " + bytes.length + " bytes"); - new ImagePersistTask( - width, height, heightPercent, bytes, mCameraPreview.getContext(), callback) - .execute(); + DialerExecutors.createNonUiTaskBuilder( + new ImagePersistWorker( + width, height, heightPercent, bytes, mCameraPreview.getContext())) + .onSuccess( + (result) -> { + callback.onMediaReady( + result.getUri(), "image/jpeg", result.getWidth(), result.getHeight()); + }) + .onFailure( + (throwable) -> { + callback.onMediaFailed(new Exception("Persisting image failed", throwable)); + }) + .build() + .executeSerial(null); } }; @@ -509,62 +521,61 @@ public class CameraManager implements FocusOverlayManager.Listener { }.execute(); } - /** Updates the orientation of the camera to match the orientation of the device */ - private void updateCameraOrientation() { - if (mCamera == null || mCameraPreview == null || mTakingPicture) { - return; + /** + * Updates the orientation of the {@link Camera} w.r.t. the orientation of the device and the + * orientation that the physical camera is mounted on the device. + * + * @param camera that needs to be reorientated + * @param screenRotation rotation of the physical device + * @param cameraOrientation {@link CameraInfo#orientation} + * @param cameraIsFrontFacing {@link CameraInfo#CAMERA_FACING_FRONT} + * @return rotation that images returned from {@link + * android.hardware.Camera.PictureCallback#onPictureTaken(byte[], Camera)} will be rotated. + */ + @VisibleForTesting + static int updateCameraRotation( + @NonNull Camera camera, + int screenRotation, + int cameraOrientation, + boolean cameraIsFrontFacing) { + Assert.isNotNull(camera); + Assert.checkArgument(cameraOrientation % 90 == 0); + + int rotation = screenRotationToDegress(screenRotation); + boolean portrait = rotation == 0 || rotation == 180; + + if (!portrait && !cameraIsFrontFacing) { + rotation += 180; } + rotation += cameraOrientation; + rotation %= 360; - final WindowManager windowManager = - (WindowManager) mCameraPreview.getContext().getSystemService(Context.WINDOW_SERVICE); + // Rotate the camera + if (portrait && cameraIsFrontFacing) { + camera.setDisplayOrientation((rotation + 180) % 360); + } else { + camera.setDisplayOrientation(rotation); + } + + // Rotate the images returned when a picture is taken + Camera.Parameters params = camera.getParameters(); + params.setRotation(rotation); + camera.setParameters(params); + return rotation; + } - int degrees; - switch (windowManager.getDefaultDisplay().getRotation()) { + private static int screenRotationToDegress(int screenRotation) { + switch (screenRotation) { case Surface.ROTATION_0: - degrees = 0; - break; + return 0; case Surface.ROTATION_90: - degrees = 90; - break; + return 90; case Surface.ROTATION_180: - degrees = 180; - break; + return 180; case Surface.ROTATION_270: - degrees = 270; - break; + return 270; default: - throw Assert.createAssertionFailException(""); - } - - // The display orientation of the camera (this controls the preview image). - int orientation; - - // The clockwise rotation angle relative to the orientation of the camera. This affects - // pictures returned by the camera in Camera.PictureCallback. - int rotation; - if (mCameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { - orientation = (mCameraInfo.orientation + degrees) % 360; - rotation = orientation; - // compensate the mirror but only for orientation - orientation = (360 - orientation) % 360; - } else { // back-facing - orientation = (mCameraInfo.orientation - degrees + 360) % 360; - rotation = orientation; - } - mRotation = rotation; - try { - mCamera.setDisplayOrientation(orientation); - final Camera.Parameters params = mCamera.getParameters(); - params.setRotation(rotation); - mCamera.setParameters(params); - } catch (final RuntimeException e) { - LogUtil.e( - "CameraManager.updateCameraOrientation", - "RuntimeException in CameraManager.updateCameraOrientation", - e); - if (mListener != null) { - mListener.onCameraError(ERROR_OPENING_CAMERA, e); - } + throw Assert.createIllegalStateFailException("Invalid surface rotation."); } } @@ -589,13 +600,19 @@ public class CameraManager implements FocusOverlayManager.Listener { mOrientationHandler.disable(); mOrientationHandler = null; } - // releaseMediaRecorder(true /* cleanupFile */); mFocusOverlayManager.onPreviewStopped(); return; } try { mCamera.stopPreview(); - updateCameraOrientation(); + if (!mTakingPicture) { + mRotation = + updateCameraRotation( + mCamera, + getScreenRotation(), + mCameraInfo.orientation, + mCameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT); + } final Camera.Parameters params = mCamera.getParameters(); final Camera.Size pictureSize = chooseBestPictureSize(); @@ -644,6 +661,14 @@ public class CameraManager implements FocusOverlayManager.Listener { } } + private int getScreenRotation() { + return mCameraPreview + .getContext() + .getSystemService(WindowManager.class) + .getDefaultDisplay() + .getRotation(); + } + public boolean isCameraAvailable() { return mCamera != null && !mTakingPicture && mIsHardwareAccelerationSupported; } @@ -681,7 +706,14 @@ public class CameraManager implements FocusOverlayManager.Listener { @Override public void onOrientationChanged(final int orientation) { - updateCameraOrientation(); + if (!mTakingPicture) { + mRotation = + updateCameraRotation( + mCamera, + getScreenRotation(), + mCameraInfo.orientation, + mCameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT); + } } } diff --git a/java/com/android/dialer/callcomposer/camera/ImagePersistTask.java b/java/com/android/dialer/callcomposer/camera/ImagePersistTask.java deleted file mode 100644 index 31751e536..000000000 --- a/java/com/android/dialer/callcomposer/camera/ImagePersistTask.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.callcomposer.camera; - -import android.annotation.TargetApi; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.Matrix; -import android.net.Uri; -import android.os.Build.VERSION_CODES; -import android.support.v4.content.FileProvider; -import com.android.dialer.callcomposer.camera.exif.ExifInterface; -import com.android.dialer.callcomposer.camera.exif.ExifTag; -import com.android.dialer.callcomposer.util.BitmapResizer; -import com.android.dialer.common.Assert; -import com.android.dialer.common.concurrent.FallibleAsyncTask; -import com.android.dialer.constants.Constants; -import com.android.dialer.util.DialerUtils; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -/** Persisting image routine. */ -@TargetApi(VERSION_CODES.M) -public class ImagePersistTask extends FallibleAsyncTask { - private int mWidth; - private int mHeight; - private final float mHeightPercent; - private final byte[] mBytes; - private final Context mContext; - private final CameraManager.MediaCallback mCallback; - - ImagePersistTask( - final int width, - final int height, - final float heightPercent, - final byte[] bytes, - final Context context, - final CameraManager.MediaCallback callback) { - Assert.checkArgument(heightPercent >= 0 && heightPercent <= 1); - Assert.isNotNull(bytes); - Assert.isNotNull(context); - Assert.isNotNull(callback); - mWidth = width; - mHeight = height; - mHeightPercent = heightPercent; - mBytes = bytes; - mContext = context; - mCallback = callback; - } - - @Override - protected Uri doInBackgroundFallible(final Void... params) throws Exception { - File outputFile = DialerUtils.createShareableFile(mContext); - - try (OutputStream outputStream = new FileOutputStream(outputFile)) { - if (mHeightPercent != 1.0f) { - writeClippedBitmap(outputStream); - } else { - Bitmap bitmap = BitmapFactory.decodeByteArray(mBytes, 0, mBytes.length); - bitmap = BitmapResizer.resizeForEnrichedCalling(bitmap); - bitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream); - } - } - - return FileProvider.getUriForFile( - mContext, Constants.get().getFileProviderAuthority(), outputFile); - } - - @Override - protected void onPostExecute(FallibleTaskResult result) { - if (result.isFailure()) { - mCallback.onMediaFailed(new Exception("Persisting image failed", result.getThrowable())); - } else { - mCallback.onMediaReady(result.getResult(), "image/jpeg", mWidth, mHeight); - } - } - - private void writeClippedBitmap(OutputStream outputStream) throws IOException { - int orientation = android.media.ExifInterface.ORIENTATION_UNDEFINED; - final ExifInterface exifInterface = new ExifInterface(); - try { - exifInterface.readExif(mBytes); - final Integer orientationValue = exifInterface.getTagIntValue(ExifInterface.TAG_ORIENTATION); - if (orientationValue != null) { - orientation = orientationValue.intValue(); - } - } catch (final IOException e) { - // Couldn't get exif tags, not the end of the world - } - Bitmap bitmap = BitmapFactory.decodeByteArray(mBytes, 0, mBytes.length); - final int clippedWidth; - final int clippedHeight; - if (ExifInterface.getOrientationParams(orientation).invertDimensions) { - Assert.checkState(mWidth == bitmap.getHeight()); - Assert.checkState(mHeight == bitmap.getWidth()); - clippedWidth = (int) (mHeight * mHeightPercent); - clippedHeight = mWidth; - } else { - Assert.checkState(mWidth == bitmap.getWidth()); - Assert.checkState(mHeight == bitmap.getHeight()); - clippedWidth = mWidth; - clippedHeight = (int) (mHeight * mHeightPercent); - } - final int offsetTop = (bitmap.getHeight() - clippedHeight) / 2; - final int offsetLeft = (bitmap.getWidth() - clippedWidth) / 2; - mWidth = clippedWidth; - mHeight = clippedHeight; - Bitmap clippedBitmap = - Bitmap.createBitmap(clippedWidth, clippedHeight, Bitmap.Config.ARGB_8888); - clippedBitmap.setDensity(bitmap.getDensity()); - final Canvas clippedBitmapCanvas = new Canvas(clippedBitmap); - final Matrix matrix = new Matrix(); - matrix.postTranslate(-offsetLeft, -offsetTop); - clippedBitmapCanvas.drawBitmap(bitmap, matrix, null /* paint */); - clippedBitmapCanvas.save(); - clippedBitmap = BitmapResizer.resizeForEnrichedCalling(clippedBitmap); - // EXIF data can take a big chunk of the file size and is often cleared by the - // carrier, only store orientation since that's critical - final ExifTag orientationTag = exifInterface.getTag(ExifInterface.TAG_ORIENTATION); - exifInterface.clearExif(); - exifInterface.setTag(orientationTag); - exifInterface.writeExif(clippedBitmap, outputStream); - - clippedBitmap.recycle(); - bitmap.recycle(); - } -} diff --git a/java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java b/java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java new file mode 100644 index 000000000..26b0bde00 --- /dev/null +++ b/java/com/android/dialer/callcomposer/camera/ImagePersistWorker.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.callcomposer.camera; + +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Build.VERSION_CODES; +import android.support.annotation.NonNull; +import android.support.v4.content.FileProvider; +import com.android.dialer.callcomposer.camera.ImagePersistWorker.Result; +import com.android.dialer.callcomposer.camera.exif.ExifInterface; +import com.android.dialer.callcomposer.util.BitmapResizer; +import com.android.dialer.common.Assert; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.constants.Constants; +import com.android.dialer.util.DialerUtils; +import com.google.auto.value.AutoValue; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +/** Persisting image routine. */ +@TargetApi(VERSION_CODES.M) +public class ImagePersistWorker implements Worker { + private int mWidth; + private int mHeight; + private final float mHeightPercent; + private final byte[] mBytes; + private final Context mContext; + + @AutoValue + abstract static class Result { + + public static Builder builder() { + return new AutoValue_ImagePersistWorker_Result.Builder(); + } + + @NonNull + abstract Uri getUri(); + + abstract int getWidth(); + + abstract int getHeight(); + + @AutoValue.Builder + abstract static class Builder { + abstract Builder setUri(@NonNull Uri uri); + + abstract Builder setWidth(int width); + + abstract Builder setHeight(int height); + + abstract Result build(); + } + } + + ImagePersistWorker( + final int width, + final int height, + final float heightPercent, + final byte[] bytes, + final Context context) { + Assert.checkArgument(heightPercent >= 0 && heightPercent <= 1); + Assert.isNotNull(bytes); + Assert.isNotNull(context); + mWidth = width; + mHeight = height; + mHeightPercent = heightPercent; + mBytes = bytes; + mContext = context; + } + + @Override + public Result doInBackground(Void unused) throws Exception { + File outputFile = DialerUtils.createShareableFile(mContext); + + try (OutputStream outputStream = new FileOutputStream(outputFile)) { + writeClippedBitmap(outputStream); + } + + return Result.builder() + .setUri( + FileProvider.getUriForFile( + mContext, Constants.get().getFileProviderAuthority(), outputFile)) + .setWidth(mWidth) + .setHeight(mHeight) + .build(); + } + + private void writeClippedBitmap(OutputStream outputStream) throws IOException { + int orientation = android.media.ExifInterface.ORIENTATION_UNDEFINED; + final ExifInterface exifInterface = new ExifInterface(); + try { + exifInterface.readExif(mBytes); + final Integer orientationValue = exifInterface.getTagIntValue(ExifInterface.TAG_ORIENTATION); + if (orientationValue != null) { + orientation = orientationValue.intValue(); + } + } catch (final IOException e) { + // Couldn't get exif tags, not the end of the world + } + + ExifInterface.OrientationParams params = ExifInterface.getOrientationParams(orientation); + Bitmap bitmap = BitmapFactory.decodeByteArray(mBytes, 0, mBytes.length); + final int clippedWidth; + final int clippedHeight; + if (params.invertDimensions) { + Assert.checkState(mWidth == bitmap.getHeight()); + Assert.checkState(mHeight == bitmap.getWidth()); + clippedWidth = (int) (mHeight * mHeightPercent); + clippedHeight = mWidth; + } else { + Assert.checkState(mWidth == bitmap.getWidth()); + Assert.checkState(mHeight == bitmap.getHeight()); + clippedWidth = mWidth; + clippedHeight = (int) (mHeight * mHeightPercent); + } + + int offsetTop = (bitmap.getHeight() - clippedHeight) / 2; + int offsetLeft = (bitmap.getWidth() - clippedWidth) / 2; + mWidth = clippedWidth; + mHeight = clippedHeight; + + Bitmap clippedBitmap = + Bitmap.createBitmap(bitmap, offsetLeft, offsetTop, clippedWidth, clippedHeight); + clippedBitmap = BitmapResizer.resizeForEnrichedCalling(clippedBitmap, params.rotation); + // EXIF data can take a big chunk of the file size and we've already manually rotated our image, + // so remove all of the exif data. + exifInterface.clearExif(); + exifInterface.writeExif(clippedBitmap, outputStream); + + clippedBitmap.recycle(); + bitmap.recycle(); + } +} diff --git a/java/com/android/dialer/callcomposer/camera/camerafocus/FocusOverlayManager.java b/java/com/android/dialer/callcomposer/camera/camerafocus/FocusOverlayManager.java index 1c5ac380c..a5edf3309 100644 --- a/java/com/android/dialer/callcomposer/camera/camerafocus/FocusOverlayManager.java +++ b/java/com/android/dialer/callcomposer/camera/camerafocus/FocusOverlayManager.java @@ -389,7 +389,7 @@ public class FocusOverlayManager { focusIndicator.showStart(); } else { if (Parameters.FOCUS_MODE_CONTINUOUS_PICTURE.equals(mFocusMode)) { - // TODO: check HAL behavior and decide if this can be removed. + // TODO(blemmon): check HAL behavior and decide if this can be removed. focusIndicator.showSuccess(false); } else if (mState == STATE_SUCCESS) { focusIndicator.showSuccess(false); diff --git a/java/com/android/dialer/callcomposer/camera/exif/ExifInterface.java b/java/com/android/dialer/callcomposer/camera/exif/ExifInterface.java index 92dee1c94..1bf9519ad 100644 --- a/java/com/android/dialer/callcomposer/camera/exif/ExifInterface.java +++ b/java/com/android/dialer/callcomposer/camera/exif/ExifInterface.java @@ -286,7 +286,7 @@ public class ExifInterface { /** Wrapper class to define some orientation parameters. */ public static class OrientationParams { - int rotation = 0; + public int rotation = 0; int scaleX = 1; int scaleY = 1; public boolean invertDimensions = false; diff --git a/java/com/android/dialer/callcomposer/camera/exif/ExifParser.java b/java/com/android/dialer/callcomposer/camera/exif/ExifParser.java index 23d748c17..c728845a1 100644 --- a/java/com/android/dialer/callcomposer/camera/exif/ExifParser.java +++ b/java/com/android/dialer/callcomposer/camera/exif/ExifParser.java @@ -499,7 +499,7 @@ public class ExifParser { mTiffStream.skip(4); return null; } - // TODO: handle numOfComp overflow + // TODO(blemmon): handle numOfComp overflow ExifTag tag = new ExifTag( tagId, diff --git a/java/com/android/dialer/callcomposer/camera/exif/ExifTag.java b/java/com/android/dialer/callcomposer/camera/exif/ExifTag.java index a254ae93b..9a03c103c 100644 --- a/java/com/android/dialer/callcomposer/camera/exif/ExifTag.java +++ b/java/com/android/dialer/callcomposer/camera/exif/ExifTag.java @@ -187,7 +187,7 @@ public class ExifTag { /** Gets the component count of this tag. */ - // TODO: fix integer overflows with this + // TODO(blemmon): fix integer overflows with this int getComponentCount() { return mComponentCountActual; } diff --git a/java/com/android/dialer/callcomposer/cameraui/res/layout/camera_view.xml b/java/com/android/dialer/callcomposer/cameraui/res/layout/camera_view.xml index a4198fcf9..8169a3ded 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/layout/camera_view.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/layout/camera_view.xml @@ -24,7 +24,7 @@ + android:layout_height="wrap_content"> @@ -37,14 +37,14 @@ + android:layout_height="match_parent"/> + android:visibility="gone"/> + android:background="?android:selectableItemBackgroundBorderless" + android:contentDescription="@string/description_camera_switch_full_screen"/> + android:background="?android:selectableItemBackgroundBorderless" + android:contentDescription="@string/description_camera_switch_preview_screen"/> + android:contentDescription="@string/description_camera_take_picture"/> + android:background="@drawable/transparent_button_background"/> + android:contentDescription="@string/description_camera_cancel_photo" /> diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-af/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-af/strings.xml index 3892a2089..f6326c1ad 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-af/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-af/strings.xml @@ -1,11 +1,26 @@ + + - "Skakel na volskerm-kamera oor" - "Knoppie is nou voorste kamera" - "Knoppie is nou agterste kamera" - "Stop video-opname" - "Gebruik tans voorste kamera" - "Gebruik tans agterste kamera" - "Neem foto" + "Skakel oor na volskerm-kamera" + "Skakel oor na kameravoorskou" + "Skakel oor na voorste kamera" + "Skakel oor na agterste kamera" + "Neem foto" + "Neem foto weer" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-am/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-am/strings.xml index e2717986e..87c70c75b 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-am/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-am/strings.xml @@ -1,11 +1,26 @@ + + - "ወደ ሙሉ ማያ ገጽ ካሜራ ቀይር" - "አዝራር አሁን የፊት ካሜራ ነው" - "አዝራር አሁን የኋላ ካሜራ ነው" - "ቪዲዮ መቅዳትን አቁም" - "የፊት ካሜራ በመጠቀም ላይ" - "የኋላ ካሜራ በመጠቀም ላይ" - "ፎቶ ያንሱ" + "ወደ ሙሉ ማያ ገጽ ካሜራ ይቀይሩ" + "ወደ ካሜራ ቅድመ ዕይታ ይቀይሩ" + "ወደ የፊት ካሜራ ይቀይሩ" + "ወደ የኋላ ካሜራ ይቀይሩ" + "ፎቶ ያንሱ" + "ፎቶ በድጋሚ ያንሱ" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ar/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ar/strings.xml index a045a1141..fa27db7b6 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ar/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ar/strings.xml @@ -1,11 +1,26 @@ + + - "التبديل إلى الكاميرا بملء الشاشة" - "يشير الزر الآن إلى الكاميرا الأمامية" - "يشير الزر الآن إلى الكاميرا الخلفية" - "إيقاف تسجيل الفيديو" - "استخدام الكاميرا الأمامية" - "استخدام الكاميرا الخلفية" - "التقاط صورة" + "التبديل إلى الكاميرا بملء الشاشة" + "التبديل إلى معاينة الكاميرا" + "تبديل إلى الكاميرا الأمامية" + "تبديل مرة أخرى إلى الكاميرا الأمامية" + "التقاط صورة" + "إعادة التقاط الصورة" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-az/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-az/strings.xml index 514463c4d..bfbf204cd 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-az/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-az/strings.xml @@ -1,11 +1,26 @@ + + - "Tam ekranlı kameraya keçin" - "Düymə indi ön kameradır" - "Düymə indi arxa kameradır" - "Video qeydi dayandırın" - "Ön kamera istifadə olunur" - "Arxa kamera istifadə olunur" - "Fotoşəkil çəkin" + "Tam ekranlı kameraya keçin" + "Kamera önizləməsinə keçin" + "Ön kameraya keçin" + "Arxa kameraya keçin" + "Foto çəkin" + "Fotonu yenidən çəkin" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-b+sr+Latn/strings.xml index aad8d9dd8..565b18810 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-b+sr+Latn/strings.xml @@ -1,11 +1,26 @@ + + - "Pređite na prikaz kamere preko celog ekrana" - "Dugme sad aktivira prednju kameru" - "Dugme sad aktivira zadnju kameru" - "Zaustavite snimanje videa" - "Koristimo prednju kameru" - "Koristimo zadnju kameru" - "Snimite sliku" + "Prebacite na prikaz kamere preko celog ekrana" + "Prebacite na pregled kamere" + "Prebacite na prednju kameru" + "Prebacite na zadnju kameru" + "Snimite sliku" + "Ponovo snimite sliku" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-be/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-be/strings.xml index 108ab7f63..f15bbb945 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-be/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-be/strings.xml @@ -1,11 +1,26 @@ + + - "Пераключыцца на поўнаэкранную камеру" - "Кнопка зараз замацавана за пярэдняй камерай" - "Кнопка зараз замацавана за задняй камерай" - "Спыніць запіс відэа" - "Выкарыстанне пярэдняй камеры" - "Выкарыстанне задняй камеры" - "Зрабіць фота" + "Пераключыцца на поўнаэкранную камеру" + "Пераключыцца ў рэжым перадпрагляду камеры" + "Пераключыцца на пярэднюю камеру" + "Пераключыцца на заднюю камеру" + "Зрабіць фота" + "Зрабіць фота яшчэ раз" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-bg/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-bg/strings.xml index e965ed9b3..92352ffdb 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-bg/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-bg/strings.xml @@ -1,11 +1,26 @@ + + - "Превключване към камера на цял екран" - "Бутонът сега е за предната камера" - "Бутонът сега е за задната камера" - "Спиране на видеозаписа" - "Използва се предната камера" - "Използва се задната камера" - "Правене на снимка" + "Превключване към камера на цял екран" + "Превключване към визуализация на камерата" + "Превключване към предната камера" + "Превключване към задната камера." + "Снимане" + "Повторно снимане" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-bn/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-bn/strings.xml index 447b7e36b..83774c767 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-bn/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-bn/strings.xml @@ -1,11 +1,26 @@ + + - "পূর্ণ স্ক্রীন ক্যামেরাতে পাল্টান" - "বোতামটিকে এখন সামনের ক্যামেরার জন্য ব্যবহার করা হবে" - "বোতামটিকে এখন পিছনের ক্যামেরার জন্য ব্যবহার করা হবে" - "ভিডিও রেকর্ডিং বন্ধ করুন" - "সামনের ক্যামেরা ব্যবহার করা হচ্ছে" - "পিছনের ক্যামেরা ব্যবহার করা হচ্ছে" - "ফটো তুলুন" + "সম্পূর্ণ স্ক্রীন জুড়ে ক্যামেরা খুলুন" + "ক্যামেরার পূর্বরূপ মোডে পাল্টান" + "সামনের ক্যামেরাতে পাল্টান" + "পিছনের ক্যামেরাতে পাল্টান" + "ফটো তুলুন" + "আবার ফটো তুলুন" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-bs/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-bs/strings.xml index 8946f4f4d..c77a5de8d 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-bs/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-bs/strings.xml @@ -1,11 +1,26 @@ + + - "Prebaci na kameru preko cijelog ekrana" - "Dugme je sada prednja kamera" - "Dugme je sada zadnja kamera" - "Zaustavi snimanje videozapisa" - "Koristi se prednja kamera" - "Koristi se zadnja kamera" - "Snimi fotografiju" + "Prebaci na kameru preko cijelog ekrana" + "Prebaci na pregled kamere" + "Prebaci na prednju kameru" + "Prebaci na stražnju kameru" + "Snimi fotografiju" + "Ponovo snimi fotografiju" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ca/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ca/strings.xml index 6d8ffdc4e..39c069b88 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ca/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ca/strings.xml @@ -1,11 +1,26 @@ + + - "Canvia a la càmera en pantalla completa" - "El botó ara és la càmera frontal" - "El botó ara és la càmera posterior" - "Deixa d\'enregistrar el vídeo" - "S\'està utilitzant la càmera frontal" - "S\'està utilitzant la càmera posterior" - "Fes una foto" + "Canvia a la càmera en pantalla completa" + "Canvia a la previsualització de la càmera" + "Canvia a la càmera frontal" + "Canvia a la càmera posterior" + "Fes una foto" + "Torna a fer la foto" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-cs/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-cs/strings.xml index 0e3110809..222eb812e 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-cs/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-cs/strings.xml @@ -1,11 +1,26 @@ + + - "Přepnout na fotoaparát na celou obrazovku" - "Tlačítko nyní funguje pro přední fotoaparát" - "Tlačítko nyní funguje pro zadní fotoaparát" - "Zastavit natáčení videa" - "Používá se přední fotoaparát" - "Používá se zadní fotoaparát" - "Vyfotit" + "Přepnout na fotoaparát na celou obrazovku" + "Přepnout na náhled fotoaparátu" + "Přepnout na přední fotoaparát" + "Přepnout na zadní fotoaparát" + "Vyfotit" + "Znovu vyfotit" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-da/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-da/strings.xml index ca5a79e89..0de7e0861 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-da/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-da/strings.xml @@ -1,11 +1,26 @@ + + - "Skift til kamera i fuld skærm" - "Knappen er nu frontkamera" - "Knappen er nu bagsidekamera" - "Stands optagelse af video" - "Bruger frontkameraet" - "Bruger bagsidekameraet" - "Tag billede" + "Skift til kamera i fuld skærm" + "Skift til forhåndsvisning af kamera" + "Skift til kamera på forsiden" + "Skift til kamera på bagsiden" + "Tag billede" + "Tag billedet om" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-de/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-de/strings.xml index 53d22eba5..1b0d63906 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-de/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-de/strings.xml @@ -1,11 +1,26 @@ + + - "Zur Vollbildkamera wechseln" - "Schaltfläche ist jetzt Frontkamera" - "Schaltfläche ist jetzt Rückkamera" - "Videoaufzeichnung beenden" - "Frontkamera wird verwendet" - "Rückkamera wird verwendet" - "Foto aufnehmen" + "Zur Vollbildkamera wechseln" + "Zur Kameravorschau wechseln" + "Zur Frontkamera wechseln" + "Zur Rückkamera wechseln" + "Foto aufnehmen" + "Foto neu aufnehmen" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-el/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-el/strings.xml index 5763dec95..d657f936f 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-el/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-el/strings.xml @@ -1,11 +1,26 @@ + + - "Εναλλαγή σε κάμερα πλήρους οθόνης" - "Το κουμπί είναι τώρα η μπροστινή κάμερα" - "Το κουμπί είναι τώρα η πίσω κάμερα" - "Διακοπή εγγραφής βίντεο" - "Χρήση μπροστινής κάμερας" - "Χρήση πίσω κάμερας" - "Λήψη φωτογραφίας" + "Εναλλαγή σε κάμερα πλήρους οθόνης" + "Εναλλαγή σε προεπισκόπηση κάμερας" + "Εναλλαγή σε κάμερα πρόσοψης" + "Εναλλαγή σε πίσω κάμερα" + "Λήψη φωτογραφίας" + "Επανάληψη λήψης φωτογραφίας" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-en-rAU/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-en-rAU/strings.xml index 5b8b4aa26..9e76a69a5 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-en-rAU/strings.xml @@ -1,11 +1,26 @@ + + - "Switch to full-screen camera" - "Button is now front-facing camera" - "Button is now rear-facing camera" - "Stop recording video" - "Using front-facing camera" - "Using rear-facing camera" - "Take photo" + "Switch to full-screen camera" + "Switch to camera preview" + "Switch to front-facing camera" + "Switch to rear-facing camera" + "Take photo" + "Retake photo" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-en-rGB/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-en-rGB/strings.xml index 5b8b4aa26..9e76a69a5 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-en-rGB/strings.xml @@ -1,11 +1,26 @@ + + - "Switch to full-screen camera" - "Button is now front-facing camera" - "Button is now rear-facing camera" - "Stop recording video" - "Using front-facing camera" - "Using rear-facing camera" - "Take photo" + "Switch to full-screen camera" + "Switch to camera preview" + "Switch to front-facing camera" + "Switch to rear-facing camera" + "Take photo" + "Retake photo" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-en-rIN/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-en-rIN/strings.xml index 5b8b4aa26..9e76a69a5 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-en-rIN/strings.xml @@ -1,11 +1,26 @@ + + - "Switch to full-screen camera" - "Button is now front-facing camera" - "Button is now rear-facing camera" - "Stop recording video" - "Using front-facing camera" - "Using rear-facing camera" - "Take photo" + "Switch to full-screen camera" + "Switch to camera preview" + "Switch to front-facing camera" + "Switch to rear-facing camera" + "Take photo" + "Retake photo" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-es-rUS/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-es-rUS/strings.xml index a98e74c08..f10356496 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-es-rUS/strings.xml @@ -1,11 +1,26 @@ + + - "Cambiar a cámara en pantalla completa" - "El botón cambió a la cámara frontal" - "El botón cambió a la cámara trasera" - "Detener la grabación de video" - "Usando la cámara frontal" - "Usando la cámara trasera" - "Tomar una foto" + "Cambiar a cámara en pantalla completa" + "Cambiar a vista previa de la cámara" + "Cambiar a cámara frontal" + "Cambiar a cámara trasera" + "Tomar foto" + "Volver a tomar foto" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-es/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-es/strings.xml index 5c4391ebc..5afb8c8c3 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-es/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-es/strings.xml @@ -1,11 +1,26 @@ + + - "Cambiar a cámara en pantalla completa" - "El botón se usa ahora para la cámara frontal" - "El botón se usa ahora para la cámara trasera" - "Detener la grabación de vídeo" - "Estás utilizando la cámara frontal" - "Estás utilizando la cámara trasera" - "Hacer una foto" + "Cambiar a la cámara en pantalla completa" + "Cambiar a la vista previa de la cámara" + "Cambiar a la cámara frontal" + "Cambiar a la cámara trasera" + "Hacer una foto" + "Repetir la foto" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-et/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-et/strings.xml index d82dcd5df..d4c37fee9 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-et/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-et/strings.xml @@ -1,11 +1,26 @@ + + - "Täisekraaniga kaamerale lülitamine" - "Nuppu kasutatakse nüüd esikaamera jaoks" - "Nuppu kasutatakse nüüd tagakaamera jaoks" - "Video salvestamise peatamine" - "Esikaamera kasutamine" - "Tagakaamera kasutamine" - "Foto jäädvustamine" + "Täisekraaniga kaamerale lülitumine" + "Kaamera eelvaatele lülitumine" + "Esikaamerale lülitumine" + "Tagakaamerale lülitumine" + "Foto jäädvustamine" + "Foto uuesti jäädvustamine" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-eu/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-eu/strings.xml index b3c20c9e1..4271983ed 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-eu/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-eu/strings.xml @@ -1,11 +1,26 @@ + + - "Erabili pantaila osoko kamera" - "Orain, aurreko kamera erabiltzeko da botoia" - "Orain, atzeko kamera erabiltzeko da botoia" - "Utzi bideoa grabatzeari" - "Aurreko kamera erabiltzen" - "Atzeko kamera erabiltzen" - "Atera argazkia" + "Erabili pantaila osoko kamera" + "Erabili kameraren aurrebista" + "Erabili aurreko kamera" + "Erabili atzeko kamera" + "Atera argazkia" + "Atera berriro argazkia" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-fa/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-fa/strings.xml index 24e757bae..5d5877101 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-fa/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-fa/strings.xml @@ -1,11 +1,26 @@ + + - "جابه‌جایی به دوربین تمام صفحه" - "اکنون دکمه، دوربین جلو است" - "اکنون دکمه، دوربین عقب است" - "توقف ضبط ویدیو" - "استفاده از دوربین جلو" - "استفاده از دوربین عقب" - "عکس گرفتن" + "رفتن به دوربین تمام صفحه" + "رفتن به پیش‌نمایش دوربین" + "رفتن به دوربین جلو" + "رفتن به دوربین عقب" + "عکس گرفتن" + "عکس گرفتن مجدد" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-fi/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-fi/strings.xml index 5a3ddd8ce..9d7cb0922 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-fi/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-fi/strings.xml @@ -1,11 +1,26 @@ + + - "Siirry koko näytön kameraan" - "Painikkeeseen on nyt määritetty etukamera." - "Painikkeeseen on nyt määritetty takakamera." - "Lopeta videon tallentaminen" - "Etukamera käytössä" - "Takakamera käytössä" - "Ota kuva" + "Siirry koko näytön kameraan" + "Siirry kameran esikatseluun" + "Vaihda etukameraan" + "Vaihda takakameraan" + "Ota kuva" + "Ota kuva uudelleen" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-fr-rCA/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-fr-rCA/strings.xml index f0e644e18..b20284080 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-fr-rCA/strings.xml @@ -1,11 +1,26 @@ + + - "Passer au mode plein écran de l\'appareil photo" - "Le bouton est maintenant utilisé pour l\'appareil photo avant" - "Le bouton est maintenant utilisé pour l\'appareil photo arrière" - "Arrêter l\'enregistrement vidéo" - "Utilisation de la caméra avant" - "Utilisation de la caméra arrière" - "Prendre une photo" + "Passer au mode Plein écran de l\'appareil photo" + "Passer au mode Aperçu de l\'appareil photo" + "Passer à l\'appareil photo avant" + "Passer à l\'appareil photo arrière" + "Prendre une photo" + "Reprendre la photo" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-fr/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-fr/strings.xml index 72de07f44..a9cfe7124 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-fr/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-fr/strings.xml @@ -1,11 +1,26 @@ + + - "Passer en caméra plein écran" - "Le bouton affiche désormais la caméra frontale." - "Le bouton affiche désormais la caméra arrière." - "Arrêter l\'enregistrement vidéo" - "Caméra frontale activée" - "Caméra arrière activée" - "Prendre une photo" + "Passer en mode plein écran" + "Passer en mode aperçu" + "Utiliser la caméra avant" + "Utiliser la caméra arrière" + "Prendre une photo" + "Reprendre la photo" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-gl/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-gl/strings.xml index 2ab1ef04a..3568a0fc3 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-gl/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-gl/strings.xml @@ -1,11 +1,26 @@ + + - "Cambiar á cámara de pantalla completa" - "Agora o botón é a cámara dianteira" - "Agora o botón é a cámara traseira" - "Deter gravación de vídeo" - "Estase utilizando a cámara frontal" - "Estase utilizando a cámara traseira" - "Tirar foto" + "Cambia á cámara de pantalla completa" + "Cambia á vista previa da cámara" + "Cambia á cámara frontal" + "Cambia á cámara traseira" + "Tira unha foto" + "Repite a foto" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-gu/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-gu/strings.xml index 60780d940..88037b582 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-gu/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-gu/strings.xml @@ -1,11 +1,26 @@ + + - "પૂર્ણ સ્ક્રીન કૅમેરા પર સ્વિચ કરો" - "બટન હવે આગળનો કૅમેરો છે" - "બટન હવે પાછળનો કૅમેરો છે" - "વિડિઓ રેકોર્ડિંગ બંધ કરો" - "આગળના કૅમેરાનો ઉપયોગ કરી રહ્યાં છે" - "પાછળના કૅમેરાનો ઉપયોગ કરી રહ્યાં છે" - "ફોટો લો" + "પૂર્ણ સ્ક્રીન કૅમેરા પર સ્વિચ કરો" + "કૅમેરા પૂર્વાવલોકન પર સ્વીચ કરો" + "ફ્ર્ન્ટ ફેસિંગ કૅમેરા પર સ્વિચ કરો" + "પાછળના કૅમેરા પર સ્વિચ કરો" + "ફોટો લો" + "ફોટો ફરીથી લો" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-hi/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-hi/strings.xml index cf89a7d16..09a441f08 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-hi/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-hi/strings.xml @@ -1,11 +1,26 @@ + + - "पूर्ण स्क्रीन कैमरा पर स्विच करें" - "बटन अब सामने का कैमरा है" - "बटन अब पीछे का कैमरा है" - "वीडियो रिकॉर्ड करना बंद करें" - "आगे वाले कैमरे का उपयोग करना" - "पीछे वाले कैमरे का उपयोग करना" - "फ़ोटो लें" + "पूर्ण स्क्रीन कैमरे में बदलें" + "कैमरा पूर्वावलोकन में बदलें" + "सामने वाले कैमरे में बदलें" + "पीछे वाले कैमरे में बदलें" + "फ़ोटो लें" + "फि‍र से फ़ोटो लें" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-hr/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-hr/strings.xml index 3d59fd40f..2dca9bd45 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-hr/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-hr/strings.xml @@ -1,11 +1,26 @@ + + - "Prebaci na fotoaparat na punom zaslonu" - "Gumb je sada za prednji fotoaparat" - "Gumb je sada za stražnji fotoaparat" - "Zaustavi snimanje videozapisa" - "Upotreba prednje kamere" - "Upotreba stražnje kamere" - "Snimi fotografiju" + "Prebaci na prikaz fotoaparata preko cijelog zaslona" + "Prebaci na pregled fotoaparata" + "Prebaci na prednji fotoaparat" + "Prebaci na stražnji fotoaparat" + "Snimi fotografiju" + "Ponovno snimi fotografiju" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-hu/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-hu/strings.xml index 1639ca7d2..5007b3f73 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-hu/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-hu/strings.xml @@ -1,11 +1,26 @@ + + - "Váltás teljes képernyős kameranézetre" - "A gomb beállítása jelenleg: elülső kamera" - "A gomb beállítása jelenleg: hátsó kamera" - "Videofelvétel leállítása" - "Első kamera használata" - "Hátsó kamera használata" - "Fotó készítése" + "Váltás teljes képernyős kameranézetre" + "Váltás kamera-előnézetre" + "Váltás az első kamerára" + "Váltás a hátsó kamerára" + "Fotó készítése" + "Új felvétel" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-hy/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-hy/strings.xml index 1da5c684d..2c1bd79e6 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-hy/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-hy/strings.xml @@ -1,11 +1,26 @@ + + - "Միացնել լիաէկրան ռեժիմը" - "Կոճակն այժմ առջևի տեսախցիկը միացնելու կոճակն է" - "Կոճակն այժմ հետևի տեսախցիկը միացնելու կոճակն է" - "Դադարեցնել տեսագրումը" - "Օգտագործվում է առջևի տեսախցիկը" - "Օգտագործվում է հետևի տեսախցիկը" - "Լուսանկարել" + "Միացնել լիաէկրան ռեժիմը" + "Միացնել նախադիտման ռեժիմը" + "Միացնել առջևի տեսախցիկը" + "Միացնել հետևի տեսախցիկը" + "Լուսանկարել" + "Նորից լուսանկարել" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-in/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-in/strings.xml index 6073d8e3e..4c922cd41 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-in/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-in/strings.xml @@ -1,11 +1,26 @@ + + - "Beralih ke kamera layar penuh" - "Tombol kini berfungsi untuk kamera depan" - "Tombol kini berfungsi untuk kamera belakang" - "Berhenti merekam video" - "Menggunakan kamera depan" - "Menggunakan kamera belakang" - "Ambil foto" + "Beralih ke kamera layar penuh" + "Beralih ke pratinjau kamera" + "Beralih ke kamera depan" + "Beralih ke kamera belakang" + "Ambil foto" + "Ambil ulang foto" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-is/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-is/strings.xml index d16b2e206..c796d2295 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-is/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-is/strings.xml @@ -1,11 +1,26 @@ + + - "Skipta yfir í myndavél á öllum skjánum" - "Hnappurinn er nú fremri myndavél" - "Hnappurinn er nú aftari myndavél" - "Stöðva upptöku myndskeiðs" - "Notar fremri myndavél" - "Notar aftari myndavél" - "Taka mynd" + "Skipta yfir í myndavél á öllum skjánum" + "Skipta yfir í forskoðun á myndavél" + "Skipta yfir í fremri myndavél" + "Skipta yfir í aftari myndavél" + "Taka mynd" + "Taka mynd aftur" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-it/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-it/strings.xml index 63fac0711..abf5d3f5e 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-it/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-it/strings.xml @@ -1,11 +1,26 @@ + + - "Passa alla fotocamera a schermo intero" - "Il pulsante viene ora utilizzato per la fotocamera frontale" - "Il pulsante viene ora utilizzato per la fotocamera posteriore" - "Interrompi registrazione video" - "In uso la fotocamera frontale" - "In uso la fotocamera posteriore" - "Scatta foto" + "Passa alla fotocamera a schermo intero" + "Passa all\'anteprima della fotocamera" + "Passa alla fotocamera anteriore" + "Passa alla fotocamera posteriore" + "Scatta foto" + "Scatta foto di nuovo" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-iw/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-iw/strings.xml index 3db2e9461..e6aed2e96 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-iw/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-iw/strings.xml @@ -1,11 +1,26 @@ + + - "מעבר למצלמה במסך מלא" - "הלחצן מוגדר עכשיו למצלמה הקדמית" - "הלחצן מוגדר עכשיו למצלמה האחורית" - "עצירה של צילום הווידאו" - "באמצעות המצלמה הקדמית" - "באמצעות המצלמה האחורית" - "צילום תמונה" + "מעבר למצלמה במסך מלא" + "מעבר לתצוגה מקדימה של המצלמה" + "מעבר למצלמה הקדמית" + "מעבר למצלמה האחורית" + "צילום תמונה" + "צילום מחדש של התמונה" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ja/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ja/strings.xml index ffb3a1762..85ef3c8d7 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ja/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ja/strings.xml @@ -1,11 +1,26 @@ + + - "全画面カメラに切り替え" - "現在、ボタンは前面カメラになっています" - "現在、ボタンは背面カメラになっています" - "録画を停止" - "前面カメラを使用しています" - "背面カメラを使用しています" - "写真を撮る" + "全画面カメラに切り替えます" + "カメラのプレビューに切り替えます" + "前面カメラに切り替えます" + "背面カメラに切り替えます" + "写真を撮影します" + "写真を撮り直します" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ka/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ka/strings.xml index 6a94b656c..edaf33ffe 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ka/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ka/strings.xml @@ -1,11 +1,26 @@ + + - "სრულეკრანიან კამერაზე გადართვა" - "ახლა ღილაკი გამოიყენება წინა კამერისთვის" - "ახლა ღილაკი გამოიყენება უკანა კამერისთვის" - "ვიდეოს ჩაწერის შეჩერება" - "თქვენ იყენებთ წინა კამერას" - "თქვენ იყენებთ უკანა კამერას" - "ფოტოს გადაღება" + "სრულეკრანიან კამერაზე გადართვა" + "კამერის წინასწარ ხედზე გადართვა" + "წინა კამერაზე გადართვა" + "უკანა კამერაზე გადართვა" + "ფოტოს გადაღება" + "ფოტოს ხელახლა გადაღება" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-kk/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-kk/strings.xml index 22b89fdbf..795a06392 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-kk/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-kk/strings.xml @@ -1,11 +1,26 @@ + + - "Толық экранды камераға ауысу" - "Түйме – енді алдыңғы камера" - "Түйме – енді артқы камера" - "Бейне жазуды тоқтату" - "Алдыңғы камера қолданылуда" - "Артқы камера қолданылуда" - "Суретке түсіру" + "Толық экранды камераға ауысу" + "Камераның алдын ала көру режиміне ауысу" + "Камераның анфас режиміне ауысу" + "Камераның қалыпты режиміне ауысу" + "Суретке түсіру" + "Суретке қайта түсіру" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-km/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-km/strings.xml index dd547ddc4..377f885cb 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-km/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-km/strings.xml @@ -1,11 +1,26 @@ + + - "ប្ដូរ​ទៅ​កាមេរ៉ា​ពេញ​អេក្រង់" - "ឥឡូវ ប៊ូតុង​ស្ថិត​នៅ​​កាមេរ៉ា​មុខ" - "ឥឡូវ ប៊ូតុងស្ថិត​នៅ​កាមេរ៉ា​ក្រោយ" - "បញ្ឈប់​ការ​ថត​វីដេអូ" - "កំពុង​ប្រើ​ប្រាស់​កាមេរ៉ា​មុខ" - "កំពុង​ប្រើប្រាស់​​​កាមេរ៉ា​ក្រោយ" - "ថតរូប" + "ប្ដូរ​ទៅ​កាមេរ៉ា​ពេញ​អេក្រង់" + "ប្ដូរ​ទៅ​ការមើល​កាមេរ៉ា​សាកល្បង" + "ប្ដូរ​ទៅ​កាមេរ៉ា​ខាង​មុខ" + "ប្តូរទៅកាមេរ៉ាខាងក្រោយ" + "ថតរូប" + "ថតរូប​ឡើងវិញ" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-kn/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-kn/strings.xml index 471cfc9db..1f5d1ea54 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-kn/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-kn/strings.xml @@ -1,11 +1,26 @@ + + - "ಪೂರ್ಣ ಪರದೆ ಕ್ಯಾಮರಾಗೆ ಬದಲಿಸಿ" - "ಬಟನ್ ಈಗ ಮುಂಬದಿ ಕ್ಯಾಮರಾದಲ್ಲಿ" - "ಬಟನ್ ಈಗ ಹಿಂಬದಿ ಕ್ಯಾಮರಾದಲ್ಲಿ" - "ವೀಡಿಯೊ ರೆಕಾರ್ಡಿಂಗ್ ನಿಲ್ಲಿಸಿ" - "ಮುಂಬದಿ ಕ್ಯಾಮರಾ ಬಳಸಲಾಗುತ್ತಿದೆ" - "ಹಿಂಬದಿ ಕ್ಯಾಮರಾ ಬಳಸಲಾಗುತ್ತಿದೆ" - "ಫೋಟೋ ತೆಗೆಯಿರಿ" + "ಪೂರ್ಣ ಪರದೆ ಕ್ಯಾಮರಾಗೆ ಬದಲಿಸಿ" + "ಕ್ಯಾಮರಾ ಪೂರ್ವವೀಕ್ಷಣೆಗೆ ಬದಲಾಯಿಸಿ" + "ಮುಂಬದಿಯ ಕ್ಯಾಮರಾಗೆ ಬದಲಾಯಿಸಿ" + "ಹಿಂಬದಿಯ ಕ್ಯಾಮರಾಗೆ ಬದಲಾಯಿಸಿ" + "ಫೋಟೋ ತೆಗೆಯಿರಿ" + "ಫೋಟೋವನ್ನು ಮರುಸೆರೆಹಿಡಿಯಿರಿ" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ko/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ko/strings.xml index bb5e64dbc..1b675e746 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ko/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ko/strings.xml @@ -1,11 +1,26 @@ + + - "전체화면 카메라로 전환" - "현재 버튼: 전면 카메라" - "현재 버튼: 후면 카메라" - "동영상 녹화 중지" - "전면 카메라 사용 중" - "후면 카메라 사용 중" - "사진 촬영" + "전체화면 카메라로 전환" + "카메라 미리보기로 전환" + "전면 카메라로 전환" + "후면 카메라로 전환" + "사진 찍기" + "사진 다시 찍기" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ky/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ky/strings.xml index fca2893d8..771f5769d 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ky/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ky/strings.xml @@ -1,11 +1,26 @@ + + - "Камераны толук экранга которуу" - "Азыр баскычта \"Маңдайкы камера\" деп жазылып турат" - "Азыр баскычта \"Арткы камера\" деп жазылып турат" - "Видео жаздырууну токтотуу" - "Маңдайкы камера колдонулууда" - "Арткы камера колдонулууда" - "Сүрөткө тартуу" + "Камераны толук экранга которуу" + "Камераны алдын ала көрүү режимине которуу" + "Маңдайкы камерага которуу" + "Арткы камерага которуу" + "Сүрөткө тартуу" + "Кайра сүрөткө тартуу" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-lo/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-lo/strings.xml index 0257e75aa..6bfdf4e76 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-lo/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-lo/strings.xml @@ -1,11 +1,26 @@ + + - "ສະຫຼັບໄປໃຊ້ກ້ອງແບບເຕັມຈໍ" - "ຕອນນີ້ເປັນປຸ່ມກ້ອງໜ້າແລ້ວ" - "ຕອນນີ້ເປັນປຸ່ມກ້ອງຫຼັງແລ້ວ" - "ຢຸດການບັນທຶກວິດີໂອ" - "ກຳລັງໃຊ້ກ້ອງໜ້າ" - "ກຳລັງໃຊ້ກ້ອງຫຼັງ" - "ຖ່າຍຮູບ" + "ສະຫຼັບໄປໃຊ້ກ້ອງແບບເຕັມຈໍ" + "ສະຫຼັບໄປໃຊ້ຕົວຢ່າງກ້ອງ" + "ສະຫຼັບໄປໃຊ້ກ້ອງໜ້າ" + "ສະຫຼັບໄປໃຊ້ກ້ອງຫຼັງ" + "ຖ່າຍຮູບ" + "ຖ່າຍຮູບໃໝ່" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-lt/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-lt/strings.xml index 62c6de992..6ff3b0db6 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-lt/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-lt/strings.xml @@ -1,11 +1,26 @@ + + - "Perjungti į viso ekrano režimu veikiantį fotoaparatą" - "Dabar tai yra priekinio fotoaparato mygtukas" - "Dabar tai yra užpakalinio fotoaparato mygtukas" - "Sustabdyti vaizdo įrašymą" - "Naudojamas priekinis fotoaparatas" - "Naudojamas užpakalinis fotoaparatas" - "Fotografuoti" + "Perjungti į viso ekrano režimu veikiantį fotoaparatą" + "Perjungti į fotoaparato peržiūrą" + "Perjungti į priekinį fotoaparatą" + "Perjungti į užpakalinį fotoaparatą" + "Fotografuoti" + "Fotografuoti iš naujo" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-lv/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-lv/strings.xml index 4800f6bb1..d6d4782fb 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-lv/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-lv/strings.xml @@ -1,11 +1,26 @@ + + - "Pārslēgties uz pilnekrāna kameru" - "Poga tagad tiek izmantota priekšējai kamerai" - "Poga tagad tiek izmantota aizmugurējai kamerai" - "Pārtraukt videoklipa ierakstīšanu" - "Tiek izmantota priekšējā kamera" - "Tiek izmantota aizmugurējā kamera" - "Uzņemt fotoattēlu" + "Pārslēgt uz pilnekrāna kameru" + "Pārslēgt uz kameras priekšskatījumu" + "Pārslēgt uz priekšējo kameru" + "Pārslēgt uz aizmugurējo kameru" + "Uzņemt fotoattēlu" + "Atkārtoti uzņemt fotoattēlu" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-mk/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-mk/strings.xml index 82c466fb4..a0f84a035 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-mk/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-mk/strings.xml @@ -1,11 +1,26 @@ + + - "Префрлете на камера на цел екран" - "Копчето е сега предна камера" - "Копчето е сега задна камера" - "Сопрете со снимање видео" - "Се користи предната камера" - "Се користи задната камера" - "Фотографирај" + "Префрлете на камера на цел екран" + "Префрлете на преглед на камера" + "Префрлете на предна камера" + "Префрлете на задна камера" + "Фотографирај" + "Фотографирај пак" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ml/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ml/strings.xml index 0423da257..77c0a4f85 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ml/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ml/strings.xml @@ -1,11 +1,26 @@ + + - "പൂർണ്ണസ്ക്രീൻ ക്യാമറയിലേക്ക് മാറുക" - "ബട്ടൺ അമർത്തിയാൻ മുൻ ക്യാമറ ലഭിക്കും" - "ബട്ടൺ അമർത്തിയാൻ പിൻ ക്യാമറ ലഭിക്കും" - "വീഡിയോ റെക്കോർഡുചെയ്യൽ നിർത്തുക" - "മുൻവശത്തെ ക്യാമറ ഉപയോഗിക്കുന്നു" - "പിൻഭാഗത്തുള്ള ക്യാമറ ഉപയോഗിക്കുന്നു" - "ഫോട്ടോ എടുക്കുക" + "പൂർണ്ണസ്ക്രീൻ ക്യാമറയിലേക്ക് മാറുക" + "ക്യാമറ പ്രിവ്യൂവിലേക്ക് മാറുക" + "മുൻ ക്യാമറയിലേക്ക് മാറുക" + "പിൻ ക്യാമറയിലേക്ക് മാറുക" + "ഫോട്ടോ എടുക്കുക" + "ഫോട്ടോ വീണ്ടുമെടുക്കുക" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-mn/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-mn/strings.xml index 024e00468..1894634ea 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-mn/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-mn/strings.xml @@ -1,11 +1,26 @@ + + - "Бүтэн дэлгэцийн камер руу сэлгэх" - "Товчлуур нь урд талын камер боллоо" - "Товчлуур нь ард талын камер боллоо" - "Видео бичилтийг зогсоох" - "Урд камер ашиглаж байна" - "Арын камер ашиглаж байна" - "Зураг авах" + "Бүтэн дэлгэцийн камер руу сэлгэх" + "Камерын урьдчилан үзэх рүү сэлгэх" + "Урд талын камер руу сэлгэх" + "Ар талын камер руу сэлгэх" + "Зураг авах" + "Зураг дахин авах" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-mr/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-mr/strings.xml index bc9c2fb1d..24c1931d9 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-mr/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-mr/strings.xml @@ -1,11 +1,26 @@ + + - "पूर्ण स्क्रीन कॅमेर्‍यावर स्विच करा" - "बटण आता पुढील कॅमेरा आहे" - "बटण आता मागील कॅमेरा आहे" - "व्हिडिओ रेकॉर्ड करणे थांबवा" - "समोरील कॅमेरा वापरत आहे" - "मागील कॅमेरा वापरत आहे" - "फोटो घ्‍या" + "पूर्ण स्क्रीन कॅमेर्‍यावर स्विच करा" + "कॅमेरा पूर्वावलोकनावर स्विच करा" + "समोरील कॅमऱ्यावर स्विच करा" + "मागील कॅमेर्‍यावर स्‍विच करा" + "फोटो घ्‍या" + "फोटो पुन्हा घ्या" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ms/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ms/strings.xml index 3245b9c9f..44806f53e 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ms/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ms/strings.xml @@ -1,11 +1,26 @@ + + - "Tukar kepada kamera skrin penuh" - "Butang kini kamera depan" - "Butang kini kamera belakang" - "Berhenti merakam video" - "Menggunakan kamera depan" - "Menggunakan kamera belakang" - "Ambil foto" + "Beralih ke kamera skrin penuh" + "Beralih ke pratonton kamera" + "Beralih ke kamera menghadap depan" + "Beralih ke kamera menghadap belakang" + "Ambil foto" + "Ambil semula foto" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-my/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-my/strings.xml index 884c0c896..7112abc7d 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-my/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-my/strings.xml @@ -1,11 +1,26 @@ + + - "မျက်နှာပြင်အပြည့်ကင်မရာသို့ ပြောင်းရန်" - "ခလုတ်မှာ အရှေ့ကင်မရာအတွက် ဖြစ်သွားပါပြီ" - "ခလုတ်မှာ အနောက်ကင်မရာအတွက် ဖြစ်သွားပါပြီ" - "ဗီဒီယိုရိုက်ကူးခြင်း ရပ်ရန်" - "အရှေ့ကင်မရာကို သုံးနေသည်" - "အနောက်ကင်မရာကို သုံးနေသည်" - "ဓာတ်ပုံရိုက်ရန်" + "မျက်နှာပြင်အပြည့်ကင်မရာသို့ ပြောင်းရန်" + "ကင်မရာအစမ်းကြည့်ရှုမှုသို့ ပြောင်းရန်" + "အရှေ့ကင်မရာသို့ ပြောင်းရန်" + "အနောက်ကင်မရာသို့ ပြောင်းရန်" + "ဓာတ်ပုံရိုက်ရန်" + "ဓာတ်ပုံပြန်ရိုက်ရန်" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-nb/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-nb/strings.xml index bfa58ed61..5e5fb601e 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-nb/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-nb/strings.xml @@ -1,11 +1,26 @@ + + - "Bytt til fullskjermkamera" - "Nå er knappen frontkameraet" - "Nå er knappen det bakre kameraet" - "Slutt å filme" - "Bruker frontkameraet" - "Bruker det bakre kameraet" - "Ta et bilde" + "Bytt til fullskjermkamera" + "Bytt til forhåndsvisning for kamera" + "Bytt til frontkamera" + "Bytt til bakovervendt kamera" + "Ta bilde" + "Ta bilde på nytt" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ne/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ne/strings.xml index 1362b328b..d8ea7954c 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ne/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ne/strings.xml @@ -1,11 +1,26 @@ + + - "पूर्ण स्क्रिन क्यामेरामा बदल्नुहोस्" - "बटन अब अगाडिको क्यामेराका लागि हो" - "बटन अब पछाडिको क्यामेराका लागि हो" - "भिडियो रेकर्ड रोक्नुहोस्" - "अगाडिको क्यामेरा प्रयोग गरिँदै" - "पछाडिको क्यामेरा प्रयोग गरिँदै" - "तस्बिर खिच्नुहोस्" + "पूर्ण स्क्रिन क्यामेरामा बदल्नुहोस्" + "क्यामेराको पूर्वावलोकन मोडमा बदल्नुहोस्" + "अगाडिपट्टिको क्यामेरामा बदल्नुहोस्" + "पछाडिपट्टिको क्यामेरामा बदल्नुहोस्" + "तस्बिर खिच्नुहोस्" + "पुन: तस्बिर खिच्नुहोस्" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-nl/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-nl/strings.xml index 94f271875..0369fedaa 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-nl/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-nl/strings.xml @@ -1,11 +1,26 @@ + + - "Overschakelen naar camera op volledig scherm" - "De knop wordt nu gebruikt voor de camera aan de voorzijde" - "De knop wordt nu gebruikt voor de camera aan de achterzijde" - "Video-opname stoppen" - "De camera aan de voorzijde wordt gebruikt" - "De camera aan de achterzijde wordt gebruikt" - "Foto maken" + "Overschakelen naar camera op volledig scherm" + "Overschakelen naar cameravoorbeeld" + "Overschakelen naar camera aan voorzijde" + "Overschakelen naar camera aan achterzijde" + "Foto maken" + "Foto opnieuw maken" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-no/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-no/strings.xml index bfa58ed61..5e5fb601e 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-no/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-no/strings.xml @@ -1,11 +1,26 @@ + + - "Bytt til fullskjermkamera" - "Nå er knappen frontkameraet" - "Nå er knappen det bakre kameraet" - "Slutt å filme" - "Bruker frontkameraet" - "Bruker det bakre kameraet" - "Ta et bilde" + "Bytt til fullskjermkamera" + "Bytt til forhåndsvisning for kamera" + "Bytt til frontkamera" + "Bytt til bakovervendt kamera" + "Ta bilde" + "Ta bilde på nytt" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-pa/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-pa/strings.xml index 4296c9804..e1247e071 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-pa/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-pa/strings.xml @@ -1,11 +1,26 @@ + + - "ਬਦਲੀ ਕਰਕੇ ਸੰਪੂਰਨ ਸਕ੍ਰੀਨ ਕੈਮਰਾ \'ਤੇ ਜਾਓ" - "ਬਟਨ ਹੁਣ ਮੂਹਰਲਾ ਕੈਮਰਾ ਹੈ" - "ਬਟਨ ਹੁਣ ਪਿਛਲਾ ਕੈਮਰਾ ਹੈ" - "ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰਨਾ ਬੰਦ ਕਰੋ" - "ਮੂਹਰਲਾ ਕੈਮਰਾ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ" - "ਪਿਛਲਾ ਕੈਮਰਾ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ" - "ਫ਼ੋਟੋ ਖਿੱਚੋ" + "ਬਦਲੀ ਕਰਕੇ ਸੰਪੂਰਨ ਸਕ੍ਰੀਨ ਕੈਮਰੇ \'ਤੇ ਜਾਓ" + "ਬਦਲੀ ਕਰਕੇ ਕੈਮਰਾ ਪੂਰਵ-ਝਲਕ \'ਤੇ ਜਾਓ" + "ਬਦਲੀ ਕਰਕੇ ਮੂਹਰਲੇ ਕੈਮਰੇ \'ਤੇ ਜਾਓ" + "ਬਦਲੀ ਕਰਕੇ ਪਿਛਲੇ ਕੈਮਰੇ \'ਤੇ ਜਾਓ" + "ਫ਼ੋਟੋ ਖਿੱਚੋ" + "ਫ਼ੋਟੋ ਮੁੜ-ਖਿੱਚੋ" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-pl/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-pl/strings.xml index 0e03e2d87..b85afa6aa 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-pl/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-pl/strings.xml @@ -1,11 +1,26 @@ + + - "Włącz aparat pełnoekranowy" - "Przycisk włącza teraz przedni aparat" - "Przycisk włącza teraz tylny aparat" - "Zatrzymaj nagrywanie filmu" - "Używany jest przedni aparat" - "Używany jest tylny aparat" - "Zrób zdjęcie" + "Przełącz na aparat pełnoekranowy" + "Przełącz na podgląd aparatu" + "Przełącz na przedni aparat" + "Przełącz na tylny aparat" + "Zrób zdjęcie" + "Zrób nowe zdjęcie" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-pt-rBR/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-pt-rBR/strings.xml index 7c1fa0723..59f457c43 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-pt-rBR/strings.xml @@ -1,11 +1,26 @@ + + - "Alternar para câmera em tela cheia" - "O botão agora está na câmera frontal" - "O botão agora está na câmera traseira" - "Parar gravação de vídeo" - "Usando a câmera frontal" - "Usando a câmera traseira" - "Tirar foto" + "Alternar para câmera em tela cheia" + "Alternar para visualização da câmera" + "Alternar para câmera frontal" + "Alternar para câmera traseira" + "Tirar foto" + "Tirar foto novamente" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-pt-rPT/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-pt-rPT/strings.xml index 661b4d943..71f651dcb 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-pt-rPT/strings.xml @@ -1,11 +1,26 @@ + + - "Mudar para a câmara de ecrã completo" - "O botão é agora utilizado para a câmara frontal" - "O botão é agora utilizado para a câmara posterior" - "Parar a gravação de vídeo" - "A utilizar a câmara frontal" - "A utilizar a câmara posterior" - "Tirar foto" + "Mudar para a câmara de ecrã completo" + "Mudar para a pré-visualização da câmara" + "Mudar para a câmara frontal" + "Mudar para a câmara traseira" + "Tirar foto" + "Tirar nova foto" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-pt/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-pt/strings.xml index 7c1fa0723..59f457c43 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-pt/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-pt/strings.xml @@ -1,11 +1,26 @@ + + - "Alternar para câmera em tela cheia" - "O botão agora está na câmera frontal" - "O botão agora está na câmera traseira" - "Parar gravação de vídeo" - "Usando a câmera frontal" - "Usando a câmera traseira" - "Tirar foto" + "Alternar para câmera em tela cheia" + "Alternar para visualização da câmera" + "Alternar para câmera frontal" + "Alternar para câmera traseira" + "Tirar foto" + "Tirar foto novamente" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ro/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ro/strings.xml index 98d00502b..f491f2887 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ro/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ro/strings.xml @@ -1,11 +1,26 @@ + + - "Comutați la camera pe ecran complet" - "Acum butonul este pentru camera foto frontală." - "Acum butonul este pentru camera foto posterioară." - "Opriți înregistrarea video" - "Este folosită camera foto frontală" - "Este folosită camera foto posterioară" - "Fotografiați" + "Comutați la camera pe ecran complet" + "Comutați la previzualizarea camerei" + "Comutați la camera frontală" + "Comutați la camera posterioară" + "Fotografiați" + "Refaceți fotografia" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ru/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ru/strings.xml index a4c7206d0..9de3cabab 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ru/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ru/strings.xml @@ -1,11 +1,26 @@ + + - "Перейти в полноэкранный режим" - "Сейчас на кнопке написано: Фронтальная камера" - "Сейчас на кнопке написано: Основная камера" - "Остановить запись видео" - "Используется фронтальная камера" - "Используется основная камера" - "Сделать снимок" + "Переключиться в полноэкранный режим" + "Переключиться в режим предварительного просмотра" + "Переключиться на фронтальную камеру" + "Переключиться на основную камеру" + "Сделать снимок" + "Новый снимок" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-si/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-si/strings.xml index 6cc5eef43..1747d1a37 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-si/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-si/strings.xml @@ -1,11 +1,26 @@ + + - "පූර්ණ තිර කැමරාව වෙත මාරුවීම" - "බොත්තම දැන් ඉදිරිපස කැමරාවයි" - "බොත්තම දැන් පිටුපස කැමරාවයි" - "වීඩියෝව පටිගත කිරීම නැවැත්වීම" - "ඉදිරිපස කැමරාව භාවිත කරමින්" - "පසුපස කැමරාව භාවිත කරමින්" - "ඡායාරූපය ගන්න" + "පූර්ණ තිර කැමරාව වෙත මාරුවීම" + "කැමරා පෙරදසුන වෙත මාරුවීම" + "ඉදිරිපසට මුහුණලා ඇති කැමරාව වෙත මාරුවීම" + "පසුපසට මුහුණලා ඇති කැමරාව වෙත මාරුවීම" + "ඡායාරූපය ගැනීම" + "ඡායාරූපය නැවත ගැනීම" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-sk/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-sk/strings.xml index 916158bcc..a053e2f3b 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-sk/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-sk/strings.xml @@ -1,11 +1,26 @@ + + - "Prepnúť na fotoaparát na celej obrazovke" - "Tlačidlo sa nachádza v polohe Predný fotoaparát" - "Tlačidlo sa nachádza v polohe Zadný fotoaparát" - "Zastaviť zaznamenávanie videa" - "Používa sa predný fotoaparát" - "Používa sa zadný fotoaparát" - "Odfotiť" + "Prepnúť na fotoaparát na celej obrazovke" + "Prepnúť na ukážku z fotoaparátu" + "Prepnúť na predný fotoaparát" + "Prepnúť na zadný fotoaparát" + "Odfotiť" + "Znova odfotiť" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-sl/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-sl/strings.xml index ef1fe2029..b50aaaea9 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-sl/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-sl/strings.xml @@ -1,11 +1,26 @@ + + - "Preklopi v celozaslonski način fotoaparata" - "Gumb zdaj upravlja sprednji fotoaparat" - "Gumb zdaj upravlja hrbtni fotoaparat" - "Ustavi snemanje videoposnetka" - "Uporaba fotoaparata spredaj" - "Uporaba fotoaparata zadaj" - "Posnemi fotografijo" + "Preklopi v celozaslonski način fotoaparata" + "Preklopi v predogled fotoaparata" + "Preklopi na fotoaparat na sprednji strani" + "Preklopi na fotoaparat na zadnji strani" + "Posnemi fotografijo" + "Znova posnemi fotografijo" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-sq/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-sq/strings.xml index ff8cb8771..4be0317dc 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-sq/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-sq/strings.xml @@ -1,11 +1,26 @@ + + - "Kalo në kamerën me ekran të plotë" - "Butoni tani është kamera e përparme" - "Butoni tani është kamera e pasme" - "Ndalo regjistrimin e videos" - "Po përdor kamerën e përparme" - "Po përdor kamerën e pasme" - "Bëj një fotografi" + "Kalo në kamerën me ekran të plotë" + "Kalo te pamja paraprake e kamerës" + "Kalo te kamera e përparme" + "Kalo te kamera e pasme" + "Bëj një fotografi" + "Bëje përsëri fotografinë" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-sr/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-sr/strings.xml index 17150b4f2..4afcbe914 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-sr/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-sr/strings.xml @@ -1,11 +1,26 @@ + + - "Пређите на приказ камере преко целог екрана" - "Дугме сад активира предњу камеру" - "Дугме сад активира задњу камеру" - "Зауставите снимање видеа" - "Користимо предњу камеру" - "Користимо задњу камеру" - "Снимите слику" + "Пребаците на приказ камере преко целог екрана" + "Пребаците на преглед камере" + "Пребаците на предњу камеру" + "Пребаците на задњу камеру" + "Снимите слику" + "Поново снимите слику" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-sv/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-sv/strings.xml index 309147913..8bd00ccd9 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-sv/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-sv/strings.xml @@ -1,11 +1,26 @@ + + - "Byt till fullskärmskamera" - "Knappen är nu framåtvänd kamera" - "Knappen är nu bakåtvänd kamera" - "Sluta spela in video" - "Använder främre kamera" - "Använder bakre kamera" - "Ta en bild" + "Växla till helskärmskamera" + "Växla till förhandsgranskning i kameran" + "Växla till den framåtvända kameran" + "Växla till den bakåtvända kameran" + "Ta en bild" + "Ta en ny bild" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-sw/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-sw/strings.xml index 8608b75a2..c951ac6a2 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-sw/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-sw/strings.xml @@ -1,11 +1,26 @@ + + - "Badilisha utumie kamera ya skrini nzima" - "Kitufe hiki sasa ni kamera ya mbele" - "Kitufe hiki sasa ni kamera ya nyuma" - "Acha kurekodi video" - "Inatumia kamera ya mbele" - "Inatumia kamera ya nyuma" - "Piga picha" + "Badili utumie kamera ya skrini nzima" + "Badili utumie onyesha la kuchungulia la kamera" + "Badili utumie kamera ya mbele" + "Badili utumie kamera ya nyuma" + "Piga picha" + "Piga picha tena" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ta/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ta/strings.xml index 9c42144e8..374cfcfe2 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ta/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ta/strings.xml @@ -1,11 +1,26 @@ + + - "முழுத் திரை கேமராவிற்கு மாறும்" - "இப்போது முன்புறக் கேமராவைக் குறிக்கும் பொத்தான்" - "இப்போது பின்புறக் கேமராவைக் குறிக்கும் பொத்தான்" - "வீடியோ ரெக்கார்டு செய்யப்படுவதை நிறுத்தும்" - "முன்பக்கக் கேமராவைப் பயன்படுத்துகிறீர்கள்" - "பின்பக்கக் கேமராவைப் பயன்படுத்துகிறீர்கள்" - "படமெடுக்கும்" + "முழுத் திரை கேமராவிற்கு மாறும் பொத்தான்" + "கேமரா மாதிரிக்காட்சிக்கு மாறும் பொத்தான்" + "முன்பக்க கேமராவிற்கு மாறும் பொத்தான்" + "பின்பக்க கேமராவிற்கு மாறும் பொத்தான்" + "படமெடுக்கும் பொத்தான்" + "மீண்டும் படமெடுக்கும் பொத்தான்" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-te/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-te/strings.xml index 4587593b5..099fa67a7 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-te/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-te/strings.xml @@ -1,11 +1,26 @@ + + - "పూర్తి స్క్రీన్ కెమెరాకు మారుస్తుంది" - "బటన్ ఇప్పుడు ముందువైపు కెమెరాగా పని చేస్తోంది" - "బటన్ ఇప్పుడు వెనుకవైపు కెమెరాగా పని చేస్తోంది" - "వీడియో రికార్డింగ్‌ను ఆపివేస్తుంది" - "ముందు కెమెరాను ఉపయోగిస్తున్నాము" - "వెనుక కెమెరాను ఉపయోగిస్తున్నాము" - "ఫోటో తీస్తుంది" + "పూర్తి స్క్రీన్ కెమెరాకు మారుస్తుంది" + "కెమెరా పరిదృశ్యానికి మారుస్తుంది" + "ముందువైపు కెమెరాకు మారుస్తుంది" + "వెనుకవైపు కెమెరాకు మారుస్తుంది" + "ఫోటో తీస్తుంది" + "ఫోటోను మళ్లీ తీస్తుంది" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-th/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-th/strings.xml index 9b1150f0e..62c69a3e5 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-th/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-th/strings.xml @@ -1,11 +1,26 @@ + + - "สลับไปยังกล้องแบบเต็มหน้าจอ" - "ขณะนี้ปุ่มเป็นกล้องหน้า" - "ขณะนี้ปุ่มเป็นกล้องหลัง" - "หยุดการบันทึกวิดีโอ" - "กำลังใช้กล้องหน้า" - "กำลังใช้กล้องหลัง" - "ถ่ายภาพ" + "เปลี่ยนเป็นกล้องแบบเต็มหน้าจอ" + "เปลี่ยนเป็นการแสดงตัวอย่างจากกล้อง" + "เปลี่ยนเป็นกล้องหน้า" + "เปลี่ยนเป็นกล้องหลัง" + "ถ่ายภาพ" + "ถ่ายภาพอีกครั้ง" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-tl/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-tl/strings.xml index 5fd98c14d..2f6fb83c3 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-tl/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-tl/strings.xml @@ -1,11 +1,26 @@ + + - "Lumilipat sa camera na full screen" - "Ang button ay para na sa camera sa harap" - "Ang button ay para na sa camera sa likod" - "Ihinihinto ang pagre-record ng video" - "Ginagamit ang camera sa harap" - "Ginagamit ang camera sa likuran" - "Kumuha ng larawan" + "Lumipat sa camera na full screen" + "Lumipat sa preview ng camera" + "Lumipat sa camera na nasa harap" + "Lumipat sa camera na nasa likod" + "Kumuha ng larawan" + "Kunang muli" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-tr/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-tr/strings.xml index 80b0b940f..da54ac88d 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-tr/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-tr/strings.xml @@ -1,11 +1,26 @@ + + - "Tam ekran kameraya geçer" - "Düğme artık ön kamera için kullanılıyor" - "Düğme artık arka kamera için kullanılıyor" - "Video kaydını durdurur" - "Ön kamera kullanılıyor" - "Arka kamera kullanılıyor" - "Fotoğraf çeker" + "Tam ekran kameraya geçer" + "Kamera önizlemesine geçer" + "Ön kameraya geçer" + "Arka kameraya geçer" + "Fotoğraf çeker" + "Fotoğrafı yeniden çeker" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-uk/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-uk/strings.xml index c2506158f..cea540a9e 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-uk/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-uk/strings.xml @@ -1,11 +1,26 @@ + + - "Показ зображення з камери на весь екран" - "Зараз це кнопка камери на передній панелі" - "Зараз це кнопка камери на задній панелі" - "Зупинення запису відео" - "Використання фронтальної камери" - "Використання задньої камери" - "Зйомка фото" + "Показ зображення з камери на весь екран" + "Попередній перегляд зображення з камери" + "Перейти до фронтальної камери" + "Перейти до задньої камери" + "Зробити фото" + "Зробити фото ще раз" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-ur/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-ur/strings.xml index edd417856..585a55a03 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-ur/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-ur/strings.xml @@ -1,11 +1,26 @@ + + - "پوری اسکرین کے کیمرہ پر سوئچ کریں" - "بٹن اب فرنٹ کیمرا ہے" - "بٹن اب بیک کیمرا ہے" - "ویڈیو ریکارڈ کرنے کو روکیں" - "فرنٹ کیمرا استعمال ہو رہا ہے" - "بیک کیمرا استعمال ہو رہا ہے" - "تصویر لیں" + "پوری اسکرین کے کیمرہ پر سوئچ کریں" + "کیمرہ پیش منظر پر سوئچ کریں" + "فرنٹ والے کیمرے پر سوئچ کریں" + "عقب والے کیمرے پر سوئچ کریں" + "تصویر لیں" + "دوبارہ تصویر لیں" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-uz/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-uz/strings.xml index 037767359..8441d887c 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-uz/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-uz/strings.xml @@ -1,11 +1,26 @@ + + - "To‘liq ekranli rejimga o‘tish" - "Endi bu old kamera tugmasi" - "Endi bu orqa kamera tugmasi" - "Videoga olishni to‘xtatish" - "Old kameradan foydalanilmoqda" - "Orqa kameradan foydalanilmoqda" - "Suratga olish" + "To‘liq ekranli rejimga o‘tish" + "Oldindan ko‘rish rejimiga o‘tish" + "Old kamerani yoqish" + "Orqa kamerani yoqish" + "Rasmga olish" + "Yangi rasmga olish" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-vi/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-vi/strings.xml index 81a0e62c0..054666455 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-vi/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-vi/strings.xml @@ -1,11 +1,26 @@ + + - "Chuyển sang máy ảnh toàn màn hình" - "Hiện tại, nút ở chế độ máy ảnh mặt trước" - "Hiện tại, nút ở chế độ máy ảnh mặt sau" - "Dừng quay video" - "Đang sử dụng máy ảnh trước" - "Đang sử dụng máy ảnh sau" - "Chụp ảnh" + "Chuyển sang máy ảnh toàn màn hình" + "Chuyển sang chế độ xem trước máy ảnh" + "Chuyển sang máy ảnh mặt trước" + "Chuyển sang máy ảnh mặt sau" + "Chụp ảnh" + "Chụp lại ảnh" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rCN/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rCN/strings.xml index 311569c54..24e9c1a63 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rCN/strings.xml @@ -1,11 +1,26 @@ + + - "切换到全屏相机模式" - "点按按钮可切换到前置摄像头" - "点按按钮可切换到后置摄像头" - "停止录制视频" - "正在使用前置摄像头" - "正在使用后置摄像头" - "拍照" + "切换到全屏相机模式" + "切换到相机预览模式" + "切换到前置摄像头" + "切换到后置摄像头" + "拍照" + "重拍照片" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rHK/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rHK/strings.xml index 890a18fc0..0310b10e6 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rHK/strings.xml @@ -1,11 +1,26 @@ + + - "切換至全屏攝像" - "按鈕目前為前置鏡頭" - "按鈕目前為後置鏡頭" - "停止錄製影片" - "使用前置鏡頭" - "使用後置鏡頭" - "拍照" + "切換至全螢幕相機" + "切換至相機預覽" + "切換至前置鏡頭" + "切換至後置鏡頭" + "拍照" + "重新拍照" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rTW/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rTW/strings.xml index 30fa03bfe..d41ddda25 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-zh-rTW/strings.xml @@ -1,11 +1,26 @@ + + - "切換至全螢幕相機" - "按鈕目前設定為前置鏡頭" - "按鈕目前設定為後置鏡頭" - "停止錄影" - "目前使用的是前置鏡頭" - "目前使用的是後置鏡頭" - "拍攝相片" + "切換至全螢幕相機" + "切換至相機預覽畫面" + "切換至前置鏡頭" + "切換至後置鏡頭" + "拍照" + "重新拍照" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values-zu/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values-zu/strings.xml index 33a9284a4..6e147b7f9 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values-zu/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values-zu/strings.xml @@ -1,11 +1,26 @@ + + - "Shintshela kukhamera yesikrini esigcwele" - "Inkinobho manje iyikhamera yangaphambili" - "Inkinobho manje iyikhamera yangemuva" - "Misa ukurekhoda ividiyo" - "Isebenzisa ikhamera yangaphambili" - "Isebenzisa ikhamera yangemuva" - "Thatha isithombe" + "Shintshela kukhamera yesikrini esigcwele" + "Shintshela ekuhloleni kuqala kwekhamera" + "Shintshela kwikhamera yangaphambili" + "Shintshela kwikhamera ebheke emuva" + "Thatha isithombe" + "Thatha kabusha isithombe" diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values/dimens.xml b/java/com/android/dialer/callcomposer/cameraui/res/values/dimens.xml index 09d4a58fd..e3d5c2406 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values/dimens.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values/dimens.xml @@ -16,7 +16,7 @@ --> 22dp - 46dp + 48dp 84dp 4dp \ No newline at end of file diff --git a/java/com/android/dialer/callcomposer/cameraui/res/values/strings.xml b/java/com/android/dialer/callcomposer/cameraui/res/values/strings.xml index 999fe8f96..4db79683f 100644 --- a/java/com/android/dialer/callcomposer/cameraui/res/values/strings.xml +++ b/java/com/android/dialer/callcomposer/cameraui/res/values/strings.xml @@ -1,17 +1,30 @@ + - Switch to full screen camera + Switch to full screen camera + + Switch to camera preview - Button is now front camera + Switch to front facing camera - Button is now back camera - - Stop recording video - - Using front camera - - Using back camera + Switch to back facing camera - Take photo + Take photo + + Retake photo \ No newline at end of file diff --git a/java/com/android/dialer/callcomposer/proto/call_composer_contact.proto b/java/com/android/dialer/callcomposer/proto/call_composer_contact.proto deleted file mode 100644 index 99766aac5..000000000 --- a/java/com/android/dialer/callcomposer/proto/call_composer_contact.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto2"; - -option java_package = "com.android.dialer.callcomposer"; -option java_multiple_files = true; -option optimize_for = LITE_RUNTIME; - -package com.android.dialer.callcomposer; - -message CallComposerContact { - optional fixed64 photo_id = 1; - optional string photo_uri = 2; - optional string contact_uri = 3; - optional string name_or_number = 4; - optional string number = 6; - optional string display_number = 7; - optional string number_label = 8; - optional int32 contact_type = 9; -} diff --git a/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml b/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml index c3f1102d1..48d6368c2 100644 --- a/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml +++ b/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml @@ -15,11 +15,11 @@ ~ limitations under the License --> + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/background" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/call_composer_background_color"> @@ -58,6 +62,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" + android:maxLines="1" + android:ellipsize="end" android:textColor="@color/background_dialer_white" android:textSize="@dimen/call_composer_number_text_size"/> @@ -70,10 +76,22 @@ android:background="@drawable/call_composer_contact_border"/> - + + + + + + + android:background="?android:attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/description_call_composer_camera"/> + android:background="?android:attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/description_call_composer_photo"/> + android:background="?android:attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/description_call_composer_message"/> @@ -70,7 +69,7 @@ android:background="@color/background_dialer_white" android:textCursorDrawable="@drawable/searchedittext_custom_cursor" android:layout_toStartOf="@+id/remaining_characters" - android:inputType="textShortMessage" + android:inputType="textShortMessage|textCapSentences" android:imeOptions="flagNoExtractUi|actionSend"/> "Deel en bel" "prent %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "prent" - "Neem \'n foto" "Kon nie kameraprent laai nie" "Laat toe" "Verleen toegang tot kamera om \'n foto te neem" "Verleen toegang tot media om \'n prent te deel" + "Neem \'n foto" + "Kies \'n foto" + "Stuur \'n boodskap" + "Foto is via Boodskappe gestuur" + "Boodskap is via Boodskappe gestuur" + "Stuur tans prent …" diff --git a/java/com/android/dialer/callcomposer/res/values-am/strings.xml b/java/com/android/dialer/callcomposer/res/values-am/strings.xml index c44249090..b41210953 100644 --- a/java/com/android/dialer/callcomposer/res/values-am/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-am/strings.xml @@ -25,9 +25,14 @@ "ያጋሩ እና ይደውሉ" "ምስል %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "ምስል" - "ፎቶ አንሳ" "የካሜራ ምስልን መጫን አልተቻለም" "ፍቀድ" "ፎቶ ያንሱ፣ ለካሜራ መዳረሻ ይስጡ" "አንድ ምስል ለማጋራት ለማህደረ መረጃ መዳረሻ ይስጡ" + "ፎቶ ያንሱ" + "ፎቶ ይምረጡ" + "መልዕክት ይላኩ" + "ፎቶ በመልዕክቶች በኩል ተልኳል" + "መልዕክት በመልዕክቶች በኩል ተልኳል" + "ምስል በመላክ ላይ…" diff --git a/java/com/android/dialer/callcomposer/res/values-ar/strings.xml b/java/com/android/dialer/callcomposer/res/values-ar/strings.xml index ba43f0fd9..ee811bdd5 100644 --- a/java/com/android/dialer/callcomposer/res/values-ar/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ar/strings.xml @@ -25,9 +25,14 @@ "المشاركة والاتصال" "الصورة %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "صورة" - "التقاط صورة" "يتعذر تحميل صورة الكاميرا" "سماح" "لالتقاط صورة، يجب منح إذن بالدخول إلى الكاميرا" "لمشاركة صورة، يجب منح إذن بالدخول إلى الوسائط" + "التقاط صورة" + "اختيار صورة" + "إرسال رسالة" + "‏صورة مرسلة عبر Messages" + "‏رسالة مرسلة عبر Messages" + "جارٍ إرسال الصورة..." diff --git a/java/com/android/dialer/callcomposer/res/values-az/strings.xml b/java/com/android/dialer/callcomposer/res/values-az/strings.xml index 2f913d9bc..2d1a26c5a 100644 --- a/java/com/android/dialer/callcomposer/res/values-az/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-az/strings.xml @@ -25,9 +25,14 @@ "Paylaşın və zəng edin" "şəkil %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "şəkil" - "Şəkil çəkin" "Kamera şəklini yükləmək olmur" "İcazə verin" "Şəkil çəkmək üçün kameraya giriş icazəsi verin" "Şəkli paylaşmaq üçün Mediaya giriş icazəsi verin" + "Şəkil çəkin" + "Foto seçin" + "Mesaj göndərin" + "Foto Mesajlaşma tətbiqi vasitəsilə göndərildi" + "Mesaj Mesajlaşma tətbiqi vasitəsilə göndərildi" + "Şəkil göndərilir..." diff --git a/java/com/android/dialer/callcomposer/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/callcomposer/res/values-b+sr+Latn/strings.xml index c357d506f..fbe93d2d5 100644 --- a/java/com/android/dialer/callcomposer/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-b+sr+Latn/strings.xml @@ -25,9 +25,14 @@ "Deli i pozovi" "slika, %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "slika" - "Slikajte" "Učitavanje slike sa kamere nije uspelo" "Dozvoli" "Odobrite pristup Kameri da biste snimili sliku" "Odobrite pristup Medijima da biste delili sliku" + "Slikajte" + "Izaberite sliku" + "Pošaljite poruku" + "Slika je poslata preko Messages-a" + "Poruka je poslata preko Messages-a" + "Šalje se slika…" diff --git a/java/com/android/dialer/callcomposer/res/values-be/strings.xml b/java/com/android/dialer/callcomposer/res/values-be/strings.xml index bb3244b19..5197f714e 100644 --- a/java/com/android/dialer/callcomposer/res/values-be/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-be/strings.xml @@ -25,9 +25,14 @@ "Абагуліць і выклікаць" "відарыс %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "відарыс" - "Зрабіць фота" "Не ўдалося загрузіць відарыс з камеры" "Дазволіць" "Каб зрабіць фота, адкрыйце доступ да Камеры" "Каб абагуліць відарыс, адкрыйце доступ да медыяфайлаў" + "Зрабіць фота" + "Выбраць фота" + "Адправіць паведамленне" + "Фота адпраўлена праз праграму \"Паведамленні\"" + "Паведамленне адпраўлена праз праграму \"Паведамленні\"" + "Адпраўка відарыса..." diff --git a/java/com/android/dialer/callcomposer/res/values-bg/strings.xml b/java/com/android/dialer/callcomposer/res/values-bg/strings.xml index 1bc05cd8b..7b431ce4e 100644 --- a/java/com/android/dialer/callcomposer/res/values-bg/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-bg/strings.xml @@ -25,9 +25,14 @@ "Споделяне и обаждане" "изображение от %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "изображение" - "Правене на снимка" "Изображението от камерата не можа да се зареди" "Разрешаване" "За да направите снимка, разрешете достъп до Камера" "За да споделите изображение, разрешете достъп до Медии" + "Правене на снимка" + "Избиране на снимка" + "Изпращане на съобщение" + "Снимката е изпратена чрез Messages" + "Съобщението е изпратено чрез Messages" + "Изображението се изпраща…" diff --git a/java/com/android/dialer/callcomposer/res/values-bn/strings.xml b/java/com/android/dialer/callcomposer/res/values-bn/strings.xml index e991b3b34..17559b40c 100644 --- a/java/com/android/dialer/callcomposer/res/values-bn/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-bn/strings.xml @@ -25,9 +25,14 @@ "শেয়ার এবং কল করুন" "ছবি %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "ছবি" - "একটি ফটো তুলুন" "ক্যামেরার ছবি লোড করা গেল না" "অনুমতি দিন" "একটি ফটো নিতে, ক্যামেরাতে অ্যাক্সেস দিন" "কোনো ছবি শেয়ার করতে, মিডিয়াতে অ্যাক্সেস দিন" + "একটি ছবি তুলুন" + "একটি ফটো বেছে নিন" + "একটি বার্তা পাঠান" + "Messages এর সাহায্যে ফটো পাঠানো হয়েছে" + "Messages-এর সাহায্যে বার্তা পাঠানো হয়েছে" + "ফটো পাঠানো হচ্ছে…" diff --git a/java/com/android/dialer/callcomposer/res/values-bs/strings.xml b/java/com/android/dialer/callcomposer/res/values-bs/strings.xml index 7d0b8d26f..d486f94e1 100644 --- a/java/com/android/dialer/callcomposer/res/values-bs/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-bs/strings.xml @@ -25,9 +25,14 @@ "Podijeli i pozovi" "slika %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "slika" - "Snimi fotografiju" "Nije moguće učitati sliku s kamere" "Dozvoli" "Da snimite fotografiju, dajte pristup Kameri" "Da podijelite sliku, dozvolite pristup Medijima" + "Uslikaj" + "Odaberi fotografiju" + "Pošalji poruku" + "Fotografija je poslana putem aplikacije Messages" + "Poruka je poslana putem aplikacije Messages" + "Slanje slike…" diff --git a/java/com/android/dialer/callcomposer/res/values-ca/strings.xml b/java/com/android/dialer/callcomposer/res/values-ca/strings.xml index 4fa52ad63..6b77b1836 100644 --- a/java/com/android/dialer/callcomposer/res/values-ca/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ca/strings.xml @@ -25,9 +25,14 @@ "Comparteix i truca" "imatge del dia %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "imatge" - "Fes una foto" "No s\'ha pogut carregar la imatge de la càmera" "Permet" - "Per fer una foto, dóna accés a la càmera" - "Per compartir una imatge, dóna accés al contingut multimèdia" + "Per fer una foto, dona accés a la càmera" + "Per compartir una imatge, dona accés al contingut multimèdia" + "Fes una foto" + "Tria una foto" + "Envia un missatge" + "Foto enviada mitjançant Missatges" + "Missatge enviat mitjançant Missatges" + "S\'està enviant la imatge…" diff --git a/java/com/android/dialer/callcomposer/res/values-cs/strings.xml b/java/com/android/dialer/callcomposer/res/values-cs/strings.xml index 93ae0c124..916953733 100644 --- a/java/com/android/dialer/callcomposer/res/values-cs/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-cs/strings.xml @@ -25,9 +25,14 @@ "Sdílet a zavolat" "obrázek %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "obrázek" - "Fotit" "Obrázek z fotoaparátu se nepodařilo načíst" "Povolit" "Chcete-li pořídit fotku, povolte přístup k fotoaparátu" "Pokud chcete sdílet fotku, povolte přístup k mediálním souborům" + "Vyfotit" + "Vybrat fotku" + "Poslat zprávu" + "Fotka poslaná v aplikaci Zprávy" + "Zpráva poslaná v aplikaci Zprávy" + "Odesílání obrázku…" diff --git a/java/com/android/dialer/callcomposer/res/values-da/strings.xml b/java/com/android/dialer/callcomposer/res/values-da/strings.xml index b1e3e6db9..f720d5973 100644 --- a/java/com/android/dialer/callcomposer/res/values-da/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-da/strings.xml @@ -25,9 +25,14 @@ "Del og ring" "billede %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "billede" - "Tag et billede" "Kamerabilledet kan ikke indlæses" "Tillad" "Du skal give adgang til kameraet for at tage et billede" "Du skal give adgang til medier for at dele et billede" + "Tag et billede" + "Vælg et billede" + "Send en sms" + "Fotoet blev sendt via Beskeder" + "Beskeden blev sendt via Beskeder" + "Billedet sendes…" diff --git a/java/com/android/dialer/callcomposer/res/values-de/strings.xml b/java/com/android/dialer/callcomposer/res/values-de/strings.xml index 9b9c13add..3f3767e6f 100644 --- a/java/com/android/dialer/callcomposer/res/values-de/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-de/strings.xml @@ -25,9 +25,14 @@ "Teilen und anrufen" "Bild: %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "Bild" - "Foto aufnehmen" "Kamerabild konnte nicht geladen werden" "Zulassen" "Um ein Foto aufzunehmen, musst du den Zugriff auf die Kamera erlauben." "Um ein Bild zu teilen, musst du den Zugriff auf deine Medien erlauben." + "Bild aufnehmen" + "Foto auswählen" + "Nachricht senden" + "Foto über Messages gesendet" + "Nachricht über Messages gesendet." + "Bild wird gesendet…" diff --git a/java/com/android/dialer/callcomposer/res/values-el/strings.xml b/java/com/android/dialer/callcomposer/res/values-el/strings.xml index 45fce843f..9a8ed5d96 100644 --- a/java/com/android/dialer/callcomposer/res/values-el/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-el/strings.xml @@ -25,9 +25,14 @@ "Κοινοποίηση και κλήση" "εικόνα %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "εικόνα" - "Λήψη φωτογραφίας" "Δεν ήταν δυνατή η φόρτωση της εικόνας φωτογραφικής μηχανής" "Να επιτρέπεται" "Για να τραβήξετε μια φωτογραφία, παραχωρήστε πρόσβαση στην κάμερα" "Για να μοιραστείτε μια εικόνα, παραχωρήστε πρόσβαση στα πολυμέσα" + "Λήψη φωτογραφίας" + "Επιλογή φωτογραφίας" + "Αποστολή μηνύματος" + "Η φωτογραφία στάλθηκε μέσω του Messages" + "Το μήνυμα στάλθηκε μέσω του Messages" + "Αποστολή εικόνας…" diff --git a/java/com/android/dialer/callcomposer/res/values-en-rAU/strings.xml b/java/com/android/dialer/callcomposer/res/values-en-rAU/strings.xml index c34cbbd1b..4e4edcfa9 100644 --- a/java/com/android/dialer/callcomposer/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-en-rAU/strings.xml @@ -25,9 +25,14 @@ "Share and call" "image %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "image" - "Take a photo" "Couldn\'t load camera image" "Allow" "To take a photo, give access to Camera" "To share an image, give access to Media" + "Take a picture" + "Choose a photo" + "Sending a message" + "Photo sent via Messages" + "Message sent via Messages" + "Sending image…" diff --git a/java/com/android/dialer/callcomposer/res/values-en-rGB/strings.xml b/java/com/android/dialer/callcomposer/res/values-en-rGB/strings.xml index c34cbbd1b..4e4edcfa9 100644 --- a/java/com/android/dialer/callcomposer/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-en-rGB/strings.xml @@ -25,9 +25,14 @@ "Share and call" "image %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "image" - "Take a photo" "Couldn\'t load camera image" "Allow" "To take a photo, give access to Camera" "To share an image, give access to Media" + "Take a picture" + "Choose a photo" + "Sending a message" + "Photo sent via Messages" + "Message sent via Messages" + "Sending image…" diff --git a/java/com/android/dialer/callcomposer/res/values-en-rIN/strings.xml b/java/com/android/dialer/callcomposer/res/values-en-rIN/strings.xml index c34cbbd1b..4e4edcfa9 100644 --- a/java/com/android/dialer/callcomposer/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-en-rIN/strings.xml @@ -25,9 +25,14 @@ "Share and call" "image %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "image" - "Take a photo" "Couldn\'t load camera image" "Allow" "To take a photo, give access to Camera" "To share an image, give access to Media" + "Take a picture" + "Choose a photo" + "Sending a message" + "Photo sent via Messages" + "Message sent via Messages" + "Sending image…" diff --git a/java/com/android/dialer/callcomposer/res/values-es-rUS/strings.xml b/java/com/android/dialer/callcomposer/res/values-es-rUS/strings.xml index 797d00124..f06f5f03e 100644 --- a/java/com/android/dialer/callcomposer/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-es-rUS/strings.xml @@ -25,9 +25,14 @@ "Compartir y llamar" "imagen del %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "imagen" - "Tomar una foto" "No se pudo cargar la imagen de la cámara" "Permitir" "Para tomar una foto, permite el acceso a la cámara" "Para compartir una imagen, permite el acceso al contenido multimedia" + "Tomar una foto" + "Elegir una foto" + "Enviar un mensaje" + "Foto enviada por Mensajes" + "Mensaje de texto enviado por Mensajes" + "Enviando imagen…" diff --git a/java/com/android/dialer/callcomposer/res/values-es/strings.xml b/java/com/android/dialer/callcomposer/res/values-es/strings.xml index 8a4e7d690..a8b919502 100644 --- a/java/com/android/dialer/callcomposer/res/values-es/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-es/strings.xml @@ -25,9 +25,14 @@ "Compartir y llamar" "imagen del %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "imagen" - "Hacer fotos" "No se ha podido cargar la imagen de la cámara" "Permitir" "Para hacer una foto, permite el acceso a la cámara" "Para compartir una imagen, permite el acceso al contenido multimedia" + "Hacer una foto" + "Elegir una foto" + "Enviar un mensaje" + "Foto enviada a través de Mensajes" + "Mensaje enviado a través de Mensajes" + "Enviando la imagen…" diff --git a/java/com/android/dialer/callcomposer/res/values-et/strings.xml b/java/com/android/dialer/callcomposer/res/values-et/strings.xml index 17b77a255..24548fb23 100644 --- a/java/com/android/dialer/callcomposer/res/values-et/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-et/strings.xml @@ -25,9 +25,14 @@ "Jaga ja helista" "pilt: %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "pilt" - "Foto jäädvustamine" "Kaamera kujutist ei õnnestunud laadida" "Luba" "Foto jäädvustamiseks lubage juurdepääs kaamerale" "Pildi jagamiseks lubage juurdepääs meediale" + "Pildistamine" + "Foto valimine" + "Sõnumi saatmine" + "Foto saadeti rakenduse Messages kaudu" + "Sõnum saadeti rakenduse Messages kaudu" + "Kujutise saatmine …" diff --git a/java/com/android/dialer/callcomposer/res/values-eu/strings.xml b/java/com/android/dialer/callcomposer/res/values-eu/strings.xml index be2aba7ca..012c62c31 100644 --- a/java/com/android/dialer/callcomposer/res/values-eu/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-eu/strings.xml @@ -25,9 +25,14 @@ "Partekatu eta deitu" "irudiaren data: %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "irudia" - "Atera argazki bat" "Ezin izan da kargatu kamerako irudia" "Baimendu" "Argazkiak ateratzeko, eman kamera atzitzeko baimena" "Irudiak partekatzeko, eman multimedia-edukirako sarbidea" + "Atera argazki bat" + "Aukeratu argazki bat" + "Bidali mezu bat" + "Mezuak aplikazioaren bidez bidali da argazkia" + "Mezuak aplikazioaren bidez bidali da mezua" + "Irudia bidaltzen…" diff --git a/java/com/android/dialer/callcomposer/res/values-fa/strings.xml b/java/com/android/dialer/callcomposer/res/values-fa/strings.xml index 9d588b232..eb97796cd 100644 --- a/java/com/android/dialer/callcomposer/res/values-fa/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-fa/strings.xml @@ -25,9 +25,14 @@ "اشتراک‌گذاری و تماس" "تصویر %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "تصویر" - "عکس گرفتن" "تصویر دوربین بار نشد" "مجاز است" "برای عکس گرفتن، به دوربین اجازه دسترسی بدهید" "برای اشتراک‌گذاری تصویر، به رسانه اجازه دسترسی بدهید" + "عکس گرفتن" + "انتخاب عکس" + "ارسال پیام" + "عکس ارسال‌شده ازطریق «پیام‌ها»" + "پیام ارسال‌شده ازطریق «پیام‌ها»" + "درحال ارسال تصویر…" diff --git a/java/com/android/dialer/callcomposer/res/values-fi/strings.xml b/java/com/android/dialer/callcomposer/res/values-fi/strings.xml index 98821bc6f..892bd969a 100644 --- a/java/com/android/dialer/callcomposer/res/values-fi/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-fi/strings.xml @@ -25,9 +25,14 @@ "Jaa ja soita" "kuva (%1$tB %1$te %1$tY %1$tl %1$tM %1$tp)" "kuva" - "Ota kuva" "Kamerakuvan lataus epäonnistui." "Salli" "Jos haluat ottaa valokuvan, salli kameran käyttö." "Jos haluat jakaa kuvan, salli kuvien käyttö." + "Ota kuva" + "Valitse kuva" + "Lähetä viesti" + "Kuva lähetettiin Messages-sovelluksen kautta" + "Viesti lähetettiin Messages-sovelluksen kautta" + "Lähetetään kuvaa…" diff --git a/java/com/android/dialer/callcomposer/res/values-fr-rCA/strings.xml b/java/com/android/dialer/callcomposer/res/values-fr-rCA/strings.xml index 29c001d6c..000d6eb7a 100644 --- a/java/com/android/dialer/callcomposer/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-fr-rCA/strings.xml @@ -25,9 +25,14 @@ "Partager et appeler" "image : %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "image" - "Prendre une photo" "Impossible de charger l\'image de l\'appareil photo" "Autoriser" "Pour prendre une photo, autorisez l\'accès à l\'appareil photo" "Pour partager une image, autorisez l\'accès au contenu multimédia" + "Prendre une photo" + "Choisir une photo" + "Envoyer un message" + "Photo envoyée au moyen de l\'application Messages" + "Message envoyé au moyen de l\'application Messages" + "Envoi de l\'image en cours…" diff --git a/java/com/android/dialer/callcomposer/res/values-fr/strings.xml b/java/com/android/dialer/callcomposer/res/values-fr/strings.xml index ab562898a..40b89a367 100644 --- a/java/com/android/dialer/callcomposer/res/values-fr/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-fr/strings.xml @@ -25,9 +25,14 @@ "Partager et appeler" "image %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "image" - "Prendre une photo" "Impossible de charger l\'image de la caméra" "Autoriser" "Pour prendre une photo, accordez l\'accès à l\'appareil photo." "Pour partager une image, accordez l\'accès aux fichiers multimédia." + "Prendre une photo" + "Choisir une photo" + "Envoyer un message" + "Photo envoyée via l\'application Messages" + "Message envoyé via l\'application Messages" + "Envoi de l\'image…" diff --git a/java/com/android/dialer/callcomposer/res/values-gl/strings.xml b/java/com/android/dialer/callcomposer/res/values-gl/strings.xml index 5c867683f..55bf5aa3c 100644 --- a/java/com/android/dialer/callcomposer/res/values-gl/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-gl/strings.xml @@ -25,9 +25,14 @@ "Compartir e chamar" "Imaxe do %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "Imaxe" - "Tirar unha foto" "Non se puido cargar a imaxe da cámara" "Permitir" "Para sacar unha foto, concede permiso de acceso á cámara" "Para compartir unha imaxe, concede permiso de acceso aos ficheiros multimedia" + "Tira unha foto" + "Escolle unha foto" + "Envía unha mensaxe" + "Foto enviada a través de Mensaxes" + "Mensaxe enviada a través de Mensaxes" + "Enviando imaxe…" diff --git a/java/com/android/dialer/callcomposer/res/values-gu/strings.xml b/java/com/android/dialer/callcomposer/res/values-gu/strings.xml index c948d2ea5..13f4c843d 100644 --- a/java/com/android/dialer/callcomposer/res/values-gu/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-gu/strings.xml @@ -25,9 +25,14 @@ "શેર કરો અને કૉલ કરો" "છબી %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "છબી" - "એક ફોટો લો" "કૅમેરા છબી લોડ કરી શકાઈ નથી" "મંજૂરી આપો" "ફોટો લેવા માટે, કૅમેરાની ઍક્સેસ આપો" "છબી શેર કરવા, મીડિયાની ઍક્સેસ આપો" + "એક ચિત્ર લો" + "ફોટો પસંદ કરો" + "એક સંદેશ મોકલો" + "Messages મારફતે ફોટો મોકલ્યો" + "Messages મારફતે સંદેશ મોકલ્યો" + "છબી મોકલી રહ્યાં છીએ..." diff --git a/java/com/android/dialer/callcomposer/res/values-hi/strings.xml b/java/com/android/dialer/callcomposer/res/values-hi/strings.xml index 6cfdb1664..5d39d0306 100644 --- a/java/com/android/dialer/callcomposer/res/values-hi/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-hi/strings.xml @@ -25,9 +25,14 @@ "साझा करें और कॉल करें" "चित्र %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "चित्र" - "कोई फ़ोटो लें" "कैमरे का चित्र लोड नहीं किया जा सका" "अनुमति दें" "फ़ोटो लेने के लिए, कैमरे की ऐक्सेस दें" "चित्र साझा करने के लिए, मीडिया की ऐक्सेस दें" + "चित्र लें" + "एक फ़ोटो चुनें" + "संदेश भेजें" + "संदेश ऐप्लिकेशन के ज़रिए फ़ोटो भेजा गया" + "संदेश ऐप्लिकेशन के ज़रिए संदेश भेजा गया" + "चित्र भेजा जा रहा है…" diff --git a/java/com/android/dialer/callcomposer/res/values-hr/strings.xml b/java/com/android/dialer/callcomposer/res/values-hr/strings.xml index 613f1f473..551438845 100644 --- a/java/com/android/dialer/callcomposer/res/values-hr/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-hr/strings.xml @@ -25,9 +25,14 @@ "Dijeli i pozovi" "slika %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "slika" - "Snimi fotografiju" "Slika se ne može učitati" "Omogući" "Da biste snimili fotografiju, dopustite pristup Fotoaparatu" "Za dijeljenje slike dopustite pristup Medijima" + "Snimi fotografiju" + "Odaberi fotografiju" + "Pošalji poruku" + "Fotografija poslana putem Poruka" + "Poruka poslana putem Poruka" + "Slanje slike..." diff --git a/java/com/android/dialer/callcomposer/res/values-hu/strings.xml b/java/com/android/dialer/callcomposer/res/values-hu/strings.xml index 451fcb4eb..caf7577b1 100644 --- a/java/com/android/dialer/callcomposer/res/values-hu/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-hu/strings.xml @@ -25,9 +25,14 @@ "Megosztás és hívás" "kép: %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "kép" - "Fotó készítése" "Nem lehetett betölteni a kamera képét" "Engedélyezés" "Fotó készítéséhez adjon hozzáférést a fényképezőgéphez" "Kép megosztásához adjon hozzáférést a médiafájlokhoz" + "Kép készítése" + "Fotó kiválasztása" + "Üzenet küldése" + "Fotó elküldve a Messages alkalmazásban" + "Üzenet elküldve a Messages alkalmazásban" + "Kép küldése…" diff --git a/java/com/android/dialer/callcomposer/res/values-hy/strings.xml b/java/com/android/dialer/callcomposer/res/values-hy/strings.xml index 43793d6e2..ae7e6add3 100644 --- a/java/com/android/dialer/callcomposer/res/values-hy/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-hy/strings.xml @@ -25,9 +25,14 @@ "Կիսվել և զանգել" "պատկեր %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "պատկեր" - "Լուսանկարել" "Չհաջողվեց բեռնել տեսախցիկի պատկերը" "Թույլատրել" "Լուսանկարելու համար տրամադրեք Խցիկն օգտագործելու հնարավորություն" "Որևէ պատկերով կիսվելու համար տրամադրեք մեդիանյութերն օգտագործելու հնարավորություն" + "Լուսանկարել" + "Ընտրել լուսանկար" + "Ուղարկել հաղորդագրություն" + "Լուսանկարն ուղարկվել է Messages-ի միջոցով" + "Հաղորդագրությունն ուղարկվել է Messages-ի միջոցով" + "Պատկերի ուղարկում…" diff --git a/java/com/android/dialer/callcomposer/res/values-in/strings.xml b/java/com/android/dialer/callcomposer/res/values-in/strings.xml index 4f9081011..3d3cba70c 100644 --- a/java/com/android/dialer/callcomposer/res/values-in/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-in/strings.xml @@ -25,9 +25,14 @@ "Bagikan dan telepon" "gambar %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "gambar" - "Mengambil foto" "Tidak dapat memuat gambar kamera" "Izinkan" "Untuk mengambil foto, berikan akses ke Kamera" "Untuk membagikan gambar, berikan akses ke Media" + "Jepret" + "Pilih foto" + "Mengirim pesan" + "Foto dikirim lewat Message" + "Pesan dikirim lewat Message" + "Mengirim gambar…" diff --git a/java/com/android/dialer/callcomposer/res/values-is/strings.xml b/java/com/android/dialer/callcomposer/res/values-is/strings.xml index 5ca30503d..ae3e12364 100644 --- a/java/com/android/dialer/callcomposer/res/values-is/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-is/strings.xml @@ -25,9 +25,14 @@ "Deila og hringja" "mynd %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "mynd" - "Taka mynd" "Ekki var hægt að hlaða mynd frá myndavél" "Leyfa" "Til að taka mynd skaltu veita myndavélinni aðgang" "Til að deila mynd skaltu veita margmiðlunarefni aðgang" + "Taka mynd" + "Velja mynd" + "Senda skilaboð" + "Mynd send með Messages" + "Skilaboð send með Messages" + "Sendir mynd…" diff --git a/java/com/android/dialer/callcomposer/res/values-it/strings.xml b/java/com/android/dialer/callcomposer/res/values-it/strings.xml index 40c893f84..f06b0d85d 100644 --- a/java/com/android/dialer/callcomposer/res/values-it/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-it/strings.xml @@ -25,9 +25,14 @@ "Condividi e chiama" "immagine: %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "immagine" - "Scatta una foto" "Impossibile caricare l\'immagine della fotocamera" "Consenti" "Per poter scattare una foto devi concedere l\'accesso alla fotocamera" "Per condividere un\'immagine, devi concedere l\'accesso ai contenuti multimediali" + "Scatta una foto" + "Scegli una foto" + "Invia un messaggio" + "Foto inviata tramite Messaggi" + "Messaggio inviato tramite Messaggi" + "Invio dell\'immagine…" diff --git a/java/com/android/dialer/callcomposer/res/values-iw/strings.xml b/java/com/android/dialer/callcomposer/res/values-iw/strings.xml index e1557dc04..8ed808b26 100644 --- a/java/com/android/dialer/callcomposer/res/values-iw/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-iw/strings.xml @@ -25,9 +25,14 @@ "שתף והתקשר" "תמונה %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "תמונה" - "צלם תמונה" "לא ניתן לטעון את התמונה מהמצלמה" "אפשר" "כדי שתוכל לצלם תמונות עליך להעניק לאפליקציה גישה למצלמה" "כדי שתוכל לשתף תמונות עליך להעניק לאפליקציה גישה למדיה" + "צילום תמונה" + "בחירת תמונה" + "שליחת הודעה" + "‏התמונה נשלחה דרך אפליקציית Messages" + "‏ההודעה נשלחה דרך אפליקציית Messages" + "התמונה נשלחת…" diff --git a/java/com/android/dialer/callcomposer/res/values-ja/strings.xml b/java/com/android/dialer/callcomposer/res/values-ja/strings.xml index bc8161db6..61ad0ce82 100644 --- a/java/com/android/dialer/callcomposer/res/values-ja/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ja/strings.xml @@ -25,9 +25,14 @@ "共有して発信" "画像(%1$tB %1$te %1$tY %1$tl %1$tM %1$tp)" "画像" - "写真を撮る" "カメラ内の画像を読み込めませんでした" "許可" "写真を撮るには、まずカメラへのアクセスを許可してください" "画像を共有するには、まずメディアへのアクセスを許可してください" + "画像を撮影します" + "写真を選択します" + "メッセージを送信します" + "Android メッセージで写真が送信されました" + "Android メッセージでメッセージが送信されました" + "画像を送信しています…" diff --git a/java/com/android/dialer/callcomposer/res/values-ka/strings.xml b/java/com/android/dialer/callcomposer/res/values-ka/strings.xml index 79f39ab81..4d65fa327 100644 --- a/java/com/android/dialer/callcomposer/res/values-ka/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ka/strings.xml @@ -25,9 +25,14 @@ "გაზიარება და დარეკვა" "სურათი, %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "სურათი" - "ფოტოს გადაღება" "კამერის სურათი ვერ ჩაიტვირთა" "ნების დართვა" "ფოტოს გადასაღებად მიეცით კამერაზე წვდომა" "სურათის გასაზიარებლად მიეცით მედიაზე წვდომა" + "სურათის გადაღება" + "ფოტოს არჩევა" + "შეტყობინების გაგზავნა" + "ფოტო გაიგზავნა Messages აპიდან" + "შეტყობინება გაიგზავნა Messages აპიდან" + "მიმდინარეობს სურათის გაგზავნა…" diff --git a/java/com/android/dialer/callcomposer/res/values-kk/strings.xml b/java/com/android/dialer/callcomposer/res/values-kk/strings.xml index ffe045f95..80f9caa5b 100644 --- a/java/com/android/dialer/callcomposer/res/values-kk/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-kk/strings.xml @@ -25,9 +25,14 @@ "Бөлісу және қоңырау шалу" "сурет, %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "сурет" - "Суретке түсіру" "Камера суреті жүктелмеді" "Рұқсат беру" "Суретке түсіру үшін камераға кіруге рұқсат беріңіз" "Суретті жіберу үшін медиафайлға кіруге рұқсат беріңіз" + "Суретке түсіру" + "Суретті таңдау" + "Хабар жіберу" + "Сурет Messages арқылы жіберілді" + "Хабар Messages арқылы жіберілді" + "Сурет жіберілуде..." diff --git a/java/com/android/dialer/callcomposer/res/values-km/strings.xml b/java/com/android/dialer/callcomposer/res/values-km/strings.xml index 4444bceeb..b16534c47 100644 --- a/java/com/android/dialer/callcomposer/res/values-km/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-km/strings.xml @@ -25,9 +25,14 @@ "ចែករំលែក និង​ហៅ​ទូរសព្ទ" "រូបភាព %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "រូបភាព" - "ថតរូប" "មិន​អាច​ផ្ទុក​រូបភាព​​​ពី​កាមេរ៉ា​បាន​ទេ" "អនុញ្ញាត" "ដើម្បីថតរូប សូមអនុញ្ញាត​ឲ្យចូលប្រើប្រាស់​កាមេរ៉ា" "ដើម្បីចែករំលែករូបភាព សូមអនុញ្ញាត​ឲ្យចូលប្រើប្រាស់​មេឌៀ" + "ថតរូប" + "ជ្រើសរើស​រូបថត" + "ផ្ញើសារ" + "រូបថត​ដែល​បាន​ផ្ញើ​តាមរយៈ Messages" + "សារ​ដែល​បាន​ផ្ញើ​តាមរយៈ Messages" + "កំពុង​ផ្ញើ​រូបភាព..." diff --git a/java/com/android/dialer/callcomposer/res/values-kn/strings.xml b/java/com/android/dialer/callcomposer/res/values-kn/strings.xml index f50bdcce4..59de5e7b6 100644 --- a/java/com/android/dialer/callcomposer/res/values-kn/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-kn/strings.xml @@ -25,9 +25,14 @@ "ಹಂಚಿಕೊಳ್ಳಿ ಮತ್ತು ಕರೆ ಮಾಡಿ" "ಚಿತ್ರ %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "ಚಿತ್ರ" - "ಫೋಟೋ ತೆಗೆದುಕೊಳ್ಳಿ" "ಕ್ಯಾಮರಾ ಚಿತ್ರವನ್ನು ಲೋಡ್ ಮಾಡಲಾಗಲಿಲ್ಲ" "ಅನುಮತಿಸಿ" "ಫೋಟೋ ತೆಗೆಯಲು, ಕ್ಯಾಮರಾಗೆ ಪ್ರವೇಶ ನೀಡಿ" "ಚಿತ್ರವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು, ಮಾಧ್ಯಮಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ನೀಡಿ" + "ಚಿತ್ರ ತೆಗೆದುಕೊಳ್ಳಿ" + "ಒಂದು ಫೋಟೋ ಆಯ್ಕೆಮಾಡಿ" + "ಸಂದೇಶ ಕಳುಹಿಸಿ" + "ಸಂದೇಶಗಳ ಮೂಲಕ ಕಳುಹಿಸಲಾದ ಫೋಟೋ" + "ಸಂದೇಶಗಳ ಮೂಲಕ ಕಳುಹಿಸಲಾದ ಸಂದೇಶ" + "ಚಿತ್ರ ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ…" diff --git a/java/com/android/dialer/callcomposer/res/values-ko/strings.xml b/java/com/android/dialer/callcomposer/res/values-ko/strings.xml index d710afa3e..7df4a703a 100644 --- a/java/com/android/dialer/callcomposer/res/values-ko/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ko/strings.xml @@ -25,9 +25,14 @@ "공유 및 전화 걸기" "이미지 %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "이미지" - "사진 찍기" "카메라 이미지를 로드할 수 없습니다." "허용" "사진을 찍으려면 카메라에 액세스할 수 있도록 허용하세요." "이미지를 공유하려면 미디어에 액세스할 수 있도록 허용하세요." + "사진 촬영" + "사진 선택" + "메시지 보내기" + "메시지를 통해 전송된 사진" + "메시지를 통해 전송된 메시지" + "이미지 전송 중…" diff --git a/java/com/android/dialer/callcomposer/res/values-ky/strings.xml b/java/com/android/dialer/callcomposer/res/values-ky/strings.xml index c7c053303..1a8a395a4 100644 --- a/java/com/android/dialer/callcomposer/res/values-ky/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ky/strings.xml @@ -25,9 +25,14 @@ "Бөлүшүү жана чалуу" "сүрөт, %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "сүрөт" - "Сүрөткө тартуу" "Камерадан сүрөт жүктөлгөн жок" "Уруксат берүү" "Сүрөткө тартуу үчүн, колдонмого камераны пайдаланууга уруксат бериңиз" "Сүрөттү бөлүшүү үчүн мультимедиага кирүүгө уруксат бериңиз" + "Сүрөткө тартуу" + "Сүрөттү тандоо" + "Билдирүү жөнөтүү" + "Сүрөт Android жазышуулары колдонмосу аркылуу жөнөтүлдү" + "Билдирүү Android жазышуулары колдонмосу аркылуу жөнөтүлдү" + "Сүрөт жөнөтүлүүдө..." diff --git a/java/com/android/dialer/callcomposer/res/values-lo/strings.xml b/java/com/android/dialer/callcomposer/res/values-lo/strings.xml index 9c4946000..42ae0f1cb 100644 --- a/java/com/android/dialer/callcomposer/res/values-lo/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-lo/strings.xml @@ -25,9 +25,14 @@ "ແບ່ງປັນ ແລະ ໂທ" "ຮູບ %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "ຮູບ" - "ຖ່າຍຮູບ" "ບໍ່ສາມາດໂຫລດຮູບຈາກກ້ອງໄດ້" "ອະນຸຍາດ" "ເພື່ອຖ່າຍຮູບ, ໃຫ້ອະນຸຍາດການເຂົ້າຫາກ້ອງຖ່າຍຮູບກ່ອນ" "ເພື່ອແບ່ງປັນຮູບພາບໃດໜຶ່ງ, ໃຫ້ອະນຸຍາດການເຂົ້າຫາມີເດຍກ່ອນ" + "ຖ່າຍຮູບ" + "ເລືອກຮູບພາບ..." + "ສົ່ງຂໍ້ຄວາມ" + "ສົ່ງຮູບຜ່ານ Messages ແລ້ວ" + "ສົ່ງຮູບຜ່ານ Messages ແລ້ວ" + "ກຳລັງສົ່ງຮູບພາບ..." diff --git a/java/com/android/dialer/callcomposer/res/values-lt/strings.xml b/java/com/android/dialer/callcomposer/res/values-lt/strings.xml index 0b011f7d7..59112d3cf 100644 --- a/java/com/android/dialer/callcomposer/res/values-lt/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-lt/strings.xml @@ -25,9 +25,14 @@ "Bendrinti ir skambinti" "vaizdas (%1$tB %1$te %1$tY %1$tl %1$tM %1$tp)" "vaizdas" - "Fotografuoti" "Nepavyko įkelti fotoaparato vaizdo" "Leisti" "Kad galėtumėte fotografuoti, leiskite pasiekti fotoaparatą" "Kad galėtumėte bendrinti vaizdą, leiskite pasiekti mediją" + "Fotografuoti" + "Pasirinkti nuotrauką" + "Siųsti pranešimą" + "Nuotrauka išsiųsta naudojant „Messages“" + "Pranešimas išsiųstas naudojant „Messages“" + "Siunčiamas vaizdas..." diff --git a/java/com/android/dialer/callcomposer/res/values-lv/strings.xml b/java/com/android/dialer/callcomposer/res/values-lv/strings.xml index 8593ca01d..8aa954096 100644 --- a/java/com/android/dialer/callcomposer/res/values-lv/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-lv/strings.xml @@ -25,9 +25,14 @@ "Kopīgot un zvanīt" "attēls, %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "attēls" - "Uzņemt fotoattēlu" "Nevarēja ielādēt kameras attēlu." "Atļaut" "Lai uzņemtu fotoattēlu, piešķiriet piekļuvi kamerai." "Lai kopīgotu attēlu, piešķiriet piekļuvi multivides saturam." + "Uzņemt attēlu" + "Izvēlēties fotoattēlu" + "Sūtīt ziņojumu" + "Fotoattēls nosūtīts, izmantojot lietotni Ziņojumi" + "Ziņojums nosūtīts, izmantojot lietotni Ziņojumi" + "Tiek sūtīts attēls…" diff --git a/java/com/android/dialer/callcomposer/res/values-mk/strings.xml b/java/com/android/dialer/callcomposer/res/values-mk/strings.xml index 40d7c622c..126b44c53 100644 --- a/java/com/android/dialer/callcomposer/res/values-mk/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-mk/strings.xml @@ -25,9 +25,14 @@ "Сподели и повикај" "слика од %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "слика" - "Фотографирајте" "Не можеше да се вчита слика од камерата" "Дозволете" "За да фотографирате, дозволете пристап до „Камера“" "За да споделите слика, дозволете пристап до Media" + "Фотографирајте" + "Изберете фотографија" + "Испратете порака" + "Фотографијата е испратена преку Messages" + "Пораката е испратена преку Messages" + "Се испраќа слика…" diff --git a/java/com/android/dialer/callcomposer/res/values-ml/strings.xml b/java/com/android/dialer/callcomposer/res/values-ml/strings.xml index 0a0833d9d..67175cc1e 100644 --- a/java/com/android/dialer/callcomposer/res/values-ml/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ml/strings.xml @@ -25,9 +25,14 @@ "പങ്കിടുക, കോൾ ചെയ്യുക" "ചിത്രം %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "ചിത്രം" - "ഒരു ഫോട്ടോ എടുക്കുക" "ക്യാമറ ചിത്രം ലോഡുചെയ്യാനായില്ല" "അനുവദിക്കുക" "ഫോട്ടോ എടുക്കുന്നതിന്, ക്യാമറയ്ക്ക് ആക്സസ് നൽകുക" "ഫോട്ടോ പങ്കിടുന്നതിന്, മീഡിയയ്ക്ക് ആക്സസ് നൽകുക" + "ഒരു ചിത്രമെടുക്കുക" + "ഒരു ഫോട്ടോ തിരഞ്ഞെടുക്കുക" + "ഒരു സന്ദേശം അയയ്‌ക്കുക" + "മെസേജ് വഴി ഫോട്ടോ അയച്ചു" + "മെസേജ് വഴി സന്ദേശം അയച്ചു" + "ചിത്രം അയയ്‌ക്കുന്നു..." diff --git a/java/com/android/dialer/callcomposer/res/values-mn/strings.xml b/java/com/android/dialer/callcomposer/res/values-mn/strings.xml index 54a292d9a..1de1f1152 100644 --- a/java/com/android/dialer/callcomposer/res/values-mn/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-mn/strings.xml @@ -25,9 +25,14 @@ "Хуваалцаад залгах" "зураг %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "зураг" - "Зураг авах" "Камерын дүрсийг ачаалж чадсангүй" "Зөвшөөрөх" "Зураг авахын тулд камерт хандах зөвшөөрөл олгох шаардлагатай" "Зураг хуваалцахын тулд медиад хандах зөвшөөрөл олгох шаардлагатай" + "Зураг авах" + "Зураг сонгоно уу" + "Зурвас илгээх" + "Зургийг Зурвасаар дамжуулан илгээсэн" + "Зурвасыг Зурвасаар дамжуулан илгээсэн" + "Зураг илгээж байна..." diff --git a/java/com/android/dialer/callcomposer/res/values-mr/strings.xml b/java/com/android/dialer/callcomposer/res/values-mr/strings.xml index 7f8c5d7ef..40a794d52 100644 --- a/java/com/android/dialer/callcomposer/res/values-mr/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-mr/strings.xml @@ -25,9 +25,14 @@ "सामायिक करा आणि कॉल करा" "प्रतिमा %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "प्रतिमा" - "एक फोटो घ्या" "कॅमेरा प्रतिमा लोड करणे शक्य झाले नाही" "अनुमती द्या" "एक फोटो घेण्यासाठी, कॅमेर्‍यामध्ये प्रवेश द्या" "एखादी प्रतिमा सामायिक करण्यासाठी मीडियामध्ये प्रवेश द्या" + "एक फोटो घ्या" + "फोटो निवडा" + "एक संदेश पाठवा" + "Messages द्वारे फोटो पाठविला" + "Messages द्वारे संदेश पाठविला" + "इमेज पाठवत आहे…" diff --git a/java/com/android/dialer/callcomposer/res/values-ms/strings.xml b/java/com/android/dialer/callcomposer/res/values-ms/strings.xml index 0927cde9f..1f37e154a 100644 --- a/java/com/android/dialer/callcomposer/res/values-ms/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ms/strings.xml @@ -25,9 +25,14 @@ "Kongsi dan hubungi" "imej %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "imej" - "Ambil foto" "Tidak dapat memuatkan imej kamera" "Benarkan" "Untuk mengambil foto, berikan akses kepada Kamera" "Untuk berkongsi imej, berikan akses kepada Media" + "Ambil gambar" + "Pilih foto" + "Hantar mesej" + "Photo dihantar melalui Mesej" + "Mesej dihantar melalui Mesej" + "Menghantar imej…" diff --git a/java/com/android/dialer/callcomposer/res/values-my/strings.xml b/java/com/android/dialer/callcomposer/res/values-my/strings.xml index 6608e9a4f..5f8de84b8 100644 --- a/java/com/android/dialer/callcomposer/res/values-my/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-my/strings.xml @@ -25,9 +25,14 @@ "မျှဝေပြီး ခေါ်ဆိုရန်" "ပုံ %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "ပုံ" - "ဓာတ်ပုံတစ်ပုံ ရိုက်ရန်" "ကင်မရာမှပုံကို မရယူနိုင်ပါ" "ခွင့်ပြုရန်" "ဓာတ်ပုံရိုက်ရန် ကင်မရာသို့ ဝင်သုံးခွင့်ပေးပါ" "ပုံမျှဝေရန် မီဒီယာသို့ ဝင်သုံးခွင့်ပေးပါ" + "ဓာတ်ပုံတစ်ပုံ ရိုက်ရန်" + "ဓာတ်ပုံတစ်ပုံ ရွေးရန်" + "မက်ဆေ့ဂျ်ပို့ရန်" + "မက်ဆေ့ဂျ်များမှတစ်ဆင့် ဓာတ်ပုံပို့ပြီးပါပြီ" + "မက်ဆေ့ဂျ်များမှတစ်ဆင့် မက်ဆေ့ဂျ်ပို့ပြီးပါပြီ" + "ပုံပို့နေသည်…" diff --git a/java/com/android/dialer/callcomposer/res/values-nb/strings.xml b/java/com/android/dialer/callcomposer/res/values-nb/strings.xml index 693e7fd51..c9e1296e9 100644 --- a/java/com/android/dialer/callcomposer/res/values-nb/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-nb/strings.xml @@ -25,9 +25,14 @@ "Del og ring" "bilde %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "bilde" - "Ta et bilde" "Kunne ikke laste inn kamerabilde" "Tillat" "Gi tilgang til kameraet for å ta bilder" "Gi Media tilgang for å dele bilder" + "Ta et bilde" + "Velg et bilde" + "Send en melding" + "Bildet er sendt via Messages" + "Meldingen er sendt via Messages" + "Sender bildet …" diff --git a/java/com/android/dialer/callcomposer/res/values-ne/strings.xml b/java/com/android/dialer/callcomposer/res/values-ne/strings.xml index 37dd68107..71d40a645 100644 --- a/java/com/android/dialer/callcomposer/res/values-ne/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ne/strings.xml @@ -25,9 +25,14 @@ "आदान-प्रदान र कल गर्नुहोस्" "छवि %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "छवि" - "एउटा तस्बिर खिच्नुहोस्" "क्यामेराको छवि लोड गर्न सकिएन" "अनुमति दिनुहोस्" "तस्बिर खिच्न, क्यामेरामाथि पहुँच दिनुहोस्" "छवि आदान-प्रदान गर्न, मिडियामाथि पहुँच दिनुहोस्" + "तस्बिर खिच्नुहोस्" + "तस्बिर छनौट गर्नुहोस्" + "सन्देश पठाउनुहोस्" + "Messages मार्फत पठाइएको तस्बिर" + "Messages मार्फत पठाइएको सन्देश" + "छवि पठाइँदै…" diff --git a/java/com/android/dialer/callcomposer/res/values-nl/strings.xml b/java/com/android/dialer/callcomposer/res/values-nl/strings.xml index ebb00c470..59c09a39a 100644 --- a/java/com/android/dialer/callcomposer/res/values-nl/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-nl/strings.xml @@ -25,9 +25,14 @@ "Delen en bellen" "afbeelding van %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "afbeelding" - "Een foto maken" "Kan camera-afbeelding niet laden" "Toestaan" "Verleen toegang tot Camera om een foto te maken" "Verleen toegang tot Media om een afbeelding te delen" + "Een foto nemen" + "Een foto kiezen" + "Een bericht verzenden" + "Foto verzonden via Berichten" + "Bericht verzonden via Berichten" + "Afbeelding verzenden…" diff --git a/java/com/android/dialer/callcomposer/res/values-no/strings.xml b/java/com/android/dialer/callcomposer/res/values-no/strings.xml index 693e7fd51..c9e1296e9 100644 --- a/java/com/android/dialer/callcomposer/res/values-no/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-no/strings.xml @@ -25,9 +25,14 @@ "Del og ring" "bilde %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "bilde" - "Ta et bilde" "Kunne ikke laste inn kamerabilde" "Tillat" "Gi tilgang til kameraet for å ta bilder" "Gi Media tilgang for å dele bilder" + "Ta et bilde" + "Velg et bilde" + "Send en melding" + "Bildet er sendt via Messages" + "Meldingen er sendt via Messages" + "Sender bildet …" diff --git a/java/com/android/dialer/callcomposer/res/values-pa/strings.xml b/java/com/android/dialer/callcomposer/res/values-pa/strings.xml index bf6be36fe..0a51a63dc 100644 --- a/java/com/android/dialer/callcomposer/res/values-pa/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-pa/strings.xml @@ -25,9 +25,14 @@ "ਸਾਂਝਾ ਕਰੋ ਅਤੇ ਕਾਲ ਕਰੋ" "ਚਿੱਤਰ %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "ਚਿੱਤਰ" - "ਕੋਈ ਫ਼ੋਟੋ ਖਿੱਚੋ" "ਕੈਮਰਾ ਚਿੱਤਰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ" "ਇਜਾਜ਼ਤ ਦਿਓ" "ਫ਼ੋਟੋ ਖਿੱਚਣ ਲਈ, ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚ ਦਿਓ" "ਚਿੱਤਰ ਸਾਂਝਾ ਕਰਨ ਲਈ, ਮੀਡੀਆ ਤੱਕ ਪਹੁੰਚ ਦਿਓ" + "ਇੱਕ ਤਸਵੀਰ ਖਿੱਚੋ" + "ਇੱਕ ਫ਼ੋਟੋ ਚੁਣੋ" + "ਇੱਕ ਸੁਨੇਹਾ ਭੇਜੋ" + "ਫ਼ੋਟੋ &quot;ਸੁਨੇਹੇ&quot; ਐਪ ਰਾਹੀਂ ਭੇਜੀ ਗਈ" + "ਸੁਨੇਹਾ &quot;ਸੁਨੇਹੇ&quot; ਐਪ ਰਾਹੀਂ ਭੇਜਿਆ ਗਿਆ" + "ਚਿੱਤਰ ਭੇਜਿਆ ਜਾ ਰਿਹਾ ਹੈ…" diff --git a/java/com/android/dialer/callcomposer/res/values-pl/strings.xml b/java/com/android/dialer/callcomposer/res/values-pl/strings.xml index ba74628f0..130dd8c12 100644 --- a/java/com/android/dialer/callcomposer/res/values-pl/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-pl/strings.xml @@ -25,9 +25,14 @@ "Udostępnij i zadzwoń" "zdjęcie – %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "zdjęcie" - "Robienie zdjęć" "Nie udało się wczytać zdjęcia z aparatu" "Zezwól" "Aby zrobić zdjęcie, zezwól na dostęp do aparatu" "Aby udostępnić zdjęcie, zezwól na dostęp do multimediów" + "Zrób zdjęcie" + "Wybierz zdjęcie" + "Wyślij wiadomość" + "Zdjęcie zostało wysłane przez Wiadomości" + "Tekst został wysłany przez Wiadomości" + "Wysyłam obraz…" diff --git a/java/com/android/dialer/callcomposer/res/values-pt-rBR/strings.xml b/java/com/android/dialer/callcomposer/res/values-pt-rBR/strings.xml index 9feee7d9d..a090d155d 100644 --- a/java/com/android/dialer/callcomposer/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-pt-rBR/strings.xml @@ -25,9 +25,14 @@ "Compartilhar e ligar" "imagem de %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "imagem" - "Tirar uma foto" "Falha ao carregar a imagem da câmera" "Permitir" "Para tirar uma foto, permita o acesso à câmera" "Para compartilhar uma imagem, permita o acesso à mídia" + "Tirar uma foto" + "Escolher uma foto" + "Enviar uma mensagem" + "Foto enviada pelo Mensagens" + "Mensagem enviada pelo Mensagens" + "Enviando imagem..." diff --git a/java/com/android/dialer/callcomposer/res/values-pt-rPT/strings.xml b/java/com/android/dialer/callcomposer/res/values-pt-rPT/strings.xml index 8b12d652f..34b3a96a1 100644 --- a/java/com/android/dialer/callcomposer/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-pt-rPT/strings.xml @@ -25,9 +25,14 @@ "Partilhar e ligar" "imagem de %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "imagem" - "Tirar uma foto" "Não foi possível carregar a imagem da câmara" "Permitir" "Para tirar uma foto, conceda acesso à Câmara" "Para partilhar uma imagem, conceda acesso a Multimédia" + "Tirar uma foto" + "Selecionar foto" + "Enviar uma mensagem" + "Foto enviada através da aplicação Mensagens" + "Mensagem enviada através da aplicação Mensagens" + "A enviar imagem…" diff --git a/java/com/android/dialer/callcomposer/res/values-pt/strings.xml b/java/com/android/dialer/callcomposer/res/values-pt/strings.xml index 9feee7d9d..a090d155d 100644 --- a/java/com/android/dialer/callcomposer/res/values-pt/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-pt/strings.xml @@ -25,9 +25,14 @@ "Compartilhar e ligar" "imagem de %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "imagem" - "Tirar uma foto" "Falha ao carregar a imagem da câmera" "Permitir" "Para tirar uma foto, permita o acesso à câmera" "Para compartilhar uma imagem, permita o acesso à mídia" + "Tirar uma foto" + "Escolher uma foto" + "Enviar uma mensagem" + "Foto enviada pelo Mensagens" + "Mensagem enviada pelo Mensagens" + "Enviando imagem..." diff --git a/java/com/android/dialer/callcomposer/res/values-ro/strings.xml b/java/com/android/dialer/callcomposer/res/values-ro/strings.xml index 744ef80fb..29de0ed6a 100644 --- a/java/com/android/dialer/callcomposer/res/values-ro/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ro/strings.xml @@ -25,9 +25,14 @@ "Trimiteți și apelați" "imagine din %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "imagine" - "Fotografiați" "Nu s-a putut încărca imaginea de la camera foto" "Permiteți" "Pentru a fotografia, permiteți accesul la Camera foto" "Pentru a trimite o imagine, permiteți accesul la Conținutul media" + "Fotografiați" + "Alegeți o fotografie" + "Trimiteți un mesaj" + "Fotografie trimisă prin Messages" + "Mesaj trimis prin Messages" + "Se trimite imaginea…" diff --git a/java/com/android/dialer/callcomposer/res/values-ru/strings.xml b/java/com/android/dialer/callcomposer/res/values-ru/strings.xml index 1abbc4996..ffdfb29a2 100644 --- a/java/com/android/dialer/callcomposer/res/values-ru/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ru/strings.xml @@ -25,9 +25,14 @@ "Поделиться и позвонить" "изображение, %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "изображение" - "Перейти в режим фото" "Не удалось загрузить изображение с камеры" "Разрешить" "Чтобы сделать снимок, предоставьте доступ к камере" "Чтобы поделиться изображением, предоставьте доступ к мультимедиа" + "Сделать фото" + "Выбрать фото" + "Отправить сообщение" + "Фото отправлено через Android Сообщения" + "Сообщение отправлено через Android Сообщения" + "Отправка изображения…" diff --git a/java/com/android/dialer/callcomposer/res/values-si/strings.xml b/java/com/android/dialer/callcomposer/res/values-si/strings.xml index 48a447416..cdea197a6 100644 --- a/java/com/android/dialer/callcomposer/res/values-si/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-si/strings.xml @@ -25,9 +25,14 @@ "බෙදා ගෙන අමතන්න" "රූපය %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "රූපය" - "ඡායාරූපයක් ගන්න" "කැමරා රූපය පූරණය කළ නොහැකි විය" "ඉඩ දෙන්න" "ඡායාරූපයක් ගැනීමට, කැමරාවට ප්‍රවේශය දෙන්න" "රූපයක් බෙදා ගැනීමට, මාධ්‍යයට ප්‍රවේශය දෙන්න" + "පින්තුරයක් ගැනීම" + "ඡායාරූපයක් තේරීම" + "පණිවිඩයක් යැවීම" + "Messages හරහා ඡායාරූපය යවන ලදී" + "Messages හරහා පණිවිඩය යවන ලදී" + "රූපය යවමින්..." diff --git a/java/com/android/dialer/callcomposer/res/values-sk/strings.xml b/java/com/android/dialer/callcomposer/res/values-sk/strings.xml index 2fb13c1af..e478e6391 100644 --- a/java/com/android/dialer/callcomposer/res/values-sk/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-sk/strings.xml @@ -25,9 +25,14 @@ "Zdieľať a volať" "obrázok – %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "obrázok" - "Odfotiť" "Obrázok z fotoaparátu sa nepodarilo načítať" "Povoliť" "Ak chcete fotiť, povoľte prístup k fotoaparátu" "Ak chcete zdieľať obrázok, povoľte prístup k médiám" + "Odfotiť" + "Vybrať fotku" + "Odoslať správu" + "Fotka bola odoslaná prostredníctvom Správ" + "Správa bola odoslaná prostredníctvom Správ" + "Odosiela sa obrázok…" diff --git a/java/com/android/dialer/callcomposer/res/values-sl/strings.xml b/java/com/android/dialer/callcomposer/res/values-sl/strings.xml index 34126ab36..85dd23d99 100644 --- a/java/com/android/dialer/callcomposer/res/values-sl/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-sl/strings.xml @@ -25,9 +25,14 @@ "Klic s skupno rabo" "slika %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "slika" - "Fotografiranje" "Slike fotoaparata ni bilo mogoče naložiti" "Dovoli" "Če želite posneti fotografijo, omogočite dostop do fotoaparata" "Če želite deliti sliko z drugimi, omogočite dostop do predstavnosti" + "Posnemi fotografijo" + "Izberi fotografijo" + "Pošlji sporočilo" + "Fotografija je bila poslana prek aplikacije Messages" + "Sporočilo je bila poslano prek aplikacije Messages" + "Pošiljanje slike …" diff --git a/java/com/android/dialer/callcomposer/res/values-sq/strings.xml b/java/com/android/dialer/callcomposer/res/values-sq/strings.xml index 35dd197c9..aba7c8153 100644 --- a/java/com/android/dialer/callcomposer/res/values-sq/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-sq/strings.xml @@ -25,9 +25,14 @@ "Ndaj dhe telefono" "imazh %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "imazh" - "Bëj një fotografi" "Imazhi i kamerës nuk mund të ngarkohej" "Lejo" "Për të shkrepur një fotografi, jep qasjen te Kamera" "Për të ndarë një imazh, jep qasjen te Media" + "Bëj një fotografi" + "Zgjidh një fotografi" + "Dërgo një mesazh" + "Fotografia u dërgua nëpërmjet \"Mesazheve\"" + "Mesazhi u dërgua nëpërmjet \"Mesazheve\"" + "Imazhi po dërgohet..." diff --git a/java/com/android/dialer/callcomposer/res/values-sr/strings.xml b/java/com/android/dialer/callcomposer/res/values-sr/strings.xml index 4fa34ed40..ead04fce6 100644 --- a/java/com/android/dialer/callcomposer/res/values-sr/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-sr/strings.xml @@ -25,9 +25,14 @@ "Дели и позови" "слика, %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "слика" - "Сликајте" "Учитавање слике са камере није успело" "Дозволи" "Одобрите приступ Камери да бисте снимили слику" "Одобрите приступ Медијима да бисте делили слику" + "Сликајте" + "Изаберите слику" + "Пошаљите поруку" + "Слика је послата преко Messages-а" + "Порука је послата преко Messages-а" + "Шаље се слика…" diff --git a/java/com/android/dialer/callcomposer/res/values-sv/strings.xml b/java/com/android/dialer/callcomposer/res/values-sv/strings.xml index de33531db..0e37b296d 100644 --- a/java/com/android/dialer/callcomposer/res/values-sv/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-sv/strings.xml @@ -25,9 +25,14 @@ "Dela och ring" "bild den %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "bild" - "Ta ett foto" "Det gick inte att läsa in kamerabild" "Tillåt" "Bevilja åtkomst till Kamera om du vill ta ett foto" "Bevilja åtkomst till Media om du vill dela en bild" + "Ta en bild" + "Välj ett foto" + "Skicka ett meddelande" + "Fotot har skickats via Messages" + "Meddelandet har skickats via Messages" + "Skickar bild …" diff --git a/java/com/android/dialer/callcomposer/res/values-sw/strings.xml b/java/com/android/dialer/callcomposer/res/values-sw/strings.xml index e99fd06e4..03a7eaca5 100644 --- a/java/com/android/dialer/callcomposer/res/values-sw/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-sw/strings.xml @@ -25,9 +25,14 @@ "Shiriki na upige simu" "picha %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "picha" - "Piga picha" "Imeshindwa kupakia picha ya kamera" "Ruhusu" "Ruhusu programu ifikie Kamera ili uweze kupiga picha" - "Ruhusu programu ifikie Midia ili uweze kushiriki picha" + "Ruhusu programu ifikie hifadhi ili uweze kushiriki picha" + "Piga picha" + "Chagua picha" + "Tuma ujumbe" + "Picha imetumwa kupitia Programu ya Messages" + "Ujumbe umetumwa kupitia Programu ya Messages" + "Inatuma picha…" diff --git a/java/com/android/dialer/callcomposer/res/values-ta/strings.xml b/java/com/android/dialer/callcomposer/res/values-ta/strings.xml index 407814889..e006ff9c1 100644 --- a/java/com/android/dialer/callcomposer/res/values-ta/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ta/strings.xml @@ -25,9 +25,14 @@ "பகிர்ந்து அழை" "படம், %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "படம்" - "படமெடுக்கும்" "கேமரா படத்தை ஏற்ற முடியவில்லை" "அனுமதி" "படமெடுக்க, கேமராவிற்கு அணுகல் வழங்கவும்" "படத்தைப் பகிர, மீடியாவிற்கு அணுகல் வழங்கவும்" + "படமெடுக்கவும்" + "புகைப்படத்தைத் தேர்வு செய்யும்" + "செய்தியை அனுப்பும்" + "மெசேஜஸ் மூலம் படம் அனுப்பப்பட்டது" + "மெசேஜஸ் மூலம் செய்தி அனுப்பப்பட்டது" + "படத்தை அனுப்புகிறது…" diff --git a/java/com/android/dialer/callcomposer/res/values-te/strings.xml b/java/com/android/dialer/callcomposer/res/values-te/strings.xml index 101429c16..b3f46663e 100644 --- a/java/com/android/dialer/callcomposer/res/values-te/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-te/strings.xml @@ -25,9 +25,14 @@ "భాగస్వా. చేసి, కాల్ చేయి" "చిత్రం %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "చిత్రం" - "ఫోటో తీస్తుంది" "కెమెరా చిత్రాన్ని లోడ్ చేయడం సాధ్యపడలేదు" "అనుమతించు" "ఫోటోను తీయడానికి, కెమెరాకు ప్రాప్యతను అందించండి" "చిత్రాన్ని భాగస్వామ్యం చేయడానికి, మీడియాకు ప్రాప్యతను అందించండి" + "చిత్రాన్ని తీస్తుంది" + "ఫోటోను ఎంచుకోండి" + "సందేశాన్ని పంపుతుంది" + "సందేశాల అనువర్తనం ద్వారా ఫోటోను పంపాము" + "సందేశాల అనువర్తనం ద్వారా సందేశాన్ని పంపాము" + "చిత్రాన్ని పంపుతోంది…" diff --git a/java/com/android/dialer/callcomposer/res/values-th/strings.xml b/java/com/android/dialer/callcomposer/res/values-th/strings.xml index a004d33f5..125a24b58 100644 --- a/java/com/android/dialer/callcomposer/res/values-th/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-th/strings.xml @@ -25,9 +25,14 @@ "แชร์และโทร" "รูปภาพเมื่อวันที่ %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "รูปภาพ" - "ถ่ายภาพ" "ไม่สามารถโหลดภาพจากกล้องได้" "อนุญาต" "หากต้องการถ่ายภาพ โปรดให้สิทธิ์การเข้าถึงกล้อง" "หากต้องการแชร์รูปภาพ โปรดให้สิทธิ์การเข้าถึงสื่อ" + "ถ่ายภาพ" + "เลือกรูปภาพ" + "ส่งข้อความ" + "ส่งรูปภาพผ่าน Messages แล้ว" + "ส่งข้อความผ่าน Messages แล้ว" + "กำลังส่งรูปภาพ..." diff --git a/java/com/android/dialer/callcomposer/res/values-tl/strings.xml b/java/com/android/dialer/callcomposer/res/values-tl/strings.xml index e902a2fef..7e7dac607 100644 --- a/java/com/android/dialer/callcomposer/res/values-tl/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-tl/strings.xml @@ -25,9 +25,14 @@ "Ibahagi at tumawag" "larawan %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "larawan" - "Kumuha ng isang larawan" "Hindi mai-load ang larawan ng camera" "Payagan" "Upang kumuha ng larawan, magbigay ng access sa Camera" "Upang magbahagi ng imahe, magbigay ng access sa Media" + "Kumuha ng larawan" + "Pumili ng larawan" + "Magpadala ng mensahe" + "Larawang ipinadala sa pamamagitan ng Messages" + "Mensaheng ipinadala sa pamamagitan ng Messages" + "Ipinapadala ang larawan…" diff --git a/java/com/android/dialer/callcomposer/res/values-tr/strings.xml b/java/com/android/dialer/callcomposer/res/values-tr/strings.xml index 0dfe8b213..99523d574 100644 --- a/java/com/android/dialer/callcomposer/res/values-tr/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-tr/strings.xml @@ -25,9 +25,14 @@ "Paylaş ve telefon et" "resim %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "resim" - "Fotoğraf çeker" "Kamera görüntüsü yüklenemedi" "İzin ver" "Fotoğraf çekmek için Kamera\'ya erişim izni verin" "Resim paylaşmak için Medya\'ya erişim izni verin" + "Resim çeker" + "Fotoğraf seçilmesini sağlar" + "Mesaj gönderir" + "Fotoğraf, Mesajlar uygulaması üzerinden gönderildi" + "Mesaj, Mesajlar uygulaması üzerinden gönderildi" + "Resim gönderiliyor…" diff --git a/java/com/android/dialer/callcomposer/res/values-uk/strings.xml b/java/com/android/dialer/callcomposer/res/values-uk/strings.xml index 20898c315..fa57d3dea 100644 --- a/java/com/android/dialer/callcomposer/res/values-uk/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-uk/strings.xml @@ -25,9 +25,14 @@ "Надіслати й зателефонувати" "зображення %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "зображення" - "Зйомка фото" "Не вдалося завантажити зображення з камери" "Дозволити" "Щоб сфотографувати, надайте доступ до камери" "Щоб поділитися зображенням, надайте доступ до медіа-вмісту" + "Зробити знімок" + "Вибрати фотографію" + "Надіслати повідомлення" + "Фотографію надіслано через додаток Повідомлення" + "Текст надіслано через додаток Повідомлення" + "Надсилання зображення…" diff --git a/java/com/android/dialer/callcomposer/res/values-ur/strings.xml b/java/com/android/dialer/callcomposer/res/values-ur/strings.xml index 92a2f8c0e..2677bd22b 100644 --- a/java/com/android/dialer/callcomposer/res/values-ur/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-ur/strings.xml @@ -25,9 +25,14 @@ "اشتراک کریں اور کال کریں" "تصویر %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "تصویر" - "ایک تصویر لیں" "کیمرے کی تصویر لوڈ نہیں ہو سکی" "اجازت دیں" "تصویر لینے کیلئے کیمرا کو رسائی دیں" "تصویر کا اشتراک کرنے کیلئے میڈیا تک رسائی دیں" + "تصویر لیں" + "ایک تصویر چنیں" + "پیغام بھیجیں" + "تصویر پیغامات کے ذریعے بھیجی گئی" + "پیغام پیغامات کے ذریعے بھیجا گیا" + "تصویر بھیجی جا رہی ہے…" diff --git a/java/com/android/dialer/callcomposer/res/values-uz/strings.xml b/java/com/android/dialer/callcomposer/res/values-uz/strings.xml index 845016226..79152b544 100644 --- a/java/com/android/dialer/callcomposer/res/values-uz/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-uz/strings.xml @@ -25,9 +25,14 @@ "Ulashish va chaqirish" "tasvir, %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "tasvir" - "Surat rejimiga o‘tish" "Kamera orqali olingan suratni yuklab bo‘lmadi" "Ruxsat berish" "Suratga olish uchun kameraga kirshga ruxsat bering" "Rasmni baham ko‘rish uchun media fayllarga kirishga ruxsat bering" + "Rasmga olish" + "Rasm tanlash" + "Xabar yuborish" + "Rasm Android Xabarlar orqali yuborildi" + "Xabar Android Xabarlar orqali yuborildi" + "Tasvir yuborilmoqda…" diff --git a/java/com/android/dialer/callcomposer/res/values-vi/strings.xml b/java/com/android/dialer/callcomposer/res/values-vi/strings.xml index 2d060bd01..f065f17d0 100644 --- a/java/com/android/dialer/callcomposer/res/values-vi/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-vi/strings.xml @@ -25,9 +25,14 @@ "Chia sẻ và gọi" "hình ảnh %1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "hình ảnh" - "Chụp ảnh" "Không thể tải hình ảnh trong máy ảnh" "Cho phép" "Để chụp ảnh, hãy cấp quyền truy cập vào Máy ảnh" "Để chia sẻ ảnh, hãy cấp quyền truy cập vào Phương tiện" + "Chụp ảnh" + "Chọn ảnh" + "Gửi tin nhắn" + "Đã gửi ảnh qua Messages" + "Đã gửi tin nhắn qua Messages" + "Đang gửi hình ảnh..." diff --git a/java/com/android/dialer/callcomposer/res/values-zh-rCN/strings.xml b/java/com/android/dialer/callcomposer/res/values-zh-rCN/strings.xml index a6c2f9014..0bb323fe8 100644 --- a/java/com/android/dialer/callcomposer/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-zh-rCN/strings.xml @@ -25,9 +25,14 @@ "分享并拨打电话" "图片(%1$tB %1$te %1$tY %1$tl %1$tM %1$tp)" "图片" - "拍摄照片" "无法加载相机图片" "允许" "要拍摄照片,请授予相机使用权限" "要分享图片,请授予媒体访问权限" + "拍照" + "选择一张照片" + "发送信息" + "已通过“信息”应用发送照片" + "已通过“信息”应用发送短信" + "正在发送图片…" diff --git a/java/com/android/dialer/callcomposer/res/values-zh-rHK/strings.xml b/java/com/android/dialer/callcomposer/res/values-zh-rHK/strings.xml index 8f66f4f18..5b70bbcbc 100644 --- a/java/com/android/dialer/callcomposer/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-zh-rHK/strings.xml @@ -25,9 +25,14 @@ "分享並通話" "圖片:%1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "圖片" - "拍照" "無法載入相機圖片" "允許" "如要拍照,請授予「相機」存取權" "如要分享圖片,請授予「媒體」存取權" + "拍照" + "選擇相片" + "傳送訊息" + "已透過「訊息」傳送相片" + "已透過「訊息」傳送訊息" + "正在傳送圖片…" diff --git a/java/com/android/dialer/callcomposer/res/values-zh-rTW/strings.xml b/java/com/android/dialer/callcomposer/res/values-zh-rTW/strings.xml index a3af5af79..3f1eaf092 100644 --- a/java/com/android/dialer/callcomposer/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-zh-rTW/strings.xml @@ -25,9 +25,14 @@ "分享及撥號" "圖片:%1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "圖片" - "拍攝相片" "無法載入相機圖片" "允許" "如要拍照,請授予相機存取權" "如要分享圖片,請授予媒體存取權" + "拍攝相片" + "選擇相片" + "傳送訊息" + "透過訊息應用程式傳送的相片" + "透過訊息應用程式傳送的訊息" + "正在傳送圖片…" diff --git a/java/com/android/dialer/callcomposer/res/values-zu/strings.xml b/java/com/android/dialer/callcomposer/res/values-zu/strings.xml index 2cce6883c..682febc57 100644 --- a/java/com/android/dialer/callcomposer/res/values-zu/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values-zu/strings.xml @@ -25,9 +25,14 @@ "Yabelana uphinde ushaye" "isithombe sangomhla ka-%1$tB %1$te %1$tY %1$tl %1$tM %1$tp" "isithombe" - "Thatha isithombe" "Ayikwazanga ukulayisha isithombe sekhamera" "Vumela" "Ukuze uthathe isithombe, nika ukufinyelela kukhamera" "Ukuze wabelane ngesithombe, nika ukufinyelela kumidiya" + "Thatha isithombe" + "Khetha isithombe" + "Thumela umlayezo" + "Isithombe sithunyelwe ngemilayezo" + "Umlayezo uthunyelwe ngemilayezo" + "Ithumela isithombe..." diff --git a/java/com/android/dialer/callcomposer/res/values/colors.xml b/java/com/android/dialer/callcomposer/res/values/colors.xml index 89e55b79a..8393c555f 100644 --- a/java/com/android/dialer/callcomposer/res/values/colors.xml +++ b/java/com/android/dialer/callcomposer/res/values/colors.xml @@ -20,5 +20,4 @@ #12000000 #00BC35 #607D8B - #ECEFF1 \ No newline at end of file diff --git a/java/com/android/dialer/callcomposer/res/values/dimens.xml b/java/com/android/dialer/callcomposer/res/values/dimens.xml index d55540077..f4c2c3bef 100644 --- a/java/com/android/dialer/callcomposer/res/values/dimens.xml +++ b/java/com/android/dialer/callcomposer/res/values/dimens.xml @@ -15,15 +15,15 @@ ~ limitations under the License --> - 306dp + 292dp 2dp - 116dp - 58dp - 58dp - 18dp - 32sp + 112dp + 56dp + 56dp + 16dp + 28sp 16sp 2dp @@ -32,9 +32,7 @@ 48dp - 18dp 16sp - 8dp 4dp @@ -56,4 +54,6 @@ 8dp 16dp 48dp + + 108dp \ No newline at end of file diff --git a/java/com/android/dialer/callcomposer/res/values/strings.xml b/java/com/android/dialer/callcomposer/res/values/strings.xml index cc7762b64..f01e90811 100644 --- a/java/com/android/dialer/callcomposer/res/values/strings.xml +++ b/java/com/android/dialer/callcomposer/res/values/strings.xml @@ -31,8 +31,6 @@ image %1$tB %1$te %1$tY %1$tl %1$tM %1$tp image - - Take a photo Couldn\'t load camera image @@ -41,4 +39,19 @@ To take a photo, give access to Camera To share an image, give access to Media + + Take a picture + + Choose a photo + + Send a message + + Photo sent via Messages + + Message sent via Messages + + Sending image\u2026 \ No newline at end of file diff --git a/java/com/android/dialer/callcomposer/res/values/styles.xml b/java/com/android/dialer/callcomposer/res/values/styles.xml index 29ac4ddaa..a03ee4894 100644 --- a/java/com/android/dialer/callcomposer/res/values/styles.xml +++ b/java/com/android/dialer/callcomposer/res/values/styles.xml @@ -15,7 +15,7 @@ ~ limitations under the License --> - diff --git a/java/com/android/dialer/callcomposer/util/BitmapResizer.java b/java/com/android/dialer/callcomposer/util/BitmapResizer.java index 658462def..84ada51d8 100644 --- a/java/com/android/dialer/callcomposer/util/BitmapResizer.java +++ b/java/com/android/dialer/callcomposer/util/BitmapResizer.java @@ -17,6 +17,7 @@ package com.android.dialer.callcomposer.util; import android.graphics.Bitmap; +import android.graphics.Matrix; import android.support.annotation.VisibleForTesting; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; @@ -28,40 +29,44 @@ public final class BitmapResizer { /** * Returns a bitmap that is a resized version of the parameter image. The image will only be * resized down and sized to be appropriate for an enriched call. + * + * @param image to be resized + * @param rotation degrees to rotate the image clockwise + * @return resized image */ - public static Bitmap resizeForEnrichedCalling(Bitmap image) { + public static Bitmap resizeForEnrichedCalling(Bitmap image, int rotation) { Assert.isWorkerThread(); int width = image.getWidth(); int height = image.getHeight(); + Matrix matrix = new Matrix(); + matrix.postRotate(rotation); + LogUtil.i( "BitmapResizer.resizeForEnrichedCalling", "starting height: %d, width: %d", height, width); if (width <= MAX_OUTPUT_RESOLUTION && height <= MAX_OUTPUT_RESOLUTION) { LogUtil.i("BitmapResizer.resizeForEnrichedCalling", "no resizing needed"); - return image; + return Bitmap.createBitmap(image, 0, 0, width, height, matrix, true); } + float ratio = 1; if (width > height) { // landscape - float ratio = width / (float) MAX_OUTPUT_RESOLUTION; - width = MAX_OUTPUT_RESOLUTION; - height = (int) (height / ratio); - } else if (height > width) { - // portrait - float ratio = height / (float) MAX_OUTPUT_RESOLUTION; - height = MAX_OUTPUT_RESOLUTION; - width = (int) (width / ratio); + ratio = MAX_OUTPUT_RESOLUTION / (float) width; } else { - // square - height = MAX_OUTPUT_RESOLUTION; - width = MAX_OUTPUT_RESOLUTION; + // portrait & square + ratio = MAX_OUTPUT_RESOLUTION / (float) height; } LogUtil.i( - "BitmapResizer.resizeForEnrichedCalling", "ending height: %d, width: %d", height, width); + "BitmapResizer.resizeForEnrichedCalling", + "ending height: %f, width: %f", + height * ratio, + width * ratio); - return Bitmap.createScaledBitmap(image, width, height, true); + matrix.postScale(ratio, ratio); + return Bitmap.createBitmap(image, 0, 0, width, height, matrix, true); } } diff --git a/java/com/android/dialer/calldetails/AndroidManifest.xml b/java/com/android/dialer/calldetails/AndroidManifest.xml index adaac402e..9cf656e42 100644 --- a/java/com/android/dialer/calldetails/AndroidManifest.xml +++ b/java/com/android/dialer/calldetails/AndroidManifest.xml @@ -16,16 +16,12 @@ - + - - - - - + android:theme="@style/DialerThemeBase.NoActionBar"> diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java index 7eab951fa..569aaa5b5 100644 --- a/java/com/android/dialer/calldetails/CallDetailsActivity.java +++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java @@ -23,38 +23,65 @@ import android.os.Bundle; import android.provider.CallLog; import android.provider.CallLog.Calls; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar.OnMenuItemClickListener; import android.view.MenuItem; -import com.android.dialer.callcomposer.CallComposerContact; import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.AsyncTaskExecutors; +import com.android.dialer.dialercontact.DialerContact; +import com.android.dialer.enrichedcall.EnrichedCallComponent; +import com.android.dialer.enrichedcall.EnrichedCallManager.HistoricalDataChangedListener; +import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; +import com.android.dialer.logging.UiAction; +import com.android.dialer.performancereport.PerformanceReport; +import com.android.dialer.postcall.PostCall; import com.android.dialer.protos.ProtoParsers; +import java.util.Collections; import java.util.List; +import java.util.Map; /** Displays the details of a specific call log entry. */ -public class CallDetailsActivity extends AppCompatActivity implements OnMenuItemClickListener { +public class CallDetailsActivity extends AppCompatActivity + implements OnMenuItemClickListener, + CallDetailsFooterViewHolder.ReportCallIdListener, + HistoricalDataChangedListener { + public static final String EXTRA_PHONE_NUMBER = "phone_number"; + public static final String EXTRA_HAS_ENRICHED_CALL_DATA = "has_enriched_call_data"; private static final String EXTRA_CALL_DETAILS_ENTRIES = "call_details_entries"; private static final String EXTRA_CONTACT = "contact"; + private static final String EXTRA_CAN_REPORT_CALLER_ID = "can_report_caller_id"; private static final String TASK_DELETE = "task_delete"; - private List entries; + private CallDetailsEntries entries; + private DialerContact contact; + private CallDetailsAdapter adapter; + + public static boolean isLaunchIntent(Intent intent) { + return intent.getComponent() != null + && CallDetailsActivity.class.getName().equals(intent.getComponent().getClassName()); + } public static Intent newInstance( - Context context, @NonNull CallDetailsEntries details, @NonNull CallComposerContact contact) { + Context context, + @NonNull CallDetailsEntries details, + @NonNull DialerContact contact, + boolean canReportCallerId) { Assert.isNotNull(details); Assert.isNotNull(contact); Intent intent = new Intent(context, CallDetailsActivity.class); ProtoParsers.put(intent, EXTRA_CONTACT, contact); ProtoParsers.put(intent, EXTRA_CALL_DETAILS_ENTRIES, details); + intent.putExtra(EXTRA_CAN_REPORT_CALLER_ID, canReportCallerId); return intent; } @@ -62,13 +89,48 @@ public class CallDetailsActivity extends AppCompatActivity implements OnMenuItem protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.call_details_activity); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + Toolbar toolbar = findViewById(R.id.toolbar); toolbar.inflateMenu(R.menu.call_details_menu); toolbar.setOnMenuItemClickListener(this); toolbar.setTitle(R.string.call_details); + toolbar.setNavigationOnClickListener( + v -> { + PerformanceReport.recordClick(UiAction.Type.CLOSE_CALL_DETAIL_WITH_CANCEL_BUTTON); + finish(); + }); onHandleIntent(getIntent()); } + @Override + protected void onResume() { + super.onResume(); + + // Some calls may not be recorded (eg. from quick contact), + // so we should restart recording after these calls. (Recorded call is stopped) + PostCall.restartPerformanceRecordingIfARecentCallExist(this); + if (!PerformanceReport.isRecording()) { + PerformanceReport.startRecording(); + } + + PostCall.promptUserForMessageIfNecessary(this, findViewById(R.id.recycler_view)); + + EnrichedCallComponent.get(this) + .getEnrichedCallManager() + .registerHistoricalDataChangedListener(this); + EnrichedCallComponent.get(this) + .getEnrichedCallManager() + .requestAllHistoricalData(contact.getNumber(), entries); + } + + @Override + protected void onPause() { + super.onPause(); + + EnrichedCallComponent.get(this) + .getEnrichedCallManager() + .unregisterHistoricalDataChangedListener(this); + } + @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -76,16 +138,16 @@ public class CallDetailsActivity extends AppCompatActivity implements OnMenuItem } private void onHandleIntent(Intent intent) { - CallComposerContact contact = - ProtoParsers.getTrusted(intent, EXTRA_CONTACT, CallComposerContact.getDefaultInstance()); + contact = ProtoParsers.getTrusted(intent, EXTRA_CONTACT, DialerContact.getDefaultInstance()); entries = ProtoParsers.getTrusted( - intent, EXTRA_CALL_DETAILS_ENTRIES, CallDetailsEntries.getDefaultInstance()) - .getEntriesList(); + intent, EXTRA_CALL_DETAILS_ENTRIES, CallDetailsEntries.getDefaultInstance()); + adapter = new CallDetailsAdapter(this, contact, entries.getEntriesList(), this); - RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); + RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); - recyclerView.setAdapter(new CallDetailsAdapter(this, contact, entries)); + recyclerView.setAdapter(adapter); + PerformanceReport.logOnScrollStateChange(recyclerView); } @Override @@ -99,6 +161,73 @@ public class CallDetailsActivity extends AppCompatActivity implements OnMenuItem return false; } + @Override + public void onBackPressed() { + PerformanceReport.recordClick(UiAction.Type.PRESS_ANDROID_BACK_BUTTON); + super.onBackPressed(); + } + + @Override + public void reportCallId(String number) { + ReportDialogFragment.newInstance(number).show(getFragmentManager(), null); + } + + @Override + public boolean canReportCallerId(String number) { + return getIntent().getExtras().getBoolean(EXTRA_CAN_REPORT_CALLER_ID, false); + } + + @Override + public void onHistoricalDataChanged() { + Map> mappedResults = + getAllHistoricalData(contact.getNumber(), entries); + + adapter.updateCallDetailsEntries( + generateAndMapNewCallDetailsEntriesHistoryResults( + contact.getNumber(), entries, mappedResults) + .getEntriesList()); + } + + @NonNull + private Map> getAllHistoricalData( + @Nullable String number, @NonNull CallDetailsEntries entries) { + if (number == null) { + return Collections.emptyMap(); + } + + Map> historicalData = + EnrichedCallComponent.get(this) + .getEnrichedCallManager() + .getAllHistoricalData(number, entries); + if (historicalData == null) { + return Collections.emptyMap(); + } + return historicalData; + } + + private static CallDetailsEntries generateAndMapNewCallDetailsEntriesHistoryResults( + @Nullable String number, + @NonNull CallDetailsEntries callDetailsEntries, + @NonNull Map> mappedResults) { + if (number == null) { + return callDetailsEntries; + } + CallDetailsEntries.Builder mutableCallDetailsEntries = CallDetailsEntries.newBuilder(); + for (CallDetailsEntry entry : callDetailsEntries.getEntriesList()) { + CallDetailsEntry.Builder newEntry = CallDetailsEntry.newBuilder().mergeFrom(entry); + List results = mappedResults.get(entry); + if (results != null) { + newEntry.addAllHistoryResults(mappedResults.get(entry)); + LogUtil.v( + "CallLogAdapter.generateAndMapNewCallDetailsEntriesHistoryResults", + "mapped %d results", + newEntry.getHistoryResultsList().size()); + } + mutableCallDetailsEntries.addEntries(newEntry.build()); + } + return mutableCallDetailsEntries.build(); + } + /** Delete specified calls from the call log. */ private class DeleteCallsTask extends AsyncTask { @@ -106,7 +235,7 @@ public class CallDetailsActivity extends AppCompatActivity implements OnMenuItem DeleteCallsTask() { StringBuilder callIds = new StringBuilder(); - for (CallDetailsEntry entry : entries) { + for (CallDetailsEntry entry : entries.getEntriesList()) { if (callIds.length() != 0) { callIds.append(","); } @@ -124,6 +253,15 @@ public class CallDetailsActivity extends AppCompatActivity implements OnMenuItem @Override public void onPostExecute(Void result) { + Intent data = new Intent(); + data.putExtra(EXTRA_PHONE_NUMBER, contact.getNumber()); + for (CallDetailsEntry entry : entries.getEntriesList()) { + if (entry.getHistoryResultsCount() > 0) { + data.putExtra(EXTRA_HAS_ENRICHED_CALL_DATA, true); + break; + } + } + setResult(RESULT_OK, data); finish(); } } diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapter.java b/java/com/android/dialer/calldetails/CallDetailsAdapter.java index 725077965..645587461 100644 --- a/java/com/android/dialer/calldetails/CallDetailsAdapter.java +++ b/java/com/android/dialer/calldetails/CallDetailsAdapter.java @@ -22,30 +22,36 @@ import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.ViewGroup; -import com.android.dialer.callcomposer.CallComposerContact; import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; import com.android.dialer.calllogutils.CallTypeHelper; import com.android.dialer.common.Assert; +import com.android.dialer.dialercontact.DialerContact; +import com.android.dialer.lightbringer.LightbringerComponent; import java.util.List; /** Adapter for RecyclerView in {@link CallDetailsActivity}. */ -public class CallDetailsAdapter extends RecyclerView.Adapter { +final class CallDetailsAdapter extends RecyclerView.Adapter { private static final int HEADER_VIEW_TYPE = 1; private static final int CALL_ENTRY_VIEW_TYPE = 2; private static final int FOOTER_VIEW_TYPE = 3; - private final CallComposerContact contact; - private final List callDetailsEntries; + private final DialerContact contact; + private final CallDetailsFooterViewHolder.ReportCallIdListener listener; private final CallTypeHelper callTypeHelper; + private List callDetailsEntries; - public CallDetailsAdapter( + CallDetailsAdapter( Context context, - @NonNull CallComposerContact contact, - @NonNull List callDetailsEntries) { + @NonNull DialerContact contact, + @NonNull List callDetailsEntries, + CallDetailsFooterViewHolder.ReportCallIdListener listener) { this.contact = Assert.isNotNull(contact); this.callDetailsEntries = callDetailsEntries; - callTypeHelper = new CallTypeHelper(context.getResources()); + this.listener = listener; + callTypeHelper = + new CallTypeHelper( + context.getResources(), LightbringerComponent.get(context).getLightbringer()); } @Override @@ -60,10 +66,10 @@ public class CallDetailsAdapter extends RecyclerView.Adapter entries) { + callDetailsEntries = entries; + notifyDataSetChanged(); + } } diff --git a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java index bc989ea25..084bd667c 100644 --- a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java +++ b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java @@ -28,7 +28,8 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; -import com.android.dialer.calllogutils.CallEntryFormatter; +import com.android.dialer.calllogutils.CallLogDates; +import com.android.dialer.calllogutils.CallLogDurations; import com.android.dialer.calllogutils.CallTypeHelper; import com.android.dialer.calllogutils.CallTypeIconsView; import com.android.dialer.common.LogUtil; @@ -36,7 +37,6 @@ import com.android.dialer.compat.AppCompatConstants; import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult; import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult.Type; import com.android.dialer.oem.MotorolaUtils; -import com.android.dialer.util.CallUtil; import com.android.dialer.util.DialerUtils; import com.android.dialer.util.IntentUtil; @@ -57,7 +57,7 @@ public class CallDetailsEntryViewHolder extends ViewHolder { private final ImageView multimediaImage; - // TODO: Display this when location is stored - b/36160042 + // TODO(maxwelb): Display this when location is stored - b/36160042 @SuppressWarnings("unused") private final TextView multimediaAttachmentsNumber; @@ -88,32 +88,33 @@ public class CallDetailsEntryViewHolder extends ViewHolder { CallTypeHelper callTypeHelper, boolean showMultimediaDivider) { int callType = entry.getCallType(); - boolean isVideoCall = - (entry.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO - && CallUtil.isVideoEnabled(context); + boolean isVideoCall = (entry.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO; boolean isPulledCall = (entry.getFeatures() & Calls.FEATURES_PULLED_EXTERNALLY) == Calls.FEATURES_PULLED_EXTERNALLY; + boolean isLightbringerCall = entry.getIsLightbringerCall(); callTime.setTextColor(getColorForCallType(context, callType)); callTypeIcon.clear(); callTypeIcon.add(callType); - callTypeIcon.setShowVideo((entry.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO); + callTypeIcon.setShowVideo(isVideoCall); callTypeIcon.setShowHd(MotorolaUtils.shouldShowHdIconInCallLog(context, entry.getFeatures())); callTypeIcon.setShowWifi( MotorolaUtils.shouldShowWifiIconInCallLog(context, entry.getFeatures())); - callTypeText.setText(callTypeHelper.getCallTypeText(callType, isVideoCall, isPulledCall)); - callTime.setText(CallEntryFormatter.formatDate(context, entry.getDate())); + callTypeText.setText( + callTypeHelper.getCallTypeText(callType, isVideoCall, isPulledCall, isLightbringerCall)); + callTime.setText(CallLogDates.formatDate(context, entry.getDate())); + if (CallTypeHelper.isMissedCallType(callType)) { callDuration.setVisibility(View.GONE); } else { callDuration.setVisibility(View.VISIBLE); callDuration.setText( - CallEntryFormatter.formatDurationAndDataUsage( + CallLogDurations.formatDurationAndDataUsage( context, entry.getDuration(), entry.getDataUsage())); callDuration.setContentDescription( - CallEntryFormatter.formatDurationAndDataUsageA11y( + CallLogDurations.formatDurationAndDataUsageA11y( context, entry.getDuration(), entry.getDataUsage())); } setMultimediaDetails(number, entry, showMultimediaDivider); diff --git a/java/com/android/dialer/calldetails/CallDetailsFooterViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsFooterViewHolder.java index 3f894366f..9d3f4bcbc 100644 --- a/java/com/android/dialer/calldetails/CallDetailsFooterViewHolder.java +++ b/java/com/android/dialer/calldetails/CallDetailsFooterViewHolder.java @@ -26,33 +26,41 @@ import com.android.contacts.common.ClipboardUtils; import com.android.dialer.common.Assert; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; +import com.android.dialer.logging.UiAction; +import com.android.dialer.performancereport.PerformanceReport; import com.android.dialer.util.CallUtil; import com.android.dialer.util.DialerUtils; /** ViewHolder container for {@link CallDetailsActivity} footer. */ -public class CallDetailsFooterViewHolder extends RecyclerView.ViewHolder - implements OnClickListener { +final class CallDetailsFooterViewHolder extends RecyclerView.ViewHolder implements OnClickListener { + private final ReportCallIdListener listener; private final View container; private final View copy; private final View edit; + private final View reportCallerId; private String number; - public CallDetailsFooterViewHolder(View view) { + CallDetailsFooterViewHolder(View view, ReportCallIdListener listener) { super(view); + this.listener = listener; container = view.findViewById(R.id.footer_container); copy = view.findViewById(R.id.call_detail_action_copy); edit = view.findViewById(R.id.call_detail_action_edit_before_call); + reportCallerId = view.findViewById(R.id.call_detail_action_report_caller_id); copy.setOnClickListener(this); edit.setOnClickListener(this); + reportCallerId.setOnClickListener(this); } public void setPhoneNumber(String number) { this.number = number; if (TextUtils.isEmpty(number)) { container.setVisibility(View.GONE); + } else if (listener.canReportCallerId(number)) { + reportCallerId.setVisibility(View.VISIBLE); } } @@ -60,14 +68,32 @@ public class CallDetailsFooterViewHolder extends RecyclerView.ViewHolder public void onClick(View view) { Context context = view.getContext(); if (view == copy) { + PerformanceReport.recordClick(UiAction.Type.COPY_NUMBER_IN_CALL_DETAIL); + Logger.get(context).logImpression(DialerImpression.Type.CALL_DETAILS_COPY_NUMBER); ClipboardUtils.copyText(context, null, number, true); } else if (view == edit) { + PerformanceReport.recordClick(UiAction.Type.EDIT_NUMBER_BEFORE_CALL_IN_CALL_DETAIL); + // Dialpad will be filled with this number, but we don't want to record it as user action + PerformanceReport.setIgnoreActionOnce(UiAction.Type.TEXT_CHANGE_WITH_INPUT); + Logger.get(context).logImpression(DialerImpression.Type.CALL_DETAILS_EDIT_BEFORE_CALL); Intent dialIntent = new Intent(Intent.ACTION_DIAL, CallUtil.getCallUri(number)); DialerUtils.startActivityWithErrorToast(context, dialIntent); + } else if (view == reportCallerId) { + listener.reportCallId(number); } else { Assert.fail("View on click not implemented: " + view); } } + + /** Listener for reporting caller id */ + interface ReportCallIdListener { + + /** Tell listener that the user requested to report caller id info as inaccurate. */ + void reportCallId(String number); + + /** returns true if the number can be reported as inaccurate. */ + boolean canReportCallerId(String number); + } } diff --git a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java index 4d9aacf7b..410a3a012 100644 --- a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java +++ b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java @@ -19,17 +19,19 @@ package com.android.dialer.calldetails; import android.content.Context; import android.net.Uri; import android.support.v7.widget.RecyclerView; +import android.telecom.PhoneAccount; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.widget.QuickContactBadge; import android.widget.TextView; -import com.android.contacts.common.ContactPhotoManager; -import com.android.dialer.callcomposer.CallComposerContact; import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.callintent.CallIntentBuilder; import com.android.dialer.common.Assert; +import com.android.dialer.contactphoto.ContactPhotoManager; +import com.android.dialer.dialercontact.DialerContact; import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.InteractionEvent; import com.android.dialer.logging.Logger; import com.android.dialer.util.DialerUtils; @@ -40,23 +42,29 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder private final View callBackButton; private final TextView nameView; private final TextView numberView; + private final TextView networkView; private final QuickContactBadge contactPhoto; private final Context context; - private CallComposerContact contact; + private DialerContact contact; CallDetailsHeaderViewHolder(View container) { super(container); context = container.getContext(); callBackButton = container.findViewById(R.id.call_back_button); - nameView = (TextView) container.findViewById(R.id.contact_name); - numberView = (TextView) container.findViewById(R.id.phone_number); - contactPhoto = (QuickContactBadge) container.findViewById(R.id.quick_contact_photo); + nameView = container.findViewById(R.id.contact_name); + numberView = container.findViewById(R.id.phone_number); + networkView = container.findViewById(R.id.network); + contactPhoto = container.findViewById(R.id.quick_contact_photo); + callBackButton.setOnClickListener(this); + Logger.get(context) + .logQuickContactOnTouch( + contactPhoto, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_CALL_DETAILS, true); } /** Populates the contact info fields based on the current contact information. */ - void updateContactInfo(CallComposerContact contact) { + void updateContactInfo(DialerContact contact) { this.contact = contact; ContactPhotoManager.getInstance(context) .loadDialerThumbnailOrPhoto( @@ -67,8 +75,6 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder contact.getNameOrNumber(), contact.getContactType()); - contactPhoto.setContentDescription( - context.getString(R.string.description_contact_photo_details, contact.getNameOrNumber())); nameView.setText(contact.getNameOrNumber()); if (!TextUtils.isEmpty(contact.getDisplayNumber())) { numberView.setVisibility(View.VISIBLE); @@ -85,6 +91,14 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder numberView.setText(null); } + if (!TextUtils.isEmpty(contact.getSimDetails().getNetwork())) { + networkView.setVisibility(View.VISIBLE); + networkView.setText(contact.getSimDetails().getNetwork()); + if (contact.getSimDetails().getColor() != PhoneAccount.NO_HIGHLIGHT_COLOR) { + networkView.setTextColor(contact.getSimDetails().getColor()); + } + } + if (TextUtils.isEmpty(contact.getNumber())) { callBackButton.setVisibility(View.GONE); } @@ -98,7 +112,7 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder view.getContext(), new CallIntentBuilder(contact.getNumber(), CallInitiationType.Type.CALL_DETAILS).build()); } else { - Assert.fail("View OnClickListener not implemented: " + view); + throw Assert.createIllegalStateFailException("View OnClickListener not implemented: " + view); } } } diff --git a/java/com/android/dialer/calldetails/ReportDialogFragment.java b/java/com/android/dialer/calldetails/ReportDialogFragment.java new file mode 100644 index 000000000..0861c9dbb --- /dev/null +++ b/java/com/android/dialer/calldetails/ReportDialogFragment.java @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.calldetails; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.util.Pair; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; +import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutorComponent; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; +import com.android.dialer.phonenumbercache.CachedNumberLookupService; +import com.android.dialer.phonenumbercache.CachedNumberLookupService.CachedContactInfo; +import com.android.dialer.phonenumbercache.PhoneNumberCache; + +/** Dialog for reporting an inaccurate caller id information in {@link CallDetailsActivity}. */ +public class ReportDialogFragment extends DialogFragment { + + private static final String KEY_NUMBER = "number"; + private TextView name; + private TextView numberView; + + private CachedNumberLookupService cachedNumberLookupService; + private CachedNumberLookupService.CachedContactInfo info; + private String number; + + public static ReportDialogFragment newInstance(String number) { + ReportDialogFragment fragment = new ReportDialogFragment(); + Bundle bundle = new Bundle(); + bundle.putString(KEY_NUMBER, number); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle bundle) { + super.onCreate(bundle); + setRetainInstance(true); + number = getArguments().getString(KEY_NUMBER); + cachedNumberLookupService = PhoneNumberCache.get(getContext()).getCachedNumberLookupService(); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + LayoutInflater inflater = getActivity().getLayoutInflater(); + View view = inflater.inflate(R.layout.caller_id_report_dialog, null, false); + name = view.findViewById(R.id.name); + numberView = view.findViewById(R.id.number); + + lookupContactInfo(number); + + AlertDialog reportDialog = + new AlertDialog.Builder(getActivity()) + .setTitle(R.string.report_caller_id_dialog_title) + .setPositiveButton(android.R.string.ok, (dialog, which) -> positiveClick(dialog)) + .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) + .setView(view) + .create(); + + reportDialog.setOnShowListener(dialog -> onShow(getContext(), reportDialog)); + return reportDialog; + } + + private void positiveClick(DialogInterface dialog) { + startReportCallerIdWorker(); + dialog.dismiss(); + } + + private static void onShow(Context context, AlertDialog dialog) { + int buttonTextColor = context.getColor(R.color.dialer_theme_color); + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(buttonTextColor); + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(buttonTextColor); + } + + private void lookupContactInfo(String number) { + Worker worker = + number1 -> cachedNumberLookupService.lookupCachedContactFromNumber(getContext(), number1); + SuccessListener successListener = this::setCachedContactInfo; + DialerExecutorComponent.get(getContext()) + .dialerExecutorFactory() + .createUiTaskBuilder(getFragmentManager(), "lookup_contact_info", worker) + .onSuccess(successListener) + .build() + .executeParallel(number); + } + + private void setCachedContactInfo(CachedContactInfo info) { + this.info = info; + if (info != null) { + name.setText(info.getContactInfo().name); + numberView.setText(info.getContactInfo().number); + } else { + numberView.setText(number); + name.setVisibility(View.GONE); + } + } + + private void startReportCallerIdWorker() { + Worker> worker = this::reportCallerId; + SuccessListener> successListener = this::onReportCallerId; + DialerExecutorComponent.get(getContext()) + .dialerExecutorFactory() + .createUiTaskBuilder(getFragmentManager(), "report_caller_id", worker) + .onSuccess(successListener) + .build() + .executeParallel(getActivity()); + } + + private Pair reportCallerId(Context context) { + if (cachedNumberLookupService.reportAsInvalid(context, info)) { + info.getContactInfo().isBadData = true; + cachedNumberLookupService.addContact(context, info); + LogUtil.d("ReportUploadTask.doInBackground", "Contact reported."); + return new Pair<>(context, true); + } else { + return new Pair<>(context, false); + } + } + + private void onReportCallerId(Pair output) { + Context context = output.first; + boolean wasReport = output.second; + if (wasReport) { + Logger.get(context).logImpression(DialerImpression.Type.CALLER_ID_REPORTED); + Toast.makeText(context, R.string.report_caller_id_toast, Toast.LENGTH_SHORT).show(); + } else { + Logger.get(context).logImpression(DialerImpression.Type.CALLER_ID_REPORT_FAILED); + Toast.makeText(context, R.string.report_caller_id_failed, Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onDestroyView() { + if (getDialog() != null && getRetainInstance()) { + // Prevent dialog from dismissing on rotate. + getDialog().setDismissMessage(null); + } + super.onDestroyView(); + } +} diff --git a/java/com/android/dialer/calldetails/proto/call_details_entries.proto b/java/com/android/dialer/calldetails/proto/call_details_entries.proto index e254b7713..587fd35bd 100644 --- a/java/com/android/dialer/calldetails/proto/call_details_entries.proto +++ b/java/com/android/dialer/calldetails/proto/call_details_entries.proto @@ -4,6 +4,7 @@ option java_package = "com.android.dialer.calldetails"; option java_multiple_files = true; option optimize_for = LITE_RUNTIME; + import "java/com/android/dialer/enrichedcall/historyquery/proto/history_result.proto"; package com.android.dialer.calldetails; @@ -17,6 +18,7 @@ message CallDetailsEntries { optional int64 duration = 5; optional int64 data_usage = 6; repeated enrichedcall.historyquery.proto.HistoryResult history_results = 7; + optional bool is_lightbringer_call = 8; } repeated CallDetailsEntry entries = 1; diff --git a/java/com/android/dialer/calldetails/res/layout/call_details_footer.xml b/java/com/android/dialer/calldetails/res/layout/call_details_footer.xml index ccfa4e7ac..fbca3f8fe 100644 --- a/java/com/android/dialer/calldetails/res/layout/call_details_footer.xml +++ b/java/com/android/dialer/calldetails/res/layout/call_details_footer.xml @@ -41,4 +41,13 @@ android:layout_height="wrap_content" android:drawableStart="@drawable/quantum_ic_edit_grey600_24" android:text="@string/call_details_edit_number"/> + + diff --git a/java/com/android/dialer/calldetails/res/layout/caller_id_report_dialog.xml b/java/com/android/dialer/calldetails/res/layout/caller_id_report_dialog.xml new file mode 100644 index 000000000..09d3c2b43 --- /dev/null +++ b/java/com/android/dialer/calldetails/res/layout/caller_id_report_dialog.xml @@ -0,0 +1,35 @@ + + + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/calldetails/res/layout/contact_container.xml b/java/com/android/dialer/calldetails/res/layout/contact_container.xml index bb89b36f2..b01a6cc13 100644 --- a/java/com/android/dialer/calldetails/res/layout/contact_container.xml +++ b/java/com/android/dialer/calldetails/res/layout/contact_container.xml @@ -29,10 +29,9 @@ android:id="@+id/quick_contact_photo" android:layout_width="@dimen/call_details_contact_photo_size" android:layout_height="@dimen/call_details_contact_photo_size" - android:layout_marginTop="2dp" + android:layout_centerVertical="true" android:padding="@dimen/call_details_contact_photo_padding" - android:focusable="true" - android:contentDescription="@string/description_quick_contact_for"/> + android:focusable="true"/> + + - + \ No newline at end of file diff --git a/java/com/android/dialer/calldetails/res/values-af/strings.xml b/java/com/android/dialer/calldetails/res/values-af/strings.xml index 86bef4b9a..3d15e5bfa 100644 --- a/java/com/android/dialer/calldetails/res/values-af/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-af/strings.xml @@ -21,9 +21,11 @@ "Vee uit" "Kopieer nommer" "Wysig nommer voordat jy bel" - "Bel" + "Gee foutiewe nommer aan" "Het \'n foto gestuur" "Het \'n foto ontvang" "\"%1$s\"" - "Kontakbesonderhede vir %1$s" + "Gee verkeerde nommer aan" + "Kon nie nommer aangee nie" + "Nommer is aangegee" diff --git a/java/com/android/dialer/calldetails/res/values-am/strings.xml b/java/com/android/dialer/calldetails/res/values-am/strings.xml index 2a23945fe..2103353ff 100644 --- a/java/com/android/dialer/calldetails/res/values-am/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-am/strings.xml @@ -21,9 +21,11 @@ "ሰርዝ" "ቁጥር ቅዳ" "ከመደወል በፊት ቁጥር አርትዕ ያድርጉ" - "ጥሪ" + "ትክክለኛ ያልሆነ ቁጥርን ሪፓርት አድርግ" "አንድ ፎቶ ተልኳል" "አንድ ፎቶ ደርሷል" %1$s»" - "የ%1$s የእውቂያ ዝርዝሮች" + "የተሳሳተ ቁጥርን ሪፖርት ያድርጉ" + "ቁጥሩን ሪፖርት ማድረግ አልተቻለም" + "ቁጥሩ ሪፖርት ተደርጓል" diff --git a/java/com/android/dialer/calldetails/res/values-ar/strings.xml b/java/com/android/dialer/calldetails/res/values-ar/strings.xml index 6b0d8a773..066b89c7c 100644 --- a/java/com/android/dialer/calldetails/res/values-ar/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ar/strings.xml @@ -21,9 +21,11 @@ "حذف" "نسخ الرقم" "تعديل الرقم قبل الاتصال" - "الاتصال" + "الإبلاغ عن رقم غير دقيق" "تم إرسال صورة" "تم تلقي صورة" "\"%1$s\"" - "تفاصيل الاتصال بالمستخدم %1$s" + "الإبلاغ عن رقم غير صحيح" + "تعذر الإبلاغ عن الرقم" + "تم الإبلاغ عن الرقم" diff --git a/java/com/android/dialer/calldetails/res/values-az/strings.xml b/java/com/android/dialer/calldetails/res/values-az/strings.xml index 479837c34..e9aaf144d 100644 --- a/java/com/android/dialer/calldetails/res/values-az/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-az/strings.xml @@ -21,9 +21,11 @@ "Silin" "Nömrəni kopyalayın" "Zəng etmədən öncə nömrəyə düzəliş edin" - "Zəng edin" + "Qeyri-dəqiq nömrəni bildirin" "Foto göndərildi" "Foto alındı" "\"%1$s\"" - "%1$s üçün kontakt detalları" + "Yanlış nömrəni bildirin" + "Nömrəni bildirmək mümkün olmadı" + "Nömrə bildirildi" diff --git a/java/com/android/dialer/calldetails/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/calldetails/res/values-b+sr+Latn/strings.xml index 01141ffa4..780e6749d 100644 --- a/java/com/android/dialer/calldetails/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-b+sr+Latn/strings.xml @@ -21,9 +21,11 @@ "Izbriši" "Kopiraj broj" "Izmenite broj pre poziva" - "Pozovi" + "Prijavi netačan broj" "Slika je poslata" "Slika je primljena" "„%1$s“" - "Kontakt informacije za %1$s" + "Prijavite netačan broj" + "Prijavljivanje broja nije uspelo" + "Broj je prijavljen" diff --git a/java/com/android/dialer/calldetails/res/values-be/strings.xml b/java/com/android/dialer/calldetails/res/values-be/strings.xml index 683f29bb2..6c6724cd9 100644 --- a/java/com/android/dialer/calldetails/res/values-be/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-be/strings.xml @@ -21,9 +21,11 @@ "Выдаліць" "Скапіраваць нумар" "Рэдагаваць нумар перад выклікам" - "Выклік" + "Падаць заяву аб недакладным нумары" "Адпраўлена фота" "Атрымана фота" "\"%1$s\"" - "Кантактныя даныя абанента %1$s" + "Падаць заяву аб няправільным нумары" + "Не ўдалося падаць заяву аб нумары" + "Аб нумары пададзена заява" diff --git a/java/com/android/dialer/calldetails/res/values-bg/strings.xml b/java/com/android/dialer/calldetails/res/values-bg/strings.xml index 9cd70e2f6..547fdbbbc 100644 --- a/java/com/android/dialer/calldetails/res/values-bg/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-bg/strings.xml @@ -21,9 +21,11 @@ "Изтриване" "Копиране на номера" "Редактиране на номера преди обаждане" - "Обаждане" + "Подаване на сигнал за неточен номер" "Изпратена бе снимка" "Получена бе снимка" "„%1$s“" - "Подробности за контакта за %1$s" + "Подаване на сигнал за неправилен номер" + "Сигналът за номера не можа да бъде подаден" + "За номера бе подаден сигнал" diff --git a/java/com/android/dialer/calldetails/res/values-bn/strings.xml b/java/com/android/dialer/calldetails/res/values-bn/strings.xml index 148f61aba..65798f59e 100644 --- a/java/com/android/dialer/calldetails/res/values-bn/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-bn/strings.xml @@ -21,9 +21,11 @@ "মুছুন" "নম্বর কপি করুন" "কল করার আগে নম্বর সম্পাদন করুন" - "কল করুন" + "ভুল নম্বর প্রতিবেদন করুন" "একটি ফটো পাঠিয়েছেন" "একটি ফটো পেয়েছেন" "\"%1$s\"" - "%1$s পরিচিতির বিশদ বিবরণ" + "ভুল নম্বর প্রতিবেদন করুন" + "নম্বরটির প্রতিবেদন করা যায়নি" + "নম্বরটির প্রতিবেদন করা হয়েছে" diff --git a/java/com/android/dialer/calldetails/res/values-bs/strings.xml b/java/com/android/dialer/calldetails/res/values-bs/strings.xml index 6f164b228..10ef7aaa8 100644 --- a/java/com/android/dialer/calldetails/res/values-bs/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-bs/strings.xml @@ -21,9 +21,11 @@ "Izbriši" "Kopiraj broj" "Uredi broj prije poziva" - "Poziv" + "Prijavite nevažeći broj" "Fotografija poslana" "Fotografija primljena" "\"%1$s\"" - "Detalji o kontaktu %1$s" + "Prijava pogrešnog broja" + "Prijava broja nije moguća" + "Broj je prijavljen" diff --git a/java/com/android/dialer/calldetails/res/values-ca/strings.xml b/java/com/android/dialer/calldetails/res/values-ca/strings.xml index 0e33e60e7..59bd29716 100644 --- a/java/com/android/dialer/calldetails/res/values-ca/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ca/strings.xml @@ -21,9 +21,11 @@ "Suprimeix" "Copia el número" "Edita el número abans de trucar" - "Truca" + "Informa d\'un número incorrecte" "S\'ha enviat una foto" "S\'ha rebut una foto" "%1$s" - "Dades de contacte de: %1$s" + "Informa d\'un número incorrecte" + "No s\'ha pogut informar del número" + "S\'ha informat del número" diff --git a/java/com/android/dialer/calldetails/res/values-cs/strings.xml b/java/com/android/dialer/calldetails/res/values-cs/strings.xml index 9747ee139..d4748fc61 100644 --- a/java/com/android/dialer/calldetails/res/values-cs/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-cs/strings.xml @@ -21,9 +21,11 @@ "Smazat" "Kopírovat číslo" "Před voláním upravit číslo" - "Zavolat" + "Nahlásit nesprávné číslo" "Byla poslána fotka" "Byla přijata fotka" "„%1$s“" - "Podrobnosti kontaktu %1$s" + "Nahlásit nesprávné číslo" + "Číslo se nepodařilo nahlásit" + "Číslo bylo nahlášeno" diff --git a/java/com/android/dialer/calldetails/res/values-da/strings.xml b/java/com/android/dialer/calldetails/res/values-da/strings.xml index 41bc25254..5de4486f4 100644 --- a/java/com/android/dialer/calldetails/res/values-da/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-da/strings.xml @@ -21,9 +21,11 @@ "Slet" "Kopiér nummer" "Rediger nummer før opkald" - "Ring op" + "Rapportér et forkert nummer" "Der blev sendt et billede" "Der blev modtaget et billede" "\"%1$s\"" - "Kontaktoplysninger for %1$s" + "Rapportér forkert nummer" + "Det forkerte nummer kunne ikke rapporteres" + "Nummeret blev rapporteret" diff --git a/java/com/android/dialer/calldetails/res/values-de/strings.xml b/java/com/android/dialer/calldetails/res/values-de/strings.xml index 014666b3f..3c30d8e30 100644 --- a/java/com/android/dialer/calldetails/res/values-de/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-de/strings.xml @@ -21,9 +21,11 @@ "Löschen" "Nummer kopieren" "Nummer vor Anruf bearbeiten" - "Anrufen" + "Falsche Nummer melden" "Hat ein Foto gesendet" "Hat ein Foto empfangen" "\"%1$s\"" - "Kontaktdetails für %1$s" + "Falsche Nummer melden" + "Nummer konnte nicht gemeldet werden" + "Nummer gemeldet" diff --git a/java/com/android/dialer/calldetails/res/values-el/strings.xml b/java/com/android/dialer/calldetails/res/values-el/strings.xml index 6b51fc71d..e5097d174 100644 --- a/java/com/android/dialer/calldetails/res/values-el/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-el/strings.xml @@ -21,9 +21,11 @@ "Διαγραφή" "Αντιγραφή αριθμού" "Επεξεργασία αριθμού πριν από την κλήση" - "Κλήση" + "Αναφορά ανακριβούς αριθμού" "Έγινε αποστολή φωτογραφίας" "Έγινε λήψη φωτογραφίας" "\"%1$s\"" - "Στοιχεία επικοινωνίας επαφής %1$s" + "Αναφορά λανθασμένου αριθμού" + "Δεν ήταν δυνατή η αναφορά του αριθμού" + "Υποβλήθηκε αναφορά για τον αριθμό" diff --git a/java/com/android/dialer/calldetails/res/values-en-rAU/strings.xml b/java/com/android/dialer/calldetails/res/values-en-rAU/strings.xml index 2d5210e8c..45deb49c2 100644 --- a/java/com/android/dialer/calldetails/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-en-rAU/strings.xml @@ -21,9 +21,11 @@ "Delete" "Copy number" "Edit number before call" - "Call" + "Report inaccurate number" "Sent a photo" "Received a photo" "\"%1$s\"" - "Contact details for %1$s" + "Report incorrect number" + "Couldn\'t report number" + "Number reported" diff --git a/java/com/android/dialer/calldetails/res/values-en-rGB/strings.xml b/java/com/android/dialer/calldetails/res/values-en-rGB/strings.xml index 2d5210e8c..45deb49c2 100644 --- a/java/com/android/dialer/calldetails/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-en-rGB/strings.xml @@ -21,9 +21,11 @@ "Delete" "Copy number" "Edit number before call" - "Call" + "Report inaccurate number" "Sent a photo" "Received a photo" "\"%1$s\"" - "Contact details for %1$s" + "Report incorrect number" + "Couldn\'t report number" + "Number reported" diff --git a/java/com/android/dialer/calldetails/res/values-en-rIN/strings.xml b/java/com/android/dialer/calldetails/res/values-en-rIN/strings.xml index 2d5210e8c..45deb49c2 100644 --- a/java/com/android/dialer/calldetails/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-en-rIN/strings.xml @@ -21,9 +21,11 @@ "Delete" "Copy number" "Edit number before call" - "Call" + "Report inaccurate number" "Sent a photo" "Received a photo" "\"%1$s\"" - "Contact details for %1$s" + "Report incorrect number" + "Couldn\'t report number" + "Number reported" diff --git a/java/com/android/dialer/calldetails/res/values-es-rUS/strings.xml b/java/com/android/dialer/calldetails/res/values-es-rUS/strings.xml index d9db2825c..778868eab 100644 --- a/java/com/android/dialer/calldetails/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-es-rUS/strings.xml @@ -21,9 +21,11 @@ "Borrar" "Copiar número" "Editar número antes de llamar" - "Llamar" + "Informar número incorrecto" "Enviaste una foto" "Recibiste una foto" "\"%1$s\"" - "Datos de contacto de %1$s" + "Informar número incorrecto" + "No se pudo informar el número." + "Número informado" diff --git a/java/com/android/dialer/calldetails/res/values-es/strings.xml b/java/com/android/dialer/calldetails/res/values-es/strings.xml index e72e898b4..5cecffaea 100644 --- a/java/com/android/dialer/calldetails/res/values-es/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-es/strings.xml @@ -21,9 +21,11 @@ "Eliminar" "Copiar número" "Editar número antes de llamar" - "Llamar" + "Notificar un número incorrecto" "Se ha enviado una foto" "Se ha recibido una foto" "\"%1$s\"" - "Información de contacto de %1$s" + "Notificar un número incorrecto" + "No se ha podido notificar el número" + "Número notificado" diff --git a/java/com/android/dialer/calldetails/res/values-et/strings.xml b/java/com/android/dialer/calldetails/res/values-et/strings.xml index 496459d6b..c8f52aedc 100644 --- a/java/com/android/dialer/calldetails/res/values-et/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-et/strings.xml @@ -21,9 +21,11 @@ "Kustuta" "Kopeeri number" "Muuda numbrit enne helistamist" - "Kõne" + "Valest numbrist teavitamine" "Saatis foto" "Sai foto" "„%1$s”" - "Kontakti %1$s üksikasjad" + "Valest numbrist teavitamine" + "Numbrist ei õnnestunud teavitada" + "Numbrist teavitati" diff --git a/java/com/android/dialer/calldetails/res/values-eu/strings.xml b/java/com/android/dialer/calldetails/res/values-eu/strings.xml index 913082fb8..5184e64f6 100644 --- a/java/com/android/dialer/calldetails/res/values-eu/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-eu/strings.xml @@ -21,9 +21,11 @@ "Ezabatu" "Kopiatu zenbakia" "Editatu zenbakia deitu aurretik" - "Deia" + "Jakinarazi zenbakiaren informazioa okerra dela" "Argazki bat bidali duzu" "Argazki bat jaso duzu" "\"%1$s\"" - "%1$s kontaktuaren xehetasunak" + "Jakinarazi zenbakia okerra dela" + "Ezin izan da bidali jakinarazpena" + "Bidali da jakinarazpena" diff --git a/java/com/android/dialer/calldetails/res/values-fa/strings.xml b/java/com/android/dialer/calldetails/res/values-fa/strings.xml index cad85a265..b37b2b5f6 100644 --- a/java/com/android/dialer/calldetails/res/values-fa/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-fa/strings.xml @@ -21,9 +21,11 @@ "حذف" "کپی کردن شماره" "ویرایش شماره قبل از تماس" - "تماس" + "گزارش شماره نادرست" "عکسی ارسال کرد" "عکسی دریافت کرد" %1$s»" - "جزئیات تماس %1$s" + "گزارش شماره نادرست" + "شماره گزارش نشد" + "شماره گزارش شد" diff --git a/java/com/android/dialer/calldetails/res/values-fi/strings.xml b/java/com/android/dialer/calldetails/res/values-fi/strings.xml index c16110d58..ead2c6af6 100644 --- a/java/com/android/dialer/calldetails/res/values-fi/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-fi/strings.xml @@ -21,9 +21,11 @@ "Poista" "Kopioi numero" "Muokkaa numeroa ennen puhelua" - "Soita" + "Ilmoita epätarkasta numerosta" "Lähetetty kuva" "Vastaanotettu kuva" "\"%1$s\"" - "Yhteystiedot: %1$s" + "Ilmoita väärästä numerosta" + "Numerosta ilmoittaminen epäonnistui." + "Numeroa koskeva ilmoitus lähetettiin." diff --git a/java/com/android/dialer/calldetails/res/values-fr-rCA/strings.xml b/java/com/android/dialer/calldetails/res/values-fr-rCA/strings.xml index 676861f3f..714fb7bea 100644 --- a/java/com/android/dialer/calldetails/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-fr-rCA/strings.xml @@ -21,9 +21,11 @@ "Supprimer" "Copier le numéro" "Modifier le numéro avant de passer l\'appel" - "Appeler" + "Signaler un numéro inexact" "Photo envoyée" "Photo reçue" "« %1$s »" - "Coordonnées de %1$s" + "Signaler un numéro incorrect" + "Impossible de signaler le numéro" + "Numéro signalé" diff --git a/java/com/android/dialer/calldetails/res/values-fr/strings.xml b/java/com/android/dialer/calldetails/res/values-fr/strings.xml index 606cb1095..f61234194 100644 --- a/java/com/android/dialer/calldetails/res/values-fr/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-fr/strings.xml @@ -21,9 +21,11 @@ "Supprimer" "Copier le numéro" "Modifier le numéro avant d\'appeler" - "Appeler" + "Signaler un numéro incorrect" "Envoi d\'une photo" "Réception d\'une photo" "\"%1$s\"" - "Coordonnées associées à %1$s" + "Signaler un numéro incorrect" + "Impossible de signaler le numéro" + "Signalement du numéro effectué" diff --git a/java/com/android/dialer/calldetails/res/values-gl/strings.xml b/java/com/android/dialer/calldetails/res/values-gl/strings.xml index aa5ff14dd..7f79834a7 100644 --- a/java/com/android/dialer/calldetails/res/values-gl/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-gl/strings.xml @@ -21,9 +21,11 @@ "Eliminar" "Copiar número" "Editar número antes de chamar" - "Chamar" + "Informar dun número impreciso" "Enviouse unha foto" "Recibiuse unha foto" "\"%1$s\"" - "Detalles de contacto de: %1$s" + "Informar dun número incorrecto" + "Non se puido marcar o número como inadecuado" + "Marcouse o número como inadecuado" diff --git a/java/com/android/dialer/calldetails/res/values-gu/strings.xml b/java/com/android/dialer/calldetails/res/values-gu/strings.xml index ccb8755b3..929970560 100644 --- a/java/com/android/dialer/calldetails/res/values-gu/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-gu/strings.xml @@ -21,9 +21,11 @@ "કાઢી નાખો" "નંબર કૉપિ કરો" "કૉલ કરતાં પહેલાં નંબર સંપાદિત કરો" - "કૉલ કરો" + "અચોક્કસ નંબરની જાણ કરો" "એક ફોટો મોકલ્યો" "એક ફોટો પ્રાપ્ત કર્યો" "\"%1$s\"" - "%1$s માટે સંપર્ક વિગતો" + "ખોટા નંબરની જાણ કરો" + "નંબરની જાણ કરી શકાઈ નથી" + "નંબરની જાણ કરી" diff --git a/java/com/android/dialer/calldetails/res/values-hi/strings.xml b/java/com/android/dialer/calldetails/res/values-hi/strings.xml index 517fbe52d..08099fe57 100644 --- a/java/com/android/dialer/calldetails/res/values-hi/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-hi/strings.xml @@ -21,9 +21,11 @@ "हटाएं" "नंबर कॉपी करें" "कॉल करने से पहले नंबर संपादित करें" - "कॉल करें" + "गलत जानकारी देने वाले नंबर की रिपोर्ट करें" "फ़ोटो भेजी गई" "फ़ोटो मिली" "\"%1$s\"" - "%1$s का संपर्क विवरण" + "गलत नंबर की रिपोर्ट करें" + "नंबर की रिपोर्ट नहीं की जा सकी" + "नंबर की रिपोर्ट की गई" diff --git a/java/com/android/dialer/calldetails/res/values-hr/strings.xml b/java/com/android/dialer/calldetails/res/values-hr/strings.xml index 687a65e2b..65371813c 100644 --- a/java/com/android/dialer/calldetails/res/values-hr/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-hr/strings.xml @@ -21,9 +21,11 @@ "Brisanje" "Kopiranje broja" "Uređivanje broja prije poziva" - "Poziv" + "Prijava netočnog broja" "Šalje fotografiju" "Prima fotografiju" "\"%1$s\"" - "Pojedinosti o kontaktu %1$s" + "Prijava netočnog broja" + "Prijava broja nije moguća" + "Broj je prijavljen" diff --git a/java/com/android/dialer/calldetails/res/values-hu/strings.xml b/java/com/android/dialer/calldetails/res/values-hu/strings.xml index 66863e87d..43afbe303 100644 --- a/java/com/android/dialer/calldetails/res/values-hu/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-hu/strings.xml @@ -21,9 +21,11 @@ "Törlés" "Szám másolása" "Szám szerkesztése hívás előtt" - "Telefonhívás" + "Pontatlan szám bejelentése" "Küldött egy fotót" "Kapott egy fotót" "„%1$s”" - "%1$s részletes adatai." + "Helytelen szám bejelentése" + "Nem sikerült bejelenteni a számot" + "Szám bejelentve" diff --git a/java/com/android/dialer/calldetails/res/values-hy/strings.xml b/java/com/android/dialer/calldetails/res/values-hy/strings.xml index a1e84e955..05022ca58 100644 --- a/java/com/android/dialer/calldetails/res/values-hy/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-hy/strings.xml @@ -21,9 +21,11 @@ "Ջնջել" "Պատճենել համարը" "Փոփոխել համարը զանգելուց առաջ" - "Զանգ" + "Հաղորդել սխալ համարի մասին" "Ուղարկվել է լուսանկար" "Ստացվել է լուսանկար" %1$s»" - "%1$s-ի կոնտակտային տվյալները" + "Հաղորդում սխալ համարի մասին" + "Չհաջողվեց ուղարկել հաղորդումը" + "Հաղորդումն ուղարկվեց" diff --git a/java/com/android/dialer/calldetails/res/values-in/strings.xml b/java/com/android/dialer/calldetails/res/values-in/strings.xml index ba58ba01c..eaeb273db 100644 --- a/java/com/android/dialer/calldetails/res/values-in/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-in/strings.xml @@ -21,9 +21,11 @@ "Hapus" "Salin nomor" "Edit nomor sebelum menelepon" - "Telepon" + "Laporkan nomor yang tidak akurat" "Mengirim foto" "Menerima foto" "\"%1$s\"" - "Detail kontak %1$s" + "Laporkan nomor yang salah" + "Tidak dapat melaporkan nomor" + "Nomor dilaporkan" diff --git a/java/com/android/dialer/calldetails/res/values-is/strings.xml b/java/com/android/dialer/calldetails/res/values-is/strings.xml index 0770814df..ac522d5b8 100644 --- a/java/com/android/dialer/calldetails/res/values-is/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-is/strings.xml @@ -21,9 +21,11 @@ "Eyða" "Afrita númer" "Breyta númeri áður en hringt er" - "Hringja" + "Tilkynna rangt númer" "Sendi mynd" "Tók á móti mynd" "„%1$s“" - "Tengiliðaupplýsingar um %1$s" + "Tilkynna rangt númer" + "Ekki tókst að tilkynna númerið" + "Númer tilkynnt" diff --git a/java/com/android/dialer/calldetails/res/values-it/strings.xml b/java/com/android/dialer/calldetails/res/values-it/strings.xml index 97af25168..40c2245e9 100644 --- a/java/com/android/dialer/calldetails/res/values-it/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-it/strings.xml @@ -21,9 +21,11 @@ "Elimina" "Copia numero" "Modifica numero prima di chiamare" - "Chiama" + "Segnala numero sbagliato" "Foto inviata" "Foto ricevuta" "\"%1$s\"" - "Dettagli contatto %1$s" + "Segnala numero errato" + "Impossibile segnalare il numero" + "Numero segnalato" diff --git a/java/com/android/dialer/calldetails/res/values-iw/strings.xml b/java/com/android/dialer/calldetails/res/values-iw/strings.xml index 329eded62..ffc4d4765 100644 --- a/java/com/android/dialer/calldetails/res/values-iw/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-iw/strings.xml @@ -21,9 +21,11 @@ "מחק" "העתק את המספר" "ערוך את המספר לפני השיחה" - "התקשר" + "דיווח על מספר לא מדויק" "נשלחה תמונה" "התקבלה תמונה" "\"%1$s\"" - "פרטי ההתקשרות של %1$s" + "דיווח על מספר שגוי" + "לא ניתן היה לדווח על המספר" + "המספר דווח" diff --git a/java/com/android/dialer/calldetails/res/values-ja/strings.xml b/java/com/android/dialer/calldetails/res/values-ja/strings.xml index 7aef345fd..24fcf2c38 100644 --- a/java/com/android/dialer/calldetails/res/values-ja/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ja/strings.xml @@ -21,9 +21,11 @@ "削除" "電話番号をコピー" "発信前に電話番号を編集" - "発信" + "情報が間違っている番号を報告" "写真を送信しました" "写真を受信しました" "「%1$s」" - "%1$sの連絡先の詳細" + "間違った番号の報告" + "番号を報告できませんでした" + "番号を報告しました" diff --git a/java/com/android/dialer/calldetails/res/values-ka/strings.xml b/java/com/android/dialer/calldetails/res/values-ka/strings.xml index 1cd7bc219..3d92f61bf 100644 --- a/java/com/android/dialer/calldetails/res/values-ka/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ka/strings.xml @@ -21,9 +21,11 @@ "წაშლა" "ნომრის კოპირება" "ნომრის რედაქტირება დარეკვამდე" - "დარეკვა" + "არაზუსტი ნომრის შეტყობინება" "ფოტო გაიგზავნა" "მიღებულია ფოტო" "„%1$s“" - "%1$s-ის საკონტაქტო დეტალები" + "არასწორი ნომრის შეტყობინება" + "ნომრის შეტყობინება ვერ მოხერხდა" + "ნომერი შეტყობინებულია" diff --git a/java/com/android/dialer/calldetails/res/values-kk/strings.xml b/java/com/android/dialer/calldetails/res/values-kk/strings.xml index 1923cf79b..c29daeb8b 100644 --- a/java/com/android/dialer/calldetails/res/values-kk/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-kk/strings.xml @@ -21,9 +21,11 @@ "Жою" "Нөмірді көшіру" "Нөмірді қоңырау шалуға дейін өзгерту" - "Қоңырау шалу" + "Қате нөмір туралы хабарлау" "Сурет жіберілді" "Сурет қабылданды" "\"%1$s\"" - "%1$s контакт деректері" + "Қате нөмір туралы хабарлау" + "Нөмір туралы хабар жіберілмеді" + "Нөмір туралы хабар жіберілді" diff --git a/java/com/android/dialer/calldetails/res/values-km/strings.xml b/java/com/android/dialer/calldetails/res/values-km/strings.xml index e0472796f..d5ea830cd 100644 --- a/java/com/android/dialer/calldetails/res/values-km/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-km/strings.xml @@ -21,9 +21,11 @@ "លុប" "ថតចម្លងលេខទូរសព្ទ" "កែ​លេខ​ មុន​ពេល​ហៅទូរសព្ទ" - "ហៅទូរសព្ទ" + "រាយការណ៍លេខមិនត្រឹមត្រូវ" "បានផ្ញើរូបថត" "បាន​ទទួល​រូបថត" "\"%1$s\"" - "ព័ត៌មាន​ទំនាក់​ទំនង​លម្អិត​សម្រាប់ %1$s" + "រាយការណ៍​លេខ​មិន​ត្រឹមត្រូវ" + "មិន​អាច​រាយការណ៍​លេខ​បាន​ទេ" + "បាន​រាយការណ៍​លេខ" diff --git a/java/com/android/dialer/calldetails/res/values-kn/strings.xml b/java/com/android/dialer/calldetails/res/values-kn/strings.xml index 66c0d6349..aeff715a9 100644 --- a/java/com/android/dialer/calldetails/res/values-kn/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-kn/strings.xml @@ -21,9 +21,11 @@ "ಅಳಿಸಿ" "ಸಂಖ್ಯೆಯನ್ನು ನಕಲಿಸಿ" "ಕರೆ ಮಾಡುವ ಮೊದಲು ಸಂಖ್ಯೆಯನ್ನು ಎಡಿಟ್ ಮಾಡಿ" - "ಕರೆಮಾಡಿ" + "ನಿಖರವಾಗಿಲ್ಲದ ಸಂಖ್ಯೆಯನ್ನು ವರದಿಮಾಡಿ" "ಫೋಟೋ ಕಳುಹಿಸಲಾಗಿದೆ" "ಫೋಟೋ ಸ್ವೀಕರಿಸಲಾಗಿದೆ" "\"%1$s\"" - "%1$s ಗೆ ಸಂಪರ್ಕ ವಿವರಗಳು" + "ತಪ್ಪಾದ ಸಂಖ್ಯೆಯನ್ನು ವರದಿಮಾಡಿ" + "ಸಂಖ್ಯೆಯನ್ನು ವರದಿ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ" + "ವರದಿ ಮಾಡಲಾದ ಸಂಖ್ಯೆ" diff --git a/java/com/android/dialer/calldetails/res/values-ko/strings.xml b/java/com/android/dialer/calldetails/res/values-ko/strings.xml index 35c503858..f45d71273 100644 --- a/java/com/android/dialer/calldetails/res/values-ko/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ko/strings.xml @@ -21,9 +21,11 @@ "삭제" "전화번호 복사" "통화하기 전에 번호 수정" - "전화걸기" + "잘못된 번호 신고하기" "사진 전송됨" "사진 수신됨" "\'%1$s\'" - "%1$s의 연락처 세부정보" + "잘못된 번호 신고" + "번호를 신고할 수 없습니다." + "번호가 신고되었습니다." diff --git a/java/com/android/dialer/calldetails/res/values-ky/strings.xml b/java/com/android/dialer/calldetails/res/values-ky/strings.xml index fe37b33bd..9735abc27 100644 --- a/java/com/android/dialer/calldetails/res/values-ky/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ky/strings.xml @@ -21,9 +21,11 @@ "Жок кылуу" "Номерди көчүрүү" "Чалуудан мурун номерди түзөтүү" - "Чалуу" + "Номердеги ката жөнүндө кабар берүү" "Сүрөт жөнөтүлдү" "Сүрөт алынды" "\"%1$s\"" - "%1$s байланыш маалыматтары" + "Туура эмес номер жөнүндө кабарлоо" + "Туура эмес номер жөнүндө кабар жөнөтүлбөй койду" + "Туура эмес номер жөнүндө кабар берүү" diff --git a/java/com/android/dialer/calldetails/res/values-lo/strings.xml b/java/com/android/dialer/calldetails/res/values-lo/strings.xml index 85b636acd..880510ec7 100644 --- a/java/com/android/dialer/calldetails/res/values-lo/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-lo/strings.xml @@ -21,9 +21,11 @@ "​ລຶບ" "ສຳເນົາເບີໂທ" "ແກ້ໄຂເບີກ່ອນໂທ" - "ໂທ" + "ລາຍງານເບີໂທທີ່ບໍ່ຖືກຕ້ອງ" "ສົ່ງຮູບພາບ" "ໄດ້ຮັບຮູບພາບແລ້ວ" "\"%1$s\"" - "ລາຍລະອຽດ​ການຕິດຕໍ່​ສຳລັບ %1$s" + "​ລາຍ​ງານ​ເບີ​ໂທບໍ່​ຖືກ​ຕ້ອງ" + "ບໍ່ສາມາດລາຍງານເບີໂທໄດ້" + "ລາຍງານເບີໂທແລ້ວ" diff --git a/java/com/android/dialer/calldetails/res/values-lt/strings.xml b/java/com/android/dialer/calldetails/res/values-lt/strings.xml index 9c8ad7b7f..2f195de04 100644 --- a/java/com/android/dialer/calldetails/res/values-lt/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-lt/strings.xml @@ -21,9 +21,11 @@ "Ištrinti" "Kopijuoti numerį" "Redaguoti numerį prieš skambinant" - "Skambinti" + "Pranešti apie netikslų numerį" "Išsiuntė nuotrauką" "Gavo nuotrauką" "„%1$s“" - "Išsami kontaktinė informacija: %1$s" + "Pranešimas apie netinkamą numerį" + "Nepavyko pranešti apie numerį" + "Apie numerį pranešta" diff --git a/java/com/android/dialer/calldetails/res/values-lv/strings.xml b/java/com/android/dialer/calldetails/res/values-lv/strings.xml index d8783935b..e119b12a8 100644 --- a/java/com/android/dialer/calldetails/res/values-lv/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-lv/strings.xml @@ -21,9 +21,11 @@ "Dzēst" "Kopēt numuru" "Rediģēt numuru pirms zvanīšanas" - "Zvanīt" + "Ziņot par neprecīzu numuru" "Nosūtīja fotoattēlu" "Saņēma fotoattēlu" "“%1$s”" - "Kontaktpersonas informācija: %1$s" + "Ziņošana par nepareizu numuru" + "Nevarēja nosūtīt ziņojumu par numuru" + "Ziņojums par numuru nosūtīts" diff --git a/java/com/android/dialer/calldetails/res/values-mk/strings.xml b/java/com/android/dialer/calldetails/res/values-mk/strings.xml index 9388ae070..2458e082f 100644 --- a/java/com/android/dialer/calldetails/res/values-mk/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-mk/strings.xml @@ -21,9 +21,11 @@ "Избриши" "Копирај го бројот" "Измени го бројот пред повикот" - "Повикај" + "Пријавете погрешен број" "Испрати фотографија" "Прими фотографија" "„%1$s“" - "Детали за контакт за %1$s" + "Пријавете неточен број" + "Не можеше да пријави бројот" + "Бројот е пријавен" diff --git a/java/com/android/dialer/calldetails/res/values-ml/strings.xml b/java/com/android/dialer/calldetails/res/values-ml/strings.xml index d29691159..8164a21d0 100644 --- a/java/com/android/dialer/calldetails/res/values-ml/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ml/strings.xml @@ -21,9 +21,11 @@ "ഇല്ലാതാക്കുക" "നമ്പർ പകർത്തുക" "കോൾ ചെയ്യുന്നതിന് മുമ്പായി നമ്പർ എഡിറ്റുചെയ്യുക" - "കോള്‍ ചെയ്യുക" + "കൃത്യമല്ലാത്ത നമ്പർ റിപ്പോർട്ടുചെയ്യുക" "ഒരു ഫോട്ടോ അയച്ചു" "ഒരു ഫോട്ടോ ലഭിച്ചു" "\"%1$s\"" - "%1$s എന്നതിന്റെ കോൺ‌ടാക്റ്റ് വിശദാംശങ്ങൾ" + "തെറ്റായ നമ്പർ റിപ്പോർട്ടുചെയ്യുക" + "നമ്പർ റിപ്പോർട്ടുചെയ്യാനായില്ല" + "നമ്പർ റിപ്പോർട്ടുചെയ്‌തു" diff --git a/java/com/android/dialer/calldetails/res/values-mn/strings.xml b/java/com/android/dialer/calldetails/res/values-mn/strings.xml index cb264e016..242f6abab 100644 --- a/java/com/android/dialer/calldetails/res/values-mn/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-mn/strings.xml @@ -21,9 +21,11 @@ "Устгах" "Дугаар хуулах" "Залгахын өмнө дугаар засах" - "Залгах" + "Тодорхой бус дугаарыг мэдээлэх" "Зураг илгээсэн" "Зураг хүлээн авсан" "\"%1$s\"" - "%1$s-н харилцагчийн мэдээлэл" + "Буруу дугаарыг мэдээлэх" + "Дугаарыг мэдээлж чадсангүй" + "Дугаарыг мэдээлсэн" diff --git a/java/com/android/dialer/calldetails/res/values-mr/strings.xml b/java/com/android/dialer/calldetails/res/values-mr/strings.xml index 5c31e361e..d869e1385 100644 --- a/java/com/android/dialer/calldetails/res/values-mr/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-mr/strings.xml @@ -21,9 +21,11 @@ "हटवा" "नंबर कॉपी करा" "कॉल करण्यापूर्वी नंबर संपादित करा" - "कॉल करा" + "चुकीच्या नंबरचा अहवाल द्या" "एक फोटो पाठविला" "एक फोटो प्राप्त झाला" "\"%1$s\"" - "%1$s साठी संपर्क तपशील" + "चुकीच्या नंबरचा अहवाल द्या" + "नंबरचा अहवाल देऊ शकलो नाही" + "नंबरचा अहवाल दिला" diff --git a/java/com/android/dialer/calldetails/res/values-ms/strings.xml b/java/com/android/dialer/calldetails/res/values-ms/strings.xml index da17d6edb..7c0bfdd74 100644 --- a/java/com/android/dialer/calldetails/res/values-ms/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ms/strings.xml @@ -21,9 +21,11 @@ "Padam" "Salin nombor" "Edit nombor sebelum panggilan" - "Panggil" + "Laporkan nombor yang tidak tepat" "Menghantar foto" "Foto diterima" "\"%1$s\"" - "Butiran hubungan untuk %1$s" + "Laporkan nombor yang tidak betul" + "Tidak dapat melaporkan nombor" + "Nombor dilaporkan" diff --git a/java/com/android/dialer/calldetails/res/values-my/strings.xml b/java/com/android/dialer/calldetails/res/values-my/strings.xml index 75508d8d4..34a57d54c 100644 --- a/java/com/android/dialer/calldetails/res/values-my/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-my/strings.xml @@ -21,9 +21,11 @@ "ဖျက်ရန်" "နံပါတ်ကိုကူးယူရန်" "မခေါ်ဆိုမီ နံပါတ်ကိုပြင်ဆင်ရန်" - "ခေါ်ဆိုရန်" + "မတိကျသော နံပါတ်ကို တိုင်ကြားရန်" "ဓာတ်ပုံ ပို့လိုက်သည်" "ဓာတ်ပုံ လက်ခံရရှိသည်" "\"%1$s\"" - "%1$s ၏ အဆက်အသွယ် အသေးစိတ်" + "မမှန်ကန်သည့် နံပါတ်ကို တိုင်ကြားရန်" + "နံပါတ်ကို မတိုင်ကြားနိုင်ပါ" + "နံပါတ်ကို တိုင်ကြားပြီးပါပြီ" diff --git a/java/com/android/dialer/calldetails/res/values-nb/strings.xml b/java/com/android/dialer/calldetails/res/values-nb/strings.xml index 022025fa3..53ffd3a87 100644 --- a/java/com/android/dialer/calldetails/res/values-nb/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-nb/strings.xml @@ -21,9 +21,11 @@ "Slett" "Kopiér nummeret" "Rediger nummeret før du ringer" - "Ring" + "Rapportér feil nummer" "Et bilde ble sendt" "Et bilde ble mottatt" %1$s»" - "Kontaktinformasjon for %1$s" + "Rapportér feil nummer" + "Kunne ikke rapportere nummeret" + "Nummeret er rapportert" diff --git a/java/com/android/dialer/calldetails/res/values-ne/strings.xml b/java/com/android/dialer/calldetails/res/values-ne/strings.xml index 8fe355ba6..f8e10ca5d 100644 --- a/java/com/android/dialer/calldetails/res/values-ne/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ne/strings.xml @@ -21,9 +21,11 @@ "मेट्नुहोस्" "नम्बर प्रतिलिपि गर्नुहोस्" "कल गर्नु अघि नम्बर सम्पादन गर्नुहोस्" - "कल" + "गलत नम्बरको रिपोर्ट गर्नुहोस्" "एउटा तस्बिर पठाइयो" "एउटा तस्बिर प्राप्त भयो" "\"%1$s\"" - "%1$s का सम्पर्क विवरणहरू" + "गलत नम्बरको रिपोर्ट गर्नुहोस्" + "नम्बरको रिपोर्ट गर्न सकिएन" + "नम्बरको रिपोर्ट गरियो" diff --git a/java/com/android/dialer/calldetails/res/values-nl/strings.xml b/java/com/android/dialer/calldetails/res/values-nl/strings.xml index 71657b813..b8cb7feec 100644 --- a/java/com/android/dialer/calldetails/res/values-nl/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-nl/strings.xml @@ -21,9 +21,11 @@ "Verwijderen" "Nummer kopiëren" "Nummer bewerken vóór bellen" - "Bellen" + "Onjuist nummer melden" "Foto verzonden" "Foto ontvangen" "\'%1$s\'" - "Contactgegevens voor %1$s" + "Incorrect nummer melden" + "Kan nummer niet melden" + "Nummer gemeld" diff --git a/java/com/android/dialer/calldetails/res/values-no/strings.xml b/java/com/android/dialer/calldetails/res/values-no/strings.xml index 022025fa3..53ffd3a87 100644 --- a/java/com/android/dialer/calldetails/res/values-no/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-no/strings.xml @@ -21,9 +21,11 @@ "Slett" "Kopiér nummeret" "Rediger nummeret før du ringer" - "Ring" + "Rapportér feil nummer" "Et bilde ble sendt" "Et bilde ble mottatt" %1$s»" - "Kontaktinformasjon for %1$s" + "Rapportér feil nummer" + "Kunne ikke rapportere nummeret" + "Nummeret er rapportert" diff --git a/java/com/android/dialer/calldetails/res/values-pa/strings.xml b/java/com/android/dialer/calldetails/res/values-pa/strings.xml index d4f175943..b488d534e 100644 --- a/java/com/android/dialer/calldetails/res/values-pa/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-pa/strings.xml @@ -21,9 +21,11 @@ "ਮਿਟਾਓ" "ਨੰਬਰ ਕਾਪੀ ਕਰੋ" "ਕਾਲ ਤੋਂ ਪਹਿਲਾਂ ਨੰਬਰ ਸੰਪਾਦਿਤ ਕਰੋ" - "ਕਾਲ ਕਰੋ" + "ਗਲਤ ਨੰਬਰ ਦੀ ਰਿਪੋਰਟ ਕਰੋ" "ਇੱਕ ਫ਼ੋਟੋ ਭੇਜੀ ਗਈ" "ਇੱਕ ਫ਼ੋਟੋ ਪ੍ਰਾਪਤ ਹੋਈ" "\"%1$s\"" - "%1$s ਲਈ ਸੰਪਰਕ ਵੇਰਵੇ" + "ਗਲਤ ਨੰਬਰ ਦੀ ਰਿਪੋਰਟ ਕਰੋ" + "ਨੰਬਰ ਦੀ ਰਿਪੋਰਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ" + "ਨੰਬਰ ਦੀ ਰਿਪੋਰਟ ਕੀਤੀ ਗਈ" diff --git a/java/com/android/dialer/calldetails/res/values-pl/strings.xml b/java/com/android/dialer/calldetails/res/values-pl/strings.xml index 96446005d..790dade50 100644 --- a/java/com/android/dialer/calldetails/res/values-pl/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-pl/strings.xml @@ -21,9 +21,11 @@ "Usuń" "Kopiuj numer" "Edytuj numer, zanim zadzwonisz" - "Zadzwoń" + "Zgłoś niedokładny numer" "Wysłano zdjęcie" "Odebrano zdjęcie" "„%1$s”" - "Informacje kontaktowe: %1$s" + "Zgłoś nieprawidłowy numer" + "Nie udało się zgłosić numeru" + "Numer został zgłoszony" diff --git a/java/com/android/dialer/calldetails/res/values-pt-rBR/strings.xml b/java/com/android/dialer/calldetails/res/values-pt-rBR/strings.xml index 467973d55..7cd32827d 100644 --- a/java/com/android/dialer/calldetails/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-pt-rBR/strings.xml @@ -21,9 +21,11 @@ "Excluir" "Copiar número" "Editar número antes de ligar" - "Ligar" + "Informar número inválido" "Enviou uma foto" "Recebeu uma foto" "\"%1$s\"" - "Detalhes de contato para %1$s" + "Informar número incorreto" + "Não foi possível informar o número" + "Número informado" diff --git a/java/com/android/dialer/calldetails/res/values-pt-rPT/strings.xml b/java/com/android/dialer/calldetails/res/values-pt-rPT/strings.xml index cfbbc0240..5749ebb40 100644 --- a/java/com/android/dialer/calldetails/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-pt-rPT/strings.xml @@ -21,9 +21,11 @@ "Eliminar" "Copiar número" "Editar o número antes de efetuar a chamada" - "Telefonar" + "Denunciar número incorreto" "Enviou uma foto" "Recebeu uma foto" "\"%1$s\"" - "Detalhes de contacto de %1$s" + "Denunciar número incorreto" + "Não foi possível denunciar o número." + "Número denunciado" diff --git a/java/com/android/dialer/calldetails/res/values-pt/strings.xml b/java/com/android/dialer/calldetails/res/values-pt/strings.xml index 467973d55..7cd32827d 100644 --- a/java/com/android/dialer/calldetails/res/values-pt/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-pt/strings.xml @@ -21,9 +21,11 @@ "Excluir" "Copiar número" "Editar número antes de ligar" - "Ligar" + "Informar número inválido" "Enviou uma foto" "Recebeu uma foto" "\"%1$s\"" - "Detalhes de contato para %1$s" + "Informar número incorreto" + "Não foi possível informar o número" + "Número informado" diff --git a/java/com/android/dialer/calldetails/res/values-ro/strings.xml b/java/com/android/dialer/calldetails/res/values-ro/strings.xml index e9281ae66..00ab0a3bd 100644 --- a/java/com/android/dialer/calldetails/res/values-ro/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ro/strings.xml @@ -21,9 +21,11 @@ "Ștergeți" "Copiați numărul" "Modificați numărul înainte de apelare" - "Apelați" + "Raportați numărul ca incorect" "A fost trimisă o fotografie." "A fost primită o fotografie." "„%1$s”" - "Detalii de contact pentru %1$s" + "Raportați un număr incorect" + "Numărul nu a putut fi raportat." + "Numărul a fost raportat." diff --git a/java/com/android/dialer/calldetails/res/values-ru/strings.xml b/java/com/android/dialer/calldetails/res/values-ru/strings.xml index bf981e293..b31b83285 100644 --- a/java/com/android/dialer/calldetails/res/values-ru/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ru/strings.xml @@ -21,9 +21,11 @@ "Удалить" "Скопировать номер" "Изменить номер перед вызовом" - "Позвонить" + "Сообщить об ошибке в номере" "Отправлена фотография" "Получена фотография" "\"%1$s\"" - "Сведения о контакте %1$s" + "Неверный номер" + "Не удалось отправить отчет о неверном номере" + "Отчет о неверном номере отправлен" diff --git a/java/com/android/dialer/calldetails/res/values-si/strings.xml b/java/com/android/dialer/calldetails/res/values-si/strings.xml index 5fdca0d52..62968ab97 100644 --- a/java/com/android/dialer/calldetails/res/values-si/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-si/strings.xml @@ -21,9 +21,11 @@ "මකන්න" "අංකය පිටපත් කරන්න" "ඇමතුමට පෙර අංකය සංස්කරණය කරන්න" - "අමතන්න" + "වැරදි අංකය වාර්තා කරන්න" "ඡායාරූපයක් යැවිණි" "ඡායාරූපයක් ලැබිණි" "\"%1$s\"" - "%1$s සඳහා සම්බන්ධතා විස්තර" + "වැරදි අංකය වාර්තා කරන්න" + "අංකය වාර්තා කිරීමට නොහැකි විය" + "අංකය වාර්තා කරන ලදී" diff --git a/java/com/android/dialer/calldetails/res/values-sk/strings.xml b/java/com/android/dialer/calldetails/res/values-sk/strings.xml index db0478713..ee62cbd86 100644 --- a/java/com/android/dialer/calldetails/res/values-sk/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-sk/strings.xml @@ -21,9 +21,11 @@ "Odstrániť" "Kopírovať číslo" "Pred volaním upraviť číslo" - "Volať" + "Nahlásiť nesprávne číslo" "Bola odoslaná fotka" "Bola prijatá fotka" "„%1$s“" - "%1$s – podrobnosti kontaktu" + "Nahlásenie nesprávneho čísla" + "Číslo sa nepodarilo nahlásiť" + "Číslo bolo nahlásené" diff --git a/java/com/android/dialer/calldetails/res/values-sl/strings.xml b/java/com/android/dialer/calldetails/res/values-sl/strings.xml index 98975f406..70b0e59b1 100644 --- a/java/com/android/dialer/calldetails/res/values-sl/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-sl/strings.xml @@ -21,9 +21,11 @@ "Izbriši" "Kopiraj številko" "Pred klicanjem uredi številko" - "Pokliči" + "Prijavi netočno številko" "Poslana fotografija" "Prejeta fotografija" %1$s«" - "Podrobnosti stika za %1$s" + "Prijava napačne številke" + "Številke ni bilo mogoče prijaviti" + "Številka je prijavljena" diff --git a/java/com/android/dialer/calldetails/res/values-sq/strings.xml b/java/com/android/dialer/calldetails/res/values-sq/strings.xml index dd9915da5..a3de4f16a 100644 --- a/java/com/android/dialer/calldetails/res/values-sq/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-sq/strings.xml @@ -21,9 +21,11 @@ "Fshi" "Kopjo numrin" "Redakto numrin para telefonatës" - "Telefono" + "Raporto numrin e pasaktë" "U dërgua një fotografi" "U mor një fotografi" "\"%1$s\"" - "Detajet e kontaktit për %1$s" + "Raporto numrin e pasaktë" + "Numri nuk mund të raportohej" + "Numri u raportua" diff --git a/java/com/android/dialer/calldetails/res/values-sr/strings.xml b/java/com/android/dialer/calldetails/res/values-sr/strings.xml index 7f4005d78..54c155039 100644 --- a/java/com/android/dialer/calldetails/res/values-sr/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-sr/strings.xml @@ -21,9 +21,11 @@ "Избриши" "Копирај број" "Измените број пре позива" - "Позови" + "Пријави нетачан број" "Слика је послата" "Слика је примљена" "„%1$s“" - "Контакт информације за %1$s" + "Пријавите нетачан број" + "Пријављивање броја није успело" + "Број је пријављен" diff --git a/java/com/android/dialer/calldetails/res/values-sv/strings.xml b/java/com/android/dialer/calldetails/res/values-sv/strings.xml index 3967b4ff3..a7e1c1212 100644 --- a/java/com/android/dialer/calldetails/res/values-sv/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-sv/strings.xml @@ -21,9 +21,11 @@ "Radera" "Kopiera nummer" "Redigera nummer före samtal" - "Ring" + "Rapportera felaktigt nummer" "Skickade ett foto" "Tog emot ett foto" "%1$s" - "Kontaktuppgifter för %1$s" + "Rapportera felaktigt nummer" + "Det gick inte att rapportera nummer" + "Nummer rapporterat" diff --git a/java/com/android/dialer/calldetails/res/values-sw/strings.xml b/java/com/android/dialer/calldetails/res/values-sw/strings.xml index e5df8230a..f19fb7b5a 100644 --- a/java/com/android/dialer/calldetails/res/values-sw/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-sw/strings.xml @@ -21,9 +21,11 @@ "Futa" "Nakili nambari" "Hariri nambari kabla ya kupiga" - "Piga simu" + "Ripoti nambari isiyo sahihi" "Picha imetumwa" "Picha imepokelewa" "\"%1$s\"" - "Maelezo ya %1$s" + "Ripoti nambari isiyosahihi" + "Imeshindwa kuripoti nambari" + "Nambari imeripotiwa" diff --git a/java/com/android/dialer/calldetails/res/values-ta/strings.xml b/java/com/android/dialer/calldetails/res/values-ta/strings.xml index 840ad8790..7f625f815 100644 --- a/java/com/android/dialer/calldetails/res/values-ta/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ta/strings.xml @@ -21,9 +21,11 @@ "நீக்கு" "எண்ணை நகலெடு" "அழைப்பதற்கு முன் எண்ணைத் திருத்து" - "அழை" + "துல்லியமற்ற எண் எனப் புகாரளி" "படம் அனுப்பப்பட்டது" "படம் பெறப்பட்டது" "\"%1$s\"" - "%1$sக்கான தொடர்பு விவரங்கள்" + "தவறான எண் எனப் புகாரளி" + "எண்ணைப் புகாரளிக்க முடியவில்லை" + "எண் புகாரளிக்கப்பட்டது" diff --git a/java/com/android/dialer/calldetails/res/values-te/strings.xml b/java/com/android/dialer/calldetails/res/values-te/strings.xml index 3054444ac..d6fc79284 100644 --- a/java/com/android/dialer/calldetails/res/values-te/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-te/strings.xml @@ -21,9 +21,11 @@ "తొలగించు" "నంబర్‌ను కాపీ చేయి" "కాల్ చేసే ముందు నంబర్‌ను సవరించు" - "కాల్ చేయి" + "అనిర్దిష్టంగా ఉండే నంబర్‌ను నివేదించు" "ఫోటో పంపబడింది" "ఫోటో స్వీకరించబడింది" "\"%1$s\"" - "%1$s యొక్క సంప్రదింపు వివరాలు" + "చెల్లని నంబర్‌ను నివేదించండి" + "నంబర్‌ను నివేదించడం సాధ్యపడలేదు" + "నంబర్ నివేదించబడింది" diff --git a/java/com/android/dialer/calldetails/res/values-th/strings.xml b/java/com/android/dialer/calldetails/res/values-th/strings.xml index c565ebadf..7bbcd126b 100644 --- a/java/com/android/dialer/calldetails/res/values-th/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-th/strings.xml @@ -21,9 +21,11 @@ "ลบ" "คัดลอกหมายเลข" "แก้ไขหมายเลขก่อนโทร" - "โทร" + "รายงานหมายเลขที่ผิดพลาด" "ส่งรูปภาพแล้ว" "ได้รับรูปภาพแล้ว" "\"%1$s\"" - "รายละเอียดที่ติดต่อสำหรับ %1$s" + "รายงานหมายเลขที่ไม่ถูกต้อง" + "ไม่สามารถรายงานหมายเลข" + "รายงานหมายเลขแล้ว" diff --git a/java/com/android/dialer/calldetails/res/values-tl/strings.xml b/java/com/android/dialer/calldetails/res/values-tl/strings.xml index 81c148e6b..969a33a31 100644 --- a/java/com/android/dialer/calldetails/res/values-tl/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-tl/strings.xml @@ -21,9 +21,11 @@ "I-delete" "Kopyahin ang numero" "I-edit ang numero bago tumawag" - "Tumawag" + "Iulat ang hindi wastong numero" "Nagpadala ng larawan" "Nakatanggap ng larawan" "\"%1$s\"" - "Mga detalye sa pakikipag-ugnayan para kay/sa %1$s" + "Iulat ang hindi tamang numero" + "Hindi maiulat ang numero" + "Inulat ang numero" diff --git a/java/com/android/dialer/calldetails/res/values-tr/strings.xml b/java/com/android/dialer/calldetails/res/values-tr/strings.xml index ade401843..99763121f 100644 --- a/java/com/android/dialer/calldetails/res/values-tr/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-tr/strings.xml @@ -21,9 +21,11 @@ "Sil" "Numarayı kopyala" "Telefon etmeden önce numarayı düzenleyin" - "Telefon eder" + "Hatalı numarayı bildir" "Bir fotoğraf gönderildi" "Bir fotoğraf alındı" "\"%1$s\"" - "%1$s için kişi ayrıntıları" + "Yanlış numarayı bildir" + "Numara bildirilemedi" + "Numara bildirildi" diff --git a/java/com/android/dialer/calldetails/res/values-uk/strings.xml b/java/com/android/dialer/calldetails/res/values-uk/strings.xml index 6538d664d..d37a54e6f 100644 --- a/java/com/android/dialer/calldetails/res/values-uk/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-uk/strings.xml @@ -21,9 +21,11 @@ "Видалити" "Копіювати номер" "Редагувати номер перед дзвінком" - "Виклик" + "Повідомити про неправильний номер" "Надіслано фотографію" "Отримано фотографію" "\"%1$s\"" - "Відомості про контакт %1$s" + "Повідомити про неправильний номер" + "Не вдалося повідомити про неправильний номер" + "Ви повідомили про неправильний номер" diff --git a/java/com/android/dialer/calldetails/res/values-ur/strings.xml b/java/com/android/dialer/calldetails/res/values-ur/strings.xml index 90c3a590a..960bef4cf 100644 --- a/java/com/android/dialer/calldetails/res/values-ur/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-ur/strings.xml @@ -21,9 +21,11 @@ "حذف کریں" "نمبر کاپی کریں" "کال کرنے سے پہلے نمبر میں ترمیم کریں" - "کال" + "غلط نمبر کی رپورٹ کریں" "ایک تصویر بھیجی" "ایک تصویر موصول ہوئی" "\"%1$s\"" - "%1$s کیلئے رابطہ کی تفصیلات" + "غلط نمبر کی اطلاع دیں" + "نمبر کی اطلاع نہیں دی جا سکی" + "نمبر کی اطلاع دے دی گئی" diff --git a/java/com/android/dialer/calldetails/res/values-uz/strings.xml b/java/com/android/dialer/calldetails/res/values-uz/strings.xml index 7b443ca2e..57f052648 100644 --- a/java/com/android/dialer/calldetails/res/values-uz/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-uz/strings.xml @@ -20,10 +20,12 @@ "Chaqiruv tafsilotlari" "O‘chirib tashlash" "Raqamni nusxalash" - "Qo‘ng‘iroq qilishdan oldin raqamni tahrirlash" - "Qo‘ng‘iroq qilish" + "Chaqiruvdan oldin raqamni tahrirlash" + "Raqamdagi xatolik haqida xabar berish" "Rasm yuborildi" "Rasm qabul qilindi" "“%1$s”" - "%1$s kontakt ma’lumotlari" + "Noto‘g‘ri raqam" + "Raqamdagi xatolik haqida xabar yuborib bo‘lmadi" + "Raqamdagi xatolik haqida xabar yuborildi" diff --git a/java/com/android/dialer/calldetails/res/values-vi/strings.xml b/java/com/android/dialer/calldetails/res/values-vi/strings.xml index 7a950216d..6adae2bc9 100644 --- a/java/com/android/dialer/calldetails/res/values-vi/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-vi/strings.xml @@ -21,9 +21,11 @@ "Xóa" "Sao chép số" "Chỉnh sửa số trước khi gọi" - "Gọi" + "Báo cáo số không chính xác" "Đã gửi một ảnh" "Đã nhận một ảnh" "\"%1$s\"" - "Chi tiết liên hệ cho %1$s" + "Báo cáo số không chính xác" + "Không thể báo cáo số" + "Đã báo cáo số" diff --git a/java/com/android/dialer/calldetails/res/values-zh-rCN/strings.xml b/java/com/android/dialer/calldetails/res/values-zh-rCN/strings.xml index aad695a73..1edb5e19e 100644 --- a/java/com/android/dialer/calldetails/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-zh-rCN/strings.xml @@ -21,9 +21,11 @@ "删除" "复制号码" "拨打电话之前修改号码" - "拨打电话" + "报告错误的号码" "发送了一张照片" "收到了一张照片" "“%1$s”" - "%1$s的详细联系信息" + "报告错误号码" + "无法报告错误的号码" + "已报告错误的号码" diff --git a/java/com/android/dialer/calldetails/res/values-zh-rHK/strings.xml b/java/com/android/dialer/calldetails/res/values-zh-rHK/strings.xml index eb5b606b7..a82e070eb 100644 --- a/java/com/android/dialer/calldetails/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-zh-rHK/strings.xml @@ -21,9 +21,11 @@ "刪除" "複製號碼" "在撥打前編輯號碼" - "通話" + "報告錯誤號碼" "已傳送相片" "已收到相片" "「%1$s」" - "「%1$s」的聯絡人詳細資料" + "報告不正確的號碼" + "無法報告號碼" + "已報告號碼" diff --git a/java/com/android/dialer/calldetails/res/values-zh-rTW/strings.xml b/java/com/android/dialer/calldetails/res/values-zh-rTW/strings.xml index fd426c0fa..3b9dd5665 100644 --- a/java/com/android/dialer/calldetails/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-zh-rTW/strings.xml @@ -21,9 +21,11 @@ "刪除" "複製號碼" "撥打電話前編輯號碼" - "撥號" + "回報號碼錯誤" "傳送了 1 張相片" "收到了 1 張相片" "「%1$s」" - "「%1$s」的聯絡詳細資料" + "回報不正確的號碼" + "無法回報號碼" + "已回報號碼" diff --git a/java/com/android/dialer/calldetails/res/values-zu/strings.xml b/java/com/android/dialer/calldetails/res/values-zu/strings.xml index d41d1f5cb..25e0cead4 100644 --- a/java/com/android/dialer/calldetails/res/values-zu/strings.xml +++ b/java/com/android/dialer/calldetails/res/values-zu/strings.xml @@ -21,9 +21,11 @@ "Susa" "Kopisha inombolo" "Hlela inombolo ngaphambi kokushaya ucingo" - "Shaya" + "Bika inombolo engalungile" "Uthumele isithombe" "Uthole isithombe" "\"%1$s\"" - "Imininingwane yokuxhumana ka-%1$s" + "Bika inombolo engalungile" + "Ayikwazanga ukubika inombolo" + "Inombolo ibikiwe" diff --git a/java/com/android/dialer/calldetails/res/values/dimens.xml b/java/com/android/dialer/calldetails/res/values/dimens.xml index f85d02f83..694c8f47c 100644 --- a/java/com/android/dialer/calldetails/res/values/dimens.xml +++ b/java/com/android/dialer/calldetails/res/values/dimens.xml @@ -15,8 +15,6 @@ ~ limitations under the License --> - 16sp - 14sp 6dp @@ -28,13 +26,11 @@ 48dp - 24dp 16dp 14dp 72dp - 12sp 48dp 40dp 8dp diff --git a/java/com/android/dialer/calldetails/res/values/strings.xml b/java/com/android/dialer/calldetails/res/values/strings.xml index 4471605f6..1441efdcd 100644 --- a/java/com/android/dialer/calldetails/res/values/strings.xml +++ b/java/com/android/dialer/calldetails/res/values/strings.xml @@ -27,9 +27,8 @@ Edit number before call - - Call + + Report inaccurate number Sent a photo @@ -40,10 +39,14 @@ \"%1$s\" - + Report incorrect number - Note: AccessibilityServices use this attribute to announce what the view represents. - This is especially valuable for views without textual representation like ImageView. - --> - Contact details for %1$s + + Couldn\'t report number + + + Number reported diff --git a/java/com/android/dialer/calldetails/res/values/styles.xml b/java/com/android/dialer/calldetails/res/values/styles.xml index 4fffe1afb..1a2b52994 100644 --- a/java/com/android/dialer/calldetails/res/values/styles.xml +++ b/java/com/android/dialer/calldetails/res/values/styles.xml @@ -15,24 +15,6 @@ ~ limitations under the License --> - - - - - - + + + + \ No newline at end of file diff --git a/java/com/android/dialer/calllogutils/CallEntryFormatter.java b/java/com/android/dialer/calllogutils/CallEntryFormatter.java deleted file mode 100644 index 6aa93af52..000000000 --- a/java/com/android/dialer/calllogutils/CallEntryFormatter.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.dialer.calllogutils; - -import android.content.Context; -import android.content.res.Resources; -import android.icu.lang.UCharacter; -import android.icu.text.BreakIterator; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; -import android.text.format.DateUtils; -import android.text.format.Formatter; -import com.android.dialer.util.DialerUtils; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.TimeUnit; - -/** Utility class for formatting data and data usage in call log entries. */ -public class CallEntryFormatter { - - /** - * Formats the provided date into a value suitable for display in the current locale. - * - *

For example, returns a string like "Wednesday, May 25, 2016, 8:02PM" or "Chorshanba, 2016 - * may 25,20:02". - * - *

For pre-N devices, the returned value may not start with a capital if the local convention - * is to not capitalize day names. On N+ devices, the returned value is always capitalized. - */ - public static CharSequence formatDate(Context context, long callDateMillis) { - CharSequence dateValue = - DateUtils.formatDateRange( - context, - callDateMillis /* startDate */, - callDateMillis /* endDate */, - DateUtils.FORMAT_SHOW_TIME - | DateUtils.FORMAT_SHOW_DATE - | DateUtils.FORMAT_SHOW_WEEKDAY - | DateUtils.FORMAT_SHOW_YEAR); - - // We want the beginning of the date string to be capitalized, even if the word at the beginning - // of the string is not usually capitalized. For example, "Wednesdsay" in Uzbek is "chorshanba” - // (not capitalized). To handle this issue we apply title casing to the start of the sentence so - // that "chorshanba, 2016 may 25,20:02" becomes "Chorshanba, 2016 may 25,20:02". - // - // The ICU library was not available in Android until N, so we can only do this in N+ devices. - // Pre-N devices will still see incorrect capitalization in some languages. - if (VERSION.SDK_INT < VERSION_CODES.N) { - return dateValue; - } - - // Using the ICU library is safer than just applying toUpperCase() on the first letter of the - // word because in some languages, there can be multiple starting characters which should be - // upper-cased together. For example in Dutch "ij" is a digraph in which both letters should be - // capitalized together. - - // TITLECASE_NO_LOWERCASE is necessary so that things that are already capitalized like the - // month ("May") are not lower-cased as part of the conversion. - return UCharacter.toTitleCase( - Locale.getDefault(), - dateValue.toString(), - BreakIterator.getSentenceInstance(), - UCharacter.TITLECASE_NO_LOWERCASE); - } - - private static CharSequence formatDuration(Context context, long elapsedSeconds) { - Resources res = context.getResources(); - String formatPattern; - if (elapsedSeconds >= 60) { - String minutesString = res.getString(R.string.call_details_minutes_abbreviation); - String secondsString = res.getString(R.string.call_details_seconds_abbreviation); - // example output: "1m 1s" - formatPattern = - context.getString( - R.string.call_duration_format_pattern, "m", minutesString, "s", secondsString); - } else { - String secondsString = res.getString(R.string.call_details_seconds_abbreviation); - // example output: "1s" - formatPattern = - context.getString(R.string.call_duration_short_format_pattern, "s", secondsString); - } - SimpleDateFormat format = new SimpleDateFormat(formatPattern); - return format.format(new Date(TimeUnit.SECONDS.toMillis(elapsedSeconds))); - } - - private static CharSequence formatDurationA11y(Context context, long elapsedSeconds) { - Resources res = context.getResources(); - if (elapsedSeconds >= 60) { - int minutes = (int) (elapsedSeconds / 60); - int seconds = (int) elapsedSeconds - minutes * 60; - String minutesString = res.getQuantityString(R.plurals.a11y_minutes, minutes); - String secondsString = res.getQuantityString(R.plurals.a11y_seconds, seconds); - // example output: "1 minute 1 second", "2 minutes 2 seconds", ect. - return context.getString( - R.string.a11y_call_duration_format, minutes, minutesString, seconds, secondsString); - } else { - String secondsString = res.getQuantityString(R.plurals.a11y_seconds, (int) elapsedSeconds); - // example output: "1 second", "2 seconds" - return context.getString( - R.string.a11y_call_duration_short_format, elapsedSeconds, secondsString); - } - } - - /** - * Formats a string containing the call duration and the data usage (if specified). - * - * @param elapsedSeconds Total elapsed seconds. - * @param dataUsage Data usage in bytes, or null if not specified. - * @return String containing call duration and data usage. - */ - public static CharSequence formatDurationAndDataUsage( - Context context, long elapsedSeconds, long dataUsage) { - return formatDurationAndDataUsageInternal( - context, formatDuration(context, elapsedSeconds), dataUsage); - } - - /** - * Formats a string containing the call duration and the data usage (if specified) for TalkBack. - * - * @param elapsedSeconds Total elapsed seconds. - * @param dataUsage Data usage in bytes, or null if not specified. - * @return String containing call duration and data usage. - */ - public static CharSequence formatDurationAndDataUsageA11y( - Context context, long elapsedSeconds, long dataUsage) { - return formatDurationAndDataUsageInternal( - context, formatDurationA11y(context, elapsedSeconds), dataUsage); - } - - private static CharSequence formatDurationAndDataUsageInternal( - Context context, CharSequence duration, long dataUsage) { - List durationItems = new ArrayList<>(); - if (dataUsage > 0) { - durationItems.add(duration); - durationItems.add(Formatter.formatShortFileSize(context, dataUsage)); - return DialerUtils.join(durationItems); - } else { - return duration; - } - } -} diff --git a/java/com/android/dialer/calllogutils/CallLogDates.java b/java/com/android/dialer/calllogutils/CallLogDates.java new file mode 100644 index 000000000..82e8e404e --- /dev/null +++ b/java/com/android/dialer/calllogutils/CallLogDates.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.calllogutils; + +import android.content.Context; +import android.icu.lang.UCharacter; +import android.icu.text.BreakIterator; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.text.format.DateUtils; +import java.util.Calendar; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +/** Static methods for formatting dates in the call log. */ +public final class CallLogDates { + + /** + * Uses the new date formatting rules to format dates in the new call log. + * + *

Rules: + * + *

+   *   if < 1 minute ago: "Now";
+   *   else if today: "12:15 PM"
+   *   else if < 3 days ago: "Wednesday";
+   *   else: "Jan 15"
+   * 
+ */ + public static CharSequence newCallLogTimestampLabel( + Context context, long nowMillis, long timestampMillis) { + if (nowMillis - timestampMillis < TimeUnit.MINUTES.toMillis(1)) { + return context.getString(R.string.now); + } + if (isSameDay(nowMillis, timestampMillis)) { + return DateUtils.formatDateTime( + context, timestampMillis, DateUtils.FORMAT_SHOW_TIME); // e.g. 12:15 PM + } + if (isWithin3Days(nowMillis, timestampMillis)) { + return formatDayOfWeek(context, timestampMillis); // e.g. "Wednesday" + } + return formatAbbreviatedMonthAndDay(context, timestampMillis); // e.g. "Jan 15" + } + + /** + * Formats the provided date into a value suitable for display in the current locale. + * + *

For example, returns a string like "Wednesday, May 25, 2016, 8:02PM" or "Chorshanba, 2016 + * may 25,20:02". + * + *

For pre-N devices, the returned value may not start with a capital if the local convention + * is to not capitalize day names. On N+ devices, the returned value is always capitalized. + */ + public static CharSequence formatDate(Context context, long callDateMillis) { + return toTitleCase( + DateUtils.formatDateTime( + context, + callDateMillis, + DateUtils.FORMAT_SHOW_TIME + | DateUtils.FORMAT_SHOW_DATE + | DateUtils.FORMAT_SHOW_WEEKDAY + | DateUtils.FORMAT_SHOW_YEAR)); + } + + /** + * Formats the provided date into the day of week. + * + *

For example, returns a string like "Wednesday" or "Chorshanba". + * + *

For pre-N devices, the returned value may not start with a capital if the local convention + * is to not capitalize day names. On N+ devices, the returned value is always capitalized. + */ + private static CharSequence formatDayOfWeek(Context context, long callDateMillis) { + return toTitleCase( + DateUtils.formatDateTime(context, callDateMillis, DateUtils.FORMAT_SHOW_WEEKDAY)); + } + + /** + * Formats the provided date into the month abbreviation and day. + * + *

For example, returns a string like "Jan 15". + * + *

For pre-N devices, the returned value may not start with a capital if the local convention + * is to not capitalize day names. On N+ devices, the returned value is always capitalized. + */ + private static CharSequence formatAbbreviatedMonthAndDay(Context context, long callDateMillis) { + return toTitleCase( + DateUtils.formatDateTime( + context, callDateMillis, DateUtils.FORMAT_ABBREV_MONTH | DateUtils.FORMAT_NO_YEAR)); + } + + private static CharSequence toTitleCase(CharSequence value) { + // We want the beginning of the date string to be capitalized, even if the word at the beginning + // of the string is not usually capitalized. For example, "Wednesdsay" in Uzbek is "chorshanba” + // (not capitalized). To handle this issue we apply title casing to the start of the sentence so + // that "chorshanba, 2016 may 25,20:02" becomes "Chorshanba, 2016 may 25,20:02". + // + // The ICU library was not available in Android until N, so we can only do this in N+ devices. + // Pre-N devices will still see incorrect capitalization in some languages. + if (VERSION.SDK_INT < VERSION_CODES.N) { + return value; + } + + // Using the ICU library is safer than just applying toUpperCase() on the first letter of the + // word because in some languages, there can be multiple starting characters which should be + // upper-cased together. For example in Dutch "ij" is a digraph in which both letters should be + // capitalized together. + + // TITLECASE_NO_LOWERCASE is necessary so that things that are already capitalized are not + // lower-cased as part of the conversion. + return UCharacter.toTitleCase( + Locale.getDefault(), + value.toString(), + BreakIterator.getSentenceInstance(), + UCharacter.TITLECASE_NO_LOWERCASE); + } + + private static boolean isWithin3Days(long nowMillis, long timestampMillis) { + Calendar threeDaysAgoStartOfDay = Calendar.getInstance(); + threeDaysAgoStartOfDay.setTimeInMillis(nowMillis); + + // This is attempting to find the start of the current day, but it's not quite right due to + // daylight savings. Unfortunately there doesn't seem to be a way to get the correct start of + // the day without using Joda or Java8, both of which are disallowed. This means that the wrong + // formatting may be applied on days with time changes (though the displayed values will be + // correct). + threeDaysAgoStartOfDay.add( + Calendar.HOUR_OF_DAY, -threeDaysAgoStartOfDay.get(Calendar.HOUR_OF_DAY)); + threeDaysAgoStartOfDay.add(Calendar.MINUTE, -threeDaysAgoStartOfDay.get(Calendar.MINUTE)); + threeDaysAgoStartOfDay.add(Calendar.SECOND, -threeDaysAgoStartOfDay.get(Calendar.SECOND)); + + threeDaysAgoStartOfDay.add(Calendar.DATE, -2); + + Calendar then = Calendar.getInstance(); + then.setTimeInMillis(timestampMillis); + + return then.equals(threeDaysAgoStartOfDay) || then.after(threeDaysAgoStartOfDay); + } + + /** Returns true if the provided timestamps are from the same day in the default time zone. */ + public static boolean isSameDay(long firstMillis, long secondMillis) { + Calendar first = Calendar.getInstance(); + first.setTimeInMillis(firstMillis); + + Calendar second = Calendar.getInstance(); + second.setTimeInMillis(secondMillis); + + return first.get(Calendar.YEAR) == second.get(Calendar.YEAR) + && first.get(Calendar.MONTH) == second.get(Calendar.MONTH) + && first.get(Calendar.DAY_OF_MONTH) == second.get(Calendar.DAY_OF_MONTH); + } +} diff --git a/java/com/android/dialer/calllogutils/CallLogDurations.java b/java/com/android/dialer/calllogutils/CallLogDurations.java new file mode 100644 index 000000000..20998deb4 --- /dev/null +++ b/java/com/android/dialer/calllogutils/CallLogDurations.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.calllogutils; + +import android.content.Context; +import android.content.res.Resources; +import android.text.format.Formatter; +import com.android.dialer.util.DialerUtils; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** Utility class for formatting duration and data usage in call log entries. */ +public class CallLogDurations { + + private static CharSequence formatDuration(Context context, long elapsedSeconds) { + Resources res = context.getResources(); + String formatPattern; + if (elapsedSeconds >= 60) { + String minutesString = res.getString(R.string.call_details_minutes_abbreviation); + String secondsString = res.getString(R.string.call_details_seconds_abbreviation); + // example output: "1m 1s" + formatPattern = + context.getString( + R.string.call_duration_format_pattern, "m", minutesString, "s", secondsString); + } else { + String secondsString = res.getString(R.string.call_details_seconds_abbreviation); + // example output: "1s" + formatPattern = + context.getString(R.string.call_duration_short_format_pattern, "s", secondsString); + + // Temporary work around for a broken Hebrew(iw) translation. + if (formatPattern.endsWith("\'\'")) { + formatPattern = formatPattern.substring(0, formatPattern.length() - 1); + } + } + + // If new translation issues arise, we should catch them here to prevent crashes. + try { + Date date = new Date(TimeUnit.SECONDS.toMillis(elapsedSeconds)); + SimpleDateFormat format = new SimpleDateFormat(formatPattern); + String duration = format.format(date); + + // SimpleDateFormat cannot display more than 59 minutes, instead it displays MINUTES % 60. + // Here we check for that value and replace it with the correct value. + if (elapsedSeconds >= TimeUnit.MINUTES.toSeconds(60)) { + int minutes = (int) (elapsedSeconds / 60); + duration = duration.replaceFirst(Integer.toString(minutes % 60), Integer.toString(minutes)); + } + return duration; + } catch (Exception e) { + return ""; + } + } + + private static CharSequence formatDurationA11y(Context context, long elapsedSeconds) { + Resources res = context.getResources(); + if (elapsedSeconds >= 60) { + int minutes = (int) (elapsedSeconds / 60); + int seconds = (int) elapsedSeconds - minutes * 60; + String minutesString = res.getQuantityString(R.plurals.a11y_minutes, minutes); + String secondsString = res.getQuantityString(R.plurals.a11y_seconds, seconds); + // example output: "1 minute 1 second", "2 minutes 2 seconds", ect. + return context.getString( + R.string.a11y_call_duration_format, minutes, minutesString, seconds, secondsString); + } else { + String secondsString = res.getQuantityString(R.plurals.a11y_seconds, (int) elapsedSeconds); + // example output: "1 second", "2 seconds" + return context.getString( + R.string.a11y_call_duration_short_format, elapsedSeconds, secondsString); + } + } + + /** + * Formats a string containing the call duration and the data usage (if specified). + * + * @param elapsedSeconds Total elapsed seconds. + * @param dataUsage Data usage in bytes, or null if not specified. + * @return String containing call duration and data usage. + */ + public static CharSequence formatDurationAndDataUsage( + Context context, long elapsedSeconds, long dataUsage) { + return formatDurationAndDataUsageInternal( + context, formatDuration(context, elapsedSeconds), dataUsage); + } + + /** + * Formats a string containing the call duration and the data usage (if specified) for TalkBack. + * + * @param elapsedSeconds Total elapsed seconds. + * @param dataUsage Data usage in bytes, or null if not specified. + * @return String containing call duration and data usage. + */ + public static CharSequence formatDurationAndDataUsageA11y( + Context context, long elapsedSeconds, long dataUsage) { + return formatDurationAndDataUsageInternal( + context, formatDurationA11y(context, elapsedSeconds), dataUsage); + } + + private static CharSequence formatDurationAndDataUsageInternal( + Context context, CharSequence duration, long dataUsage) { + List durationItems = new ArrayList<>(); + if (dataUsage > 0) { + durationItems.add(duration); + durationItems.add(Formatter.formatShortFileSize(context, dataUsage)); + return DialerUtils.join(durationItems); + } else { + return duration; + } + } +} diff --git a/java/com/android/dialer/calllogutils/CallTypeHelper.java b/java/com/android/dialer/calllogutils/CallTypeHelper.java index d3b5b67d7..783f799f3 100644 --- a/java/com/android/dialer/calllogutils/CallTypeHelper.java +++ b/java/com/android/dialer/calllogutils/CallTypeHelper.java @@ -18,6 +18,7 @@ package com.android.dialer.calllogutils; import android.content.res.Resources; import com.android.dialer.compat.AppCompatConstants; +import com.android.dialer.lightbringer.Lightbringer; /** Helper class to perform operations related to call types. */ public class CallTypeHelper { @@ -50,8 +51,12 @@ public class CallTypeHelper { private final CharSequence mBlockedName; /** Name used to identify calls which were answered on another device. */ private final CharSequence mAnsweredElsewhereName; + /** Name used to identify incoming lightbringer calls. */ + private final CharSequence mIncomingLightbringerCall; + /** Name used to identify outgoing lightbringer calls. */ + private final CharSequence mOutgoingLightbringerCall; - public CallTypeHelper(Resources resources) { + public CallTypeHelper(Resources resources, Lightbringer lightbringer) { // Cache these values so that we do not need to look them up each time. mIncomingName = resources.getString(R.string.type_incoming); mIncomingPulledName = resources.getString(R.string.type_incoming_pulled); @@ -67,6 +72,18 @@ public class CallTypeHelper { mRejectedName = resources.getString(R.string.type_rejected); mBlockedName = resources.getString(R.string.type_blocked); mAnsweredElsewhereName = resources.getString(R.string.type_answered_elsewhere); + + if (lightbringer.getIncomingCallTypeText() != -1) { + mIncomingLightbringerCall = resources.getString(lightbringer.getIncomingCallTypeText()); + } else { + mIncomingLightbringerCall = mIncomingVideoName; + } + + if (lightbringer.getOutgoingCallTypeText() != -1) { + mOutgoingLightbringerCall = resources.getString(lightbringer.getOutgoingCallTypeText()); + } else { + mOutgoingLightbringerCall = mOutgoingVideoName; + } } public static boolean isMissedCallType(int callType) { @@ -77,13 +94,17 @@ public class CallTypeHelper { } /** Returns the text used to represent the given call type. */ - public CharSequence getCallTypeText(int callType, boolean isVideoCall, boolean isPulledCall) { + public CharSequence getCallTypeText( + int callType, boolean isVideoCall, boolean isPulledCall, boolean isLightbringerCall) { switch (callType) { case AppCompatConstants.CALLS_INCOMING_TYPE: if (isVideoCall) { if (isPulledCall) { return mIncomingVideoPulledName; } else { + if (isLightbringerCall) { + return mIncomingLightbringerCall; + } return mIncomingVideoName; } } else { @@ -99,6 +120,9 @@ public class CallTypeHelper { if (isPulledCall) { return mOutgoingVideoPulledName; } else { + if (isLightbringerCall) { + return mOutgoingLightbringerCall; + } return mOutgoingVideoName; } } else { diff --git a/java/com/android/dialer/calllogutils/PhoneCallDetails.java b/java/com/android/dialer/calllogutils/PhoneCallDetails.java index 13c528ad2..869a3d099 100644 --- a/java/com/android/dialer/calllogutils/PhoneCallDetails.java +++ b/java/com/android/dialer/calllogutils/PhoneCallDetails.java @@ -99,6 +99,9 @@ public class PhoneCallDetails { // Voicemail transcription public String transcription; + // Voicemail transcription state, ie. in-progress, failed, etc. + public int transcriptionState; + // The display string for the number. public String displayNumber; diff --git a/java/com/android/dialer/calllogutils/res/values-af/strings.xml b/java/com/android/dialer/calllogutils/res/values-af/strings.xml index 0f9dd3b19..557532ddc 100644 --- a/java/com/android/dialer/calllogutils/res/values-af/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-af/strings.xml @@ -49,4 +49,5 @@ "via %1$s" "op %1$s, via %2$s" "Stemboodskap" + "Nou" diff --git a/java/com/android/dialer/calllogutils/res/values-am/strings.xml b/java/com/android/dialer/calllogutils/res/values-am/strings.xml index c5da1c6c0..fec0691d7 100644 --- a/java/com/android/dialer/calllogutils/res/values-am/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-am/strings.xml @@ -34,8 +34,8 @@ "ሰ" "%d %s %d %s" "%d %s" - "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" ሰከንዶች ሰከንዶች @@ -49,4 +49,5 @@ "በ %1$s በኩል" "በ %1$s ላይ፣ በ %2$s በኩል" "የድምፅ መልዕክት" + "አሁን" diff --git a/java/com/android/dialer/calllogutils/res/values-ar/strings.xml b/java/com/android/dialer/calllogutils/res/values-ar/strings.xml index 39afb6d1d..101eb2cc2 100644 --- a/java/com/android/dialer/calllogutils/res/values-ar/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ar/strings.xml @@ -57,4 +57,5 @@ "من خلال %1$s" "على %1$s من خلال %2$s" "البريد الصوتي" + "الآن" diff --git a/java/com/android/dialer/calllogutils/res/values-az/strings.xml b/java/com/android/dialer/calllogutils/res/values-az/strings.xml index c280c8eda..938d2d6d6 100644 --- a/java/com/android/dialer/calllogutils/res/values-az/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-az/strings.xml @@ -34,8 +34,8 @@ "san" "%d %s %d %s" "%d %s" - "%s\"%s\" %s\"%s\"" - "%s\"%s\"" + "%s\'%s\' %s\'%s\'" + "%s\'%s\'" saniyə saniyə @@ -49,4 +49,5 @@ "%1$s vasitəsilə" "%2$s vasitəsilə %1$s hesabında" "Səsli e-məktub" + "İndi" diff --git a/java/com/android/dialer/calllogutils/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/calllogutils/res/values-b+sr+Latn/strings.xml index 74c9f7873..0bf6a6215 100644 --- a/java/com/android/dialer/calllogutils/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-b+sr+Latn/strings.xml @@ -51,4 +51,5 @@ "preko %1$s" "na %1$s, preko %2$s" "Govorna pošta" + "Sada" diff --git a/java/com/android/dialer/calllogutils/res/values-be/strings.xml b/java/com/android/dialer/calllogutils/res/values-be/strings.xml index 1099e320c..d7b74aba9 100644 --- a/java/com/android/dialer/calllogutils/res/values-be/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-be/strings.xml @@ -53,4 +53,5 @@ "праз %1$s" "на %1$s, праз %2$s" "Галасавая пошта" + "Зараз" diff --git a/java/com/android/dialer/calllogutils/res/values-bg/strings.xml b/java/com/android/dialer/calllogutils/res/values-bg/strings.xml index 216981c91..cb1dc7299 100644 --- a/java/com/android/dialer/calllogutils/res/values-bg/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-bg/strings.xml @@ -49,4 +49,5 @@ "през %1$s" "в/ъв %1$s, през %2$s" "Гласова поща" + "Сега" diff --git a/java/com/android/dialer/calllogutils/res/values-bn/strings.xml b/java/com/android/dialer/calllogutils/res/values-bn/strings.xml index 7d51fe74e..11f475f0c 100644 --- a/java/com/android/dialer/calllogutils/res/values-bn/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-bn/strings.xml @@ -49,4 +49,5 @@ "%1$s এর মাধ্যমে" "%1$s এ, %2$s এর মাধ্যমে" "ভয়েসমেল" + "এখনই" diff --git a/java/com/android/dialer/calllogutils/res/values-bs/strings.xml b/java/com/android/dialer/calllogutils/res/values-bs/strings.xml index 405d9c3f6..7526ef4f5 100644 --- a/java/com/android/dialer/calllogutils/res/values-bs/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-bs/strings.xml @@ -51,4 +51,5 @@ "preko %1$s" "na %1$s, preko %2$s" "Govorna pošta" + "Sada" diff --git a/java/com/android/dialer/calllogutils/res/values-ca/strings.xml b/java/com/android/dialer/calllogutils/res/values-ca/strings.xml index ad993e39f..6441b44e2 100644 --- a/java/com/android/dialer/calllogutils/res/values-ca/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ca/strings.xml @@ -49,4 +49,5 @@ "al número %1$s" "a %1$s, al número %2$s" "Bústia de veu" + "Ara" diff --git a/java/com/android/dialer/calllogutils/res/values-cs/strings.xml b/java/com/android/dialer/calllogutils/res/values-cs/strings.xml index 8889941ad..9e0fb0e5d 100644 --- a/java/com/android/dialer/calllogutils/res/values-cs/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-cs/strings.xml @@ -53,4 +53,5 @@ "z čísla %1$s" "na účet %1$s, z čísla %2$s" "Hlasová schránka" + "Právě teď" diff --git a/java/com/android/dialer/calllogutils/res/values-da/strings.xml b/java/com/android/dialer/calllogutils/res/values-da/strings.xml index 123002a26..9032f81e3 100644 --- a/java/com/android/dialer/calllogutils/res/values-da/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-da/strings.xml @@ -34,8 +34,8 @@ "sek." "%d %s %d %s" "%d %s" - "%s\' %s\' %s\' %s\'" - "%s\' %s\'" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" sekund sekunder @@ -49,4 +49,5 @@ "via %1$s" "til %1$s, via %2$s" "Telefonsvarer" + "Nu" diff --git a/java/com/android/dialer/calllogutils/res/values-de/strings.xml b/java/com/android/dialer/calllogutils/res/values-de/strings.xml index 5867b7344..7980d9747 100644 --- a/java/com/android/dialer/calllogutils/res/values-de/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-de/strings.xml @@ -34,8 +34,8 @@ "s" "%d %s %d %s" "%d %s" - "%s \"%s\" %s \"%s\"" - "%s \"%s\"" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'"  Sekunden  Sekunde @@ -49,4 +49,5 @@ "über %1$s" "mit %1$s, über %2$s" "Mailbox" + "Jetzt" diff --git a/java/com/android/dialer/calllogutils/res/values-el/strings.xml b/java/com/android/dialer/calllogutils/res/values-el/strings.xml index 018a7266b..20abded84 100644 --- a/java/com/android/dialer/calllogutils/res/values-el/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-el/strings.xml @@ -49,4 +49,5 @@ "μέσω %1$s" "στον λογαριασμό %1$s, μέσω %2$s" "Αυτόματος τηλεφωνητής" + "Τώρα" diff --git a/java/com/android/dialer/calllogutils/res/values-en-rAU/strings.xml b/java/com/android/dialer/calllogutils/res/values-en-rAU/strings.xml index d0294c641..51c5215a4 100644 --- a/java/com/android/dialer/calllogutils/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-en-rAU/strings.xml @@ -49,4 +49,5 @@ "via %1$s" "on %1$s, via %2$s" "Voicemail" + "Now" diff --git a/java/com/android/dialer/calllogutils/res/values-en-rGB/strings.xml b/java/com/android/dialer/calllogutils/res/values-en-rGB/strings.xml index d0294c641..51c5215a4 100644 --- a/java/com/android/dialer/calllogutils/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-en-rGB/strings.xml @@ -49,4 +49,5 @@ "via %1$s" "on %1$s, via %2$s" "Voicemail" + "Now" diff --git a/java/com/android/dialer/calllogutils/res/values-en-rIN/strings.xml b/java/com/android/dialer/calllogutils/res/values-en-rIN/strings.xml index d0294c641..51c5215a4 100644 --- a/java/com/android/dialer/calllogutils/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-en-rIN/strings.xml @@ -49,4 +49,5 @@ "via %1$s" "on %1$s, via %2$s" "Voicemail" + "Now" diff --git a/java/com/android/dialer/calllogutils/res/values-es-rUS/strings.xml b/java/com/android/dialer/calllogutils/res/values-es-rUS/strings.xml index 2988f9117..5deb0a2be 100644 --- a/java/com/android/dialer/calllogutils/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-es-rUS/strings.xml @@ -49,4 +49,5 @@ "por medio de %1$s" "en %1$s por medio de %2$s" "Buzón de voz" + "Ahora" diff --git a/java/com/android/dialer/calllogutils/res/values-es/strings.xml b/java/com/android/dialer/calllogutils/res/values-es/strings.xml index fb13bccc3..ac8992c93 100644 --- a/java/com/android/dialer/calllogutils/res/values-es/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-es/strings.xml @@ -49,4 +49,5 @@ "a través del %1$s" "en %1$s, a través del %2$s" "Buzón de voz" + "Ahora" diff --git a/java/com/android/dialer/calllogutils/res/values-et/strings.xml b/java/com/android/dialer/calllogutils/res/values-et/strings.xml index 3781133d8..e52f580ff 100644 --- a/java/com/android/dialer/calllogutils/res/values-et/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-et/strings.xml @@ -49,4 +49,5 @@ "numbri %1$s kaudu" "kontol %1$s, numbri %2$s kaudu" "Kõnepost" + "Praegu" diff --git a/java/com/android/dialer/calllogutils/res/values-eu/strings.xml b/java/com/android/dialer/calllogutils/res/values-eu/strings.xml index a097ec857..6aa2aa64f 100644 --- a/java/com/android/dialer/calllogutils/res/values-eu/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-eu/strings.xml @@ -34,7 +34,7 @@ "s" "%d %s eta %d %s" "%d %s" - "%s \'%s\' eta %s \'%s\'" + "%s \'%s\' \'eta\' %s \'%s\'" "%s \'%s\'" segundo @@ -49,4 +49,5 @@ "%1$s bidez" "%1$s kontuan, %2$s bidez" "Erantzungailua" + "Oraintxe bertan" diff --git a/java/com/android/dialer/calllogutils/res/values-fa/strings.xml b/java/com/android/dialer/calllogutils/res/values-fa/strings.xml index 1a457d41a..4439ca456 100644 --- a/java/com/android/dialer/calllogutils/res/values-fa/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-fa/strings.xml @@ -49,4 +49,5 @@ "ازطریق %1$s" "در %1$s، ازطریق %2$s" "پست صوتی" + "اکنون" diff --git a/java/com/android/dialer/calllogutils/res/values-fi/strings.xml b/java/com/android/dialer/calllogutils/res/values-fi/strings.xml index 70b3d53c4..41ff5825f 100644 --- a/java/com/android/dialer/calllogutils/res/values-fi/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-fi/strings.xml @@ -49,4 +49,5 @@ "numerosta %1$s" "tililtä %1$s numerosta %2$s" "Vastaaja" + "Nyt" diff --git a/java/com/android/dialer/calllogutils/res/values-fr-rCA/strings.xml b/java/com/android/dialer/calllogutils/res/values-fr-rCA/strings.xml index 01e2d64cd..0c828937f 100644 --- a/java/com/android/dialer/calllogutils/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-fr-rCA/strings.xml @@ -49,4 +49,5 @@ "au %1$s" "sur %1$s, au %2$s" "Messagerie vocale" + "Maintenant" diff --git a/java/com/android/dialer/calllogutils/res/values-fr/strings.xml b/java/com/android/dialer/calllogutils/res/values-fr/strings.xml index 8f8c797c4..c1b9ea6f7 100644 --- a/java/com/android/dialer/calllogutils/res/values-fr/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-fr/strings.xml @@ -49,4 +49,5 @@ "au %1$s" "sur %1$s, au %2$s" "Messagerie vocale" + "À l\'instant" diff --git a/java/com/android/dialer/calllogutils/res/values-gl/strings.xml b/java/com/android/dialer/calllogutils/res/values-gl/strings.xml index 72c0d5a7b..bbf75e219 100644 --- a/java/com/android/dialer/calllogutils/res/values-gl/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-gl/strings.xml @@ -49,4 +49,5 @@ "a través do %1$s" "en %1$s, a través do %2$s" "Correo de voz" + "Agora" diff --git a/java/com/android/dialer/calllogutils/res/values-gu/strings.xml b/java/com/android/dialer/calllogutils/res/values-gu/strings.xml index 29c162425..37c855184 100644 --- a/java/com/android/dialer/calllogutils/res/values-gu/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-gu/strings.xml @@ -49,4 +49,5 @@ "%1$s મારફતે" "%1$s પર, %2$s મારફતે" "વૉઇસમેઇલ" + "હમણાં" diff --git a/java/com/android/dialer/calllogutils/res/values-hi/strings.xml b/java/com/android/dialer/calllogutils/res/values-hi/strings.xml index d20e88e02..44e9b90f7 100644 --- a/java/com/android/dialer/calllogutils/res/values-hi/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-hi/strings.xml @@ -34,8 +34,8 @@ "से." "%d %s %d %s" "%d %s" - "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" सेकंड सेकंड @@ -49,4 +49,5 @@ "%1$s से" "%1$s पर, %2$s से" "वॉइसमेल" + "अभी" diff --git a/java/com/android/dialer/calllogutils/res/values-hr/strings.xml b/java/com/android/dialer/calllogutils/res/values-hr/strings.xml index 72281bf49..560e8e513 100644 --- a/java/com/android/dialer/calllogutils/res/values-hr/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-hr/strings.xml @@ -51,4 +51,5 @@ "putem broja %1$s" "na računu %1$s, putem broja %2$s" "Govorna pošta" + "Sad" diff --git a/java/com/android/dialer/calllogutils/res/values-hu/strings.xml b/java/com/android/dialer/calllogutils/res/values-hu/strings.xml index f85e9f1db..f2bdd2402 100644 --- a/java/com/android/dialer/calllogutils/res/values-hu/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-hu/strings.xml @@ -49,4 +49,5 @@ "szám: %1$s" "fiók: %1$s, szám: %2$s" "Hangposta" + "Most" diff --git a/java/com/android/dialer/calllogutils/res/values-hy/strings.xml b/java/com/android/dialer/calllogutils/res/values-hy/strings.xml index db21fecbd..04f02d73f 100644 --- a/java/com/android/dialer/calllogutils/res/values-hy/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-hy/strings.xml @@ -49,4 +49,5 @@ "%1$s համարից" "%1$s-ին %2$s համարից" "Ձայնային փոստ" + "Հիմա" diff --git a/java/com/android/dialer/calllogutils/res/values-in/strings.xml b/java/com/android/dialer/calllogutils/res/values-in/strings.xml index 11f407c67..83367ace1 100644 --- a/java/com/android/dialer/calllogutils/res/values-in/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-in/strings.xml @@ -49,4 +49,5 @@ "melalui %1$s" "di %1$s, melalui %2$s" "Pesan suara" + "Sekarang" diff --git a/java/com/android/dialer/calllogutils/res/values-is/strings.xml b/java/com/android/dialer/calllogutils/res/values-is/strings.xml index 1716649cc..639881d35 100644 --- a/java/com/android/dialer/calllogutils/res/values-is/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-is/strings.xml @@ -49,4 +49,5 @@ "í gegnum %1$s" %1$s, í gegnum %2$s" "Talhólf" + "Núna" diff --git a/java/com/android/dialer/calllogutils/res/values-it/strings.xml b/java/com/android/dialer/calllogutils/res/values-it/strings.xml index 2dd4dca88..e40a846eb 100644 --- a/java/com/android/dialer/calllogutils/res/values-it/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-it/strings.xml @@ -49,4 +49,5 @@ "tramite %1$s" "su %1$s, tramite %2$s" "Messaggi vocali" + "Ora" diff --git a/java/com/android/dialer/calllogutils/res/values-iw/strings.xml b/java/com/android/dialer/calllogutils/res/values-iw/strings.xml index 2f298558e..82dbd85da 100644 --- a/java/com/android/dialer/calllogutils/res/values-iw/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-iw/strings.xml @@ -34,7 +34,7 @@ "שנ\'" "%d %s ו-%d %s" "%d %s" - "%s\'%s\' ו-%s\'%s\'" + "%s\'%s\' %s\'%s\'" "%s\'%s\'" שניות @@ -53,4 +53,5 @@ "דרך %1$s" "בחשבון %1$s, דרך %2$s" "דואר קולי" + "עכשיו" diff --git a/java/com/android/dialer/calllogutils/res/values-ja/strings.xml b/java/com/android/dialer/calllogutils/res/values-ja/strings.xml index 1a4b7ee4c..4cfd61716 100644 --- a/java/com/android/dialer/calllogutils/res/values-ja/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ja/strings.xml @@ -49,4 +49,5 @@ "%1$s で受信" "%1$s%2$s)で受信" "ボイスメール" + "たった今" diff --git a/java/com/android/dialer/calllogutils/res/values-ka/strings.xml b/java/com/android/dialer/calllogutils/res/values-ka/strings.xml index 2ce05376f..62f72ad7c 100644 --- a/java/com/android/dialer/calllogutils/res/values-ka/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ka/strings.xml @@ -49,4 +49,5 @@ "%1$s-ის მეშვეობით" "%1$s-ზე, %2$s-ის მეშვეობით" "ხმოვანი ფოსტა" + "ახლა" diff --git a/java/com/android/dialer/calllogutils/res/values-kk/strings.xml b/java/com/android/dialer/calllogutils/res/values-kk/strings.xml index b213dd521..3025979fa 100644 --- a/java/com/android/dialer/calllogutils/res/values-kk/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-kk/strings.xml @@ -49,4 +49,5 @@ "%1$s арқылы" "%1$s, %2$s арқылы" "Дауыстық хабар" + "Қазір" diff --git a/java/com/android/dialer/calllogutils/res/values-km/strings.xml b/java/com/android/dialer/calllogutils/res/values-km/strings.xml index 765bb61cf..650d4b82e 100644 --- a/java/com/android/dialer/calllogutils/res/values-km/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-km/strings.xml @@ -49,4 +49,5 @@ "តាមរយៈ %1$s" "នៅ​លើ %1$s តាមរយៈ %2$s" "សារ​ជា​សំឡេង" + "ឥឡូវនេះ" diff --git a/java/com/android/dialer/calllogutils/res/values-kn/strings.xml b/java/com/android/dialer/calllogutils/res/values-kn/strings.xml index cd6eaed26..07efc0bbb 100644 --- a/java/com/android/dialer/calllogutils/res/values-kn/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-kn/strings.xml @@ -49,4 +49,5 @@ "%1$s ಮೂಲಕ" "%1$s ರಲ್ಲಿ, %2$s ಮೂಲಕ" "ಧ್ವನಿಮೇಲ್" + "ಈಗ" diff --git a/java/com/android/dialer/calllogutils/res/values-ko/strings.xml b/java/com/android/dialer/calllogutils/res/values-ko/strings.xml index e1cc957e2..b372e23a5 100644 --- a/java/com/android/dialer/calllogutils/res/values-ko/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ko/strings.xml @@ -49,4 +49,5 @@ "%1$s번으로 수신" "%1$s에서 %2$s번으로 수신" "음성사서함" + "조금 전" diff --git a/java/com/android/dialer/calllogutils/res/values-ky/strings.xml b/java/com/android/dialer/calllogutils/res/values-ky/strings.xml index f758dab7b..633bbaec4 100644 --- a/java/com/android/dialer/calllogutils/res/values-ky/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ky/strings.xml @@ -35,7 +35,7 @@ "%d %s %d %s" "%d %s" "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "%s \'%s\'" секундалар секунда @@ -49,4 +49,5 @@ "%1$s аркылуу" "%1$s боюнча %2$s аркылуу" "Үн почтасы" + "Учурда" diff --git a/java/com/android/dialer/calllogutils/res/values-lo/strings.xml b/java/com/android/dialer/calllogutils/res/values-lo/strings.xml index 3107b3b02..7a7a869b5 100644 --- a/java/com/android/dialer/calllogutils/res/values-lo/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-lo/strings.xml @@ -49,4 +49,5 @@ "ຜ່ານ %1$s" "ຢູ່ %1$s, ຜ່ານ %2$s" "ຂໍ້ຄວາມສຽງ" + "ຕອນນີ້" diff --git a/java/com/android/dialer/calllogutils/res/values-lt/strings.xml b/java/com/android/dialer/calllogutils/res/values-lt/strings.xml index cdac53584..eca5ea324 100644 --- a/java/com/android/dialer/calllogutils/res/values-lt/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-lt/strings.xml @@ -53,4 +53,5 @@ "numeriu %1$s" "%1$s, numeriu %2$s" "Balso paštas" + "Dabar" diff --git a/java/com/android/dialer/calllogutils/res/values-lv/strings.xml b/java/com/android/dialer/calllogutils/res/values-lv/strings.xml index c87dbb622..5b469a56e 100644 --- a/java/com/android/dialer/calllogutils/res/values-lv/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-lv/strings.xml @@ -35,7 +35,7 @@ "%d %s %d %s" "%d %s" "%s \'%s\' %s \'%s\'" - "%s \'%s\'" + "%s\'%s\'" sekunžu sekunde @@ -51,4 +51,5 @@ "izmantojot numuru %1$s" "kontā %1$s, izmantojot numuru %2$s" "Balss pasts" + "Tikko" diff --git a/java/com/android/dialer/calllogutils/res/values-mk/strings.xml b/java/com/android/dialer/calllogutils/res/values-mk/strings.xml index 7c3c84ec0..72dfc07e3 100644 --- a/java/com/android/dialer/calllogutils/res/values-mk/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-mk/strings.xml @@ -49,4 +49,5 @@ "на %1$s" "на %1$s, на %2$s" "Говорна пошта" + "Сега" diff --git a/java/com/android/dialer/calllogutils/res/values-ml/strings.xml b/java/com/android/dialer/calllogutils/res/values-ml/strings.xml index 0064401f1..7a819e95f 100644 --- a/java/com/android/dialer/calllogutils/res/values-ml/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ml/strings.xml @@ -35,7 +35,7 @@ "%d %s %d %s" "%d %s" "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "%s \'%s\'" സെക്കൻഡ് സെക്കൻഡ് @@ -49,4 +49,5 @@ "%1$s നമ്പർ വഴി" "%2$s നമ്പർ വഴി, %1$s അക്കൗണ്ടിൽ" "വോയ്‌സ്‌മെയിൽ" + "ഇപ്പോൾ" diff --git a/java/com/android/dialer/calllogutils/res/values-mn/strings.xml b/java/com/android/dialer/calllogutils/res/values-mn/strings.xml index 915c1adfd..77f03404e 100644 --- a/java/com/android/dialer/calllogutils/res/values-mn/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-mn/strings.xml @@ -49,4 +49,5 @@ "%1$s-р" "%1$s дээр, %2$s-р" "Дуут шуудан" + "Одоо" diff --git a/java/com/android/dialer/calllogutils/res/values-mr/strings.xml b/java/com/android/dialer/calllogutils/res/values-mr/strings.xml index c01f7c171..3329b1c22 100644 --- a/java/com/android/dialer/calllogutils/res/values-mr/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-mr/strings.xml @@ -34,8 +34,8 @@ "से" "%d %s %d %s" "%d %s" - "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" सेकंद सेकंद @@ -49,4 +49,5 @@ "%1$s द्वारे" "%1$s वर, %2$s द्वारे" "व्हॉइसमेल" + "आत्ता" diff --git a/java/com/android/dialer/calllogutils/res/values-ms/strings.xml b/java/com/android/dialer/calllogutils/res/values-ms/strings.xml index 441a9ab93..76ada6cf7 100644 --- a/java/com/android/dialer/calllogutils/res/values-ms/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ms/strings.xml @@ -49,4 +49,5 @@ "melalui %1$s" "pada %1$s, melalui %2$s" "Mel suara" + "Sekarang" diff --git a/java/com/android/dialer/calllogutils/res/values-my/strings.xml b/java/com/android/dialer/calllogutils/res/values-my/strings.xml index f05d5b235..5744c2be2 100644 --- a/java/com/android/dialer/calllogutils/res/values-my/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-my/strings.xml @@ -49,4 +49,5 @@ "%1$s မှတစ်ဆင့်" "%1$s တွင်၊ %2$s မှတစ်ဆင့်" "အသံမေးလ်" + "ယခု" diff --git a/java/com/android/dialer/calllogutils/res/values-nb/strings.xml b/java/com/android/dialer/calllogutils/res/values-nb/strings.xml index 2f744036a..7a989d4bf 100644 --- a/java/com/android/dialer/calllogutils/res/values-nb/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-nb/strings.xml @@ -34,8 +34,8 @@ "sek." "%d %s %d %s" "%d %s" - "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" sekunder sekund @@ -49,4 +49,5 @@ "via %1$s" "på %1$s via %2$s" "Talepost" + "Nå" diff --git a/java/com/android/dialer/calllogutils/res/values-ne/strings.xml b/java/com/android/dialer/calllogutils/res/values-ne/strings.xml index a83d6fb98..bb1b25c3e 100644 --- a/java/com/android/dialer/calllogutils/res/values-ne/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ne/strings.xml @@ -49,4 +49,5 @@ "%1$s मार्फत" "%1$s मा, %2$s मार्फत" "भ्वाइस मेल" + "अहिले भर्खरै" diff --git a/java/com/android/dialer/calllogutils/res/values-nl/strings.xml b/java/com/android/dialer/calllogutils/res/values-nl/strings.xml index d15610917..9b28f6f5b 100644 --- a/java/com/android/dialer/calllogutils/res/values-nl/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-nl/strings.xml @@ -34,8 +34,8 @@ "s" "%d %s %d %s" "%d %s" - "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" seconden seconde @@ -49,4 +49,5 @@ "via %1$s" "op %1$s, via %2$s" "Voicemail" + "Nu" diff --git a/java/com/android/dialer/calllogutils/res/values-no/strings.xml b/java/com/android/dialer/calllogutils/res/values-no/strings.xml index 2f744036a..7a989d4bf 100644 --- a/java/com/android/dialer/calllogutils/res/values-no/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-no/strings.xml @@ -34,8 +34,8 @@ "sek." "%d %s %d %s" "%d %s" - "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" sekunder sekund @@ -49,4 +49,5 @@ "via %1$s" "på %1$s via %2$s" "Talepost" + "Nå" diff --git a/java/com/android/dialer/calllogutils/res/values-pa/strings.xml b/java/com/android/dialer/calllogutils/res/values-pa/strings.xml index ba77fa1da..6e2c137fc 100644 --- a/java/com/android/dialer/calllogutils/res/values-pa/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-pa/strings.xml @@ -49,4 +49,5 @@ "%1$s ਰਾਹੀਂ" "%1$s \'ਤੇ, %2$s ਰਾਹੀਂ" "ਵੌਇਸਮੇਲ" + "ਹੁਣੇ" diff --git a/java/com/android/dialer/calllogutils/res/values-pl/strings.xml b/java/com/android/dialer/calllogutils/res/values-pl/strings.xml index 3d9e9d98a..b30171f11 100644 --- a/java/com/android/dialer/calllogutils/res/values-pl/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-pl/strings.xml @@ -53,4 +53,5 @@ "przez %1$s" "na koncie %1$s, przez %2$s" "Poczta głosowa" + "Przed chwilą" diff --git a/java/com/android/dialer/calllogutils/res/values-pt-rBR/strings.xml b/java/com/android/dialer/calllogutils/res/values-pt-rBR/strings.xml index 8c13e813e..4d64d22ad 100644 --- a/java/com/android/dialer/calllogutils/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-pt-rBR/strings.xml @@ -34,8 +34,8 @@ "s" "%d %s %d %s" "%d %s" - "%s \"%s\" %s \"%s\"" - "%s \"%s\"" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" segundo segundos @@ -49,4 +49,5 @@ "pelo número %1$s" "em %1$s, pelo número %2$s" "Correio de voz" + "Agora" diff --git a/java/com/android/dialer/calllogutils/res/values-pt-rPT/strings.xml b/java/com/android/dialer/calllogutils/res/values-pt-rPT/strings.xml index e24d245a3..c10be92b0 100644 --- a/java/com/android/dialer/calllogutils/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-pt-rPT/strings.xml @@ -34,14 +34,14 @@ "seg" "%d %s, %d %s" "%d %s" - "%s\"%s\", %s\"%s\"" - "%s \"%s\"" + "%s\'%s\', %s\'%s\'" + "%s \'%s\'" - seconds + segundo segundos - minutes + minuto minutos "Chamada atendida noutro dispositivo" @@ -49,4 +49,5 @@ "através do número %1$s" "em %1$s, através do número %2$s" "Correio de voz" + "Agora" diff --git a/java/com/android/dialer/calllogutils/res/values-pt/strings.xml b/java/com/android/dialer/calllogutils/res/values-pt/strings.xml index 8c13e813e..4d64d22ad 100644 --- a/java/com/android/dialer/calllogutils/res/values-pt/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-pt/strings.xml @@ -34,8 +34,8 @@ "s" "%d %s %d %s" "%d %s" - "%s \"%s\" %s \"%s\"" - "%s \"%s\"" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" segundo segundos @@ -49,4 +49,5 @@ "pelo número %1$s" "em %1$s, pelo número %2$s" "Correio de voz" + "Agora" diff --git a/java/com/android/dialer/calllogutils/res/values-ro/strings.xml b/java/com/android/dialer/calllogutils/res/values-ro/strings.xml index 0443bda9c..791bf4e44 100644 --- a/java/com/android/dialer/calllogutils/res/values-ro/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ro/strings.xml @@ -51,4 +51,5 @@ "prin %1$s" "pe %1$s, prin %2$s" "Mesagerie vocală" + "Acum" diff --git a/java/com/android/dialer/calllogutils/res/values-ru/strings.xml b/java/com/android/dialer/calllogutils/res/values-ru/strings.xml index c64d25f45..378dc4118 100644 --- a/java/com/android/dialer/calllogutils/res/values-ru/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ru/strings.xml @@ -53,4 +53,5 @@ "Номер %1$s" "%1$s, номер %2$s" "Голосовая почта" + "Только что" diff --git a/java/com/android/dialer/calllogutils/res/values-si/strings.xml b/java/com/android/dialer/calllogutils/res/values-si/strings.xml index 36297f188..1e17d184e 100644 --- a/java/com/android/dialer/calllogutils/res/values-si/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-si/strings.xml @@ -49,4 +49,5 @@ "%1$s හරහා" "%1$s මත, %2$s හරහා" "හඬ තැපෑල" + "දැන්" diff --git a/java/com/android/dialer/calllogutils/res/values-sk/strings.xml b/java/com/android/dialer/calllogutils/res/values-sk/strings.xml index 49196299c..7abfafc3e 100644 --- a/java/com/android/dialer/calllogutils/res/values-sk/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-sk/strings.xml @@ -53,4 +53,5 @@ "prostredníctvom čísla %1$s" "v účte %1$s, prostredníctvom čísla %2$s" "Hlasová schránka" + "Teraz" diff --git a/java/com/android/dialer/calllogutils/res/values-sl/strings.xml b/java/com/android/dialer/calllogutils/res/values-sl/strings.xml index 88bb0a10a..21c117756 100644 --- a/java/com/android/dialer/calllogutils/res/values-sl/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-sl/strings.xml @@ -53,4 +53,5 @@ "prek številke %1$s" "v računu %1$s, prek številke %2$s" "Odzivnik" + "Zdaj" diff --git a/java/com/android/dialer/calllogutils/res/values-sq/strings.xml b/java/com/android/dialer/calllogutils/res/values-sq/strings.xml index b79ad1911..1124ffacd 100644 --- a/java/com/android/dialer/calllogutils/res/values-sq/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-sq/strings.xml @@ -49,4 +49,5 @@ "nëpërmjet %1$s" "në %1$s, nëpërmjet %2$s" "Posta zanore" + "Tani" diff --git a/java/com/android/dialer/calllogutils/res/values-sr/strings.xml b/java/com/android/dialer/calllogutils/res/values-sr/strings.xml index eb991860f..5653dae06 100644 --- a/java/com/android/dialer/calllogutils/res/values-sr/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-sr/strings.xml @@ -51,4 +51,5 @@ "преко %1$s" "на %1$s, преко %2$s" "Говорна пошта" + "Сада" diff --git a/java/com/android/dialer/calllogutils/res/values-sv/strings.xml b/java/com/android/dialer/calllogutils/res/values-sv/strings.xml index 69d97fa5d..190213294 100644 --- a/java/com/android/dialer/calllogutils/res/values-sv/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-sv/strings.xml @@ -49,4 +49,5 @@ "med %1$s" "på %1$s, med %2$s" "Röstbrevlåda" + "Nu" diff --git a/java/com/android/dialer/calllogutils/res/values-sw/strings.xml b/java/com/android/dialer/calllogutils/res/values-sw/strings.xml index 5a5a6909a..57eb4ebfd 100644 --- a/java/com/android/dialer/calllogutils/res/values-sw/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-sw/strings.xml @@ -34,8 +34,8 @@ "sek" "%d %s %d %s" "%d %s" - "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "\'%s\'%s \'%s\'%s" + "\'%s\'%s" Sekunde Sekunde @@ -49,4 +49,5 @@ "kupitia %1$s" "kwenye %1$s, kupitia %2$s" "Ujumbe wa sauti" + "Sasa" diff --git a/java/com/android/dialer/calllogutils/res/values-ta/strings.xml b/java/com/android/dialer/calllogutils/res/values-ta/strings.xml index 34b191be6..481e4a904 100644 --- a/java/com/android/dialer/calllogutils/res/values-ta/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ta/strings.xml @@ -49,4 +49,5 @@ "%1$s மூலம்" "%1$s இல் %2$s மூலம்" "குரலஞ்சல்" + "இப்போது" diff --git a/java/com/android/dialer/calllogutils/res/values-te/strings.xml b/java/com/android/dialer/calllogutils/res/values-te/strings.xml index 17e20c1e9..bbea73b02 100644 --- a/java/com/android/dialer/calllogutils/res/values-te/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-te/strings.xml @@ -49,4 +49,5 @@ "%1$s ద్వారా" "%1$sలో, %2$s ద్వారా" "వాయిస్ మెయిల్" + "ఇప్పుడు" diff --git a/java/com/android/dialer/calllogutils/res/values-th/strings.xml b/java/com/android/dialer/calllogutils/res/values-th/strings.xml index 53c2e9208..184cb260e 100644 --- a/java/com/android/dialer/calllogutils/res/values-th/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-th/strings.xml @@ -49,4 +49,5 @@ "ผ่าน %1$s" "ใน %1$s ผ่าน %2$s" "ข้อความเสียง" + "ตอนนี้" diff --git a/java/com/android/dialer/calllogutils/res/values-tl/strings.xml b/java/com/android/dialer/calllogutils/res/values-tl/strings.xml index e88bf7227..19660a634 100644 --- a/java/com/android/dialer/calllogutils/res/values-tl/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-tl/strings.xml @@ -49,4 +49,5 @@ "sa pamamagitan ng %1$s" "sa %1$s, sa pamamagitan ng %2$s" "Voicemail" + "Ngayon" diff --git a/java/com/android/dialer/calllogutils/res/values-tr/strings.xml b/java/com/android/dialer/calllogutils/res/values-tr/strings.xml index 78e0b5be5..6a6a1f7bb 100644 --- a/java/com/android/dialer/calllogutils/res/values-tr/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-tr/strings.xml @@ -34,8 +34,8 @@ "sn." "%d %s %d %s" "%d %s" - "%s \"%s\" %s \"%s\"" - "%s \"%s\"" + "%s \'%s\' %s \'%s\'" + "%s \'%s\'" saniye saniye @@ -49,4 +49,5 @@ "%1$s kullanılarak" "%2$s kullanılarak %1$s hesabında" "Sesli mesaj" + "Şimdi" diff --git a/java/com/android/dialer/calllogutils/res/values-uk/strings.xml b/java/com/android/dialer/calllogutils/res/values-uk/strings.xml index d9e155645..b2026c8ca 100644 --- a/java/com/android/dialer/calllogutils/res/values-uk/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-uk/strings.xml @@ -53,4 +53,5 @@ "на номер %1$s" "на %1$s на номер %2$s" "Голосова пошта" + "Зараз" diff --git a/java/com/android/dialer/calllogutils/res/values-ur/strings.xml b/java/com/android/dialer/calllogutils/res/values-ur/strings.xml index 4f73a49bd..d110d2250 100644 --- a/java/com/android/dialer/calllogutils/res/values-ur/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-ur/strings.xml @@ -34,8 +34,8 @@ "سیکنڈ" "%d %s %d %s" "%d %s" - "%s\'%s\' %s\'%s\'" - "%s\'%s\'" + "%s \'%s\' %s \'%s\'‎" + "%s \'%s\'‎" سیکنڈز سیکنڈ @@ -49,4 +49,5 @@ "بذریعہ %1$s" "%1$s پر، بذریعہ %2$s" "صوتی میل" + "ابھی" diff --git a/java/com/android/dialer/calllogutils/res/values-uz/strings.xml b/java/com/android/dialer/calllogutils/res/values-uz/strings.xml index b73ea5cff..dec50603f 100644 --- a/java/com/android/dialer/calllogutils/res/values-uz/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-uz/strings.xml @@ -49,4 +49,5 @@ "%1$s raqami orqali" "%1$s, %2$s raqami orqali" "Ovozli pochta" + "Hozir" diff --git a/java/com/android/dialer/calllogutils/res/values-vi/strings.xml b/java/com/android/dialer/calllogutils/res/values-vi/strings.xml index b583d4049..14d9695ff 100644 --- a/java/com/android/dialer/calllogutils/res/values-vi/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-vi/strings.xml @@ -49,4 +49,5 @@ "qua %1$s" "trên %1$s, qua %2$s" "Thư thoại" + "Bây giờ" diff --git a/java/com/android/dialer/calllogutils/res/values-zh-rCN/strings.xml b/java/com/android/dialer/calllogutils/res/values-zh-rCN/strings.xml index 9484e3b38..b9aca90f2 100644 --- a/java/com/android/dialer/calllogutils/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-zh-rCN/strings.xml @@ -49,4 +49,5 @@ "通过 %1$s" "帐号:%1$s,通过 %2$s" "语音邮件" + "现在" diff --git a/java/com/android/dialer/calllogutils/res/values-zh-rHK/strings.xml b/java/com/android/dialer/calllogutils/res/values-zh-rHK/strings.xml index 131e4ed6e..97fc21d72 100644 --- a/java/com/android/dialer/calllogutils/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-zh-rHK/strings.xml @@ -49,4 +49,5 @@ "透過 %1$s" "在 %1$s 上透過 %2$s" "留言" + "現在" diff --git a/java/com/android/dialer/calllogutils/res/values-zh-rTW/strings.xml b/java/com/android/dialer/calllogutils/res/values-zh-rTW/strings.xml index c06e5cded..d65f3c03c 100644 --- a/java/com/android/dialer/calllogutils/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-zh-rTW/strings.xml @@ -49,4 +49,5 @@ "透過 %1$s" "%1$s,透過 %2$s" "語音留言" + "剛剛" diff --git a/java/com/android/dialer/calllogutils/res/values-zu/strings.xml b/java/com/android/dialer/calllogutils/res/values-zu/strings.xml index f6a473971..90a80f089 100644 --- a/java/com/android/dialer/calllogutils/res/values-zu/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values-zu/strings.xml @@ -49,4 +49,5 @@ "nge-%1$s" "ku-%1$s, nge-%2$s" "Ivoyisimeyili" + "Manje" diff --git a/java/com/android/dialer/calllogutils/res/values/strings.xml b/java/com/android/dialer/calllogutils/res/values/strings.xml index 255990399..56cd94a9e 100644 --- a/java/com/android/dialer/calllogutils/res/values/strings.xml +++ b/java/com/android/dialer/calllogutils/res/values/strings.xml @@ -127,4 +127,7 @@ Voicemail + + + Now \ No newline at end of file diff --git a/java/com/android/dialer/common/AndroidManifest.xml b/java/com/android/dialer/common/AndroidManifest.xml index ae43d6693..8892b5871 100644 --- a/java/com/android/dialer/common/AndroidManifest.xml +++ b/java/com/android/dialer/common/AndroidManifest.xml @@ -1,3 +1,18 @@ + diff --git a/java/com/android/dialer/common/Assert.java b/java/com/android/dialer/common/Assert.java index 189d209c8..2d7f199ab 100644 --- a/java/com/android/dialer/common/Assert.java +++ b/java/com/android/dialer/common/Assert.java @@ -30,10 +30,6 @@ public class Assert { Assert.areThreadAssertsEnabled = areThreadAssertsEnabled; } - public static boolean areThreadAssertsEnabled() { - return areThreadAssertsEnabled; - } - /** * Called when a truly exceptional case occurs. * @@ -62,6 +58,11 @@ public class Assert { return new AssertionError(msg); } + @CheckReturnValue + public static AssertionError createAssertionFailException(String msg, Throwable reason) { + return new AssertionError(msg, reason); + } + @CheckReturnValue public static UnsupportedOperationException createUnsupportedOperationFailException() { return new UnsupportedOperationException(); diff --git a/java/com/android/dialer/common/ConfigProvider.java b/java/com/android/dialer/common/ConfigProvider.java deleted file mode 100644 index c0791e979..000000000 --- a/java/com/android/dialer/common/ConfigProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.dialer.common; - -/** Gets config values from the container application. */ -public interface ConfigProvider { - - String getString(String key, String defaultValue); - - long getLong(String key, long defaultValue); - - boolean getBoolean(String key, boolean defaultValue); -} diff --git a/java/com/android/dialer/common/ConfigProviderBindings.java b/java/com/android/dialer/common/ConfigProviderBindings.java deleted file mode 100644 index 9f045add4..000000000 --- a/java/com/android/dialer/common/ConfigProviderBindings.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.dialer.common; - -import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; -import android.support.v4.os.UserManagerCompat; - -/** Accessor for getting a {@link ConfigProvider}. */ -public class ConfigProviderBindings { - - private static ConfigProvider configProvider; - private static ConfigProvider configProviderStub; - - public static ConfigProvider get(@NonNull Context context) { - Assert.isNotNull(context); - if (configProvider != null) { - return configProvider; - } - if (!UserManagerCompat.isUserUnlocked(context)) { - if (configProviderStub == null) { - configProviderStub = new ConfigProviderStub(); - } - return configProviderStub; - } - - Context application = context.getApplicationContext(); - if (application instanceof ConfigProviderFactory) { - configProvider = ((ConfigProviderFactory) application).getConfigProvider(); - } - - if (configProvider == null) { - configProvider = new ConfigProviderStub(); - } - - return configProvider; - } - - @VisibleForTesting - public static void setForTesting(@Nullable ConfigProvider configProviderForTesting) { - configProvider = configProviderForTesting; - } - - private static class ConfigProviderStub implements ConfigProvider { - @Override - public String getString(String key, String defaultValue) { - return defaultValue; - } - - @Override - public long getLong(String key, long defaultValue) { - return defaultValue; - } - - @Override - public boolean getBoolean(String key, boolean defaultValue) { - return defaultValue; - } - } -} diff --git a/java/com/android/dialer/common/ConfigProviderFactory.java b/java/com/android/dialer/common/ConfigProviderFactory.java deleted file mode 100644 index aeb4f303a..000000000 --- a/java/com/android/dialer/common/ConfigProviderFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.dialer.common; - -/** - * This interface should be implementated by the Application subclass. It allows dialer code to get - * references to a config provider. - */ -public interface ConfigProviderFactory { - - ConfigProvider getConfigProvider(); -} diff --git a/java/com/android/dialer/common/FragmentUtils.java b/java/com/android/dialer/common/FragmentUtils.java index cb036959d..ad7ec7390 100644 --- a/java/com/android/dialer/common/FragmentUtils.java +++ b/java/com/android/dialer/common/FragmentUtils.java @@ -16,6 +16,7 @@ package com.android.dialer.common; +import android.app.Activity; import android.support.annotation.CheckResult; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -62,6 +63,33 @@ public class FragmentUtils { return null; } + /** Version of {@link #getParent(Fragment, Class)} which supports {@link android.app.Fragment}. */ + @CheckResult(suggest = "#checkParent(Fragment, Class)}") + @Nullable + public static T getParent( + @NonNull android.app.Fragment fragment, @NonNull Class callbackInterface) { + if (callbackInterface.isInstance(parentForTesting)) { + @SuppressWarnings("unchecked") // Casts are checked using runtime methods + T parent = (T) parentForTesting; + return parent; + } + + android.app.Fragment parentFragment = fragment.getParentFragment(); + if (callbackInterface.isInstance(parentFragment)) { + @SuppressWarnings("unchecked") // Casts are checked using runtime methods + T parent = (T) parentFragment; + return parent; + } else { + Activity activity = fragment.getActivity(); + if (callbackInterface.isInstance(activity)) { + @SuppressWarnings("unchecked") // Casts are checked using runtime methods + T parent = (T) activity; + return parent; + } + } + return null; + } + /** Returns the parent or throws. Should perform check elsewhere(e.g. onAttach, newInstance). */ @NonNull public static T getParentUnsafe( @@ -69,6 +97,16 @@ public class FragmentUtils { return Assert.isNotNull(getParent(fragment, callbackInterface)); } + /** + * Version of {@link #getParentUnsafe(Fragment, Class)} which supports {@link + * android.app.Fragment}. + */ + @NonNull + public static T getParentUnsafe( + @NonNull android.app.Fragment fragment, @NonNull Class callbackInterface) { + return Assert.isNotNull(getParent(fragment, callbackInterface)); + } + /** * Ensures fragment has a parent that implements the corresponding interface * diff --git a/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java index 4b6d81afd..a87bbceb4 100644 --- a/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java +++ b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java @@ -17,6 +17,7 @@ package com.android.dialer.common.concurrent; import android.app.FragmentManager; +import android.os.AsyncTask; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.android.dialer.common.Assert; @@ -25,9 +26,13 @@ import com.android.dialer.common.concurrent.DialerExecutor.Builder; import com.android.dialer.common.concurrent.DialerExecutor.FailureListener; import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener; import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; import javax.inject.Inject; /** The production {@link DialerExecutorFactory}. */ @@ -62,16 +67,16 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { throwable -> { throw new RuntimeException(throwable); }; - @Nullable final ExecutorService serialExecutorService; - @Nullable final ExecutorService parallelExecutorService; + @Nullable final ScheduledExecutorService serialExecutorService; + @Nullable final Executor parallelExecutor; BaseTaskBuilder( Worker worker, - @Nullable ExecutorService serialExecutorService, - @Nullable ExecutorService parallelExecutorService) { + @Nullable ScheduledExecutorService serialExecutorService, + @Nullable Executor parallelExecutor) { this.worker = worker; this.serialExecutorService = serialExecutorService; - this.parallelExecutorService = parallelExecutorService; + this.parallelExecutor = parallelExecutor; } @NonNull @@ -91,6 +96,19 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { /** Convenience class for use by {@link DialerExecutorFactory} implementations. */ public static class UiTaskBuilder extends BaseTaskBuilder { + private static final ScheduledExecutorService defaultSerialExecutorService = + Executors.newSingleThreadScheduledExecutor( + new ThreadFactory() { + @Override + public Thread newThread(Runnable runnable) { + LogUtil.i("UiTaskBuilder.newThread", "creating serial thread"); + Thread thread = new Thread(runnable, "UiTaskBuilder-Serial"); + thread.setPriority(5); // Corresponds to Process.THREAD_PRIORITY_DEFAULT + return thread; + } + }); + + private static final Executor defaultParallelExecutorService = AsyncTask.THREAD_POOL_EXECUTOR; private final FragmentManager fragmentManager; private final String id; @@ -102,16 +120,16 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { fragmentManager, id, worker, - null /* serialExecutorService */, - null /* parallelExecutorService */); + defaultSerialExecutorService, + defaultParallelExecutorService); } public UiTaskBuilder( FragmentManager fragmentManager, String id, Worker worker, - ExecutorService serialExecutor, - ExecutorService parallelExecutor) { + ScheduledExecutorService serialExecutor, + Executor parallelExecutor) { super(worker, serialExecutor, parallelExecutor); this.fragmentManager = fragmentManager; this.id = id; @@ -128,46 +146,36 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { super.successListener, super.failureListener, serialExecutorService, - parallelExecutorService); + parallelExecutor); return new UiDialerExecutor<>(dialerUiTaskFragment); } } /** Convenience class for use by {@link DialerExecutorFactory} implementations. */ public static class NonUiTaskBuilder extends BaseTaskBuilder { - private static final ExecutorService defaultSerialExecutorService = - Executors.newSingleThreadExecutor( + private static final ScheduledExecutorService defaultSerialExecutorService = + Executors.newSingleThreadScheduledExecutor( new ThreadFactory() { @Override public Thread newThread(Runnable runnable) { LogUtil.i("NonUiTaskBuilder.newThread", "creating serial thread"); - Thread thread = new Thread(runnable, "NonUiTaskBuilder"); + Thread thread = new Thread(runnable, "NonUiTaskBuilder-Serial"); thread.setPriority(4); // Corresponds to Process.THREAD_PRIORITY_BACKGROUND return thread; } }); - private static final ExecutorService defaultParallelExecutorService = - Executors.newFixedThreadPool( - 5, - new ThreadFactory() { - @Override - public Thread newThread(Runnable runnable) { - LogUtil.i("NonUiTaskBuilder.newThread", "creating parallel thread"); - Thread thread = new Thread(runnable, "NonUiTaskBuilder"); - thread.setPriority(4); // Corresponds to Process.THREAD_PRIORITY_BACKGROUND - return thread; - } - }); + private static final Executor defaultParallelExecutor = + DialerExecutors.getLowPriorityThreadPool(); NonUiTaskBuilder(Worker worker) { - this(worker, defaultSerialExecutorService, defaultParallelExecutorService); + this(worker, defaultSerialExecutorService, defaultParallelExecutor); } public NonUiTaskBuilder( Worker worker, - @NonNull ExecutorService serialExecutor, - @NonNull ExecutorService parallelExecutor) { + @NonNull ScheduledExecutorService serialExecutor, + @NonNull Executor parallelExecutor) { super(worker, Assert.isNotNull(serialExecutor), Assert.isNotNull(parallelExecutor)); } @@ -179,7 +187,7 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { super.successListener, super.failureListener, serialExecutorService, - parallelExecutorService); + parallelExecutor); } } @@ -196,6 +204,11 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { dialerUiTaskFragment.executeSerial(input); } + @Override + public void executeSerialWithWait(@Nullable InputT input, long waitMillis) { + dialerUiTaskFragment.executeSerialWithWait(input, waitMillis); + } + @Override public void executeParallel(@Nullable InputT input) { dialerUiTaskFragment.executeParallel(input); @@ -214,47 +227,59 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { private final SuccessListener successListener; private final FailureListener failureListener; - private final ExecutorService serialExecutorService; - private final ExecutorService parallelExecutorService; + private final ScheduledExecutorService serialExecutorService; + private final Executor parallelExecutor; + + private ScheduledFuture scheduledFuture; NonUiDialerExecutor( Worker worker, SuccessListener successListener, FailureListener failureListener, - ExecutorService serialExecutorService, - ExecutorService parallelExecutorService) { + ScheduledExecutorService serialExecutorService, + Executor parallelExecutor) { this.worker = worker; this.successListener = successListener; this.failureListener = failureListener; this.serialExecutorService = serialExecutorService; - this.parallelExecutorService = parallelExecutorService; + this.parallelExecutor = parallelExecutor; } @Override public void executeSerial(@Nullable InputT input) { - executeOnCustomExecutorService(serialExecutorService, input); + serialExecutorService.execute(() -> run(input)); + } + + @Override + public void executeSerialWithWait(@Nullable InputT input, long waitMillis) { + if (scheduledFuture != null) { + LogUtil.i("NonUiDialerExecutor.executeSerialWithWait", "cancelling waiting task"); + scheduledFuture.cancel(false /* mayInterrupt */); + } + scheduledFuture = + serialExecutorService.schedule(() -> run(input), waitMillis, TimeUnit.MILLISECONDS); } @Override public void executeParallel(@Nullable InputT input) { - executeOnCustomExecutorService(parallelExecutorService, input); + parallelExecutor.execute(() -> run(input)); } @Override public void executeOnCustomExecutorService( @NonNull ExecutorService executorService, @Nullable InputT input) { - Assert.isNotNull(executorService) - .execute( - () -> { - OutputT output; - try { - output = worker.doInBackground(input); - } catch (Throwable throwable) { - ThreadUtil.postOnUiThread(() -> failureListener.onFailure(throwable)); - return; - } - ThreadUtil.postOnUiThread(() -> successListener.onSuccess(output)); - }); + Assert.isNotNull(executorService).execute(() -> run(input)); + } + + private void run(@Nullable InputT input) { + OutputT output; + try { + output = worker.doInBackground(input); + } catch (Throwable throwable) { + ThreadUtil.postOnUiThread(() -> failureListener.onFailure(throwable)); + return; + } + ThreadUtil.postOnUiThread(() -> successListener.onSuccess(output)); } } } diff --git a/java/com/android/dialer/common/concurrent/DialerExecutor.java b/java/com/android/dialer/common/concurrent/DialerExecutor.java index 0237e3a05..0414581d4 100644 --- a/java/com/android/dialer/common/concurrent/DialerExecutor.java +++ b/java/com/android/dialer/common/concurrent/DialerExecutor.java @@ -83,6 +83,16 @@ public interface DialerExecutor { @MainThread void executeSerial(@Nullable InputT input); + /** + * Executes the task after waiting {@code waitMillis}. If called while the previous invocation is + * still waiting to be started, the original invocation is cancelled. + * + *

This is useful for tasks which might get scheduled many times in very quick succession, but + * it is only the last one that actually needs to be executed. + */ + @MainThread + void executeSerialWithWait(@Nullable InputT input, long waitMillis); + /** * Executes the task on a thread pool shared across the application. Multiple calls using this * method may result in tasks being executed in parallel. diff --git a/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java b/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java new file mode 100644 index 000000000..25033251f --- /dev/null +++ b/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.common.concurrent; + +import android.content.Context; +import com.android.dialer.inject.HasRootComponent; +import dagger.Subcomponent; + +/** Dagger component which provides a {@link DialerExecutorFactory}. */ +@Subcomponent +public abstract class DialerExecutorComponent { + + public abstract DialerExecutorFactory dialerExecutorFactory(); + + public static DialerExecutorComponent get(Context context) { + return ((DialerExecutorComponent.HasComponent) + ((HasRootComponent) context.getApplicationContext()).component()) + .dialerExecutorComponent(); + } + + /** Used to refer to the root application component. */ + public interface HasComponent { + DialerExecutorComponent dialerExecutorComponent(); + } +} diff --git a/java/com/android/dialer/common/concurrent/DialerExecutorModule.java b/java/com/android/dialer/common/concurrent/DialerExecutorModule.java new file mode 100644 index 000000000..281f88c15 --- /dev/null +++ b/java/com/android/dialer/common/concurrent/DialerExecutorModule.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.dialer.common.concurrent; + +import dagger.Binds; +import dagger.Module; + +/** Module which binds the production {@link DialerExecutorFactory}. */ +@Module +public abstract class DialerExecutorModule { + + @Binds + abstract DialerExecutorFactory bindDialerExecutorFactory( + DefaultDialerExecutorFactory defaultDialerExecutorFactory); +} diff --git a/java/com/android/dialer/common/concurrent/DialerExecutors.java b/java/com/android/dialer/common/concurrent/DialerExecutors.java index 148d8660c..81b3c5cb3 100644 --- a/java/com/android/dialer/common/concurrent/DialerExecutors.java +++ b/java/com/android/dialer/common/concurrent/DialerExecutors.java @@ -19,7 +19,11 @@ package com.android.dialer.common.concurrent; import android.app.FragmentManager; import android.support.annotation.NonNull; import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; /** * Factory methods for creating {@link DialerExecutor} objects for doing background work. @@ -131,4 +135,27 @@ public final class DialerExecutors { @NonNull Worker worker) { return new DefaultDialerExecutorFactory().createNonUiTaskBuilder(Assert.isNotNull(worker)); } + + private static final Executor lowPriorityThreadPool = + Executors.newFixedThreadPool( + 5, + new ThreadFactory() { + @Override + public Thread newThread(Runnable runnable) { + LogUtil.i("DialerExecutors.newThread", "creating low priority thread"); + Thread thread = new Thread(runnable, "DialerExecutors-LowPriority"); + thread.setPriority(4); // Corresponds to Process.THREAD_PRIORITY_BACKGROUND + return thread; + } + }); + + /** + * An application-wide thread pool used for low priority (non-UI) tasks. + * + *

This exists to prevent each individual dialer component from having to create its own + * threads/pools, which would result in the application having more threads than really necessary. + */ + public static Executor getLowPriorityThreadPool() { + return lowPriorityThreadPool; + } } diff --git a/java/com/android/dialer/common/concurrent/DialerUiTaskFragment.java b/java/com/android/dialer/common/concurrent/DialerUiTaskFragment.java index 627336895..f0b753758 100644 --- a/java/com/android/dialer/common/concurrent/DialerUiTaskFragment.java +++ b/java/com/android/dialer/common/concurrent/DialerUiTaskFragment.java @@ -18,17 +18,21 @@ package com.android.dialer.common.concurrent; import android.app.Fragment; import android.app.FragmentManager; -import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.MainThread; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.WorkerThread; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; -import com.android.dialer.common.concurrent.AsyncTaskExecutors.SimpleAsyncTaskExecutor; import com.android.dialer.common.concurrent.DialerExecutor.FailureListener; import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener; import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; /** * Do not use this class directly. Instead use {@link DialerExecutors}. @@ -38,13 +42,13 @@ import java.util.concurrent.ExecutorService; */ public final class DialerUiTaskFragment extends Fragment { - private String taskId; private Worker worker; private SuccessListener successListener; private FailureListener failureListener; - private AsyncTaskExecutor serialExecutor = AsyncTaskExecutors.createAsyncTaskExecutor(); - private AsyncTaskExecutor parallelExecutor = AsyncTaskExecutors.createThreadPoolExecutor(); + private ScheduledExecutorService serialExecutor; + private Executor parallelExecutor; + private ScheduledFuture scheduledFuture; /** * Creates a new {@link DialerUiTaskFragment} or gets an existing one in the event that a @@ -76,28 +80,23 @@ public final class DialerUiTaskFragment extends Fragment { Worker worker, SuccessListener successListener, FailureListener failureListener, - @Nullable ExecutorService serialExecutorService, - @Nullable ExecutorService parallelExecutorService) { + @NonNull ScheduledExecutorService serialExecutorService, + @NonNull Executor parallelExecutor) { Assert.isMainThread(); DialerUiTaskFragment fragment = (DialerUiTaskFragment) fragmentManager.findFragmentByTag(taskId); if (fragment == null) { - LogUtil.i("DialerUiTaskFragment.create", "creating new DialerUiTaskFragment"); + LogUtil.i("DialerUiTaskFragment.create", "creating new DialerUiTaskFragment for " + taskId); fragment = new DialerUiTaskFragment<>(); fragmentManager.beginTransaction().add(fragment, taskId).commit(); } - fragment.taskId = taskId; fragment.worker = worker; fragment.successListener = successListener; fragment.failureListener = failureListener; - if (serialExecutorService != null) { - fragment.serialExecutor = new SimpleAsyncTaskExecutor(serialExecutorService); - } - if (parallelExecutorService != null) { - fragment.parallelExecutor = new SimpleAsyncTaskExecutor(parallelExecutorService); - } + fragment.serialExecutor = Assert.isNotNull(serialExecutorService); + fragment.parallelExecutor = Assert.isNotNull(parallelExecutor); return fragment; } @@ -111,60 +110,75 @@ public final class DialerUiTaskFragment extends Fragment { public void onDetach() { super.onDetach(); LogUtil.enterBlock("DialerUiTaskFragment.onDetach"); - taskId = null; successListener = null; failureListener = null; + if (scheduledFuture != null) { + scheduledFuture.cancel(false /* mayInterrupt */); + scheduledFuture = null; + } } void executeSerial(InputT input) { - serialExecutor.submit(taskId, new InternalTask(), input); + serialExecutor.execute(() -> runTask(input)); + } + + void executeSerialWithWait(InputT input, long waitMillis) { + if (scheduledFuture != null) { + LogUtil.i("DialerUiTaskFragment.executeSerialWithWait", "cancelling waiting task"); + scheduledFuture.cancel(false /* mayInterrupt */); + } + scheduledFuture = + serialExecutor.schedule(() -> runTask(input), waitMillis, TimeUnit.MILLISECONDS); } void executeParallel(InputT input) { - parallelExecutor.submit(taskId, new InternalTask(), input); + parallelExecutor.execute(() -> runTask(input)); } void executeOnCustomExecutor(ExecutorService executor, InputT input) { - new SimpleAsyncTaskExecutor(executor).submit(taskId, new InternalTask(), input); + executor.execute(() -> runTask(input)); } - private final class InternalTask extends AsyncTask> { - - @SafeVarargs - @Override - protected final InternalTaskResult doInBackground(InputT... params) { - try { - return new InternalTaskResult<>(null, worker.doInBackground(params[0])); - } catch (Throwable throwable) { - LogUtil.e("InternalTask.doInBackground", "task failed", throwable); - return new InternalTaskResult<>(throwable, null); + @WorkerThread + private void runTask(@Nullable InputT input) { + try { + OutputT output = worker.doInBackground(input); + if (successListener == null) { + LogUtil.i("DialerUiTaskFragment.runTask", "task succeeded but UI is dead"); + } else { + ThreadUtil.postOnUiThread( + () -> { + // Even though there is a null check above, it is possible for the activity/fragment + // to be finished between the time the runnable is posted and the time it executes. Do + // an additional check here. + if (successListener == null) { + LogUtil.i( + "DialerUiTaskFragment.runTask", + "task succeeded but UI died after success runnable posted"); + } else { + successListener.onSuccess(output); + } + }); } - } - - @Override - protected void onPostExecute(InternalTaskResult result) { - if (result.throwable != null) { - if (failureListener == null) { - LogUtil.i("InternalTask.onPostExecute", "task failed but UI is dead"); - } else { - failureListener.onFailure(result.throwable); - } - } else if (successListener == null) { - LogUtil.i("InternalTask.onPostExecute", "task succeeded but UI is dead"); + } catch (Throwable throwable) { + LogUtil.e("DialerUiTaskFragment.runTask", "task failed", throwable); + if (failureListener == null) { + LogUtil.i("DialerUiTaskFragment.runTask", "task failed but UI is dead"); } else { - successListener.onSuccess(result.result); + ThreadUtil.postOnUiThread( + () -> { + // Even though there is a null check above, it is possible for the activity/fragment + // to be finished between the time the runnable is posted and the time it executes. Do + // an additional check here. + if (failureListener == null) { + LogUtil.i( + "DialerUiTaskFragment.runTask", + "task failed but UI died after failure runnable posted"); + } else { + failureListener.onFailure(throwable); + } + }); } } } - - private static class InternalTaskResult { - - private final Throwable throwable; - private final OutputT result; - - InternalTaskResult(Throwable throwable, OutputT result) { - this.throwable = throwable; - this.result = result; - } - } } diff --git a/java/com/android/dialer/common/concurrent/FallibleAsyncTask.java b/java/com/android/dialer/common/concurrent/FallibleAsyncTask.java index 6d02fe67f..c7a7f36a6 100644 --- a/java/com/android/dialer/common/concurrent/FallibleAsyncTask.java +++ b/java/com/android/dialer/common/concurrent/FallibleAsyncTask.java @@ -30,7 +30,9 @@ import com.google.auto.value.AutoValue; * @param the type of the parameters sent to the task upon execution * @param the type of the progress units published during the background computation * @param the type of the result of the background computation + * @deprecated Please use {@link DialerExecutors}. */ +@Deprecated public abstract class FallibleAsyncTask extends AsyncTask> { diff --git a/java/com/android/dialer/common/concurrent/ThreadUtil.java b/java/com/android/dialer/common/concurrent/ThreadUtil.java index 21cf4634e..39b6cceff 100644 --- a/java/com/android/dialer/common/concurrent/ThreadUtil.java +++ b/java/com/android/dialer/common/concurrent/ThreadUtil.java @@ -28,6 +28,11 @@ public class ThreadUtil { getUiThreadHandler().post(runnable); } + /** Posts a runnable to the UI thread, to be run after the specified amount of time elapses. */ + public static void postDelayedOnUiThread(Runnable runnable, long delayMillis) { + getUiThreadHandler().postDelayed(runnable, delayMillis); + } + /** Gets a handler which uses the main looper. */ public static Handler getUiThreadHandler() { if (mainThreadHandler == null) { diff --git a/java/com/android/dialer/common/database/Selection.java b/java/com/android/dialer/common/database/Selection.java new file mode 100644 index 000000000..b61472d2f --- /dev/null +++ b/java/com/android/dialer/common/database/Selection.java @@ -0,0 +1,260 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.common.database; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import com.android.dialer.common.Assert; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Utility to build SQL selections. Handles string concatenation, nested statements, empty + * statements, and tracks the selection arguments. + * + *

A selection can be build from a string, factory methods like {@link #column(String)}, or use + * {@link Builder} to build complex nested selection with multiple operators. The Selection manages + * the {@code selection} and {@code selectionArgs} passed into {@link + * android.content.ContentResolver#query(android.net.Uri, String[], String, String[], String)}. + * + *

Example: + * + *


+ *   fromString("foo = 1")
+ * 
+ * + * expands into "(foo = 1)", {} + * + *

+ * + *


+ *   column("foo").is("LIKE", "bar")
+ * 
+ * + * expands into "(foo LIKE ?)", {"bar"} + * + *

+ * + *


+ *   builder()
+ *     .and(
+ *       fromString("foo = ?", "1").buildUpon()
+ *       .or(column("bar").is("<", 2))
+ *       .build())
+ *     .and(not(column("baz").is("!= 3")))
+ *     .build();
+ * 
+ * + * expands into "(((foo = ?) OR (bar < ?)) AND (NOT (baz != 3)))", {"1", "2"} + */ +public final class Selection { + + private final String selection; + private final String[] selectionArgs; + + private Selection(@NonNull String selection, @NonNull String[] selectionArgs) { + this.selection = selection; + this.selectionArgs = selectionArgs; + } + + @NonNull + public String getSelection() { + return selection; + } + + @NonNull + public String[] getSelectionArgs() { + return selectionArgs; + } + + public boolean isEmpty() { + return selection.isEmpty(); + } + + /** + * @return a mutable builder that appends to the selection. The selection will be parenthesized + * before anything is appended to it. + */ + @NonNull + public Builder buildUpon() { + return new Builder(this); + } + + /** @return a builder that is empty. */ + @NonNull + public static Builder builder() { + return new Builder(); + } + + /** + * @return a Selection built from regular selection string/args pair. The result selection will be + * enclosed in a parenthesis. + */ + @NonNull + public static Selection fromString(@Nullable String selection, @Nullable String... args) { + return new Builder(selection, args).build(); + } + + /** @return a selection that is negated */ + @NonNull + public static Selection not(@NonNull Selection selection) { + Assert.checkArgument(!selection.isEmpty()); + return fromString("NOT " + selection.getSelection(), selection.getSelectionArgs()); + } + + /** + * Build a selection based on condition upon a column. is() should be called to complete the + * selection. + */ + @NonNull + public static Column column(@NonNull String column) { + return new Column(column); + } + + /** Helper class to build a selection based on condition upon a column. */ + public static class Column { + + @NonNull private final String column; + + private Column(@NonNull String column) { + this.column = Assert.isNotNull(column); + } + + /** Expands to " ?" and add {@code value} to the arguments. */ + @NonNull + public Selection is(@NonNull String operator, @NonNull Object value) { + return fromString(column + " " + Assert.isNotNull(operator) + " ?", value.toString()); + } + + /** + * Expands to " ". {@link #is(String, Object)} should be used if the condition + * is comparing to a string or a user input value, which must be sanitized. + */ + @NonNull + public Selection is(@NonNull String condition) { + return fromString(column + " " + Assert.isNotNull(condition)); + } + } + + /** Builder for {@link Selection} */ + public static final class Builder { + + private final StringBuilder selection = new StringBuilder(); + private final List selectionArgs = new ArrayList<>(); + + private Builder() {} + + private Builder(@Nullable String selection, @Nullable String... args) { + if (selection == null) { + return; + } + checkArgsCount(selection, args); + this.selection.append(parenthesized(selection)); + if (args != null) { + Collections.addAll(selectionArgs, args); + } + } + + private Builder(@NonNull Selection selection) { + this.selection.append(selection.getSelection()); + Collections.addAll(selectionArgs, selection.selectionArgs); + } + + @NonNull + public Selection build() { + if (selection.length() == 0) { + return new Selection("", new String[] {}); + } + return new Selection( + parenthesized(selection.toString()), + selectionArgs.toArray(new String[selectionArgs.size()])); + } + + @NonNull + public Builder and(@NonNull Selection selection) { + if (selection.isEmpty()) { + return this; + } + + if (this.selection.length() > 0) { + this.selection.append(" AND "); + } + this.selection.append(selection.getSelection()); + Collections.addAll(selectionArgs, selection.getSelectionArgs()); + return this; + } + + @NonNull + public Builder or(@NonNull Selection selection) { + if (selection.isEmpty()) { + return this; + } + + if (this.selection.length() > 0) { + this.selection.append(" OR "); + } + this.selection.append(selection.getSelection()); + Collections.addAll(selectionArgs, selection.getSelectionArgs()); + return this; + } + + private static void checkArgsCount(@NonNull String selection, @Nullable String... args) { + int argsInSelection = 0; + for (int i = 0; i < selection.length(); i++) { + if (selection.charAt(i) == '?') { + argsInSelection++; + } + } + Assert.checkArgument(argsInSelection == (args == null ? 0 : args.length)); + } + } + + /** + * Parenthesized the {@code string}. Will not parenthesized if {@code string} is empty or is + * already parenthesized (top level parenthesis encloses the whole string). + */ + @NonNull + private static String parenthesized(@NonNull String string) { + if (string.isEmpty()) { + return ""; + } + if (!string.startsWith("(")) { + return "(" + string + ")"; + } + int depth = 1; + for (int i = 1; i < string.length() - 1; i++) { + switch (string.charAt(i)) { + case '(': + depth++; + break; + case ')': + depth--; + if (depth == 0) { + // First '(' closed before the string has ended,need an additional level of nesting. + // For example "(A) AND (B)" should become "((A) AND (B))" + return "(" + string + ")"; + } + break; + default: + continue; + } + } + Assert.checkArgument(depth == 1); + return string; + } +} diff --git a/java/com/android/dialer/common/res/values-af/strings.xml b/java/com/android/dialer/common/res/values-af/strings.xml index 10f143177..2ddb36c75 100644 --- a/java/com/android/dialer/common/res/values-af/strings.xml +++ b/java/com/android/dialer/common/res/values-af/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-am/strings.xml b/java/com/android/dialer/common/res/values-am/strings.xml index 4d09ec67d..57f54d322 100644 --- a/java/com/android/dialer/common/res/values-am/strings.xml +++ b/java/com/android/dialer/common/res/values-am/strings.xml @@ -1,4 +1,20 @@ + + "ዋይፋይ" diff --git a/java/com/android/dialer/common/res/values-ar/strings.xml b/java/com/android/dialer/common/res/values-ar/strings.xml index 0e837c4b1..8d62e399e 100644 --- a/java/com/android/dialer/common/res/values-ar/strings.xml +++ b/java/com/android/dialer/common/res/values-ar/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-az/strings.xml b/java/com/android/dialer/common/res/values-az/strings.xml index 59ba93b19..29c9cce44 100644 --- a/java/com/android/dialer/common/res/values-az/strings.xml +++ b/java/com/android/dialer/common/res/values-az/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/common/res/values-b+sr+Latn/strings.xml index 52b5f67e6..c2e7e6b40 100644 --- a/java/com/android/dialer/common/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/common/res/values-b+sr+Latn/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-be/strings.xml b/java/com/android/dialer/common/res/values-be/strings.xml index 9bd978f3d..35a482fae 100644 --- a/java/com/android/dialer/common/res/values-be/strings.xml +++ b/java/com/android/dialer/common/res/values-be/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-bg/strings.xml b/java/com/android/dialer/common/res/values-bg/strings.xml index f36aae145..b598488a1 100644 --- a/java/com/android/dialer/common/res/values-bg/strings.xml +++ b/java/com/android/dialer/common/res/values-bg/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-bn/strings.xml b/java/com/android/dialer/common/res/values-bn/strings.xml index ed55edb96..a1e52ace5 100644 --- a/java/com/android/dialer/common/res/values-bn/strings.xml +++ b/java/com/android/dialer/common/res/values-bn/strings.xml @@ -1,4 +1,20 @@ + + "ওয়াই ফাই" diff --git a/java/com/android/dialer/common/res/values-bs/strings.xml b/java/com/android/dialer/common/res/values-bs/strings.xml index 537ccd8ba..85f48b82f 100644 --- a/java/com/android/dialer/common/res/values-bs/strings.xml +++ b/java/com/android/dialer/common/res/values-bs/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-ca/strings.xml b/java/com/android/dialer/common/res/values-ca/strings.xml index 8d095c76d..cffdbea7b 100644 --- a/java/com/android/dialer/common/res/values-ca/strings.xml +++ b/java/com/android/dialer/common/res/values-ca/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-cs/strings.xml b/java/com/android/dialer/common/res/values-cs/strings.xml index c6a50bb6a..f8eeeec5e 100644 --- a/java/com/android/dialer/common/res/values-cs/strings.xml +++ b/java/com/android/dialer/common/res/values-cs/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-da/strings.xml b/java/com/android/dialer/common/res/values-da/strings.xml index 00df25aea..57e6e0bd2 100644 --- a/java/com/android/dialer/common/res/values-da/strings.xml +++ b/java/com/android/dialer/common/res/values-da/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-de/strings.xml b/java/com/android/dialer/common/res/values-de/strings.xml index 9a54083a1..676159441 100644 --- a/java/com/android/dialer/common/res/values-de/strings.xml +++ b/java/com/android/dialer/common/res/values-de/strings.xml @@ -1,4 +1,20 @@ + + "WLAN" diff --git a/java/com/android/dialer/common/res/values-el/strings.xml b/java/com/android/dialer/common/res/values-el/strings.xml index 43c28ca41..4896004de 100644 --- a/java/com/android/dialer/common/res/values-el/strings.xml +++ b/java/com/android/dialer/common/res/values-el/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-en-rAU/strings.xml b/java/com/android/dialer/common/res/values-en-rAU/strings.xml index dbc7a0c66..29ff1e1e8 100644 --- a/java/com/android/dialer/common/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/common/res/values-en-rAU/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-en-rGB/strings.xml b/java/com/android/dialer/common/res/values-en-rGB/strings.xml index dbc7a0c66..29ff1e1e8 100644 --- a/java/com/android/dialer/common/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/common/res/values-en-rGB/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-en-rIN/strings.xml b/java/com/android/dialer/common/res/values-en-rIN/strings.xml index dbc7a0c66..29ff1e1e8 100644 --- a/java/com/android/dialer/common/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/common/res/values-en-rIN/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-es-rUS/strings.xml b/java/com/android/dialer/common/res/values-es-rUS/strings.xml index 2c219a652..15bd5f6cd 100644 --- a/java/com/android/dialer/common/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/common/res/values-es-rUS/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-es/strings.xml b/java/com/android/dialer/common/res/values-es/strings.xml index 2449b3386..154aa13d9 100644 --- a/java/com/android/dialer/common/res/values-es/strings.xml +++ b/java/com/android/dialer/common/res/values-es/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-et/strings.xml b/java/com/android/dialer/common/res/values-et/strings.xml index 414f78541..af6dd6ac8 100644 --- a/java/com/android/dialer/common/res/values-et/strings.xml +++ b/java/com/android/dialer/common/res/values-et/strings.xml @@ -1,4 +1,20 @@ + + "WiFi" diff --git a/java/com/android/dialer/common/res/values-eu/strings.xml b/java/com/android/dialer/common/res/values-eu/strings.xml index f0f14de5f..d4c3cd82e 100644 --- a/java/com/android/dialer/common/res/values-eu/strings.xml +++ b/java/com/android/dialer/common/res/values-eu/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-fa/strings.xml b/java/com/android/dialer/common/res/values-fa/strings.xml index 04c690785..a9d798edb 100644 --- a/java/com/android/dialer/common/res/values-fa/strings.xml +++ b/java/com/android/dialer/common/res/values-fa/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-fi/strings.xml b/java/com/android/dialer/common/res/values-fi/strings.xml index 1671a9abc..8ff088c48 100644 --- a/java/com/android/dialer/common/res/values-fi/strings.xml +++ b/java/com/android/dialer/common/res/values-fi/strings.xml @@ -1,4 +1,20 @@ + + "Wi‑Fi" diff --git a/java/com/android/dialer/common/res/values-fr-rCA/strings.xml b/java/com/android/dialer/common/res/values-fr-rCA/strings.xml index 47828be9e..46172f806 100644 --- a/java/com/android/dialer/common/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/common/res/values-fr-rCA/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-fr/strings.xml b/java/com/android/dialer/common/res/values-fr/strings.xml index dbc7a0c66..29ff1e1e8 100644 --- a/java/com/android/dialer/common/res/values-fr/strings.xml +++ b/java/com/android/dialer/common/res/values-fr/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-gl/strings.xml b/java/com/android/dialer/common/res/values-gl/strings.xml index 9b5e174f4..6a287e549 100644 --- a/java/com/android/dialer/common/res/values-gl/strings.xml +++ b/java/com/android/dialer/common/res/values-gl/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-gu/strings.xml b/java/com/android/dialer/common/res/values-gu/strings.xml index 0d0f4edbe..9a565ebda 100644 --- a/java/com/android/dialer/common/res/values-gu/strings.xml +++ b/java/com/android/dialer/common/res/values-gu/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-hi/strings.xml b/java/com/android/dialer/common/res/values-hi/strings.xml index bb064b421..198386941 100644 --- a/java/com/android/dialer/common/res/values-hi/strings.xml +++ b/java/com/android/dialer/common/res/values-hi/strings.xml @@ -1,4 +1,20 @@ + + "वाई-फ़ाई" diff --git a/java/com/android/dialer/common/res/values-hr/strings.xml b/java/com/android/dialer/common/res/values-hr/strings.xml index e2e3b7132..94c26645d 100644 --- a/java/com/android/dialer/common/res/values-hr/strings.xml +++ b/java/com/android/dialer/common/res/values-hr/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-hu/strings.xml b/java/com/android/dialer/common/res/values-hu/strings.xml index 00df25aea..57e6e0bd2 100644 --- a/java/com/android/dialer/common/res/values-hu/strings.xml +++ b/java/com/android/dialer/common/res/values-hu/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-hy/strings.xml b/java/com/android/dialer/common/res/values-hy/strings.xml index 1de9c40f3..6e78fe8c2 100644 --- a/java/com/android/dialer/common/res/values-hy/strings.xml +++ b/java/com/android/dialer/common/res/values-hy/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-in/strings.xml b/java/com/android/dialer/common/res/values-in/strings.xml index f531e13a1..85df71786 100644 --- a/java/com/android/dialer/common/res/values-in/strings.xml +++ b/java/com/android/dialer/common/res/values-in/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-is/strings.xml b/java/com/android/dialer/common/res/values-is/strings.xml index c77dddfa6..987beccba 100644 --- a/java/com/android/dialer/common/res/values-is/strings.xml +++ b/java/com/android/dialer/common/res/values-is/strings.xml @@ -1,4 +1,20 @@ + + "WiFi" diff --git a/java/com/android/dialer/common/res/values-it/strings.xml b/java/com/android/dialer/common/res/values-it/strings.xml index 04ac19821..8166c397c 100644 --- a/java/com/android/dialer/common/res/values-it/strings.xml +++ b/java/com/android/dialer/common/res/values-it/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-iw/strings.xml b/java/com/android/dialer/common/res/values-iw/strings.xml index 2f240bbe9..61900453b 100644 --- a/java/com/android/dialer/common/res/values-iw/strings.xml +++ b/java/com/android/dialer/common/res/values-iw/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-ja/strings.xml b/java/com/android/dialer/common/res/values-ja/strings.xml index 938f21dd6..3a883ccab 100644 --- a/java/com/android/dialer/common/res/values-ja/strings.xml +++ b/java/com/android/dialer/common/res/values-ja/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-ka/strings.xml b/java/com/android/dialer/common/res/values-ka/strings.xml index 224fb869e..65acee5c5 100644 --- a/java/com/android/dialer/common/res/values-ka/strings.xml +++ b/java/com/android/dialer/common/res/values-ka/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-kk/strings.xml b/java/com/android/dialer/common/res/values-kk/strings.xml index 88be76909..57bd24571 100644 --- a/java/com/android/dialer/common/res/values-kk/strings.xml +++ b/java/com/android/dialer/common/res/values-kk/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-km/strings.xml b/java/com/android/dialer/common/res/values-km/strings.xml index b8fe6c7d3..0788d9491 100644 --- a/java/com/android/dialer/common/res/values-km/strings.xml +++ b/java/com/android/dialer/common/res/values-km/strings.xml @@ -1,4 +1,20 @@ + + "វ៉ាយហ្វាយ" diff --git a/java/com/android/dialer/common/res/values-kn/strings.xml b/java/com/android/dialer/common/res/values-kn/strings.xml index de4b8de71..c854b0abf 100644 --- a/java/com/android/dialer/common/res/values-kn/strings.xml +++ b/java/com/android/dialer/common/res/values-kn/strings.xml @@ -1,4 +1,20 @@ + + "ವೈಫೈ" diff --git a/java/com/android/dialer/common/res/values-ko/strings.xml b/java/com/android/dialer/common/res/values-ko/strings.xml index 89b6c07f7..bbe7c8f57 100644 --- a/java/com/android/dialer/common/res/values-ko/strings.xml +++ b/java/com/android/dialer/common/res/values-ko/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-ky/strings.xml b/java/com/android/dialer/common/res/values-ky/strings.xml index 7630f31bf..f2f5279f0 100644 --- a/java/com/android/dialer/common/res/values-ky/strings.xml +++ b/java/com/android/dialer/common/res/values-ky/strings.xml @@ -1,4 +1,20 @@ + + "Wi‑Fi" diff --git a/java/com/android/dialer/common/res/values-lo/strings.xml b/java/com/android/dialer/common/res/values-lo/strings.xml index 9496a6783..5433ce887 100644 --- a/java/com/android/dialer/common/res/values-lo/strings.xml +++ b/java/com/android/dialer/common/res/values-lo/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-lt/strings.xml b/java/com/android/dialer/common/res/values-lt/strings.xml index e3b0355ae..78e0934e6 100644 --- a/java/com/android/dialer/common/res/values-lt/strings.xml +++ b/java/com/android/dialer/common/res/values-lt/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-lv/strings.xml b/java/com/android/dialer/common/res/values-lv/strings.xml index 1cece961b..e857929af 100644 --- a/java/com/android/dialer/common/res/values-lv/strings.xml +++ b/java/com/android/dialer/common/res/values-lv/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-mk/strings.xml b/java/com/android/dialer/common/res/values-mk/strings.xml index 928c6d267..4ccf6bbc1 100644 --- a/java/com/android/dialer/common/res/values-mk/strings.xml +++ b/java/com/android/dialer/common/res/values-mk/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-ml/strings.xml b/java/com/android/dialer/common/res/values-ml/strings.xml index fe40cf57f..0f10d38e0 100644 --- a/java/com/android/dialer/common/res/values-ml/strings.xml +++ b/java/com/android/dialer/common/res/values-ml/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-mn/strings.xml b/java/com/android/dialer/common/res/values-mn/strings.xml index 7f23d3215..1ac0f00a7 100644 --- a/java/com/android/dialer/common/res/values-mn/strings.xml +++ b/java/com/android/dialer/common/res/values-mn/strings.xml @@ -1,4 +1,20 @@ + + "WiFi" diff --git a/java/com/android/dialer/common/res/values-mr/strings.xml b/java/com/android/dialer/common/res/values-mr/strings.xml index d860dba4e..491f0c09f 100644 --- a/java/com/android/dialer/common/res/values-mr/strings.xml +++ b/java/com/android/dialer/common/res/values-mr/strings.xml @@ -1,4 +1,20 @@ + + "वायफाय" diff --git a/java/com/android/dialer/common/res/values-ms/strings.xml b/java/com/android/dialer/common/res/values-ms/strings.xml index 2ebf4feaf..3ef6055d5 100644 --- a/java/com/android/dialer/common/res/values-ms/strings.xml +++ b/java/com/android/dialer/common/res/values-ms/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-my/strings.xml b/java/com/android/dialer/common/res/values-my/strings.xml index 314613a93..c21112217 100644 --- a/java/com/android/dialer/common/res/values-my/strings.xml +++ b/java/com/android/dialer/common/res/values-my/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-nb/strings.xml b/java/com/android/dialer/common/res/values-nb/strings.xml index 00df25aea..57e6e0bd2 100644 --- a/java/com/android/dialer/common/res/values-nb/strings.xml +++ b/java/com/android/dialer/common/res/values-nb/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-ne/strings.xml b/java/com/android/dialer/common/res/values-ne/strings.xml index 287d78d55..103f81f5f 100644 --- a/java/com/android/dialer/common/res/values-ne/strings.xml +++ b/java/com/android/dialer/common/res/values-ne/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-nl/strings.xml b/java/com/android/dialer/common/res/values-nl/strings.xml index a89409564..7b9745e7e 100644 --- a/java/com/android/dialer/common/res/values-nl/strings.xml +++ b/java/com/android/dialer/common/res/values-nl/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-no/strings.xml b/java/com/android/dialer/common/res/values-no/strings.xml index 00df25aea..57e6e0bd2 100644 --- a/java/com/android/dialer/common/res/values-no/strings.xml +++ b/java/com/android/dialer/common/res/values-no/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-pa/strings.xml b/java/com/android/dialer/common/res/values-pa/strings.xml index 2dfa4235e..b656d1918 100644 --- a/java/com/android/dialer/common/res/values-pa/strings.xml +++ b/java/com/android/dialer/common/res/values-pa/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-pl/strings.xml b/java/com/android/dialer/common/res/values-pl/strings.xml index 6999a90a0..b6f4eb4b4 100644 --- a/java/com/android/dialer/common/res/values-pl/strings.xml +++ b/java/com/android/dialer/common/res/values-pl/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-pt-rBR/strings.xml b/java/com/android/dialer/common/res/values-pt-rBR/strings.xml index 77a4002b3..08e06446c 100644 --- a/java/com/android/dialer/common/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/common/res/values-pt-rBR/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-pt-rPT/strings.xml b/java/com/android/dialer/common/res/values-pt-rPT/strings.xml index 4649c4242..a8765657e 100644 --- a/java/com/android/dialer/common/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/common/res/values-pt-rPT/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-pt/strings.xml b/java/com/android/dialer/common/res/values-pt/strings.xml index 77a4002b3..08e06446c 100644 --- a/java/com/android/dialer/common/res/values-pt/strings.xml +++ b/java/com/android/dialer/common/res/values-pt/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-ro/strings.xml b/java/com/android/dialer/common/res/values-ro/strings.xml index 00df25aea..57e6e0bd2 100644 --- a/java/com/android/dialer/common/res/values-ro/strings.xml +++ b/java/com/android/dialer/common/res/values-ro/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-ru/strings.xml b/java/com/android/dialer/common/res/values-ru/strings.xml index cbc88730b..2b5a0d151 100644 --- a/java/com/android/dialer/common/res/values-ru/strings.xml +++ b/java/com/android/dialer/common/res/values-ru/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-si/strings.xml b/java/com/android/dialer/common/res/values-si/strings.xml index b9babc64f..4df629d30 100644 --- a/java/com/android/dialer/common/res/values-si/strings.xml +++ b/java/com/android/dialer/common/res/values-si/strings.xml @@ -1,4 +1,20 @@ + + "WiFi" diff --git a/java/com/android/dialer/common/res/values-sk/strings.xml b/java/com/android/dialer/common/res/values-sk/strings.xml index 00df25aea..57e6e0bd2 100644 --- a/java/com/android/dialer/common/res/values-sk/strings.xml +++ b/java/com/android/dialer/common/res/values-sk/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-sl/strings.xml b/java/com/android/dialer/common/res/values-sl/strings.xml index eb4094eaa..5a2203a4d 100644 --- a/java/com/android/dialer/common/res/values-sl/strings.xml +++ b/java/com/android/dialer/common/res/values-sl/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-sq/strings.xml b/java/com/android/dialer/common/res/values-sq/strings.xml index 9b58fbcb0..82ed73909 100644 --- a/java/com/android/dialer/common/res/values-sq/strings.xml +++ b/java/com/android/dialer/common/res/values-sq/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-sr/strings.xml b/java/com/android/dialer/common/res/values-sr/strings.xml index 8b387e6ef..4c164f443 100644 --- a/java/com/android/dialer/common/res/values-sr/strings.xml +++ b/java/com/android/dialer/common/res/values-sr/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-sv/strings.xml b/java/com/android/dialer/common/res/values-sv/strings.xml index 00df25aea..57e6e0bd2 100644 --- a/java/com/android/dialer/common/res/values-sv/strings.xml +++ b/java/com/android/dialer/common/res/values-sv/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-sw/strings.xml b/java/com/android/dialer/common/res/values-sw/strings.xml index df0b97d29..48d0b35d9 100644 --- a/java/com/android/dialer/common/res/values-sw/strings.xml +++ b/java/com/android/dialer/common/res/values-sw/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-ta/strings.xml b/java/com/android/dialer/common/res/values-ta/strings.xml index fbce62cfc..b3b5e3290 100644 --- a/java/com/android/dialer/common/res/values-ta/strings.xml +++ b/java/com/android/dialer/common/res/values-ta/strings.xml @@ -1,4 +1,20 @@ + + "வைஃபை" diff --git a/java/com/android/dialer/common/res/values-te/strings.xml b/java/com/android/dialer/common/res/values-te/strings.xml index af1a43cad..aafec37f1 100644 --- a/java/com/android/dialer/common/res/values-te/strings.xml +++ b/java/com/android/dialer/common/res/values-te/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-th/strings.xml b/java/com/android/dialer/common/res/values-th/strings.xml index 1ea62f303..38c5f83c0 100644 --- a/java/com/android/dialer/common/res/values-th/strings.xml +++ b/java/com/android/dialer/common/res/values-th/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-tl/strings.xml b/java/com/android/dialer/common/res/values-tl/strings.xml index d9e8519d0..a11c8ee5b 100644 --- a/java/com/android/dialer/common/res/values-tl/strings.xml +++ b/java/com/android/dialer/common/res/values-tl/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-tr/strings.xml b/java/com/android/dialer/common/res/values-tr/strings.xml index 57c66b548..14dd7814d 100644 --- a/java/com/android/dialer/common/res/values-tr/strings.xml +++ b/java/com/android/dialer/common/res/values-tr/strings.xml @@ -1,4 +1,20 @@ + + "Kablosuz" diff --git a/java/com/android/dialer/common/res/values-uk/strings.xml b/java/com/android/dialer/common/res/values-uk/strings.xml index 0d94f71f3..d44b19a41 100644 --- a/java/com/android/dialer/common/res/values-uk/strings.xml +++ b/java/com/android/dialer/common/res/values-uk/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-ur/strings.xml b/java/com/android/dialer/common/res/values-ur/strings.xml index f21549ef0..67749918b 100644 --- a/java/com/android/dialer/common/res/values-ur/strings.xml +++ b/java/com/android/dialer/common/res/values-ur/strings.xml @@ -1,4 +1,20 @@ + + "Wifi" diff --git a/java/com/android/dialer/common/res/values-uz/strings.xml b/java/com/android/dialer/common/res/values-uz/strings.xml index 447825a6f..6865409e9 100644 --- a/java/com/android/dialer/common/res/values-uz/strings.xml +++ b/java/com/android/dialer/common/res/values-uz/strings.xml @@ -1,4 +1,20 @@ + + "WI-FI" diff --git a/java/com/android/dialer/common/res/values-vi/strings.xml b/java/com/android/dialer/common/res/values-vi/strings.xml index 574e92633..469ee85c6 100644 --- a/java/com/android/dialer/common/res/values-vi/strings.xml +++ b/java/com/android/dialer/common/res/values-vi/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-zh-rCN/strings.xml b/java/com/android/dialer/common/res/values-zh-rCN/strings.xml index 202aa7f10..0b7e64a88 100644 --- a/java/com/android/dialer/common/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/common/res/values-zh-rCN/strings.xml @@ -1,4 +1,20 @@ + + "WLAN" diff --git a/java/com/android/dialer/common/res/values-zh-rHK/strings.xml b/java/com/android/dialer/common/res/values-zh-rHK/strings.xml index 454b65e7c..789cb1cf1 100644 --- a/java/com/android/dialer/common/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/common/res/values-zh-rHK/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-zh-rTW/strings.xml b/java/com/android/dialer/common/res/values-zh-rTW/strings.xml index 8b5f2b5e3..6da96b534 100644 --- a/java/com/android/dialer/common/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/common/res/values-zh-rTW/strings.xml @@ -1,4 +1,20 @@ + + "Wi-Fi" diff --git a/java/com/android/dialer/common/res/values-zu/strings.xml b/java/com/android/dialer/common/res/values-zu/strings.xml index bfa458d05..a953ab0ae 100644 --- a/java/com/android/dialer/common/res/values-zu/strings.xml +++ b/java/com/android/dialer/common/res/values-zu/strings.xml @@ -1,4 +1,20 @@ + + "I-Wi-Fi" diff --git a/java/com/android/dialer/common/res/values/config.xml b/java/com/android/dialer/common/res/values/config.xml deleted file mode 100644 index c4df279ba..000000000 --- a/java/com/android/dialer/common/res/values/config.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - false - \ No newline at end of file diff --git a/java/com/android/dialer/common/res/values/strings.xml b/java/com/android/dialer/common/res/values/strings.xml index 8e9616178..770f42f37 100644 --- a/java/com/android/dialer/common/res/values/strings.xml +++ b/java/com/android/dialer/common/res/values/strings.xml @@ -1,4 +1,19 @@ + Wifi Mobile diff --git a/java/com/android/dialer/compat/CompatUtils.java b/java/com/android/dialer/compat/CompatUtils.java index 673cb709b..584f20549 100644 --- a/java/com/android/dialer/compat/CompatUtils.java +++ b/java/com/android/dialer/compat/CompatUtils.java @@ -15,16 +15,15 @@ */ package com.android.dialer.compat; +import android.content.Context; import android.os.Build; -import android.support.annotation.Nullable; -import android.text.TextUtils; -import android.util.Log; -import java.lang.reflect.InvocationTargetException; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.os.LocaleList; +import java.util.Locale; public final class CompatUtils { - private static final String TAG = CompatUtils.class.getSimpleName(); - /** PrioritizedMimeType is added in API level 23. */ public static boolean hasPrioritizedMimeType() { return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M; @@ -71,152 +70,16 @@ public final class CompatUtils { return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.LOLLIPOP) >= Build.VERSION_CODES.M; } - /** - * Determines if this version is compatible with a default dialer. Can also force the version to - * be lower through {@link SdkVersionOverride}. - * - * @return {@code true} if default dialer is a feature on this device, {@code false} otherwise. - */ - public static boolean isDefaultDialerCompatible() { - return isMarshmallowCompatible(); - } - - /** - * Determines if this version is compatible with Lollipop Mr1-specific APIs. Can also force the - * version to be lower through SdkVersionOverride. - * - * @return {@code true} if runtime sdk is compatible with Lollipop MR1, {@code false} otherwise. - */ - public static boolean isLollipopMr1Compatible() { - return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.LOLLIPOP_MR1) - >= Build.VERSION_CODES.LOLLIPOP_MR1; - } - - /** - * Determines if this version is compatible with Marshmallow-specific APIs. Can also force the - * version to be lower through SdkVersionOverride. - * - * @return {@code true} if runtime sdk is compatible with Marshmallow, {@code false} otherwise. - */ - public static boolean isMarshmallowCompatible() { - return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.LOLLIPOP) >= Build.VERSION_CODES.M; - } - - /** - * Determines if the given class is available. Can be used to check if system apis exist at - * runtime. - * - * @param className the name of the class to look for. - * @return {@code true} if the given class is available, {@code false} otherwise or if className - * is empty. - */ - public static boolean isClassAvailable(@Nullable String className) { - if (TextUtils.isEmpty(className)) { - return false; + /** Returns locale of the device. */ + public static Locale getLocale(Context context) { + if (VERSION.SDK_INT >= VERSION_CODES.N) { + LocaleList localList = context.getResources().getConfiguration().getLocales(); + if (!localList.isEmpty()) { + return localList.get(0); + } + return Locale.getDefault(); + } else { + return context.getResources().getConfiguration().locale; } - try { - Class.forName(className); - return true; - } catch (ClassNotFoundException e) { - return false; - } catch (Throwable t) { - Log.e( - TAG, - "Unexpected exception when checking if class:" + className + " exists at " + "runtime", - t); - return false; - } - } - - /** - * Determines if the given class's method is available to call. Can be used to check if system - * apis exist at runtime. - * - * @param className the name of the class to look for - * @param methodName the name of the method to look for - * @param parameterTypes the needed parameter types for the method to look for - * @return {@code true} if the given class is available, {@code false} otherwise or if className - * or methodName are empty. - */ - public static boolean isMethodAvailable( - @Nullable String className, @Nullable String methodName, Class... parameterTypes) { - if (TextUtils.isEmpty(className) || TextUtils.isEmpty(methodName)) { - return false; - } - - try { - Class.forName(className).getMethod(methodName, parameterTypes); - return true; - } catch (ClassNotFoundException | NoSuchMethodException e) { - Log.v(TAG, "Could not find method: " + className + "#" + methodName); - return false; - } catch (Throwable t) { - Log.e( - TAG, - "Unexpected exception when checking if method: " - + className - + "#" - + methodName - + " exists at runtime", - t); - return false; - } - } - - /** - * Invokes a given class's method using reflection. Can be used to call system apis that exist at - * runtime but not in the SDK. - * - * @param instance The instance of the class to invoke the method on. - * @param methodName The name of the method to invoke. - * @param parameterTypes The needed parameter types for the method. - * @param parameters The parameter values to pass into the method. - * @return The result of the invocation or {@code null} if instance or methodName are empty, or if - * the reflection fails. - */ - @Nullable - public static Object invokeMethod( - @Nullable Object instance, - @Nullable String methodName, - Class[] parameterTypes, - Object[] parameters) { - if (instance == null || TextUtils.isEmpty(methodName)) { - return null; - } - - String className = instance.getClass().getName(); - try { - return Class.forName(className) - .getMethod(methodName, parameterTypes) - .invoke(instance, parameters); - } catch (ClassNotFoundException - | NoSuchMethodException - | IllegalArgumentException - | IllegalAccessException - | InvocationTargetException e) { - Log.v(TAG, "Could not invoke method: " + className + "#" + methodName); - return null; - } catch (Throwable t) { - Log.e( - TAG, - "Unexpected exception when invoking method: " - + className - + "#" - + methodName - + " at runtime", - t); - return null; - } - } - - /** - * Determines if this version is compatible with Lollipop-specific APIs. Can also force the - * version to be lower through SdkVersionOverride. - * - * @return {@code true} if call subject is a feature on this device, {@code false} otherwise. - */ - public static boolean isLollipopCompatible() { - return SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.LOLLIPOP) - >= Build.VERSION_CODES.LOLLIPOP; } } diff --git a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java new file mode 100644 index 000000000..22ec70cba --- /dev/null +++ b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.compat.telephony; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.support.annotation.Nullable; +import android.support.v4.os.BuildCompat; +import android.telecom.PhoneAccountHandle; +import android.telephony.TelephonyManager; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.telecom.TelecomUtil; +import java.lang.reflect.InvocationTargetException; + +public class TelephonyManagerCompat { + + // TODO(maxwelb): Use public API for these constants when available + public static final String EVENT_HANDOVER_VIDEO_FROM_WIFI_TO_LTE = + "android.telephony.event.EVENT_HANDOVER_VIDEO_FROM_WIFI_TO_LTE"; + public static final String EVENT_HANDOVER_TO_WIFI_FAILED = + "android.telephony.event.EVENT_HANDOVER_TO_WIFI_FAILED"; + public static final String EVENT_CALL_REMOTELY_HELD = "android.telecom.event.CALL_REMOTELY_HELD"; + public static final String EVENT_CALL_REMOTELY_UNHELD = + "android.telecom.event.CALL_REMOTELY_UNHELD"; + public static final String EVENT_MERGE_START = "android.telecom.event.MERGE_START"; + public static final String EVENT_MERGE_COMPLETE = "android.telecom.event.MERGE_COMPLETE"; + + public static final String EVENT_NOTIFY_INTERNATIONAL_CALL_ON_WFC = + "android.telephony.event.EVENT_NOTIFY_INTERNATIONAL_CALL_ON_WFC"; + + public static final String TELEPHONY_MANAGER_CLASS = "android.telephony.TelephonyManager"; + + private static final String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE"; + + // TODO(erfanian): b/63995261 Replace with the platform/telecom constant when available. + /** + * Indicates that the call being placed originated from a known contact. + * + *

This signals to the telephony platform that an outgoing call qualifies for assisted dialing. + */ + public static final String ALLOW_ASSISTED_DIAL = "android.telecom.extra.ALLOW_ASSISTED_DIAL"; + + // TODO(erfanian): b/63995261 Replace with the platform/telecom constant when available. + /** + * Indicates that an outgoing call has undergone assisted dialing. + * + *

Unlike {@link ALLOW_ASSISTED_DIAL}, the presence of this key further indicates that a call + * has undergone Assisted Dialing -- not just that it qualified for Assisted Dialing. + */ + public static final String IS_ASSISTED_DIALED = "android.telecom.extra.IS_ASSISTED_DIALED"; + + /** + * Returns the number of phones available. Returns 1 for Single standby mode (Single SIM + * functionality) Returns 2 for Dual standby mode.(Dual SIM functionality) + * + *

Returns 1 if the method or telephonyManager is not available. + * + * @param telephonyManager The telephony manager instance to use for method calls. + */ + public static int getPhoneCount(@Nullable TelephonyManager telephonyManager) { + if (telephonyManager == null) { + return 1; + } + return telephonyManager.getPhoneCount(); + } + + /** + * Whether the phone supports TTY mode. + * + * @param telephonyManager The telephony manager instance to use for method calls. + * @return {@code true} if the device supports TTY mode, and {@code false} otherwise. + */ + public static boolean isTtyModeSupported(@Nullable TelephonyManager telephonyManager) { + return telephonyManager != null && telephonyManager.isTtyModeSupported(); + } + + /** + * Whether the phone supports hearing aid compatibility. + * + * @param telephonyManager The telephony manager instance to use for method calls. + * @return {@code true} if the device supports hearing aid compatibility, and {@code false} + * otherwise. + */ + public static boolean isHearingAidCompatibilitySupported( + @Nullable TelephonyManager telephonyManager) { + return telephonyManager != null && telephonyManager.isHearingAidCompatibilitySupported(); + } + + /** + * Returns the URI for the per-account voicemail ringtone set in Phone settings. + * + * @param telephonyManager The telephony manager instance to use for method calls. + * @param accountHandle The handle for the {@link android.telecom.PhoneAccount} for which to + * retrieve the voicemail ringtone. + * @return The URI for the ringtone to play when receiving a voicemail from a specific + * PhoneAccount. + */ + @Nullable + public static Uri getVoicemailRingtoneUri( + TelephonyManager telephonyManager, PhoneAccountHandle accountHandle) { + if (VERSION.SDK_INT < VERSION_CODES.N) { + return null; + } + return telephonyManager.getVoicemailRingtoneUri(accountHandle); + } + + /** + * Returns whether vibration is set for voicemail notification in Phone settings. + * + * @param telephonyManager The telephony manager instance to use for method calls. + * @param accountHandle The handle for the {@link android.telecom.PhoneAccount} for which to + * retrieve the voicemail vibration setting. + * @return {@code true} if the vibration is set for this PhoneAccount, {@code false} otherwise. + */ + public static boolean isVoicemailVibrationEnabled( + TelephonyManager telephonyManager, PhoneAccountHandle accountHandle) { + return VERSION.SDK_INT < VERSION_CODES.N + || telephonyManager.isVoicemailVibrationEnabled(accountHandle); + } + + /** + * This method uses a new system API to enable or disable visual voicemail. TODO(twyen): restrict + * to N MR1, not needed in future SDK. + */ + public static void setVisualVoicemailEnabled( + TelephonyManager telephonyManager, PhoneAccountHandle handle, boolean enabled) { + if (VERSION.SDK_INT < VERSION_CODES.N_MR1) { + Assert.fail("setVisualVoicemailEnabled called on pre-NMR1"); + } + try { + TelephonyManager.class + .getMethod("setVisualVoicemailEnabled", PhoneAccountHandle.class, boolean.class) + .invoke(telephonyManager, handle, enabled); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + LogUtil.e("TelephonyManagerCompat.setVisualVoicemailEnabled", "failed", e); + } + } + + /** + * This method uses a new system API to check if visual voicemail is enabled TODO(twyen): restrict + * to N MR1, not needed in future SDK. + */ + public static boolean isVisualVoicemailEnabled( + TelephonyManager telephonyManager, PhoneAccountHandle handle) { + if (VERSION.SDK_INT < VERSION_CODES.N_MR1) { + Assert.fail("isVisualVoicemailEnabled called on pre-NMR1"); + } + try { + return (boolean) + TelephonyManager.class + .getMethod("isVisualVoicemailEnabled", PhoneAccountHandle.class) + .invoke(telephonyManager, handle); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + LogUtil.e("TelephonyManagerCompat.setVisualVoicemailEnabled", "failed", e); + } + return false; + } + + /** + * Handles secret codes to launch arbitrary activities. + * + * @param context the context to use + * @param secretCode the secret code without the "*#*#" prefix and "#*#*" suffix + */ + public static void handleSecretCode(Context context, String secretCode) { + // Must use system service on O+ to avoid using broadcasts, which are not allowed on O+. + if (BuildCompat.isAtLeastO()) { + if (!TelecomUtil.isDefaultDialer(context)) { + LogUtil.e( + "TelephonyManagerCompat.handleSecretCode", + "not default dialer, cannot send special code"); + return; + } + context.getSystemService(TelephonyManager.class).sendDialerSpecialCode(secretCode); + } else { + // System service call is not supported pre-O, so must use a broadcast for N-. + Intent intent = + new Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://" + secretCode)); + context.sendBroadcast(intent); + } + } +} diff --git a/java/com/android/dialer/configprovider/AndroidManifest.xml b/java/com/android/dialer/configprovider/AndroidManifest.xml new file mode 100644 index 000000000..772997153 --- /dev/null +++ b/java/com/android/dialer/configprovider/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/configprovider/ConfigProvider.java b/java/com/android/dialer/configprovider/ConfigProvider.java new file mode 100644 index 000000000..886a69e93 --- /dev/null +++ b/java/com/android/dialer/configprovider/ConfigProvider.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.configprovider; + +/** Gets config values from the container application. */ +public interface ConfigProvider { + + String getString(String key, String defaultValue); + + long getLong(String key, long defaultValue); + + boolean getBoolean(String key, boolean defaultValue); +} diff --git a/java/com/android/dialer/configprovider/ConfigProviderBindings.java b/java/com/android/dialer/configprovider/ConfigProviderBindings.java new file mode 100644 index 000000000..0bf0e758d --- /dev/null +++ b/java/com/android/dialer/configprovider/ConfigProviderBindings.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.configprovider; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.support.v4.os.UserManagerCompat; +import com.android.dialer.common.Assert; + +/** Accessor for getting a {@link ConfigProvider}. */ +public class ConfigProviderBindings { + + private static ConfigProvider configProvider; + private static ConfigProvider configProviderStub; + + public static ConfigProvider get(@NonNull Context context) { + Assert.isNotNull(context); + if (configProvider != null) { + return configProvider; + } + if (!UserManagerCompat.isUserUnlocked(context)) { + if (configProviderStub == null) { + configProviderStub = new ConfigProviderStub(); + } + return configProviderStub; + } + configProvider = ConfigProviderComponent.get(context).getConfigProvider(); + return configProvider; + } + + @VisibleForTesting + public static void setForTesting(@Nullable ConfigProvider configProviderForTesting) { + configProvider = configProviderForTesting; + } + + private static class ConfigProviderStub implements ConfigProvider { + @Override + public String getString(String key, String defaultValue) { + return defaultValue; + } + + @Override + public long getLong(String key, long defaultValue) { + return defaultValue; + } + + @Override + public boolean getBoolean(String key, boolean defaultValue) { + return defaultValue; + } + } +} diff --git a/java/com/android/dialer/configprovider/ConfigProviderComponent.java b/java/com/android/dialer/configprovider/ConfigProviderComponent.java new file mode 100644 index 000000000..e26a5cfe4 --- /dev/null +++ b/java/com/android/dialer/configprovider/ConfigProviderComponent.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.configprovider; + +import android.content.Context; +import android.support.annotation.NonNull; +import com.android.dialer.inject.HasRootComponent; +import dagger.Subcomponent; + +/** Dagger component to provide a {@link ConfigProvider}. */ +@Subcomponent +public abstract class ConfigProviderComponent { + + @NonNull + public abstract ConfigProvider getConfigProvider(); + + public static ConfigProviderComponent get(Context context) { + return ((ConfigProviderComponent.HasComponent) + ((HasRootComponent) context.getApplicationContext()).component()) + .configProviderComponent(); + } + + /** Used to refer to the root application component. */ + public interface HasComponent { + ConfigProviderComponent configProviderComponent(); + } +} diff --git a/java/com/android/dialer/configprovider/SharedPrefConfigProvider.java b/java/com/android/dialer/configprovider/SharedPrefConfigProvider.java new file mode 100644 index 000000000..6ee469572 --- /dev/null +++ b/java/com/android/dialer/configprovider/SharedPrefConfigProvider.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.dialer.configprovider; + +import android.app.IntentService; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.support.annotation.Nullable; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.inject.ApplicationContext; +import com.android.dialer.strictmode.DialerStrictMode; +import com.android.dialer.util.DialerUtils; +import javax.inject.Inject; + +/** + * {@link ConfigProvider} which uses a shared preferences file. + * + *

Config flags can be written using adb (with root access), for example: + * + *

+ *   adb root
+ *   adb shell am startservice -n \
+ *     'com.android.dialer/.configprovider.SharedPrefConfigProvider\$Service' \
+ *     --ez boolean_flag_name flag_value
+ * 
+ * + *

(For longs use --el and for strings use --es.) + * + *

Flags can be viewed with: + * + *

+ *   adb shell cat \
+ *     /data/user_de/0/com.android.dialer/shared_prefs/com.android.dialer_preferences.xml
+ * 
+ */ +class SharedPrefConfigProvider implements ConfigProvider { + private static final String PREF_PREFIX = "config_provider_prefs_"; + + private final Context appContext; + + @Inject + SharedPrefConfigProvider(@ApplicationContext Context appContext) { + this.appContext = appContext; + } + + /** Service to write values into {@link SharedPrefConfigProvider} using adb. */ + public static class Service extends IntentService { + + public Service() { + super("SharedPrefConfigProvider.Service"); + } + + @Override + protected void onHandleIntent(@Nullable Intent intent) { + if (intent == null || intent.getExtras() == null || intent.getExtras().size() != 1) { + LogUtil.w("SharedPrefConfigProvider.Service.onHandleIntent", "must set exactly one extra"); + return; + } + String key = intent.getExtras().keySet().iterator().next(); + Object value = intent.getExtras().get(key); + put(key, value); + } + + private void put(String key, Object value) { + Editor editor = getSharedPrefs(getApplicationContext()).edit(); + String prefixedKey = PREF_PREFIX + key; + if (value instanceof Boolean) { + editor.putBoolean(prefixedKey, (Boolean) value); + } else if (value instanceof Long) { + editor.putLong(prefixedKey, (Long) value); + } else if (value instanceof String) { + editor.putString(prefixedKey, (String) value); + } else { + throw Assert.createAssertionFailException("unsupported extra type: " + value.getClass()); + } + editor.apply(); + } + } + + @Override + public String getString(String key, String defaultValue) { + // Reading shared prefs on the main thread is generally safe since a single instance is cached. + return DialerStrictMode.bypass( + () -> getSharedPrefs(appContext).getString(PREF_PREFIX + key, defaultValue)); + } + + @Override + public long getLong(String key, long defaultValue) { + // Reading shared prefs on the main thread is generally safe since a single instance is cached. + return DialerStrictMode.bypass( + () -> getSharedPrefs(appContext).getLong(PREF_PREFIX + key, defaultValue)); + } + + @Override + public boolean getBoolean(String key, boolean defaultValue) { + // Reading shared prefs on the main thread is generally safe since a single instance is cached. + return DialerStrictMode.bypass( + () -> getSharedPrefs(appContext).getBoolean(PREF_PREFIX + key, defaultValue)); + } + + private static SharedPreferences getSharedPrefs(Context appContext) { + return DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(appContext); + } +} diff --git a/java/com/android/dialer/configprovider/SharedPrefConfigProviderModule.java b/java/com/android/dialer/configprovider/SharedPrefConfigProviderModule.java new file mode 100644 index 000000000..fe1c90816 --- /dev/null +++ b/java/com/android/dialer/configprovider/SharedPrefConfigProviderModule.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.configprovider; + +import dagger.Binds; +import dagger.Module; +import javax.inject.Singleton; + +/** Dagger module providing {@link ConfigProvider} based on shared preferences. */ +@Module +public abstract class SharedPrefConfigProviderModule { + + @Binds + @Singleton + abstract ConfigProvider to(SharedPrefConfigProvider impl); +} diff --git a/java/com/android/dialer/constants/ActivityRequestCodes.java b/java/com/android/dialer/constants/ActivityRequestCodes.java new file mode 100644 index 000000000..da05eb76b --- /dev/null +++ b/java/com/android/dialer/constants/ActivityRequestCodes.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.constants; + +/** + * Class containing {@link android.app.Activity#onActivityResult(int, int, android.content.Intent)} + * request codes. + */ +public final class ActivityRequestCodes { + + private ActivityRequestCodes() {} + + /** Request code for {@link android.speech.RecognizerIntent#ACTION_RECOGNIZE_SPEECH} intent. */ + public static final int DIALTACTS_VOICE_SEARCH = 1; + + /** Request code for {@link com.android.dialer.callcomposer.CallComposerActivity} intent. */ + public static final int DIALTACTS_CALL_COMPOSER = 2; + + /** + * Request code for {@link + * com.android.dialer.lightbringer.Lightbringer#getIntent(android.content.Context, String)}. + */ + public static final int DIALTACTS_LIGHTBRINGER = 3; + + /** Request code for {@link com.android.dialer.calldetails.CallDetailsActivity} intent. */ + public static final int DIALTACTS_CALL_DETAILS = 4; +} diff --git a/java/com/android/dialer/constants/Constants.java b/java/com/android/dialer/constants/Constants.java index d92c0bcfc..f9d07e31d 100644 --- a/java/com/android/dialer/constants/Constants.java +++ b/java/com/android/dialer/constants/Constants.java @@ -16,6 +16,7 @@ package com.android.dialer.constants; +import android.content.Context; import android.support.annotation.NonNull; import com.android.dialer.common.Assert; import com.android.dialer.proguard.UsedByReflection; @@ -53,5 +54,10 @@ public abstract class Constants { @NonNull public abstract String getFileProviderAuthority(); + @NonNull + public abstract String getAnnotatedCallLogProviderAuthority(); + + public abstract String getUserAgent(Context context); + protected Constants() {} } diff --git a/java/com/android/dialer/constants/ScheduledJobIds.java b/java/com/android/dialer/constants/ScheduledJobIds.java index 2fed4ef8a..cf93a464a 100644 --- a/java/com/android/dialer/constants/ScheduledJobIds.java +++ b/java/com/android/dialer/constants/ScheduledJobIds.java @@ -32,6 +32,8 @@ public final class ScheduledJobIds { public static final int VVM_TASK_SCHEDULER_JOB = 200; public static final int VVM_STATUS_CHECK_JOB = 201; public static final int VVM_DEVICE_PROVISIONED_JOB = 202; + public static final int VVM_TRANSCRIPTION_JOB = 203; + public static final int VVM_TRANSCRIPTION_BACKFILL_JOB = 204; public static final int VOIP_REGISTRATION = 300; diff --git a/java/com/android/dialer/constants/TrafficStatsTags.java b/java/com/android/dialer/constants/TrafficStatsTags.java new file mode 100644 index 000000000..1eca7840a --- /dev/null +++ b/java/com/android/dialer/constants/TrafficStatsTags.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.constants; + +/** Registry of tags for {@link android.net.TrafficStats#setThreadStatsTag(int)} */ +public class TrafficStatsTags { + public static final int CONTACT_PHOTO_DOWNLOAD_TAG = 0x00000001; + public static final int NEARBY_PLACES_TAG = 0x00000002; + public static final int REVERSE_LOOKUP_CONTACT_TAG = 0x00000003; + public static final int REVERSE_LOOKUP_IMAGE_TAG = 0x00000004; + public static final int DOWNLOAD_LOCATION_MAP_TAG = 0x00000005; + public static final int REVERSE_GEOCODE_TAG = 0x00000006; + public static final int VISUAL_VOICEMAIL_TAG = 0x00000007; + + // 0xfffffe00 to 0xffffff00 reserved for proprietary extensions to the dialer app. + + // 0xffffff00 to 0xffffffff reserved by the system (see TrafficStats#getAndSetThreadStatsTag) + +} diff --git a/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java b/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java index 6b78b986c..38fd24b8a 100644 --- a/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java +++ b/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java @@ -16,6 +16,7 @@ package com.android.dialer.constants; +import android.content.Context; import android.support.annotation.NonNull; import com.android.dialer.proguard.UsedByReflection; @@ -34,4 +35,15 @@ public class ConstantsImpl extends Constants { public String getFileProviderAuthority() { return "com.android.dialer.files"; } + + @NonNull + @Override + public String getAnnotatedCallLogProviderAuthority() { + return "com.android.dialer.annotatedcalllog"; + } + + @Override + public String getUserAgent(Context context) { + return null; + } } diff --git a/java/com/android/dialer/constants/googledialer/ConstantsImpl.java b/java/com/android/dialer/constants/googledialer/ConstantsImpl.java new file mode 100644 index 000000000..e151344ba --- /dev/null +++ b/java/com/android/dialer/constants/googledialer/ConstantsImpl.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.constants; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; +import android.support.annotation.NonNull; +import com.android.dialer.proguard.UsedByReflection; + +/** Provider config values for Google Dialer. */ +@UsedByReflection(value = "Constants.java") +public class ConstantsImpl extends Constants { + + @Override + @NonNull + public String getFilteredNumberProviderAuthority() { + return "com.google.android.dialer.blocking.filterednumberprovider"; + } + + @Override + @NonNull + public String getFileProviderAuthority() { + return "com.google.android.dialer.files"; + } + + @NonNull + @Override + public String getAnnotatedCallLogProviderAuthority() { + return "com.google.android.dialer.annotatedcalllog"; + } + + @Override + public String getUserAgent(Context context) { + StringBuilder userAgent = new StringBuilder("GoogleDialer "); + try { + String versionName = + context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; + userAgent.append(versionName).append(" "); + } catch (PackageManager.NameNotFoundException e) { + // ignore + } + userAgent.append(Build.FINGERPRINT); + + return userAgent.toString(); + } +} diff --git a/java/com/android/dialer/contactactions/AndroidManifest.xml b/java/com/android/dialer/contactactions/AndroidManifest.xml new file mode 100644 index 000000000..a64066e0b --- /dev/null +++ b/java/com/android/dialer/contactactions/AndroidManifest.xml @@ -0,0 +1,16 @@ + + diff --git a/java/com/android/dialer/contactactions/ContactActionBottomSheet.java b/java/com/android/dialer/contactactions/ContactActionBottomSheet.java new file mode 100644 index 000000000..9bf7ca095 --- /dev/null +++ b/java/com/android/dialer/contactactions/ContactActionBottomSheet.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.contactactions; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.support.design.widget.BottomSheetDialog; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import com.android.dialer.common.Assert; +import com.android.dialer.contactphoto.ContactPhotoManager; +import com.android.dialer.dialercontact.DialerContact; +import java.util.List; + +/** + * {@link BottomSheetDialog} used for building a list of contact actions in a bottom sheet menu. + * + *

{@link #show(Context, DialerContact, List)} should be used to create and display the menu. + * Modules are built using {@link ContactActionModule} and some defaults are provided by {@link + * IntentModule} and {@link DividerModule}. + */ +public class ContactActionBottomSheet extends BottomSheetDialog implements OnClickListener { + + private final List modules; + private final DialerContact contact; + + private ContactActionBottomSheet( + Context context, DialerContact contact, List modules) { + super(context); + this.modules = modules; + this.contact = contact; + setContentView(LayoutInflater.from(context).inflate(R.layout.sheet_layout, null)); + } + + public static ContactActionBottomSheet show( + Context context, DialerContact contact, List modules) { + ContactActionBottomSheet sheet = new ContactActionBottomSheet(context, contact, modules); + sheet.show(); + return sheet; + } + + @Override + protected void onCreate(Bundle bundle) { + super.onCreate(bundle); + LinearLayout container = Assert.isNotNull(findViewById(R.id.action_container)); + container.addView(getContactView(container)); + + for (ContactActionModule module : modules) { + if (module instanceof DividerModule) { + container.addView(getDividerView(container)); + } else { + container.addView(getModuleView(container, module)); + } + } + } + + // TODO(calderwoodra): add on click action to contact. + private View getContactView(ViewGroup container) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + View contactView = inflater.inflate(R.layout.contact_layout, container, false); + + ContactPhotoManager.getInstance(getContext()) + .loadDialerThumbnailOrPhoto( + contactView.findViewById(R.id.quick_contact_photo), + contact.hasContactUri() ? Uri.parse(contact.getContactUri()) : null, + contact.getPhotoId(), + contact.hasPhotoUri() ? Uri.parse(contact.getPhotoUri()) : null, + contact.getNameOrNumber(), + contact.getContactType()); + + TextView nameView = contactView.findViewById(R.id.contact_name); + TextView numberView = contactView.findViewById(R.id.phone_number); + + nameView.setText(contact.getNameOrNumber()); + if (!TextUtils.isEmpty(contact.getDisplayNumber())) { + numberView.setVisibility(View.VISIBLE); + String secondaryInfo = + TextUtils.isEmpty(contact.getNumberLabel()) + ? contact.getDisplayNumber() + : getContext() + .getString( + com.android.contacts.common.R.string.call_subject_type_and_number, + contact.getNumberLabel(), + contact.getDisplayNumber()); + numberView.setText(secondaryInfo); + } else { + numberView.setVisibility(View.GONE); + numberView.setText(null); + } + return contactView; + } + + private View getDividerView(ViewGroup container) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + return inflater.inflate(R.layout.divider_layout, container, false); + } + + private View getModuleView(ViewGroup container, ContactActionModule module) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + View moduleView = inflater.inflate(R.layout.module_layout, container, false); + ((TextView) moduleView.findViewById(R.id.module_text)).setText(module.getStringId()); + ((ImageView) moduleView.findViewById(R.id.module_image)) + .setImageResource(module.getDrawableId()); + moduleView.setOnClickListener(this); + moduleView.setTag(module); + return moduleView; + } + + @Override + public void onClick(View view) { + if (((ContactActionModule) view.getTag()).onClick()) { + dismiss(); + } + } +} diff --git a/java/com/android/dialer/contactactions/ContactActionModule.java b/java/com/android/dialer/contactactions/ContactActionModule.java new file mode 100644 index 000000000..8089edc7b --- /dev/null +++ b/java/com/android/dialer/contactactions/ContactActionModule.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.contactactions; + +import android.support.annotation.DrawableRes; +import android.support.annotation.StringRes; + +/** + * Modules used to build {@link ContactActionBottomSheet}. + * + *

Contacts as they relate to this class should be thought of as any entity that an action can be + * performed on like unknown/restricted contacts, along with saved and non-saved contacts. + */ +public interface ContactActionModule { + + @StringRes + int getStringId(); + + @DrawableRes + int getDrawableId(); + + /** @return true if the bottom sheet should close, false otherwise */ + boolean onClick(); +} diff --git a/java/com/android/dialer/contactactions/DividerModule.java b/java/com/android/dialer/contactactions/DividerModule.java new file mode 100644 index 000000000..aabd160db --- /dev/null +++ b/java/com/android/dialer/contactactions/DividerModule.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.contactactions; + +import com.android.dialer.common.Assert; + +/** + * A module that inserts a grey line divider into {@link ContactActionModule}. Layout it provided in + * R.layout.divider_layout.xml + */ +public final class DividerModule implements ContactActionModule { + + @Override + public int getStringId() { + throw Assert.createUnsupportedOperationFailException(); + } + + @Override + public int getDrawableId() { + throw Assert.createUnsupportedOperationFailException(); + } + + @Override + public boolean onClick() { + throw Assert.createUnsupportedOperationFailException(); + } +} diff --git a/java/com/android/dialer/contactactions/IntentModule.java b/java/com/android/dialer/contactactions/IntentModule.java new file mode 100644 index 000000000..201f52192 --- /dev/null +++ b/java/com/android/dialer/contactactions/IntentModule.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.contactactions; + +import android.content.Context; +import android.content.Intent; +import android.support.annotation.DrawableRes; +import android.support.annotation.StringRes; +import com.android.dialer.callintent.CallInitiationType.Type; +import com.android.dialer.callintent.CallIntentBuilder; + +/** + * {@link ContactActionModule} useful for making easy to build modules based on starting an intent. + */ +public class IntentModule implements ContactActionModule { + + private final Context context; + private final Intent intent; + private final @StringRes int text; + private final @DrawableRes int image; + + public IntentModule(Context context, Intent intent, @StringRes int text, @DrawableRes int image) { + this.context = context; + this.intent = intent; + this.text = text; + this.image = image; + } + + @Override + public int getStringId() { + return text; + } + + @Override + public int getDrawableId() { + return image; + } + + @Override + public boolean onClick() { + context.startActivity(intent); + return true; + } + + public static IntentModule newCallModule(Context context, String number, Type initiationType) { + return new IntentModule( + context, + new CallIntentBuilder(number, initiationType).build(), + R.string.call, + R.drawable.quantum_ic_call_white_24); + } + + public static IntentModule newVideoCallModule( + Context context, String number, Type initiationType) { + return new IntentModule( + context, + new CallIntentBuilder(number, initiationType).setIsVideoCall(true).build(), + R.string.video_call, + R.drawable.quantum_ic_videocam_white_24); + } +} diff --git a/java/com/android/dialer/contactactions/res/layout/contact_layout.xml b/java/com/android/dialer/contactactions/res/layout/contact_layout.xml new file mode 100644 index 000000000..bf3297153 --- /dev/null +++ b/java/com/android/dialer/contactactions/res/layout/contact_layout.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/contactactions/res/layout/divider_layout.xml b/java/com/android/dialer/contactactions/res/layout/divider_layout.xml new file mode 100644 index 000000000..fdee50e48 --- /dev/null +++ b/java/com/android/dialer/contactactions/res/layout/divider_layout.xml @@ -0,0 +1,23 @@ + + + diff --git a/java/com/android/dialer/contactactions/res/layout/module_layout.xml b/java/com/android/dialer/contactactions/res/layout/module_layout.xml new file mode 100644 index 000000000..9aee67937 --- /dev/null +++ b/java/com/android/dialer/contactactions/res/layout/module_layout.xml @@ -0,0 +1,40 @@ + + + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/contactactions/res/layout/sheet_layout.xml b/java/com/android/dialer/contactactions/res/layout/sheet_layout.xml new file mode 100644 index 000000000..6984367bf --- /dev/null +++ b/java/com/android/dialer/contactactions/res/layout/sheet_layout.xml @@ -0,0 +1,24 @@ + + + diff --git a/java/com/android/dialer/contactactions/res/values/dimens.xml b/java/com/android/dialer/contactactions/res/values/dimens.xml new file mode 100644 index 000000000..47bf804ac --- /dev/null +++ b/java/com/android/dialer/contactactions/res/values/dimens.xml @@ -0,0 +1,20 @@ + + + + 48dp + 12dp + \ No newline at end of file diff --git a/java/com/android/dialer/contactphoto/AndroidManifest.xml b/java/com/android/dialer/contactphoto/AndroidManifest.xml new file mode 100644 index 000000000..d852d40af --- /dev/null +++ b/java/com/android/dialer/contactphoto/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/java/com/android/dialer/contactphoto/BitmapUtil.java b/java/com/android/dialer/contactphoto/BitmapUtil.java new file mode 100644 index 000000000..36055e2c1 --- /dev/null +++ b/java/com/android/dialer/contactphoto/BitmapUtil.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.contactphoto; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff.Mode; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.RectF; + +/** Provides static functions to decode bitmaps at the optimal size */ +public class BitmapUtil { + + private BitmapUtil() {} + + /** + * Returns Width or Height of the picture, depending on which size is smaller. Doesn't actually + * decode the picture, so it is pretty efficient to run. + */ + public static int getSmallerExtentFromBytes(byte[] bytes) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + + // don't actually decode the picture, just return its bounds + options.inJustDecodeBounds = true; + BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); + + // test what the best sample size is + return Math.min(options.outWidth, options.outHeight); + } + + /** + * Finds the optimal sampleSize for loading the picture + * + * @param originalSmallerExtent Width or height of the picture, whichever is smaller + * @param targetExtent Width or height of the target view, whichever is bigger. + *

If either one of the parameters is 0 or smaller, no sampling is applied + */ + public static int findOptimalSampleSize(int originalSmallerExtent, int targetExtent) { + // If we don't know sizes, we can't do sampling. + if (targetExtent < 1) { + return 1; + } + if (originalSmallerExtent < 1) { + return 1; + } + + // Test what the best sample size is. To do that, we find the sample size that gives us + // the best trade-off between resulting image size and memory requirement. We allow + // the down-sampled image to be 20% smaller than the target size. That way we can get around + // unfortunate cases where e.g. a 720 picture is requested for 362 and not down-sampled at + // all. Why 20%? Why not. Prove me wrong. + int extent = originalSmallerExtent; + int sampleSize = 1; + while ((extent >> 1) >= targetExtent * 0.8f) { + sampleSize <<= 1; + extent >>= 1; + } + + return sampleSize; + } + + /** Decodes the bitmap with the given sample size */ + public static Bitmap decodeBitmapFromBytes(byte[] bytes, int sampleSize) { + final BitmapFactory.Options options; + if (sampleSize <= 1) { + options = null; + } else { + options = new BitmapFactory.Options(); + options.inSampleSize = sampleSize; + } + return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); + } + + /** + * Given an input bitmap, scales it to the given width/height and makes it round. + * + * @param input {@link Bitmap} to scale and crop + * @param targetWidth desired output width + * @param targetHeight desired output height + * @return output bitmap scaled to the target width/height and cropped to an oval. The cropping + * algorithm will try to fit as much of the input into the output as possible, while + * preserving the target width/height ratio. + */ + public static Bitmap getRoundedBitmap(Bitmap input, int targetWidth, int targetHeight) { + if (input == null) { + return null; + } + final Bitmap.Config inputConfig = input.getConfig(); + final Bitmap result = + Bitmap.createBitmap( + targetWidth, targetHeight, inputConfig != null ? inputConfig : Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(result); + final Paint paint = new Paint(); + canvas.drawARGB(0, 0, 0, 0); + paint.setAntiAlias(true); + final RectF dst = new RectF(0, 0, targetWidth, targetHeight); + canvas.drawOval(dst, paint); + + // Specifies that only pixels present in the destination (i.e. the drawn oval) should + // be overwritten with pixels from the input bitmap. + paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); + + final int inputWidth = input.getWidth(); + final int inputHeight = input.getHeight(); + + // Choose the largest scale factor that will fit inside the dimensions of the + // input bitmap. + final float scaleBy = + Math.min((float) inputWidth / targetWidth, (float) inputHeight / targetHeight); + + final int xCropAmountHalved = (int) (scaleBy * targetWidth / 2); + final int yCropAmountHalved = (int) (scaleBy * targetHeight / 2); + + final Rect src = + new Rect( + inputWidth / 2 - xCropAmountHalved, + inputHeight / 2 - yCropAmountHalved, + inputWidth / 2 + xCropAmountHalved, + inputHeight / 2 + yCropAmountHalved); + + canvas.drawBitmap(input, src, dst, paint); + return result; + } +} diff --git a/java/com/android/dialer/contactphoto/ContactPhotoManager.java b/java/com/android/dialer/contactphoto/ContactPhotoManager.java new file mode 100644 index 000000000..459837936 --- /dev/null +++ b/java/com/android/dialer/contactphoto/ContactPhotoManager.java @@ -0,0 +1,511 @@ +/* + * 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.dialer.contactphoto; + +import android.content.ComponentCallbacks2; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.net.Uri.Builder; +import android.support.annotation.VisibleForTesting; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.QuickContactBadge; +import com.android.dialer.common.LogUtil; +import com.android.dialer.lettertile.LetterTileDrawable; +import com.android.dialer.util.PermissionsUtil; +import com.android.dialer.util.UriUtils; + +/** Asynchronously loads contact photos and maintains a cache of photos. */ +public abstract class ContactPhotoManager implements ComponentCallbacks2 { + + /** Scale and offset default constants used for default letter images */ + public static final float SCALE_DEFAULT = 1.0f; + + public static final float OFFSET_DEFAULT = 0.0f; + public static final boolean IS_CIRCULAR_DEFAULT = false; + // TODO: Use LogUtil.isVerboseEnabled for DEBUG branches instead of a lint check. + // LINT.DoNotSubmitIf(true) + static final boolean DEBUG = false; + // LINT.DoNotSubmitIf(true) + static final boolean DEBUG_SIZES = false; + /** Uri-related constants used for default letter images */ + private static final String DISPLAY_NAME_PARAM_KEY = "display_name"; + + private static final String IDENTIFIER_PARAM_KEY = "identifier"; + private static final String CONTACT_TYPE_PARAM_KEY = "contact_type"; + private static final String SCALE_PARAM_KEY = "scale"; + private static final String OFFSET_PARAM_KEY = "offset"; + private static final String IS_CIRCULAR_PARAM_KEY = "is_circular"; + private static final String DEFAULT_IMAGE_URI_SCHEME = "defaultimage"; + private static final Uri DEFAULT_IMAGE_URI = Uri.parse(DEFAULT_IMAGE_URI_SCHEME + "://"); + public static final DefaultImageProvider DEFAULT_AVATAR = new LetterTileDefaultImageProvider(); + private static ContactPhotoManager sInstance; + + /** + * Given a {@link DefaultImageRequest}, returns an Uri that can be used to request a letter tile + * avatar when passed to the {@link ContactPhotoManager}. The internal implementation of this uri + * is not guaranteed to remain the same across application versions, so the actual uri should + * never be persisted in long-term storage and reused. + * + * @param request A {@link DefaultImageRequest} object with the fields configured to return a + * @return A Uri that when later passed to the {@link ContactPhotoManager} via {@link + * #loadPhoto(ImageView, Uri, int, boolean, boolean, DefaultImageRequest)}, can be used to + * request a default contact image, drawn as a letter tile using the parameters as configured + * in the provided {@link DefaultImageRequest} + */ + public static Uri getDefaultAvatarUriForContact(DefaultImageRequest request) { + final Builder builder = DEFAULT_IMAGE_URI.buildUpon(); + if (request != null) { + if (!TextUtils.isEmpty(request.displayName)) { + builder.appendQueryParameter(DISPLAY_NAME_PARAM_KEY, request.displayName); + } + if (!TextUtils.isEmpty(request.identifier)) { + builder.appendQueryParameter(IDENTIFIER_PARAM_KEY, request.identifier); + } + if (request.contactType != LetterTileDrawable.TYPE_DEFAULT) { + builder.appendQueryParameter(CONTACT_TYPE_PARAM_KEY, String.valueOf(request.contactType)); + } + if (request.scale != SCALE_DEFAULT) { + builder.appendQueryParameter(SCALE_PARAM_KEY, String.valueOf(request.scale)); + } + if (request.offset != OFFSET_DEFAULT) { + builder.appendQueryParameter(OFFSET_PARAM_KEY, String.valueOf(request.offset)); + } + if (request.isCircular != IS_CIRCULAR_DEFAULT) { + builder.appendQueryParameter(IS_CIRCULAR_PARAM_KEY, String.valueOf(request.isCircular)); + } + } + return builder.build(); + } + + /** + * Adds a business contact type encoded fragment to the URL. Used to ensure photo URLS from Nearby + * Places can be identified as business photo URLs rather than URLs for personal contact photos. + * + * @param photoUrl The photo URL to modify. + * @return URL with the contact type parameter added and set to TYPE_BUSINESS. + */ + public static String appendBusinessContactType(String photoUrl) { + Uri uri = Uri.parse(photoUrl); + Builder builder = uri.buildUpon(); + builder.encodedFragment(String.valueOf(LetterTileDrawable.TYPE_BUSINESS)); + return builder.build().toString(); + } + + /** + * Removes the contact type information stored in the photo URI encoded fragment. + * + * @param photoUri The photo URI to remove the contact type from. + * @return The photo URI with contact type removed. + */ + public static Uri removeContactType(Uri photoUri) { + String encodedFragment = photoUri.getEncodedFragment(); + if (!TextUtils.isEmpty(encodedFragment)) { + Builder builder = photoUri.buildUpon(); + builder.encodedFragment(null); + return builder.build(); + } + return photoUri; + } + + /** + * Inspects a photo URI to determine if the photo URI represents a business. + * + * @param photoUri The URI to inspect. + * @return Whether the URI represents a business photo or not. + */ + public static boolean isBusinessContactUri(Uri photoUri) { + if (photoUri == null) { + return false; + } + + String encodedFragment = photoUri.getEncodedFragment(); + return !TextUtils.isEmpty(encodedFragment) + && encodedFragment.equals(String.valueOf(LetterTileDrawable.TYPE_BUSINESS)); + } + + protected static DefaultImageRequest getDefaultImageRequestFromUri(Uri uri) { + final DefaultImageRequest request = + new DefaultImageRequest( + uri.getQueryParameter(DISPLAY_NAME_PARAM_KEY), + uri.getQueryParameter(IDENTIFIER_PARAM_KEY), + false); + try { + String contactType = uri.getQueryParameter(CONTACT_TYPE_PARAM_KEY); + if (!TextUtils.isEmpty(contactType)) { + request.contactType = Integer.valueOf(contactType); + } + + String scale = uri.getQueryParameter(SCALE_PARAM_KEY); + if (!TextUtils.isEmpty(scale)) { + request.scale = Float.valueOf(scale); + } + + String offset = uri.getQueryParameter(OFFSET_PARAM_KEY); + if (!TextUtils.isEmpty(offset)) { + request.offset = Float.valueOf(offset); + } + + String isCircular = uri.getQueryParameter(IS_CIRCULAR_PARAM_KEY); + if (!TextUtils.isEmpty(isCircular)) { + request.isCircular = Boolean.valueOf(isCircular); + } + } catch (NumberFormatException e) { + LogUtil.w( + "ContactPhotoManager.getDefaultImageRequestFromUri", + "Invalid DefaultImageRequest image parameters provided, ignoring and using " + + "defaults."); + } + + return request; + } + + public static ContactPhotoManager getInstance(Context context) { + if (sInstance == null) { + Context applicationContext = context.getApplicationContext(); + sInstance = createContactPhotoManager(applicationContext); + applicationContext.registerComponentCallbacks(sInstance); + if (PermissionsUtil.hasContactsReadPermissions(context)) { + sInstance.preloadPhotosInBackground(); + } + } + return sInstance; + } + + public static synchronized ContactPhotoManager createContactPhotoManager(Context context) { + return new ContactPhotoManagerImpl(context); + } + + @VisibleForTesting + public static void injectContactPhotoManagerForTesting(ContactPhotoManager photoManager) { + sInstance = photoManager; + } + + protected boolean isDefaultImageUri(Uri uri) { + return DEFAULT_IMAGE_URI_SCHEME.equals(uri.getScheme()); + } + + /** + * Load thumbnail image into the supplied image view. If the photo is already cached, it is + * displayed immediately. Otherwise a request is sent to load the photo from the database. + */ + public abstract void loadThumbnail( + ImageView view, + long photoId, + boolean darkTheme, + boolean isCircular, + DefaultImageRequest defaultImageRequest, + DefaultImageProvider defaultProvider); + + /** + * Calls {@link #loadThumbnail(ImageView, long, boolean, boolean, DefaultImageRequest, + * DefaultImageProvider)} using the {@link DefaultImageProvider} {@link #DEFAULT_AVATAR}. + */ + public final void loadThumbnail( + ImageView view, + long photoId, + boolean darkTheme, + boolean isCircular, + DefaultImageRequest defaultImageRequest) { + loadThumbnail(view, photoId, darkTheme, isCircular, defaultImageRequest, DEFAULT_AVATAR); + } + + public final void loadDialerThumbnailOrPhoto( + QuickContactBadge badge, + Uri contactUri, + long photoId, + Uri photoUri, + String displayName, + int contactType) { + badge.assignContactUri(contactUri); + badge.setOverlay(null); + + badge.setContentDescription( + badge.getContext().getString(R.string.description_quick_contact_for, displayName)); + + String lookupKey = contactUri == null ? null : UriUtils.getLookupKeyFromUri(contactUri); + ContactPhotoManager.DefaultImageRequest request = + new ContactPhotoManager.DefaultImageRequest( + displayName, lookupKey, contactType, true /* isCircular */); + if (photoId == 0 && photoUri != null) { + loadDirectoryPhoto(badge, photoUri, false /* darkTheme */, true /* isCircular */, request); + } else { + loadThumbnail(badge, photoId, false /* darkTheme */, true /* isCircular */, request); + } + } + + /** + * Load photo into the supplied image view. If the photo is already cached, it is displayed + * immediately. Otherwise a request is sent to load the photo from the location specified by the + * URI. + * + * @param view The target view + * @param photoUri The uri of the photo to load + * @param requestedExtent Specifies an approximate Max(width, height) of the targetView. This is + * useful if the source image can be a lot bigger that the target, so that the decoding is + * done using efficient sampling. If requestedExtent is specified, no sampling of the image is + * performed + * @param darkTheme Whether the background is dark. This is used for default avatars + * @param defaultImageRequest {@link DefaultImageRequest} object that specifies how a default + * letter tile avatar should be drawn. + * @param defaultProvider The provider of default avatars (this is used if photoUri doesn't refer + * to an existing image) + */ + public abstract void loadPhoto( + ImageView view, + Uri photoUri, + int requestedExtent, + boolean darkTheme, + boolean isCircular, + DefaultImageRequest defaultImageRequest, + DefaultImageProvider defaultProvider); + + /** + * Calls {@link #loadPhoto(ImageView, Uri, int, boolean, boolean, DefaultImageRequest, + * DefaultImageProvider)} with {@link #DEFAULT_AVATAR} and {@code null} display names and lookup + * keys. + * + * @param defaultImageRequest {@link DefaultImageRequest} object that specifies how a default + * letter tile avatar should be drawn. + */ + public final void loadPhoto( + ImageView view, + Uri photoUri, + int requestedExtent, + boolean darkTheme, + boolean isCircular, + DefaultImageRequest defaultImageRequest) { + loadPhoto( + view, + photoUri, + requestedExtent, + darkTheme, + isCircular, + defaultImageRequest, + DEFAULT_AVATAR); + } + + /** + * Calls {@link #loadPhoto(ImageView, Uri, int, boolean, boolean, DefaultImageRequest, + * DefaultImageProvider)} with {@link #DEFAULT_AVATAR} and with the assumption, that the image is + * a thumbnail. + * + * @param defaultImageRequest {@link DefaultImageRequest} object that specifies how a default + * letter tile avatar should be drawn. + */ + public final void loadDirectoryPhoto( + ImageView view, + Uri photoUri, + boolean darkTheme, + boolean isCircular, + DefaultImageRequest defaultImageRequest) { + loadPhoto(view, photoUri, -1, darkTheme, isCircular, defaultImageRequest, DEFAULT_AVATAR); + } + + /** + * Remove photo from the supplied image view. This also cancels current pending load request + * inside this photo manager. + */ + public abstract void removePhoto(ImageView view); + + /** Cancels all pending requests to load photos asynchronously. */ + public abstract void cancelPendingRequests(View fragmentRootView); + + /** Temporarily stops loading photos from the database. */ + public abstract void pause(); + + /** Resumes loading photos from the database. */ + public abstract void resume(); + + /** + * Marks all cached photos for reloading. We can continue using cache but should also make sure + * the photos haven't changed in the background and notify the views if so. + */ + public abstract void refreshCache(); + + /** Initiates a background process that over time will fill up cache with preload photos. */ + public abstract void preloadPhotosInBackground(); + + // ComponentCallbacks2 + @Override + public void onConfigurationChanged(Configuration newConfig) {} + + // ComponentCallbacks2 + @Override + public void onLowMemory() {} + + // ComponentCallbacks2 + @Override + public void onTrimMemory(int level) {} + + /** + * Contains fields used to contain contact details and other user-defined settings that might be + * used by the ContactPhotoManager to generate a default contact image. This contact image takes + * the form of a letter or bitmap drawn on top of a colored tile. + */ + public static class DefaultImageRequest { + + /** + * Used to indicate that a drawable that represents a contact without any contact details should + * be returned. + */ + public static final DefaultImageRequest EMPTY_DEFAULT_IMAGE_REQUEST = new DefaultImageRequest(); + /** + * Used to indicate that a drawable that represents a business without a business photo should + * be returned. + */ + public static final DefaultImageRequest EMPTY_DEFAULT_BUSINESS_IMAGE_REQUEST = + new DefaultImageRequest(null, null, LetterTileDrawable.TYPE_BUSINESS, false); + /** + * Used to indicate that a circular drawable that represents a contact without any contact + * details should be returned. + */ + public static final DefaultImageRequest EMPTY_CIRCULAR_DEFAULT_IMAGE_REQUEST = + new DefaultImageRequest(null, null, true); + /** + * Used to indicate that a circular drawable that represents a business without a business photo + * should be returned. + */ + public static final DefaultImageRequest EMPTY_CIRCULAR_BUSINESS_IMAGE_REQUEST = + new DefaultImageRequest(null, null, LetterTileDrawable.TYPE_BUSINESS, true); + /** The contact's display name. The display name is used to */ + public String displayName; + /** + * A unique and deterministic string that can be used to identify this contact. This is usually + * the contact's lookup key, but other contact details can be used as well, especially for + * non-local or temporary contacts that might not have a lookup key. This is used to determine + * the color of the tile. + */ + public String identifier; + /** + * The type of this contact. This contact type may be used to decide the kind of image to use in + * the case where a unique letter cannot be generated from the contact's display name and + * identifier. + */ + public @LetterTileDrawable.ContactType int contactType = LetterTileDrawable.TYPE_DEFAULT; + /** + * The amount to scale the letter or bitmap to, as a ratio of its default size (from a range of + * 0.0f to 2.0f). The default value is 1.0f. + */ + public float scale = SCALE_DEFAULT; + /** + * The amount to vertically offset the letter or image to within the tile. The provided offset + * must be within the range of -0.5f to 0.5f. If set to -0.5f, the letter will be shifted + * upwards by 0.5 times the height of the canvas it is being drawn on, which means it will be + * drawn with the center of the letter starting at the top edge of the canvas. If set to 0.5f, + * the letter will be shifted downwards by 0.5 times the height of the canvas it is being drawn + * on, which means it will be drawn with the center of the letter starting at the bottom edge of + * the canvas. The default is 0.0f, which means the letter is drawn in the exact vertical center + * of the tile. + */ + public float offset = OFFSET_DEFAULT; + /** Whether or not to draw the default image as a circle, instead of as a square/rectangle. */ + public boolean isCircular = false; + + public DefaultImageRequest() {} + + public DefaultImageRequest(String displayName, String identifier, boolean isCircular) { + this( + displayName, + identifier, + LetterTileDrawable.TYPE_DEFAULT, + SCALE_DEFAULT, + OFFSET_DEFAULT, + isCircular); + } + + public DefaultImageRequest( + String displayName, String identifier, int contactType, boolean isCircular) { + this(displayName, identifier, contactType, SCALE_DEFAULT, OFFSET_DEFAULT, isCircular); + } + + public DefaultImageRequest( + String displayName, + String identifier, + int contactType, + float scale, + float offset, + boolean isCircular) { + this.displayName = displayName; + this.identifier = identifier; + this.contactType = contactType; + this.scale = scale; + this.offset = offset; + this.isCircular = isCircular; + } + } + + public abstract static class DefaultImageProvider { + + /** + * Applies the default avatar to the ImageView. Extent is an indicator for the size (width or + * height). If darkTheme is set, the avatar is one that looks better on dark background + * + * @param defaultImageRequest {@link DefaultImageRequest} object that specifies how a default + * letter tile avatar should be drawn. + */ + public abstract void applyDefaultImage( + ImageView view, int extent, boolean darkTheme, DefaultImageRequest defaultImageRequest); + } + + /** + * A default image provider that applies a letter tile consisting of a colored background and a + * letter in the foreground as the default image for a contact. The color of the background and + * the type of letter is decided based on the contact's details. + */ + private static class LetterTileDefaultImageProvider extends DefaultImageProvider { + + public static Drawable getDefaultImageForContact( + Resources resources, DefaultImageRequest defaultImageRequest) { + final LetterTileDrawable drawable = new LetterTileDrawable(resources); + final int tileShape = + defaultImageRequest.isCircular + ? LetterTileDrawable.SHAPE_CIRCLE + : LetterTileDrawable.SHAPE_RECTANGLE; + if (defaultImageRequest != null) { + // If the contact identifier is null or empty, fallback to the + // displayName. In that case, use {@code null} for the contact's + // display name so that a default bitmap will be used instead of a + // letter + if (TextUtils.isEmpty(defaultImageRequest.identifier)) { + drawable.setCanonicalDialerLetterTileDetails( + null, defaultImageRequest.displayName, tileShape, defaultImageRequest.contactType); + } else { + drawable.setCanonicalDialerLetterTileDetails( + defaultImageRequest.displayName, + defaultImageRequest.identifier, + tileShape, + defaultImageRequest.contactType); + } + drawable.setScale(defaultImageRequest.scale); + drawable.setOffset(defaultImageRequest.offset); + } + return drawable; + } + + @Override + public void applyDefaultImage( + ImageView view, int extent, boolean darkTheme, DefaultImageRequest defaultImageRequest) { + final Drawable drawable = getDefaultImageForContact(view.getResources(), defaultImageRequest); + view.setImageDrawable(drawable); + } + } +} diff --git a/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java b/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java new file mode 100644 index 000000000..5dbdf5e48 --- /dev/null +++ b/java/com/android/dialer/contactphoto/ContactPhotoManagerImpl.java @@ -0,0 +1,1266 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.contactphoto; + +import android.app.ActivityManager; +import android.content.ComponentCallbacks2; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.Context; +import android.content.res.Resources; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Paint.Style; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.TransitionDrawable; +import android.media.ThumbnailUtils; +import android.net.TrafficStats; +import android.net.Uri; +import android.os.Handler; +import android.os.Handler.Callback; +import android.os.HandlerThread; +import android.os.Message; +import android.provider.ContactsContract; +import android.provider.ContactsContract.Contacts; +import android.provider.ContactsContract.Contacts.Photo; +import android.provider.ContactsContract.Data; +import android.provider.ContactsContract.Directory; +import android.support.annotation.UiThread; +import android.support.annotation.WorkerThread; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.text.TextUtils; +import android.util.LruCache; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import com.android.dialer.common.LogUtil; +import com.android.dialer.constants.Constants; +import com.android.dialer.constants.TrafficStatsTags; +import com.android.dialer.util.PermissionsUtil; +import com.android.dialer.util.UriUtils; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +class ContactPhotoManagerImpl extends ContactPhotoManager implements Callback { + + private static final String LOADER_THREAD_NAME = "ContactPhotoLoader"; + + private static final int FADE_TRANSITION_DURATION = 200; + + /** + * Type of message sent by the UI thread to itself to indicate that some photos need to be loaded. + */ + private static final int MESSAGE_REQUEST_LOADING = 1; + + /** Type of message sent by the loader thread to indicate that some photos have been loaded. */ + private static final int MESSAGE_PHOTOS_LOADED = 2; + + private static final String[] EMPTY_STRING_ARRAY = new String[0]; + + private static final String[] COLUMNS = new String[] {Photo._ID, Photo.PHOTO}; + + /** + * Dummy object used to indicate that a bitmap for a given key could not be stored in the cache. + */ + private static final BitmapHolder BITMAP_UNAVAILABLE; + /** Cache size for {@link #mBitmapHolderCache} for devices with "large" RAM. */ + private static final int HOLDER_CACHE_SIZE = 2000000; + /** Cache size for {@link #mBitmapCache} for devices with "large" RAM. */ + private static final int BITMAP_CACHE_SIZE = 36864 * 48; // 1728K + /** Height/width of a thumbnail image */ + private static int mThumbnailSize; + + static { + BITMAP_UNAVAILABLE = new BitmapHolder(new byte[0], 0); + BITMAP_UNAVAILABLE.bitmapRef = new SoftReference(null); + } + + private final Context mContext; + /** + * An LRU cache for bitmap holders. The cache contains bytes for photos just as they come from the + * database. Each holder has a soft reference to the actual bitmap. + */ + private final LruCache mBitmapHolderCache; + /** Cache size threshold at which bitmaps will not be preloaded. */ + private final int mBitmapHolderCacheRedZoneBytes; + /** + * Level 2 LRU cache for bitmaps. This is a smaller cache that holds the most recently used + * bitmaps to save time on decoding them from bytes (the bytes are stored in {@link + * #mBitmapHolderCache}. + */ + private final LruCache mBitmapCache; + /** + * A map from ImageView to the corresponding photo ID or uri, encapsulated in a request. The + * request may swapped out before the photo loading request is started. + */ + private final ConcurrentHashMap mPendingRequests = + new ConcurrentHashMap(); + /** Handler for messages sent to the UI thread. */ + private final Handler mMainThreadHandler = new Handler(this); + /** For debug: How many times we had to reload cached photo for a stale entry */ + private final AtomicInteger mStaleCacheOverwrite = new AtomicInteger(); + /** For debug: How many times we had to reload cached photo for a fresh entry. Should be 0. */ + private final AtomicInteger mFreshCacheOverwrite = new AtomicInteger(); + /** {@code true} if ALL entries in {@link #mBitmapHolderCache} are NOT fresh. */ + private volatile boolean mBitmapHolderCacheAllUnfresh = true; + /** Thread responsible for loading photos from the database. Created upon the first request. */ + private LoaderThread mLoaderThread; + /** A gate to make sure we only send one instance of MESSAGE_PHOTOS_NEEDED at a time. */ + private boolean mLoadingRequested; + /** Flag indicating if the image loading is paused. */ + private boolean mPaused; + /** The user agent string to use when loading URI based photos. */ + private String mUserAgent; + + public ContactPhotoManagerImpl(Context context) { + mContext = context; + + final ActivityManager am = + ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)); + + final float cacheSizeAdjustment = (am.isLowRamDevice()) ? 0.5f : 1.0f; + + final int bitmapCacheSize = (int) (cacheSizeAdjustment * BITMAP_CACHE_SIZE); + mBitmapCache = + new LruCache(bitmapCacheSize) { + @Override + protected int sizeOf(Object key, Bitmap value) { + return value.getByteCount(); + } + + @Override + protected void entryRemoved( + boolean evicted, Object key, Bitmap oldValue, Bitmap newValue) { + if (DEBUG) { + dumpStats(); + } + } + }; + final int holderCacheSize = (int) (cacheSizeAdjustment * HOLDER_CACHE_SIZE); + mBitmapHolderCache = + new LruCache(holderCacheSize) { + @Override + protected int sizeOf(Object key, BitmapHolder value) { + return value.bytes != null ? value.bytes.length : 0; + } + + @Override + protected void entryRemoved( + boolean evicted, Object key, BitmapHolder oldValue, BitmapHolder newValue) { + if (DEBUG) { + dumpStats(); + } + } + }; + mBitmapHolderCacheRedZoneBytes = (int) (holderCacheSize * 0.75); + LogUtil.i( + "ContactPhotoManagerImpl.ContactPhotoManagerImpl", "cache adj: " + cacheSizeAdjustment); + if (DEBUG) { + LogUtil.d( + "ContactPhotoManagerImpl.ContactPhotoManagerImpl", + "Cache size: " + btk(mBitmapHolderCache.maxSize()) + " + " + btk(mBitmapCache.maxSize())); + } + + mThumbnailSize = + context.getResources().getDimensionPixelSize(R.dimen.contact_browser_list_item_photo_size); + + // Get a user agent string to use for URI photo requests. + mUserAgent = Constants.get().getUserAgent(context); + if (mUserAgent == null) { + mUserAgent = ""; + } + } + + /** Converts bytes to K bytes, rounding up. Used only for debug log. */ + private static String btk(int bytes) { + return ((bytes + 1023) / 1024) + "K"; + } + + private static final int safeDiv(int dividend, int divisor) { + return (divisor == 0) ? 0 : (dividend / divisor); + } + + private static boolean isChildView(View parent, View potentialChild) { + return potentialChild.getParent() != null + && (potentialChild.getParent() == parent + || (potentialChild.getParent() instanceof ViewGroup + && isChildView(parent, (ViewGroup) potentialChild.getParent()))); + } + + /** + * If necessary, decodes bytes stored in the holder to Bitmap. As long as the bitmap is held + * either by {@link #mBitmapCache} or by a soft reference in the holder, it will not be necessary + * to decode the bitmap. + */ + private static void inflateBitmap(BitmapHolder holder, int requestedExtent) { + final int sampleSize = + BitmapUtil.findOptimalSampleSize(holder.originalSmallerExtent, requestedExtent); + byte[] bytes = holder.bytes; + if (bytes == null || bytes.length == 0) { + return; + } + + if (sampleSize == holder.decodedSampleSize) { + // Check the soft reference. If will be retained if the bitmap is also + // in the LRU cache, so we don't need to check the LRU cache explicitly. + if (holder.bitmapRef != null) { + holder.bitmap = holder.bitmapRef.get(); + if (holder.bitmap != null) { + return; + } + } + } + + try { + Bitmap bitmap = BitmapUtil.decodeBitmapFromBytes(bytes, sampleSize); + + // TODO: As a temporary workaround while framework support is being added to + // clip non-square bitmaps into a perfect circle, manually crop the bitmap into + // into a square if it will be displayed as a thumbnail so that it can be cropped + // into a circle. + final int height = bitmap.getHeight(); + final int width = bitmap.getWidth(); + + // The smaller dimension of a scaled bitmap can range from anywhere from 0 to just + // below twice the length of a thumbnail image due to the way we calculate the optimal + // sample size. + if (height != width && Math.min(height, width) <= mThumbnailSize * 2) { + final int dimension = Math.min(height, width); + bitmap = ThumbnailUtils.extractThumbnail(bitmap, dimension, dimension); + } + // make bitmap mutable and draw size onto it + if (DEBUG_SIZES) { + Bitmap original = bitmap; + bitmap = bitmap.copy(bitmap.getConfig(), true); + original.recycle(); + Canvas canvas = new Canvas(bitmap); + Paint paint = new Paint(); + paint.setTextSize(16); + paint.setColor(Color.BLUE); + paint.setStyle(Style.FILL); + canvas.drawRect(0.0f, 0.0f, 50.0f, 20.0f, paint); + paint.setColor(Color.WHITE); + paint.setAntiAlias(true); + canvas.drawText(bitmap.getWidth() + "/" + sampleSize, 0, 15, paint); + } + + holder.decodedSampleSize = sampleSize; + holder.bitmap = bitmap; + holder.bitmapRef = new SoftReference(bitmap); + if (DEBUG) { + LogUtil.d( + "ContactPhotoManagerImpl.inflateBitmap", + "inflateBitmap " + + btk(bytes.length) + + " -> " + + bitmap.getWidth() + + "x" + + bitmap.getHeight() + + ", " + + btk(bitmap.getByteCount())); + } + } catch (OutOfMemoryError e) { + // Do nothing - the photo will appear to be missing + } + } + + /** Dump cache stats on logcat. */ + private void dumpStats() { + if (!DEBUG) { + return; + } + { + int numHolders = 0; + int rawBytes = 0; + int bitmapBytes = 0; + int numBitmaps = 0; + for (BitmapHolder h : mBitmapHolderCache.snapshot().values()) { + numHolders++; + if (h.bytes != null) { + rawBytes += h.bytes.length; + } + Bitmap b = h.bitmapRef != null ? h.bitmapRef.get() : null; + if (b != null) { + numBitmaps++; + bitmapBytes += b.getByteCount(); + } + } + LogUtil.d( + "ContactPhotoManagerImpl.dumpStats", + "L1: " + + btk(rawBytes) + + " + " + + btk(bitmapBytes) + + " = " + + btk(rawBytes + bitmapBytes) + + ", " + + numHolders + + " holders, " + + numBitmaps + + " bitmaps, avg: " + + btk(safeDiv(rawBytes, numHolders)) + + "," + + btk(safeDiv(bitmapBytes, numBitmaps))); + LogUtil.d( + "ContactPhotoManagerImpl.dumpStats", + "L1 Stats: " + + mBitmapHolderCache.toString() + + ", overwrite: fresh=" + + mFreshCacheOverwrite.get() + + " stale=" + + mStaleCacheOverwrite.get()); + } + + { + int numBitmaps = 0; + int bitmapBytes = 0; + for (Bitmap b : mBitmapCache.snapshot().values()) { + numBitmaps++; + bitmapBytes += b.getByteCount(); + } + LogUtil.d( + "ContactPhotoManagerImpl.dumpStats", + "L2: " + + btk(bitmapBytes) + + ", " + + numBitmaps + + " bitmaps" + + ", avg: " + + btk(safeDiv(bitmapBytes, numBitmaps))); + // We don't get from L2 cache, so L2 stats is meaningless. + } + } + + @Override + public void onTrimMemory(int level) { + if (DEBUG) { + LogUtil.d("ContactPhotoManagerImpl.onTrimMemory", "onTrimMemory: " + level); + } + if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) { + // Clear the caches. Note all pending requests will be removed too. + clear(); + } + } + + @Override + public void preloadPhotosInBackground() { + ensureLoaderThread(); + mLoaderThread.requestPreloading(); + } + + @Override + public void loadThumbnail( + ImageView view, + long photoId, + boolean darkTheme, + boolean isCircular, + DefaultImageRequest defaultImageRequest, + DefaultImageProvider defaultProvider) { + if (photoId == 0) { + // No photo is needed + defaultProvider.applyDefaultImage(view, -1, darkTheme, defaultImageRequest); + mPendingRequests.remove(view); + } else { + if (DEBUG) { + LogUtil.d("ContactPhotoManagerImpl.loadThumbnail", "loadPhoto request: " + photoId); + } + loadPhotoByIdOrUri( + view, Request.createFromThumbnailId(photoId, darkTheme, isCircular, defaultProvider)); + } + } + + @Override + public void loadPhoto( + ImageView view, + Uri photoUri, + int requestedExtent, + boolean darkTheme, + boolean isCircular, + DefaultImageRequest defaultImageRequest, + DefaultImageProvider defaultProvider) { + if (photoUri == null) { + // No photo is needed + defaultProvider.applyDefaultImage(view, requestedExtent, darkTheme, defaultImageRequest); + mPendingRequests.remove(view); + } else { + if (DEBUG) { + LogUtil.d("ContactPhotoManagerImpl.loadPhoto", "loadPhoto request: " + photoUri); + } + if (isDefaultImageUri(photoUri)) { + createAndApplyDefaultImageForUri( + view, photoUri, requestedExtent, darkTheme, isCircular, defaultProvider); + } else { + loadPhotoByIdOrUri( + view, + Request.createFromUri( + photoUri, requestedExtent, darkTheme, isCircular, defaultProvider)); + } + } + } + + private void createAndApplyDefaultImageForUri( + ImageView view, + Uri uri, + int requestedExtent, + boolean darkTheme, + boolean isCircular, + DefaultImageProvider defaultProvider) { + DefaultImageRequest request = getDefaultImageRequestFromUri(uri); + request.isCircular = isCircular; + defaultProvider.applyDefaultImage(view, requestedExtent, darkTheme, request); + } + + private void loadPhotoByIdOrUri(ImageView view, Request request) { + boolean loaded = loadCachedPhoto(view, request, false); + if (loaded) { + mPendingRequests.remove(view); + } else { + mPendingRequests.put(view, request); + if (!mPaused) { + // Send a request to start loading photos + requestLoading(); + } + } + } + + @Override + public void removePhoto(ImageView view) { + view.setImageDrawable(null); + mPendingRequests.remove(view); + } + + /** + * Cancels pending requests to load photos asynchronously for views inside {@param + * fragmentRootView}. If {@param fragmentRootView} is null, cancels all requests. + */ + @Override + public void cancelPendingRequests(View fragmentRootView) { + if (fragmentRootView == null) { + mPendingRequests.clear(); + return; + } + final Iterator> iterator = mPendingRequests.entrySet().iterator(); + while (iterator.hasNext()) { + final ImageView imageView = iterator.next().getKey(); + // If an ImageView is orphaned (currently scrap) or a child of fragmentRootView, then + // we can safely remove its request. + if (imageView.getParent() == null || isChildView(fragmentRootView, imageView)) { + iterator.remove(); + } + } + } + + @Override + public void refreshCache() { + if (mBitmapHolderCacheAllUnfresh) { + if (DEBUG) { + LogUtil.d("ContactPhotoManagerImpl.refreshCache", "refreshCache -- no fresh entries."); + } + return; + } + if (DEBUG) { + LogUtil.d("ContactPhotoManagerImpl.refreshCache", "refreshCache"); + } + mBitmapHolderCacheAllUnfresh = true; + for (BitmapHolder holder : mBitmapHolderCache.snapshot().values()) { + if (holder != BITMAP_UNAVAILABLE) { + holder.fresh = false; + } + } + } + + /** + * Checks if the photo is present in cache. If so, sets the photo on the view. + * + * @return false if the photo needs to be (re)loaded from the provider. + */ + @UiThread + private boolean loadCachedPhoto(ImageView view, Request request, boolean fadeIn) { + BitmapHolder holder = mBitmapHolderCache.get(request.getKey()); + if (holder == null) { + // The bitmap has not been loaded ==> show default avatar + request.applyDefaultImage(view, request.mIsCircular); + return false; + } + + if (holder.bytes == null) { + request.applyDefaultImage(view, request.mIsCircular); + return holder.fresh; + } + + Bitmap cachedBitmap = holder.bitmapRef == null ? null : holder.bitmapRef.get(); + if (cachedBitmap == null) { + request.applyDefaultImage(view, request.mIsCircular); + return false; + } + + final Drawable previousDrawable = view.getDrawable(); + if (fadeIn && previousDrawable != null) { + final Drawable[] layers = new Drawable[2]; + // Prevent cascade of TransitionDrawables. + if (previousDrawable instanceof TransitionDrawable) { + final TransitionDrawable previousTransitionDrawable = (TransitionDrawable) previousDrawable; + layers[0] = + previousTransitionDrawable.getDrawable( + previousTransitionDrawable.getNumberOfLayers() - 1); + } else { + layers[0] = previousDrawable; + } + layers[1] = getDrawableForBitmap(mContext.getResources(), cachedBitmap, request); + TransitionDrawable drawable = new TransitionDrawable(layers); + view.setImageDrawable(drawable); + drawable.startTransition(FADE_TRANSITION_DURATION); + } else { + view.setImageDrawable(getDrawableForBitmap(mContext.getResources(), cachedBitmap, request)); + } + + // Put the bitmap in the LRU cache. But only do this for images that are small enough + // (we require that at least six of those can be cached at the same time) + if (cachedBitmap.getByteCount() < mBitmapCache.maxSize() / 6) { + mBitmapCache.put(request.getKey(), cachedBitmap); + } + + // Soften the reference + holder.bitmap = null; + + return holder.fresh; + } + + /** + * Given a bitmap, returns a drawable that is configured to display the bitmap based on the + * specified request. + */ + private Drawable getDrawableForBitmap(Resources resources, Bitmap bitmap, Request request) { + if (request.mIsCircular) { + final RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(resources, bitmap); + drawable.setAntiAlias(true); + drawable.setCornerRadius(drawable.getIntrinsicHeight() / 2); + return drawable; + } else { + return new BitmapDrawable(resources, bitmap); + } + } + + public void clear() { + if (DEBUG) { + LogUtil.d("ContactPhotoManagerImpl.clear", "clear"); + } + mPendingRequests.clear(); + mBitmapHolderCache.evictAll(); + mBitmapCache.evictAll(); + } + + @Override + public void pause() { + mPaused = true; + } + + @Override + public void resume() { + mPaused = false; + if (DEBUG) { + dumpStats(); + } + if (!mPendingRequests.isEmpty()) { + requestLoading(); + } + } + + /** + * Sends a message to this thread itself to start loading images. If the current view contains + * multiple image views, all of those image views will get a chance to request their respective + * photos before any of those requests are executed. This allows us to load images in bulk. + */ + private void requestLoading() { + if (!mLoadingRequested) { + mLoadingRequested = true; + mMainThreadHandler.sendEmptyMessage(MESSAGE_REQUEST_LOADING); + } + } + + /** Processes requests on the main thread. */ + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case MESSAGE_REQUEST_LOADING: + { + mLoadingRequested = false; + if (!mPaused) { + ensureLoaderThread(); + mLoaderThread.requestLoading(); + } + return true; + } + + case MESSAGE_PHOTOS_LOADED: + { + if (!mPaused) { + processLoadedImages(); + } + if (DEBUG) { + dumpStats(); + } + return true; + } + default: + return false; + } + } + + public void ensureLoaderThread() { + if (mLoaderThread == null) { + mLoaderThread = new LoaderThread(mContext.getContentResolver()); + mLoaderThread.start(); + } + } + + /** + * Goes over pending loading requests and displays loaded photos. If some of the photos still + * haven't been loaded, sends another request for image loading. + */ + private void processLoadedImages() { + final Iterator> iterator = mPendingRequests.entrySet().iterator(); + while (iterator.hasNext()) { + final Entry entry = iterator.next(); + // TODO: Temporarily disable contact photo fading in, until issues with + // RoundedBitmapDrawables overlapping the default image drawables are resolved. + final boolean loaded = loadCachedPhoto(entry.getKey(), entry.getValue(), false); + if (loaded) { + iterator.remove(); + } + } + + softenCache(); + + if (!mPendingRequests.isEmpty()) { + requestLoading(); + } + } + + /** + * Removes strong references to loaded bitmaps to allow them to be garbage collected if needed. + * Some of the bitmaps will still be retained by {@link #mBitmapCache}. + */ + private void softenCache() { + for (BitmapHolder holder : mBitmapHolderCache.snapshot().values()) { + holder.bitmap = null; + } + } + + /** Stores the supplied bitmap in cache. */ + private void cacheBitmap(Object key, byte[] bytes, boolean preloading, int requestedExtent) { + if (DEBUG) { + BitmapHolder prev = mBitmapHolderCache.get(key); + if (prev != null && prev.bytes != null) { + LogUtil.d( + "ContactPhotoManagerImpl.cacheBitmap", + "overwriting cache: key=" + key + (prev.fresh ? " FRESH" : " stale")); + if (prev.fresh) { + mFreshCacheOverwrite.incrementAndGet(); + } else { + mStaleCacheOverwrite.incrementAndGet(); + } + } + LogUtil.d( + "ContactPhotoManagerImpl.cacheBitmap", + "caching data: key=" + key + ", " + (bytes == null ? "" : btk(bytes.length))); + } + BitmapHolder holder = + new BitmapHolder(bytes, bytes == null ? -1 : BitmapUtil.getSmallerExtentFromBytes(bytes)); + + // Unless this image is being preloaded, decode it right away while + // we are still on the background thread. + if (!preloading) { + inflateBitmap(holder, requestedExtent); + } + + if (bytes != null) { + mBitmapHolderCache.put(key, holder); + if (mBitmapHolderCache.get(key) != holder) { + LogUtil.w("ContactPhotoManagerImpl.cacheBitmap", "bitmap too big to fit in cache."); + mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); + } + } else { + mBitmapHolderCache.put(key, BITMAP_UNAVAILABLE); + } + + mBitmapHolderCacheAllUnfresh = false; + } + + /** + * Populates an array of photo IDs that need to be loaded. Also decodes bitmaps that we have + * already loaded + */ + private void obtainPhotoIdsAndUrisToLoad( + Set photoIds, Set photoIdsAsStrings, Set uris) { + photoIds.clear(); + photoIdsAsStrings.clear(); + uris.clear(); + + boolean jpegsDecoded = false; + + /* + * Since the call is made from the loader thread, the map could be + * changing during the iteration. That's not really a problem: + * ConcurrentHashMap will allow those changes to happen without throwing + * exceptions. Since we may miss some requests in the situation of + * concurrent change, we will need to check the map again once loading + * is complete. + */ + Iterator iterator = mPendingRequests.values().iterator(); + while (iterator.hasNext()) { + Request request = iterator.next(); + final BitmapHolder holder = mBitmapHolderCache.get(request.getKey()); + if (holder == BITMAP_UNAVAILABLE) { + continue; + } + if (holder != null + && holder.bytes != null + && holder.fresh + && (holder.bitmapRef == null || holder.bitmapRef.get() == null)) { + // This was previously loaded but we don't currently have the inflated Bitmap + inflateBitmap(holder, request.getRequestedExtent()); + jpegsDecoded = true; + } else { + if (holder == null || !holder.fresh) { + if (request.isUriRequest()) { + uris.add(request); + } else { + photoIds.add(request.getId()); + photoIdsAsStrings.add(String.valueOf(request.mId)); + } + } + } + } + + if (jpegsDecoded) { + mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED); + } + } + + /** Maintains the state of a particular photo. */ + private static class BitmapHolder { + + final byte[] bytes; + final int originalSmallerExtent; + + volatile boolean fresh; + Bitmap bitmap; + Reference bitmapRef; + int decodedSampleSize; + + public BitmapHolder(byte[] bytes, int originalSmallerExtent) { + this.bytes = bytes; + this.fresh = true; + this.originalSmallerExtent = originalSmallerExtent; + } + } + + /** + * A holder for either a Uri or an id and a flag whether this was requested for the dark or light + * theme + */ + private static final class Request { + + private final long mId; + private final Uri mUri; + private final boolean mDarkTheme; + private final int mRequestedExtent; + private final DefaultImageProvider mDefaultProvider; + /** Whether or not the contact photo is to be displayed as a circle */ + private final boolean mIsCircular; + + private Request( + long id, + Uri uri, + int requestedExtent, + boolean darkTheme, + boolean isCircular, + DefaultImageProvider defaultProvider) { + mId = id; + mUri = uri; + mDarkTheme = darkTheme; + mIsCircular = isCircular; + mRequestedExtent = requestedExtent; + mDefaultProvider = defaultProvider; + } + + public static Request createFromThumbnailId( + long id, boolean darkTheme, boolean isCircular, DefaultImageProvider defaultProvider) { + return new Request(id, null /* no URI */, -1, darkTheme, isCircular, defaultProvider); + } + + public static Request createFromUri( + Uri uri, + int requestedExtent, + boolean darkTheme, + boolean isCircular, + DefaultImageProvider defaultProvider) { + return new Request( + 0 /* no ID */, uri, requestedExtent, darkTheme, isCircular, defaultProvider); + } + + public boolean isUriRequest() { + return mUri != null; + } + + public Uri getUri() { + return mUri; + } + + public long getId() { + return mId; + } + + public int getRequestedExtent() { + return mRequestedExtent; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (mId ^ (mId >>> 32)); + result = prime * result + mRequestedExtent; + result = prime * result + ((mUri == null) ? 0 : mUri.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Request that = (Request) obj; + if (mId != that.mId) { + return false; + } + if (mRequestedExtent != that.mRequestedExtent) { + return false; + } + if (!UriUtils.areEqual(mUri, that.mUri)) { + return false; + } + // Don't compare equality of mDarkTheme because it is only used in the default contact + // photo case. When the contact does have a photo, the contact photo is the same + // regardless of mDarkTheme, so we shouldn't need to put the photo request on the queue + // twice. + return true; + } + + public Object getKey() { + return mUri == null ? mId : mUri; + } + + /** + * Applies the default image to the current view. If the request is URI-based, looks for the + * contact type encoded fragment to determine if this is a request for a business photo, in + * which case we will load the default business photo. + * + * @param view The current image view to apply the image to. + * @param isCircular Whether the image is circular or not. + */ + public void applyDefaultImage(ImageView view, boolean isCircular) { + final DefaultImageRequest request; + + if (isCircular) { + request = + ContactPhotoManager.isBusinessContactUri(mUri) + ? DefaultImageRequest.EMPTY_CIRCULAR_BUSINESS_IMAGE_REQUEST + : DefaultImageRequest.EMPTY_CIRCULAR_DEFAULT_IMAGE_REQUEST; + } else { + request = + ContactPhotoManager.isBusinessContactUri(mUri) + ? DefaultImageRequest.EMPTY_DEFAULT_BUSINESS_IMAGE_REQUEST + : DefaultImageRequest.EMPTY_DEFAULT_IMAGE_REQUEST; + } + mDefaultProvider.applyDefaultImage(view, mRequestedExtent, mDarkTheme, request); + } + } + + /** The thread that performs loading of photos from the database. */ + private class LoaderThread extends HandlerThread implements Callback { + + private static final int BUFFER_SIZE = 1024 * 16; + private static final int MESSAGE_PRELOAD_PHOTOS = 0; + private static final int MESSAGE_LOAD_PHOTOS = 1; + + /** A pause between preload batches that yields to the UI thread. */ + private static final int PHOTO_PRELOAD_DELAY = 1000; + + /** Number of photos to preload per batch. */ + private static final int PRELOAD_BATCH = 25; + + /** + * Maximum number of photos to preload. If the cache size is 2Mb and the expected average size + * of a photo is 4kb, then this number should be 2Mb/4kb = 500. + */ + private static final int MAX_PHOTOS_TO_PRELOAD = 100; + + private static final int PRELOAD_STATUS_NOT_STARTED = 0; + private static final int PRELOAD_STATUS_IN_PROGRESS = 1; + private static final int PRELOAD_STATUS_DONE = 2; + private final ContentResolver mResolver; + private final StringBuilder mStringBuilder = new StringBuilder(); + private final Set mPhotoIds = new HashSet<>(); + private final Set mPhotoIdsAsStrings = new HashSet<>(); + private final Set mPhotoUris = new HashSet<>(); + private final List mPreloadPhotoIds = new ArrayList<>(); + private Handler mLoaderThreadHandler; + private byte[] mBuffer; + private int mPreloadStatus = PRELOAD_STATUS_NOT_STARTED; + + public LoaderThread(ContentResolver resolver) { + super(LOADER_THREAD_NAME); + mResolver = resolver; + } + + public void ensureHandler() { + if (mLoaderThreadHandler == null) { + mLoaderThreadHandler = new Handler(getLooper(), this); + } + } + + /** + * Kicks off preloading of the next batch of photos on the background thread. Preloading will + * happen after a delay: we want to yield to the UI thread as much as possible. + * + *

If preloading is already complete, does nothing. + */ + public void requestPreloading() { + if (mPreloadStatus == PRELOAD_STATUS_DONE) { + return; + } + + ensureHandler(); + if (mLoaderThreadHandler.hasMessages(MESSAGE_LOAD_PHOTOS)) { + return; + } + + mLoaderThreadHandler.sendEmptyMessageDelayed(MESSAGE_PRELOAD_PHOTOS, PHOTO_PRELOAD_DELAY); + } + + /** + * Sends a message to this thread to load requested photos. Cancels a preloading request, if + * any: we don't want preloading to impede loading of the photos we need to display now. + */ + public void requestLoading() { + ensureHandler(); + mLoaderThreadHandler.removeMessages(MESSAGE_PRELOAD_PHOTOS); + mLoaderThreadHandler.sendEmptyMessage(MESSAGE_LOAD_PHOTOS); + } + + /** + * Receives the above message, loads photos and then sends a message to the main thread to + * process them. + */ + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case MESSAGE_PRELOAD_PHOTOS: + preloadPhotosInBackground(); + break; + case MESSAGE_LOAD_PHOTOS: + loadPhotosInBackground(); + break; + } + return true; + } + + /** + * The first time it is called, figures out which photos need to be preloaded. Each subsequent + * call preloads the next batch of photos and requests another cycle of preloading after a + * delay. The whole process ends when we either run out of photos to preload or fill up cache. + */ + @WorkerThread + private void preloadPhotosInBackground() { + if (!PermissionsUtil.hasPermission(mContext, android.Manifest.permission.READ_CONTACTS)) { + return; + } + + if (mPreloadStatus == PRELOAD_STATUS_DONE) { + return; + } + + if (mPreloadStatus == PRELOAD_STATUS_NOT_STARTED) { + queryPhotosForPreload(); + if (mPreloadPhotoIds.isEmpty()) { + mPreloadStatus = PRELOAD_STATUS_DONE; + } else { + mPreloadStatus = PRELOAD_STATUS_IN_PROGRESS; + } + requestPreloading(); + return; + } + + if (mBitmapHolderCache.size() > mBitmapHolderCacheRedZoneBytes) { + mPreloadStatus = PRELOAD_STATUS_DONE; + return; + } + + mPhotoIds.clear(); + mPhotoIdsAsStrings.clear(); + + int count = 0; + int preloadSize = mPreloadPhotoIds.size(); + while (preloadSize > 0 && mPhotoIds.size() < PRELOAD_BATCH) { + preloadSize--; + count++; + Long photoId = mPreloadPhotoIds.get(preloadSize); + mPhotoIds.add(photoId); + mPhotoIdsAsStrings.add(photoId.toString()); + mPreloadPhotoIds.remove(preloadSize); + } + + loadThumbnails(true); + + if (preloadSize == 0) { + mPreloadStatus = PRELOAD_STATUS_DONE; + } + + LogUtil.v( + "ContactPhotoManagerImpl.preloadPhotosInBackground", + "preloaded " + count + " photos. cached bytes: " + mBitmapHolderCache.size()); + + requestPreloading(); + } + + @WorkerThread + private void queryPhotosForPreload() { + Cursor cursor = null; + try { + Uri uri = + Contacts.CONTENT_URI + .buildUpon() + .appendQueryParameter( + ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT)) + .appendQueryParameter( + ContactsContract.LIMIT_PARAM_KEY, String.valueOf(MAX_PHOTOS_TO_PRELOAD)) + .build(); + cursor = + mResolver.query( + uri, + new String[] {Contacts.PHOTO_ID}, + Contacts.PHOTO_ID + " NOT NULL AND " + Contacts.PHOTO_ID + "!=0", + null, + Contacts.STARRED + " DESC, " + Contacts.LAST_TIME_CONTACTED + " DESC"); + + if (cursor != null) { + while (cursor.moveToNext()) { + // Insert them in reverse order, because we will be taking + // them from the end of the list for loading. + mPreloadPhotoIds.add(0, cursor.getLong(0)); + } + } + } finally { + if (cursor != null) { + cursor.close(); + } + } + } + + @WorkerThread + private void loadPhotosInBackground() { + if (!PermissionsUtil.hasPermission(mContext, android.Manifest.permission.READ_CONTACTS)) { + return; + } + obtainPhotoIdsAndUrisToLoad(mPhotoIds, mPhotoIdsAsStrings, mPhotoUris); + loadThumbnails(false); + loadUriBasedPhotos(); + requestPreloading(); + } + + /** Loads thumbnail photos with ids */ + @WorkerThread + private void loadThumbnails(boolean preloading) { + if (mPhotoIds.isEmpty()) { + return; + } + + // Remove loaded photos from the preload queue: we don't want + // the preloading process to load them again. + if (!preloading && mPreloadStatus == PRELOAD_STATUS_IN_PROGRESS) { + for (Long id : mPhotoIds) { + mPreloadPhotoIds.remove(id); + } + if (mPreloadPhotoIds.isEmpty()) { + mPreloadStatus = PRELOAD_STATUS_DONE; + } + } + + mStringBuilder.setLength(0); + mStringBuilder.append(Photo._ID + " IN("); + for (int i = 0; i < mPhotoIds.size(); i++) { + if (i != 0) { + mStringBuilder.append(','); + } + mStringBuilder.append('?'); + } + mStringBuilder.append(')'); + + Cursor cursor = null; + try { + if (DEBUG) { + LogUtil.d( + "ContactPhotoManagerImpl.loadThumbnails", + "loading " + TextUtils.join(",", mPhotoIdsAsStrings)); + } + cursor = + mResolver.query( + Data.CONTENT_URI, + COLUMNS, + mStringBuilder.toString(), + mPhotoIdsAsStrings.toArray(EMPTY_STRING_ARRAY), + null); + + if (cursor != null) { + while (cursor.moveToNext()) { + Long id = cursor.getLong(0); + byte[] bytes = cursor.getBlob(1); + cacheBitmap(id, bytes, preloading, -1); + mPhotoIds.remove(id); + } + } + } finally { + if (cursor != null) { + cursor.close(); + } + } + + // Remaining photos were not found in the contacts database (but might be in profile). + for (Long id : mPhotoIds) { + if (ContactsContract.isProfileId(id)) { + Cursor profileCursor = null; + try { + profileCursor = + mResolver.query( + ContentUris.withAppendedId(Data.CONTENT_URI, id), COLUMNS, null, null, null); + if (profileCursor != null && profileCursor.moveToFirst()) { + cacheBitmap(profileCursor.getLong(0), profileCursor.getBlob(1), preloading, -1); + } else { + // Couldn't load a photo this way either. + cacheBitmap(id, null, preloading, -1); + } + } finally { + if (profileCursor != null) { + profileCursor.close(); + } + } + } else { + // Not a profile photo and not found - mark the cache accordingly + cacheBitmap(id, null, preloading, -1); + } + } + + mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED); + } + + /** + * Loads photos referenced with Uris. Those can be remote thumbnails (from directory searches), + * display photos etc + */ + @WorkerThread + private void loadUriBasedPhotos() { + for (Request uriRequest : mPhotoUris) { + // Keep the original URI and use this to key into the cache. Failure to do so will + // result in an image being continually reloaded into cache if the original URI + // has a contact type encodedFragment (eg nearby places business photo URLs). + Uri originalUri = uriRequest.getUri(); + + // Strip off the "contact type" we added to the URI to ensure it was identifiable as + // a business photo -- there is no need to pass this on to the server. + Uri uri = ContactPhotoManager.removeContactType(originalUri); + + if (mBuffer == null) { + mBuffer = new byte[BUFFER_SIZE]; + } + try { + if (DEBUG) { + LogUtil.d("ContactPhotoManagerImpl.loadUriBasedPhotos", "loading " + uri); + } + final String scheme = uri.getScheme(); + InputStream is = null; + if (scheme.equals("http") || scheme.equals("https")) { + TrafficStats.setThreadStatsTag(TrafficStatsTags.CONTACT_PHOTO_DOWNLOAD_TAG); + try { + final HttpURLConnection connection = + (HttpURLConnection) new URL(uri.toString()).openConnection(); + + // Include the user agent if it is specified. + if (!TextUtils.isEmpty(mUserAgent)) { + connection.setRequestProperty("User-Agent", mUserAgent); + } + try { + is = connection.getInputStream(); + } catch (IOException e) { + connection.disconnect(); + is = null; + } + } finally { + TrafficStats.clearThreadStatsTag(); + } + } else { + is = mResolver.openInputStream(uri); + } + if (is != null) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + int size; + while ((size = is.read(mBuffer)) != -1) { + baos.write(mBuffer, 0, size); + } + } finally { + is.close(); + } + cacheBitmap(originalUri, baos.toByteArray(), false, uriRequest.getRequestedExtent()); + mMainThreadHandler.sendEmptyMessage(MESSAGE_PHOTOS_LOADED); + } else { + LogUtil.v("ContactPhotoManagerImpl.loadUriBasedPhotos", "cannot load photo " + uri); + cacheBitmap(originalUri, null, false, uriRequest.getRequestedExtent()); + } + } catch (final Exception | OutOfMemoryError ex) { + LogUtil.v("ContactPhotoManagerImpl.loadUriBasedPhotos", "cannot load photo " + uri, ex); + cacheBitmap(originalUri, null, false, uriRequest.getRequestedExtent()); + } + } + } + } +} diff --git a/java/com/android/dialer/contactphoto/res/values-af/strings.xml b/java/com/android/dialer/contactphoto/res/values-af/strings.xml new file mode 100644 index 000000000..c3d5f7831 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-af/strings.xml @@ -0,0 +1,21 @@ + + + + + "Vinnige kontak vir %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-am/strings.xml b/java/com/android/dialer/contactphoto/res/values-am/strings.xml new file mode 100644 index 000000000..949a018f8 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-am/strings.xml @@ -0,0 +1,21 @@ + + + + + "ለ%1$s ፈጣን ዕውቂያ" + diff --git a/java/com/android/dialer/contactphoto/res/values-ar/strings.xml b/java/com/android/dialer/contactphoto/res/values-ar/strings.xml new file mode 100644 index 000000000..a11eeea0a --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ar/strings.xml @@ -0,0 +1,21 @@ + + + + + "اتصال سريع لـ %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-az/strings.xml b/java/com/android/dialer/contactphoto/res/values-az/strings.xml new file mode 100644 index 000000000..355995165 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-az/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s üçün cəld kontakt" + diff --git a/java/com/android/dialer/contactphoto/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/contactphoto/res/values-b+sr+Latn/strings.xml new file mode 100644 index 000000000..8932e55af --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,21 @@ + + + + + "Brzi kontakt za: %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-be/strings.xml b/java/com/android/dialer/contactphoto/res/values-be/strings.xml new file mode 100644 index 000000000..70eb91ba4 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-be/strings.xml @@ -0,0 +1,21 @@ + + + + + "Хуткі кантакт для карыстальніка %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-bg/strings.xml b/java/com/android/dialer/contactphoto/res/values-bg/strings.xml new file mode 100644 index 000000000..4c15cec95 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-bg/strings.xml @@ -0,0 +1,21 @@ + + + + + "Бърз контакт за %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-bn/strings.xml b/java/com/android/dialer/contactphoto/res/values-bn/strings.xml new file mode 100644 index 000000000..62a7ddb5f --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-bn/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s এর জন্য দ্রুত পরিচিতি" + diff --git a/java/com/android/dialer/contactphoto/res/values-bs/strings.xml b/java/com/android/dialer/contactphoto/res/values-bs/strings.xml new file mode 100644 index 000000000..de9e970c7 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-bs/strings.xml @@ -0,0 +1,21 @@ + + + + + "Brzi kontakt za %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-ca/strings.xml b/java/com/android/dialer/contactphoto/res/values-ca/strings.xml new file mode 100644 index 000000000..c6276fbf6 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ca/strings.xml @@ -0,0 +1,21 @@ + + + + + "Contacte ràpid per a %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-cs/strings.xml b/java/com/android/dialer/contactphoto/res/values-cs/strings.xml new file mode 100644 index 000000000..2a37e59a4 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-cs/strings.xml @@ -0,0 +1,21 @@ + + + + + "Rychlý kontakt %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-da/strings.xml b/java/com/android/dialer/contactphoto/res/values-da/strings.xml new file mode 100644 index 000000000..3df138628 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-da/strings.xml @@ -0,0 +1,21 @@ + + + + + "Hurtigkontakt for %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-de/strings.xml b/java/com/android/dialer/contactphoto/res/values-de/strings.xml new file mode 100644 index 000000000..e182ea511 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-de/strings.xml @@ -0,0 +1,21 @@ + + + + + "Schnellkontakt für %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-el/strings.xml b/java/com/android/dialer/contactphoto/res/values-el/strings.xml new file mode 100644 index 000000000..537f41e02 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-el/strings.xml @@ -0,0 +1,21 @@ + + + + + "Γρήγορη επαφή για %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-en-rAU/strings.xml b/java/com/android/dialer/contactphoto/res/values-en-rAU/strings.xml new file mode 100644 index 000000000..9ce88e726 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-en-rAU/strings.xml @@ -0,0 +1,21 @@ + + + + + "Quick contact for %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-en-rGB/strings.xml b/java/com/android/dialer/contactphoto/res/values-en-rGB/strings.xml new file mode 100644 index 000000000..9ce88e726 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-en-rGB/strings.xml @@ -0,0 +1,21 @@ + + + + + "Quick contact for %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-en-rIN/strings.xml b/java/com/android/dialer/contactphoto/res/values-en-rIN/strings.xml new file mode 100644 index 000000000..9ce88e726 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-en-rIN/strings.xml @@ -0,0 +1,21 @@ + + + + + "Quick contact for %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-es-rUS/strings.xml b/java/com/android/dialer/contactphoto/res/values-es-rUS/strings.xml new file mode 100644 index 000000000..315978e77 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-es-rUS/strings.xml @@ -0,0 +1,21 @@ + + + + + "Contacto rápido de %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-es/strings.xml b/java/com/android/dialer/contactphoto/res/values-es/strings.xml new file mode 100644 index 000000000..315978e77 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-es/strings.xml @@ -0,0 +1,21 @@ + + + + + "Contacto rápido de %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-et/strings.xml b/java/com/android/dialer/contactphoto/res/values-et/strings.xml new file mode 100644 index 000000000..1db8d7523 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-et/strings.xml @@ -0,0 +1,21 @@ + + + + + "Kiirkontakt: %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-eu/strings.xml b/java/com/android/dialer/contactphoto/res/values-eu/strings.xml new file mode 100644 index 000000000..4be6d832a --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-eu/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s erabiltzailearen kontaktu bizkorra" + diff --git a/java/com/android/dialer/contactphoto/res/values-fa/strings.xml b/java/com/android/dialer/contactphoto/res/values-fa/strings.xml new file mode 100644 index 000000000..63fc2cb16 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-fa/strings.xml @@ -0,0 +1,21 @@ + + + + + "تماس سریع برای %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-fi/strings.xml b/java/com/android/dialer/contactphoto/res/values-fi/strings.xml new file mode 100644 index 000000000..6109e8613 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-fi/strings.xml @@ -0,0 +1,21 @@ + + + + + "Pikayhteys henkilöön %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-fr-rCA/strings.xml b/java/com/android/dialer/contactphoto/res/values-fr-rCA/strings.xml new file mode 100644 index 000000000..353920ef1 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-fr-rCA/strings.xml @@ -0,0 +1,21 @@ + + + + + "Lien rapide vers %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-fr/strings.xml b/java/com/android/dialer/contactphoto/res/values-fr/strings.xml new file mode 100644 index 000000000..353920ef1 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-fr/strings.xml @@ -0,0 +1,21 @@ + + + + + "Lien rapide vers %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-gl/strings.xml b/java/com/android/dialer/contactphoto/res/values-gl/strings.xml new file mode 100644 index 000000000..f65800ded --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-gl/strings.xml @@ -0,0 +1,21 @@ + + + + + "Contacto rápido para %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-gu/strings.xml b/java/com/android/dialer/contactphoto/res/values-gu/strings.xml new file mode 100644 index 000000000..323b74fbb --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-gu/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s માટે ઝડપી સંપર્ક" + diff --git a/java/com/android/dialer/contactphoto/res/values-hi/strings.xml b/java/com/android/dialer/contactphoto/res/values-hi/strings.xml new file mode 100644 index 000000000..08b2322d6 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-hi/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s के लिए झटपट संपर्क" + diff --git a/java/com/android/dialer/contactphoto/res/values-hr/strings.xml b/java/com/android/dialer/contactphoto/res/values-hr/strings.xml new file mode 100644 index 000000000..36b97f5dd --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-hr/strings.xml @@ -0,0 +1,21 @@ + + + + + "Brzi kontakt za korisnika %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-hu/strings.xml b/java/com/android/dialer/contactphoto/res/values-hu/strings.xml new file mode 100644 index 000000000..70223a3fe --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-hu/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s gyors elérése" + diff --git a/java/com/android/dialer/contactphoto/res/values-hy/strings.xml b/java/com/android/dialer/contactphoto/res/values-hy/strings.xml new file mode 100644 index 000000000..af84ef336 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-hy/strings.xml @@ -0,0 +1,21 @@ + + + + + "Արագ հաղորդակցում %1$s-ի հետ" + diff --git a/java/com/android/dialer/contactphoto/res/values-in/strings.xml b/java/com/android/dialer/contactphoto/res/values-in/strings.xml new file mode 100644 index 000000000..0295a30f7 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-in/strings.xml @@ -0,0 +1,21 @@ + + + + + "Kontak kilat untuk %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-is/strings.xml b/java/com/android/dialer/contactphoto/res/values-is/strings.xml new file mode 100644 index 000000000..8b6a988b1 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-is/strings.xml @@ -0,0 +1,21 @@ + + + + + "Flýtitengiliður fyrir %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-it/strings.xml b/java/com/android/dialer/contactphoto/res/values-it/strings.xml new file mode 100644 index 000000000..4abc81e07 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-it/strings.xml @@ -0,0 +1,21 @@ + + + + + "Contatto rapido per %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-iw/strings.xml b/java/com/android/dialer/contactphoto/res/values-iw/strings.xml new file mode 100644 index 000000000..bae1c2802 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-iw/strings.xml @@ -0,0 +1,21 @@ + + + + + "קשר מהיר עבור %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-ja/strings.xml b/java/com/android/dialer/contactphoto/res/values-ja/strings.xml new file mode 100644 index 000000000..f1aae7e7c --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ja/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s さんのクイックコンタクト" + diff --git a/java/com/android/dialer/contactphoto/res/values-ka/strings.xml b/java/com/android/dialer/contactphoto/res/values-ka/strings.xml new file mode 100644 index 000000000..48c520322 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ka/strings.xml @@ -0,0 +1,21 @@ + + + + + "სწრაფი კონტაქტი %1$s-თან" + diff --git a/java/com/android/dialer/contactphoto/res/values-kk/strings.xml b/java/com/android/dialer/contactphoto/res/values-kk/strings.xml new file mode 100644 index 000000000..125300608 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-kk/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s үшін жылдам байланыс" + diff --git a/java/com/android/dialer/contactphoto/res/values-km/strings.xml b/java/com/android/dialer/contactphoto/res/values-km/strings.xml new file mode 100644 index 000000000..16c71bd1c --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-km/strings.xml @@ -0,0 +1,21 @@ + + + + + "ទំនាក់ទំនង​រហ័ស​សម្រាប់ %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-kn/strings.xml b/java/com/android/dialer/contactphoto/res/values-kn/strings.xml new file mode 100644 index 000000000..3ed2bd067 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-kn/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s ಅವರಿಗೆ ತ್ವರಿತ ಸಂಪರ್ಕ" + diff --git a/java/com/android/dialer/contactphoto/res/values-ko/strings.xml b/java/com/android/dialer/contactphoto/res/values-ko/strings.xml new file mode 100644 index 000000000..512c2d80e --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ko/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s님의 빠른 주소록" + diff --git a/java/com/android/dialer/contactphoto/res/values-ky/strings.xml b/java/com/android/dialer/contactphoto/res/values-ky/strings.xml new file mode 100644 index 000000000..7ea41966a --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ky/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s үчүн тез байланышуу" + diff --git a/java/com/android/dialer/contactphoto/res/values-lo/strings.xml b/java/com/android/dialer/contactphoto/res/values-lo/strings.xml new file mode 100644 index 000000000..0b9d624c6 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-lo/strings.xml @@ -0,0 +1,21 @@ + + + + + "ຂໍ້ມູນຕິດຕໍ່ດ່ວນສຳລັບ %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-lt/strings.xml b/java/com/android/dialer/contactphoto/res/values-lt/strings.xml new file mode 100644 index 000000000..4d5d86e8f --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-lt/strings.xml @@ -0,0 +1,21 @@ + + + + + "Spartusis %1$s kontaktas" + diff --git a/java/com/android/dialer/contactphoto/res/values-lv/strings.xml b/java/com/android/dialer/contactphoto/res/values-lv/strings.xml new file mode 100644 index 000000000..1fc145771 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-lv/strings.xml @@ -0,0 +1,21 @@ + + + + + "Ātrā saziņa ar kontaktpersonu %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-mk/strings.xml b/java/com/android/dialer/contactphoto/res/values-mk/strings.xml new file mode 100644 index 000000000..0d84df8d6 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-mk/strings.xml @@ -0,0 +1,21 @@ + + + + + "Брз контакт за %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-ml/strings.xml b/java/com/android/dialer/contactphoto/res/values-ml/strings.xml new file mode 100644 index 000000000..695917b1c --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ml/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s എന്നയാളുടെ ദ്രുത കോൺടാക്റ്റ്" + diff --git a/java/com/android/dialer/contactphoto/res/values-mn/strings.xml b/java/com/android/dialer/contactphoto/res/values-mn/strings.xml new file mode 100644 index 000000000..bf28c8b8c --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-mn/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s-н Шуурхай хаяг" + diff --git a/java/com/android/dialer/contactphoto/res/values-mr/strings.xml b/java/com/android/dialer/contactphoto/res/values-mr/strings.xml new file mode 100644 index 000000000..a7cba8d84 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-mr/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s साठी जलद संपर्क" + diff --git a/java/com/android/dialer/contactphoto/res/values-ms/strings.xml b/java/com/android/dialer/contactphoto/res/values-ms/strings.xml new file mode 100644 index 000000000..e6b74d233 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ms/strings.xml @@ -0,0 +1,21 @@ + + + + + "Kenalan cepat untuk %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-my/strings.xml b/java/com/android/dialer/contactphoto/res/values-my/strings.xml new file mode 100644 index 000000000..05965d109 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-my/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s အတွက် အမြန်အဆက်အသွယ်" + diff --git a/java/com/android/dialer/contactphoto/res/values-nb/strings.xml b/java/com/android/dialer/contactphoto/res/values-nb/strings.xml new file mode 100644 index 000000000..3df138628 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-nb/strings.xml @@ -0,0 +1,21 @@ + + + + + "Hurtigkontakt for %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-ne/strings.xml b/java/com/android/dialer/contactphoto/res/values-ne/strings.xml new file mode 100644 index 000000000..906dffe89 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ne/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$sको छिटो सम्पर्क" + diff --git a/java/com/android/dialer/contactphoto/res/values-nl/strings.xml b/java/com/android/dialer/contactphoto/res/values-nl/strings.xml new file mode 100644 index 000000000..a7046e59b --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-nl/strings.xml @@ -0,0 +1,21 @@ + + + + + "Snelcontact voor %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-no/strings.xml b/java/com/android/dialer/contactphoto/res/values-no/strings.xml new file mode 100644 index 000000000..3df138628 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-no/strings.xml @@ -0,0 +1,21 @@ + + + + + "Hurtigkontakt for %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-pa/strings.xml b/java/com/android/dialer/contactphoto/res/values-pa/strings.xml new file mode 100644 index 000000000..b94a4d538 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-pa/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s ਲਈ ਤਤਕਾਲ ਸੰਪਰਕ" + diff --git a/java/com/android/dialer/contactphoto/res/values-pl/strings.xml b/java/com/android/dialer/contactphoto/res/values-pl/strings.xml new file mode 100644 index 000000000..91a4c2225 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-pl/strings.xml @@ -0,0 +1,21 @@ + + + + + "Szybki kontakt: %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-pt-rBR/strings.xml b/java/com/android/dialer/contactphoto/res/values-pt-rBR/strings.xml new file mode 100644 index 000000000..8cd099627 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-pt-rBR/strings.xml @@ -0,0 +1,21 @@ + + + + + "Contato rápido de %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-pt-rPT/strings.xml b/java/com/android/dialer/contactphoto/res/values-pt-rPT/strings.xml new file mode 100644 index 000000000..fdb5cf7a1 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-pt-rPT/strings.xml @@ -0,0 +1,21 @@ + + + + + "Contactos rápidos para %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-pt/strings.xml b/java/com/android/dialer/contactphoto/res/values-pt/strings.xml new file mode 100644 index 000000000..8cd099627 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-pt/strings.xml @@ -0,0 +1,21 @@ + + + + + "Contato rápido de %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-ro/strings.xml b/java/com/android/dialer/contactphoto/res/values-ro/strings.xml new file mode 100644 index 000000000..5872c36bf --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ro/strings.xml @@ -0,0 +1,21 @@ + + + + + "Contact rapid pentru %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-ru/strings.xml b/java/com/android/dialer/contactphoto/res/values-ru/strings.xml new file mode 100644 index 000000000..efb1cc417 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ru/strings.xml @@ -0,0 +1,21 @@ + + + + + "Быстрый вызов, контакт: %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-si/strings.xml b/java/com/android/dialer/contactphoto/res/values-si/strings.xml new file mode 100644 index 000000000..7abbdbe32 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-si/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s සඳහා ඉක්මන් සම්බන්ධතාව" + diff --git a/java/com/android/dialer/contactphoto/res/values-sk/strings.xml b/java/com/android/dialer/contactphoto/res/values-sk/strings.xml new file mode 100644 index 000000000..2abf26a9c --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-sk/strings.xml @@ -0,0 +1,21 @@ + + + + + "Rýchly kontakt pre osobu %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-sl/strings.xml b/java/com/android/dialer/contactphoto/res/values-sl/strings.xml new file mode 100644 index 000000000..c3f120720 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-sl/strings.xml @@ -0,0 +1,21 @@ + + + + + "Hitri stik za %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-sq/strings.xml b/java/com/android/dialer/contactphoto/res/values-sq/strings.xml new file mode 100644 index 000000000..96a83e79b --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-sq/strings.xml @@ -0,0 +1,21 @@ + + + + + "Kontakti i shpejtë për %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-sr/strings.xml b/java/com/android/dialer/contactphoto/res/values-sr/strings.xml new file mode 100644 index 000000000..16df264a2 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-sr/strings.xml @@ -0,0 +1,21 @@ + + + + + "Брзи контакт за: %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-sv/strings.xml b/java/com/android/dialer/contactphoto/res/values-sv/strings.xml new file mode 100644 index 000000000..217230f8c --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-sv/strings.xml @@ -0,0 +1,21 @@ + + + + + "Snabbkontakt för %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-sw/strings.xml b/java/com/android/dialer/contactphoto/res/values-sw/strings.xml new file mode 100644 index 000000000..8127e25d5 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-sw/strings.xml @@ -0,0 +1,21 @@ + + + + + "Wasiliana kwa haraka na %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-ta/strings.xml b/java/com/android/dialer/contactphoto/res/values-ta/strings.xml new file mode 100644 index 000000000..4e488fd6a --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ta/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$sக்கான விரைவுத் தொடர்பு" + diff --git a/java/com/android/dialer/contactphoto/res/values-te/strings.xml b/java/com/android/dialer/contactphoto/res/values-te/strings.xml new file mode 100644 index 000000000..0bcf37a84 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-te/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s కోసం త్వరిత సంప్రదింపు" + diff --git a/java/com/android/dialer/contactphoto/res/values-th/strings.xml b/java/com/android/dialer/contactphoto/res/values-th/strings.xml new file mode 100644 index 000000000..02470c41d --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-th/strings.xml @@ -0,0 +1,21 @@ + + + + + "สมุดโทรศัพท์ด่วนสำหรับ %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-tl/strings.xml b/java/com/android/dialer/contactphoto/res/values-tl/strings.xml new file mode 100644 index 000000000..9a1de3637 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-tl/strings.xml @@ -0,0 +1,21 @@ + + + + + "Mabilisan na contact para kay %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-tr/strings.xml b/java/com/android/dialer/contactphoto/res/values-tr/strings.xml new file mode 100644 index 000000000..310233f8b --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-tr/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s için hızlı iletişim" + diff --git a/java/com/android/dialer/contactphoto/res/values-uk/strings.xml b/java/com/android/dialer/contactphoto/res/values-uk/strings.xml new file mode 100644 index 000000000..5eceb6fcd --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-uk/strings.xml @@ -0,0 +1,21 @@ + + + + + "Швидкий контакт із користувачем %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-ur/strings.xml b/java/com/android/dialer/contactphoto/res/values-ur/strings.xml new file mode 100644 index 000000000..fa7221ca5 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-ur/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s کیلئے فوری رابطہ" + diff --git a/java/com/android/dialer/contactphoto/res/values-uz/strings.xml b/java/com/android/dialer/contactphoto/res/values-uz/strings.xml new file mode 100644 index 000000000..6eb28ee13 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-uz/strings.xml @@ -0,0 +1,21 @@ + + + + + "Tezkor chaqiruv, kontakt: %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-vi/strings.xml b/java/com/android/dialer/contactphoto/res/values-vi/strings.xml new file mode 100644 index 000000000..f10ea2f51 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-vi/strings.xml @@ -0,0 +1,21 @@ + + + + + "Liên hệ nhanh cho %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-zh-rCN/strings.xml b/java/com/android/dialer/contactphoto/res/values-zh-rCN/strings.xml new file mode 100644 index 000000000..1739077d7 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-zh-rCN/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s的快捷联系方式" + diff --git a/java/com/android/dialer/contactphoto/res/values-zh-rHK/strings.xml b/java/com/android/dialer/contactphoto/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000..53f6fddf2 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-zh-rHK/strings.xml @@ -0,0 +1,21 @@ + + + + + "快速聯絡%1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values-zh-rTW/strings.xml b/java/com/android/dialer/contactphoto/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000..a4eca1eae --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-zh-rTW/strings.xml @@ -0,0 +1,21 @@ + + + + + "%1$s的快速聯絡人相片" + diff --git a/java/com/android/dialer/contactphoto/res/values-zu/strings.xml b/java/com/android/dialer/contactphoto/res/values-zu/strings.xml new file mode 100644 index 000000000..f8cf07442 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values-zu/strings.xml @@ -0,0 +1,21 @@ + + + + + "Oxhumene naye ngokushesha ku %1$s" + diff --git a/java/com/android/dialer/contactphoto/res/values/dimens.xml b/java/com/android/dialer/contactphoto/res/values/dimens.xml new file mode 100644 index 000000000..7c3361a4a --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values/dimens.xml @@ -0,0 +1,19 @@ + + + + 40dp + \ No newline at end of file diff --git a/java/com/android/dialer/contactphoto/res/values/strings.xml b/java/com/android/dialer/contactphoto/res/values/strings.xml new file mode 100644 index 000000000..5b050d878 --- /dev/null +++ b/java/com/android/dialer/contactphoto/res/values/strings.xml @@ -0,0 +1,24 @@ + + + + + Quick contact for %1$s + \ No newline at end of file diff --git a/java/com/android/dialer/contactsfragment/AddContactViewHolder.java b/java/com/android/dialer/contactsfragment/AddContactViewHolder.java new file mode 100644 index 000000000..09c222e45 --- /dev/null +++ b/java/com/android/dialer/contactsfragment/AddContactViewHolder.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.contactsfragment; + +import android.content.Context; +import android.support.v7.widget.RecyclerView.ViewHolder; +import android.view.View; +import android.view.View.OnClickListener; +import com.android.dialer.util.DialerUtils; +import com.android.dialer.util.IntentUtil; + +/** ViewHolder for {@link ContactsFragment} to display add contact row. */ +final class AddContactViewHolder extends ViewHolder implements OnClickListener { + + private final Context context; + + AddContactViewHolder(View view) { + super(view); + view.setOnClickListener(this); + context = view.getContext(); + } + + @Override + public void onClick(View v) { + DialerUtils.startActivityWithErrorToast( + context, IntentUtil.getNewContactIntent(), R.string.add_contact_not_available); + } +} diff --git a/java/com/android/dialer/contactsfragment/ContactViewHolder.java b/java/com/android/dialer/contactsfragment/ContactViewHolder.java index 5df106dbc..0597c2a7e 100644 --- a/java/com/android/dialer/contactsfragment/ContactViewHolder.java +++ b/java/com/android/dialer/contactsfragment/ContactViewHolder.java @@ -16,6 +16,7 @@ package com.android.dialer.contactsfragment; +import android.content.Context; import android.net.Uri; import android.provider.ContactsContract.QuickContact; import android.support.v7.widget.RecyclerView; @@ -25,6 +26,9 @@ import android.view.View.OnClickListener; import android.widget.QuickContactBadge; import android.widget.TextView; import com.android.dialer.common.Assert; +import com.android.dialer.contactsfragment.ContactsFragment.ClickAction; +import com.android.dialer.logging.InteractionEvent; +import com.android.dialer.logging.Logger; /** View holder for a contact. */ final class ContactViewHolder extends RecyclerView.ViewHolder implements OnClickListener { @@ -32,16 +36,21 @@ final class ContactViewHolder extends RecyclerView.ViewHolder implements OnClick private final TextView header; private final TextView name; private final QuickContactBadge photo; + private final Context context; + private final @ClickAction int clickAction; private String headerText; private Uri contactUri; - public ContactViewHolder(View itemView) { + ContactViewHolder(View itemView, @ClickAction int clickAction) { super(itemView); + Assert.checkArgument(clickAction != ClickAction.INVALID, "Invalid click action."); + context = itemView.getContext(); itemView.findViewById(R.id.click_target).setOnClickListener(this); - header = (TextView) itemView.findViewById(R.id.header); - name = (TextView) itemView.findViewById(R.id.contact_name); - photo = (QuickContactBadge) itemView.findViewById(R.id.photo); + header = itemView.findViewById(R.id.header); + name = itemView.findViewById(R.id.contact_name); + photo = itemView.findViewById(R.id.photo); + this.clickAction = clickAction; } /** @@ -60,6 +69,10 @@ final class ContactViewHolder extends RecyclerView.ViewHolder implements OnClick name.setText(displayName); header.setText(headerText); header.setVisibility(showHeader ? View.VISIBLE : View.INVISIBLE); + + Logger.get(context) + .logQuickContactOnTouch( + photo, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_CONTACTS_FRAGMENT_BADGE, true); } public QuickContactBadge getPhoto() { @@ -76,7 +89,20 @@ final class ContactViewHolder extends RecyclerView.ViewHolder implements OnClick @Override public void onClick(View v) { - QuickContact.showQuickContact( - photo.getContext(), photo, contactUri, QuickContact.MODE_LARGE, null /* excludeMimes */); + switch (clickAction) { + case ClickAction.OPEN_CONTACT_CARD: + Logger.get(context) + .logInteraction(InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_CONTACTS_FRAGMENT_ITEM); + QuickContact.showQuickContact( + photo.getContext(), + photo, + contactUri, + QuickContact.MODE_LARGE, + null /* excludeMimes */); + break; + case ClickAction.INVALID: + default: + throw Assert.createIllegalStateFailException("Invalid click action."); + } } } diff --git a/java/com/android/dialer/contactsfragment/ContactsAdapter.java b/java/com/android/dialer/contactsfragment/ContactsAdapter.java index 4692eff5d..13895313f 100644 --- a/java/com/android/dialer/contactsfragment/ContactsAdapter.java +++ b/java/com/android/dialer/contactsfragment/ContactsAdapter.java @@ -20,20 +20,37 @@ import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract.Contacts; +import android.support.annotation.IntDef; import android.support.v4.util.ArrayMap; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; -import com.android.contacts.common.ContactPhotoManager; import com.android.dialer.common.Assert; +import com.android.dialer.contactphoto.ContactPhotoManager; +import com.android.dialer.contactsfragment.ContactsFragment.ClickAction; +import com.android.dialer.contactsfragment.ContactsFragment.Header; +import com.android.dialer.lettertile.LetterTileDrawable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** List adapter for the union of all contacts associated with every account on the device. */ -final class ContactsAdapter extends RecyclerView.Adapter { +final class ContactsAdapter extends RecyclerView.Adapter { + + private static final int UNKNOWN_VIEW_TYPE = 0; + private static final int ADD_CONTACT_VIEW_TYPE = 1; + private static final int CONTACT_VIEW_TYPE = 2; + + /** An Enum for the different row view types shown by this adapter. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({UNKNOWN_VIEW_TYPE, ADD_CONTACT_VIEW_TYPE, CONTACT_VIEW_TYPE}) + @interface ContactsViewType {} private final ArrayMap holderMap = new ArrayMap<>(); private final Context context; private final Cursor cursor; + private final @Header int header; + private final @ClickAction int clickAction; // List of contact sublist headers private final String[] headers; @@ -41,23 +58,44 @@ final class ContactsAdapter extends RecyclerView.Adapter { // Number of contacts that correspond to each header in {@code headers}. private final int[] counts; - public ContactsAdapter(Context context, Cursor cursor) { + ContactsAdapter( + Context context, Cursor cursor, @Header int header, @ClickAction int clickAction) { this.context = context; this.cursor = cursor; + this.header = header; + this.clickAction = clickAction; headers = cursor.getExtras().getStringArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_TITLES); counts = cursor.getExtras().getIntArray(Contacts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS); } @Override - public ContactViewHolder onCreateViewHolder(ViewGroup parent, int position) { - return new ContactViewHolder( - LayoutInflater.from(context).inflate(R.layout.contact_row, parent, false)); + public RecyclerView.ViewHolder onCreateViewHolder( + ViewGroup parent, @ContactsViewType int viewType) { + switch (viewType) { + case ADD_CONTACT_VIEW_TYPE: + return new AddContactViewHolder( + LayoutInflater.from(context).inflate(R.layout.add_contact_row, parent, false)); + case CONTACT_VIEW_TYPE: + return new ContactViewHolder( + LayoutInflater.from(context).inflate(R.layout.contact_row, parent, false), clickAction); + case UNKNOWN_VIEW_TYPE: + default: + throw Assert.createIllegalStateFailException("Invalid view type: " + viewType); + } } @Override - public void onBindViewHolder(ContactViewHolder contactViewHolder, int position) { + public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { + if (viewHolder instanceof AddContactViewHolder) { + return; + } + + ContactViewHolder contactViewHolder = (ContactViewHolder) viewHolder; holderMap.put(contactViewHolder, position); cursor.moveToPosition(position); + if (header != Header.NONE) { + cursor.moveToPrevious(); + } String name = getDisplayName(cursor); String header = getHeaderString(position); @@ -70,7 +108,7 @@ final class ContactsAdapter extends RecyclerView.Adapter { getPhotoId(cursor), getPhotoUri(cursor), name, - 0); + LetterTileDrawable.TYPE_DEFAULT); String photoDescription = context.getString(com.android.contacts.common.R.string.description_quick_contact_for, name); @@ -79,44 +117,48 @@ final class ContactsAdapter extends RecyclerView.Adapter { // Always show the view holder's header if it's the first item in the list. Otherwise, compare // it to the previous element and only show the anchored header if the row elements fall into // the same sublists. - if (position == 0) { - contactViewHolder.bind(header, name, contactUri, true); - } else { - boolean showHeader = !header.equals(getHeaderString(position - 1)); - contactViewHolder.bind(header, name, contactUri, showHeader); - } + boolean showHeader = position == 0 || !header.equals(getHeaderString(position - 1)); + contactViewHolder.bind(header, name, contactUri, showHeader); } - public void refreshHeaders() { - for (ContactViewHolder holder : holderMap.keySet()) { - onBindViewHolder(holder, holderMap.get(holder)); + /** + * Returns {@link #ADD_CONTACT_VIEW_TYPE} if the adapter was initialized with {@link + * Header#ADD_CONTACT} and the position is 0. Otherwise, {@link #CONTACT_VIEW_TYPE}. + */ + @Override + public @ContactsViewType int getItemViewType(int position) { + if (header != Header.NONE && position == 0) { + return ADD_CONTACT_VIEW_TYPE; } + return CONTACT_VIEW_TYPE; } @Override - public int getItemCount() { - return cursor == null ? 0 : cursor.getCount(); - } - - public String getHeader(int position) { - return getHolderAt(position).getHeader(); - } - - public TextView getHeaderView(int position) { - return getHolderAt(position).getHeaderView(); + public void onViewRecycled(RecyclerView.ViewHolder contactViewHolder) { + super.onViewRecycled(contactViewHolder); + if (contactViewHolder instanceof ContactViewHolder) { + holderMap.remove(contactViewHolder); + } } - public void setHeaderVisibility(int position, int visibility) { - getHolderAt(position).getHeaderView().setVisibility(visibility); + void refreshHeaders() { + for (ContactViewHolder holder : holderMap.keySet()) { + int position = holderMap.get(holder); + boolean showHeader = + position == 0 || !getHeaderString(position).equals(getHeaderString(position - 1)); + int visibility = showHeader ? View.VISIBLE : View.INVISIBLE; + holder.getHeaderView().setVisibility(visibility); + } } - private ContactViewHolder getHolderAt(int position) { - for (ContactViewHolder holder : holderMap.keySet()) { - if (holderMap.get(holder) == position) { - return holder; - } + @Override + public int getItemCount() { + int count = cursor == null || cursor.isClosed() ? 0 : cursor.getCount(); + // Manually insert the header if one exists. + if (header != Header.NONE) { + count++; } - throw Assert.createIllegalStateFailException("No holder for position: " + position); + return count; } private static String getDisplayName(Cursor cursor) { @@ -138,7 +180,14 @@ final class ContactsAdapter extends RecyclerView.Adapter { return Contacts.getLookupUri(contactId, lookupKey); } - private String getHeaderString(int position) { + String getHeaderString(int position) { + if (header != Header.NONE) { + if (position == 0) { + return "+"; + } + position--; + } + int index = -1; int sum = 0; while (sum <= position) { diff --git a/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java b/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java index 6d4d21079..a22f7eb39 100644 --- a/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java +++ b/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java @@ -29,7 +29,7 @@ final class ContactsCursorLoader extends CursorLoader { public static final int CONTACT_PHOTO_URI = 3; public static final int CONTACT_LOOKUP_KEY = 4; - public static final String[] CONTACTS_PROJECTION = + public static final String[] CONTACTS_PROJECTION_DISPLAY_NAME_PRIMARY = new String[] { Contacts._ID, // 0 Contacts.DISPLAY_NAME_PRIMARY, // 1 @@ -38,16 +38,35 @@ final class ContactsCursorLoader extends CursorLoader { Contacts.LOOKUP_KEY, // 4 }; - public ContactsCursorLoader(Context context) { + public static final String[] CONTACTS_PROJECTION_DISPLAY_NAME_ALTERNATIVE = + new String[] { + Contacts._ID, // 0 + Contacts.DISPLAY_NAME_ALTERNATIVE, // 1 + Contacts.PHOTO_ID, // 2 + Contacts.PHOTO_THUMBNAIL_URI, // 3 + Contacts.LOOKUP_KEY, // 4 + }; + + private ContactsCursorLoader(Context context, String[] contactProjection, String sortKey) { super( context, Contacts.CONTENT_URI .buildUpon() .appendQueryParameter(Contacts.EXTRA_ADDRESS_BOOK_INDEX, "true") .build(), - CONTACTS_PROJECTION, - null, + contactProjection, + contactProjection[CONTACT_DISPLAY_NAME] + " IS NOT NULL", null, - Contacts.SORT_KEY_PRIMARY + " ASC"); + sortKey + " ASC"); + } + + public static ContactsCursorLoader createInstanceDisplayNamePrimary( + Context context, String sortKey) { + return new ContactsCursorLoader(context, CONTACTS_PROJECTION_DISPLAY_NAME_PRIMARY, sortKey); + } + + public static ContactsCursorLoader createInstanceDisplayNameAlternative( + Context context, String sortKey) { + return new ContactsCursorLoader(context, CONTACTS_PROJECTION_DISPLAY_NAME_ALTERNATIVE, sortKey); } } diff --git a/java/com/android/dialer/contactsfragment/ContactsFragment.java b/java/com/android/dialer/contactsfragment/ContactsFragment.java index ea662fc89..ddf00b358 100644 --- a/java/com/android/dialer/contactsfragment/ContactsFragment.java +++ b/java/com/android/dialer/contactsfragment/ContactsFragment.java @@ -19,60 +19,194 @@ package com.android.dialer.contactsfragment; import android.app.Fragment; import android.app.LoaderManager.LoaderCallbacks; import android.content.Loader; +import android.content.pm.PackageManager; import android.database.Cursor; import android.os.Bundle; +import android.provider.ContactsContract.Contacts; +import android.support.annotation.IntDef; import android.support.annotation.Nullable; +import android.support.v13.app.FragmentCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.RecyclerView.Recycler; +import android.support.v7.widget.RecyclerView.State; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnScrollChangeListener; import android.view.ViewGroup; import android.widget.TextView; +import com.android.contacts.common.preference.ContactsPreferences; +import com.android.contacts.common.preference.ContactsPreferences.ChangeListener; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.performancereport.PerformanceReport; +import com.android.dialer.util.DialerUtils; +import com.android.dialer.util.IntentUtil; import com.android.dialer.util.PermissionsUtil; +import com.android.dialer.widget.EmptyContentView; +import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Arrays; /** Fragment containing a list of all contacts. */ public class ContactsFragment extends Fragment - implements LoaderCallbacks, OnScrollChangeListener { + implements LoaderCallbacks, + OnScrollChangeListener, + OnEmptyViewActionButtonClickedListener, + ChangeListener { + /** IntDef to define the OnClick action for contact rows. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({ClickAction.INVALID, ClickAction.OPEN_CONTACT_CARD}) + public @interface ClickAction { + int INVALID = 0; + /** Open contact card on click. */ + int OPEN_CONTACT_CARD = 1; + } + + /** An enum for the different types of headers that be inserted at position 0 in the list. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({Header.NONE, Header.ADD_CONTACT}) + public @interface Header { + int NONE = 0; + /** Header that allows the user to add a new contact. */ + int ADD_CONTACT = 1; + } + + public static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1; + + private static final String EXTRA_HEADER = "extra_header"; + private static final String EXTRA_CLICK_ACTION = "extra_click_action"; + + private FastScroller fastScroller; private TextView anchoredHeader; private RecyclerView recyclerView; private LinearLayoutManager manager; private ContactsAdapter adapter; + private EmptyContentView emptyContentView; + + private ContactsPreferences contactsPrefs; + private @Header int header; + private @ClickAction int clickAction; + + /** + * Used to get a configured instance of ContactsFragment. + * + *

Current example of this fragment are the contacts tab and in creating a new favorite + * contact. For example, the contacts tab we use: + * + *

    + *
  • {@link Header#ADD_CONTACT} to insert a header that allows users to add a contact + *
  • {@link ClickAction#OPEN_CONTACT_CARD} to open contact cards on click + *
+ * + * And for the add favorite contact screen we might use: + * + *
    + *
  • {@link Header#NONE} so that all rows are contacts (i.e. no header inserted) + *
  • {@link ClickAction#SET_RESULT_AND_FINISH} to send a selected contact to the previous + * activity. + *
+ * + * @param header determines the type of header inserted at position 0 in the contacts list + * @param clickAction defines the on click actions on rows that represent contacts + */ + public static ContactsFragment newInstance(@Header int header, @ClickAction int clickAction) { + Assert.checkArgument(clickAction != ClickAction.INVALID, "Invalid click action"); + ContactsFragment fragment = new ContactsFragment(); + Bundle args = new Bundle(); + args.putInt(EXTRA_HEADER, header); + args.putInt(EXTRA_CLICK_ACTION, clickAction); + fragment.setArguments(args); + return fragment; + } + + @SuppressWarnings("WrongConstant") + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + contactsPrefs = new ContactsPreferences(getContext()); + contactsPrefs.registerChangeListener(this); + header = getArguments().getInt(EXTRA_HEADER); + clickAction = getArguments().getInt(EXTRA_CLICK_ACTION); + } @Nullable @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_contacts, container, false); - anchoredHeader = (TextView) view.findViewById(R.id.header); - manager = new LinearLayoutManager(getContext()); + fastScroller = view.findViewById(R.id.fast_scroller); + anchoredHeader = view.findViewById(R.id.header); + recyclerView = view.findViewById(R.id.recycler_view); - // TODO: Handle contacts permission denied view - // TODO: Handle 0 contacts layout - recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); - recyclerView.setLayoutManager(manager); - getLoaderManager().initLoader(0, null, this); + emptyContentView = view.findViewById(R.id.empty_list_view); + emptyContentView.setImage(R.drawable.empty_contacts); + emptyContentView.setActionClickedListener(this); if (PermissionsUtil.hasContactsReadPermissions(getContext())) { getLoaderManager().initLoader(0, null, this); + } else { + emptyContentView.setDescription(R.string.permission_no_contacts); + emptyContentView.setActionLabel(R.string.permission_single_turn_on); + emptyContentView.setVisibility(View.VISIBLE); } return view; } + @Override + public void onChange() { + if (getActivity() != null && isAdded()) { + getLoaderManager().restartLoader(0, null, this); + } + } + + /** @return a loader according to sort order and display order. */ @Override public Loader onCreateLoader(int id, Bundle args) { - return new ContactsCursorLoader(getContext()); + boolean sortOrderPrimary = + (contactsPrefs.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY); + boolean displayOrderPrimary = + (contactsPrefs.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY); + + String sortKey = sortOrderPrimary ? Contacts.SORT_KEY_PRIMARY : Contacts.SORT_KEY_ALTERNATIVE; + return displayOrderPrimary + ? ContactsCursorLoader.createInstanceDisplayNamePrimary(getContext(), sortKey) + : ContactsCursorLoader.createInstanceDisplayNameAlternative(getContext(), sortKey); } @Override public void onLoadFinished(Loader loader, Cursor cursor) { - // TODO setup fast scroller. - adapter = new ContactsAdapter(getContext(), cursor); - recyclerView.setAdapter(adapter); - if (adapter.getItemCount() > 1) { - recyclerView.setOnScrollChangeListener(this); + if (cursor.getCount() == 0) { + emptyContentView.setDescription(R.string.all_contacts_empty); + emptyContentView.setActionLabel(R.string.all_contacts_empty_add_contact_action); + emptyContentView.setVisibility(View.VISIBLE); + recyclerView.setVisibility(View.GONE); + } else { + emptyContentView.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + adapter = new ContactsAdapter(getContext(), cursor, header, clickAction); + manager = + new LinearLayoutManager(getContext()) { + @Override + public void onLayoutChildren(Recycler recycler, State state) { + super.onLayoutChildren(recycler, state); + int itemsShown = findLastVisibleItemPosition() - findFirstVisibleItemPosition() + 1; + if (adapter.getItemCount() > itemsShown) { + fastScroller.setVisibility(View.VISIBLE); + recyclerView.setOnScrollChangeListener(ContactsFragment.this); + } else { + fastScroller.setVisibility(View.GONE); + } + } + }; + + recyclerView.setLayoutManager(manager); + recyclerView.setAdapter(adapter); + PerformanceReport.logOnScrollStateChange(recyclerView); + fastScroller.setup(adapter, manager); } } @@ -81,6 +215,7 @@ public class ContactsFragment extends Fragment recyclerView.setAdapter(null); recyclerView.setOnScrollChangeListener(null); adapter = null; + contactsPrefs.unregisterChangeListener(); } /* @@ -95,8 +230,14 @@ public class ContactsFragment extends Fragment */ @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { + fastScroller.updateContainerAndScrollBarPosition(recyclerView); int firstVisibleItem = manager.findFirstVisibleItemPosition(); int firstCompletelyVisible = manager.findFirstCompletelyVisibleItemPosition(); + if (firstCompletelyVisible == RecyclerView.NO_POSITION) { + // No items are visible, so there are no headers to update. + return; + } + String anchoredHeaderString = adapter.getHeaderString(firstCompletelyVisible); // If the user swipes to the top of the list very quickly, there is some strange behavior // between this method updating headers and adapter#onBindViewHolder updating headers. @@ -104,15 +245,57 @@ public class ContactsFragment extends Fragment if (firstVisibleItem == firstCompletelyVisible && firstVisibleItem == 0) { adapter.refreshHeaders(); anchoredHeader.setVisibility(View.INVISIBLE); + } else if (firstVisibleItem != 0) { // skip the add contact row + if (adapter.getHeaderString(firstVisibleItem).equals(anchoredHeaderString)) { + anchoredHeader.setText(anchoredHeaderString); + anchoredHeader.setVisibility(View.VISIBLE); + getContactHolder(firstVisibleItem).getHeaderView().setVisibility(View.INVISIBLE); + getContactHolder(firstCompletelyVisible).getHeaderView().setVisibility(View.INVISIBLE); + } else { + anchoredHeader.setVisibility(View.INVISIBLE); + getContactHolder(firstVisibleItem).getHeaderView().setVisibility(View.VISIBLE); + getContactHolder(firstCompletelyVisible).getHeaderView().setVisibility(View.VISIBLE); + } + } + } + + private ContactViewHolder getContactHolder(int position) { + return ((ContactViewHolder) recyclerView.findViewHolderForAdapterPosition(position)); + } + + @Override + public void onEmptyViewActionButtonClicked() { + if (emptyContentView.getActionLabel() == R.string.permission_single_turn_on) { + String[] deniedPermissions = + PermissionsUtil.getPermissionsCurrentlyDenied( + getContext(), PermissionsUtil.allContactsGroupPermissionsUsedInDialer); + if (deniedPermissions.length > 0) { + LogUtil.i( + "ContactsFragment.onEmptyViewActionButtonClicked", + "Requesting permissions: " + Arrays.toString(deniedPermissions)); + FragmentCompat.requestPermissions( + this, deniedPermissions, READ_CONTACTS_PERMISSION_REQUEST_CODE); + } + + } else if (emptyContentView.getActionLabel() + == R.string.all_contacts_empty_add_contact_action) { + // Add new contact + DialerUtils.startActivityWithErrorToast( + getContext(), IntentUtil.getNewContactIntent(), R.string.add_contact_not_available); } else { - boolean showAnchor = - adapter.getHeader(firstVisibleItem).equals(adapter.getHeader(firstCompletelyVisible)); - anchoredHeader.setText(adapter.getHeader(firstCompletelyVisible)); - anchoredHeader.setVisibility(showAnchor ? View.VISIBLE : View.INVISIBLE); - - int rowHeaderVisibility = showAnchor ? View.INVISIBLE : View.VISIBLE; - adapter.setHeaderVisibility(firstVisibleItem, rowHeaderVisibility); - adapter.setHeaderVisibility(firstCompletelyVisible, rowHeaderVisibility); + throw Assert.createIllegalStateFailException("Invalid empty content view action label."); + } + } + + @Override + public void onRequestPermissionsResult( + int requestCode, String[] permissions, int[] grantResults) { + if (requestCode == READ_CONTACTS_PERMISSION_REQUEST_CODE) { + if (grantResults.length >= 1 && PackageManager.PERMISSION_GRANTED == grantResults[0]) { + // Force a refresh of the data since we were missing the permission before this. + emptyContentView.setVisibility(View.GONE); + getLoaderManager().initLoader(0, null, this); + } } } } diff --git a/java/com/android/dialer/contactsfragment/FastScroller.java b/java/com/android/dialer/contactsfragment/FastScroller.java new file mode 100644 index 000000000..2a86a3bb6 --- /dev/null +++ b/java/com/android/dialer/contactsfragment/FastScroller.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.contactsfragment; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.RelativeLayout; +import android.widget.TextView; + +/** Widget to add fast scrolling to {@link ContactsFragment}. */ +public class FastScroller extends RelativeLayout { + + private final int touchTargetWidth; + + private ContactsAdapter adapter; + private LinearLayoutManager layoutManager; + + private TextView container; + private View scrollBar; + + private boolean dragStarted; + + public FastScroller(Context context, AttributeSet attrs) { + super(context, attrs); + touchTargetWidth = + context.getResources().getDimensionPixelSize(R.dimen.fast_scroller_touch_target_width); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + container = findViewById(R.id.fast_scroller_container); + scrollBar = findViewById(R.id.fast_scroller_scroll_bar); + } + + void setup(ContactsAdapter adapter, LinearLayoutManager layoutManager) { + this.adapter = adapter; + this.layoutManager = layoutManager; + setVisibility(VISIBLE); + } + + @Override + public boolean onTouchEvent(@NonNull MotionEvent event) { + // Don't override if touch event isn't within desired touch target and dragging hasn't started. + if (!dragStarted && getWidth() - touchTargetWidth - event.getX() > 0) { + return super.onTouchEvent(event); + } + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + dragStarted = true; + container.setVisibility(VISIBLE); + scrollBar.setSelected(true); + // fall through + case MotionEvent.ACTION_MOVE: + setContainerAndScrollBarPosition(event.getY()); + setRecyclerViewPosition(event.getY()); + return true; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + dragStarted = false; + container.setVisibility(INVISIBLE); + scrollBar.setSelected(false); + return true; + } + return super.onTouchEvent(event); + } + + private void setRecyclerViewPosition(float y) { + final int itemCount = adapter.getItemCount(); + float scrolledPosition = getScrolledPercentage(y) * (float) itemCount; + int targetPos = getValueInRange(0, itemCount - 1, (int) scrolledPosition); + layoutManager.scrollToPositionWithOffset(targetPos, 0); + container.setText(adapter.getHeaderString(targetPos)); + adapter.refreshHeaders(); + } + + // Returns a float in range [0, 1] which represents the position of the scroller. + private float getScrolledPercentage(float y) { + if (scrollBar.getY() == 0) { + return 0f; + } else if (scrollBar.getY() + scrollBar.getHeight() >= getHeight()) { + return 1f; + } else { + return y / (float) getHeight(); + } + } + + private int getValueInRange(int min, int max, int value) { + int minimum = Math.max(min, value); + return Math.min(minimum, max); + } + + void updateContainerAndScrollBarPosition(RecyclerView recyclerView) { + if (!scrollBar.isSelected()) { + int verticalScrollOffset = recyclerView.computeVerticalScrollOffset(); + int verticalScrollRange = recyclerView.computeVerticalScrollRange(); + float proportion = (float) verticalScrollOffset / ((float) verticalScrollRange - getHeight()); + setContainerAndScrollBarPosition(getHeight() * proportion); + } + } + + private void setContainerAndScrollBarPosition(float y) { + int scrollBarHeight = scrollBar.getHeight(); + int containerHeight = container.getHeight(); + scrollBar.setY( + getValueInRange(0, getHeight() - scrollBarHeight, (int) (y - scrollBarHeight / 2))); + container.setY( + getValueInRange( + 0, getHeight() - containerHeight - scrollBarHeight / 2, (int) (y - containerHeight))); + } +} diff --git a/java/com/android/dialer/contactsfragment/res/drawable/fast_scroller_container_background.xml b/java/com/android/dialer/contactsfragment/res/drawable/fast_scroller_container_background.xml new file mode 100644 index 000000000..a7b227799 --- /dev/null +++ b/java/com/android/dialer/contactsfragment/res/drawable/fast_scroller_container_background.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/contactsfragment/res/drawable/fast_scroller_scroll_bar.xml b/java/com/android/dialer/contactsfragment/res/drawable/fast_scroller_scroll_bar.xml new file mode 100644 index 000000000..a3e0c25c7 --- /dev/null +++ b/java/com/android/dialer/contactsfragment/res/drawable/fast_scroller_scroll_bar.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/contactsfragment/res/layout/add_contact_row.xml b/java/com/android/dialer/contactsfragment/res/layout/add_contact_row.xml new file mode 100644 index 000000000..dbc7cafb8 --- /dev/null +++ b/java/com/android/dialer/contactsfragment/res/layout/add_contact_row.xml @@ -0,0 +1,50 @@ + + + + + + + + diff --git a/java/com/android/dialer/contactsfragment/res/layout/contact_row.xml b/java/com/android/dialer/contactsfragment/res/layout/contact_row.xml index af87c7f18..9e829fee4 100644 --- a/java/com/android/dialer/contactsfragment/res/layout/contact_row.xml +++ b/java/com/android/dialer/contactsfragment/res/layout/contact_row.xml @@ -43,11 +43,13 @@ diff --git a/java/com/android/dialer/contactsfragment/res/layout/fragment_contacts.xml b/java/com/android/dialer/contactsfragment/res/layout/fragment_contacts.xml index 67b490f03..3d58aad0d 100644 --- a/java/com/android/dialer/contactsfragment/res/layout/fragment_contacts.xml +++ b/java/com/android/dialer/contactsfragment/res/layout/fragment_contacts.xml @@ -23,8 +23,47 @@ android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/background_dialer_white"/> + android:background="@color/background_dialer_light"/> + + + + + + + + + + diff --git a/java/com/android/dialer/contactsfragment/res/values/dimens.xml b/java/com/android/dialer/contactsfragment/res/values/dimens.xml index 00d7c6d7e..f120014e2 100644 --- a/java/com/android/dialer/contactsfragment/res/values/dimens.xml +++ b/java/com/android/dialer/contactsfragment/res/values/dimens.xml @@ -25,4 +25,11 @@ 16dp 8dp 16sp -
+ + 20dp + + 88dp + 44dp + 0px + 44dp +
\ No newline at end of file diff --git a/java/com/android/dialer/database/CallLogQueryHandler.java b/java/com/android/dialer/database/CallLogQueryHandler.java index 35f7854ac..4867d9dce 100644 --- a/java/com/android/dialer/database/CallLogQueryHandler.java +++ b/java/com/android/dialer/database/CallLogQueryHandler.java @@ -188,6 +188,20 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler { VoicemailComponent.get(mContext) .getVoicemailClient() .appendOmtpVoicemailSelectionClause(mContext, where, selectionArgs); + } else { + // Filter out all Duo entries other than video calls + where + .append(" AND (") + .append(Calls.PHONE_ACCOUNT_COMPONENT_NAME) + .append(" IS NULL OR ") + .append(Calls.PHONE_ACCOUNT_COMPONENT_NAME) + .append(" NOT LIKE 'com.google.android.apps.tachyon%' OR ") + .append(Calls.FEATURES) + .append(" & ") + .append(Calls.FEATURES_VIDEO) + .append(" == ") + .append(Calls.FEATURES_VIDEO) + .append(")"); } final int limit = (mLogLimit == -1) ? NUM_LOGS_TO_DISPLAY : mLogLimit; diff --git a/java/com/android/dialer/database/DialerDatabaseHelper.java b/java/com/android/dialer/database/DialerDatabaseHelper.java index 348814281..6dd7cf462 100644 --- a/java/com/android/dialer/database/DialerDatabaseHelper.java +++ b/java/com/android/dialer/database/DialerDatabaseHelper.java @@ -34,6 +34,7 @@ import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.Directory; import android.support.annotation.VisibleForTesting; +import android.support.annotation.WorkerThread; import android.text.TextUtils; import com.android.contacts.common.R; import com.android.contacts.common.util.StopWatch; @@ -46,7 +47,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Objects; import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; /** * Database helper for smart dial. Designed as a singleton to make sure there is only one access @@ -77,8 +77,6 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper { private static final int MAX_ENTRIES = 20; private final Context mContext; - private final Object mLock = new Object(); - private final AtomicBoolean mInUpdate = new AtomicBoolean(false); private boolean mIsTestInstance = false; protected DialerDatabaseHelper(Context context, String databaseName, int dbVersion) { @@ -596,218 +594,212 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper { * accordingly. It also queries the deleted contact database to remove newly deleted contacts * since last update. */ - public void updateSmartDialDatabase() { + @WorkerThread + public synchronized void updateSmartDialDatabase() { LogUtil.enterBlock("DialerDatabaseHelper.updateSmartDialDatabase"); final SQLiteDatabase db = getWritableDatabase(); - synchronized (mLock) { - LogUtil.v("DialerDatabaseHelper.updateSmartDialDatabase", "starting to update database"); - final StopWatch stopWatch = DEBUG ? StopWatch.start("Updating databases") : null; + LogUtil.v("DialerDatabaseHelper.updateSmartDialDatabase", "starting to update database"); + final StopWatch stopWatch = DEBUG ? StopWatch.start("Updating databases") : null; - /** Gets the last update time on the database. */ - final SharedPreferences databaseLastUpdateSharedPref = - mContext.getSharedPreferences(DATABASE_LAST_CREATED_SHARED_PREF, Context.MODE_PRIVATE); - final String lastUpdateMillis = - String.valueOf(databaseLastUpdateSharedPref.getLong(LAST_UPDATED_MILLIS, 0)); - - LogUtil.v( - "DialerDatabaseHelper.updateSmartDialDatabase", "last updated at " + lastUpdateMillis); - - /** Sets the time after querying the database as the current update time. */ - final Long currentMillis = System.currentTimeMillis(); + /** Gets the last update time on the database. */ + final SharedPreferences databaseLastUpdateSharedPref = + mContext.getSharedPreferences(DATABASE_LAST_CREATED_SHARED_PREF, Context.MODE_PRIVATE); + final String lastUpdateMillis = + String.valueOf(databaseLastUpdateSharedPref.getLong(LAST_UPDATED_MILLIS, 0)); - if (DEBUG) { - stopWatch.lap("Queried the Contacts database"); - } + LogUtil.v( + "DialerDatabaseHelper.updateSmartDialDatabase", "last updated at " + lastUpdateMillis); - /** Prevents the app from reading the dialer database when updating. */ - mInUpdate.getAndSet(true); + /** Sets the time after querying the database as the current update time. */ + final Long currentMillis = System.currentTimeMillis(); - /** Removes contacts that have been deleted. */ - removeDeletedContacts(db, getDeletedContactCursor(lastUpdateMillis)); - removePotentiallyCorruptedContacts(db, lastUpdateMillis); + if (DEBUG) { + stopWatch.lap("Queried the Contacts database"); + } - if (DEBUG) { - stopWatch.lap("Finished deleting deleted entries"); - } + /** Removes contacts that have been deleted. */ + removeDeletedContacts(db, getDeletedContactCursor(lastUpdateMillis)); + removePotentiallyCorruptedContacts(db, lastUpdateMillis); - /** - * If the database did not exist before, jump through deletion as there is nothing to delete. - */ - if (!lastUpdateMillis.equals("0")) { - /** - * Removes contacts that have been updated. Updated contact information will be inserted - * later. Note that this has to use a separate result set from updatePhoneCursor, since it - * is possible for a contact to be updated (e.g. phone number deleted), but have no results - * show up in updatedPhoneCursor (since all of its phone numbers have been deleted). - */ - final Cursor updatedContactCursor = - mContext - .getContentResolver() - .query( - UpdatedContactQuery.URI, - UpdatedContactQuery.PROJECTION, - UpdatedContactQuery.SELECT_UPDATED_CLAUSE, - new String[] {lastUpdateMillis}, - null); - if (updatedContactCursor == null) { - LogUtil.e( - "DialerDatabaseHelper.updateSmartDialDatabase", - "smartDial query received null for cursor"); - return; - } - try { - removeUpdatedContacts(db, updatedContactCursor); - } finally { - updatedContactCursor.close(); - } - if (DEBUG) { - stopWatch.lap("Finished deleting entries belonging to updated contacts"); - } - } + if (DEBUG) { + stopWatch.lap("Finished deleting deleted entries"); + } + /** + * If the database did not exist before, jump through deletion as there is nothing to delete. + */ + if (!lastUpdateMillis.equals("0")) { /** - * Queries the contact database to get all phone numbers that have been updated since the last - * update time. + * Removes contacts that have been updated. Updated contact information will be inserted + * later. Note that this has to use a separate result set from updatePhoneCursor, since it is + * possible for a contact to be updated (e.g. phone number deleted), but have no results show + * up in updatedPhoneCursor (since all of its phone numbers have been deleted). */ - final Cursor updatedPhoneCursor = + final Cursor updatedContactCursor = mContext .getContentResolver() .query( - PhoneQuery.URI, - PhoneQuery.PROJECTION, - PhoneQuery.SELECTION, + UpdatedContactQuery.URI, + UpdatedContactQuery.PROJECTION, + UpdatedContactQuery.SELECT_UPDATED_CLAUSE, new String[] {lastUpdateMillis}, null); - if (updatedPhoneCursor == null) { + if (updatedContactCursor == null) { LogUtil.e( "DialerDatabaseHelper.updateSmartDialDatabase", "smartDial query received null for cursor"); return; } - try { - /** Inserts recently updated phone numbers to the smartdial database. */ - insertUpdatedContactsAndNumberPrefix(db, updatedPhoneCursor, currentMillis); - if (DEBUG) { - stopWatch.lap("Finished building the smart dial table"); - } + removeUpdatedContacts(db, updatedContactCursor); } finally { - updatedPhoneCursor.close(); + updatedContactCursor.close(); } - - /** - * Gets a list of distinct contacts which have been updated, and adds the name prefixes of - * these contacts to the prefix table. - */ - final Cursor nameCursor = - db.rawQuery( - "SELECT DISTINCT " - + SmartDialDbColumns.DISPLAY_NAME_PRIMARY - + ", " - + SmartDialDbColumns.CONTACT_ID - + " FROM " - + Tables.SMARTDIAL_TABLE - + " WHERE " - + SmartDialDbColumns.LAST_SMARTDIAL_UPDATE_TIME - + " = " - + Long.toString(currentMillis), - new String[] {}); - if (nameCursor != null) { - try { - if (DEBUG) { - stopWatch.lap("Queried the smart dial table for contact names"); - } - - /** Inserts prefixes of names into the prefix table. */ - insertNamePrefixes(db, nameCursor); - if (DEBUG) { - stopWatch.lap("Finished building the name prefix table"); - } - } finally { - nameCursor.close(); - } + if (DEBUG) { + stopWatch.lap("Finished deleting entries belonging to updated contacts"); } + } - /** Creates index on contact_id for fast JOIN operation. */ - db.execSQL( - "CREATE INDEX IF NOT EXISTS smartdial_contact_id_index ON " - + Tables.SMARTDIAL_TABLE - + " (" - + SmartDialDbColumns.CONTACT_ID - + ");"); - /** Creates index on last_smartdial_update_time for fast SELECT operation. */ - db.execSQL( - "CREATE INDEX IF NOT EXISTS smartdial_last_update_index ON " - + Tables.SMARTDIAL_TABLE - + " (" - + SmartDialDbColumns.LAST_SMARTDIAL_UPDATE_TIME - + ");"); - /** Creates index on sorting fields for fast sort operation. */ - db.execSQL( - "CREATE INDEX IF NOT EXISTS smartdial_sort_index ON " - + Tables.SMARTDIAL_TABLE - + " (" - + SmartDialDbColumns.STARRED - + ", " - + SmartDialDbColumns.IS_SUPER_PRIMARY - + ", " - + SmartDialDbColumns.LAST_TIME_USED - + ", " - + SmartDialDbColumns.TIMES_USED - + ", " - + SmartDialDbColumns.IN_VISIBLE_GROUP - + ", " - + SmartDialDbColumns.DISPLAY_NAME_PRIMARY - + ", " - + SmartDialDbColumns.CONTACT_ID - + ", " - + SmartDialDbColumns.IS_PRIMARY - + ");"); - /** Creates index on prefix for fast SELECT operation. */ - db.execSQL( - "CREATE INDEX IF NOT EXISTS nameprefix_index ON " - + Tables.PREFIX_TABLE - + " (" - + PrefixColumns.PREFIX - + ");"); - /** Creates index on contact_id for fast JOIN operation. */ - db.execSQL( - "CREATE INDEX IF NOT EXISTS nameprefix_contact_id_index ON " - + Tables.PREFIX_TABLE - + " (" - + PrefixColumns.CONTACT_ID - + ");"); + /** + * Queries the contact database to get all phone numbers that have been updated since the last + * update time. + */ + final Cursor updatedPhoneCursor = + mContext + .getContentResolver() + .query( + PhoneQuery.URI, + PhoneQuery.PROJECTION, + PhoneQuery.SELECTION, + new String[] {lastUpdateMillis}, + null); + if (updatedPhoneCursor == null) { + LogUtil.e( + "DialerDatabaseHelper.updateSmartDialDatabase", + "smartDial query received null for cursor"); + return; + } + try { + /** Inserts recently updated phone numbers to the smartdial database. */ + insertUpdatedContactsAndNumberPrefix(db, updatedPhoneCursor, currentMillis); if (DEBUG) { - stopWatch.lap(TAG + "Finished recreating index"); + stopWatch.lap("Finished building the smart dial table"); } + } finally { + updatedPhoneCursor.close(); + } - /** Updates the database index statistics. */ - db.execSQL("ANALYZE " + Tables.SMARTDIAL_TABLE); - db.execSQL("ANALYZE " + Tables.PREFIX_TABLE); - db.execSQL("ANALYZE smartdial_contact_id_index"); - db.execSQL("ANALYZE smartdial_last_update_index"); - db.execSQL("ANALYZE nameprefix_index"); - db.execSQL("ANALYZE nameprefix_contact_id_index"); - if (DEBUG) { - stopWatch.stopAndLog(TAG + "Finished updating index stats", 0); - } + /** + * Gets a list of distinct contacts which have been updated, and adds the name prefixes of these + * contacts to the prefix table. + */ + final Cursor nameCursor = + db.rawQuery( + "SELECT DISTINCT " + + SmartDialDbColumns.DISPLAY_NAME_PRIMARY + + ", " + + SmartDialDbColumns.CONTACT_ID + + " FROM " + + Tables.SMARTDIAL_TABLE + + " WHERE " + + SmartDialDbColumns.LAST_SMARTDIAL_UPDATE_TIME + + " = " + + currentMillis, + new String[] {}); + if (nameCursor != null) { + try { + if (DEBUG) { + stopWatch.lap("Queried the smart dial table for contact names"); + } - mInUpdate.getAndSet(false); + /** Inserts prefixes of names into the prefix table. */ + insertNamePrefixes(db, nameCursor); + if (DEBUG) { + stopWatch.lap("Finished building the name prefix table"); + } + } finally { + nameCursor.close(); + } + } - final SharedPreferences.Editor editor = databaseLastUpdateSharedPref.edit(); - editor.putLong(LAST_UPDATED_MILLIS, currentMillis); - editor.apply(); + /** Creates index on contact_id for fast JOIN operation. */ + db.execSQL( + "CREATE INDEX IF NOT EXISTS smartdial_contact_id_index ON " + + Tables.SMARTDIAL_TABLE + + " (" + + SmartDialDbColumns.CONTACT_ID + + ");"); + /** Creates index on last_smartdial_update_time for fast SELECT operation. */ + db.execSQL( + "CREATE INDEX IF NOT EXISTS smartdial_last_update_index ON " + + Tables.SMARTDIAL_TABLE + + " (" + + SmartDialDbColumns.LAST_SMARTDIAL_UPDATE_TIME + + ");"); + /** Creates index on sorting fields for fast sort operation. */ + db.execSQL( + "CREATE INDEX IF NOT EXISTS smartdial_sort_index ON " + + Tables.SMARTDIAL_TABLE + + " (" + + SmartDialDbColumns.STARRED + + ", " + + SmartDialDbColumns.IS_SUPER_PRIMARY + + ", " + + SmartDialDbColumns.LAST_TIME_USED + + ", " + + SmartDialDbColumns.TIMES_USED + + ", " + + SmartDialDbColumns.IN_VISIBLE_GROUP + + ", " + + SmartDialDbColumns.DISPLAY_NAME_PRIMARY + + ", " + + SmartDialDbColumns.CONTACT_ID + + ", " + + SmartDialDbColumns.IS_PRIMARY + + ");"); + /** Creates index on prefix for fast SELECT operation. */ + db.execSQL( + "CREATE INDEX IF NOT EXISTS nameprefix_index ON " + + Tables.PREFIX_TABLE + + " (" + + PrefixColumns.PREFIX + + ");"); + /** Creates index on contact_id for fast JOIN operation. */ + db.execSQL( + "CREATE INDEX IF NOT EXISTS nameprefix_contact_id_index ON " + + Tables.PREFIX_TABLE + + " (" + + PrefixColumns.CONTACT_ID + + ");"); - LogUtil.i("DialerDatabaseHelper.updateSmartDialDatabase", "broadcasting smart dial update"); + if (DEBUG) { + stopWatch.lap(TAG + "Finished recreating index"); + } - // Notify content observers that smart dial database has been updated. - Intent intent = new Intent(ACTION_SMART_DIAL_UPDATED); - intent.setPackage(mContext.getPackageName()); - mContext.sendBroadcast(intent); + /** Updates the database index statistics. */ + db.execSQL("ANALYZE " + Tables.SMARTDIAL_TABLE); + db.execSQL("ANALYZE " + Tables.PREFIX_TABLE); + db.execSQL("ANALYZE smartdial_contact_id_index"); + db.execSQL("ANALYZE smartdial_last_update_index"); + db.execSQL("ANALYZE nameprefix_index"); + db.execSQL("ANALYZE nameprefix_contact_id_index"); + if (DEBUG) { + stopWatch.stopAndLog(TAG + "Finished updating index stats", 0); } + + final SharedPreferences.Editor editor = databaseLastUpdateSharedPref.edit(); + editor.putLong(LAST_UPDATED_MILLIS, currentMillis); + editor.apply(); + + LogUtil.i("DialerDatabaseHelper.updateSmartDialDatabase", "broadcasting smart dial update"); + + // Notify content observers that smart dial database has been updated. + Intent intent = new Intent(ACTION_SMART_DIAL_UPDATED); + intent.setPackage(mContext.getPackageName()); + mContext.sendBroadcast(intent); } /** @@ -817,12 +809,9 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper { * @param query The prefix of a contact's dialpad index. * @return A list of top candidate contacts that will be suggested to user to match their input. */ - public ArrayList getLooseMatches(String query, SmartDialNameMatcher nameMatcher) { - final boolean inUpdate = mInUpdate.get(); - if (inUpdate) { - return new ArrayList<>(); - } - + @WorkerThread + public synchronized ArrayList getLooseMatches( + String query, SmartDialNameMatcher nameMatcher) { final SQLiteDatabase db = getReadableDatabase(); /** Uses SQL query wildcard '%' to represent prefix matching. */ diff --git a/java/com/android/dialer/database/VoicemailStatusQuery.java b/java/com/android/dialer/database/VoicemailStatusQuery.java index d9e1b721b..dbd88be1f 100644 --- a/java/com/android/dialer/database/VoicemailStatusQuery.java +++ b/java/com/android/dialer/database/VoicemailStatusQuery.java @@ -27,7 +27,7 @@ import java.util.List; /** The query for the call voicemail status table. */ public class VoicemailStatusQuery { - // TODO: Column indices should be removed in favor of Cursor#getColumnIndex + // TODO(maxwelb): Column indices should be removed in favor of Cursor#getColumnIndex public static final int SOURCE_PACKAGE_INDEX = 0; public static final int SETTINGS_URI_INDEX = 1; public static final int VOICEMAIL_ACCESS_URI_INDEX = 2; diff --git a/java/com/android/dialer/databasepopulator/AndroidManifest.xml b/java/com/android/dialer/databasepopulator/AndroidManifest.xml new file mode 100644 index 000000000..0a3728566 --- /dev/null +++ b/java/com/android/dialer/databasepopulator/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + \ No newline at end of file diff --git a/java/com/android/dialer/databasepopulator/CallLogPopulator.java b/java/com/android/dialer/databasepopulator/CallLogPopulator.java new file mode 100644 index 000000000..7c387ecd1 --- /dev/null +++ b/java/com/android/dialer/databasepopulator/CallLogPopulator.java @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.databasepopulator; + +import android.content.ContentProviderOperation; +import android.content.ContentValues; +import android.content.Context; +import android.content.OperationApplicationException; +import android.os.RemoteException; +import android.provider.CallLog; +import android.provider.CallLog.Calls; +import android.support.annotation.NonNull; +import android.support.annotation.WorkerThread; +import com.android.dialer.common.Assert; +import com.google.auto.value.AutoValue; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +/** Populates the device database with call log entries. */ +public final class CallLogPopulator { + // Phone numbers from https://www.google.com/about/company/facts/locations/ + private static final CallEntry.Builder[] SIMPLE_CALL_LOG = { + CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("+1-302-6365454"), + CallEntry.builder() + .setType(Calls.MISSED_TYPE) + .setNumber("") + .setPresentation(Calls.PRESENTATION_UNKNOWN), + CallEntry.builder().setType(Calls.REJECTED_TYPE).setNumber("+1-302-6365454"), + CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+1-302-6365454"), + CallEntry.builder() + .setType(Calls.MISSED_TYPE) + .setNumber("1234") + .setPresentation(Calls.PRESENTATION_RESTRICTED), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1-302-6365454"), + CallEntry.builder().setType(Calls.BLOCKED_TYPE).setNumber("+1-302-6365454"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("(425) 739-5600"), + CallEntry.builder().setType(Calls.ANSWERED_EXTERNALLY_TYPE).setNumber("(425) 739-5600"), + CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("+1 (425) 739-5600"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("739-5600"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("711"), + CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("711"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("(425) 739-5600"), + CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("+44 (0) 20 7031 3000"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1-650-2530000"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1 303-245-0086;123,456"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1 303-245-0086"), + CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+1-650-2530000"), + CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("650-2530000"), + CallEntry.builder().setType(Calls.REJECTED_TYPE).setNumber("2530000"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+1 404-487-9000"), + CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+61 2 9374 4001"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("+33 (0)1 42 68 53 00"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("972-74-746-6245"), + CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+971 4 4509500"), + CallEntry.builder().setType(Calls.INCOMING_TYPE).setNumber("+971 4 4509500"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("55-31-2128-6800"), + CallEntry.builder().setType(Calls.MISSED_TYPE).setNumber("611"), + CallEntry.builder().setType(Calls.OUTGOING_TYPE).setNumber("*86 512-343-5283"), + }; + + @WorkerThread + public static void populateCallLog(@NonNull Context context) { + populateCallLog(context, false); + } + + @WorkerThread + public static void populateCallLogWithoutMissed(@NonNull Context context) { + populateCallLog(context, true); + } + + @WorkerThread + public static void populateCallLog(@NonNull Context context, boolean isWithoutMissedCalls) { + Assert.isWorkerThread(); + ArrayList operations = new ArrayList<>(); + // Do this 4 times to make the call log 4 times bigger. + long timeMillis = System.currentTimeMillis(); + for (int i = 0; i < 4; i++) { + for (CallEntry.Builder builder : SIMPLE_CALL_LOG) { + CallEntry callEntry = builder.setTimeMillis(timeMillis).build(); + if (isWithoutMissedCalls && builder.build().getType() == Calls.MISSED_TYPE) { + continue; + } + operations.add( + ContentProviderOperation.newInsert(Calls.CONTENT_URI) + .withValues(callEntry.getAsContentValues()) + .withYieldAllowed(true) + .build()); + timeMillis -= TimeUnit.HOURS.toMillis(1); + } + } + try { + context.getContentResolver().applyBatch(CallLog.AUTHORITY, operations); + } catch (RemoteException | OperationApplicationException e) { + Assert.fail("error adding call entries: " + e); + } + } + + @WorkerThread + public static void deleteAllCallLog(@NonNull Context context) { + Assert.isWorkerThread(); + try { + context + .getContentResolver() + .applyBatch( + CallLog.AUTHORITY, + new ArrayList<>( + Arrays.asList(ContentProviderOperation.newDelete(Calls.CONTENT_URI).build()))); + } catch (RemoteException | OperationApplicationException e) { + Assert.fail("failed to delete call log: " + e); + } + } + + @AutoValue + abstract static class CallEntry { + @NonNull + abstract String getNumber(); + + abstract int getType(); + + abstract int getPresentation(); + + abstract long getTimeMillis(); + + static Builder builder() { + return new AutoValue_CallLogPopulator_CallEntry.Builder() + .setPresentation(Calls.PRESENTATION_ALLOWED); + } + + ContentValues getAsContentValues() { + ContentValues values = new ContentValues(); + values.put(Calls.TYPE, getType()); + values.put(Calls.NUMBER, getNumber()); + values.put(Calls.NUMBER_PRESENTATION, getPresentation()); + values.put(Calls.DATE, getTimeMillis()); + return values; + } + + @AutoValue.Builder + abstract static class Builder { + abstract Builder setNumber(@NonNull String number); + + abstract Builder setType(int type); + + abstract Builder setPresentation(int presentation); + + abstract Builder setTimeMillis(long timeMillis); + + abstract CallEntry build(); + } + } + + private CallLogPopulator() {} +} diff --git a/java/com/android/dialer/databasepopulator/ContactsPopulator.java b/java/com/android/dialer/databasepopulator/ContactsPopulator.java new file mode 100644 index 000000000..e93c5697a --- /dev/null +++ b/java/com/android/dialer/databasepopulator/ContactsPopulator.java @@ -0,0 +1,356 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.databasepopulator; + +import android.content.ContentProviderOperation; +import android.content.Context; +import android.content.OperationApplicationException; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.os.RemoteException; +import android.provider.ContactsContract; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.provider.ContactsContract.RawContacts; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.WorkerThread; +import android.text.TextUtils; +import com.android.dialer.common.Assert; +import com.google.auto.value.AutoValue; +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** Populates the device database with contacts. */ +public final class ContactsPopulator { + // Phone numbers from https://www.google.com/about/company/facts/locations/ + private static final Contact[] SIMPLE_CONTACTS = { + // US, contact with e164 number. + Contact.builder() + .setName("Michelangelo") + .addPhoneNumber(new PhoneNumber("+1-302-6365454", Phone.TYPE_MOBILE)) + .addEmail(new Email("m@example.com")) + .setIsStarred(true) + .setPinned(1) + .setOrangePhoto() + .build(), + // US, contact with a non-e164 number. + Contact.builder() + .setName("Leonardo da Vinci") + .addPhoneNumber(new PhoneNumber("(425) 739-5600", Phone.TYPE_MOBILE)) + .addEmail(new Email("l@example.com")) + .setIsStarred(true) + .setPinned(2) + .setBluePhoto() + .build(), + // UK, number where the (0) should be dropped. + Contact.builder() + .setName("Raphael") + .addPhoneNumber(new PhoneNumber("+44 (0) 20 7031 3000", Phone.TYPE_MOBILE)) + .addEmail(new Email("r@example.com")) + .setIsStarred(true) + .setPinned(3) + .setRedPhoto() + .build(), + // US and Australia, contact with a long name and multiple phone numbers. + Contact.builder() + .setName("Donatello di Niccolò di Betto Bardi") + .addPhoneNumber(new PhoneNumber("+1-650-2530000", Phone.TYPE_HOME)) + .addPhoneNumber(new PhoneNumber("+1 404-487-9000", Phone.TYPE_WORK)) + .addPhoneNumber(new PhoneNumber("+61 2 9374 4001", Phone.TYPE_FAX_HOME)) + .setIsStarred(true) + .setPinned(4) + .setPurplePhoto() + .build(), + // US, phone number shared with another contact and 2nd phone number with wait and pause. + Contact.builder() + .setName("Splinter") + .addPhoneNumber(new PhoneNumber("+1-650-2530000", Phone.TYPE_HOME)) + .addPhoneNumber(new PhoneNumber("+1 303-245-0086;123,456", Phone.TYPE_WORK)) + .setBluePhoto() + .build(), + // France, number with Japanese name. + Contact.builder() + .setName("スパイク・スピーゲル") + .addPhoneNumber(new PhoneNumber("+33 (0)1 42 68 53 00", Phone.TYPE_MOBILE)) + .setBluePhoto() + .build(), + // Israel, RTL name and non-e164 number. + Contact.builder() + .setName("עקב אריה טברסק") + .addPhoneNumber(new PhoneNumber("+33 (0)1 42 68 53 00", Phone.TYPE_MOBILE)) + .setBluePhoto() + .build(), + // UAE, RTL name. + Contact.builder() + .setName("سلام دنیا") + .addPhoneNumber(new PhoneNumber("+971 4 4509500", Phone.TYPE_MOBILE)) + .setBluePhoto() + .build(), + // Brazil, contact with no name. + Contact.builder() + .addPhoneNumber(new PhoneNumber("+55-31-2128-6800", Phone.TYPE_MOBILE)) + .setBluePhoto() + .build(), + // Short number, contact with no name. + Contact.builder().addPhoneNumber(new PhoneNumber("611", Phone.TYPE_MOBILE)).build(), + // US, number with an anonymous prefix. + Contact.builder() + .setName("Anonymous") + .addPhoneNumber(new PhoneNumber("*86 512-343-5283", Phone.TYPE_MOBILE)) + .setBluePhoto() + .build(), + // None, contact with no phone number. + Contact.builder() + .setName("No Phone Number") + .addEmail(new Email("no@example.com")) + .setIsStarred(true) + .setBluePhoto() + .build(), + }; + + @WorkerThread + public static void populateContacts(@NonNull Context context) { + Assert.isWorkerThread(); + ArrayList operations = new ArrayList<>(); + for (Contact contact : SIMPLE_CONTACTS) { + addContact(contact, operations); + } + try { + context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, operations); + } catch (RemoteException | OperationApplicationException e) { + Assert.fail("error adding contacts: " + e); + } + } + + @WorkerThread + public static void deleteAllContacts(@NonNull Context context) { + Assert.isWorkerThread(); + try { + context + .getContentResolver() + .applyBatch( + ContactsContract.AUTHORITY, + new ArrayList<>( + Arrays.asList( + ContentProviderOperation.newDelete(RawContacts.CONTENT_URI).build()))); + } catch (RemoteException | OperationApplicationException e) { + Assert.fail("failed to delete contacts: " + e); + } + } + + private static void addContact(Contact contact, List operations) { + int index = operations.size(); + + operations.add( + ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) + .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, contact.getAccountType()) + .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, contact.getAccountName()) + .withValue(ContactsContract.RawContacts.STARRED, contact.getIsStarred() ? 1 : 0) + .withValue( + ContactsContract.RawContacts.PINNED, + contact.getIsStarred() ? contact.getPinned() : 0) + .withYieldAllowed(true) + .build()); + + if (!TextUtils.isEmpty(contact.getName())) { + operations.add( + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, index) + .withValue( + ContactsContract.Data.MIMETYPE, + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + .withValue( + ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.getName()) + .build()); + } + + if (contact.getPhotoStream() != null) { + operations.add( + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, index) + .withValue( + ContactsContract.Data.MIMETYPE, + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) + .withValue( + ContactsContract.CommonDataKinds.Photo.PHOTO, + contact.getPhotoStream().toByteArray()) + .build()); + } + + for (PhoneNumber phoneNumber : contact.getPhoneNumbers()) { + operations.add( + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, index) + .withValue( + ContactsContract.Data.MIMETYPE, + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber.value) + .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneNumber.type) + .withValue(ContactsContract.CommonDataKinds.Phone.LABEL, phoneNumber.label) + .build()); + } + + for (Email email : contact.getEmails()) { + operations.add( + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, index) + .withValue( + ContactsContract.Data.MIMETYPE, + ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Email.DATA, email.value) + .withValue(ContactsContract.CommonDataKinds.Email.TYPE, email.type) + .withValue(ContactsContract.CommonDataKinds.Email.LABEL, email.label) + .build()); + } + } + + @AutoValue + abstract static class Contact { + @NonNull + abstract String getAccountType(); + + @NonNull + abstract String getAccountName(); + + @Nullable + abstract String getName(); + + abstract boolean getIsStarred(); + + abstract int getPinned(); + + @Nullable + abstract ByteArrayOutputStream getPhotoStream(); + + @NonNull + abstract List getPhoneNumbers(); + + @NonNull + abstract List getEmails(); + + static Builder builder() { + return new AutoValue_ContactsPopulator_Contact.Builder() + .setAccountType("com.google") + .setAccountName("foo@example") + .setPinned(0) + .setIsStarred(false) + .setPhoneNumbers(new ArrayList<>()) + .setEmails(new ArrayList<>()); + } + + @AutoValue.Builder + abstract static class Builder { + @NonNull private final List phoneNumbers = new ArrayList<>(); + @NonNull private final List emails = new ArrayList<>(); + + abstract Builder setAccountType(@NonNull String accountType); + + abstract Builder setAccountName(@NonNull String accountName); + + abstract Builder setName(@NonNull String name); + + abstract Builder setIsStarred(boolean isStarred); + + abstract Builder setPinned(int position); + + abstract Builder setPhotoStream(ByteArrayOutputStream photoStream); + + abstract Builder setPhoneNumbers(@NonNull List phoneNumbers); + + abstract Builder setEmails(@NonNull List emails); + + abstract Contact build(); + + Builder addPhoneNumber(PhoneNumber phoneNumber) { + phoneNumbers.add(phoneNumber); + return setPhoneNumbers(phoneNumbers); + } + + Builder addEmail(Email email) { + emails.add(email); + return setEmails(emails); + } + + Builder setRedPhoto() { + setPhotoStream(getPhotoStreamWithColor(Color.rgb(0xe3, 0x33, 0x1c))); + return this; + } + + Builder setBluePhoto() { + setPhotoStream(getPhotoStreamWithColor(Color.rgb(0x00, 0xaa, 0xe6))); + return this; + } + + Builder setOrangePhoto() { + setPhotoStream(getPhotoStreamWithColor(Color.rgb(0xea, 0x95, 0x00))); + return this; + } + + Builder setPurplePhoto() { + setPhotoStream(getPhotoStreamWithColor(Color.rgb(0x99, 0x5a, 0xa0))); + return this; + } + + /** Creates a contact photo with a green background and a circle of the given color. */ + private static ByteArrayOutputStream getPhotoStreamWithColor(int color) { + int width = 300; + int height = 300; + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + canvas.drawColor(Color.argb(0xff, 0x4c, 0x9c, 0x23)); + Paint paint = new Paint(); + paint.setColor(color); + paint.setStyle(Paint.Style.FILL); + canvas.drawCircle(width / 2, height / 2, width / 3, paint); + + ByteArrayOutputStream photoStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 75, photoStream); + return photoStream; + } + } + } + + static class PhoneNumber { + public final String value; + public final int type; + public final String label; + + PhoneNumber(String value, int type) { + this.value = value; + this.type = type; + label = "simulator phone number"; + } + } + + static class Email { + public final String value; + public final int type; + public final String label; + + Email(String simpleEmail) { + value = simpleEmail; + type = ContactsContract.CommonDataKinds.Email.TYPE_WORK; + label = "simulator email"; + } + } + + private ContactsPopulator() {} +} diff --git a/java/com/android/dialer/databasepopulator/VoicemailPopulator.java b/java/com/android/dialer/databasepopulator/VoicemailPopulator.java new file mode 100644 index 000000000..e99f7c7d4 --- /dev/null +++ b/java/com/android/dialer/databasepopulator/VoicemailPopulator.java @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.dialer.databasepopulator; + +import android.content.ComponentName; +import android.content.ContentValues; +import android.content.Context; +import android.provider.VoicemailContract.Status; +import android.provider.VoicemailContract.Voicemails; +import android.support.annotation.NonNull; +import android.support.annotation.WorkerThread; +import android.telecom.PhoneAccountHandle; +import android.telephony.TelephonyManager; +import com.android.dialer.common.Assert; +import com.google.auto.value.AutoValue; +import java.util.concurrent.TimeUnit; + +/** Populates the device database with voicemail entries. */ +public final class VoicemailPopulator { + private static final String ACCOUNT_ID = "ACCOUNT_ID"; + + private static final Voicemail.Builder[] SIMPLE_VOICEMAILS = { + // Long transcription with an embedded phone number. + Voicemail.builder() + .setPhoneNumber("+1-302-6365454") + .setTranscription( + "Hi, this is a very long voicemail. Please call me back at 650 253 0000. " + + "I hope you listen to all of it. This is very important. " + + "Hi, this is a very long voicemail. " + + "I hope you listen to all of it. It's very important.") + .setDurationSeconds(10) + .setIsRead(false), + // RTL transcription. + Voicemail.builder() + .setPhoneNumber("+1-302-6365454") + .setTranscription("هزاران دوست کم اند و یک دشمن زیاد") + .setDurationSeconds(60) + .setIsRead(true), + // Empty number. + Voicemail.builder() + .setPhoneNumber("") + .setTranscription("") + .setDurationSeconds(60) + .setIsRead(true), + // No duration. + Voicemail.builder() + .setPhoneNumber("+1-302-6365454") + .setTranscription("") + .setDurationSeconds(0) + .setIsRead(true), + // Short number. + Voicemail.builder() + .setPhoneNumber("711") + .setTranscription("This is a short voicemail.") + .setDurationSeconds(12) + .setIsRead(true), + }; + + @WorkerThread + public static void populateVoicemail(@NonNull Context context) { + Assert.isWorkerThread(); + enableVoicemail(context); + + // Do this 4 times to make the voicemail database 4 times bigger. + long timeMillis = System.currentTimeMillis(); + for (int i = 0; i < 4; i++) { + for (Voicemail.Builder builder : SIMPLE_VOICEMAILS) { + Voicemail voicemail = builder.setTimeMillis(timeMillis).build(); + context + .getContentResolver() + .insert( + Voicemails.buildSourceUri(context.getPackageName()), + voicemail.getAsContentValues(context)); + timeMillis -= TimeUnit.HOURS.toMillis(2); + } + } + } + + @WorkerThread + public static void deleteAllVoicemail(@NonNull Context context) { + Assert.isWorkerThread(); + context + .getContentResolver() + .delete(Voicemails.buildSourceUri(context.getPackageName()), "", new String[] {}); + } + + private static void enableVoicemail(@NonNull Context context) { + PhoneAccountHandle handle = + new PhoneAccountHandle(new ComponentName(context, VoicemailPopulator.class), ACCOUNT_ID); + + ContentValues values = new ContentValues(); + values.put(Status.SOURCE_PACKAGE, handle.getComponentName().getPackageName()); + values.put(Status.SOURCE_TYPE, TelephonyManager.VVM_TYPE_OMTP); + values.put(Status.PHONE_ACCOUNT_COMPONENT_NAME, handle.getComponentName().flattenToString()); + values.put(Status.PHONE_ACCOUNT_ID, handle.getId()); + values.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK); + values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_OK); + values.put(Status.NOTIFICATION_CHANNEL_STATE, Status.NOTIFICATION_CHANNEL_STATE_OK); + context.getContentResolver().insert(Status.buildSourceUri(context.getPackageName()), values); + } + + /** Data for a single voicemail entry. */ + @AutoValue + public abstract static class Voicemail { + @NonNull + public abstract String getPhoneNumber(); + + @NonNull + public abstract String getTranscription(); + + public abstract long getDurationSeconds(); + + public abstract long getTimeMillis(); + + public abstract boolean getIsRead(); + + public static Builder builder() { + return new AutoValue_VoicemailPopulator_Voicemail.Builder(); + } + + public ContentValues getAsContentValues(Context context) { + ContentValues values = new ContentValues(); + values.put(Voicemails.DATE, getTimeMillis()); + values.put(Voicemails.NUMBER, getPhoneNumber()); + values.put(Voicemails.DURATION, getDurationSeconds()); + values.put(Voicemails.SOURCE_PACKAGE, context.getPackageName()); + values.put(Voicemails.IS_READ, getIsRead() ? 1 : 0); + values.put(Voicemails.TRANSCRIPTION, getTranscription()); + return values; + } + + /** Builder for a single voicemail entry. */ + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder setPhoneNumber(@NonNull String phoneNumber); + + public abstract Builder setTranscription(@NonNull String transcription); + + public abstract Builder setDurationSeconds(long durationSeconds); + + public abstract Builder setTimeMillis(long timeMillis); + + public abstract Builder setIsRead(boolean isRead); + + public abstract Voicemail build(); + } + } + + private VoicemailPopulator() {} +} diff --git a/java/com/android/dialer/dialercontact/dialer_contact.proto b/java/com/android/dialer/dialercontact/dialer_contact.proto new file mode 100644 index 000000000..d63295bcd --- /dev/null +++ b/java/com/android/dialer/dialercontact/dialer_contact.proto @@ -0,0 +1,27 @@ +syntax = "proto2"; + +option java_package = "com.android.dialer.dialercontact"; +option java_multiple_files = true; +option optimize_for = LITE_RUNTIME; + + +package com.android.dialer.callcomposer; + +message DialerContact { + optional fixed64 photo_id = 1; + optional string photo_uri = 2; + optional string contact_uri = 3; + optional string name_or_number = 4; + optional string number = 6; + optional string display_number = 7; + optional string number_label = 8; + optional int32 contact_type = 9; + optional SimDetails sim_details = 10; +} + +message SimDetails { + // Human readable netwrork name displayed to user where relevant + optional string network = 1; + // This value represents a hex representation of a color (i.e. #ffffff) + optional int32 color = 2; +} diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java new file mode 100644 index 000000000..c15014fd0 --- /dev/null +++ b/java/com/android/dialer/dialpadview/DialpadFragment.java @@ -0,0 +1,1720 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.dialpadview; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.Fragment; +import android.content.BroadcastReceiver; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.media.AudioManager; +import android.media.ToneGenerator; +import android.net.Uri; +import android.os.Bundle; +import android.os.Trace; +import android.provider.Contacts.People; +import android.provider.Contacts.Phones; +import android.provider.Contacts.PhonesColumns; +import android.provider.Settings; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.support.design.widget.FloatingActionButton; +import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; +import android.telephony.PhoneNumberFormattingTextWatcher; +import android.telephony.PhoneNumberUtils; +import android.telephony.TelephonyManager; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.view.HapticFeedbackConstants; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.PopupMenu; +import android.widget.RelativeLayout; +import android.widget.TextView; +import com.android.contacts.common.dialog.CallSubjectDialog; +import com.android.contacts.common.util.StopWatch; +import com.android.contacts.common.widget.FloatingActionButtonController; +import com.android.dialer.animation.AnimUtils; +import com.android.dialer.callintent.CallInitiationType; +import com.android.dialer.callintent.CallIntentBuilder; +import com.android.dialer.calllogutils.PhoneAccountUtils; +import com.android.dialer.common.FragmentUtils; +import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DialerExecutor; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutors; +import com.android.dialer.location.GeoUtil; +import com.android.dialer.logging.UiAction; +import com.android.dialer.oem.MotorolaUtils; +import com.android.dialer.performancereport.PerformanceReport; +import com.android.dialer.proguard.UsedByReflection; +import com.android.dialer.telecom.TelecomUtil; +import com.android.dialer.util.CallUtil; +import com.android.dialer.util.DialerUtils; +import com.android.dialer.util.PermissionsUtil; +import java.util.HashSet; +import java.util.List; + +/** Fragment that displays a twelve-key phone dialpad. */ +public class DialpadFragment extends Fragment + implements View.OnClickListener, + View.OnLongClickListener, + View.OnKeyListener, + AdapterView.OnItemClickListener, + TextWatcher, + PopupMenu.OnMenuItemClickListener, + DialpadKeyButton.OnPressedListener { + + private static final String TAG = "DialpadFragment"; + private static final String EMPTY_NUMBER = ""; + private static final char PAUSE = ','; + private static final char WAIT = ';'; + /** The length of DTMF tones in milliseconds */ + private static final int TONE_LENGTH_MS = 150; + + private static final int TONE_LENGTH_INFINITE = -1; + /** 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_DTMF; + /** Identifier for the "Add Call" intent extra. */ + private static final String ADD_CALL_MODE_KEY = "add_call_mode"; + /** + * 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: Using an intent extra to tell the phone to send this flash is a temporary measure. To + * be replaced with an Telephony/TelecomManager call in the future. TODO: Keep in sync with the + * string defined in OutgoingCallBroadcaster.java in Phone app until this is replaced with the + * Telephony/Telecom API. + */ + private static final String EXTRA_SEND_EMPTY_FLASH = "com.android.phone.extra.SEND_EMPTY_FLASH"; + + private static final String PREF_DIGITS_FILLED_BY_INTENT = "pref_digits_filled_by_intent"; + private final Object mToneGeneratorLock = new Object(); + /** Set of dialpad keys that are currently being pressed */ + private final HashSet mPressedDialpadKeys = new HashSet<>(12); + + private OnDialpadQueryChangedListener mDialpadQueryListener; + private DialpadView mDialpadView; + private EditText mDigits; + private int mDialpadSlideInDuration; + /** Remembers if we need to clear digits field when the screen is completely gone. */ + private boolean mClearDigitsOnStop; + + private View mOverflowMenuButton; + private PopupMenu mOverflowPopupMenu; + private View mDelete; + private ToneGenerator mToneGenerator; + private FloatingActionButtonController mFloatingActionButtonController; + private FloatingActionButton mFloatingActionButton; + private ListView mDialpadChooser; + private DialpadChooserAdapter mDialpadChooserAdapter; + /** Regular expression prohibiting manual phone call. Can be empty, which means "no rule". */ + private String mProhibitedPhoneNumberRegexp; + + private PseudoEmergencyAnimator mPseudoEmergencyAnimator; + private String mLastNumberDialed = EMPTY_NUMBER; + + // determines if we want to playback local DTMF tones. + private boolean mDTMFToneEnabled; + private String mCurrentCountryIso; + private CallStateReceiver mCallStateReceiver; + private boolean mWasEmptyBeforeTextChange; + /** + * This field is set to true while processing an incoming DIAL intent, in order to make sure that + * SpecialCharSequenceMgr actions can be triggered by user input but *not* by a tel: URI passed by + * some other app. It will be set to false when all digits are cleared. + */ + private boolean mDigitsFilledByIntent; + + private boolean mStartedFromNewIntent = false; + private boolean mFirstLaunch = false; + private boolean mAnimate = false; + + private DialerExecutor initPhoneNumberFormattingTextWatcherExecutor; + + /** + * Determines whether an add call operation is requested. + * + * @param intent The intent. + * @return {@literal true} if add call operation was requested. {@literal false} otherwise. + */ + public static boolean isAddCallMode(Intent intent) { + if (intent == null) { + return false; + } + final String action = intent.getAction(); + if (Intent.ACTION_DIAL.equals(action) || Intent.ACTION_VIEW.equals(action)) { + // see if we are "adding a call" from the InCallScreen; false by default. + return intent.getBooleanExtra(ADD_CALL_MODE_KEY, false); + } else { + return false; + } + } + + /** + * Format the provided string of digits into one that represents a properly formatted phone + * number. + * + * @param dialString String of characters to format + * @param normalizedNumber the E164 format number whose country code is used if the given + * phoneNumber doesn't have the country code. + * @param countryIso The country code representing the format to use if the provided normalized + * number is null or invalid. + * @return the provided string of digits as a formatted phone number, retaining any post-dial + * portion of the string. + */ + @VisibleForTesting + static String getFormattedDigits(String dialString, String normalizedNumber, String countryIso) { + String number = PhoneNumberUtils.extractNetworkPortion(dialString); + // Also retrieve the post dial portion of the provided data, so that the entire dial + // string can be reconstituted later. + final String postDial = PhoneNumberUtils.extractPostDialPortion(dialString); + + if (TextUtils.isEmpty(number)) { + return postDial; + } + + number = PhoneNumberUtils.formatNumber(number, normalizedNumber, countryIso); + + if (TextUtils.isEmpty(postDial)) { + return number; + } + + return number.concat(postDial); + } + + /** + * Returns true of the newDigit parameter can be added at the current selection point, otherwise + * returns false. Only prevents input of WAIT and PAUSE digits at an unsupported position. Fails + * early if start == -1 or start is larger than end. + */ + @VisibleForTesting + /* package */ static boolean canAddDigit(CharSequence digits, int start, int end, char newDigit) { + if (newDigit != WAIT && newDigit != PAUSE) { + throw new IllegalArgumentException( + "Should not be called for anything other than PAUSE & WAIT"); + } + + // False if no selection, or selection is reversed (end < start) + if (start == -1 || end < start) { + return false; + } + + // unsupported selection-out-of-bounds state + if (start > digits.length() || end > digits.length()) { + return false; + } + + // Special digit cannot be the first digit + if (start == 0) { + return false; + } + + if (newDigit == WAIT) { + // preceding char is ';' (WAIT) + if (digits.charAt(start - 1) == WAIT) { + return false; + } + + // next char is ';' (WAIT) + if ((digits.length() > end) && (digits.charAt(end) == WAIT)) { + return false; + } + } + + return true; + } + + private TelephonyManager getTelephonyManager() { + return (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE); + } + + @Override + public Context getContext() { + return getActivity(); + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + mWasEmptyBeforeTextChange = TextUtils.isEmpty(s); + } + + @Override + public void onTextChanged(CharSequence input, int start, int before, int changeCount) { + if (mWasEmptyBeforeTextChange != TextUtils.isEmpty(input)) { + final Activity activity = getActivity(); + if (activity != null) { + activity.invalidateOptionsMenu(); + updateMenuOverflowButton(mWasEmptyBeforeTextChange); + } + } + + // DTMF Tones do not need to be played here any longer - + // the DTMF dialer handles that functionality now. + } + + @Override + public void afterTextChanged(Editable input) { + // When DTMF dialpad buttons are being pressed, we delay SpecialCharSequenceMgr sequence, + // since some of SpecialCharSequenceMgr's behavior is too abrupt for the "touch-down" + // behavior. + if (!mDigitsFilledByIntent + && SpecialCharSequenceMgr.handleChars(getActivity(), input.toString(), mDigits)) { + // A special sequence was entered, clear the digits + mDigits.getText().clear(); + } + + if (isDigitsEmpty()) { + mDigitsFilledByIntent = false; + mDigits.setCursorVisible(false); + } + + if (mDialpadQueryListener != null) { + mDialpadQueryListener.onDialpadQueryChanged(mDigits.getText().toString()); + } + + updateDeleteButtonEnabledState(); + } + + @Override + public void onCreate(Bundle state) { + Trace.beginSection(TAG + " onCreate"); + super.onCreate(state); + + mFirstLaunch = state == null; + + mCurrentCountryIso = GeoUtil.getCurrentCountryIso(getActivity()); + + mProhibitedPhoneNumberRegexp = + getResources().getString(R.string.config_prohibited_phone_number_regexp); + + if (state != null) { + mDigitsFilledByIntent = state.getBoolean(PREF_DIGITS_FILLED_BY_INTENT); + } + + mDialpadSlideInDuration = getResources().getInteger(R.integer.dialpad_slide_in_duration); + + if (mCallStateReceiver == null) { + IntentFilter callStateIntentFilter = + new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED); + mCallStateReceiver = new CallStateReceiver(); + getActivity().registerReceiver(mCallStateReceiver, callStateIntentFilter); + } + + initPhoneNumberFormattingTextWatcherExecutor = + DialerExecutors.createUiTaskBuilder( + getFragmentManager(), + "DialpadFragment.initPhoneNumberFormattingTextWatcher", + new InitPhoneNumberFormattingTextWatcherWorker()) + .onSuccess(watcher -> mDialpadView.getDigits().addTextChangedListener(watcher)) + .build(); + Trace.endSection(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { + Trace.beginSection(TAG + " onCreateView"); + Trace.beginSection(TAG + " inflate view"); + View fragmentView = inflater.inflate(R.layout.dialpad_fragment, container, false); + Trace.endSection(); + Trace.beginSection(TAG + " buildLayer"); + fragmentView.buildLayer(); + Trace.endSection(); + + Trace.beginSection(TAG + " setup views"); + + mDialpadView = fragmentView.findViewById(R.id.dialpad_view); + mDialpadView.setCanDigitsBeEdited(true); + mDigits = mDialpadView.getDigits(); + mDigits.setKeyListener(UnicodeDialerKeyListener.INSTANCE); + mDigits.setOnClickListener(this); + mDigits.setOnKeyListener(this); + mDigits.setOnLongClickListener(this); + mDigits.addTextChangedListener(this); + mDigits.setElegantTextHeight(false); + + initPhoneNumberFormattingTextWatcherExecutor.executeSerial( + GeoUtil.getCurrentCountryIso(getActivity())); + + // Check for the presence of the keypad + View oneButton = fragmentView.findViewById(R.id.one); + if (oneButton != null) { + configureKeypadListeners(fragmentView); + } + + mDelete = mDialpadView.getDeleteButton(); + + if (mDelete != null) { + mDelete.setOnClickListener(this); + mDelete.setOnLongClickListener(this); + } + + fragmentView + .findViewById(R.id.spacer) + .setOnTouchListener( + (v, event) -> { + if (isDigitsEmpty()) { + if (getActivity() != null) { + return ((HostInterface) getActivity()).onDialpadSpacerTouchWithEmptyQuery(); + } + return true; + } + return false; + }); + + mDigits.setCursorVisible(false); + + // Set up the "dialpad chooser" UI; see showDialpadChooser(). + mDialpadChooser = fragmentView.findViewById(R.id.dialpadChooser); + mDialpadChooser.setOnItemClickListener(this); + + mFloatingActionButton = fragmentView.findViewById(R.id.dialpad_floating_action_button); + mFloatingActionButton.setOnClickListener(this); + mFloatingActionButtonController = + new FloatingActionButtonController(getActivity(), mFloatingActionButton); + Trace.endSection(); + Trace.endSection(); + return fragmentView; + } + + private boolean isLayoutReady() { + return mDigits != null; + } + + public EditText getDigitsWidget() { + return mDigits; + } + + /** @return true when {@link #mDigits} is actually filled by the Intent. */ + private boolean fillDigitsIfNecessary(Intent intent) { + // Only fills digits from an intent if it is a new intent. + // Otherwise falls back to the previously used number. + if (!mFirstLaunch && !mStartedFromNewIntent) { + return false; + } + + final String action = intent.getAction(); + if (Intent.ACTION_DIAL.equals(action) || Intent.ACTION_VIEW.equals(action)) { + Uri uri = intent.getData(); + if (uri != null) { + if (PhoneAccount.SCHEME_TEL.equals(uri.getScheme())) { + // Put the requested number into the input area + String data = uri.getSchemeSpecificPart(); + // Remember it is filled via Intent. + mDigitsFilledByIntent = true; + final String converted = + PhoneNumberUtils.convertKeypadLettersToDigits( + PhoneNumberUtils.replaceUnicodeDigits(data)); + setFormattedDigits(converted, null); + return true; + } else { + if (!PermissionsUtil.hasContactsReadPermissions(getActivity())) { + return false; + } + String type = intent.getType(); + if (People.CONTENT_ITEM_TYPE.equals(type) || Phones.CONTENT_ITEM_TYPE.equals(type)) { + // Query the phone number + Cursor c = + getActivity() + .getContentResolver() + .query( + intent.getData(), + new String[] {PhonesColumns.NUMBER, PhonesColumns.NUMBER_KEY}, + null, + null, + null); + if (c != null) { + try { + if (c.moveToFirst()) { + // Remember it is filled via Intent. + mDigitsFilledByIntent = true; + // Put the number into the input area + setFormattedDigits(c.getString(0), c.getString(1)); + return true; + } + } finally { + c.close(); + } + } + } + } + } + } + return false; + } + + /** + * Checks the given Intent and changes dialpad's UI state. For example, if the Intent requires the + * screen to enter "Add Call" mode, this method will show correct UI for the mode. + */ + private void configureScreenFromIntent(Activity parent) { + // If we were not invoked with a DIAL intent + if (!Intent.ACTION_DIAL.equals(parent.getIntent().getAction())) { + setStartedFromNewIntent(false); + return; + } + + // See if we were invoked with a DIAL intent. If we were, fill in the appropriate + // digits in the dialer field. + Intent intent = parent.getIntent(); + + if (!isLayoutReady()) { + // This happens typically when parent's Activity#onNewIntent() is called while + // Fragment#onCreateView() isn't called yet, and thus we cannot configure Views at + // this point. onViewCreate() should call this method after preparing layouts, so + // just ignore this call now. + LogUtil.i( + "DialpadFragment.configureScreenFromIntent", + "Screen configuration is requested before onCreateView() is called. Ignored"); + return; + } + + boolean needToShowDialpadChooser = false; + + // Be sure *not* to show the dialpad chooser if this is an + // explicit "Add call" action, though. + final boolean isAddCallMode = isAddCallMode(intent); + if (!isAddCallMode) { + + // Don't show the chooser when called via onNewIntent() and phone number is present. + // i.e. User clicks a telephone link from gmail for example. + // In this case, we want to show the dialpad with the phone number. + final boolean digitsFilled = fillDigitsIfNecessary(intent); + if (!(mStartedFromNewIntent && digitsFilled)) { + + final String action = intent.getAction(); + if (Intent.ACTION_DIAL.equals(action) + || Intent.ACTION_VIEW.equals(action) + || Intent.ACTION_MAIN.equals(action)) { + // If there's already an active call, bring up an intermediate UI to + // make the user confirm what they really want to do. + if (isPhoneInUse()) { + needToShowDialpadChooser = true; + } + } + } + } + showDialpadChooser(needToShowDialpadChooser); + setStartedFromNewIntent(false); + } + + public void setStartedFromNewIntent(boolean value) { + mStartedFromNewIntent = value; + } + + public void clearCallRateInformation() { + setCallRateInformation(null, null); + } + + public void setCallRateInformation(String countryName, String displayRate) { + mDialpadView.setCallRateInformation(countryName, displayRate); + } + + /** Sets formatted digits to digits field. */ + private void setFormattedDigits(String data, String normalizedNumber) { + final String formatted = getFormattedDigits(data, normalizedNumber, mCurrentCountryIso); + if (!TextUtils.isEmpty(formatted)) { + Editable digits = mDigits.getText(); + digits.replace(0, digits.length(), formatted); + // for some reason this isn't getting called in the digits.replace call above.. + // but in any case, this will make sure the background drawable looks right + afterTextChanged(digits); + } + } + + private void configureKeypadListeners(View fragmentView) { + final int[] buttonIds = + new int[] { + R.id.one, + R.id.two, + R.id.three, + R.id.four, + R.id.five, + R.id.six, + R.id.seven, + R.id.eight, + R.id.nine, + R.id.star, + R.id.zero, + R.id.pound + }; + + DialpadKeyButton dialpadKey; + + for (int buttonId : buttonIds) { + dialpadKey = fragmentView.findViewById(buttonId); + dialpadKey.setOnPressedListener(this); + } + + // Long-pressing one button will initiate Voicemail. + final DialpadKeyButton one = fragmentView.findViewById(R.id.one); + one.setOnLongClickListener(this); + + // Long-pressing zero button will enter '+' instead. + final DialpadKeyButton zero = fragmentView.findViewById(R.id.zero); + zero.setOnLongClickListener(this); + } + + @Override + public void onStart() { + LogUtil.d("DialpadFragment.onStart", "first launch: %b", mFirstLaunch); + Trace.beginSection(TAG + " onStart"); + super.onStart(); + // 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. + final long start = System.currentTimeMillis(); + synchronized (mToneGeneratorLock) { + if (mToneGenerator == null) { + try { + mToneGenerator = new ToneGenerator(DIAL_TONE_STREAM_TYPE, TONE_RELATIVE_VOLUME); + } catch (RuntimeException e) { + LogUtil.e( + "DialpadFragment.onStart", + "Exception caught while creating local tone generator: " + e); + mToneGenerator = null; + } + } + } + final long total = System.currentTimeMillis() - start; + if (total > 50) { + LogUtil.i("DialpadFragment.onStart", "Time for ToneGenerator creation: " + total); + } + Trace.endSection(); + } + + @Override + public void onResume() { + LogUtil.d("DialpadFragment.onResume", ""); + Trace.beginSection(TAG + " onResume"); + super.onResume(); + + Resources res = getResources(); + int iconId = R.drawable.quantum_ic_call_vd_theme_24; + if (MotorolaUtils.isWifiCallingAvailable(getContext())) { + iconId = R.drawable.ic_wifi_calling; + } + mFloatingActionButtonController.changeIcon( + res.getDrawable(iconId, null), res.getString(R.string.description_dial_button)); + + mDialpadQueryListener = + FragmentUtils.getParentUnsafe(this, OnDialpadQueryChangedListener.class); + + final StopWatch stopWatch = StopWatch.start("Dialpad.onResume"); + + // Query the last dialed number. Do it first because hitting + // the DB is 'slow'. This call is asynchronous. + queryLastOutgoingCall(); + + stopWatch.lap("qloc"); + + final ContentResolver contentResolver = getActivity().getContentResolver(); + + // retrieve the DTMF tone play back setting. + mDTMFToneEnabled = + Settings.System.getInt(contentResolver, Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1; + + stopWatch.lap("dtwd"); + + stopWatch.lap("hptc"); + + mPressedDialpadKeys.clear(); + + configureScreenFromIntent(getActivity()); + + stopWatch.lap("fdin"); + + if (!isPhoneInUse()) { + // A sanity-check: the "dialpad chooser" UI should not be visible if the phone is idle. + showDialpadChooser(false); + } + + stopWatch.lap("hnt"); + + updateDeleteButtonEnabledState(); + + stopWatch.lap("bes"); + + stopWatch.stopAndLog(TAG, 50); + + // Populate the overflow menu in onResume instead of onCreate, so that if the SMS activity + // is disabled while Dialer is paused, the "Send a text message" option can be correctly + // removed when resumed. + mOverflowMenuButton = mDialpadView.getOverflowMenuButton(); + mOverflowPopupMenu = buildOptionsMenu(mOverflowMenuButton); + mOverflowMenuButton.setOnTouchListener(mOverflowPopupMenu.getDragToOpenListener()); + mOverflowMenuButton.setOnClickListener(this); + mOverflowMenuButton.setVisibility(isDigitsEmpty() ? View.INVISIBLE : View.VISIBLE); + + if (mFirstLaunch) { + // The onHiddenChanged callback does not get called the first time the fragment is + // attached, so call it ourselves here. + onHiddenChanged(false); + } + + mFirstLaunch = false; + Trace.endSection(); + } + + @Override + public void onPause() { + super.onPause(); + + // Make sure we don't leave this activity with a tone still playing. + stopTone(); + mPressedDialpadKeys.clear(); + + // TODO: I wonder if we should not check if the AsyncTask that + // lookup the last dialed number has completed. + mLastNumberDialed = EMPTY_NUMBER; // Since we are going to query again, free stale number. + + SpecialCharSequenceMgr.cleanup(); + mOverflowPopupMenu.dismiss(); + } + + @Override + public void onStop() { + super.onStop(); + + synchronized (mToneGeneratorLock) { + if (mToneGenerator != null) { + mToneGenerator.release(); + mToneGenerator = null; + } + } + + if (mClearDigitsOnStop) { + mClearDigitsOnStop = false; + clearDialpad(); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(PREF_DIGITS_FILLED_BY_INTENT, mDigitsFilledByIntent); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mPseudoEmergencyAnimator != null) { + mPseudoEmergencyAnimator.destroy(); + mPseudoEmergencyAnimator = null; + } + getActivity().unregisterReceiver(mCallStateReceiver); + } + + private void keyPressed(int keyCode) { + if (getView() == null || getView().getTranslationY() != 0) { + return; + } + switch (keyCode) { + case KeyEvent.KEYCODE_1: + playTone(ToneGenerator.TONE_DTMF_1, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_2: + playTone(ToneGenerator.TONE_DTMF_2, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_3: + playTone(ToneGenerator.TONE_DTMF_3, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_4: + playTone(ToneGenerator.TONE_DTMF_4, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_5: + playTone(ToneGenerator.TONE_DTMF_5, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_6: + playTone(ToneGenerator.TONE_DTMF_6, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_7: + playTone(ToneGenerator.TONE_DTMF_7, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_8: + playTone(ToneGenerator.TONE_DTMF_8, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_9: + playTone(ToneGenerator.TONE_DTMF_9, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_0: + playTone(ToneGenerator.TONE_DTMF_0, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_POUND: + playTone(ToneGenerator.TONE_DTMF_P, TONE_LENGTH_INFINITE); + break; + case KeyEvent.KEYCODE_STAR: + playTone(ToneGenerator.TONE_DTMF_S, TONE_LENGTH_INFINITE); + break; + default: + break; + } + + getView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); + KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode); + mDigits.onKeyDown(keyCode, event); + + // If the cursor is at the end of the text we hide it. + final int length = mDigits.length(); + if (length == mDigits.getSelectionStart() && length == mDigits.getSelectionEnd()) { + mDigits.setCursorVisible(false); + } + } + + @Override + public boolean onKey(View view, int keyCode, KeyEvent event) { + if (view.getId() == R.id.digits) { + if (keyCode == KeyEvent.KEYCODE_ENTER) { + handleDialButtonPressed(); + return true; + } + } + return false; + } + + /** + * When a key is pressed, we start playing DTMF tone, do vibration, and enter the digit + * immediately. When a key is released, we stop the tone. Note that the "key press" event will be + * delivered by the system with certain amount of delay, it won't be synced with user's actual + * "touch-down" behavior. + */ + @Override + public void onPressed(View view, boolean pressed) { + if (pressed) { + int resId = view.getId(); + if (resId == R.id.one) { + keyPressed(KeyEvent.KEYCODE_1); + } else if (resId == R.id.two) { + keyPressed(KeyEvent.KEYCODE_2); + } else if (resId == R.id.three) { + keyPressed(KeyEvent.KEYCODE_3); + } else if (resId == R.id.four) { + keyPressed(KeyEvent.KEYCODE_4); + } else if (resId == R.id.five) { + keyPressed(KeyEvent.KEYCODE_5); + } else if (resId == R.id.six) { + keyPressed(KeyEvent.KEYCODE_6); + } else if (resId == R.id.seven) { + keyPressed(KeyEvent.KEYCODE_7); + } else if (resId == R.id.eight) { + keyPressed(KeyEvent.KEYCODE_8); + } else if (resId == R.id.nine) { + keyPressed(KeyEvent.KEYCODE_9); + } else if (resId == R.id.zero) { + keyPressed(KeyEvent.KEYCODE_0); + } else if (resId == R.id.pound) { + keyPressed(KeyEvent.KEYCODE_POUND); + } else if (resId == R.id.star) { + keyPressed(KeyEvent.KEYCODE_STAR); + } else { + LogUtil.e( + "DialpadFragment.onPressed", "Unexpected onTouch(ACTION_DOWN) event from: " + view); + } + mPressedDialpadKeys.add(view); + } else { + mPressedDialpadKeys.remove(view); + if (mPressedDialpadKeys.isEmpty()) { + stopTone(); + } + } + } + + /** + * Called by the containing Activity to tell this Fragment to build an overflow options menu for + * display by the container when appropriate. + * + * @param invoker the View that invoked the options menu, to act as an anchor location. + */ + private PopupMenu buildOptionsMenu(View invoker) { + final PopupMenu popupMenu = + new PopupMenu(getActivity(), invoker) { + @Override + public void show() { + final Menu menu = getMenu(); + + boolean enable = !isDigitsEmpty(); + for (int i = 0; i < menu.size(); i++) { + MenuItem item = menu.getItem(i); + item.setEnabled(enable); + if (item.getItemId() == R.id.menu_call_with_note) { + item.setVisible(CallUtil.isCallWithSubjectSupported(getContext())); + } + } + super.show(); + } + }; + popupMenu.inflate(R.menu.dialpad_options); + popupMenu.setOnMenuItemClickListener(this); + return popupMenu; + } + + @Override + public void onClick(View view) { + int resId = view.getId(); + if (resId == R.id.dialpad_floating_action_button) { + view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); + handleDialButtonPressed(); + } else if (resId == R.id.deleteButton) { + keyPressed(KeyEvent.KEYCODE_DEL); + } else if (resId == R.id.digits) { + if (!isDigitsEmpty()) { + mDigits.setCursorVisible(true); + } + } else if (resId == R.id.dialpad_overflow) { + mOverflowPopupMenu.show(); + } else { + LogUtil.w("DialpadFragment.onClick", "Unexpected event from: " + view); + } + } + + @Override + public boolean onLongClick(View view) { + final Editable digits = mDigits.getText(); + final int id = view.getId(); + if (id == R.id.deleteButton) { + digits.clear(); + return true; + } else if (id == R.id.one) { + if (isDigitsEmpty() || TextUtils.equals(mDigits.getText(), "1")) { + // We'll try to initiate voicemail and thus we want to remove irrelevant string. + removePreviousDigitIfPossible('1'); + + List subscriptionAccountHandles = + PhoneAccountUtils.getSubscriptionPhoneAccounts(getActivity()); + boolean hasUserSelectedDefault = + subscriptionAccountHandles.contains( + TelecomUtil.getDefaultOutgoingPhoneAccount( + getActivity(), PhoneAccount.SCHEME_VOICEMAIL)); + boolean needsAccountDisambiguation = + subscriptionAccountHandles.size() > 1 && !hasUserSelectedDefault; + + if (needsAccountDisambiguation || isVoicemailAvailable()) { + // On a multi-SIM phone, if the user has not selected a default + // subscription, initiate a call to voicemail so they can select an account + // from the "Call with" dialog. + callVoicemail(); + } else if (getActivity() != null) { + // Voicemail is unavailable maybe because Airplane mode is turned on. + // Check the current status and show the most appropriate error message. + final boolean isAirplaneModeOn = + Settings.System.getInt( + getActivity().getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) + != 0; + if (isAirplaneModeOn) { + DialogFragment dialogFragment = + ErrorDialogFragment.newInstance(R.string.dialog_voicemail_airplane_mode_message); + dialogFragment.show(getFragmentManager(), "voicemail_request_during_airplane_mode"); + } else { + DialogFragment dialogFragment = + ErrorDialogFragment.newInstance(R.string.dialog_voicemail_not_ready_message); + dialogFragment.show(getFragmentManager(), "voicemail_not_ready"); + } + } + return true; + } + return false; + } else if (id == R.id.zero) { + if (mPressedDialpadKeys.contains(view)) { + // If the zero key is currently pressed, then the long press occurred by touch + // (and not via other means like certain accessibility input methods). + // Remove the '0' that was input when the key was first pressed. + removePreviousDigitIfPossible('0'); + } + keyPressed(KeyEvent.KEYCODE_PLUS); + stopTone(); + mPressedDialpadKeys.remove(view); + return true; + } else if (id == R.id.digits) { + mDigits.setCursorVisible(true); + return false; + } + return false; + } + + /** + * Remove the digit just before the current position of the cursor, iff the following conditions + * are true: 1) The cursor is not positioned at index 0. 2) The digit before the current cursor + * position matches the current digit. + * + * @param digit to remove from the digits view. + */ + private void removePreviousDigitIfPossible(char digit) { + final int currentPosition = mDigits.getSelectionStart(); + if (currentPosition > 0 && digit == mDigits.getText().charAt(currentPosition - 1)) { + mDigits.setSelection(currentPosition); + mDigits.getText().delete(currentPosition - 1, currentPosition); + } + } + + public void callVoicemail() { + DialerUtils.startActivityWithErrorToast( + getActivity(), + new CallIntentBuilder(CallUtil.getVoicemailUri(), CallInitiationType.Type.DIALPAD).build()); + hideAndClearDialpad(false); + } + + private void hideAndClearDialpad(boolean animate) { + FragmentUtils.getParentUnsafe(this, DialpadListener.class).hideDialpadFragment(animate, true); + } + + /** + * In most cases, when the dial button is pressed, there is a number in digits area. Pack it in + * the intent, start the outgoing call broadcast as a separate task and finish this activity. + * + *

When there is no digit and the phone is CDMA and off hook, we're sending a blank flash for + * CDMA. CDMA networks use Flash messages when special processing needs to be done, mainly for + * 3-way or call waiting scenarios. Presumably, here we're in a special 3-way scenario where the + * network needs a blank flash before being able to add the new participant. (This is not the case + * with all 3-way calls, just certain CDMA infrastructures.) + * + *

Otherwise, there is no digit, display the last dialed number. Don't finish since the user + * may want to edit it. The user needs to press the dial button again, to dial it (general case + * described above). + */ + private void handleDialButtonPressed() { + if (isDigitsEmpty()) { // No number entered. + // No real call made, so treat it as a click + PerformanceReport.recordClick(UiAction.Type.PRESS_CALL_BUTTON_WITHOUT_CALLING); + handleDialButtonClickWithEmptyDigits(); + } else { + final String number = mDigits.getText().toString(); + + // "persist.radio.otaspdial" is a temporary hack needed for one carrier's automated + // test equipment. + // TODO: clean it up. + if (number != null + && !TextUtils.isEmpty(mProhibitedPhoneNumberRegexp) + && number.matches(mProhibitedPhoneNumberRegexp)) { + PerformanceReport.recordClick(UiAction.Type.PRESS_CALL_BUTTON_WITHOUT_CALLING); + LogUtil.i( + "DialpadFragment.handleDialButtonPressed", + "The phone number is prohibited explicitly by a rule."); + if (getActivity() != null) { + DialogFragment dialogFragment = + ErrorDialogFragment.newInstance(R.string.dialog_phone_call_prohibited_message); + dialogFragment.show(getFragmentManager(), "phone_prohibited_dialog"); + } + + // Clear the digits just in case. + clearDialpad(); + } else { + final Intent intent = + new CallIntentBuilder(number, CallInitiationType.Type.DIALPAD).build(); + DialerUtils.startActivityWithErrorToast(getActivity(), intent); + hideAndClearDialpad(false); + } + } + } + + public void clearDialpad() { + if (mDigits != null) { + mDigits.getText().clear(); + } + } + + private void handleDialButtonClickWithEmptyDigits() { + if (phoneIsCdma() && isPhoneInUse()) { + // TODO: Move this logic into services/Telephony + // + // This is really CDMA specific. On GSM is it possible + // to be off hook and wanted to add a 3rd party using + // the redial feature. + startActivity(newFlashIntent()); + } else { + if (!TextUtils.isEmpty(mLastNumberDialed)) { + // Dialpad will be filled with last called number, + // but we don't want to record it as user action + PerformanceReport.setIgnoreActionOnce(UiAction.Type.TEXT_CHANGE_WITH_INPUT); + + // Recall the last number dialed. + mDigits.setText(mLastNumberDialed); + + // ...and move the cursor to the end of the digits string, + // so you'll be able to delete digits using the Delete + // button (just as if you had typed the number manually.) + // + // Note we use mDigits.getText().length() here, not + // mLastNumberDialed.length(), since the EditText widget now + // contains a *formatted* version of mLastNumberDialed (due to + // mTextWatcher) and its length may have changed. + mDigits.setSelection(mDigits.getText().length()); + } else { + // There's no "last number dialed" or the + // background query is still running. There's + // nothing useful for the Dial button to do in + // this case. Note: with a soft dial button, this + // can never happens since the dial button is + // disabled under these conditons. + playTone(ToneGenerator.TONE_PROP_NACK); + } + } + } + + /** Plays the specified tone for TONE_LENGTH_MS milliseconds. */ + private void playTone(int tone) { + playTone(tone, TONE_LENGTH_MS); + } + + /** + * Play the specified tone for the specified 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. + * + *

The tone length can be -1, meaning "keep playing the tone." If the caller does so, it should + * call stopTone() afterward. + * + * @param tone a tone code from {@link ToneGenerator} + * @param durationMs tone length. + */ + private void playTone(int tone, int durationMs) { + // 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) getActivity().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) { + LogUtil.w("DialpadFragment.playTone", "mToneGenerator == null, tone: " + tone); + return; + } + + // Start the new tone (will stop any playing tone) + mToneGenerator.startTone(tone, durationMs); + } + } + + /** Stop the tone if it is played. */ + private void stopTone() { + // if local tone playback is disabled, just return. + if (!mDTMFToneEnabled) { + return; + } + synchronized (mToneGeneratorLock) { + if (mToneGenerator == null) { + LogUtil.w("DialpadFragment.stopTone", "mToneGenerator == null"); + return; + } + mToneGenerator.stopTone(); + } + } + + /** + * Brings up the "dialpad chooser" UI in place of the usual Dialer elements (the textfield/button + * and the dialpad underneath). + * + *

We show this UI if the user brings up the Dialer while a call is already in progress, since + * there's a good chance we got here accidentally (and the user really wanted the in-call dialpad + * instead). So in this situation we display an intermediate UI that lets the user explicitly + * choose between the in-call dialpad ("Use touch tone keypad") and the regular Dialer ("Add + * call"). (Or, the option "Return to call in progress" just goes back to the in-call UI with no + * dialpad at all.) + * + * @param enabled If true, show the "dialpad chooser" instead of the regular Dialer UI + */ + private void showDialpadChooser(boolean enabled) { + if (getActivity() == null) { + return; + } + // Check if onCreateView() is already called by checking one of View objects. + if (!isLayoutReady()) { + return; + } + + if (enabled) { + LogUtil.i("DialpadFragment.showDialpadChooser", "Showing dialpad chooser!"); + if (mDialpadView != null) { + mDialpadView.setVisibility(View.GONE); + } + + if (mOverflowPopupMenu != null) { + mOverflowPopupMenu.dismiss(); + } + + mFloatingActionButtonController.setVisible(false); + mDialpadChooser.setVisibility(View.VISIBLE); + + // Instantiate the DialpadChooserAdapter and hook it up to the + // ListView. We do this only once. + if (mDialpadChooserAdapter == null) { + mDialpadChooserAdapter = new DialpadChooserAdapter(getActivity()); + } + mDialpadChooser.setAdapter(mDialpadChooserAdapter); + } else { + LogUtil.i("DialpadFragment.showDialpadChooser", "Displaying normal Dialer UI."); + if (mDialpadView != null) { + mDialpadView.setVisibility(View.VISIBLE); + } else { + mDigits.setVisibility(View.VISIBLE); + } + + // mFloatingActionButtonController must also be 'scaled in', in order to be visible after + // 'scaleOut()' hidden method. + if (!mFloatingActionButtonController.isVisible()) { + // Just call 'scaleIn()' method if the mFloatingActionButtonController was not already + // previously visible. + mFloatingActionButtonController.scaleIn(0); + } + mDialpadChooser.setVisibility(View.GONE); + } + } + + /** @return true if we're currently showing the "dialpad chooser" UI. */ + private boolean isDialpadChooserVisible() { + return mDialpadChooser.getVisibility() == View.VISIBLE; + } + + /** Handle clicks from the dialpad chooser. */ + @Override + public void onItemClick(AdapterView parent, View v, int position, long id) { + DialpadChooserAdapter.ChoiceItem item = + (DialpadChooserAdapter.ChoiceItem) parent.getItemAtPosition(position); + int itemId = item.id; + if (itemId == DialpadChooserAdapter.DIALPAD_CHOICE_USE_DTMF_DIALPAD) { + // Fire off an intent to go back to the in-call UI + // with the dialpad visible. + returnToInCallScreen(true); + } else if (itemId == DialpadChooserAdapter.DIALPAD_CHOICE_RETURN_TO_CALL) { + // Fire off an intent to go back to the in-call UI + // (with the dialpad hidden). + returnToInCallScreen(false); + } else if (itemId == DialpadChooserAdapter.DIALPAD_CHOICE_ADD_NEW_CALL) { + // Ok, guess the user really did want to be here (in the + // regular Dialer) after all. Bring back the normal Dialer UI. + showDialpadChooser(false); + } else { + LogUtil.w("DialpadFragment.onItemClick", "Unexpected itemId: " + itemId); + } + } + + /** + * Returns to the in-call UI (where there's presumably a call in progress) in response to the user + * selecting "use touch tone keypad" or "return to call" from the dialpad chooser. + */ + private void returnToInCallScreen(boolean showDialpad) { + TelecomUtil.showInCallScreen(getActivity(), showDialpad); + + // Finally, finish() ourselves so that we don't stay on the + // activity stack. + // Note that we do this whether or not the showCallScreenWithDialpad() + // call above had any effect or not! (That call is a no-op if the + // phone is idle, which can happen if the current call ends while + // the dialpad chooser is up. In this case we can't show the + // InCallScreen, and there's no point staying here in the Dialer, + // so we just take the user back where he came from...) + getActivity().finish(); + } + + /** + * @return true if the phone is "in use", meaning that at least one line is active (ie. off hook + * or ringing or dialing, or on hold). + */ + private boolean isPhoneInUse() { + return getContext() != null && TelecomUtil.isInCall(getContext()); + } + + /** @return true if the phone is a CDMA phone type */ + private boolean phoneIsCdma() { + return getTelephonyManager().getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA; + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + int resId = item.getItemId(); + if (resId == R.id.menu_2s_pause) { + updateDialString(PAUSE); + return true; + } else if (resId == R.id.menu_add_wait) { + updateDialString(WAIT); + return true; + } else if (resId == R.id.menu_call_with_note) { + CallSubjectDialog.start(getActivity(), mDigits.getText().toString()); + hideAndClearDialpad(false); + return true; + } else { + return false; + } + } + + /** + * Updates the dial string (mDigits) after inserting a Pause character (,) or Wait character (;). + */ + private void updateDialString(char newDigit) { + if (newDigit != WAIT && newDigit != PAUSE) { + throw new IllegalArgumentException("Not expected for anything other than PAUSE & WAIT"); + } + + int selectionStart; + int selectionEnd; + + // SpannableStringBuilder editable_text = new SpannableStringBuilder(mDigits.getText()); + int anchor = mDigits.getSelectionStart(); + int point = mDigits.getSelectionEnd(); + + selectionStart = Math.min(anchor, point); + selectionEnd = Math.max(anchor, point); + + if (selectionStart == -1) { + selectionStart = selectionEnd = mDigits.length(); + } + + Editable digits = mDigits.getText(); + + if (canAddDigit(digits, selectionStart, selectionEnd, newDigit)) { + digits.replace(selectionStart, selectionEnd, Character.toString(newDigit)); + + if (selectionStart != selectionEnd) { + // Unselect: back to a regular cursor, just pass the character inserted. + mDigits.setSelection(selectionStart + 1); + } + } + } + + /** Update the enabledness of the "Dial" and "Backspace" buttons if applicable. */ + private void updateDeleteButtonEnabledState() { + if (getActivity() == null) { + return; + } + final boolean digitsNotEmpty = !isDigitsEmpty(); + mDelete.setEnabled(digitsNotEmpty); + } + + /** + * Handle transitions for the menu button depending on the state of the digits edit text. + * Transition out when going from digits to no digits and transition in when the first digit is + * pressed. + * + * @param transitionIn True if transitioning in, False if transitioning out + */ + private void updateMenuOverflowButton(boolean transitionIn) { + mOverflowMenuButton = mDialpadView.getOverflowMenuButton(); + if (transitionIn) { + AnimUtils.fadeIn(mOverflowMenuButton, AnimUtils.DEFAULT_DURATION); + } else { + AnimUtils.fadeOut(mOverflowMenuButton, AnimUtils.DEFAULT_DURATION); + } + } + + /** + * Check if voicemail is enabled/accessible. + * + * @return true if voicemail is enabled and accessible. Note that this can be false "temporarily" + * after the app boot. + */ + private boolean isVoicemailAvailable() { + try { + PhoneAccountHandle defaultUserSelectedAccount = + TelecomUtil.getDefaultOutgoingPhoneAccount(getActivity(), PhoneAccount.SCHEME_VOICEMAIL); + if (defaultUserSelectedAccount == null) { + // In a single-SIM phone, there is no default outgoing phone account selected by + // the user, so just call TelephonyManager#getVoicemailNumber directly. + return !TextUtils.isEmpty(getTelephonyManager().getVoiceMailNumber()); + } else { + return !TextUtils.isEmpty( + TelecomUtil.getVoicemailNumber(getActivity(), defaultUserSelectedAccount)); + } + } catch (SecurityException se) { + // Possibly no READ_PHONE_STATE privilege. + LogUtil.w( + "DialpadFragment.isVoicemailAvailable", + "SecurityException is thrown. Maybe privilege isn't sufficient."); + } + return false; + } + + /** @return true if the widget with the phone number digits is empty. */ + private boolean isDigitsEmpty() { + return mDigits.length() == 0; + } + + /** + * Starts the asyn query to get the last dialed/outgoing number. When the background query + * finishes, mLastNumberDialed is set to the last dialed number or an empty string if none exists + * yet. + */ + private void queryLastOutgoingCall() { + mLastNumberDialed = EMPTY_NUMBER; + if (!PermissionsUtil.hasCallLogReadPermissions(getContext())) { + return; + } + FragmentUtils.getParentUnsafe(this, DialpadListener.class) + .getLastOutgoingCall( + number -> { + // TODO: Filter out emergency numbers if the carrier does not want redial for these. + + // If the fragment has already been detached since the last time we called + // queryLastOutgoingCall in onResume there is no point doing anything here. + if (getActivity() == null) { + return; + } + mLastNumberDialed = number; + updateDeleteButtonEnabledState(); + }); + } + + private Intent newFlashIntent() { + Intent intent = new CallIntentBuilder(EMPTY_NUMBER, CallInitiationType.Type.DIALPAD).build(); + intent.putExtra(EXTRA_SEND_EMPTY_FLASH, true); + return intent; + } + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + if (getActivity() == null || getView() == null) { + return; + } + final DialpadView dialpadView = getView().findViewById(R.id.dialpad_view); + if (!hidden && !isDialpadChooserVisible()) { + if (mAnimate) { + dialpadView.animateShow(); + } + mFloatingActionButtonController.setVisible(false); + mFloatingActionButtonController.scaleIn(mAnimate ? mDialpadSlideInDuration : 0); + FragmentUtils.getParentUnsafe(this, DialpadListener.class).onDialpadShown(); + mDigits.requestFocus(); + } + if (hidden) { + if (mAnimate) { + mFloatingActionButtonController.scaleOut(); + } else { + mFloatingActionButtonController.setVisible(false); + } + } + } + + public boolean getAnimate() { + return mAnimate; + } + + public void setAnimate(boolean value) { + mAnimate = value; + } + + public void setYFraction(float yFraction) { + ((DialpadSlidingRelativeLayout) getView()).setYFraction(yFraction); + } + + public int getDialpadHeight() { + if (mDialpadView == null) { + return 0; + } + return mDialpadView.getHeight(); + } + + public void process_quote_emergency_unquote(String query) { + if (PseudoEmergencyAnimator.PSEUDO_EMERGENCY_NUMBER.equals(query)) { + if (mPseudoEmergencyAnimator == null) { + mPseudoEmergencyAnimator = + new PseudoEmergencyAnimator( + new PseudoEmergencyAnimator.ViewProvider() { + @Override + public View getFab() { + return mFloatingActionButton; + } + + @Override + public Context getContext() { + return DialpadFragment.this.getContext(); + } + }); + } + mPseudoEmergencyAnimator.start(); + } else { + if (mPseudoEmergencyAnimator != null) { + mPseudoEmergencyAnimator.end(); + } + } + } + + public interface OnDialpadQueryChangedListener { + + void onDialpadQueryChanged(String query); + } + + public interface HostInterface { + + /** + * Notifies the parent activity that the space above the dialpad has been tapped with no query + * in the dialpad present. In most situations this will cause the dialpad to be dismissed, + * unless there happens to be content showing. + */ + boolean onDialpadSpacerTouchWithEmptyQuery(); + } + + /** + * LinearLayout with getter and setter methods for the translationY property using floats, for + * animation purposes. + */ + public static class DialpadSlidingRelativeLayout extends RelativeLayout { + + public DialpadSlidingRelativeLayout(Context context) { + super(context); + } + + public DialpadSlidingRelativeLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DialpadSlidingRelativeLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @UsedByReflection(value = "dialpad_fragment.xml") + public float getYFraction() { + final int height = getHeight(); + if (height == 0) { + return 0; + } + return getTranslationY() / height; + } + + @UsedByReflection(value = "dialpad_fragment.xml") + public void setYFraction(float yFraction) { + setTranslationY(yFraction * getHeight()); + } + } + + public static class ErrorDialogFragment extends DialogFragment { + + private static final String ARG_TITLE_RES_ID = "argTitleResId"; + private static final String ARG_MESSAGE_RES_ID = "argMessageResId"; + private int mTitleResId; + private int mMessageResId; + + public static ErrorDialogFragment newInstance(int messageResId) { + return newInstance(0, messageResId); + } + + public static ErrorDialogFragment newInstance(int titleResId, int messageResId) { + final ErrorDialogFragment fragment = new ErrorDialogFragment(); + final Bundle args = new Bundle(); + args.putInt(ARG_TITLE_RES_ID, titleResId); + args.putInt(ARG_MESSAGE_RES_ID, messageResId); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mTitleResId = getArguments().getInt(ARG_TITLE_RES_ID); + mMessageResId = getArguments().getInt(ARG_MESSAGE_RES_ID); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + if (mTitleResId != 0) { + builder.setTitle(mTitleResId); + } + if (mMessageResId != 0) { + builder.setMessage(mMessageResId); + } + builder.setPositiveButton(android.R.string.ok, (dialog, which) -> dismiss()); + return builder.create(); + } + } + + /** + * Simple list adapter, binding to an icon + text label for each item in the "dialpad chooser" + * list. + */ + private static class DialpadChooserAdapter extends BaseAdapter { + + // IDs for the possible "choices": + static final int DIALPAD_CHOICE_USE_DTMF_DIALPAD = 101; + static final int DIALPAD_CHOICE_RETURN_TO_CALL = 102; + static final int DIALPAD_CHOICE_ADD_NEW_CALL = 103; + private static final int NUM_ITEMS = 3; + private LayoutInflater mInflater; + private ChoiceItem[] mChoiceItems = new ChoiceItem[NUM_ITEMS]; + + DialpadChooserAdapter(Context context) { + // Cache the LayoutInflate to avoid asking for a new one each time. + mInflater = LayoutInflater.from(context); + + // Initialize the possible choices. + // TODO: could this be specified entirely in XML? + + // - "Use touch tone keypad" + mChoiceItems[0] = + new ChoiceItem( + context.getString(R.string.dialer_useDtmfDialpad), + BitmapFactory.decodeResource( + context.getResources(), R.drawable.ic_dialer_fork_tt_keypad), + DIALPAD_CHOICE_USE_DTMF_DIALPAD); + + // - "Return to call in progress" + mChoiceItems[1] = + new ChoiceItem( + context.getString(R.string.dialer_returnToInCallScreen), + BitmapFactory.decodeResource( + context.getResources(), R.drawable.ic_dialer_fork_current_call), + DIALPAD_CHOICE_RETURN_TO_CALL); + + // - "Add call" + mChoiceItems[2] = + new ChoiceItem( + context.getString(R.string.dialer_addAnotherCall), + BitmapFactory.decodeResource( + context.getResources(), R.drawable.ic_dialer_fork_add_call), + DIALPAD_CHOICE_ADD_NEW_CALL); + } + + @Override + public int getCount() { + return NUM_ITEMS; + } + + /** Return the ChoiceItem for a given position. */ + @Override + public Object getItem(int position) { + return mChoiceItems[position]; + } + + /** Return a unique ID for each possible choice. */ + @Override + public long getItemId(int position) { + return position; + } + + /** Make a view for each row. */ + @Override + public View getView(int position, View convertView, ViewGroup parent) { + // When convertView is non-null, we can reuse it (there's no need + // to reinflate it.) + if (convertView == null) { + convertView = mInflater.inflate(R.layout.dialpad_chooser_list_item, null); + } + + TextView text = convertView.findViewById(R.id.text); + text.setText(mChoiceItems[position].text); + + ImageView icon = convertView.findViewById(R.id.icon); + icon.setImageBitmap(mChoiceItems[position].icon); + + return convertView; + } + + // Simple struct for a single "choice" item. + static class ChoiceItem { + + String text; + Bitmap icon; + int id; + + ChoiceItem(String s, Bitmap b, int i) { + text = s; + icon = b; + id = i; + } + } + } + + private class CallStateReceiver extends BroadcastReceiver { + + /** + * Receive call state changes so that we can take down the "dialpad chooser" if the phone + * becomes idle while the chooser UI is visible. + */ + @Override + public void onReceive(Context context, Intent intent) { + String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); + if ((TextUtils.equals(state, TelephonyManager.EXTRA_STATE_IDLE) + || TextUtils.equals(state, TelephonyManager.EXTRA_STATE_OFFHOOK)) + && isDialpadChooserVisible()) { + // Note there's a race condition in the UI here: the + // dialpad chooser could conceivably disappear (on its + // own) at the exact moment the user was trying to select + // one of the choices, which would be confusing. (But at + // least that's better than leaving the dialpad chooser + // onscreen, but useless...) + showDialpadChooser(false); + } + } + } + + /** Listener for dialpad's parent. */ + public interface DialpadListener { + void getLastOutgoingCall(LastOutgoingCallCallback callback); + + void onDialpadShown(); + + void hideDialpadFragment(boolean animate, boolean value); + } + + /** Callback for async lookup of the last number dialed. */ + public interface LastOutgoingCallCallback { + + void lastOutgoingCall(String number); + } + + /** + * Input: the ISO 3166-1 two letters country code of the country the user is in + * + *

Output: PhoneNumberFormattingTextWatcher. Note: It is unusual to return a non-data value + * from a worker, but it is a limitation in libphonenumber API that the watcher cannot be + * initialized on the main thread. + */ + private static class InitPhoneNumberFormattingTextWatcherWorker + implements Worker { + + @Nullable + @Override + public PhoneNumberFormattingTextWatcher doInBackground(@Nullable String countryCode) { + return new PhoneNumberFormattingTextWatcher(countryCode); + } + } +} diff --git a/java/com/android/dialer/dialpadview/DialpadView.java b/java/com/android/dialer/dialpadview/DialpadView.java index 4a9b500b7..0c53273a4 100644 --- a/java/com/android/dialer/dialpadview/DialpadView.java +++ b/java/com/android/dialer/dialpadview/DialpadView.java @@ -29,7 +29,6 @@ import android.text.Spannable; import android.text.TextUtils; import android.text.style.TtsSpan; import android.util.AttributeSet; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -40,6 +39,8 @@ import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import com.android.dialer.animation.AnimUtils; +import com.android.dialer.common.LogUtil; +import com.android.dialer.compat.CompatUtils; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; @@ -153,7 +154,7 @@ public class DialpadView extends LinearLayout { // We translate dialpad numbers only for "fa" and not any other locale // ("ar" anybody ?). if ("fa".equals(currentLocale.getLanguage())) { - nf = DecimalFormat.getInstance(resources.getConfiguration().locale); + nf = DecimalFormat.getInstance(CompatUtils.getLocale(getContext())); } else { nf = DecimalFormat.getInstance(Locale.ENGLISH); } @@ -395,7 +396,7 @@ public class DialpadView extends LinearLayout { } } - Log.wtf(TAG, "Attempted to get animation delay for invalid key button id."); + LogUtil.e(TAG, "Attempted to get animation delay for invalid key button id."); return 0; } @@ -458,7 +459,7 @@ public class DialpadView extends LinearLayout { } } - Log.wtf(TAG, "Attempted to get animation duration for invalid key button id."); + LogUtil.e(TAG, "Attempted to get animation duration for invalid key button id."); return 0; } } diff --git a/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java b/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java new file mode 100644 index 000000000..16bdd24c1 --- /dev/null +++ b/java/com/android/dialer/dialpadview/PseudoEmergencyAnimator.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.dialpadview; + +import android.animation.Animator; +import android.animation.Animator.AnimatorListener; +import android.animation.ArgbEvaluator; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.LightingColorFilter; +import android.os.Handler; +import android.os.Vibrator; +import android.view.View; + +/** Animates the dial button on "emergency" phone numbers. */ +public class PseudoEmergencyAnimator { + + static final String PSEUDO_EMERGENCY_NUMBER = "01189998819991197253"; + private static final int VIBRATE_LENGTH_MILLIS = 200; + private static final int ITERATION_LENGTH_MILLIS = 1000; + private static final int ANIMATION_ITERATION_COUNT = 6; + private ViewProvider mViewProvider; + private ValueAnimator mPseudoEmergencyColorAnimator; + + PseudoEmergencyAnimator(ViewProvider viewProvider) { + mViewProvider = viewProvider; + } + + public void destroy() { + end(); + mViewProvider = null; + } + + public void start() { + if (mPseudoEmergencyColorAnimator == null) { + Integer colorFrom = Color.BLUE; + Integer colorTo = Color.RED; + mPseudoEmergencyColorAnimator = + ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); + + mPseudoEmergencyColorAnimator.addUpdateListener( + animator -> { + try { + int color = (int) animator.getAnimatedValue(); + ColorFilter colorFilter = new LightingColorFilter(Color.BLACK, color); + + if (mViewProvider.getFab() != null) { + mViewProvider.getFab().getBackground().setColorFilter(colorFilter); + } + } catch (Exception e) { + animator.cancel(); + } + }); + + mPseudoEmergencyColorAnimator.addListener( + new AnimatorListener() { + @Override + public void onAnimationCancel(Animator animation) {} + + @Override + public void onAnimationRepeat(Animator animation) { + try { + vibrate(VIBRATE_LENGTH_MILLIS); + } catch (Exception e) { + animation.cancel(); + } + } + + @Override + public void onAnimationStart(Animator animation) {} + + @Override + public void onAnimationEnd(Animator animation) { + try { + if (mViewProvider.getFab() != null) { + mViewProvider.getFab().getBackground().clearColorFilter(); + } + + new Handler() + .postDelayed( + () -> { + try { + vibrate(VIBRATE_LENGTH_MILLIS); + } catch (Exception e) { + // ignored + } + }, + ITERATION_LENGTH_MILLIS); + } catch (Exception e) { + animation.cancel(); + } + } + }); + + mPseudoEmergencyColorAnimator.setDuration(VIBRATE_LENGTH_MILLIS); + mPseudoEmergencyColorAnimator.setRepeatMode(ValueAnimator.REVERSE); + mPseudoEmergencyColorAnimator.setRepeatCount(ANIMATION_ITERATION_COUNT); + } + if (!mPseudoEmergencyColorAnimator.isStarted()) { + mPseudoEmergencyColorAnimator.start(); + } + } + + public void end() { + if (mPseudoEmergencyColorAnimator != null && mPseudoEmergencyColorAnimator.isStarted()) { + mPseudoEmergencyColorAnimator.end(); + } + } + + private void vibrate(long milliseconds) { + Context context = mViewProvider.getContext(); + if (context != null) { + Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + if (vibrator != null) { + vibrator.vibrate(milliseconds); + } + } + } + + interface ViewProvider { + + View getFab(); + + Context getContext(); + } +} diff --git a/java/com/android/dialer/dialpadview/SmartDialCursorLoader.java b/java/com/android/dialer/dialpadview/SmartDialCursorLoader.java new file mode 100644 index 000000000..271535fce --- /dev/null +++ b/java/com/android/dialer/dialpadview/SmartDialCursorLoader.java @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.dialpadview; + +import android.content.AsyncTaskLoader; +import android.content.Context; +import android.database.Cursor; +import android.database.MatrixCursor; +import com.android.contacts.common.list.PhoneNumberListAdapter.PhoneQuery; +import com.android.dialer.common.LogUtil; +import com.android.dialer.database.Database; +import com.android.dialer.database.DialerDatabaseHelper; +import com.android.dialer.database.DialerDatabaseHelper.ContactNumber; +import com.android.dialer.smartdial.SmartDialNameMatcher; +import com.android.dialer.smartdial.SmartDialPrefix; +import com.android.dialer.util.PermissionsUtil; +import java.util.ArrayList; + +/** Implements a Loader class to asynchronously load SmartDial search results. */ +public class SmartDialCursorLoader extends AsyncTaskLoader { + + private static final String TAG = "SmartDialCursorLoader"; + private static final boolean DEBUG = false; + + private final Context mContext; + + private Cursor mCursor; + + private String mQuery; + private SmartDialNameMatcher mNameMatcher; + + private boolean mShowEmptyListForNullQuery = true; + + public SmartDialCursorLoader(Context context) { + super(context); + mContext = context; + } + + /** + * Configures the query string to be used to find SmartDial matches. + * + * @param query The query string user typed. + */ + public void configureQuery(String query) { + if (DEBUG) { + LogUtil.v(TAG, "Configure new query to be " + query); + } + mQuery = SmartDialNameMatcher.normalizeNumber(query, SmartDialPrefix.getMap()); + + /** Constructs a name matcher object for matching names. */ + mNameMatcher = new SmartDialNameMatcher(mQuery, SmartDialPrefix.getMap()); + mNameMatcher.setShouldMatchEmptyQuery(!mShowEmptyListForNullQuery); + } + + /** + * Queries the SmartDial database and loads results in background. + * + * @return Cursor of contacts that matches the SmartDial query. + */ + @Override + public Cursor loadInBackground() { + if (DEBUG) { + LogUtil.v(TAG, "Load in background " + mQuery); + } + + if (!PermissionsUtil.hasContactsReadPermissions(mContext)) { + return new MatrixCursor(PhoneQuery.PROJECTION_PRIMARY); + } + + /** Loads results from the database helper. */ + final DialerDatabaseHelper dialerDatabaseHelper = + Database.get(mContext).getDatabaseHelper(mContext); + final ArrayList allMatches = + dialerDatabaseHelper.getLooseMatches(mQuery, mNameMatcher); + + if (DEBUG) { + LogUtil.v(TAG, "Loaded matches " + allMatches.size()); + } + + /** Constructs a cursor for the returned array of results. */ + final MatrixCursor cursor = new MatrixCursor(PhoneQuery.PROJECTION_PRIMARY); + Object[] row = new Object[PhoneQuery.PROJECTION_PRIMARY.length]; + for (ContactNumber contact : allMatches) { + row[PhoneQuery.PHONE_ID] = contact.dataId; + row[PhoneQuery.PHONE_NUMBER] = contact.phoneNumber; + row[PhoneQuery.CONTACT_ID] = contact.id; + row[PhoneQuery.LOOKUP_KEY] = contact.lookupKey; + row[PhoneQuery.PHOTO_ID] = contact.photoId; + row[PhoneQuery.DISPLAY_NAME] = contact.displayName; + row[PhoneQuery.CARRIER_PRESENCE] = contact.carrierPresence; + cursor.addRow(row); + } + return cursor; + } + + @Override + public void deliverResult(Cursor cursor) { + if (isReset()) { + /** The Loader has been reset; ignore the result and invalidate the data. */ + releaseResources(cursor); + return; + } + + /** Hold a reference to the old data so it doesn't get garbage collected. */ + Cursor oldCursor = mCursor; + mCursor = cursor; + + if (isStarted()) { + /** If the Loader is in a started state, deliver the results to the client. */ + super.deliverResult(cursor); + } + + /** Invalidate the old data as we don't need it any more. */ + if (oldCursor != null && oldCursor != cursor) { + releaseResources(oldCursor); + } + } + + @Override + protected void onStartLoading() { + if (mCursor != null) { + /** Deliver any previously loaded data immediately. */ + deliverResult(mCursor); + } + if (mCursor == null) { + /** Force loads every time as our results change with queries. */ + forceLoad(); + } + } + + @Override + protected void onStopLoading() { + /** The Loader is in a stopped state, so we should attempt to cancel the current load. */ + cancelLoad(); + } + + @Override + protected void onReset() { + /** Ensure the loader has been stopped. */ + onStopLoading(); + + /** Release all previously saved query results. */ + if (mCursor != null) { + releaseResources(mCursor); + mCursor = null; + } + } + + @Override + public void onCanceled(Cursor cursor) { + super.onCanceled(cursor); + + /** The load has been canceled, so we should release the resources associated with 'data'. */ + releaseResources(cursor); + } + + private void releaseResources(Cursor cursor) { + if (cursor != null) { + cursor.close(); + } + } + + public void setShowEmptyListForNullQuery(boolean show) { + mShowEmptyListForNullQuery = show; + if (mNameMatcher != null) { + mNameMatcher.setShouldMatchEmptyQuery(!show); + } + } +} diff --git a/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java new file mode 100644 index 000000000..7ff0d084a --- /dev/null +++ b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java @@ -0,0 +1,497 @@ +/* + * 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.dialer.dialpadview; + +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.DialogFragment; +import android.app.KeyguardManager; +import android.app.ProgressDialog; +import android.content.ActivityNotFoundException; +import android.content.ContentResolver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.provider.Settings; +import android.support.annotation.Nullable; +import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; +import android.telephony.PhoneNumberUtils; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.Toast; +import com.android.common.io.MoreCloseables; +import com.android.contacts.common.database.NoNullCursorAsyncQueryHandler; +import com.android.contacts.common.util.ContactDisplayUtils; +import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment; +import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment.SelectPhoneAccountListener; +import com.android.dialer.calllogutils.PhoneAccountUtils; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.compat.telephony.TelephonyManagerCompat; +import com.android.dialer.oem.MotorolaUtils; +import com.android.dialer.telecom.TelecomUtil; +import com.android.dialer.util.PermissionsUtil; +import java.util.ArrayList; +import java.util.List; + +/** + * Helper class to listen for some magic character sequences that are handled specially by the + * dialer. + * + *

Note the Phone app also handles these sequences too (in a couple of relatively obscure places + * in the UI), so there's a separate version of this class under apps/Phone. + * + *

TODO: there's lots of duplicated code between this class and the corresponding class under + * apps/Phone. 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 = "SpecialCharSequenceMgr"; + + private static final String TAG_SELECT_ACCT_FRAGMENT = "tag_select_acct_fragment"; + + private static final String MMI_IMEI_DISPLAY = "*#06#"; + private static final String MMI_REGULATORY_INFO_DISPLAY = "*#07#"; + /** ***** This code is used to handle SIM Contact queries ***** */ + private static final String ADN_PHONE_NUMBER_COLUMN_NAME = "number"; + + private static final String ADN_NAME_COLUMN_NAME = "name"; + private static final int ADN_QUERY_TOKEN = -1; + /** + * Remembers the previous {@link QueryHandler} and cancel the operation when needed, to prevent + * possible crash. + * + *

QueryHandler may call {@link ProgressDialog#dismiss()} when the screen is already gone, + * which will cause the app crash. This variable enables the class to prevent the crash on {@link + * #cleanup()}. + * + *

TODO: Remove this and replace it (and {@link #cleanup()}) with better implementation. One + * complication is that we have SpecialCharSequenceMgr in Phone package too, which has *slightly* + * different implementation. Note that Phone package doesn't have this problem, so the class on + * Phone side doesn't have this functionality. Fundamental fix would be to have one shared + * implementation and resolve this corner case more gracefully. + */ + private static QueryHandler sPreviousAdnQueryHandler; + + /** This class is never instantiated. */ + private SpecialCharSequenceMgr() {} + + public static boolean handleChars(Context context, String input, EditText textField) { + // get rid of the separators so that the string gets parsed correctly + String dialString = PhoneNumberUtils.stripSeparators(input); + + if (handleDeviceIdDisplay(context, dialString) + || handleRegulatoryInfoDisplay(context, dialString) + || handlePinEntry(context, dialString) + || handleAdnEntry(context, dialString, textField) + || handleSecretCode(context, dialString)) { + return true; + } + + if (MotorolaUtils.handleSpecialCharSequence(context, input)) { + return true; + } + + return false; + } + + /** + * Cleanup everything around this class. Must be run inside the main thread. + * + *

This should be called when the screen becomes background. + */ + public static void cleanup() { + Assert.isMainThread(); + + if (sPreviousAdnQueryHandler != null) { + sPreviousAdnQueryHandler.cancel(); + sPreviousAdnQueryHandler = null; + } + } + + /** + * Handles secret codes to launch arbitrary activities in the form of *#*##*#*. + * + * @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 and handled + */ + static boolean handleSecretCode(Context context, String input) { + // Secret codes are accessed by dialing *#*##*#* + + int len = input.length(); + if (len <= 8 || !input.startsWith("*#*#") || !input.endsWith("#*#*")) { + return false; + } + String secretCode = input.substring(4, len - 4); + TelephonyManagerCompat.handleSecretCode(context, secretCode); + return true; + } + + /** + * Handle ADN requests by filling in the SIM contact number into the requested EditText. + * + *

This code works alongside the Asynchronous query handler {@link QueryHandler} and query + * cancel handler implemented in {@link SimContactQueryCookie}. + */ + static boolean handleAdnEntry(Context context, String input, EditText textField) { + /* ADN entries are of the form "N(N)(N)#" */ + TelephonyManager telephonyManager = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + if (telephonyManager == null + || telephonyManager.getPhoneType() != TelephonyManager.PHONE_TYPE_GSM) { + return false; + } + + // 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. + KeyguardManager keyguardManager = + (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); + if (keyguardManager.inKeyguardRestrictedInputMode()) { + return false; + } + + int len = input.length(); + if ((len > 1) && (len < 5) && (input.endsWith("#"))) { + try { + // get the ordinal number of the sim contact + final int index = Integer.parseInt(input.substring(0, len - 1)); + + // The original code that navigated to a SIM Contacts list view did not + // highlight the requested contact correctly, a requirement for PTCRB + // certification. This behaviour is consistent with the UI paradigm + // for touch-enabled lists, so it does not make sense to try to work + // around it. Instead we fill in the the requested phone number into + // the dialer text field. + + // create the async query handler + final QueryHandler handler = new QueryHandler(context.getContentResolver()); + + // create the cookie object + final SimContactQueryCookie sc = + new SimContactQueryCookie(index - 1, handler, ADN_QUERY_TOKEN); + + // setup the cookie fields + sc.contactNum = index - 1; + sc.setTextField(textField); + + // create the progress dialog + sc.progressDialog = new ProgressDialog(context); + sc.progressDialog.setTitle(R.string.simContacts_title); + sc.progressDialog.setMessage(context.getText(R.string.simContacts_emptyLoading)); + sc.progressDialog.setIndeterminate(true); + sc.progressDialog.setCancelable(true); + sc.progressDialog.setOnCancelListener(sc); + sc.progressDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND); + + List subscriptionAccountHandles = + PhoneAccountUtils.getSubscriptionPhoneAccounts(context); + Context applicationContext = context.getApplicationContext(); + boolean hasUserSelectedDefault = + subscriptionAccountHandles.contains( + TelecomUtil.getDefaultOutgoingPhoneAccount( + applicationContext, PhoneAccount.SCHEME_TEL)); + + if (subscriptionAccountHandles.size() <= 1 || hasUserSelectedDefault) { + Uri uri = TelecomUtil.getAdnUriForPhoneAccount(applicationContext, null); + handleAdnQuery(handler, sc, uri); + } else { + SelectPhoneAccountListener callback = + new HandleAdnEntryAccountSelectedCallback(applicationContext, handler, sc); + + DialogFragment dialogFragment = + SelectPhoneAccountDialogFragment.newInstance( + subscriptionAccountHandles, callback, null); + dialogFragment.show(((Activity) context).getFragmentManager(), TAG_SELECT_ACCT_FRAGMENT); + } + + return true; + } catch (NumberFormatException ex) { + // Ignore + } + } + return false; + } + + private static void handleAdnQuery(QueryHandler handler, SimContactQueryCookie cookie, Uri uri) { + if (handler == null || cookie == null || uri == null) { + LogUtil.w("SpecialCharSequenceMgr.handleAdnQuery", "queryAdn parameters incorrect"); + return; + } + + // display the progress dialog + cookie.progressDialog.show(); + + // run the query. + handler.startQuery( + ADN_QUERY_TOKEN, + cookie, + uri, + new String[] {ADN_PHONE_NUMBER_COLUMN_NAME}, + null, + null, + null); + + if (sPreviousAdnQueryHandler != null) { + // It is harmless to call cancel() even after the handler's gone. + sPreviousAdnQueryHandler.cancel(); + } + sPreviousAdnQueryHandler = handler; + } + + static boolean handlePinEntry(final Context context, final String input) { + if ((input.startsWith("**04") || input.startsWith("**05")) && input.endsWith("#")) { + List subscriptionAccountHandles = + PhoneAccountUtils.getSubscriptionPhoneAccounts(context); + boolean hasUserSelectedDefault = + subscriptionAccountHandles.contains( + TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_TEL)); + + if (subscriptionAccountHandles.size() <= 1 || hasUserSelectedDefault) { + // Don't bring up the dialog for single-SIM or if the default outgoing account is + // a subscription account. + return TelecomUtil.handleMmi(context, input, null); + } else { + SelectPhoneAccountListener listener = new HandleMmiAccountSelectedCallback(context, input); + + DialogFragment dialogFragment = + SelectPhoneAccountDialogFragment.newInstance( + subscriptionAccountHandles, listener, null); + dialogFragment.show(((Activity) context).getFragmentManager(), TAG_SELECT_ACCT_FRAGMENT); + } + return true; + } + return false; + } + + // TODO: Use TelephonyCapabilities.getDeviceIdLabel() to get the device id label instead of a + // hard-coded string. + static boolean handleDeviceIdDisplay(Context context, String input) { + if (!PermissionsUtil.hasPermission(context, Manifest.permission.READ_PHONE_STATE)) { + return false; + } + TelephonyManager telephonyManager = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + + if (telephonyManager != null && input.equals(MMI_IMEI_DISPLAY)) { + int labelResId = + (telephonyManager.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) + ? R.string.imei + : R.string.meid; + + List deviceIds = new ArrayList(); + if (TelephonyManagerCompat.getPhoneCount(telephonyManager) > 1) { + for (int slot = 0; slot < telephonyManager.getPhoneCount(); slot++) { + String deviceId = telephonyManager.getDeviceId(slot); + if (!TextUtils.isEmpty(deviceId)) { + deviceIds.add(deviceId); + } + } + } else { + deviceIds.add(telephonyManager.getDeviceId()); + } + + new AlertDialog.Builder(context) + .setTitle(labelResId) + .setItems(deviceIds.toArray(new String[deviceIds.size()]), null) + .setPositiveButton(android.R.string.ok, null) + .setCancelable(false) + .show(); + return true; + } + return false; + } + + private static boolean handleRegulatoryInfoDisplay(Context context, String input) { + if (input.equals(MMI_REGULATORY_INFO_DISPLAY)) { + LogUtil.i( + "SpecialCharSequenceMgr.handleRegulatoryInfoDisplay", "sending intent to settings app"); + Intent showRegInfoIntent = new Intent(Settings.ACTION_SHOW_REGULATORY_INFO); + try { + context.startActivity(showRegInfoIntent); + } catch (ActivityNotFoundException e) { + LogUtil.e( + "SpecialCharSequenceMgr.handleRegulatoryInfoDisplay", "startActivity() failed: ", e); + } + return true; + } + return false; + } + + public static class HandleAdnEntryAccountSelectedCallback extends SelectPhoneAccountListener { + + private final Context mContext; + private final QueryHandler mQueryHandler; + private final SimContactQueryCookie mCookie; + + public HandleAdnEntryAccountSelectedCallback( + Context context, QueryHandler queryHandler, SimContactQueryCookie cookie) { + mContext = context; + mQueryHandler = queryHandler; + mCookie = cookie; + } + + @Override + public void onPhoneAccountSelected( + PhoneAccountHandle selectedAccountHandle, boolean setDefault, @Nullable String callId) { + Uri uri = TelecomUtil.getAdnUriForPhoneAccount(mContext, selectedAccountHandle); + handleAdnQuery(mQueryHandler, mCookie, uri); + // TODO: Show error dialog if result isn't valid. + } + } + + public static class HandleMmiAccountSelectedCallback extends SelectPhoneAccountListener { + + private final Context mContext; + private final String mInput; + + public HandleMmiAccountSelectedCallback(Context context, String input) { + mContext = context.getApplicationContext(); + mInput = input; + } + + @Override + public void onPhoneAccountSelected( + PhoneAccountHandle selectedAccountHandle, boolean setDefault, @Nullable String callId) { + TelecomUtil.handleMmi(mContext, mInput, selectedAccountHandle); + } + } + + /** + * Cookie object that contains everything we need to communicate to the handler's onQuery + * Complete, as well as what we need in order to cancel the query (if requested). + * + *

Note, access to the textField field is going to be synchronized, because the user can + * request a cancel at any time through the UI. + */ + private static class SimContactQueryCookie implements DialogInterface.OnCancelListener { + + public ProgressDialog progressDialog; + public int contactNum; + + // Used to identify the query request. + private int mToken; + private QueryHandler mHandler; + + // The text field we're going to update + private EditText textField; + + public SimContactQueryCookie(int number, QueryHandler handler, int token) { + contactNum = number; + mHandler = handler; + mToken = token; + } + + /** Synchronized getter for the EditText. */ + public synchronized EditText getTextField() { + return textField; + } + + /** Synchronized setter for the EditText. */ + public synchronized void setTextField(EditText text) { + textField = text; + } + + /** + * Cancel the ADN query by stopping the operation and signaling the cookie that a cancel request + * is made. + */ + @Override + public synchronized void onCancel(DialogInterface dialog) { + // close the progress dialog + if (progressDialog != null) { + progressDialog.dismiss(); + } + + // setting the textfield to null ensures that the UI does NOT get + // updated. + textField = null; + + // Cancel the operation if possible. + mHandler.cancelOperation(mToken); + } + } + + /** + * Asynchronous query handler that services requests to look up ADNs + * + *

Queries originate from {@link #handleAdnEntry}. + */ + private static class QueryHandler extends NoNullCursorAsyncQueryHandler { + + private boolean mCanceled; + + public QueryHandler(ContentResolver cr) { + super(cr); + } + + /** Override basic onQueryComplete to fill in the textfield when we're handed the ADN cursor. */ + @Override + protected void onNotNullableQueryComplete(int token, Object cookie, Cursor c) { + try { + sPreviousAdnQueryHandler = null; + if (mCanceled) { + return; + } + + SimContactQueryCookie sc = (SimContactQueryCookie) cookie; + + // close the progress dialog. + sc.progressDialog.dismiss(); + + // get the EditText to update or see if the request was cancelled. + EditText text = sc.getTextField(); + + // if the TextView is valid, and the cursor is valid and positionable on the + // Nth number, then we update the text field and display a toast indicating the + // caller name. + if ((c != null) && (text != null) && (c.moveToPosition(sc.contactNum))) { + String name = c.getString(c.getColumnIndexOrThrow(ADN_NAME_COLUMN_NAME)); + String number = c.getString(c.getColumnIndexOrThrow(ADN_PHONE_NUMBER_COLUMN_NAME)); + + // fill the text in. + text.getText().replace(0, 0, number); + + // display the name as a toast + Context context = sc.progressDialog.getContext(); + CharSequence msg = + ContactDisplayUtils.getTtsSpannedPhoneNumber( + context.getResources(), R.string.menu_callNumber, name); + Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); + } + } finally { + MoreCloseables.closeQuietly(c); + } + } + + public void cancel() { + mCanceled = true; + // Ask AsyncQueryHandler to cancel the whole request. This will fail when the query is + // already started. + cancelOperation(ADN_QUERY_TOKEN); + } + } +} diff --git a/java/com/android/dialer/dialpadview/UnicodeDialerKeyListener.java b/java/com/android/dialer/dialpadview/UnicodeDialerKeyListener.java new file mode 100644 index 000000000..e9201c0c2 --- /dev/null +++ b/java/com/android/dialer/dialpadview/UnicodeDialerKeyListener.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.dialpadview; + +import android.telephony.PhoneNumberUtils; +import android.text.Spanned; +import android.text.method.DialerKeyListener; + +/** + * {@link DialerKeyListener} with Unicode support. Converts any Unicode(e.g. Arabic) characters that + * represent digits into digits before filtering the results so that we can support pasted digits + * from Unicode languages. + */ +public class UnicodeDialerKeyListener extends DialerKeyListener { + + public static final UnicodeDialerKeyListener INSTANCE = new UnicodeDialerKeyListener(); + + @Override + public CharSequence filter( + CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + final String converted = + PhoneNumberUtils.convertKeypadLettersToDigits( + PhoneNumberUtils.replaceUnicodeDigits(source.toString())); + // PhoneNumberUtils.replaceUnicodeDigits performs a character for character replacement, + // so we can assume that start and end positions should remain unchanged. + CharSequence result = super.filter(converted, start, end, dest, dstart, dend); + if (result == null) { + if (source.equals(converted)) { + // There was no conversion or filtering performed. Just return null according to + // the behavior of DialerKeyListener. + return null; + } else { + // filter returns null if the charsequence is to be returned unchanged/unfiltered. + // But in this case we do want to return a modified character string (even if + // none of the characters in the modified string are filtered). So if + // result == null we return the unfiltered but converted numeric string instead. + return converted.subSequence(start, end); + } + } + return result; + } +} diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_close_black_24dp.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_close_black_24dp.png deleted file mode 100644 index 1a9cd75a0..000000000 Binary files a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_close_black_24dp.png and /dev/null differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_add_call.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_add_call.png new file mode 100755 index 000000000..4e0d5649e Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_add_call.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_current_call.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_current_call.png new file mode 100755 index 000000000..2cf41d598 Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_current_call.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png new file mode 100755 index 000000000..043685fd9 Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_delete.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_delete.png deleted file mode 100644 index e588d90e9..000000000 Binary files a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_delete.png and /dev/null differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_voicemail.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_voicemail.png deleted file mode 100644 index 4706112d6..000000000 Binary files a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_voicemail.png and /dev/null differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_overflow_menu.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_overflow_menu.png deleted file mode 100644 index 262e9df91..000000000 Binary files a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_overflow_menu.png and /dev/null differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_add_call.png b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_add_call.png new file mode 100644 index 000000000..56ac2a33a Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_add_call.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_current_call.png b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_current_call.png new file mode 100644 index 000000000..16a44a078 Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_current_call.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_tt_keypad.png b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_tt_keypad.png new file mode 100644 index 000000000..66df69eac Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialer_fork_tt_keypad.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_add_call.png b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_add_call.png new file mode 100644 index 000000000..aff140fcd Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_add_call.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_current_call.png b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_current_call.png new file mode 100644 index 000000000..8975727e0 Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_current_call.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_tt_keypad.png b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_tt_keypad.png new file mode 100644 index 000000000..4d48ea9ea Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialer_fork_tt_keypad.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_add_call.png b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_add_call.png new file mode 100644 index 000000000..1657da4e2 Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_add_call.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_current_call.png b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_current_call.png new file mode 100644 index 000000000..f25cce695 Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_current_call.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_tt_keypad.png b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_tt_keypad.png new file mode 100644 index 000000000..7ac4d8b58 Binary files /dev/null and b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialer_fork_tt_keypad.png differ diff --git a/java/com/android/dialer/dialpadview/res/drawable/dialpad_scrim.xml b/java/com/android/dialer/dialpadview/res/drawable/dialpad_scrim.xml deleted file mode 100644 index ee0f40ab5..000000000 --- a/java/com/android/dialer/dialpadview/res/drawable/dialpad_scrim.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/java/com/android/dialer/dialpadview/res/drawable/ic_wifi_calling.xml b/java/com/android/dialer/dialpadview/res/drawable/ic_wifi_calling.xml new file mode 100644 index 000000000..968713376 --- /dev/null +++ b/java/com/android/dialer/dialpadview/res/drawable/ic_wifi_calling.xml @@ -0,0 +1,29 @@ + + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/dialpadview/res/drawable/shadow_fade_left.xml b/java/com/android/dialer/dialpadview/res/drawable/shadow_fade_left.xml new file mode 100644 index 000000000..6271a8f86 --- /dev/null +++ b/java/com/android/dialer/dialpadview/res/drawable/shadow_fade_left.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/java/com/android/dialer/dialpadview/res/drawable/shadow_fade_up.xml b/java/com/android/dialer/dialpadview/res/drawable/shadow_fade_up.xml new file mode 100644 index 000000000..86d37a9bc --- /dev/null +++ b/java/com/android/dialer/dialpadview/res/drawable/shadow_fade_up.xml @@ -0,0 +1,24 @@ + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/dialpadview/res/layout-land/dialpad_fragment.xml b/java/com/android/dialer/dialpadview/res/layout-land/dialpad_fragment.xml new file mode 100644 index 000000000..6389853d9 --- /dev/null +++ b/java/com/android/dialer/dialpadview/res/layout-land/dialpad_fragment.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com/android/dialer/dialpadview/res/layout-land/dialpad_key_one.xml b/java/com/android/dialer/dialpadview/res/layout-land/dialpad_key_one.xml index 6f178f0e1..135624681 100644 --- a/java/com/android/dialer/dialpadview/res/layout-land/dialpad_key_one.xml +++ b/java/com/android/dialer/dialpadview/res/layout-land/dialpad_key_one.xml @@ -35,7 +35,7 @@ diff --git a/java/com/android/dialer/dialpadview/res/layout/dialpad_chooser_list_item.xml b/java/com/android/dialer/dialpadview/res/layout/dialpad_chooser_list_item.xml new file mode 100644 index 000000000..e00529614 --- /dev/null +++ b/java/com/android/dialer/dialpadview/res/layout/dialpad_chooser_list_item.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + diff --git a/java/com/android/dialer/dialpadview/res/layout/dialpad_fragment.xml b/java/com/android/dialer/dialpadview/res/layout/dialpad_fragment.xml new file mode 100644 index 000000000..2f62e1407 --- /dev/null +++ b/java/com/android/dialer/dialpadview/res/layout/dialpad_fragment.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com/android/dialer/dialpadview/res/layout/dialpad_key_one.xml b/java/com/android/dialer/dialpadview/res/layout/dialpad_key_one.xml index 88594401f..4401c5bbd 100644 --- a/java/com/android/dialer/dialpadview/res/layout/dialpad_key_one.xml +++ b/java/com/android/dialer/dialpadview/res/layout/dialpad_key_one.xml @@ -18,7 +18,8 @@ android:id="@+id/one" style="@style/DialpadKeyButtonStyle"> + android:layout_marginTop="1dp" + style="@style/DialpadKeyInternalLayoutStyle"> @@ -28,9 +29,8 @@ diff --git a/java/com/android/dialer/dialpadview/res/layout/dialpad_view_unthemed.xml b/java/com/android/dialer/dialpadview/res/layout/dialpad_view_unthemed.xml index 838f1eca5..13c11f1ce 100644 --- a/java/com/android/dialer/dialpadview/res/layout/dialpad_view_unthemed.xml +++ b/java/com/android/dialer/dialpadview/res/layout/dialpad_view_unthemed.xml @@ -14,141 +14,142 @@ limitations under the License. --> + android:id="@+id/dialpad_view" + class="com.android.dialer.dialpadview.DialpadView" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="bottom" + android:background="?attr/dialpad_background" + android:clickable="true" + android:elevation="?attr/dialpad_elevation" + android:layoutDirection="ltr" + android:orientation="vertical"> + android:id="@+id/rate_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:visibility="gone"> + android:id="@+id/ild_container" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/ild_margin_height" + android:layout_marginBottom="@dimen/ild_margin_height" + android:layout_gravity="center_horizontal" + android:orientation="horizontal"> + android:id="@+id/ild_country" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + android:id="@+id/ild_rate" + android:textStyle="bold" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="4dp"/> + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="#e3e3e3"/> + android:id="@+id/digits_container" + android:layout_width="match_parent" + android:layout_height="?attr/dialpad_digits_adjustable_height" + android:orientation="horizontal"> + android:id="@+id/dialpad_back" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_margin="@dimen/dialpad_overflow_margin" + android:paddingLeft="@dimen/dialpad_digits_menu_left_padding" + android:paddingRight="@dimen/dialpad_digits_menu_right_padding" + android:background="@drawable/btn_dialpad_key" + android:contentDescription="@string/description_dialpad_back" + android:gravity="center" + android:src="@drawable/quantum_ic_close_white_24" + android:tint="?attr/dialpad_icon_tint" + android:tintMode="src_in" + android:visibility="gone"/> + android:id="@+id/dialpad_overflow" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_margin="@dimen/dialpad_overflow_margin" + android:paddingLeft="@dimen/dialpad_digits_menu_left_padding" + android:paddingRight="@dimen/dialpad_digits_menu_right_padding" + android:background="@drawable/btn_dialpad_key" + android:contentDescription="@string/description_dialpad_overflow" + android:gravity="center" + android:src="@drawable/quantum_ic_more_vert_white_24" + android:tint="?attr/dialpad_icon_tint" + android:tintMode="src_in" + android:visibility="gone"/> + android:id="@+id/digits" + class="com.android.dialer.dialpadview.DigitsEditText" + android:textStyle="normal" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + android:background="@android:color/transparent" + android:cursorVisible="false" + android:focusableInTouchMode="true" + android:fontFamily="sans-serif" + android:freezesText="true" + android:gravity="center" + android:importantForAutofill="no" + android:maxLines="1" + android:scrollHorizontally="true" + android:singleLine="true" + android:textColor="?attr/dialpad_text_color" + android:textCursorDrawable="@null" + android:textSize="?attr/dialpad_digits_adjustable_text_size" + ex:resizing_text_min_size="@dimen/dialpad_digits_text_min_size"/> + android:id="@+id/deleteButton" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:paddingLeft="@dimen/dialpad_digits_padding" + android:paddingRight="@dimen/dialpad_digits_padding" + android:background="@drawable/btn_dialpad_key" + android:contentDescription="@string/description_delete_button" + android:src="@drawable/quantum_ic_backspace_white_24" + android:state_enabled="false" + android:tint="?attr/dialpad_icon_tint" + android:tintMode="src_in"/> + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="#e3e3e3"/> + android:layout_width="match_parent" + android:layout_height="@dimen/dialpad_space_above_keys"/> + android:layout_width="match_parent" + android:layout_height="@dimen/dialpad_space_below_keys"/> diff --git a/java/com/android/dialer/dialpadview/res/menu/dialpad_options.xml b/java/com/android/dialer/dialpadview/res/menu/dialpad_options.xml new file mode 100644 index 000000000..2921ea3bb --- /dev/null +++ b/java/com/android/dialer/dialpadview/res/menu/dialpad_options.xml @@ -0,0 +1,30 @@ + + +

+ + + + + diff --git a/java/com/android/dialer/dialpadview/res/values-af/strings.xml b/java/com/android/dialer/dialpadview/res/values-af/strings.xml index b2d03a07f..c5c72e094 100644 --- a/java/com/android/dialer/dialpadview/res/values-af/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-af/strings.xml @@ -22,4 +22,18 @@ "backspace" "plus" "stemboodskap" + "bel" + "Om stemboodskapdiens te bel, skakel eers vliegtuigmodus af." + "Om stemboodskapdiens op te stel, gaan na Kieslys > Instellings." + "Voeg 2-sek.-pouse by" + "Voeg wagtyd by" + "Gebruik raak-nommerbord" + "Keer terug na oproep wat besig is" + "Voeg oproep by" + "IMEI" + "MEID" + "Laai tans van SIM-kaart af …" + "SIM-kaartkontakte" + "Bel %s" + "Kan nie hierdie nommer bel nie"
diff --git a/java/com/android/dialer/dialpadview/res/values-am/strings.xml b/java/com/android/dialer/dialpadview/res/values-am/strings.xml index 04f6022d8..efbdb1de9 100644 --- a/java/com/android/dialer/dialpadview/res/values-am/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-am/strings.xml @@ -22,4 +22,18 @@ "የኋሊት ደምሳሽ" "የመደመር ምልክት" "የድምፅ መልዕክት" + "ይደውሉ" + "የድምጽ መልዕክት ጥሪ ለማድረግ፣ በመጀመሪያ የአውሮፕላን ሁነታን ያጥፉ።" + "የድምጽ መልዕክትን ለማዘጋጀት፣ ወደ ምናሌ > ቅንብሮች ይሂዱ።" + "2 ሴኮንድ ፋታ አክል" + "ቆይታ አክል" + "ባለድምጽ የንኪ ቁልፍ ሰሌዳን ይጠቀሙ" + "በመካሄድ ላይ ወዳለው ጥሪ ተመለስ" + "ጥሪ አክል" + "IMEI" + "MEID" + "ከSIM ካርድ ላይ በመጫን ላይ…" + "የSIM ካርድ ዕውቂያዎች" + "ወደ %s ደውል" + "ይህን ቁጥር መደወል አልተቻለም"
diff --git a/java/com/android/dialer/dialpadview/res/values-ar/strings.xml b/java/com/android/dialer/dialpadview/res/values-ar/strings.xml index 9caea157e..649280a99 100644 --- a/java/com/android/dialer/dialpadview/res/values-ar/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ar/strings.xml @@ -22,4 +22,18 @@ "مسافة للخلف" "علامة الجمع" "بريد صوتي" + "طلب" + "للاتصال بالبريد الصوتي، يجب أولاً إيقاف وضع الطائرة." + "لإعداد البريد الصوتي، انتقل إلى القائمة > الإعدادات." + "إضافة ثانيتين إيقاف مؤقت" + "إضافة انتظار" + "استخدام لوحة مفاتيح نغمات باللمس" + "عودة إلى المكالمة الجارية" + "إضافة مكالمة" + "IMEI" + "MEID" + "‏جارٍ التحميل من شريحة SIM…" + "‏شريحة SIM وجهات الاتصال" + "الاتصال بالرقم %s" + "لا يمكن الاتصال بهذا الرقم"
diff --git a/java/com/android/dialer/dialpadview/res/values-az/strings.xml b/java/com/android/dialer/dialpadview/res/values-az/strings.xml index 46f218e09..8de688d05 100644 --- a/java/com/android/dialer/dialpadview/res/values-az/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-az/strings.xml @@ -22,4 +22,18 @@ "geri düyməsi" "plus" "səsli məktub" + "nömrə yığın" + "Səsli e-poçta zəng etmək üçün Təyyarə rejimini deaktiv edin." + "Səsli e-poçtu ayarlamaq üçün Menyu > Ayarlar bölməsinə daxil olun." + "2 saniyəlik pauza əlavə edin" + "Gözləmə əlavə edin" + "Toxunuş ton klaviaturasından istifadə edin" + "Davam edən zəngə qayıdın" + "Zəng əlavə edin" + "IMEI" + "MEID" + "SIM kartdan yüklənir..." + "SIM kart kontaktları" + "%s nömrəsinə zəng edin" + "Bu nömrəyə zəng etmək mümkün deyil"
diff --git a/java/com/android/dialer/dialpadview/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/dialpadview/res/values-b+sr+Latn/strings.xml index 24ea30816..c15aee4bf 100644 --- a/java/com/android/dialer/dialpadview/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-b+sr+Latn/strings.xml @@ -22,4 +22,18 @@ "backspace" "plus" "govorna pošta" + "birajte broj" + "Da biste pozvali govornu poštu, prvo isključite režim rada u avionu." + "Da biste podesili govornu poštu, idite u Meni > Podešavanja." + "Dodaj pauzu od 2 sekunde" + "Dodaj čekanje" + "Koristi tastaturu za tonsko biranje" + "Nazad u poziv koji je u toku" + "Dodaj poziv" + "IMEI" + "MEID" + "Učitava se sa SIM kartice…" + "Kontakti na SIM kartici" + "Pozovi %s" + "Nije moguće pozvati ovaj broj"
diff --git a/java/com/android/dialer/dialpadview/res/values-be/strings.xml b/java/com/android/dialer/dialpadview/res/values-be/strings.xml index db504555e..cbe85f517 100644 --- a/java/com/android/dialer/dialpadview/res/values-be/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-be/strings.xml @@ -22,4 +22,18 @@ "backspace" "плюс" "галасавая пошта" + "набор" + "Каб пазваніць на галасавую пошту, спачатку адключыце Рэжым палёту." + "Каб наладзіць галасавую пошту, перайдзіце ў раздзел \"Меню > Налады\"." + "Дадаць 2-секундную паўзу" + "Дадаць чаканне" + "Выкарыстанне тонавай клавіятуры" + "Вярнуцца да бягучага выкліку" + "Дадаць выклік" + "IMEI" + "MEID" + "Загрузка з SIM-карты..." + "Кантакты SIM-карты" + "Выклікаць %s" + "Немагчыма выклікаць гэты нумар"
diff --git a/java/com/android/dialer/dialpadview/res/values-bg/strings.xml b/java/com/android/dialer/dialpadview/res/values-bg/strings.xml index 7a3073d77..1188d7959 100644 --- a/java/com/android/dialer/dialpadview/res/values-bg/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-bg/strings.xml @@ -22,4 +22,18 @@ "backspace" "плюс" "гласова поща" + "набиране" + "За да чуете гласовата си поща, първо изключете самолетния режим." + "За да настроите гласовата поща, отворете „Меню“ > „Настройки“." + "Добавяне на пауза от 2 сек" + "Добавяне на изчакване" + "Използване на тонова клавиатура" + "Назад към текущото обаждане" + "Добавяне на обаждане" + "IMEI" + "MEID" + "Зарежда се от SIM картата…" + "Контакти от SIM картата" + "Обаждане на %s" + "Не можете да се обадите на този номер"
diff --git a/java/com/android/dialer/dialpadview/res/values-bn/strings.xml b/java/com/android/dialer/dialpadview/res/values-bn/strings.xml index 98171cfc2..9f3713f6e 100644 --- a/java/com/android/dialer/dialpadview/res/values-bn/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-bn/strings.xml @@ -22,4 +22,18 @@ "ব্যাক-স্পেস" "যোগ চিহ্ন" "ভয়েসমেল" + "ডায়াল করুন" + "ভয়েসমেলে কল করতে, সবার আগে বিমানমোড বন্ধ করুন৷" + "ভয়েসমেল সেট-আপ করতে, মেনু > সেটিংসে যান৷" + "২-সেকেন্ড বিরতি যোগ করুন" + "অপেক্ষা যোগ করুন" + "টাচ-টোন কীপ্যাড ব্যবহার করুন" + "আগের কলে ফিরে যান" + "কল যোগ করুন" + "IMEI" + "MEID" + "সিম কার্ড থেকে লোড করা হচ্ছে…" + "সিম কার্ডের পরিচিতিগুলি" + "%s নম্বরে কল করুন" + "এই নম্বরে কল করা যাবে না"
diff --git a/java/com/android/dialer/dialpadview/res/values-bs/strings.xml b/java/com/android/dialer/dialpadview/res/values-bs/strings.xml index 976866285..4c0527b59 100644 --- a/java/com/android/dialer/dialpadview/res/values-bs/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-bs/strings.xml @@ -22,4 +22,18 @@ "tipka za brisanje" "plus" "govorna pošta" + "biranje" + "Da pozovete govornu poštu, isključite Način rada u avionu." + "Da postavite govornu poštu, idite na Meni > Postavke." + "Dodajte pauzu od 2 sekunde" + "Dodajte čekanje" + "Korištenje tastature za tonsko biranje" + "Povratak na poziv" + "Dodajte poziv" + "IMEI" + "MEID" + "Učitavanje sa SIM kartice…" + "Kontakti sa SIM kartice" + "Pozivanje broja %s" + "Nije moguće pozvati ovaj broj"
diff --git a/java/com/android/dialer/dialpadview/res/values-ca/strings.xml b/java/com/android/dialer/dialpadview/res/values-ca/strings.xml index 2bd6c711c..eda95b474 100644 --- a/java/com/android/dialer/dialpadview/res/values-ca/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ca/strings.xml @@ -22,4 +22,18 @@ "retrocés" "més" "missatge de veu" + "marca" + "Per trucar a la bústia de veu, primer has de desactivar el mode d\'avió." + "Per configurar la bústia de veu, ves a Menú > Configuració." + "Afegeix una pausa de 2 segons" + "Afegeix una espera" + "Utilitza el teclat de tons" + "Torna a la trucada en curs" + "Afegeix una trucada" + "IMEI" + "MEID" + "S\'està carregant des de la targeta SIM..." + "Contactes de la targeta SIM" + "Truca al %s" + "No es pot trucar a aquest número"
diff --git a/java/com/android/dialer/dialpadview/res/values-cs/strings.xml b/java/com/android/dialer/dialpadview/res/values-cs/strings.xml index 6c13e1c47..a97d2132b 100644 --- a/java/com/android/dialer/dialpadview/res/values-cs/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-cs/strings.xml @@ -22,4 +22,18 @@ "Backspace" "plus" "hlasová zpráva" + "vytočit" + "Pokud chcete volat do hlasové schránky, vypněte nejdříve režim letadla." + "Pokud chcete nastavit hlasovou schránku, přejděte na nabídku > Nastavení." + "Přidat pauzu 2 s" + "Přidat čekání" + "Použít dotykovou tónovou klávesnici" + "Vrátit se k probíhajícímu hovoru" + "Přidat hovor" + "IMEI" + "MEID" + "Načítání ze SIM karty…" + "Kontakty na SIM kartě" + "Zavolat %s" + "Na toto číslo není možné zavolat"
diff --git a/java/com/android/dialer/dialpadview/res/values-da/strings.xml b/java/com/android/dialer/dialpadview/res/values-da/strings.xml index 1df734896..45eb87238 100644 --- a/java/com/android/dialer/dialpadview/res/values-da/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-da/strings.xml @@ -22,4 +22,18 @@ "tilbagetast" "plus" "telefonsvarer" + "ring op" + "Hvis du vil ringe til telefonsvareren, skal du først slå Flytilstand fra." + "Gå til Menu > Indstillinger for at konfigurere telefonsvareren." + "Tilføj pause på 2 sek." + "Tilføj ventetid" + "Brug trykknaptastatur" + "Vend tilbage til igangværende opkald" + "Tilføj opkald" + "IMEI-nummer" + "MEID-nummer" + "Der indlæses fra SIM-kortet…" + "Kontaktpersoner på SIM-kortet" + "Ring til %s" + "Det er ikke muligt at ringe til dette nummer"
diff --git a/java/com/android/dialer/dialpadview/res/values-de/strings.xml b/java/com/android/dialer/dialpadview/res/values-de/strings.xml index c93ce4d4f..c350c9484 100644 --- a/java/com/android/dialer/dialpadview/res/values-de/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-de/strings.xml @@ -22,4 +22,18 @@ "Rücktaste" "Plus" "Mailboxnachricht" + "Wählen" + "Deaktiviere zunächst den Flugmodus, um die Mailbox anzurufen." + "Konfiguriere deine Mailbox unter \"Menü\" > \"Einstellungen\"." + "2 Sekunden Pause hinzufügen" + "Warten hinzufügen" + "Tonwahltasten verwenden" + "Zurück zum aktuellen Anruf" + "Anruf hinzufügen" + "IMEI" + "MEID" + "Ladevorgang von SIM-Karte läuft…" + "Kontakte auf SIM-Karte" + "%s anrufen" + "Diese Nummer kann nicht angerufen werden"
diff --git a/java/com/android/dialer/dialpadview/res/values-el/strings.xml b/java/com/android/dialer/dialpadview/res/values-el/strings.xml index 1bce64b93..0205f7694 100644 --- a/java/com/android/dialer/dialpadview/res/values-el/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-el/strings.xml @@ -22,4 +22,18 @@ "backspace" "συν" "αυτόματος τηλεφωνητής" + "κλήση" + "Για κλήση αυτόματου τηλεφωνητή, πρώτα απενεργοποιήστε τη λειτουργία πτήσης." + "Για τη ρύθμιση του αυτόματου τηλεφωνητή, μεταβείτε στο στοιχείο Μενού > Ρυθμίσεις." + "Προσθήκη παύσης 2 δευτερολέπτων" + "Προσθήκη αναμονής" + "Χρησιμοποιήστε το πληκτρολόγιο αφής ηχητικών τόνων" + "Επιστροφή στην κλήση που βρίσκεται σε εξέλιξη" + "Προσθήκη κλήσης" + "IMEI" + "MEID" + "Φόρτωση από κάρτα SIM…" + "Επαφές στην κάρτα SIM" + "Κλήση %s" + "Δεν μπορείτε να καλέσετε αυτόν τον αριθμό"
diff --git a/java/com/android/dialer/dialpadview/res/values-en-rAU/strings.xml b/java/com/android/dialer/dialpadview/res/values-en-rAU/strings.xml index 62fc54747..3f16055d7 100644 --- a/java/com/android/dialer/dialpadview/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-en-rAU/strings.xml @@ -22,4 +22,18 @@ "backspace" "plus" "voicemail" + "dial" + "To call voicemail, first turn off Aeroplane mode." + "To set up voicemail, go to Menu > Settings." + "Add 2-sec pause" + "Add wait" + "Use touch tone keypad" + "Return to call in progress" + "Add call" + "IMEI" + "MEID" + "Loading from SIM card…" + "SIM card contacts" + "Call %s" + "Can\'t call this number"
diff --git a/java/com/android/dialer/dialpadview/res/values-en-rGB/strings.xml b/java/com/android/dialer/dialpadview/res/values-en-rGB/strings.xml index 62fc54747..3f16055d7 100644 --- a/java/com/android/dialer/dialpadview/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-en-rGB/strings.xml @@ -22,4 +22,18 @@ "backspace" "plus" "voicemail" + "dial" + "To call voicemail, first turn off Aeroplane mode." + "To set up voicemail, go to Menu > Settings." + "Add 2-sec pause" + "Add wait" + "Use touch tone keypad" + "Return to call in progress" + "Add call" + "IMEI" + "MEID" + "Loading from SIM card…" + "SIM card contacts" + "Call %s" + "Can\'t call this number"
diff --git a/java/com/android/dialer/dialpadview/res/values-en-rIN/strings.xml b/java/com/android/dialer/dialpadview/res/values-en-rIN/strings.xml index 62fc54747..3f16055d7 100644 --- a/java/com/android/dialer/dialpadview/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-en-rIN/strings.xml @@ -22,4 +22,18 @@ "backspace" "plus" "voicemail" + "dial" + "To call voicemail, first turn off Aeroplane mode." + "To set up voicemail, go to Menu > Settings." + "Add 2-sec pause" + "Add wait" + "Use touch tone keypad" + "Return to call in progress" + "Add call" + "IMEI" + "MEID" + "Loading from SIM card…" + "SIM card contacts" + "Call %s" + "Can\'t call this number"
diff --git a/java/com/android/dialer/dialpadview/res/values-es-rUS/strings.xml b/java/com/android/dialer/dialpadview/res/values-es-rUS/strings.xml index 4c2908852..5bf2ae8bd 100644 --- a/java/com/android/dialer/dialpadview/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-es-rUS/strings.xml @@ -22,4 +22,18 @@ "retroceso" "más" "buzón de voz" + "marcar" + "Para escuchar los mensajes de tu buzón de voz, desactiva primero el modo avión." + "Para configurar el buzón de voz, ve a Menú > Configuración." + "Agregar pausa de 2 segundos" + "Agregar espera" + "Usar teclado numérico" + "Regresar a la llamada en curso" + "Agregar llamada" + "IMEI" + "MEID" + "Cargando desde tarjeta SIM…" + "Contactos de la tarjeta SIM" + "Llamar al %s" + "No se puede llamar a este número"
diff --git a/java/com/android/dialer/dialpadview/res/values-es/strings.xml b/java/com/android/dialer/dialpadview/res/values-es/strings.xml index 7fd6355b2..af3590874 100644 --- a/java/com/android/dialer/dialpadview/res/values-es/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-es/strings.xml @@ -22,4 +22,18 @@ "retroceso" "más" "mensaje de voz" + "marcar" + "Para llamar al buzón de voz, debes desactivar el modo avión." + "Para configurar el buzón de voz, ve a Menú > Ajustes." + "Añadir pausa de 2 segundos" + "Añadir espera" + "Usar teclado táctil" + "Volver a la llamada en curso" + "Añadir llamada" + "IMEI" + "MEID" + "Cargando el número de teléfono de la tarjeta SIM…" + "Contactos de la tarjeta SIM" + "Llamar al %s" + "No se puede llamar a este número"
diff --git a/java/com/android/dialer/dialpadview/res/values-et/strings.xml b/java/com/android/dialer/dialpadview/res/values-et/strings.xml index e71bd717b..c5e4f5f38 100644 --- a/java/com/android/dialer/dialpadview/res/values-et/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-et/strings.xml @@ -22,4 +22,18 @@ "tagasilüke" "pluss" "kõnepostisõnum" + "helista" + "Kõnepostisõnumite kuulamiseks lülitage esmalt välja lennukirežiim." + "Kõneposti seadistamiseks tehke valikud Menüü > Seaded." + "Lisa kahesekundiline paus" + "Lisa ootamine" + "Kasuta puutetooniga klahvistikku" + "Naase käimasolevale kõnele" + "Lisa kõne" + "IMEI" + "MEID" + "Laadimine SIM-kaardilt …" + "SIM-kaardi kontaktid" + "Helistamine numbrile %s" + "Sellele numbrile ei saa helistada"
diff --git a/java/com/android/dialer/dialpadview/res/values-eu/strings.xml b/java/com/android/dialer/dialpadview/res/values-eu/strings.xml index c70948b2e..778b199f8 100644 --- a/java/com/android/dialer/dialpadview/res/values-eu/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-eu/strings.xml @@ -22,4 +22,18 @@ "atzera tekla" "gehi" "erantzungailua" + "markatu" + "Ahots-mezuak entzuteko, Hegaldi modua desaktibatu behar duzu." + "Erantzungailua konfiguratzeko, joan Menua > Ezarpenak atalera." + "Gehitu 2 segundoko pausa" + "Gehitu itxaronaldia" + "Erabili ukipen-tonuak dituen teklatua" + "Itzuli abian den deira" + "Gehitu deia" + "IMEI" + "MEID" + "SIM txarteletik kargatzen…" + "SIM txarteleko kontaktuak" + "Deitu %s zenbakira" + "Ezin da deitu zenbaki honetara"
diff --git a/java/com/android/dialer/dialpadview/res/values-fa/strings.xml b/java/com/android/dialer/dialpadview/res/values-fa/strings.xml index 716360f99..070ca0059 100644 --- a/java/com/android/dialer/dialpadview/res/values-fa/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-fa/strings.xml @@ -22,4 +22,18 @@ "برگشت به عقب" "به‌علاوه" "پست صوتی" + "شماره‌گیری" + "برای تماس با پست صوتی، ابتدا حالت هواپیما را غیرفعال کنید." + "برای راه‌اندازی پست صوتی به منو > تنظیمات بروید." + "افزودن یک مکث ۲ ثانیه‌ای" + "افزودن انتظار" + "استفاده از صفحه‌کلید لمسی" + "برگشت به تماس درحال انجام" + "افزودن تماس" + "IMEI" + "MEID" + "در حال بارگیری سیم کارت..." + "مخاطبین سیم‌کارت" + "تماس با %s" + "تماس با این شماره ممکن نیست"
diff --git a/java/com/android/dialer/dialpadview/res/values-fi/strings.xml b/java/com/android/dialer/dialpadview/res/values-fi/strings.xml index 63e96f639..0a7a7912b 100644 --- a/java/com/android/dialer/dialpadview/res/values-fi/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-fi/strings.xml @@ -22,4 +22,18 @@ "askelpalautin" "plus" "ääniviesti" + "soita" + "Poista lentokonetila käytöstä ennen vastaajaan soittamista." + "Määritä puhelinvastaajan asetukset kohdassa Valikko > Asetukset." + "Lisää 2 sekunnin tauko" + "Lisää tauko" + "Käytä näppäimistöä" + "Palaa meneillään olevaan puheluun" + "Lisää puhelu" + "IMEI-koodi" + "MEID" + "Ladataan SIM-kortilta…" + "SIM-kortin yhteystiedot" + "Soita %s" + "Numeroon ei voi soittaa."
diff --git a/java/com/android/dialer/dialpadview/res/values-fr-rCA/strings.xml b/java/com/android/dialer/dialpadview/res/values-fr-rCA/strings.xml index bb0454552..3080169ac 100644 --- a/java/com/android/dialer/dialpadview/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-fr-rCA/strings.xml @@ -22,4 +22,18 @@ "retour arrière" "plus" "messagerie vocale" + "composer" + "Veuillez désactiver le mode Avion avant d\'appeler la messagerie vocale." + "Pour configurer la messagerie vocale, accédez à Menu > Paramètres." + "Ajouter une pause de 2 s" + "Ajouter une attente" + "Utiliser le clavier DTMF" + "Reprendre l\'appel en cours" + "Ajouter un appel" + "IIEM" + "IDEM" + "Chargement à partir de la carte SIM en cours…" + "Contacts de la carte SIM" + "Appeler le %s" + "Vous ne pouvez pas appeler ce numéro"
diff --git a/java/com/android/dialer/dialpadview/res/values-fr/strings.xml b/java/com/android/dialer/dialpadview/res/values-fr/strings.xml index ea3e67c61..b4fc15222 100644 --- a/java/com/android/dialer/dialpadview/res/values-fr/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-fr/strings.xml @@ -22,4 +22,18 @@ "retour arrière" "plus" "message vocal" + "composer" + "Pour pouvoir appeler la messagerie vocale, vous devez désactiver le mode Avion." + "Pour configurer la messagerie vocale, accédez à Menu > Paramètres." + "Ajouter une pause de 2 s" + "Ajouter une attente" + "Utiliser le clavier DTMF" + "Reprendre l\'appel en cours" + "Ajouter un appel" + "Code IMEI" + "Code MEID" + "Chargement depuis la carte SIM..." + "Contacts de la carte SIM" + "Appeler le %s" + "Impossible d\'appeler ce numéro"
diff --git a/java/com/android/dialer/dialpadview/res/values-gl/strings.xml b/java/com/android/dialer/dialpadview/res/values-gl/strings.xml index d3901949b..25ffc278d 100644 --- a/java/com/android/dialer/dialpadview/res/values-gl/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-gl/strings.xml @@ -22,4 +22,18 @@ "retroceso" "máis" "correo de voz" + "marca" + "Para chamar ao correo de voz, primeiro desactiva o modo avión." + "Para configurar o correo de voz, accede a Menú > Configuración." + "Engadir pausa de 2 segundos" + "Engadir espera" + "Usar teclado de tons táctiles" + "Volver á chamada en curso" + "Engadir chamada" + "IMEI" + "MEID" + "Cargando número da tarxeta SIM…" + "Contactos da tarxeta SIM" + "Chamar ao %s" + "Non é posible chamar a este número"
diff --git a/java/com/android/dialer/dialpadview/res/values-gu/strings.xml b/java/com/android/dialer/dialpadview/res/values-gu/strings.xml index 8962694f9..e4e13b3eb 100644 --- a/java/com/android/dialer/dialpadview/res/values-gu/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-gu/strings.xml @@ -22,4 +22,18 @@ "backspace" "પ્લસ" "વૉઇસમેઇલ" + "ડાયલ કરો" + "વૉઇસમેઇલ પર કૉલ કરવા માટે, પહેલાં એરપ્લેન મોડને બંધ કરો." + "વૉઇસમેઇલ સેટ કરવા માટે, મેનૂ > સેટિંગ્સ પર જાઓ." + "2-સેકંડનો વિરામ ઉમેરો" + "પ્રતીક્ષા ઉમેરો" + "ટચ ટોન કીપેડનો ઉપયોગ કરો" + "કૉલ પર પાછા આવવું પ્રગતિ પર છે" + "કૉલ ઉમેરો" + "IMEI" + "MEID" + "SIM કાર્ડમાંથી લોડ કરી રહ્યાં છીએ…" + "SIM કાર્ડ સંપર્કો" + "%s પર કૉલ કરો" + "આ નંબર પર કૉલ કરી શકાતો નથી"
diff --git a/java/com/android/dialer/dialpadview/res/values-hi/strings.xml b/java/com/android/dialer/dialpadview/res/values-hi/strings.xml index 4388ec2fa..529f8c729 100644 --- a/java/com/android/dialer/dialpadview/res/values-hi/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-hi/strings.xml @@ -22,4 +22,18 @@ "backspace" "धन का चिह्न" "वॉइसमेल" + "डायल करें" + "वॉइसमेल कॉल करने के लिए, पहले हवाई जहाज़ मोड बंद करें." + "वॉइसमेल सेट अप करने के लिए, मेनू > सेटिंग पर जाएं." + "2-सेकंड का विराम जोड़ें" + "प्रतीक्षा का समय बढ़ाएं" + "टच टोन कीपैड का उपयोग करें" + "कॉल पर लौटने का कार्य प्रगति पर" + "कॉल जोड़ें" + "IMEI" + "MEID" + "SIM कार्ड से लोड हो रहा है…" + "SIM कार्ड के संपर्क" + "%s पर कॉल करें" + "इस नंबर पर कॉल नहीं किया जा सकता"
diff --git a/java/com/android/dialer/dialpadview/res/values-hr/strings.xml b/java/com/android/dialer/dialpadview/res/values-hr/strings.xml index b904d2303..6ec34d29e 100644 --- a/java/com/android/dialer/dialpadview/res/values-hr/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-hr/strings.xml @@ -22,4 +22,18 @@ "povratna tipka" "plus" "govorna pošta" + "biraj" + "Da biste nazvali govornu poštu, najprije isključite način rada u zrakoplovu." + "Da biste postavili govornu poštu, idite na Izbornik > Postavke." + "Dodaj pauzu od 2 s." + "Dodaj čekanje" + "Koristite dodirnu zvučnu tipkovnicu" + "Natrag na poziv u tijeku" + "Dodaj poziv" + "IMEI" + "MEID" + "Učitavanje sa SIM kartice..." + "Kontakti na SIM kartici" + "Nazovite %s" + "Nije moguće nazvati taj broj"
diff --git a/java/com/android/dialer/dialpadview/res/values-hu/strings.xml b/java/com/android/dialer/dialpadview/res/values-hu/strings.xml index 4b1c854bc..7ef242410 100644 --- a/java/com/android/dialer/dialpadview/res/values-hu/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-hu/strings.xml @@ -22,4 +22,18 @@ "Backspace" "plusz" "hangposta" + "tárcsázás" + "Hangposta hívásához kapcsolja ki a Repülőgép üzemmódot." + "A hangposta beállításához válassza a Menü > Beállítások pontot." + "2 mp-es szünet hozzáadása" + "Várakozás hozzáadása" + "Hangkódos telefonbillentyűzet használata" + "Vissza a folyamatban lévő híváshoz" + "Hívás hozzáadása" + "IMEI" + "MEID" + "Betöltés a SIM-kártyáról…" + "Névjegyek a SIM-kártyán" + "Hívás: %s" + "Nem lehet felhívni ezt a számot"
diff --git a/java/com/android/dialer/dialpadview/res/values-hy/strings.xml b/java/com/android/dialer/dialpadview/res/values-hy/strings.xml index 4433c7016..0839922ec 100644 --- a/java/com/android/dialer/dialpadview/res/values-hy/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-hy/strings.xml @@ -22,4 +22,18 @@ "հետշարժ" "գումարում" "ձայնային փոստ" + "համարհավաքել" + "Ձայնային փոստին զանգելու համար նախ անջատեք Ինքնաթիռի ռեժիմը:" + "Ձայնային փոստը կարգավորելու համար անցեք Ընտրացնակ > Կարգավորումներ:" + "Ավելացնել 2 վայրկյան դադար" + "Ավելացնել սպասելաժամանակ" + "Օգտագործել տոնային ստեղնաշարը" + "Վերադառնալ ընթացիկ զանգին" + "Ավելացնել զանգ" + "IMEI" + "MEID" + "Բեռնվում է SIM քարտից…" + "SIM քարտի կոնտակտներ" + "Զանգել %s համարին" + "Հնարավոր չէ զանգել այս համարին"
diff --git a/java/com/android/dialer/dialpadview/res/values-in/strings.xml b/java/com/android/dialer/dialpadview/res/values-in/strings.xml index 7aa47580a..4f7a05fc1 100644 --- a/java/com/android/dialer/dialpadview/res/values-in/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-in/strings.xml @@ -22,4 +22,18 @@ "backspace" "tambah" "pesan suara" + "panggil" + "Untuk memanggil pesan suara, nonaktifkan mode Pesawat terlebih dahulu." + "Untuk menyiapkan pesan suara, buka Menu > Setelan." + "Tambahkan jeda 2 dtk" + "Tambahkan tunggu" + "Gunakan keypad nada sentuh" + "Kembali ke panggilan sedang berlangsung" + "Tambahkan panggilan" + "IMEI" + "MEID" + "Memuat dari kartu SIM…" + "Kontak di kartu SIM" + "Telepon %s" + "Tidak dapat menelepon nomor ini"
diff --git a/java/com/android/dialer/dialpadview/res/values-is/strings.xml b/java/com/android/dialer/dialpadview/res/values-is/strings.xml index 00f7cefe0..de6b9a239 100644 --- a/java/com/android/dialer/dialpadview/res/values-is/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-is/strings.xml @@ -22,4 +22,18 @@ "bakklykill" "plús" "talhólfsskilaboð" + "hringja" + "Til að hringja í talhólfið þarftu fyrst að slökkva á flugstillingu." + "Til að setja upp talhólf þarftu að opna valmyndina og velja Stillingar." + "Bæta við 2 sekúndna töf" + "Bæta töf við" + "Nota snertitónatakkaborð" + "Fara aftur í símtal í gangi" + "Bæta símtali við" + "IMEI" + "MEID" + "Hleður af SIM-kortinu…" + "Tengiliðir á SIM-korti" + "Hringja í %s" + "Ekki er hægt að hringja í þetta númer"
diff --git a/java/com/android/dialer/dialpadview/res/values-it/strings.xml b/java/com/android/dialer/dialpadview/res/values-it/strings.xml index 9c4302af3..cb1b75216 100644 --- a/java/com/android/dialer/dialpadview/res/values-it/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-it/strings.xml @@ -22,4 +22,18 @@ "backspace" "più" "messaggio vocale" + "componi" + "Per chiamare la segreteria, disattiva la modalità aereo." + "Per configurare la segreteria, seleziona Menu > Impostazioni." + "Aggiungi pausa 2 sec" + "Aggiungi attesa" + "Usa tastierino per selezione a toni" + "Torna alla chiamata in corso" + "Aggiungi chiamata" + "IMEI" + "MEID" + "Caricamento da SIM..." + "Contatti della scheda SIM" + "Chiama %s" + "Impossibile chiamare questo numero"
diff --git a/java/com/android/dialer/dialpadview/res/values-iw/strings.xml b/java/com/android/dialer/dialpadview/res/values-iw/strings.xml index c27af37cb..a8e784e97 100644 --- a/java/com/android/dialer/dialpadview/res/values-iw/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-iw/strings.xml @@ -22,4 +22,18 @@ "Backspace" "פלוס" "דואר קולי" + "חיוג" + "כדי להתקשר לתא הקולי, קודם עליך להשבית את מצב הטיסה." + "כדי להגדיר את התא הקולי, עליך להיכנס לתפריט > הגדרות." + "הוספת השהיה של 2 שניות" + "הוספת השהיה" + "שימוש במקלדת עם צלילי חיוג" + "חזרה לשיחה הפעילה" + "הוספת שיחה" + "IMEI" + "MEID" + "‏אנחנו טוענים מכרטיס ה-SIM…" + "‏אנשי הקשר בכרטיס ה-SIM" + "התקשרות אל %s" + "לא ניתן להתקשר אל המספר הזה"
diff --git a/java/com/android/dialer/dialpadview/res/values-ja/strings.xml b/java/com/android/dialer/dialpadview/res/values-ja/strings.xml index d560c88b2..78ab67a4c 100644 --- a/java/com/android/dialer/dialpadview/res/values-ja/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ja/strings.xml @@ -22,4 +22,18 @@ "Backspace" "足す" "ボイスメール" + "発信" + "機内モードを OFF にしてからボイスメールを呼び出してください。" + "ボイスメールを設定するには、[メニュー] > [設定] の順に開いてください。" + "2 秒間の停止を追加" + "待機を追加" + "プッシュホン式キーパッドを使う" + "通話に戻る" + "通話を追加" + "IMEI" + "MEID" + "SIM カードから読み込み中…" + "SIM カードの連絡先" + "%s に発信" + "この番号に発信できません"
diff --git a/java/com/android/dialer/dialpadview/res/values-ka/strings.xml b/java/com/android/dialer/dialpadview/res/values-ka/strings.xml index 28e0319fd..2e3b25bf7 100644 --- a/java/com/android/dialer/dialpadview/res/values-ka/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ka/strings.xml @@ -22,4 +22,18 @@ "უკუშლა" "პლუსი" "ხმოვანი ფოსტა" + "აკრეფა" + "ხმოვან ფოსტასთან დასაკავშირებლად, პირველ რიგში, გამორთეთ თვითმფრინავის რეჟიმი." + "ხმოვანი ფოსტის დასაყენებლად გადადით: მენიუ > პარამეტრები." + "ორწამიანი პაუზის დამატება" + "ლოდინის დამატება" + "ტონური რეჟიმის კლავიატურის გამოყენება" + "მიმდინარე ზარზე დაბრუნება" + "ზარის დამატება" + "IMEI" + "MEID" + "მიმდინარეობს ჩატვირთვა SIM ბარათიდან…" + "SIM ბარათის კონტაქტები" + "დარეკვა %s-ზე" + "ამ ნომერზე დარეკვა შეუძლებელია"
diff --git a/java/com/android/dialer/dialpadview/res/values-kk/strings.xml b/java/com/android/dialer/dialpadview/res/values-kk/strings.xml index 902a41f59..3906017af 100644 --- a/java/com/android/dialer/dialpadview/res/values-kk/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-kk/strings.xml @@ -22,4 +22,18 @@ "Backspace пернесі" "қосу" "дауыстық пошта" + "теру" + "Дауыстық поштаға қоңырау шалу мүмкін болуы үшін, ұшақ режимін өшіру қажет." + "Дауыстық поштаны орнату үшін, \"Mәзір > Параметрлер\" тармағына өтіңіз." + "2 секундтық үзіліс қосу" + "\"Күту\" мүмкіндігін қосу" + "Сенсорлы және дыбысты пернетақта" + "Басталған қоңырауға оралу" + "Жаңа қоңырау қосу" + "IMEI" + "MEID" + "SIM картасынан жүктелуде..." + "SIM контактілері" + "%s нөміріне қоңырау шалу" + "Бұл нөмірге қоңырау шалу мүмкін емес"
diff --git a/java/com/android/dialer/dialpadview/res/values-km/strings.xml b/java/com/android/dialer/dialpadview/res/values-km/strings.xml index be9483ef9..12b04a579 100644 --- a/java/com/android/dialer/dialpadview/res/values-km/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-km/strings.xml @@ -22,4 +22,18 @@ "លុប​ថយក្រោយ" "plus" "សារ​ជា​សំឡេង" + "ចុច" + "ដើម្បី​ហៅ​សារ​ជា​សំឡេង ដំបូង​ត្រូវ​បិទ​​មុខងារ​​ពេល​ជិះ​យន្តហោះ។" + "ដើម្បី​កំណត់​សារ​ជា​សំឡេង ចូល​ម៉ឺនុយ > ការ​កំណត់។" + "បញ្ចូល​ការផ្អាក 2 វិនាទី" + "បញ្ចូល​ការ​រង់ចាំ" + "ប្រើ​សំឡេង​ប៉ះ​បន្ទះ​លេខ" + "កំពុង​ត្រឡប់​ទៅកាន់​ការ​ហៅ" + "បញ្ចូល​ការហៅទូរសព្ទ" + "IMEI" + "MEID" + "កំពុង​ផ្ទុក​ពី​ស៊ីម​កាត..." + "ទំនាក់ទំនង​នៅ​ក្នុង​ស៊ីម​កាត" + "ហៅ​ទៅ​កាន់ %s" + "មិនអាចហៅ​ទៅ​កាន់​លេខនេះបានទេ"
diff --git a/java/com/android/dialer/dialpadview/res/values-kn/strings.xml b/java/com/android/dialer/dialpadview/res/values-kn/strings.xml index 843058026..afc99b62b 100644 --- a/java/com/android/dialer/dialpadview/res/values-kn/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-kn/strings.xml @@ -22,4 +22,18 @@ "backspace" "ಸಂಕಲನ" "ಧ್ವನಿಮೇಲ್" + "ಡಯಲ್" + "ಧ್ವನಿಮೇಲ್‌ಗೆ ಕರೆ ಮಾಡಲು, ಮೊದಲು ಏರ್‌ಪ್ಲೇನ್‌‌ ಮೋಡ್‌‌ ಆಫ್‌ ಮಾಡಿ." + "ಧ್ವನಿಮೇಲ್‌ ಹೊಂದಿಸಲು, ಮೆನು > ಸೆಟ್ಟಿಂಗ್‌ಗಳುಗೆ ಹೋಗಿ." + "2-ಸೆ ವಿರಾಮವನ್ನು ಸೇರಿಸಿ" + "ನಿರೀಕ್ಷೆಯನ್ನು ಸೇರಿಸಿ" + "ಸ್ಪರ್ಶ ಟೋನ್ ಕೀಪ್ಯಾಡ್ ಬಳಸಿ" + "ಪ್ರತ್ಯತ್ತರ ಕರೆಯು ಪ್ರಗತಿಯಲ್ಲಿದೆ" + "ಕರೆಯನ್ನು ಸೇರಿಸಿ" + "IMEI" + "MEID" + "ಸಿಮ್‌ ಕಾರ್ಡ್‌ನಿಂದ ಲೋಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…" + "ಸಿಮ್‌ ಕಾರ್ಡ್‌ ಸಂಪರ್ಕಗಳು" + "%s ಕರೆ ಮಾಡಿ" + "ಈ ಸಂಖ್ಯೆಗೆ ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"
diff --git a/java/com/android/dialer/dialpadview/res/values-ko/strings.xml b/java/com/android/dialer/dialpadview/res/values-ko/strings.xml index 748843c60..8366ec5f6 100644 --- a/java/com/android/dialer/dialpadview/res/values-ko/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ko/strings.xml @@ -22,4 +22,18 @@ "백스페이스" "더하기" "음성사서함" + "전화걸기" + "음성사서함 메시지를 확인하려면 먼저 비행기 모드를 해제하세요." + "음성사서함을 설정하려면 메뉴 > 설정으로 이동하세요." + "2초간 일시중지 추가" + "대기 시간 추가" + "터치톤 키패드 사용" + "진행 중인 통화로 돌아가기" + "통화 추가" + "IMEI" + "MEID" + "SIM 카드에서 로딩 중…" + "SIM 카드 연락처" + "%s에 전화걸기" + "이 번호에 전화를 걸 수 없습니다."
diff --git a/java/com/android/dialer/dialpadview/res/values-ky/strings.xml b/java/com/android/dialer/dialpadview/res/values-ky/strings.xml index 703abdb1c..8ce17279e 100644 --- a/java/com/android/dialer/dialpadview/res/values-ky/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ky/strings.xml @@ -22,4 +22,18 @@ "артка карай өчүрүү" "кошуу" "үн почтасы" + "терүү" + "Үн почтасын текшерүү үчүн, алгач Учак режимин өчүрүңүз." + "Үн почтасын жөндөө үчүн Меню > Жөндөөлөргө кириңиз." + "2-сек. тыныгууну кошуңуз" + "Тыныгуу кошуу" + "Тоналдык терүү тактасын колдонуу" + "Аткарылып жаткан чалууга кайтуу" + "Чалууну кошуу" + "IMEI" + "MEID" + "SIM-картадан жүктөлүүдө…" + "SIM картадагы байланыштар" + "%s номерине чалуу" + "Бул номерге чалуу мүмкүн болбой жатат"
diff --git a/java/com/android/dialer/dialpadview/res/values-lo/strings.xml b/java/com/android/dialer/dialpadview/res/values-lo/strings.xml index aefc70199..a69e28e99 100644 --- a/java/com/android/dialer/dialpadview/res/values-lo/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-lo/strings.xml @@ -22,4 +22,18 @@ "ປຸ່ມ backspace" "ບວກ" "ຂໍ້ຄວາມສຽງ" + "ໂທ" + "ທ່ານຕ້ອງປິດໂໝດຢູ່ເທິງຍົນກ່ອນເພື່ອໂທຫາເບີຂໍ້ຄວາມສຽງ." + "ເພື່ອຕັ້ງຄ່າຂໍ້ຄວາມສຽງ ໃຫ້ໄປທີ່ ເມນູ > ການຕັ້ງຄ່າ." + "ເພີ່ມການຂັ້ນເວລາ 2 ວິນາທີ" + "ເພີ່ມການລໍຖ້າ" + "ໃຊ້ປຸ່ມກົດສັນຍານສຽງ" + "ກັບໄປການໂທທີ່ກຳລັງດຳເນີນຢູ່" + "ເພີ່ມການໂທ" + "IMEI" + "MEID" + "ກຳລັງໂຫລດຈາກ SIM card..." + "ລາຍຊື່ຜູ້ຕິດຕໍ່ SIM card" + "ໂທ​ຫາ %s" + "ບໍ່​ສາ​ມາດ​ໂທ​ຫາ​ເບີ​ນີ້​ໄດ້"
diff --git a/java/com/android/dialer/dialpadview/res/values-lt/strings.xml b/java/com/android/dialer/dialpadview/res/values-lt/strings.xml index 0e352d032..3f09cdc78 100644 --- a/java/com/android/dialer/dialpadview/res/values-lt/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-lt/strings.xml @@ -22,4 +22,18 @@ "naikinimo klavišas" "sudėties ženklas" "balso pašto pranešimas" + "rinkti numerį" + "Jei norite skambinti į balso paštą, išjunkite lėktuvo režimą." + "Jei norite nustatyti balso paštą, eikite į meniu > „Nustatymai“." + "Pridėti 2 sek. pauzę" + "Pridėti laukimą" + "Naudoti jutiklinę tonų klaviatūrą" + "Grįžti prie vykdomo skambučio" + "Pridėti skambutį" + "IMEI" + "MEID" + "Įkeliama iš SIM kortelės..." + "SIM kortelės kontaktai" + "Skambinti %s" + "Negalima skambinti šiuo numeriu"
diff --git a/java/com/android/dialer/dialpadview/res/values-lv/strings.xml b/java/com/android/dialer/dialpadview/res/values-lv/strings.xml index 4af53a3e5..bcc2039e6 100644 --- a/java/com/android/dialer/dialpadview/res/values-lv/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-lv/strings.xml @@ -22,4 +22,18 @@ "atpakaļatkāpe" "pluszīme" "balss pasts" + "sastādīt numuru" + "Lai piekļūtu balss pastam, vispirms izslēdziet lidojuma režīmu." + "Lai iestatītu balss pastu, atveriet sadaļu Izvēlne > Iestatījumi." + "Pievienot 2 sekundes ilgu pauzi" + "Pievienot gaidīšanas funkciju" + "Izmantot skārientastatūru" + "Atgriezties pie pašreizējā zvana" + "Pievienot zvanu" + "IMEI" + "MEID" + "Notiek ielāde no SIM kartes..." + "SIM kartes kontaktpersonas" + "Zvanīt: %s" + "Uz šo numuru nevar piezvanīt."
diff --git a/java/com/android/dialer/dialpadview/res/values-mk/strings.xml b/java/com/android/dialer/dialpadview/res/values-mk/strings.xml index 2780e8aff..f98deb479 100644 --- a/java/com/android/dialer/dialpadview/res/values-mk/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-mk/strings.xml @@ -22,4 +22,18 @@ "избриши" "плус" "говорна пошта" + "бирај" + "За да се јавите во говорна пошта, исклучете го авионскиот режим." + "За поставување говорна пошта, одете во Мени > Поставки." + "Додај пауза од 2 сек." + "Додај чекање" + "Користете тастатура со тонско бирање" + "Вратете се на повик во тек" + "Додај повик" + "IMEI" + "MEID" + "Се вчитува од SIM-картичка…" + "Контакти од SIM-картичка" + "Повикај %s" + "Бројот не може да се повика"
diff --git a/java/com/android/dialer/dialpadview/res/values-ml/strings.xml b/java/com/android/dialer/dialpadview/res/values-ml/strings.xml index 7ef8313d6..77033aa48 100644 --- a/java/com/android/dialer/dialpadview/res/values-ml/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ml/strings.xml @@ -22,4 +22,18 @@ "ബാക്ക്‌സ്‌പെയ്‌സ്" "പ്ലസ്" "വോയ്‌സ്‌മെയിൽ" + "ഡയൽ ചെയ്യുക" + "വോയ്‌സ്‌മെയിൽ വിളിക്കാൻ ആദ്യം ഫ്ലൈറ്റ് മോഡ് ഓഫാക്കുക." + "വോയ്‌സ്‌മെയിൽ സജ്ജീകരിക്കുന്നതിന്, മെനു > ക്രമീകരണങ്ങൾ എന്നതിലേക്ക് പോകുക." + "2 സെക്കൻഡ് താൽക്കാലികമായി നിർത്തൽ ചേർക്കുക" + "കാത്തിരിക്കൽ ചേർക്കുക" + "ടച്ച് ടോൺ കീപാഡ് ഉപയോഗിക്കുക" + "വിളിച്ചുകൊണ്ടിരിക്കുന്ന കോളിലേക്ക് മടങ്ങുക" + "കോൾ ചേർക്കുക" + "IMEI" + "MEID" + "സിം കാർഡിൽ നിന്നും ലോഡുചെയ്യുന്നു…" + "സിം കാർഡ് കോൺടാക്റ്റുകൾ" + "വിളിക്കുക %s" + "ഈ നമ്പറിലേക്ക് കോൾ ചെയ്യാനാവില്ല"
diff --git a/java/com/android/dialer/dialpadview/res/values-mn/strings.xml b/java/com/android/dialer/dialpadview/res/values-mn/strings.xml index 5bc3bb7db..d03bb9379 100644 --- a/java/com/android/dialer/dialpadview/res/values-mn/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-mn/strings.xml @@ -22,4 +22,18 @@ "ухраах" "нэмэх" "дуут шуудан" + "залгах" + "Дуут шуудан руу залгахын тулд эхлээд Нислэгийн горимыг идэвхгүй болгоно уу." + "Дуут шууданг тохируулахын тулд Цэс > Тохиргоо руу очно уу." + "2-сек зогсолт нэмэх" + "Хүлээлт нэмэх" + "Хүрэлтээр дуугардаг гар ашиглах" + "Үргэлжилж буй дуудлага руу буцах" + "Дуудлага нэмэх" + "IMEI" + "MEID" + "SIM картаас ачаалж байна…" + "SIM картны харилцагч" + "%s руу залгах" + "Энэ дугаар руу залгах боломжгүй"
diff --git a/java/com/android/dialer/dialpadview/res/values-mr/strings.xml b/java/com/android/dialer/dialpadview/res/values-mr/strings.xml index 6f629e1a8..7b466a426 100644 --- a/java/com/android/dialer/dialpadview/res/values-mr/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-mr/strings.xml @@ -22,4 +22,18 @@ "backspace" "अधिक" "व्हॉइसमेल" + "डायल" + "व्हॉइसमेलला कॉल करण्यासाठी, प्रथम विमान मोड बंद करा." + "व्हॉइसमेल सेट करण्‍यासाठी, मेनू > सेटिंग्‍ज वर जा." + "2-सेकंदांचा विराम जोडा" + "वाट पाहणे जोडा" + "स्‍पर्श टोन कीपॅडचा वापर करा" + "चालू असलेल्या कॉलवर परत जा" + "कॉल जोडा" + "IMEI" + "MEID" + "सिम कार्ड मधून लोड करत आहे…" + "सिम कार्ड संपर्क" + "%s वर कॉल करा" + "या नंबरवर कॉल करू शकत नाही"
diff --git a/java/com/android/dialer/dialpadview/res/values-ms/strings.xml b/java/com/android/dialer/dialpadview/res/values-ms/strings.xml index f767a2587..a3cbbea88 100644 --- a/java/com/android/dialer/dialpadview/res/values-ms/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ms/strings.xml @@ -22,4 +22,18 @@ "undur ruang" "tambah" "mel suara" + "dail" + "Untuk membuat panggilan ke mel suara, mula-mula matikan mod Pesawat." + "Untuk menyediakan mel suara, pergi ke Menu > Tetapan." + "Tambah jeda 2 saat" + "Tambah penungguan" + "Gunakan pad kekunci nada sentuh" + "Kembali ke panggilan yang sedang berlangsung" + "Tambah panggilan" + "IMEI" + "MEID" + "Memuatkan daripada kad SIM…" + "Kenalan kad SIM" + "Panggil %s" + "Tidak dapat menghubungi nombor ini"
diff --git a/java/com/android/dialer/dialpadview/res/values-my/strings.xml b/java/com/android/dialer/dialpadview/res/values-my/strings.xml index 877805680..4ece9fa18 100644 --- a/java/com/android/dialer/dialpadview/res/values-my/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-my/strings.xml @@ -22,4 +22,18 @@ "နောက်ပြန်ဖျက်ခလုတ်" "အပေါင်း လက္ခဏာ" "အသံမေးလ်" + "ဖုန်းခေါ်ရန်" + "အသံမေးလ်ခေါ်ဆိုရန်အတွက် လေယာဉ်ပျံမုဒ်ကို ဦးစွာပိတ်ပါ။" + "အသံမေးလ်စနစ်ကို စီစဉ်သတ်မှတ်ရန် မီနူး > ဆက်တင်များသို့ သွားပါ။" + "၂-စက္ကန့် ခဏရပ်ရန်" + "စောင့်ဆိုင်းရန်" + "အသံမြည်ခလုတ်ခုံကို အသုံးပြုရန်" + "လက်ရှိဖုန်းပြောနေမှုသို့ ပြန်သွားရန်" + "နောက်ထပ်ဖုန်းတစ်ခု ခေါ်ဆိုရန်" + "IMEI" + "MEID" + "ဆင်းမ်ကဒ်မှ ဖွင့်နေသည်…" + "ဆင်းမ်ကဒ်အဆက်အသွယ်များ" + "%s ကို ဖုန်းခေါ်ရန်" + "ဤနံပါတ်ကို မခေါ်ဆိုနိုင်ပါ"
diff --git a/java/com/android/dialer/dialpadview/res/values-nb/strings.xml b/java/com/android/dialer/dialpadview/res/values-nb/strings.xml index c0756b25d..0f78eb7cf 100644 --- a/java/com/android/dialer/dialpadview/res/values-nb/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-nb/strings.xml @@ -22,4 +22,18 @@ "tilbaketast" "pluss" "talepost" + "ring" + "Du må slå av flymodus før du kan sjekke talepostkassen." + "For å konfigurere talepostfunksjonen, gå til Meny > Innstillinger." + "Legg til pause på 2 sek." + "Legg til Vent" + "Bruk tonetastatur" + "Gå tilbake til aktiv samtale" + "Nytt anrop" + "IMEI" + "MEID" + "Henter fra SIM-kort …" + "Kontakter på SIM-kort" + "Ring %s" + "Kan ikke ringe dette nummeret"
diff --git a/java/com/android/dialer/dialpadview/res/values-ne/strings.xml b/java/com/android/dialer/dialpadview/res/values-ne/strings.xml index 713c6ad96..6369eb7fd 100644 --- a/java/com/android/dialer/dialpadview/res/values-ne/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ne/strings.xml @@ -22,4 +22,18 @@ "ब्याकस्पेस" "जोड" "भ्वाइसमेल" + "डायल गर्नुहोस्" + "भ्वाइसमेल जाँच गर्न पहिले हवाइजहाज मोडलाई निष्क्रिय पार्नुहोस्।" + "भ्वाइसमेल सेट गर्न मेनु > सेटिङहरूमा जानुहोस्।" + "२ सेकन्डको पज थप्नुहोस्" + "प्रतीक्षाको समय थप्नुहोस्" + "टच टोन किप्याड प्रयोग गर्नुहोस्" + "जारी रहेको कलमा फर्किनुहोस्" + "कल थप्नुहोस्" + "IMEI" + "MEID" + "SIM कार्डबाट लोड हुँदै" + "SIM कार्डका सम्पर्क ठेगानाहरू" + "%s मा कल गर्नुहोस्" + "यस नम्बरमा कल गर्न सकिँदैन"
diff --git a/java/com/android/dialer/dialpadview/res/values-nl/strings.xml b/java/com/android/dialer/dialpadview/res/values-nl/strings.xml index c7e058409..19911a1fc 100644 --- a/java/com/android/dialer/dialpadview/res/values-nl/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-nl/strings.xml @@ -22,4 +22,18 @@ "backspace" "plus" "voicemail" + "bellen" + "Als je je voicemail wilt bellen, moet je eerst de vliegtuigmodus uitschakelen." + "Voor het instellen van voicemail ga je naar Menu > Instellingen." + "Pauze van 2 seconden toevoegen" + "Wachten toevoegen" + "Toetsenblok voor toetsgeluid gebruiken" + "Terug naar actieve oproep" + "Oproep toevoegen" + "IMEI" + "MEID" + "Laden vanaf simkaart…" + "Contacten op simkaart" + "%s bellen" + "Kan dit nummer niet bellen"
diff --git a/java/com/android/dialer/dialpadview/res/values-no/strings.xml b/java/com/android/dialer/dialpadview/res/values-no/strings.xml index c0756b25d..0f78eb7cf 100644 --- a/java/com/android/dialer/dialpadview/res/values-no/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-no/strings.xml @@ -22,4 +22,18 @@ "tilbaketast" "pluss" "talepost" + "ring" + "Du må slå av flymodus før du kan sjekke talepostkassen." + "For å konfigurere talepostfunksjonen, gå til Meny > Innstillinger." + "Legg til pause på 2 sek." + "Legg til Vent" + "Bruk tonetastatur" + "Gå tilbake til aktiv samtale" + "Nytt anrop" + "IMEI" + "MEID" + "Henter fra SIM-kort …" + "Kontakter på SIM-kort" + "Ring %s" + "Kan ikke ringe dette nummeret"
diff --git a/java/com/android/dialer/dialpadview/res/values-pa/strings.xml b/java/com/android/dialer/dialpadview/res/values-pa/strings.xml index 66378e238..be5dc626f 100644 --- a/java/com/android/dialer/dialpadview/res/values-pa/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-pa/strings.xml @@ -22,4 +22,18 @@ "ਬੈਕਸਪੇਸ" "ਪਲਸ" "ਵੌਇਸਮੇਲ" + "ਡਾਇਲ ਕਰੋ" + "ਵੌਇਸਮੇਲ ਨੂੰ ਕਾਲ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਜਹਾਜ਼ ਮੋਡ ਬੰਦ ਕਰੋ।" + "ਵੌਇਸਮੇਲ ਸਥਾਪਤ ਕਰਨ ਲਈ, ਮੀਨੂ > ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ।" + "2-ਸਕਿੰਟ ਦਾ ਵਿਰਾਮ ਸ਼ਾਮਲ ਕਰੋ" + "ਉਡੀਕ ਦਾ ਸਮਾਂ ਸ਼ਾਮਲ ਕਰੋ" + "ਸਪਰੱਸ਼ ਧੁਨੀ ਕੀ-ਪੈਡ ਵਰਤੋ" + "ਜਾਰੀ ਕਾਲ \'ਤੇ ਵਾਪਸ ਜਾਓ" + "ਕਾਲ ਸ਼ਾਮਲ ਕਰੋ" + "IMEI" + "MEID" + "ਸਿਮ ਕਾਰਡ ਤੋਂ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…" + "ਸਿਮ ਕਾਰਡ ਸੰਪਰਕ" + "%s ਨੂੰ ਕਾਲ ਕਰੋ" + "ਇਸ ਨੰਬਰ \'ਤੇ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"
diff --git a/java/com/android/dialer/dialpadview/res/values-pl/strings.xml b/java/com/android/dialer/dialpadview/res/values-pl/strings.xml index b91c2c3d4..e3045b32f 100644 --- a/java/com/android/dialer/dialpadview/res/values-pl/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-pl/strings.xml @@ -22,4 +22,18 @@ "usuń" "plus" "poczta głosowa" + "wybierz numer" + "Aby połączyć się z pocztą głosową, najpierw wyłącz tryb samolotowy." + "Aby skonfigurować pocztę głosową, kliknij Menu > Ustawienia." + "Dodaj 2-sekundową pauzę" + "Dodaj oczekiwanie" + "Użyj klawiatury tonowej" + "Wróć do aktywnego połączenia" + "Dodaj połączenie" + "IMEI" + "MEID" + "Wczytuję z karty SIM…" + "Kontakty z karty SIM" + "Zadzwoń: %s" + "Nie można zadzwonić pod ten numer"
diff --git a/java/com/android/dialer/dialpadview/res/values-pt-rBR/strings.xml b/java/com/android/dialer/dialpadview/res/values-pt-rBR/strings.xml index f5d6b9767..dc530fbd7 100644 --- a/java/com/android/dialer/dialpadview/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-pt-rBR/strings.xml @@ -22,4 +22,18 @@ "voltar" "mais" "correio de voz" + "discar" + "Para ligar para o correio de voz, primeiro desative o modo avião." + "Para configurar o correio de voz, acesse Menu > Configurações." + "Adicionar pausa de 2 segundos" + "Adicionar espera" + "Usar teclado multifrequencial" + "Retornar para a chamada em espera" + "Adicionar chamada" + "IMEI" + "MEID" + "Carregando do cartão SIM..." + "Contatos do cartão SIM" + "Ligar para %s" + "Não é possível ligar para este número"
diff --git a/java/com/android/dialer/dialpadview/res/values-pt-rPT/strings.xml b/java/com/android/dialer/dialpadview/res/values-pt-rPT/strings.xml index 8d98b07ba..aa3989272 100644 --- a/java/com/android/dialer/dialpadview/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-pt-rPT/strings.xml @@ -22,4 +22,18 @@ "retrocesso" "mais" "mensagem de correio de voz" + "marcar" + "Para efetuar uma chamada para o correio de voz, desative primeiro o modo de avião." + "Para configurar o correio de voz, aceda a Menu > Definições." + "Adicionar pausa de 2 seg." + "Adicionar espera" + "Utilizar teclado numérico com tons de toque" + "Voltar à chamada em curso" + "Adic. cham." + "IMEI" + "MEID" + "A carregar a partir do cartão SIM..." + "Contactos do cartão SIM" + "Telefonar para %s" + "Não é possível ligar para este número"
diff --git a/java/com/android/dialer/dialpadview/res/values-pt/strings.xml b/java/com/android/dialer/dialpadview/res/values-pt/strings.xml index f5d6b9767..dc530fbd7 100644 --- a/java/com/android/dialer/dialpadview/res/values-pt/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-pt/strings.xml @@ -22,4 +22,18 @@ "voltar" "mais" "correio de voz" + "discar" + "Para ligar para o correio de voz, primeiro desative o modo avião." + "Para configurar o correio de voz, acesse Menu > Configurações." + "Adicionar pausa de 2 segundos" + "Adicionar espera" + "Usar teclado multifrequencial" + "Retornar para a chamada em espera" + "Adicionar chamada" + "IMEI" + "MEID" + "Carregando do cartão SIM..." + "Contatos do cartão SIM" + "Ligar para %s" + "Não é possível ligar para este número"
diff --git a/java/com/android/dialer/dialpadview/res/values-ro/strings.xml b/java/com/android/dialer/dialpadview/res/values-ro/strings.xml index 96075062e..87f48361d 100644 --- a/java/com/android/dialer/dialpadview/res/values-ro/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ro/strings.xml @@ -22,4 +22,18 @@ "tasta backspace" "plus" "mesaj vocal" + "apelați" + "Pentru a apela mesageria vocală, mai întâi dezactivați modul Avion." + "Pentru a configura mesageria vocală, accesați Meniu > Setări." + "Adăugați o pauză de 2 secunde" + "Adăugați interval de așteptare" + "Tastatura tactilă cu sunet" + "Reveniți la apelul în curs" + "Adăugați un apel" + "IMEI" + "MEID" + "Se încarcă de pe cardul SIM…" + "Agenda de pe cardul SIM" + "Apelați %s" + "Nu puteți apela acest număr"
diff --git a/java/com/android/dialer/dialpadview/res/values-ru/strings.xml b/java/com/android/dialer/dialpadview/res/values-ru/strings.xml index 5f1721d0b..24dd23c44 100644 --- a/java/com/android/dialer/dialpadview/res/values-ru/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ru/strings.xml @@ -22,4 +22,18 @@ "клавиша Backspace" "плюс" "голосовая почта" + "набор номера" + "Сначала отключите режим полета." + "Чтобы настроить голосовую почту, выберите \"Меню > Настройки\"." + "Добавить двухсекундную паузу" + "Добавить паузу" + "Открыть панель тонального набора" + "Вернуться к текущему вызову" + "Добавить вызов" + "IMEI" + "MEID" + "Загрузка с SIM-карты…" + "Контакты на SIM-карте" + "Позвонить: %s" + "На этот номер нельзя позвонить"
diff --git a/java/com/android/dialer/dialpadview/res/values-si/strings.xml b/java/com/android/dialer/dialpadview/res/values-si/strings.xml index 54ba2d712..f9c65b2a0 100644 --- a/java/com/android/dialer/dialpadview/res/values-si/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-si/strings.xml @@ -22,4 +22,18 @@ "backspace බොත්තම" "ධන" "හඬ තැපෑල" + "අමතන්න" + "හඬ තැපෑල ඇමතීමට, මුලින්ම ගුවන්යානා ප්‍රකාරය වසන්න." + "හඬ තැපෑල පිහිටුවීමට, මෙනුව > සැකසීම් වෙත යන්න." + "තත්පර 2ක විරාමයක් එක් කරන්න" + "රැඳී සිටීම එක් කරන්න" + "ස්පර්ශ නාද යතුරුපෑඩය භාවිතා කරන්න" + "පවතින ඇමතුමට නැවත යන්න" + "ඇමතුම එක් කරන්න" + "IMEI" + "MEID" + "SIM කාඩ්පතෙන් පූරණය කරමින්…" + "SIM කාඩ්පත් සම්බන්ධතා" + "%s අමතන්න" + "මෙම අංකයට ඇමතිය නොහැකිය"
diff --git a/java/com/android/dialer/dialpadview/res/values-sk/strings.xml b/java/com/android/dialer/dialpadview/res/values-sk/strings.xml index ed584ce82..f8d2ae63c 100644 --- a/java/com/android/dialer/dialpadview/res/values-sk/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-sk/strings.xml @@ -22,4 +22,18 @@ "spätné mazanie" "plus" "hlasová správa" + "vytáčanie" + "Ak chcete volať hlasovú schránku, najprv vypnite režim v lietadle." + "Ak chcete nastaviť hlasovú schránku, prejdite na ponuku > Nastavenia." + "Pridať dvojsekundovú pauzu" + "Pridať čakanie" + "Použiť dotykovú tónovú klávesnicu" + "Vrátiť sa k prebiehajúcemu hovoru" + "Pridať hovor" + "IMEI" + "MEID" + "Načítava sa zo SIM karty..." + "Kontakty na SIM karte" + "Volať na číslo %s" + "Na toto číslo sa nedá zavolať"
diff --git a/java/com/android/dialer/dialpadview/res/values-sl/strings.xml b/java/com/android/dialer/dialpadview/res/values-sl/strings.xml index 795a023a7..e406034bb 100644 --- a/java/com/android/dialer/dialpadview/res/values-sl/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-sl/strings.xml @@ -22,4 +22,18 @@ "vračalka" "plus" "sporočilo v odzivniku" + "pokliči" + "Če želite poklicati odzivnik, najprej izklopite način za letalo." + "Če želite nastaviti odzivnik, odprite »Meni« > »Nastavitve«." + "Dodaj 2 sekundi premora" + "Dodaj čakanje" + "Uporabi številčnico za tonsko izbiranje" + "Nazaj na klic, ki poteka" + "Dodaj klic" + "IMEI" + "MEID" + "Nalaganje s kartice SIM …" + "Stiki na kartici SIM" + "Pokliči %s" + "Te številke ni mogoče poklicati"
diff --git a/java/com/android/dialer/dialpadview/res/values-sq/strings.xml b/java/com/android/dialer/dialpadview/res/values-sq/strings.xml index 7eb6af5c6..fd112593d 100644 --- a/java/com/android/dialer/dialpadview/res/values-sq/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-sq/strings.xml @@ -22,4 +22,18 @@ "kthim prapa" "plus" "postë zanore" + "formo numrin" + "Për të telefonuar postën zanore, në fillim çaktivizo modalitetin \"në aeroplan\"." + "Për të konfiguruar postën zanore, shko te \"Menyja\" > \"Cilësimet\"." + "Shto një ndërprerje 2-sekondëshe" + "Shto një pritje" + "Përdor bllokun e tasteve me prekje" + "Kthehu te telefonata në vazhdim" + "Shto telefonatë" + "IMEI" + "MEID" + "Po ngarkon nga karta SIM…" + "Kontaktet e kartës SIM" + "Telefono %s" + "Ky numër nuk mund të telefonohet"
diff --git a/java/com/android/dialer/dialpadview/res/values-sr/strings.xml b/java/com/android/dialer/dialpadview/res/values-sr/strings.xml index fc9d941c9..706881309 100644 --- a/java/com/android/dialer/dialpadview/res/values-sr/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-sr/strings.xml @@ -22,4 +22,18 @@ "backspace" "плус" "говорна пошта" + "бирајте број" + "Да бисте позвали говорну пошту, прво искључите режим рада у авиону." + "Да бисте подесили говорну пошту, идите у Мени > Подешавања." + "Додај паузу од 2 секунде" + "Додај чекање" + "Користи тастатуру за тонско бирање" + "Назад у позив који је у току" + "Додај позив" + "IMEI" + "MEID" + "Учитава се са SIM картице…" + "Контакти на SIM картици" + "Позови %s" + "Није могуће позвати овај број"
diff --git a/java/com/android/dialer/dialpadview/res/values-sv/strings.xml b/java/com/android/dialer/dialpadview/res/values-sv/strings.xml index 7554b522f..00524a89d 100644 --- a/java/com/android/dialer/dialpadview/res/values-sv/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-sv/strings.xml @@ -22,4 +22,18 @@ "backsteg" "plus" "röstbrevlåda" + "ring" + "Om du vill ringa röstbrevlådan måste du först inaktivera flygplansläget." + "Välj Meny > Inställningar om du vill konfigurera röstbrevlådan." + "Lägg till en paus på 2 sek." + "Lägg till väntetid" + "Använd tonvalstelefon" + "Återvänd till pågående samtal" + "Lägg till samtal" + "IMEI-kod" + "MEID" + "Läser in från SIM-kort …" + "Kontakter från SIM-kort" + "Ring %s" + "Det går inte att ringa det här numret"
diff --git a/java/com/android/dialer/dialpadview/res/values-sw/strings.xml b/java/com/android/dialer/dialpadview/res/values-sw/strings.xml index 84479f0fa..98ed9cea8 100644 --- a/java/com/android/dialer/dialpadview/res/values-sw/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-sw/strings.xml @@ -22,4 +22,18 @@ "nafasi ya nyuma" "jumlisha" "ujumbe wa sauti" + "piga simu" + "Ili usikilize ujumbe wa sauti, kwanza zima Hali ya Ndegeni." + "Ili uweke mipangilio ya ujumbe wa sauti, nenda kwenye Menyu > Mipangilio." + "Ongeza usitishaji wa sekunde 2" + "Ongeza muda wa kusubiri" + "Tumia kibao cha kuchapa cha sauti na kugusa" + "Rudi kwenye simu inayoendelea" + "Ongeza simu" + "IMEI" + "MEID" + "Inapakia kutoka kwenye SIM kadi…" + "Anwani za SIM kadi" + "Piga simu %s" + "Haiwezi kupiga simu kwa nambari hii"
diff --git a/java/com/android/dialer/dialpadview/res/values-ta/strings.xml b/java/com/android/dialer/dialpadview/res/values-ta/strings.xml index aad784b58..667010db6 100644 --- a/java/com/android/dialer/dialpadview/res/values-ta/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ta/strings.xml @@ -22,4 +22,18 @@ "பேக்ஸ்பேஸ்" "பிளஸ்" "குரலஞ்சல்" + "டயல் பொத்தான்" + "குரலஞ்சலை அழைக்க, முதலில் விமானப் பயன்முறையை முடக்கவும்." + "குரலஞ்சலை அமைக்க, மெனு > அமைப்புகள் என்பதற்குச் செல்லவும்." + "2 வினாடி இடைநிறுத்தத்தைச் சேர்" + "காத்திருப்பைச் சேர்" + "டச் டோன் விசைத்தளத்தைப் பயன்படுத்து" + "செயலிலுள்ள அழைப்பிற்குத் திரும்பு" + "அழைப்பைச் சேர்" + "IMEI" + "MEID" + "சிம் கார்டிலிருந்து ஏற்றுகிறது…" + "சிம் கார்டு தொடர்புகள்" + "%s எண்ணை அழை" + "இந்த எண்ணை அழைக்க முடியாது"
diff --git a/java/com/android/dialer/dialpadview/res/values-te/strings.xml b/java/com/android/dialer/dialpadview/res/values-te/strings.xml index eced150a0..5e24667aa 100644 --- a/java/com/android/dialer/dialpadview/res/values-te/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-te/strings.xml @@ -22,4 +22,18 @@ "బ్యాక్‌స్పేస్" "కూడిక" "వాయిస్ మెయిల్" + "డయల్ చేయండి" + "వాయిస్ మెయిల్ కాల్ చేయడానికి, మొదట విమానం మోడ్‌ను ఆపివేయండి." + "వాయిస్ మెయిల్ సెటప్ చేయడానికి, మెను > సెట్టింగ్‌లకు వెళ్లండి." + "2-సెకన్ల పాజ్‌ను జోడించండి" + "నిరీక్షణ సమయాన్ని జోడించండి" + "టచ్ టోన్ కీప్యాడ్‌ను ఉపయోగించండి" + "ప్రస్తుతం నడుస్తున్న కాల్‌కు తిరిగి వెళ్లండి" + "కాల్ జోడించండి" + "IMEI" + "MEID" + "సిమ్ కార్డు నుండి లోడ్ చేస్తోంది…" + "SIM కార్డ్ పరిచయాలు" + "%sకు కాల్ చేయండి" + "ఈ నంబర్‌కు కాల్ చేయలేరు"
diff --git a/java/com/android/dialer/dialpadview/res/values-th/strings.xml b/java/com/android/dialer/dialpadview/res/values-th/strings.xml index db2c4959e..bb4cabd70 100644 --- a/java/com/android/dialer/dialpadview/res/values-th/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-th/strings.xml @@ -22,4 +22,18 @@ "ลบถอยหลัง" "บวก" "ข้อความเสียง" + "หมุนหมายเลข" + "หากต้องการฟังข้อความเสียง ให้ปิดโหมดใช้งานบนเครื่องบินก่อน" + "หากต้องการตั้งค่าข้อความเสียง ให้ไปที่เมนู > การตั้งค่า" + "เพิ่มช่วงคั่น 2 วินาที" + "เพิ่มการรอ" + "ใช้ปุ่มกดสัญญาณเสียง" + "กลับไปคุยสายต่อ" + "เพิ่มการโทร" + "IMEI" + "MEID" + "กำลังโหลดจากซิมการ์ด…" + "รายชื่อติดต่อในซิมการ์ด" + "โทร %s" + "ไม่สามารถโทรไปยังหมายเลขนี้"
diff --git a/java/com/android/dialer/dialpadview/res/values-tl/strings.xml b/java/com/android/dialer/dialpadview/res/values-tl/strings.xml index 223f81e06..d23823e16 100644 --- a/java/com/android/dialer/dialpadview/res/values-tl/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-tl/strings.xml @@ -22,4 +22,18 @@ "backspace" "plus" "voicemail" + "mag-dial" + "Upang tumawag sa voicemail, i-off muna ang Airplane mode." + "Upang mag-set up ng voicemail, pumunta sa Menu > Mga Setting." + "Magdagdag ng pag-pause na 2-seg" + "Magdagdag ng paghihintay" + "Gumamit ng touch tone na keypad" + "Bumalik sa kasalukuyang tawag" + "Magdagdag ng tawag" + "IMEI" + "MEID" + "Naglo-load mula sa SIM card…" + "Mga contact sa SIM card" + "Tawagan ang %s" + "Hindi matawagan ang numerong ito"
diff --git a/java/com/android/dialer/dialpadview/res/values-tr/strings.xml b/java/com/android/dialer/dialpadview/res/values-tr/strings.xml index ae8151178..b7b85013c 100644 --- a/java/com/android/dialer/dialpadview/res/values-tr/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-tr/strings.xml @@ -22,4 +22,18 @@ "geri tuşu" "artı" "sesli mesaj" + "telefonu arar" + "Sesli mesajı aramak için öncelikle Uçak modunu kapatın." + "Sesli mesajı yapılandırmak için Menü > Ayarlar\'a gidin." + "2 saniyelik duraklama ekle" + "Bekleme ekle" + "Telefon tuş takımını kullan" + "Devam eden çağrıya dön" + "Çağrı ekle" + "IMEI" + "MEID" + "SIM karttan yükleniyor…" + "SIM kart kişileri" + "Telefon et: %s" + "Bu numara aranamaz"
diff --git a/java/com/android/dialer/dialpadview/res/values-uk/strings.xml b/java/com/android/dialer/dialpadview/res/values-uk/strings.xml index 7841c4ca6..c862fcedf 100644 --- a/java/com/android/dialer/dialpadview/res/values-uk/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-uk/strings.xml @@ -22,4 +22,18 @@ "видалення символів перед курсором" "плюс" "голосова пошта" + "дзвонити" + "Щоб перевірити голосову пошту, спочатку вимкніть режим польоту." + "Щоб налаштувати голосову пошту, перейдіть у Меню > Налаштування." + "Додати 2-секундну паузу" + "Додати паузу" + "Використовувати тональний набір" + "Повернутися до поточного виклику" + "Додати виклик" + "IMEI" + "MEID" + "Завантаження із SIM-карти…" + "Контакти із SIM-карти" + "Зателефонувати на номер %s" + "Не можна телефонувати на цей номер"
diff --git a/java/com/android/dialer/dialpadview/res/values-ur/strings.xml b/java/com/android/dialer/dialpadview/res/values-ur/strings.xml index 6a537be9b..a7db8ec2b 100644 --- a/java/com/android/dialer/dialpadview/res/values-ur/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-ur/strings.xml @@ -22,4 +22,18 @@ "بیک اسپیس" "جمع" "صوتی میل" + "ڈائل کریں" + "صوتی میل کو کال کرنے کیلئے، پہلے ہوائی جہاز طرز آف کریں۔" + "صوتی میل سیٹ کرنے کے لئے، مینو > ترتیبات میں جائیں۔" + "2 سیکنڈ کا توقف شامل کریں" + "انتظار شامل کریں" + "ٹچ ٹون کی پیڈ کا استعمال کریں" + "جاری کال پر واپس لوٹیں" + "کال شامل کریں" + "IMEI" + "MEID" + "‏SIM کارڈ سے لوڈ ہو رہا ہے…" + "‏SIM کارڈ کے رابطے" + "%s کو کال کریں" + "اس نمبر پر کال نہیں کر سکتے"
diff --git a/java/com/android/dialer/dialpadview/res/values-uz/strings.xml b/java/com/android/dialer/dialpadview/res/values-uz/strings.xml index 6985893d7..2230c2c1e 100644 --- a/java/com/android/dialer/dialpadview/res/values-uz/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-uz/strings.xml @@ -22,4 +22,18 @@ "orqaga" "qo‘shuv belgisi" "ovozli pochta" + "raqam terish" + "Ovozli pochtaga qo‘ng‘iroq qilish uchun parvoz rejimidan chiqing." + "Ovozli pochtani sozlab olish uchun Menyu > Sozlamalarga o‘ting." + "2 soniyalik pauza qo‘shish" + "Pauza qo‘shish" + "Tovushli raqam tergichni ochish" + "Davom etayotgan chaqiruvga qaytish" + "Chaqiruv qo‘shish" + "IMEI" + "MEID" + "SIM kartadan yuklanmoqda…" + "SIM kartadagi kontaktlar" + "%s raqamiga qo‘ng‘iroq qilish" + "Bu raqamga qo‘ng‘iroq qilib bo‘lmaydi"
diff --git a/java/com/android/dialer/dialpadview/res/values-vi/strings.xml b/java/com/android/dialer/dialpadview/res/values-vi/strings.xml index e68a0b5da..5022e79ec 100644 --- a/java/com/android/dialer/dialpadview/res/values-vi/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-vi/strings.xml @@ -22,4 +22,18 @@ "phím lùi" "cộng" "thư thoại" + "quay số" + "Để gọi thư thoại, trước tiên hãy tắt Chế độ trên máy bay." + "Để thiết lập thư thoại, hãy đi tới Menu > Cài đặt." + "Thêm tạm dừng 2 giây" + "Thêm chờ" + "Sử dụng bàn phím số cảm ứng có âm" + "Quay lại cuộc gọi đang thực hiện" + "Thêm cuộc gọi" + "IMEI" + "MEID" + "Đang tải từ thẻ SIM…" + "Danh bạ trên thẻ SIM" + "Gọi %s" + "Không thể gọi số này"
diff --git a/java/com/android/dialer/dialpadview/res/values-zh-rCN/strings.xml b/java/com/android/dialer/dialpadview/res/values-zh-rCN/strings.xml index 262362dd9..8d50e8ec3 100644 --- a/java/com/android/dialer/dialpadview/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-zh-rCN/strings.xml @@ -22,4 +22,18 @@ "删除" "加号" "语音邮件" + "拨号" + "要呼叫语音信箱,请先关闭飞行模式。" + "要设置语音信箱,请转到“菜单”>“设置”。" + "加入 2 秒暂停时间" + "加入等待时间" + "使用按键式键盘" + "返回正在进行的通话" + "添加通话" + "IMEI" + "MEID" + "正从 SIM 卡中加载…" + "SIM 卡联系人" + "拨打 %s" + "无法拨打此号码"
diff --git a/java/com/android/dialer/dialpadview/res/values-zh-rHK/strings.xml b/java/com/android/dialer/dialpadview/res/values-zh-rHK/strings.xml index e7bc60682..320217b3e 100644 --- a/java/com/android/dialer/dialpadview/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-zh-rHK/strings.xml @@ -22,4 +22,18 @@ "退格鍵" "加號" "留言" + "撥號" + "如要致電留言信箱,請先關閉飛行模式。" + "如要設定留言信箱,請移至 [選單] > [設定]。" + "新增 2 秒暫停功能" + "新增插播" + "使用觸控音頻鍵盤" + "返回進行中的通話" + "新增通話" + "IMEI" + "MEID" + "正在從 SIM 卡載入…" + "SIM 卡聯絡人" + "撥打 %s" + "無法撥打此號碼"
diff --git a/java/com/android/dialer/dialpadview/res/values-zh-rTW/strings.xml b/java/com/android/dialer/dialpadview/res/values-zh-rTW/strings.xml index 21d2b8b1b..b87048f3c 100644 --- a/java/com/android/dialer/dialpadview/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-zh-rTW/strings.xml @@ -22,4 +22,18 @@ "Backspace 鍵" "加號" "語音留言" + "撥號" + "如要撥打語音信箱聽取留言,請先關閉飛航模式。" + "如要設定語音信箱,請依序前往 [選單] > [設定]。" + "新增 2 秒暫停功能" + "新增插播功能" + "使用觸控音鍵盤" + "返回進行中的通話" + "新增通話" + "IMEI" + "MEID" + "正在從 SIM 卡載入…" + "SIM 卡聯絡人" + "撥打 %s" + "無法撥打這個號碼"
diff --git a/java/com/android/dialer/dialpadview/res/values-zu/strings.xml b/java/com/android/dialer/dialpadview/res/values-zu/strings.xml index 458781f4a..6b1c5f5d7 100644 --- a/java/com/android/dialer/dialpadview/res/values-zu/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values-zu/strings.xml @@ -22,4 +22,18 @@ "i-backspace" "hlanganisa" "ivoyisimeyili" + "dayela" + "Ukushayela i-voicemail, vala kuqala imodi Yendiza." + "Ukuya emyalezweni wephimbo, yana ezisethweni > zemenyu." + "Faka ukumisa okwesikhashana kwamasekhondi angu-2" + "Yengeza ukulinda" + "Sebenzisa ikhiphedi yethoni yokuthinta" + "Buyela kukholi eqhubekayo" + "Engeza ikholi" + "IMEI" + "MEID" + "Ilayisha kusuka ekhadini le-SIM..." + "Othintana nabo bekhadi le-SIM" + "Shayela %s" + "Ayikwazi ukushayela le nombolo" diff --git a/java/com/android/dialer/dialpadview/res/values/colors.xml b/java/com/android/dialer/dialpadview/res/values/colors.xml index d27468db7..8bea35710 100644 --- a/java/com/android/dialer/dialpadview/res/values/colors.xml +++ b/java/com/android/dialer/dialpadview/res/values/colors.xml @@ -17,11 +17,9 @@ #fcfcfc - #ececec @color/dialer_theme_color #737373 #333 - #dadada #89000000 #919191 diff --git a/java/com/android/dialer/dialpadview/res/values/dimens.xml b/java/com/android/dialer/dialpadview/res/values/dimens.xml index 210c81697..1e5880a3e 100644 --- a/java/com/android/dialer/dialpadview/res/values/dimens.xml +++ b/java/com/android/dialer/dialpadview/res/values/dimens.xml @@ -16,7 +16,7 @@ - 36sp + 36dp 12sp 23sp 36sp @@ -25,17 +25,13 @@ 1dp 13dp - 18sp - 5dp 34sp 24sp 60dp 16dp 8dp 10dp - 3dp - 2dp - 2dp + 18dp 100dp 8dp 14dp @@ -45,4 +41,7 @@ 10dp + + + 10dp diff --git a/java/com/android/dialer/dialpadview/res/values/strings.xml b/java/com/android/dialer/dialpadview/res/values/strings.xml index 920e6e25c..b3e92f1d9 100644 --- a/java/com/android/dialer/dialpadview/res/values/strings.xml +++ b/java/com/android/dialer/dialpadview/res/values/strings.xml @@ -14,7 +14,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> - + * # @@ -50,4 +50,61 @@ --> voicemail + + dial + + + To call voicemail, first turn off Airplane mode. + + + To set up voicemail, go to Menu > Settings. + + + Add 2-sec pause + Add wait + + + Use touch tone keypad + + + Return to call in progress + + + Add call + + + IMEI + + + MEID + + + Loading from SIM card\u2026 + + + SIM card contacts + + + Call %s + + + + + + + Can\'t call this number diff --git a/java/com/android/dialer/enrichedcall/EnrichedCallCapabilities.java b/java/com/android/dialer/enrichedcall/EnrichedCallCapabilities.java index c3c78c9c8..32054e8d1 100644 --- a/java/com/android/dialer/enrichedcall/EnrichedCallCapabilities.java +++ b/java/com/android/dialer/enrichedcall/EnrichedCallCapabilities.java @@ -22,18 +22,53 @@ import com.google.auto.value.AutoValue; @AutoValue public abstract class EnrichedCallCapabilities { - public static final EnrichedCallCapabilities NO_CAPABILITIES = - EnrichedCallCapabilities.create(false, false, false); + public static final EnrichedCallCapabilities NO_CAPABILITIES = builder().build(); - public static EnrichedCallCapabilities create( - boolean supportsCallComposer, boolean supportsPostCall, boolean supportsVideoCall) { - return new AutoValue_EnrichedCallCapabilities( - supportsCallComposer, supportsPostCall, supportsVideoCall); + public static final EnrichedCallCapabilities ALL_CAPABILITIES = + builder() + .setCallComposerCapable(true) + .setPostCallCapable(true) + .setVideoShareCapable(true) + .build(); + + public abstract boolean isCallComposerCapable(); + + public abstract boolean isPostCallCapable(); + + public abstract boolean isVideoShareCapable(); + + public abstract Builder toBuilder(); + + /** + * Returns {@code true} if these capabilities represent those of a user that is temporarily + * unavailable. This is an indication that capabilities should be refreshed. + */ + public abstract boolean isTemporarilyUnavailable(); + + /** + * Creates an instance of {@link Builder}. + * + *

Unless otherwise set, all fields will default to false. + */ + public static Builder builder() { + return new AutoValue_EnrichedCallCapabilities.Builder() + .setCallComposerCapable(false) + .setPostCallCapable(false) + .setVideoShareCapable(false) + .setTemporarilyUnavailable(false); } - public abstract boolean supportsCallComposer(); + /** Creates instances of {@link EnrichedCallCapabilities}. */ + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder setCallComposerCapable(boolean isCapable); + + public abstract Builder setPostCallCapable(boolean isCapable); - public abstract boolean supportsPostCall(); + public abstract Builder setVideoShareCapable(boolean isCapable); - public abstract boolean supportsVideoShare(); + public abstract Builder setTemporarilyUnavailable(boolean temporarilyUnavailable); + + public abstract EnrichedCallCapabilities build(); + } } diff --git a/java/com/android/dialer/enrichedcall/EnrichedCallManager.java b/java/com/android/dialer/enrichedcall/EnrichedCallManager.java index 0d3ed9e43..0606a00e5 100644 --- a/java/com/android/dialer/enrichedcall/EnrichedCallManager.java +++ b/java/com/android/dialer/enrichedcall/EnrichedCallManager.java @@ -16,7 +16,6 @@ package com.android.dialer.enrichedcall; -import android.support.annotation.IntDef; import android.support.annotation.MainThread; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -24,9 +23,8 @@ import com.android.dialer.calldetails.CallDetailsEntries; import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; import com.android.dialer.enrichedcall.historyquery.proto.HistoryResult; import com.android.dialer.enrichedcall.videoshare.VideoShareListener; +import com.android.dialer.enrichedcall.videoshare.VideoShareSession; import com.android.dialer.multimedia.MultimediaData; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.List; import java.util.Map; @@ -81,27 +79,6 @@ public interface EnrichedCallManager { @MainThread void clearCachedData(); - /** Possible states for call composer sessions. */ - @Retention(RetentionPolicy.SOURCE) - @IntDef({ - STATE_NONE, - STATE_STARTING, - STATE_STARTED, - STATE_START_FAILED, - STATE_MESSAGE_SENT, - STATE_MESSAGE_FAILED, - STATE_CLOSED, - }) - @interface State {} - - int STATE_NONE = 0; - int STATE_STARTING = STATE_NONE + 1; - int STATE_STARTED = STATE_STARTING + 1; - int STATE_START_FAILED = STATE_STARTED + 1; - int STATE_MESSAGE_SENT = STATE_START_FAILED + 1; - int STATE_MESSAGE_FAILED = STATE_MESSAGE_SENT + 1; - int STATE_CLOSED = STATE_MESSAGE_FAILED + 1; - /** * Starts a call composer session with the given remote number. * @@ -119,7 +96,7 @@ public interface EnrichedCallManager { * @param sessionId the id for the session. See {@link #startCallComposerSession(String)} * @param data the {@link MultimediaData} * @throws IllegalArgumentException if there's no open session with the given number - * @throws IllegalStateException if the session isn't in the {@link #STATE_STARTED} state + * @throws IllegalStateException if the session isn't in the {@link Session#STATE_STARTED} state */ @MainThread void sendCallComposerData(long sessionId, @NonNull MultimediaData data); @@ -185,12 +162,49 @@ public interface EnrichedCallManager { @Nullable Session getSession(long sessionId); + /** + * Returns a list containing viewable string representations of all existing sessions. + * + *

Intended for debug display purposes only. + */ + @MainThread + @NonNull + List getAllSessionsForDisplay(); + @NonNull Filter createIncomingCallComposerFilter(); @NonNull Filter createOutgoingCallComposerFilter(); + /** Receives updates when the state of an historical data changes. */ + interface HistoricalDataChangedListener { + + /** + * Callback fired when historical data changes. Listeners should call {@link + * #getAllHistoricalData(String, CallDetailsEntries)} to retrieve the new data. + */ + void onHistoricalDataChanged(); + } + + /** + * Registers the given {@link HistoricalDataChangedListener}. + * + *

As a result of this method, the listener will receive updates when the state of any enriched + * call historical data changes. + */ + @MainThread + void registerHistoricalDataChangedListener(@NonNull HistoricalDataChangedListener listener); + + /** + * Unregisters the given {@link HistoricalDataChangedListener}. + * + *

As a result of this method, the listener will not receive updates when the state of enriched + * call historical data changes. + */ + @MainThread + void unregisterHistoricalDataChangedListener(@NonNull HistoricalDataChangedListener listener); + /** * Starts an asynchronous process to get all historical data for the given number and set of * {@link CallDetailsEntries}. @@ -212,6 +226,10 @@ public interface EnrichedCallManager { Map> getAllHistoricalData( @NonNull String number, @NonNull CallDetailsEntries entries); + /** Returns true if any enriched calls have been made or received. */ + @MainThread + boolean hasStoredData(); + /** * Unregisters the given {@link StateChangedListener}. * @@ -309,6 +327,14 @@ public interface EnrichedCallManager { @MainThread long getVideoShareInviteSessionId(@NonNull String number); + /** + * Returns the {@link VideoShareSession} for the given sessionId, or {@code null} if no session + * exists. + */ + @MainThread + @Nullable + VideoShareSession getVideoShareSession(long sessionId); + /** * Ends the given video share session. * diff --git a/java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java b/java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java index 250c64313..6f4d97521 100644 --- a/java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java +++ b/java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java @@ -16,20 +16,50 @@ package com.android.dialer.enrichedcall; import android.support.annotation.NonNull; -import com.android.dialer.common.Assert; /** Utility for comparing phone numbers. */ public class FuzzyPhoneNumberMatcher { - /** Returns {@code true} if the given numbers can be interpreted to be the same. */ - public static boolean matches(@NonNull String a, @NonNull String b) { - String aNormalized = Assert.isNotNull(a).replaceAll("[^0-9]", ""); - String bNormalized = Assert.isNotNull(b).replaceAll("[^0-9]", ""); - if (aNormalized.length() < 7 || bNormalized.length() < 7) { - return false; + private static final int REQUIRED_MATCHED_DIGITS = 7; + + /** + * Returns {@code true} if the given numbers can be interpreted to be the same. + * + *

This method is called numerous times when rendering the call log. Using string methods is + * too slow, so character by character matching is used instead. + */ + public static boolean matches(@NonNull String lhs, @NonNull String rhs) { + return lastSevenDigitsCharacterByCharacterMatches(lhs, rhs); + } + + /** + * This strategy examines the numbers character by character starting from the end. If the last + * {@link #REQUIRED_MATCHED_DIGITS} match, it returns {@code true}. + */ + private static boolean lastSevenDigitsCharacterByCharacterMatches( + @NonNull String lhs, @NonNull String rhs) { + int lhsIndex = lhs.length() - 1; + int rhsIndex = rhs.length() - 1; + + int matchedDigits = 0; + + while (lhsIndex >= 0 && rhsIndex >= 0) { + if (!Character.isDigit(lhs.charAt(lhsIndex))) { + --lhsIndex; + continue; + } + if (!Character.isDigit(rhs.charAt(rhsIndex))) { + --rhsIndex; + continue; + } + if (lhs.charAt(lhsIndex) != rhs.charAt(rhsIndex)) { + break; + } + --lhsIndex; + --rhsIndex; + ++matchedDigits; } - String aMatchable = aNormalized.substring(aNormalized.length() - 7); - String bMatchable = bNormalized.substring(bNormalized.length() - 7); - return aMatchable.equals(bMatchable); + + return matchedDigits >= REQUIRED_MATCHED_DIGITS; } } diff --git a/java/com/android/dialer/enrichedcall/Session.java b/java/com/android/dialer/enrichedcall/Session.java index b3f291438..06837e399 100644 --- a/java/com/android/dialer/enrichedcall/Session.java +++ b/java/com/android/dialer/enrichedcall/Session.java @@ -16,14 +16,37 @@ package com.android.dialer.enrichedcall; +import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.android.dialer.enrichedcall.EnrichedCallManager.State; import com.android.dialer.multimedia.MultimediaData; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** Holds state information and data about enriched calling sessions. */ public interface Session { + /** Possible states for call composer sessions. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + STATE_NONE, + STATE_STARTING, + STATE_STARTED, + STATE_START_FAILED, + STATE_MESSAGE_SENT, + STATE_MESSAGE_FAILED, + STATE_CLOSED, + }) + @interface State {} + + int STATE_NONE = 0; + int STATE_STARTING = STATE_NONE + 1; + int STATE_STARTED = STATE_STARTING + 1; + int STATE_START_FAILED = STATE_STARTED + 1; + int STATE_MESSAGE_SENT = STATE_START_FAILED + 1; + int STATE_MESSAGE_FAILED = STATE_MESSAGE_SENT + 1; + int STATE_CLOSED = STATE_MESSAGE_FAILED + 1; + /** Id used for sessions that fail to start. */ long NO_SESSION_ID = -1; diff --git a/java/com/android/dialer/enrichedcall/extensions/StateExtension.java b/java/com/android/dialer/enrichedcall/extensions/StateExtension.java index 8a4f6409d..5d90829c3 100644 --- a/java/com/android/dialer/enrichedcall/extensions/StateExtension.java +++ b/java/com/android/dialer/enrichedcall/extensions/StateExtension.java @@ -18,8 +18,8 @@ package com.android.dialer.enrichedcall.extensions; import android.support.annotation.NonNull; import com.android.dialer.common.Assert; -import com.android.dialer.enrichedcall.EnrichedCallManager; -import com.android.dialer.enrichedcall.EnrichedCallManager.State; +import com.android.dialer.enrichedcall.Session; +import com.android.dialer.enrichedcall.Session.State; /** Extends the {@link State} to include a toString method. */ public class StateExtension { @@ -27,25 +27,25 @@ public class StateExtension { /** Returns the string representation for the given {@link State}. */ @NonNull public static String toString(@State int callComposerState) { - if (callComposerState == EnrichedCallManager.STATE_NONE) { + if (callComposerState == Session.STATE_NONE) { return "STATE_NONE"; } - if (callComposerState == EnrichedCallManager.STATE_STARTING) { + if (callComposerState == Session.STATE_STARTING) { return "STATE_STARTING"; } - if (callComposerState == EnrichedCallManager.STATE_STARTED) { + if (callComposerState == Session.STATE_STARTED) { return "STATE_STARTED"; } - if (callComposerState == EnrichedCallManager.STATE_START_FAILED) { + if (callComposerState == Session.STATE_START_FAILED) { return "STATE_START_FAILED"; } - if (callComposerState == EnrichedCallManager.STATE_MESSAGE_SENT) { + if (callComposerState == Session.STATE_MESSAGE_SENT) { return "STATE_MESSAGE_SENT"; } - if (callComposerState == EnrichedCallManager.STATE_MESSAGE_FAILED) { + if (callComposerState == Session.STATE_MESSAGE_FAILED) { return "STATE_MESSAGE_FAILED"; } - if (callComposerState == EnrichedCallManager.STATE_CLOSED) { + if (callComposerState == Session.STATE_CLOSED) { return "STATE_CLOSED"; } Assert.checkArgument(false, "Unexpected callComposerState: %d", callComposerState); diff --git a/java/com/android/dialer/enrichedcall/historyquery/proto/history_result.proto b/java/com/android/dialer/enrichedcall/historyquery/proto/history_result.proto index 62d013a46..8efb35cc1 100644 --- a/java/com/android/dialer/enrichedcall/historyquery/proto/history_result.proto +++ b/java/com/android/dialer/enrichedcall/historyquery/proto/history_result.proto @@ -4,6 +4,7 @@ option java_package = "com.android.dialer.enrichedcall.historyquery.proto"; option java_multiple_files = true; option optimize_for = LITE_RUNTIME; + package com.android.dialer.enrichedcall.historyquery.proto; // Holds data that was used in an enrichedcall in the past diff --git a/java/com/android/dialer/enrichedcall/simulator/AndroidManifest.xml b/java/com/android/dialer/enrichedcall/simulator/AndroidManifest.xml new file mode 100644 index 000000000..003ff19d5 --- /dev/null +++ b/java/com/android/dialer/enrichedcall/simulator/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + diff --git a/java/com/android/dialer/enrichedcall/simulator/EnrichedCallSimulatorActivity.java b/java/com/android/dialer/enrichedcall/simulator/EnrichedCallSimulatorActivity.java new file mode 100644 index 000000000..bbc1ada6f --- /dev/null +++ b/java/com/android/dialer/enrichedcall/simulator/EnrichedCallSimulatorActivity.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.enrichedcall.simulator; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.enrichedcall.EnrichedCallComponent; +import com.android.dialer.enrichedcall.EnrichedCallManager; +import com.android.dialer.enrichedcall.EnrichedCallManager.StateChangedListener; + +/** + * Activity used to display Enriched call sessions that are currently in memory, and create new + * outgoing sessions with various bits of data. + * + *

This activity will dynamically refresh as new sessions are added or updated, but there's no + * update when sessions are deleted from memory. Use the refresh button to update the view. + */ +public class EnrichedCallSimulatorActivity extends AppCompatActivity + implements StateChangedListener, OnClickListener { + + public static Intent newIntent(@NonNull Context context) { + return new Intent(Assert.isNotNull(context), EnrichedCallSimulatorActivity.class); + } + + private Button refreshButton; + + private SessionsAdapter sessionsAdapter; + + @Override + protected void onCreate(@Nullable Bundle bundle) { + LogUtil.enterBlock("EnrichedCallSimulatorActivity.onCreate"); + super.onCreate(bundle); + setContentView(R.layout.enriched_call_simulator_activity); + Toolbar toolbar = findViewById(R.id.toolbar); + toolbar.setTitle(R.string.enriched_call_simulator_activity); + + refreshButton = findViewById(R.id.refresh); + refreshButton.setOnClickListener(this); + + RecyclerView recyclerView = findViewById(R.id.sessions_recycler_view); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + + sessionsAdapter = new SessionsAdapter(); + sessionsAdapter.setSessionStrings(getEnrichedCallManager().getAllSessionsForDisplay()); + recyclerView.setAdapter(sessionsAdapter); + } + + @Override + protected void onResume() { + LogUtil.enterBlock("EnrichedCallSimulatorActivity.onResume"); + super.onResume(); + getEnrichedCallManager().registerStateChangedListener(this); + } + + @Override + protected void onPause() { + LogUtil.enterBlock("EnrichedCallSimulatorActivity.onPause"); + super.onPause(); + getEnrichedCallManager().unregisterStateChangedListener(this); + } + + @Override + public void onEnrichedCallStateChanged() { + LogUtil.enterBlock("EnrichedCallSimulatorActivity.onEnrichedCallStateChanged"); + refreshSessions(); + } + + @Override + public void onClick(View v) { + if (v == refreshButton) { + LogUtil.i("EnrichedCallSimulatorActivity.onClick", "refreshing sessions"); + refreshSessions(); + } + } + + private void refreshSessions() { + sessionsAdapter.setSessionStrings(getEnrichedCallManager().getAllSessionsForDisplay()); + sessionsAdapter.notifyDataSetChanged(); + } + + private EnrichedCallManager getEnrichedCallManager() { + return EnrichedCallComponent.get(this).getEnrichedCallManager(); + } +} diff --git a/java/com/android/dialer/enrichedcall/simulator/SessionViewHolder.java b/java/com/android/dialer/enrichedcall/simulator/SessionViewHolder.java new file mode 100644 index 000000000..44431253d --- /dev/null +++ b/java/com/android/dialer/enrichedcall/simulator/SessionViewHolder.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.enrichedcall.simulator; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.TextView; + +/** ViewHolder for an Enriched call session. */ +class SessionViewHolder extends RecyclerView.ViewHolder { + + private final TextView sessionStringView; + + SessionViewHolder(View view) { + super(view); + sessionStringView = view.findViewById(R.id.session_string); + } + + void updateSession(@NonNull String sessionString) { + sessionStringView.setText(sessionString); + } +} diff --git a/java/com/android/dialer/enrichedcall/simulator/SessionsAdapter.java b/java/com/android/dialer/enrichedcall/simulator/SessionsAdapter.java new file mode 100644 index 000000000..25edfc7dd --- /dev/null +++ b/java/com/android/dialer/enrichedcall/simulator/SessionsAdapter.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.enrichedcall.simulator; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import com.android.dialer.common.Assert; +import java.util.List; + +/** Adapter for the RecyclerView in {@link EnrichedCallSimulatorActivity}. */ +class SessionsAdapter extends RecyclerView.Adapter { + + /** List of the string representation of all in-memory sessions */ + private List sessionStrings; + + void setSessionStrings(@NonNull List sessionStrings) { + this.sessionStrings = Assert.isNotNull(sessionStrings); + } + + @Override + public SessionViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); + return new SessionViewHolder(inflater.inflate(R.layout.session_view_holder, viewGroup, false)); + } + + @Override + public void onBindViewHolder(SessionViewHolder viewHolder, int i) { + viewHolder.updateSession(sessionStrings.get(i)); + } + + @Override + public int getItemCount() { + return sessionStrings.size(); + } +} diff --git a/java/com/android/dialer/enrichedcall/simulator/res/layout/enriched_call_simulator_activity.xml b/java/com/android/dialer/enrichedcall/simulator/res/layout/enriched_call_simulator_activity.xml new file mode 100644 index 000000000..be9aa7dea --- /dev/null +++ b/java/com/android/dialer/enrichedcall/simulator/res/layout/enriched_call_simulator_activity.xml @@ -0,0 +1,38 @@ + + + + + + + + +