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 --- 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 + 2393 files changed, 53503 insertions(+), 20553 deletions(-) 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 (limited to 'java/com/android/dialer') 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 @@ + + + + + + + + +