From 2f1c7586bcce334ca69022eb8dc6d8965ceb6a05 Mon Sep 17 00:00:00 2001 From: Eric Erfanian Date: Mon, 19 Jun 2017 11:26:01 -0700 Subject: Update AOSP Dialer source from internal google3 repository at cl/159428781. Test: make, treehugger This CL updates the AOSP Dialer source with all the changes that have gone into the private google3 repository. This includes all the changes from cl/152373142 (4/06/2017) to cl/159428781 (6/19/2017). This goal of these drops is to keep the AOSP source in sync with the internal google3 repository. Currently these sync are done by hand with very minor modifications to the internal source code. See the Android.mk file for list of modifications. Our current goal is to do frequent drops (daily if possible) and eventually switched to an automated process. Change-Id: Ie60a84b3936efd0ea3d95d7c86bf96d2b1663030 --- java/com/android/dialer/about/AndroidManifest.xml | 2 +- java/com/android/dialer/about/res/raw/keep.xml | 1 - java/com/android/dialer/app/AndroidManifest.xml | 1 + java/com/android/dialer/app/Bindings.java | 28 -- java/com/android/dialer/app/DialtactsActivity.java | 159 +++++-- .../android/dialer/app/SpecialCharSequenceMgr.java | 5 +- .../dialer/app/bindings/DialerBindings.java | 25 -- .../dialer/app/bindings/DialerBindingsFactory.java | 26 -- .../dialer/app/bindings/DialerBindingsStub.java | 48 --- .../dialer/app/calllog/CallLogActivity.java | 34 +- .../android/dialer/app/calllog/CallLogAdapter.java | 306 +++++++++++--- .../dialer/app/calllog/CallLogAsyncTaskUtil.java | 6 +- .../dialer/app/calllog/CallLogFragment.java | 123 +++++- .../app/calllog/CallLogListItemViewHolder.java | 223 ++++++++-- .../calllog/CallLogNotificationsQueryHelper.java | 92 +++-- .../app/calllog/CallLogNotificationsService.java | 115 ++++-- .../dialer/app/calllog/CallLogReceiver.java | 4 +- .../dialer/app/calllog/ClearCallLogDialog.java | 2 +- .../app/calllog/DefaultVoicemailNotifier.java | 446 -------------------- .../app/calllog/DialerQuickContactBadge.java | 63 +++ .../android/dialer/app/calllog/IntentProvider.java | 12 +- .../app/calllog/LegacyVoicemailNotifier.java | 156 +++++++ .../dialer/app/calllog/MissedCallNotifier.java | 116 ++++-- .../dialer/app/calllog/PhoneAccountHandles.java | 62 --- .../app/calllog/VisualVoicemailNotifier.java | 291 +++++++++++++ .../app/calllog/VisualVoicemailUpdateTask.java | 168 ++++++++ .../dialer/app/calllog/VoicemailQueryHandler.java | 44 +- .../app/calllog/calllogcache/CallLogCache.java | 6 +- .../calllog/calllogcache/CallLogCacheLollipop.java | 74 ---- .../calllogcache/CallLogCacheLollipopMr1.java | 30 +- .../dialer/app/contactinfo/ContactInfoCache.java | 10 +- .../dialer/app/dialpad/DialpadFragment.java | 19 + .../dialer/app/filterednumber/NumbersAdapter.java | 5 +- .../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 | 4 +- .../com/android/dialer/app/list/ListsFragment.java | 38 +- .../dialer/app/list/OldSpeedDialFragment.java | 29 +- .../dialer/app/list/PhoneFavoriteListView.java | 19 +- .../app/list/PhoneFavoriteSquareTileView.java | 4 + .../dialer/app/list/PhoneFavoriteTileView.java | 40 +- .../dialer/app/list/PhoneFavoritesTileAdapter.java | 79 +++- .../dialer/app/list/RegularSearchFragment.java | 17 +- java/com/android/dialer/app/list/RemoveView.java | 2 +- .../android/dialer/app/list/SearchFragment.java | 27 +- .../dialer/app/list/SmartDialSearchFragment.java | 20 +- .../app/manifests/activities/AndroidManifest.xml | 4 +- .../app/res/drawable-hdpi/empty_contacts.png | Bin 2461 -> 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 .../ic_empty_check_mark_white_24dp.png | Bin 0 -> 375 bytes .../app/res/drawable-hdpi/ic_results_phone.png | Bin 1084 -> 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 .../app/res/drawable-mdpi/ic_results_phone.png | Bin 801 -> 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 .../app/res/drawable-xhdpi/ic_results_phone.png | Bin 1376 -> 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 .../app/res/drawable-xxhdpi/ic_results_phone.png | Bin 2090 -> 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 .../dialer/app/res/drawable/ic_search_phone.xml | 20 - .../dialer/app/res/drawable/ic_wifi_calling.xml | 29 ++ .../empty_content_view_dialpad_search.xml | 6 +- .../app/res/layout/action_mode_close_button.xml | 31 ++ .../app/res/layout/all_contacts_fragment.xml | 2 +- .../dialer/app/res/layout/call_log_fragment.xml | 32 +- .../dialer/app/res/layout/call_log_list_item.xml | 4 +- .../app/res/layout/call_log_list_item_actions.xml | 4 +- .../dialer/app/res/layout/dialpad_fragment.xml | 47 +-- .../dialer/app/res/layout/empty_content_view.xml | 54 --- .../layout/empty_content_view_dialpad_search.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/dialtacts_options.xml | 3 + .../android/dialer/app/res/values-af/strings.xml | 23 +- .../android/dialer/app/res/values-am/strings.xml | 23 +- .../android/dialer/app/res/values-ar/strings.xml | 27 +- .../android/dialer/app/res/values-az/strings.xml | 23 +- .../dialer/app/res/values-b+sr+Latn/strings.xml | 24 +- .../android/dialer/app/res/values-be/strings.xml | 25 +- .../android/dialer/app/res/values-bg/strings.xml | 23 +- .../android/dialer/app/res/values-bn/strings.xml | 23 +- .../android/dialer/app/res/values-bs/strings.xml | 24 +- .../android/dialer/app/res/values-ca/strings.xml | 27 +- .../android/dialer/app/res/values-cs/strings.xml | 25 +- .../android/dialer/app/res/values-da/strings.xml | 23 +- .../android/dialer/app/res/values-de/strings.xml | 23 +- .../android/dialer/app/res/values-el/strings.xml | 23 +- .../dialer/app/res/values-en-rAU/strings.xml | 23 +- .../dialer/app/res/values-en-rGB/strings.xml | 23 +- .../dialer/app/res/values-en-rIN/strings.xml | 23 +- .../dialer/app/res/values-es-rUS/strings.xml | 23 +- .../android/dialer/app/res/values-es/strings.xml | 23 +- .../android/dialer/app/res/values-et/strings.xml | 23 +- .../android/dialer/app/res/values-eu/strings.xml | 23 +- .../android/dialer/app/res/values-fa/strings.xml | 23 +- .../android/dialer/app/res/values-fi/strings.xml | 23 +- .../dialer/app/res/values-fr-rCA/strings.xml | 23 +- .../android/dialer/app/res/values-fr/strings.xml | 23 +- .../android/dialer/app/res/values-gl/strings.xml | 23 +- .../android/dialer/app/res/values-gu/strings.xml | 23 +- .../android/dialer/app/res/values-hi/strings.xml | 23 +- .../android/dialer/app/res/values-hr/strings.xml | 24 +- .../android/dialer/app/res/values-hu/strings.xml | 23 +- .../android/dialer/app/res/values-hy/strings.xml | 23 +- .../android/dialer/app/res/values-in/strings.xml | 23 +- .../android/dialer/app/res/values-is/strings.xml | 23 +- .../android/dialer/app/res/values-it/strings.xml | 23 +- .../android/dialer/app/res/values-iw/strings.xml | 25 +- .../android/dialer/app/res/values-ja/strings.xml | 23 +- .../android/dialer/app/res/values-ka/strings.xml | 23 +- .../android/dialer/app/res/values-kk/strings.xml | 23 +- .../android/dialer/app/res/values-km/strings.xml | 23 +- .../android/dialer/app/res/values-kn/strings.xml | 23 +- .../android/dialer/app/res/values-ko/strings.xml | 23 +- .../android/dialer/app/res/values-ky/strings.xml | 23 +- .../android/dialer/app/res/values-lo/strings.xml | 23 +- .../android/dialer/app/res/values-lt/strings.xml | 25 +- .../android/dialer/app/res/values-lv/strings.xml | 24 +- .../android/dialer/app/res/values-mk/strings.xml | 23 +- .../android/dialer/app/res/values-ml/strings.xml | 23 +- .../android/dialer/app/res/values-mn/strings.xml | 23 +- .../android/dialer/app/res/values-mr/strings.xml | 23 +- .../android/dialer/app/res/values-ms/strings.xml | 23 +- .../android/dialer/app/res/values-my/strings.xml | 23 +- .../android/dialer/app/res/values-nb/strings.xml | 23 +- .../android/dialer/app/res/values-ne/strings.xml | 23 +- .../android/dialer/app/res/values-nl/strings.xml | 23 +- .../android/dialer/app/res/values-no/strings.xml | 23 +- .../android/dialer/app/res/values-pa/strings.xml | 23 +- .../android/dialer/app/res/values-pl/strings.xml | 25 +- .../dialer/app/res/values-pt-rBR/strings.xml | 23 +- .../dialer/app/res/values-pt-rPT/strings.xml | 23 +- .../android/dialer/app/res/values-pt/strings.xml | 23 +- .../android/dialer/app/res/values-ro/strings.xml | 24 +- .../android/dialer/app/res/values-ru/strings.xml | 25 +- .../android/dialer/app/res/values-si/strings.xml | 23 +- .../android/dialer/app/res/values-sk/strings.xml | 25 +- .../android/dialer/app/res/values-sl/strings.xml | 25 +- .../android/dialer/app/res/values-sq/strings.xml | 23 +- .../android/dialer/app/res/values-sr/strings.xml | 24 +- .../android/dialer/app/res/values-sv/strings.xml | 23 +- .../android/dialer/app/res/values-sw/strings.xml | 23 +- .../android/dialer/app/res/values-ta/strings.xml | 23 +- .../android/dialer/app/res/values-te/strings.xml | 23 +- .../android/dialer/app/res/values-th/strings.xml | 25 +- .../android/dialer/app/res/values-tl/strings.xml | 23 +- .../android/dialer/app/res/values-tr/strings.xml | 23 +- .../android/dialer/app/res/values-uk/strings.xml | 25 +- .../android/dialer/app/res/values-ur/strings.xml | 23 +- .../android/dialer/app/res/values-uz/strings.xml | 23 +- .../android/dialer/app/res/values-vi/strings.xml | 23 +- .../dialer/app/res/values-zh-rCN/strings.xml | 23 +- .../dialer/app/res/values-zh-rHK/strings.xml | 23 +- .../dialer/app/res/values-zh-rTW/strings.xml | 23 +- .../android/dialer/app/res/values-zu/strings.xml | 23 +- java/com/android/dialer/app/res/values/colors.xml | 4 - java/com/android/dialer/app/res/values/dimens.xml | 8 +- java/com/android/dialer/app/res/values/strings.xml | 114 ++++-- java/com/android/dialer/app/res/values/styles.xml | 17 +- .../android/dialer/app/res/xml/sound_settings.xml | 4 +- .../app/settings/AppCompatPreferenceActivity.java | 5 - .../app/settings/DialerSettingsActivity.java | 15 +- .../dialer/app/settings/SoundSettingsFragment.java | 10 +- .../LegacyVoicemailNotificationReceiver.java | 31 +- .../app/voicemail/VoicemailPlaybackPresenter.java | 9 +- .../error/OmtpVoicemailMessageCreator.java | 6 + .../error/VoicemailStatusCorruptionHandler.java | 2 +- .../error/VoicemailTosMessageCreator.java | 301 ++++++++++++++ .../error/Vvm3VoicemailMessageCreator.java | 150 +------ .../error/res/layout/voicemail_tos_fragment.xml | 16 +- .../app/voicemail/error/res/values-af/strings.xml | 16 +- .../app/voicemail/error/res/values-am/strings.xml | 16 +- .../app/voicemail/error/res/values-ar/strings.xml | 16 +- .../app/voicemail/error/res/values-az/strings.xml | 16 +- .../error/res/values-b+sr+Latn/strings.xml | 16 +- .../app/voicemail/error/res/values-be/strings.xml | 16 +- .../app/voicemail/error/res/values-bg/strings.xml | 16 +- .../app/voicemail/error/res/values-bn/strings.xml | 16 +- .../app/voicemail/error/res/values-bs/strings.xml | 16 +- .../app/voicemail/error/res/values-ca/strings.xml | 16 +- .../app/voicemail/error/res/values-cs/strings.xml | 16 +- .../app/voicemail/error/res/values-da/strings.xml | 16 +- .../app/voicemail/error/res/values-de/strings.xml | 16 +- .../app/voicemail/error/res/values-el/strings.xml | 16 +- .../voicemail/error/res/values-en-rAU/strings.xml | 16 +- .../voicemail/error/res/values-en-rGB/strings.xml | 16 +- .../voicemail/error/res/values-en-rIN/strings.xml | 16 +- .../voicemail/error/res/values-es-rUS/strings.xml | 16 +- .../app/voicemail/error/res/values-es/strings.xml | 16 +- .../app/voicemail/error/res/values-et/strings.xml | 16 +- .../app/voicemail/error/res/values-eu/strings.xml | 16 +- .../app/voicemail/error/res/values-fa/strings.xml | 16 +- .../app/voicemail/error/res/values-fi/strings.xml | 16 +- .../voicemail/error/res/values-fr-rCA/strings.xml | 16 +- .../app/voicemail/error/res/values-fr/strings.xml | 16 +- .../app/voicemail/error/res/values-gl/strings.xml | 16 +- .../app/voicemail/error/res/values-gu/strings.xml | 16 +- .../app/voicemail/error/res/values-hi/strings.xml | 18 +- .../app/voicemail/error/res/values-hr/strings.xml | 16 +- .../app/voicemail/error/res/values-hu/strings.xml | 16 +- .../app/voicemail/error/res/values-hy/strings.xml | 16 +- .../app/voicemail/error/res/values-in/strings.xml | 16 +- .../app/voicemail/error/res/values-is/strings.xml | 16 +- .../app/voicemail/error/res/values-it/strings.xml | 16 +- .../app/voicemail/error/res/values-iw/strings.xml | 16 +- .../app/voicemail/error/res/values-ja/strings.xml | 16 +- .../app/voicemail/error/res/values-ka/strings.xml | 16 +- .../app/voicemail/error/res/values-kk/strings.xml | 16 +- .../app/voicemail/error/res/values-km/strings.xml | 16 +- .../app/voicemail/error/res/values-kn/strings.xml | 16 +- .../app/voicemail/error/res/values-ko/strings.xml | 16 +- .../app/voicemail/error/res/values-ky/strings.xml | 16 +- .../app/voicemail/error/res/values-lo/strings.xml | 16 +- .../app/voicemail/error/res/values-lt/strings.xml | 16 +- .../app/voicemail/error/res/values-lv/strings.xml | 16 +- .../app/voicemail/error/res/values-mk/strings.xml | 16 +- .../app/voicemail/error/res/values-ml/strings.xml | 16 +- .../app/voicemail/error/res/values-mn/strings.xml | 16 +- .../app/voicemail/error/res/values-mr/strings.xml | 16 +- .../app/voicemail/error/res/values-ms/strings.xml | 16 +- .../app/voicemail/error/res/values-my/strings.xml | 16 +- .../app/voicemail/error/res/values-nb/strings.xml | 16 +- .../app/voicemail/error/res/values-ne/strings.xml | 16 +- .../app/voicemail/error/res/values-nl/strings.xml | 16 +- .../app/voicemail/error/res/values-no/strings.xml | 16 +- .../app/voicemail/error/res/values-pa/strings.xml | 16 +- .../app/voicemail/error/res/values-pl/strings.xml | 16 +- .../voicemail/error/res/values-pt-rBR/strings.xml | 16 +- .../voicemail/error/res/values-pt-rPT/strings.xml | 16 +- .../app/voicemail/error/res/values-pt/strings.xml | 16 +- .../app/voicemail/error/res/values-ro/strings.xml | 16 +- .../app/voicemail/error/res/values-ru/strings.xml | 16 +- .../app/voicemail/error/res/values-si/strings.xml | 16 +- .../app/voicemail/error/res/values-sk/strings.xml | 16 +- .../app/voicemail/error/res/values-sl/strings.xml | 16 +- .../app/voicemail/error/res/values-sq/strings.xml | 16 +- .../app/voicemail/error/res/values-sr/strings.xml | 16 +- .../app/voicemail/error/res/values-sv/strings.xml | 16 +- .../app/voicemail/error/res/values-sw/strings.xml | 18 +- .../app/voicemail/error/res/values-ta/strings.xml | 16 +- .../app/voicemail/error/res/values-te/strings.xml | 16 +- .../app/voicemail/error/res/values-th/strings.xml | 16 +- .../app/voicemail/error/res/values-tl/strings.xml | 16 +- .../app/voicemail/error/res/values-tr/strings.xml | 16 +- .../app/voicemail/error/res/values-uk/strings.xml | 16 +- .../app/voicemail/error/res/values-ur/strings.xml | 16 +- .../app/voicemail/error/res/values-uz/strings.xml | 16 +- .../app/voicemail/error/res/values-vi/strings.xml | 16 +- .../voicemail/error/res/values-zh-rCN/strings.xml | 16 +- .../voicemail/error/res/values-zh-rHK/strings.xml | 16 +- .../voicemail/error/res/values-zh-rTW/strings.xml | 16 +- .../app/voicemail/error/res/values-zu/strings.xml | 16 +- .../app/voicemail/error/res/values/strings.xml | 37 +- .../app/widget/DialpadSearchEmptyContentView.java | 1 + .../dialer/app/widget/EmptyContentView.java | 121 ------ .../dialer/app/widget/SearchEditTextLayout.java | 22 +- .../android/dialer/backup/DialerBackupAgent.java | 2 +- .../android/dialer/backup/DialerBackupUtils.java | 2 +- .../binary/aosp/AospDialerRootComponent.java | 4 + .../dialer/binary/aosp/testing/AndroidManifest.xml | 24 ++ .../dialer/binary/aosp/testing/TestActivity.java | 25 ++ .../basecomponent/BaseDialerRootComponent.java | 8 + .../dialer/binary/common/DialerApplication.java | 10 +- .../dialer/blocking/FilteredNumbersUtil.java | 11 +- .../dialer/callcomposer/AndroidManifest.xml | 2 +- .../dialer/callcomposer/CallComposerActivity.java | 137 ++++--- .../callcomposer/CameraComposerFragment.java | 43 +- .../dialer/callcomposer/GalleryCursorLoader.java | 4 +- .../callcomposer/MessageComposerFragment.java | 36 +- .../dialer/callcomposer/camera/CameraManager.java | 122 +++--- .../callcomposer/camera/ImagePersistTask.java | 38 +- .../callcomposer/camera/exif/ExifInterface.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 | 41 +- .../res/layout/fragment_message_composer.xml | 2 +- .../dialer/callcomposer/res/values-af/strings.xml | 3 + .../dialer/callcomposer/res/values-am/strings.xml | 3 + .../dialer/callcomposer/res/values-ar/strings.xml | 3 + .../dialer/callcomposer/res/values-az/strings.xml | 3 + .../callcomposer/res/values-b+sr+Latn/strings.xml | 3 + .../dialer/callcomposer/res/values-be/strings.xml | 3 + .../dialer/callcomposer/res/values-bg/strings.xml | 3 + .../dialer/callcomposer/res/values-bn/strings.xml | 3 + .../dialer/callcomposer/res/values-bs/strings.xml | 3 + .../dialer/callcomposer/res/values-ca/strings.xml | 7 +- .../dialer/callcomposer/res/values-cs/strings.xml | 3 + .../dialer/callcomposer/res/values-da/strings.xml | 3 + .../dialer/callcomposer/res/values-de/strings.xml | 3 + .../dialer/callcomposer/res/values-el/strings.xml | 3 + .../callcomposer/res/values-en-rAU/strings.xml | 3 + .../callcomposer/res/values-en-rGB/strings.xml | 3 + .../callcomposer/res/values-en-rIN/strings.xml | 3 + .../callcomposer/res/values-es-rUS/strings.xml | 3 + .../dialer/callcomposer/res/values-es/strings.xml | 3 + .../dialer/callcomposer/res/values-et/strings.xml | 3 + .../dialer/callcomposer/res/values-eu/strings.xml | 3 + .../dialer/callcomposer/res/values-fa/strings.xml | 3 + .../dialer/callcomposer/res/values-fi/strings.xml | 3 + .../callcomposer/res/values-fr-rCA/strings.xml | 3 + .../dialer/callcomposer/res/values-fr/strings.xml | 3 + .../dialer/callcomposer/res/values-gl/strings.xml | 3 + .../dialer/callcomposer/res/values-gu/strings.xml | 3 + .../dialer/callcomposer/res/values-hi/strings.xml | 3 + .../dialer/callcomposer/res/values-hr/strings.xml | 3 + .../dialer/callcomposer/res/values-hu/strings.xml | 3 + .../dialer/callcomposer/res/values-hy/strings.xml | 3 + .../dialer/callcomposer/res/values-in/strings.xml | 3 + .../dialer/callcomposer/res/values-is/strings.xml | 3 + .../dialer/callcomposer/res/values-it/strings.xml | 3 + .../dialer/callcomposer/res/values-iw/strings.xml | 3 + .../dialer/callcomposer/res/values-ja/strings.xml | 3 + .../dialer/callcomposer/res/values-ka/strings.xml | 3 + .../dialer/callcomposer/res/values-kk/strings.xml | 3 + .../dialer/callcomposer/res/values-km/strings.xml | 3 + .../dialer/callcomposer/res/values-kn/strings.xml | 3 + .../dialer/callcomposer/res/values-ko/strings.xml | 3 + .../dialer/callcomposer/res/values-ky/strings.xml | 3 + .../dialer/callcomposer/res/values-lo/strings.xml | 3 + .../dialer/callcomposer/res/values-lt/strings.xml | 3 + .../dialer/callcomposer/res/values-lv/strings.xml | 3 + .../dialer/callcomposer/res/values-mk/strings.xml | 3 + .../dialer/callcomposer/res/values-ml/strings.xml | 3 + .../dialer/callcomposer/res/values-mn/strings.xml | 3 + .../dialer/callcomposer/res/values-mr/strings.xml | 3 + .../dialer/callcomposer/res/values-ms/strings.xml | 3 + .../dialer/callcomposer/res/values-my/strings.xml | 3 + .../dialer/callcomposer/res/values-nb/strings.xml | 3 + .../dialer/callcomposer/res/values-ne/strings.xml | 3 + .../dialer/callcomposer/res/values-nl/strings.xml | 3 + .../dialer/callcomposer/res/values-no/strings.xml | 3 + .../dialer/callcomposer/res/values-pa/strings.xml | 3 + .../dialer/callcomposer/res/values-pl/strings.xml | 3 + .../callcomposer/res/values-pt-rBR/strings.xml | 3 + .../callcomposer/res/values-pt-rPT/strings.xml | 3 + .../dialer/callcomposer/res/values-pt/strings.xml | 3 + .../dialer/callcomposer/res/values-ro/strings.xml | 3 + .../dialer/callcomposer/res/values-ru/strings.xml | 3 + .../dialer/callcomposer/res/values-si/strings.xml | 3 + .../dialer/callcomposer/res/values-sk/strings.xml | 3 + .../dialer/callcomposer/res/values-sl/strings.xml | 3 + .../dialer/callcomposer/res/values-sq/strings.xml | 3 + .../dialer/callcomposer/res/values-sr/strings.xml | 3 + .../dialer/callcomposer/res/values-sv/strings.xml | 3 + .../dialer/callcomposer/res/values-sw/strings.xml | 3 + .../dialer/callcomposer/res/values-ta/strings.xml | 3 + .../dialer/callcomposer/res/values-te/strings.xml | 3 + .../dialer/callcomposer/res/values-th/strings.xml | 3 + .../dialer/callcomposer/res/values-tl/strings.xml | 3 + .../dialer/callcomposer/res/values-tr/strings.xml | 3 + .../dialer/callcomposer/res/values-uk/strings.xml | 3 + .../dialer/callcomposer/res/values-ur/strings.xml | 3 + .../dialer/callcomposer/res/values-uz/strings.xml | 3 + .../dialer/callcomposer/res/values-vi/strings.xml | 3 + .../callcomposer/res/values-zh-rCN/strings.xml | 3 + .../callcomposer/res/values-zh-rHK/strings.xml | 3 + .../callcomposer/res/values-zh-rTW/strings.xml | 3 + .../dialer/callcomposer/res/values-zu/strings.xml | 3 + .../dialer/callcomposer/res/values/strings.xml | 6 + .../dialer/callcomposer/res/values/styles.xml | 2 +- .../android/dialer/calldetails/AndroidManifest.xml | 4 +- .../dialer/calldetails/CallDetailsActivity.java | 61 ++- .../dialer/calldetails/CallDetailsAdapter.java | 21 +- .../calldetails/CallDetailsFooterViewHolder.java | 32 +- .../calldetails/CallDetailsHeaderViewHolder.java | 29 +- .../dialer/calldetails/ReportDialogFragment.java | 161 ++++++++ .../calldetails/res/layout/call_details_footer.xml | 9 + .../res/layout/caller_id_report_dialog.xml | 35 ++ .../calldetails/res/layout/contact_container.xml | 16 +- .../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 | 6 +- .../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 | 2 - .../dialer/calldetails/res/values/strings.xml | 19 +- .../dialer/calldetails/res/values/styles.xml | 18 - .../dialer/callintent/CallIntentBuilder.java | 16 +- .../dialer/callintent/call_specific_app_data.proto | 14 + .../callintent/speed_dial_contact_type.proto | 19 + .../android/dialer/calllog/CallLogComponent.java | 2 + .../android/dialer/calllog/CallLogFramework.java | 5 +- 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 | 331 +++++++++++++++ .../database/AnnotatedCallLogDatabaseHelper.java | 46 ++- .../calllog/database/CallLogDatabaseComponent.java | 40 ++ .../dialer/calllog/database/CallLogMutations.java | 58 --- .../android/dialer/calllog/database/Coalescer.java | 180 ++++++++ .../dialer/calllog/database/MutationApplier.java | 105 +++++ .../contract/AnnotatedCallLogContract.java | 135 ++++++ .../calllog/datasources/CallLogDataSource.java | 67 ++- .../calllog/datasources/CallLogMutations.java | 110 +++++ .../dialer/calllog/datasources/DataSources.java | 30 ++ .../datasources/contacts/ContactsDataSource.java | 25 +- .../systemcalllog/SystemCallLogDataSource.java | 251 +++++++++++- .../calllog/datasources/util/RowCombiner.java | 53 +++ .../calllog/testing/FakeCallLogApplication.java | 53 +++ .../android/dialer/calllog/ui/AndroidManifest.xml | 2 +- .../calllog/ui/AnnotatedCallLogCursorLoader.java | 48 --- .../dialer/calllog/ui/NewCallLogAdapter.java | 53 +++ .../dialer/calllog/ui/NewCallLogFragment.java | 101 +++-- .../dialer/calllog/ui/NewCallLogViewHolder.java | 43 ++ .../calllog/ui/res/layout/new_call_log_entry.xml | 16 +- .../ui/res/layout/new_call_log_fragment.xml | 7 +- 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 -- .../concurrent/DefaultDialerExecutorFactory.java | 111 +++-- .../dialer/common/concurrent/DialerExecutor.java | 10 + .../common/concurrent/DialerExecutorComponent.java | 39 ++ .../common/concurrent/DialerExecutorModule.java | 28 ++ .../common/concurrent/DialerUiTaskFragment.java | 94 ++--- .../dialer/common/concurrent/ThreadUtil.java | 5 + java/com/android/dialer/compat/CompatUtils.java | 155 ------- .../dialer/configprovider/AndroidManifest.xml | 23 ++ .../dialer/configprovider/ConfigProvider.java | 27 ++ .../configprovider/ConfigProviderBindings.java | 68 +++ .../configprovider/ConfigProviderComponent.java | 41 ++ .../configprovider/SharedPrefConfigProvider.java | 131 ++++++ .../SharedPrefConfigProviderModule.java | 30 ++ java/com/android/dialer/constants/Constants.java | 3 + .../android/dialer/constants/ScheduledJobIds.java | 1 + .../android/dialer/constants/TrafficStatsTags.java | 28 ++ .../dialer/constants/aospdialer/ConstantsImpl.java | 6 + .../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 + .../contactsfragment/AddContactViewHolder.java | 42 ++ .../dialer/contactsfragment/ContactViewHolder.java | 11 + .../dialer/contactsfragment/ContactsAdapter.java | 102 +++-- .../contactsfragment/ContactsCursorLoader.java | 29 +- .../dialer/contactsfragment/ContactsFragment.java | 160 +++++++- .../dialer/contactsfragment/FastScroller.java | 130 ++++++ .../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/DialerDatabaseHelper.java | 357 ++++++++-------- .../dialer/dialercontact/dialer_contact.proto | 26 ++ .../dialer/dialpadview/res/values/dimens.xml | 2 +- .../enrichedcall/FuzzyPhoneNumberMatcher.java | 41 +- .../android/dialer/inject/ApplicationContext.java | 22 + java/com/android/dialer/inject/ContextModule.java | 7 +- .../interactions/PhoneNumberInteraction.java | 9 + .../android/dialer/lightbringer/Lightbringer.java | 18 +- .../dialer/lightbringer/stub/LightbringerStub.java | 55 ++- .../android/dialer/location/CountryDetector.java | 6 +- .../android/dialer/logging/LoggingBindings.java | 18 +- .../dialer/logging/LoggingBindingsStub.java | 17 + .../dialer/logging/contact_lookup_result.proto | 40 +- .../android/dialer/logging/contact_source.proto | 1 + .../android/dialer/logging/dialer_impression.proto | 54 ++- .../android/dialer/logging/interaction_event.proto | 20 + .../dialer/logging/reporting_location.proto | 1 + java/com/android/dialer/logging/screen_event.proto | 1 + java/com/android/dialer/logging/ui_action.proto | 43 ++ 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 | 91 ++++ java/com/android/dialer/main/impl/MainImpl.java | 90 ++++ java/com/android/dialer/main/impl/MainModule.java | 30 ++ .../android/dialer/main/impl/MainPagerAdapter.java | 75 ++++ .../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 | 36 ++ .../dialer/main/impl/res/values-ar/strings.xml | 32 ++ .../dialer/main/impl/res/values-az/strings.xml | 36 ++ .../main/impl/res/values-b+sr+Latn/strings.xml | 32 ++ .../dialer/main/impl/res/values-be/strings.xml | 36 ++ .../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 | 36 ++ .../dialer/main/impl/res/values-cs/strings.xml | 36 ++ .../dialer/main/impl/res/values-da/strings.xml | 36 ++ .../dialer/main/impl/res/values-de/strings.xml | 32 ++ .../dialer/main/impl/res/values-el/strings.xml | 36 ++ .../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 | 36 ++ .../dialer/main/impl/res/values-es/strings.xml | 32 ++ .../dialer/main/impl/res/values-et/strings.xml | 36 ++ .../dialer/main/impl/res/values-eu/strings.xml | 36 ++ .../dialer/main/impl/res/values-fa/strings.xml | 36 ++ .../dialer/main/impl/res/values-fi/strings.xml | 36 ++ .../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 | 36 ++ .../dialer/main/impl/res/values-hu/strings.xml | 36 ++ .../dialer/main/impl/res/values-hy/strings.xml | 32 ++ .../dialer/main/impl/res/values-in/strings.xml | 36 ++ .../dialer/main/impl/res/values-is/strings.xml | 36 ++ .../dialer/main/impl/res/values-it/strings.xml | 36 ++ .../dialer/main/impl/res/values-iw/strings.xml | 32 ++ .../dialer/main/impl/res/values-ja/strings.xml | 36 ++ .../dialer/main/impl/res/values-ka/strings.xml | 36 ++ .../dialer/main/impl/res/values-kk/strings.xml | 36 ++ .../dialer/main/impl/res/values-km/strings.xml | 36 ++ .../dialer/main/impl/res/values-kn/strings.xml | 36 ++ .../dialer/main/impl/res/values-ko/strings.xml | 32 ++ .../dialer/main/impl/res/values-ky/strings.xml | 36 ++ .../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 | 36 ++ .../dialer/main/impl/res/values-mk/strings.xml | 36 ++ .../dialer/main/impl/res/values-ml/strings.xml | 36 ++ .../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 | 36 ++ .../dialer/main/impl/res/values-ne/strings.xml | 32 ++ .../dialer/main/impl/res/values-nl/strings.xml | 36 ++ .../dialer/main/impl/res/values-no/strings.xml | 36 ++ .../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 | 36 ++ .../dialer/main/impl/res/values-pt-rPT/strings.xml | 36 ++ .../dialer/main/impl/res/values-pt/strings.xml | 36 ++ .../dialer/main/impl/res/values-ro/strings.xml | 36 ++ .../dialer/main/impl/res/values-ru/strings.xml | 36 ++ .../dialer/main/impl/res/values-si/strings.xml | 36 ++ .../dialer/main/impl/res/values-sk/strings.xml | 36 ++ .../dialer/main/impl/res/values-sl/strings.xml | 36 ++ .../dialer/main/impl/res/values-sq/strings.xml | 36 ++ .../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 | 36 ++ .../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 | 36 ++ .../dialer/main/impl/res/values-tr/strings.xml | 36 ++ .../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 | 36 ++ .../dialer/main/impl/res/values-vi/strings.xml | 36 ++ .../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 | 36 ++ .../dialer/main/impl/res/values-zu/strings.xml | 36 ++ .../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/GroupedNotificationUtil.java | 66 --- .../dialer/notification/NotificationChannelId.java | 41 ++ .../notification/NotificationChannelManager.java | 456 ++++++--------------- .../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 | 155 +++++++ .../CachedNumberLookupService.java | 2 + .../dialer/phonenumbercache/ContactInfo.java | 4 +- .../dialer/phonenumbercache/ContactInfoHelper.java | 35 +- .../android/dialer/phonenumberproto/Converter.java | 120 ++++++ .../phonenumberproto/DialerPhoneNumberUtil.java | 108 +++++ .../phonenumberproto/dialer_phone_number.proto | 172 ++++++++ .../android/dialer/postcall/AndroidManifest.xml | 2 +- java/com/android/dialer/postcall/PostCall.java | 38 +- java/com/android/dialer/protos/ProtoParsers.java | 125 +----- java/com/android/dialer/searchfragment/README.md | 62 +++ .../searchfragment/common/AndroidManifest.xml | 16 + .../dialer/searchfragment/common/Projections.java | 50 +++ .../searchfragment/common/QueryBoldingUtil.java | 154 +++++++ .../searchfragment/common/QueryFilteringUtil.java | 141 +++++++ .../common/res/layout/search_contact_row.xml | 69 ++++ .../searchfragment/common/res/values/dimens.xml | 23 ++ .../searchfragment/cp2/SearchContactCursor.java | 392 ++++++++++++++++++ .../cp2/SearchContactViewHolder.java | 204 +++++++++ .../cp2/SearchContactsCursorLoader.java | 42 ++ .../dialer/searchfragment/list/AndroidManifest.xml | 16 + .../searchfragment/list/HeaderViewHolder.java | 36 ++ .../searchfragment/list/NewSearchFragment.java | 125 ++++++ .../dialer/searchfragment/list/SearchAdapter.java | 108 +++++ .../searchfragment/list/SearchCursorManager.java | 273 ++++++++++++ .../list/res/layout/fragment_search.xml | 21 + .../list/res/layout/header_layout.xml | 22 + .../nearbyplaces/AndroidManifest.xml | 16 + .../nearbyplaces/NearbyPlaceViewHolder.java | 90 ++++ .../nearbyplaces/NearbyPlacesCursorLoader.java | 43 ++ .../nearbyplaces/res/values-af/strings.xml | 21 + .../nearbyplaces/res/values-am/strings.xml | 22 + .../nearbyplaces/res/values-ar/strings.xml | 21 + .../nearbyplaces/res/values-az/strings.xml | 22 + .../nearbyplaces/res/values-b+sr+Latn/strings.xml | 21 + .../nearbyplaces/res/values-be/strings.xml | 22 + .../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 | 22 + .../nearbyplaces/res/values-cs/strings.xml | 22 + .../nearbyplaces/res/values-da/strings.xml | 22 + .../nearbyplaces/res/values-de/strings.xml | 21 + .../nearbyplaces/res/values-el/strings.xml | 22 + .../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 | 22 + .../nearbyplaces/res/values-es/strings.xml | 21 + .../nearbyplaces/res/values-et/strings.xml | 22 + .../nearbyplaces/res/values-eu/strings.xml | 22 + .../nearbyplaces/res/values-fa/strings.xml | 22 + .../nearbyplaces/res/values-fi/strings.xml | 22 + .../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 | 22 + .../nearbyplaces/res/values-hu/strings.xml | 22 + .../nearbyplaces/res/values-hy/strings.xml | 21 + .../nearbyplaces/res/values-in/strings.xml | 22 + .../nearbyplaces/res/values-is/strings.xml | 22 + .../nearbyplaces/res/values-it/strings.xml | 22 + .../nearbyplaces/res/values-iw/strings.xml | 21 + .../nearbyplaces/res/values-ja/strings.xml | 22 + .../nearbyplaces/res/values-ka/strings.xml | 22 + .../nearbyplaces/res/values-kk/strings.xml | 22 + .../nearbyplaces/res/values-km/strings.xml | 22 + .../nearbyplaces/res/values-kn/strings.xml | 22 + .../nearbyplaces/res/values-ko/strings.xml | 21 + .../nearbyplaces/res/values-ky/strings.xml | 22 + .../nearbyplaces/res/values-lo/strings.xml | 21 + .../nearbyplaces/res/values-lt/strings.xml | 21 + .../nearbyplaces/res/values-lv/strings.xml | 22 + .../nearbyplaces/res/values-mk/strings.xml | 22 + .../nearbyplaces/res/values-ml/strings.xml | 22 + .../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 | 22 + .../nearbyplaces/res/values-ne/strings.xml | 21 + .../nearbyplaces/res/values-nl/strings.xml | 22 + .../nearbyplaces/res/values-no/strings.xml | 22 + .../nearbyplaces/res/values-pa/strings.xml | 21 + .../nearbyplaces/res/values-pl/strings.xml | 21 + .../nearbyplaces/res/values-pt-rBR/strings.xml | 22 + .../nearbyplaces/res/values-pt-rPT/strings.xml | 22 + .../nearbyplaces/res/values-pt/strings.xml | 22 + .../nearbyplaces/res/values-ro/strings.xml | 22 + .../nearbyplaces/res/values-ru/strings.xml | 22 + .../nearbyplaces/res/values-si/strings.xml | 22 + .../nearbyplaces/res/values-sk/strings.xml | 22 + .../nearbyplaces/res/values-sl/strings.xml | 22 + .../nearbyplaces/res/values-sq/strings.xml | 22 + .../nearbyplaces/res/values-sr/strings.xml | 21 + .../nearbyplaces/res/values-sv/strings.xml | 21 + .../nearbyplaces/res/values-sw/strings.xml | 22 + .../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 | 22 + .../nearbyplaces/res/values-tr/strings.xml | 22 + .../nearbyplaces/res/values-uk/strings.xml | 21 + .../nearbyplaces/res/values-ur/strings.xml | 21 + .../nearbyplaces/res/values-uz/strings.xml | 22 + .../nearbyplaces/res/values-vi/strings.xml | 22 + .../nearbyplaces/res/values-zh-rCN/strings.xml | 21 + .../nearbyplaces/res/values-zh-rHK/strings.xml | 21 + .../nearbyplaces/res/values-zh-rTW/strings.xml | 22 + .../nearbyplaces/res/values-zu/strings.xml | 22 + .../nearbyplaces/res/values/strings.xml | 20 + .../android/dialer/shortcuts/AndroidManifest.xml | 2 +- java/com/android/dialer/shortcuts/Shortcuts.java | 2 +- .../dialer/simulator/impl/SimulatorContacts.java | 2 +- java/com/android/dialer/telecom/TelecomUtil.java | 110 +++-- .../android/dialer/theme/res/values-af/strings.xml | 2 + .../android/dialer/theme/res/values-am/strings.xml | 2 + .../android/dialer/theme/res/values-ar/strings.xml | 2 + .../android/dialer/theme/res/values-az/strings.xml | 2 + .../dialer/theme/res/values-b+sr+Latn/strings.xml | 2 + .../android/dialer/theme/res/values-be/strings.xml | 2 + .../android/dialer/theme/res/values-bg/strings.xml | 2 + .../android/dialer/theme/res/values-bn/strings.xml | 2 + .../android/dialer/theme/res/values-bs/strings.xml | 2 + .../android/dialer/theme/res/values-ca/strings.xml | 2 + .../android/dialer/theme/res/values-cs/strings.xml | 2 + .../android/dialer/theme/res/values-da/strings.xml | 2 + .../android/dialer/theme/res/values-de/strings.xml | 2 + .../android/dialer/theme/res/values-el/strings.xml | 2 + .../dialer/theme/res/values-en-rAU/strings.xml | 2 + .../dialer/theme/res/values-en-rGB/strings.xml | 2 + .../dialer/theme/res/values-en-rIN/strings.xml | 2 + .../dialer/theme/res/values-es-rUS/strings.xml | 2 + .../android/dialer/theme/res/values-es/strings.xml | 2 + .../android/dialer/theme/res/values-et/strings.xml | 2 + .../android/dialer/theme/res/values-eu/strings.xml | 2 + .../android/dialer/theme/res/values-fa/strings.xml | 2 + .../android/dialer/theme/res/values-fi/strings.xml | 2 + .../dialer/theme/res/values-fr-rCA/strings.xml | 2 + .../android/dialer/theme/res/values-fr/strings.xml | 2 + .../android/dialer/theme/res/values-gl/strings.xml | 2 + .../android/dialer/theme/res/values-gu/strings.xml | 2 + .../android/dialer/theme/res/values-hi/strings.xml | 2 + .../android/dialer/theme/res/values-hr/strings.xml | 2 + .../android/dialer/theme/res/values-hu/strings.xml | 2 + .../android/dialer/theme/res/values-hy/strings.xml | 2 + .../android/dialer/theme/res/values-in/strings.xml | 2 + .../android/dialer/theme/res/values-is/strings.xml | 2 + .../android/dialer/theme/res/values-it/strings.xml | 2 + .../android/dialer/theme/res/values-iw/strings.xml | 2 + .../android/dialer/theme/res/values-ja/strings.xml | 2 + .../android/dialer/theme/res/values-ka/strings.xml | 2 + .../android/dialer/theme/res/values-kk/strings.xml | 2 + .../android/dialer/theme/res/values-km/strings.xml | 2 + .../android/dialer/theme/res/values-kn/strings.xml | 2 + .../android/dialer/theme/res/values-ko/strings.xml | 2 + .../android/dialer/theme/res/values-ky/strings.xml | 2 + .../android/dialer/theme/res/values-lo/strings.xml | 2 + .../android/dialer/theme/res/values-lt/strings.xml | 2 + .../android/dialer/theme/res/values-lv/strings.xml | 2 + .../android/dialer/theme/res/values-mk/strings.xml | 2 + .../android/dialer/theme/res/values-ml/strings.xml | 2 + .../android/dialer/theme/res/values-mn/strings.xml | 2 + .../android/dialer/theme/res/values-mr/strings.xml | 2 + .../android/dialer/theme/res/values-ms/strings.xml | 2 + .../android/dialer/theme/res/values-my/strings.xml | 2 + .../android/dialer/theme/res/values-nb/strings.xml | 2 + .../android/dialer/theme/res/values-ne/strings.xml | 2 + .../android/dialer/theme/res/values-nl/strings.xml | 2 + .../android/dialer/theme/res/values-no/strings.xml | 2 + .../android/dialer/theme/res/values-pa/strings.xml | 2 + .../android/dialer/theme/res/values-pl/strings.xml | 2 + .../dialer/theme/res/values-pt-rBR/strings.xml | 2 + .../dialer/theme/res/values-pt-rPT/strings.xml | 2 + .../android/dialer/theme/res/values-pt/strings.xml | 2 + .../android/dialer/theme/res/values-ro/strings.xml | 2 + .../android/dialer/theme/res/values-ru/strings.xml | 2 + .../android/dialer/theme/res/values-si/strings.xml | 2 + .../android/dialer/theme/res/values-sk/strings.xml | 2 + .../android/dialer/theme/res/values-sl/strings.xml | 2 + .../android/dialer/theme/res/values-sq/strings.xml | 2 + .../android/dialer/theme/res/values-sr/strings.xml | 2 + .../android/dialer/theme/res/values-sv/strings.xml | 2 + .../android/dialer/theme/res/values-sw/strings.xml | 2 + .../android/dialer/theme/res/values-ta/strings.xml | 2 + .../android/dialer/theme/res/values-te/strings.xml | 2 + .../android/dialer/theme/res/values-th/strings.xml | 2 + .../android/dialer/theme/res/values-tl/strings.xml | 2 + .../android/dialer/theme/res/values-tr/strings.xml | 2 + .../android/dialer/theme/res/values-uk/strings.xml | 2 + .../android/dialer/theme/res/values-ur/strings.xml | 2 + .../android/dialer/theme/res/values-uz/strings.xml | 2 + .../android/dialer/theme/res/values-vi/strings.xml | 2 + .../dialer/theme/res/values-zh-rCN/strings.xml | 2 + .../dialer/theme/res/values-zh-rHK/strings.xml | 2 + .../dialer/theme/res/values-zh-rTW/strings.xml | 2 + .../android/dialer/theme/res/values-zu/strings.xml | 2 + .../android/dialer/theme/res/values/strings.xml | 6 + .../com/android/dialer/theme/res/values/themes.xml | 43 ++ java/com/android/dialer/util/CallUtil.java | 22 +- java/com/android/dialer/util/PermissionsUtil.java | 60 +++ 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 | 29 +- .../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 | 4 +- .../dialer/widget/res/values-af/strings.xml | 21 + .../dialer/widget/res/values-am/strings.xml | 22 + .../dialer/widget/res/values-ar/strings.xml | 21 + .../dialer/widget/res/values-az/strings.xml | 22 + .../dialer/widget/res/values-b+sr+Latn/strings.xml | 21 + .../dialer/widget/res/values-be/strings.xml | 22 + .../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 | 22 + .../dialer/widget/res/values-cs/strings.xml | 22 + .../dialer/widget/res/values-da/strings.xml | 22 + .../dialer/widget/res/values-de/strings.xml | 21 + .../dialer/widget/res/values-el/strings.xml | 22 + .../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 | 22 + .../dialer/widget/res/values-es/strings.xml | 21 + .../dialer/widget/res/values-et/strings.xml | 22 + .../dialer/widget/res/values-eu/strings.xml | 22 + .../dialer/widget/res/values-fa/strings.xml | 22 + .../dialer/widget/res/values-fi/strings.xml | 22 + .../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 | 22 + .../dialer/widget/res/values-hu/strings.xml | 22 + .../dialer/widget/res/values-hy/strings.xml | 21 + .../dialer/widget/res/values-in/strings.xml | 22 + .../dialer/widget/res/values-is/strings.xml | 22 + .../dialer/widget/res/values-it/strings.xml | 22 + .../dialer/widget/res/values-iw/strings.xml | 21 + .../dialer/widget/res/values-ja/strings.xml | 22 + .../dialer/widget/res/values-ka/strings.xml | 22 + .../dialer/widget/res/values-kk/strings.xml | 22 + .../dialer/widget/res/values-km/strings.xml | 22 + .../dialer/widget/res/values-kn/strings.xml | 22 + .../dialer/widget/res/values-ko/strings.xml | 21 + .../dialer/widget/res/values-ky/strings.xml | 22 + .../dialer/widget/res/values-lo/strings.xml | 21 + .../dialer/widget/res/values-lt/strings.xml | 21 + .../dialer/widget/res/values-lv/strings.xml | 22 + .../dialer/widget/res/values-mk/strings.xml | 22 + .../dialer/widget/res/values-ml/strings.xml | 22 + .../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 | 22 + .../dialer/widget/res/values-ne/strings.xml | 21 + .../dialer/widget/res/values-nl/strings.xml | 22 + .../dialer/widget/res/values-no/strings.xml | 22 + .../dialer/widget/res/values-pa/strings.xml | 21 + .../dialer/widget/res/values-pl/strings.xml | 21 + .../dialer/widget/res/values-pt-rBR/strings.xml | 22 + .../dialer/widget/res/values-pt-rPT/strings.xml | 22 + .../dialer/widget/res/values-pt/strings.xml | 22 + .../dialer/widget/res/values-ro/strings.xml | 22 + .../dialer/widget/res/values-ru/strings.xml | 22 + .../dialer/widget/res/values-si/strings.xml | 22 + .../dialer/widget/res/values-sk/strings.xml | 22 + .../dialer/widget/res/values-sl/strings.xml | 22 + .../dialer/widget/res/values-sq/strings.xml | 22 + .../dialer/widget/res/values-sr/strings.xml | 21 + .../dialer/widget/res/values-sv/strings.xml | 21 + .../dialer/widget/res/values-sw/strings.xml | 22 + .../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 | 22 + .../dialer/widget/res/values-tr/strings.xml | 22 + .../dialer/widget/res/values-uk/strings.xml | 21 + .../dialer/widget/res/values-ur/strings.xml | 21 + .../dialer/widget/res/values-uz/strings.xml | 22 + .../dialer/widget/res/values-vi/strings.xml | 22 + .../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 | 22 + .../dialer/widget/res/values-zu/strings.xml | 22 + .../android/dialer/widget/res/values/colors.xml | 4 + .../android/dialer/widget/res/values/dimens.xml | 5 + .../android/dialer/widget/res/values/strings.xml | 30 ++ 1139 files changed, 22430 insertions(+), 5804 deletions(-) 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 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 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 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_results_phone.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_results_phone.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_results_phone.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_results_phone.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/ic_search_phone.xml create mode 100644 java/com/android/dialer/app/res/drawable/ic_wifi_calling.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/empty_content_view.xml create mode 100644 java/com/android/dialer/app/voicemail/error/VoicemailTosMessageCreator.java delete mode 100644 java/com/android/dialer/app/widget/EmptyContentView.java create mode 100644 java/com/android/dialer/binary/aosp/testing/AndroidManifest.xml create mode 100644 java/com/android/dialer/binary/aosp/testing/TestActivity.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/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 create mode 100644 java/com/android/dialer/calllog/testing/FakeCallLogApplication.java delete mode 100644 java/com/android/dialer/calllog/ui/AnnotatedCallLogCursorLoader.java create mode 100644 java/com/android/dialer/calllog/ui/NewCallLogAdapter.java create mode 100644 java/com/android/dialer/calllog/ui/NewCallLogViewHolder.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/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/TrafficStatsTags.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/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/dialercontact/dialer_contact.proto create mode 100644 java/com/android/dialer/inject/ApplicationContext.java 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 delete mode 100644 java/com/android/dialer/notification/GroupedNotificationUtil.java create mode 100644 java/com/android/dialer/notification/NotificationChannelId.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/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/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/SearchContactCursor.java create mode 100644 java/com/android/dialer/searchfragment/cp2/SearchContactViewHolder.java create mode 100644 java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java 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/nearbyplaces/AndroidManifest.xml create mode 100644 java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlaceViewHolder.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/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/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..527dbff18 100644 --- a/java/com/android/dialer/app/DialtactsActivity.java +++ b/java/com/android/dialer/app/DialtactsActivity.java @@ -71,10 +71,12 @@ 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.CallLogFragment; import com.android.dialer.app.calllog.CallLogNotificationsService; import com.android.dialer.app.dialpad.DialpadFragment; 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; @@ -92,6 +94,7 @@ 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.configprovider.ConfigProviderBindings; import com.android.dialer.database.Database; import com.android.dialer.database.DialerDatabaseHelper; import com.android.dialer.interactions.PhoneNumberInteraction; @@ -99,20 +102,24 @@ import com.android.dialer.interactions.PhoneNumberInteraction.InteractionErrorCo 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 +137,7 @@ public class DialtactsActivity extends TransactionSafeActivity DialpadFragment.OnDialpadQueryChangedListener, OnListFragmentScrolledListener, CallLogFragment.HostInterface, + CallLogAdapter.OnActionModeStateChangedListener, DialpadFragment.HostInterface, OldSpeedDialFragment.HostInterface, SearchFragment.HostInterface, @@ -147,6 +155,7 @@ public class DialtactsActivity extends TransactionSafeActivity 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,6 +163,7 @@ 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"; @@ -162,6 +172,7 @@ public class DialtactsActivity extends TransactionSafeActivity private static final int ACTIVITY_REQUEST_CODE_VOICE_SEARCH = 1; public static final int ACTIVITY_REQUEST_CODE_CALL_COMPOSE = 2; + public static final int ACTIVITY_REQUEST_CODE_LIGHTBRINGER = 3; private static final int FAB_SCALE_IN_DELAY_MS = 300; @@ -180,6 +191,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 +239,9 @@ public class DialtactsActivity extends TransactionSafeActivity private P13nLogger mP13nLogger; private P13nRanker mP13nRanker; + public boolean isMultiSelectModeEnabled; + + private boolean isLastTabEnabled; AnimationListenerAdapter mSlideInListener = new AnimationListenerAdapter() { @@ -256,12 +273,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: 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 +300,8 @@ public class DialtactsActivity extends TransactionSafeActivity mSmartDialSearchFragment.setQueryString(mSearchQuery); } else if (mRegularSearchFragment != null && mRegularSearchFragment.isVisible()) { mRegularSearchFragment.setQueryString(mSearchQuery); + } else if (mNewSearchFragment != null) { + mNewSearchFragment.setQuery(mSearchQuery); } } @@ -289,6 +314,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,9 +332,13 @@ 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(); } } @@ -355,6 +385,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); @@ -480,6 +511,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 +580,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); } } @@ -593,6 +632,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 +673,8 @@ public class DialtactsActivity extends TransactionSafeActivity } else if (fragment instanceof ListsFragment) { mListsFragment = (ListsFragment) fragment; mListsFragment.addOnPageChangeListener(this); + } else if (fragment instanceof NewSearchFragment) { + mNewSearchFragment = (NewSearchFragment) fragment; } if (fragment instanceof SearchFragment) { final SearchFragment searchFragment = (SearchFragment) fragment; @@ -664,13 +709,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(); @@ -700,6 +740,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 +751,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; } @@ -785,6 +829,7 @@ public class DialtactsActivity extends TransactionSafeActivity if (animate) { mFloatingActionButtonController.scaleOut(); + maybeEnterSearchUi(); } else { mFloatingActionButtonController.setVisible(false); maybeEnterSearchUi(); @@ -1007,6 +1052,16 @@ 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); + } } } @@ -1057,7 +1112,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 +1126,52 @@ 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: 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: add p13n ranker to new search. + } + + if (!smartDialSearch && !useNewSearch) { + ((SearchFragment) fragment).setQueryString(query); + } else if (useNewSearch) { + ((NewSearchFragment) fragment).setQuery(query); } transaction.commit(); @@ -1146,6 +1217,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 +1237,8 @@ public class DialtactsActivity extends TransactionSafeActivity @Override public void onBackPressed() { + PerformanceReport.recordClick(UiAction.Type.PRESS_ANDROID_BACK_BUTTON); + if (mStateSaved) { return; } @@ -1247,6 +1323,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 +1332,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); @@ -1381,18 +1459,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 +1543,17 @@ public class DialtactsActivity extends TransactionSafeActivity Arrays.toString(grantResults))); } + @Override + public void onActionModeStateChanged(boolean isEnabled) { + isMultiSelectModeEnabled = isEnabled; + } + + @Override + public boolean isActionModeStateEnabled() { + return isMultiSelectModeEnabled; + } + + /** Popup menu accessible from the search bar */ protected class OptionsPopupMenu extends PopupMenu { public OptionsPopupMenu(Context context, View anchor) { @@ -1505,6 +1582,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 index 85c2ea650..20222d68c 100644 --- a/java/com/android/dialer/app/SpecialCharSequenceMgr.java +++ b/java/com/android/dialer/app/SpecialCharSequenceMgr.java @@ -47,7 +47,6 @@ import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment.Selec 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; @@ -299,9 +298,7 @@ public class SpecialCharSequenceMgr { : R.string.meid; List deviceIds = new ArrayList(); - if (TelephonyManagerCompat.getPhoneCount(telephonyManager) > 1 - && CompatUtils.isMethodAvailable( - TelephonyManagerCompat.TELEPHONY_MANAGER_CLASS, "getDeviceId", Integer.TYPE)) { + if (TelephonyManagerCompat.getPhoneCount(telephonyManager) > 1) { for (int slot = 0; slot < telephonyManager.getPhoneCount(); slot++) { String deviceId = telephonyManager.getDeviceId(slot); if (!TextUtils.isEmpty(deviceId)) { 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..6433af9a6 100644 --- a/java/com/android/dialer/app/calllog/CallLogActivity.java +++ b/java/com/android/dialer/app/calllog/CallLogActivity.java @@ -34,6 +34,9 @@ import com.android.dialer.app.R; 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 +51,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 +95,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 +138,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 +158,7 @@ public class CallLogActivity extends TransactionSafeActivity @Override public void onPageSelected(int position) { if (mIsResumed) { - sendScreenViewForChildFragment(position); + sendScreenViewForChildFragment(); } mViewPagerTabs.onPageSelected(position); } @@ -158,7 +168,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 +179,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 +205,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; } diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java index 2f8a58c8a..f1d051a8c 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; @@ -66,10 +66,10 @@ import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; 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; @@ -80,12 +80,15 @@ 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.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -105,11 +108,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 +121,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 +142,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 +152,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 +177,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 +190,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 +275,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); @@ -253,27 +298,26 @@ public class CallLogAdapter extends GroupingListAdapter 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); + Logger.get(mActivity) + .logImpression(DialerImpression.Type.MULTISELECT_SINGLE_PRESS_SELECT_ENTRY); + checkMarkCallLogEntry(viewHolder); } - - if (selectedItems.size() == 0) { - mActionMode.finish(); - return; - } - mActionMode.setTitle(Integer.toString(selectedItems.size())); return; } @@ -312,6 +356,50 @@ public class CallLogAdapter extends GroupingListAdapter } }; + 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); @@ -358,6 +446,8 @@ public class CallLogAdapter extends GroupingListAdapter Activity activity, ViewGroup alertContainer, CallFetcher callFetcher, + MultiSelectRemoveView multiSelectRemoveView, + OnActionModeStateChangedListener actionModeStateChangedListener, CallLogCache callLogCache, ContactInfoCache contactInfoCache, VoicemailPlaybackPresenter voicemailPlaybackPresenter, @@ -367,6 +457,8 @@ public class CallLogAdapter extends GroupingListAdapter mActivity = activity; mCallFetcher = callFetcher; + mActionModeStateChangedListener = actionModeStateChangedListener; + mMultiSelectRemoveView = multiSelectRemoveView; mVoicemailPlaybackPresenter = voicemailPlaybackPresenter; if (mVoicemailPlaybackPresenter != null) { mVoicemailPlaybackPresenter.setOnVoicemailDeletedListener(this); @@ -426,6 +518,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 +545,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 +659,7 @@ public class CallLogAdapter extends GroupingListAdapter mBlockReportSpamListener, mExpandCollapseListener, mLongPressListener, + mActionModeStateChangedListener, mCallLogCache, mCallLogListItemHelper, mVoicemailPlaybackPresenter); @@ -546,7 +685,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 +698,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 +732,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 +752,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, @@ -840,8 +994,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 +1070,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 +1084,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 +1350,49 @@ 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(); + } } diff --git a/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java b/java/com/android/dialer/app/calllog/CallLogAsyncTaskUtil.java index a5553d134..10866aae2 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(); } @@ -66,9 +68,7 @@ public class CallLogAsyncTaskUtil { uploadVoicemailLocalChangesToServer(context); } - Intent intent = new Intent(context, CallLogNotificationsService.class); - intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_VOICEMAILS_AS_OLD); - context.startService(intent); + CallLogNotificationsService.markAllNewVoicemailsAsOld(context); return null; } }); diff --git a/java/com/android/dialer/app/calllog/CallLogFragment.java b/java/com/android/dialer/app/calllog/CallLogFragment.java index 6e4b23fc1..b03a4ad64 100644 --- a/java/com/android/dialer/app/calllog/CallLogFragment.java +++ b/java/com/android/dialer/app/calllog/CallLogFragment.java @@ -35,53 +35,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,6 +105,9 @@ 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; @@ -123,6 +141,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,6 +213,7 @@ 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(); @@ -290,12 +310,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,6 +345,10 @@ public class CallLogFragment extends Fragment getActivity(), mRecyclerView, this, + this, + activityType == CallLogAdapter.ACTIVITY_TYPE_DIALTACTS + ? (CallLogAdapter.OnActionModeStateChangedListener) getActivity() + : null, CallLogCache.getCallLogCache(getActivity()), mContactInfoCache, getVoicemailPlaybackPresenter(), @@ -335,9 +367,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); @@ -379,6 +420,16 @@ public class CallLogFragment extends Fragment super.onPause(); } + @Override + public void onStart() { + super.onStart(); + CequintCallerIdManager cequintCallerIdManager = null; + if (CequintCallerIdManager.isCequintCallerIdEnabled(getContext())) { + cequintCallerIdManager = CequintCallerIdManager.createInstanceForCallLog(); + } + mContactInfoCache.setCequintCallerIdManager(cequintCallerIdManager); + } + @Override public void onStop() { updateOnTransition(); @@ -407,7 +458,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 +502,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); } } @@ -503,7 +556,8 @@ public class CallLogFragment extends Fragment if (mKeyguardManager != null && !mKeyguardManager.inKeyguardRestrictedInputMode() && mCallTypeFilter == Calls.VOICEMAIL_TYPE) { - CallLogNotificationsService.markNewVoicemailsAsOld(getActivity(), null); + LogUtil.i("CallLogFragment.updateOnTransition", "clearing all new voicemails"); + CallLogNotificationsService.markAllNewVoicemailsAsOld(getActivity()); } } @@ -514,9 +568,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 +585,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 +648,44 @@ 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 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..c59f0dd61 100644 --- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java +++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java @@ -17,6 +17,7 @@ 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; @@ -25,32 +26,37 @@ import android.os.AsyncTask; 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.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.lettertiles.LetterTileDrawable; +import com.android.contacts.common.lettertiles.LetterTileDrawable.ContactType; 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 +64,31 @@ 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.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.compat.CompatUtils; +import com.android.dialer.configprovider.ConfigProviderBindings; +import com.android.dialer.dialercontact.DialerContact; +import com.android.dialer.dialercontact.SimDetails; 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.util.CallUtil; import com.android.dialer.util.DialerUtils; +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 +104,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. */ @@ -108,6 +122,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder 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. */ @@ -201,6 +216,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 +232,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 +247,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder mContext = context; mExpandCollapseListener = expandCollapseListener; + onActionModeStateChangedListener = actionModeStateChangedListener; longPressListener = longClickListener; mCallLogCache = callLogCache; mCallLogListItemHelper = callLogListItemHelper; @@ -238,7 +256,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder mCachedNumberLookupService = PhoneNumberCache.get(mContext).getCachedNumberLookupService(); this.rootView = rootView; - this.quickContactView = quickContactView; + this.quickContactView = dialerQuickContactView; this.primaryActionView = primaryActionView; this.phoneCallDetailsViews = phoneCallDetailsViews; this.callLogEntryView = callLogEntryView; @@ -251,6 +269,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 +299,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 +312,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 +322,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,6 +336,11 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder } public static CallLogListItemViewHolder createForTest(Context context) { + return createForTest(context, null); + } + + static CallLogListItemViewHolder createForTest( + Context context, VoicemailPlaybackPresenter voicemailPlaybackPresenter) { Resources resources = context.getResources(); CallLogCache callLogCache = CallLogCache.getCallLogCache(context); PhoneCallDetailsHelper phoneCallDetailsHelper = @@ -308,11 +352,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder null, null /* 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 +501,17 @@ 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()) { + 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 +523,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); @@ -513,8 +569,15 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder return; } - if (!TextUtils.isEmpty(voicemailUri) && canPlaceCallToNumber) { + if (canPlaceCallToNumber) { + // Set up the call button but hide it by default (the primary action is to call so it is + // redundant). 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.setTag(IntentProvider.getReturnCallIntentProvider(number)); + callButtonView.setVisibility(View.GONE); + } + + if (!TextUtils.isEmpty(voicemailUri) && canPlaceCallToNumber) { ((TextView) callButtonView.findViewById(R.id.call_action_text)) .setText( TextUtils.expandTemplate( @@ -529,13 +592,14 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder callTypeOrLocationView.setVisibility(View.GONE); } callButtonView.setVisibility(View.VISIBLE); - } else { - callButtonView.setVisibility(View.GONE); } if (hasPlacedCarrierVideoCall() || canSupportCarrierVideoCall()) { videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number)); videoCallButtonView.setVisibility(View.VISIBLE); + } else if (showLightbringerPrimaryButton()) { + callButtonView.setVisibility(View.VISIBLE); + videoCallButtonView.setVisibility(View.GONE); } else if (lightbringerReady) { videoCallButtonView.setTag(IntentProvider.getLightbringerIntentProvider(number)); videoCallButtonView.setVisibility(View.VISIBLE); @@ -567,8 +631,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 +684,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,9 +709,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder if (accountHandle == null) { return false; } - if (accountHandle - .getComponentName() - .equals(getLightbringer().getPhoneAccountComponentName(mContext))) { + if (accountHandle.getComponentName().equals(getLightbringer().getPhoneAccountComponentName())) { return false; } return true; @@ -717,19 +789,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 @@ -795,19 +862,45 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder 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; + } + + // 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 (getLightbringer().getPackageName().equals(packageName)) { + startLightbringerActivity(intent); + } else { + if (intent.getComponent() != null + && CallDetailsActivity.class.getName().equals(intent.getComponent().getClassName())) { + // We are going to open call detail + PerformanceReport.recordClick(UiAction.Type.OPEN_CALL_DETAIL); } + DialerUtils.startActivityWithErrorToast(mContext, intent); } } } - private CallComposerContact buildContact() { - CallComposerContact.Builder contact = CallComposerContact.newBuilder(); + private void startLightbringerActivity(Intent intent) { + try { + Activity activity = (Activity) mContext; + activity.startActivityForResult(intent, DialtactsActivity.ACTIVITY_REQUEST_CODE_LIGHTBRINGER); + } catch (ActivityNotFoundException e) { + Toast.makeText(mContext, R.string.activity_not_available, Toast.LENGTH_SHORT).show(); + } + } + + private DialerContact buildContact() { + DialerContact.Builder contact = DialerContact.newBuilder(); contact.setPhotoId(info.photoId); if (info.photoUri != null) { contact.setPhotoUri(info.photoUri.toString()); @@ -826,6 +919,19 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder } /* 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); + int color = mCallLogCache.getAccountColor(accountHandle); + if (color == PhoneAccount.NO_HIGHLIGHT_COLOR) { + simDetails.setColor(R.color.secondary_text_color); + } else { + simDetails.setColor(color); + } + contact.setSimDetails(simDetails.build()); + } return contact.build(); } @@ -834,8 +940,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 +1123,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..be1ebfb6d 100644 --- a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java +++ b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java @@ -17,12 +17,13 @@ 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 com.android.dialer.common.LogUtil; import com.android.dialer.telecom.TelecomUtil; import com.android.dialer.util.PermissionsUtil; @@ -43,16 +44,20 @@ 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"; + private 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. */ @@ -64,7 +69,7 @@ public class CallLogNotificationsService extends IntentService { * *

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 +77,9 @@ 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"; public static final int UNKNOWN_MISSED_CALL_COUNT = -1; - private VoicemailQueryHandler mVoicemailQueryHandler; public CallLogNotificationsService() { super("CallLogNotificationsService"); @@ -89,52 +93,95 @@ 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.setAction(CallLogNotificationsService.ACTION_MARK_ALL_NEW_VOICEMAILS_AS_OLD); + context.startService(serviceIntent); + } + + public static void markSingleNewVoicemailAsOld(Context context, @Nullable Uri voicemailUri) { + LogUtil.enterBlock("CallLogNotificationsService.markSingleNewVoicemailAsOld"); + Intent serviceIntent = new Intent(context, CallLogNotificationsService.class); + serviceIntent.setAction(CallLogNotificationsService.ACTION_MARK_SINGLE_NEW_VOICEMAIL_AS_OLD); serviceIntent.setData(voicemailUri); context.startService(serviceIntent); } - public static void markNewMissedCallsAsOld(Context context, @Nullable Uri callUri) { + 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 void cancelAllMissedCalls(@NonNull Context context) { + LogUtil.enterBlock("CallLogNotificationsService.cancelAllMissedCalls"); Intent serviceIntent = new Intent(context, CallLogNotificationsService.class); - serviceIntent.setAction(ACTION_MARK_NEW_MISSED_CALLS_AS_OLD); - serviceIntent.setData(callUri); + serviceIntent.setAction(ACTION_CANCEL_ALL_MISSED_CALLS); context.startService(serviceIntent); } + 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); + } + @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_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: + CallLogNotificationsQueryHelper.markAllMissedCallsInCallLogAsRead(this); + MissedCallNotifier.cancelAllMissedCallNotifications(this); + TelecomUtil.cancelMissedCallsNotification(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,7 +192,7 @@ 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; } } 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..155a91618 100644 --- a/java/com/android/dialer/app/calllog/ClearCallLogDialog.java +++ b/java/com/android/dialer/app/calllog/ClearCallLogDialog.java @@ -54,7 +54,7 @@ public class ClearCallLogDialog extends DialogFragment { ProgressDialog.show( getActivity(), getString(R.string.clearCallLogProgress_title), "", true, false); progressDialog.setOwnerActivity(getActivity()); - CallLogNotificationsService.markNewMissedCallsAsOld(getContext(), null); + CallLogNotificationsService.cancelAllMissedCalls(getContext()); final AsyncTask task = new AsyncTask() { @Override 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..e1ec9f509 100644 --- a/java/com/android/dialer/app/calllog/IntentProvider.java +++ b/java/com/android/dialer/app/calllog/IntentProvider.java @@ -24,12 +24,14 @@ 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.logging.DialerImpression; +import com.android.dialer.logging.Logger; import com.android.dialer.util.CallUtil; import com.android.dialer.util.IntentUtil; import java.util.ArrayList; @@ -68,6 +70,7 @@ public abstract class IntentProvider { return new IntentProvider() { @Override public Intent getIntent(Context context) { + Logger.get(context).logImpression(DialerImpression.Type.IMS_VIDEO_REQUESTED_FROM_CALL_LOG); return new CallIntentBuilder(number, CallInitiationType.Type.CALL_LOG) .setPhoneAccountHandle(accountHandle) .setIsVideoCall(true) @@ -80,6 +83,8 @@ public abstract class IntentProvider { return new IntentProvider() { @Override public Intent getIntent(Context context) { + Logger.get(context) + .logImpression(DialerImpression.Type.LIGHTBRINGER_VIDEO_REQUESTED_FROM_CALL_LOG); return LightbringerComponent.get(context).getLightbringer().getIntent(context, number); } }; @@ -112,11 +117,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..428c71677 --- /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.NotificationManager; +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.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); + context + .getSystemService(NotificationManager.class) + .notify(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)); + + 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()); + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + notificationManager.cancel(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..e0e3fdf3f 100644 --- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java +++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java @@ -30,11 +30,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 +48,20 @@ 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.NotificationChannelId; 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; + static final String NOTIFICATION_TAG_PREFIX = "MissedCall_"; + static final String NOTIFICATION_GROUP = "MissedCall"; + private static final int NOTIFICATION_ID = 1; private final Context context; private final CallLogNotificationsQueryHelper callLogNotificationsQueryHelper; @@ -104,7 +103,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 +146,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,36 +181,39 @@ 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); + getNotificationMgr().notify(getNotificationTagForGroupSummary(), NOTIFICATION_ID, notification); if (useCallList) { // Do not repost active notifications to prevent erasing post call notes. NotificationManager manager = getNotificationMgr(); - Set activeTags = new HashSet<>(); + Set activeTags = new ArraySet<>(); for (StatusBarNotification activeNotification : manager.getActiveNotifications()) { 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)); } @@ -218,6 +221,59 @@ public class MissedCallNotifier implements Worker, Void> { } } + public static void cancelAllMissedCallNotifications(@NonNull Context context) { + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + for (StatusBarNotification notification : notificationManager.getActiveNotifications()) { + String tag = notification.getTag(); + if (tag != null && tag.startsWith(NOTIFICATION_TAG_PREFIX)) { + notificationManager.cancel(tag, notification.getId()); + } + } + } + + 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; + } + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + String callTag = getNotificationTagForCallUri(callUri); + String summaryTag = getNotificationTagForGroupSummary(); + int notificationCount = 0; + + for (StatusBarNotification notification : notificationManager.getActiveNotifications()) { + String currentTag = notification.getTag(); + if (currentTag == null) { + continue; + } + if (currentTag.equals(callTag)) { + notificationManager.cancel(notification.getTag(), notification.getId()); + } else if (currentTag.startsWith(NOTIFICATION_TAG_PREFIX) && !currentTag.equals(summaryTag)) { + notificationCount++; + } + } + + if (notificationCount == 0) { + // There are no more missed call notifications. Remove the summary notification too. + notificationManager.cancel(summaryTag, NOTIFICATION_ID); + } + } + + private static String getNotificationTagForGroupSummary() { + return NOTIFICATION_TAG_PREFIX + "GroupSummary"; + } + + 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()) { @@ -226,7 +282,9 @@ public class MissedCallNotifier implements Worker, Void> { // Update the first notification that matches our post call note sender. getNotificationMgr() .notify( - call.callsUri.toString(), NOTIFICATION_ID, getNotificationForCall(call, note)); + getNotificationTagForCall(call), + NOTIFICATION_ID, + getNotificationForCall(call, note)); break; } } @@ -308,7 +366,7 @@ public class MissedCallNotifier implements Worker, Void> { private Notification.Builder createNotificationBuilder() { return new Notification.Builder(context) - .setGroup(NOTIFICATION_TAG) + .setGroup(NOTIFICATION_GROUP) .setSmallIcon(android.R.drawable.stat_notify_missed_call) .setColor(context.getResources().getColor(R.color.dialer_theme_color, null)) .setAutoCancel(true) @@ -321,10 +379,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 +394,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 +406,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 +435,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); 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/VisualVoicemailNotifier.java b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java new file mode 100644 index 000000000..99fe466d8 --- /dev/null +++ b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java @@ -0,0 +1,291 @@ +/* + * 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.NotificationManager; +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.service.notification.StatusBarNotification; +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.NotificationChannelManager; +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 { + private static final String NOTIFICATION_TAG_PREFIX = "VisualVoicemail_"; + private static final String NOTIFICATION_GROUP = "VisualVoicemail"; + private static final int NOTIFICATION_ID = 1; + + 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)); + } + + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + notificationManager.notify( + getNotificationTagForGroupSummary(), NOTIFICATION_ID, groupSummary.build()); + + for (NewCall voicemail : newCalls) { + notificationManager.notify( + getNotificationTagForVoicemail(voicemail), + NOTIFICATION_ID, + createNotificationForVoicemail(context, voicemail, contactInfos)); + } + } + + public static void cancelAllVoicemailNotifications(@NonNull Context context) { + LogUtil.enterBlock("VisualVoicemailNotifier.cancelAllVoicemailNotifications"); + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + for (StatusBarNotification notification : notificationManager.getActiveNotifications()) { + String tag = notification.getTag(); + if (tag != null && tag.startsWith(NOTIFICATION_TAG_PREFIX)) { + notificationManager.cancel(tag, notification.getId()); + } + } + } + + 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; + } + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + String voicemailTag = getNotificationTagForUri(voicemailUri); + String summaryTag = getNotificationTagForGroupSummary(); + int notificationCount = 0; + + for (StatusBarNotification notification : notificationManager.getActiveNotifications()) { + String currentTag = notification.getTag(); + if (currentTag == null) { + continue; + } + if (currentTag.equals(voicemailTag)) { + notificationManager.cancel(notification.getTag(), notification.getId()); + } else if (currentTag.startsWith(NOTIFICATION_TAG_PREFIX) && !currentTag.equals(summaryTag)) { + notificationCount++; + } + } + + if (notificationCount == 0) { + // There are no more visual voicemail notifications. Remove the summary notification too. + notificationManager.cancel(summaryTag, 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 String getNotificationTagForGroupSummary() { + return NOTIFICATION_TAG_PREFIX + "GroupSummary"; + } + + 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(NOTIFICATION_GROUP) + .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..6728dfb38 100644 --- a/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java +++ b/java/com/android/dialer/app/calllog/calllogcache/CallLogCache.java @@ -19,7 +19,6 @@ package com.android.dialer.app.calllog.calllogcache; import android.content.Context; import android.telecom.PhoneAccountHandle; import com.android.dialer.app.calllog.CallLogAdapter; -import com.android.dialer.compat.CompatUtils; import com.android.dialer.util.CallUtil; /** @@ -46,10 +45,7 @@ public abstract class CallLogCache { /** 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); + return new CallLogCacheLollipopMr1(context); } public void reset() { 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 index 039998780..f85680649 100644 --- a/java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipopMr1.java +++ b/java/com/android/dialer/app/calllog/calllogcache/CallLogCacheLollipopMr1.java @@ -17,15 +17,11 @@ 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 com.android.dialer.telecom.TelecomUtil; 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 @@ -36,15 +32,6 @@ import java.util.concurrent.ConcurrentHashMap; */ 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<>(); @@ -55,7 +42,6 @@ class CallLogCacheLollipopMr1 extends CallLogCache { @Override public void reset() { - mVoicemailQueryCache.clear(); mPhoneAccountLabelCache.clear(); mPhoneAccountColorCache.clear(); mPhoneAccountCallWithNoteCache.clear(); @@ -65,19 +51,7 @@ class CallLogCacheLollipopMr1 extends CallLogCache { @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; + return TelecomUtil.isVoicemailNumber(mContext, accountHandle, number.toString()); } @Override diff --git a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java index e561b5607..82fc229af 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) { + if (info != null && !info.contactExists) { // TODO: 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/dialpad/DialpadFragment.java b/java/com/android/dialer/app/dialpad/DialpadFragment.java index e9d57b399..d33943773 100644 --- a/java/com/android/dialer/app/dialpad/DialpadFragment.java +++ b/java/com/android/dialer/app/dialpad/DialpadFragment.java @@ -29,6 +29,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -84,6 +85,9 @@ 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.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; @@ -626,6 +630,14 @@ public class DialpadFragment extends Fragment 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)); + final DialtactsActivity activity = (DialtactsActivity) getActivity(); mDialpadQueryListener = activity; @@ -1005,6 +1017,8 @@ public class DialpadFragment extends Fragment */ 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(); @@ -1015,6 +1029,7 @@ public class DialpadFragment extends Fragment 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."); @@ -1051,6 +1066,10 @@ public class DialpadFragment extends Fragment 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); diff --git a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java index f71517a44..d98395ec7 100644 --- a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java +++ b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java @@ -28,6 +28,7 @@ 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.lettertiles.LetterTileDrawable; import com.android.contacts.common.util.UriUtils; import com.android.dialer.app.R; import com.android.dialer.compat.CompatUtils; @@ -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/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..822aa789f 100644 --- a/java/com/android/dialer/app/list/DialtactsPagerAdapter.java +++ b/java/com/android/dialer/app/list/DialtactsPagerAdapter.java @@ -28,8 +28,8 @@ 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.database.CallLogQueryHandler; import com.android.dialer.speeddial.SpeedDialFragment; @@ -78,7 +78,7 @@ public class DialtactsPagerAdapter extends FragmentPagerAdapter { 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)); diff --git a/java/com/android/dialer/app/list/ListsFragment.java b/java/com/android/dialer/app/list/ListsFragment.java index 8dd52a9d4..3f03db1e8 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; @@ -77,10 +79,12 @@ public class ListsFragment extends Fragment 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 @@ -151,6 +155,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 +173,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 +190,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 +200,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 +222,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 +250,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); @@ -375,7 +386,7 @@ public class ListsFragment extends Fragment public void markMissedCallsAsReadAndRemoveNotifications() { if (mCallLogQueryHandler != null) { mCallLogQueryHandler.markMissedCallsAsRead(); - CallLogNotificationsService.markNewMissedCallsAsOld(getContext(), null); + CallLogNotificationsService.cancelAllMissedCalls(getContext()); } } @@ -385,6 +396,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..05d017b28 100644 --- a/java/com/android/dialer/app/list/OldSpeedDialFragment.java +++ b/java/com/android/dialer/app/list/OldSpeedDialFragment.java @@ -50,13 +50,13 @@ 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.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..eb4f8e967 100644 --- a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java +++ b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java @@ -18,16 +18,22 @@ package com.android.dialer.app.list; import android.content.ClipData; import android.content.Context; +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.lettertiles.LetterTileDrawable; import com.android.contacts.common.list.ContactEntry; import com.android.contacts.common.list.ContactTileView; 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.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 +48,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 +60,8 @@ public abstract class PhoneFavoriteTileView extends ContactTileView { private View mShadowOverlay; /** Users' most frequent phone number. */ private String mPhoneNumberString; + private boolean isPinned; + private boolean isStarred; public PhoneFavoriteTileView(Context context, AttributeSet attrs) { super(context, attrs); @@ -83,6 +90,8 @@ 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) { // Grab the phone-number to call directly. See {@link onClick()}. mPhoneNumberString = entry.phoneNumber; @@ -113,16 +122,37 @@ public abstract class PhoneFavoriteTileView extends ContactTileView { if (mListener == null) { return; } + + CallSpecificAppData.Builder callSpecificAppData = + CallSpecificAppData.newBuilder() + .setCallInitiationType(CallInitiationType.Type.SPEED_DIAL) + .setSpeedDialContactPosition( + ((PhoneFavoriteListView) v.getParent()).getPositionForView(v)); + 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 +163,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); diff --git a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java index c692ecac7..876fbf146 100644 --- a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java +++ b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java @@ -30,7 +30,6 @@ 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; @@ -41,6 +40,11 @@ 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.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; @@ -455,8 +524,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 +679,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..728948bfc 100644 --- a/java/com/android/dialer/app/list/RegularSearchFragment.java +++ b/java/com/android/dialer/app/list/RegularSearchFragment.java @@ -25,12 +25,14 @@ 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.phonenumbercache.CachedNumberLookupService; 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, @@ -114,8 +116,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); + } } } 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..00a2708a1 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.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/SmartDialSearchFragment.java b/java/com/android/dialer/app/list/SmartDialSearchFragment.java index eb1508c72..2ebc06bc3 100644 --- a/java/com/android/dialer/app/list/SmartDialSearchFragment.java +++ b/java/com/android/dialer/app/list/SmartDialSearchFragment.java @@ -29,11 +29,12 @@ 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.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_wifi_calling.xml b/java/com/android/dialer/app/res/drawable/ic_wifi_calling.xml new file mode 100644 index 000000000..968713376 --- /dev/null +++ b/java/com/android/dialer/app/res/drawable/ic_wifi_calling.xml @@ -0,0 +1,29 @@ + + + + + + + \ No newline at end of file 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/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:src="@drawable/ic_check_mark_48dp" /> 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..504638348 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 @@ -50,7 +50,7 @@ + android:text="@string/call"/> + android:src="@drawable/ic_phone_attach"/> + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + android:id="@+id/spacer" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:background="#00000000"/> + android:layout_width="match_parent" + android:layout_height="@dimen/shadow_length" + android:background="@drawable/shadow_fade_up"/> + android:id="@+id/dialpadChooser" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/background_dialer_light" + android:visibility="gone"/> + android:id="@+id/dialpad_floating_action_button_margin_bottom" + android:layout_width="match_parent" + android:layout_height="@dimen/floating_action_button_margin_bottom" + android:layout_alignParentBottom="true"/> + android:src="@drawable/quantum_ic_call_vd_theme_24" + app:backgroundTint="@color/dialpad_fab_green" + app:colorControlNormal="#ffffff" + app:elevation="@dimen/floating_action_button_translation_z"/> 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: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/values-af/strings.xml b/java/com/android/dialer/app/res/values-af/strings.xml index 2eb462b1c..40e297386 100644 --- a/java/com/android/dialer/app/res/values-af/strings.xml +++ b/java/com/android/dialer/app/res/values-af/strings.xml @@ -80,11 +80,16 @@ "Voeg wagtyd by" "Instellings" "Nabootser" + "Skep nuwe UI-kortpad" "Alle kontakte" "Gebruik raak-nommerbord" "Keer terug na oproep wat besig is" "Voeg oproep by" "Inkomende oproepe" + "Gaan tans grootmaathandelingmodus in" + "Het grootmaathandelingmodus verlaat" + "Het %1$s gekies" + "Het %1$s ontkies" "Speel stemboodskap" "Bekyk kontak %1$s" "Bel %1$s" @@ -99,11 +104,15 @@ "Stemboodskap" "%s sek." "%s min. %s sek." - "stemboodskap" - "stemboodskappe" - "Ja" - "Nee" + "Kanselleer grootmaathandelingmodus" + "Vee uit" + "Kanselleer" "Vee geselekteerde %1$s uit?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..08b52a6ee 100644 --- a/java/com/android/dialer/app/res/values-am/strings.xml +++ b/java/com/android/dialer/app/res/values-am/strings.xml @@ -80,11 +80,16 @@ "መጠበቅ አክል" "ቅንብሮች" "ማስመሰያ" + "አዲስ የዩአይ አቋራጭ ፍጠር" "ሁሉም እውቅያዎች" "የድምፅ ቁልፍ ሰሌዳን ንካ" "በመካሄድ ላይ ወዳለው ጥሪ ተመለስ" "ጥሪ ያክሉ" "ገቢ ጥሪዎች" + "ወደ የጅምላ እርምጃ ሁነታ በመግባት ላይ" + "ከጅምላ እርምጃ ሁነታ ለቀው ወጥተዋል" + "%1$s ተመርጧል" + "%1$s አልተመረጠም" "የድምፅ መልዕክት አጫውት" "ዕውቂያ %1$s ዕይ" "ጥሪ %1$s" @@ -99,11 +104,15 @@ "የድምፅ መልዕክት" "%s ሰከንድ" "%s ደቂቃ %s ሴከ" - "የድምፅ መልዕክት" - "የድምፅ መልዕክቶች" - "አዎ" - "አይ" + "የጅምላ እርምጃ ሁነታ ይቅር" + "ሰርዝ" + "ይቅር" "የተመረጠው %1$s ይሰረዝ?" + "%1$s ተመርጠዋል" + + ""እነዚህ የድምፅ መልዕክቶች ይሰረዙ? "" + ""እነዚህ የድምፅ መልዕክቶች ይሰረዙ? "" + @string/call_log_header_today "%1$s %2$s ላይ" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "ከSIM ካርድ ላይ በመጫን ላይ..." "የSIM ካርድ ዕውቂያዎች" - "ምንም የእውቂያዎች መተግበሪያ አይገኝም" "የድምጽ ፍለጋ አይገኝም" "የስልክ መተግበሪያው ስለተሰናከለ የስልክ ጥሪ ማድረግ አይቻልም።" "ዕውቅያዎችን ፈልግ" @@ -145,10 +153,9 @@ "%s አዲስ ያልተመለሱ ጥሪዎች" "በፈጥኖ መደወያ ላይ ገና ማንም የለዎትም" "ተወዳጅ አክል" - "ገና ምንም እውቂያዎች የሉዎትም" - "ዕውቂያ አክል" "ሁሉንም ቁጥሮች ለማየት ምስል ይንኩ ወይም ዳግም ለመደርደር ነክተው ይያዙት" "አስወግድ" + "ሁሉንም ምረጥ" "የቪዲዮ ጥሪ" "መልእክት ላክ" "የጥሪ ዝርዝሮች" @@ -213,11 +220,9 @@ "የታገዱ ቁጥሮች" "%1$s ቀድሞውኑ ታግዷል።" "የመደወያ መለያዎች" - "አብራ" "ፍቃዶችን አዋቅር" "ፈጥኖ መደወያን ለማንቃት የእውቂያዎች ፍቃዱን ያብሩ።" "የጥሪ ምዝግብ ማስታወአሽዎን ለማየት የስልክ ፍቃዱን ያብሩ።" - "የእርስዎን እውቂያዎች ለማየት የእውቂያዎች ፍቃዱን ያብሩ።" "የድምፅ መልዕክትዎን ለመድረስ የስልክ ፍቃዱን ያብሩ።" "የእርስዎን እውቂያዎች ለመከታተል የእውቂያዎች ፍቃዶችን ያብሩ።" "ስልክ ለመደወል የስልክ ፍቃዱን ያብሩ።" 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..fe84a66ab 100644 --- a/java/com/android/dialer/app/res/values-ar/strings.xml +++ b/java/com/android/dialer/app/res/values-ar/strings.xml @@ -84,11 +84,16 @@ "إضافة انتظار" "الإعدادات" "المحاكي" + "إنشاء اختصار للواجهة الجديدة" "جميع جهات الاتصال" "استخدام لوحة مفاتيح نغمات باللمس" "عودة إلى المكالمة الجارية" "إضافة مكالمة" "المكالمات الواردة" + "يتم الدخول إلى وضع الإجراء المجمَّع" + "تمت مغادرة وضع الإجراء المجمَّع" + "تم تحديد %1$s" + "تم إلغاء تحديد %1$s" "تشغيل البريد الصوتي" "عرض جهة الاتصال %1$s" "الاتصال بـ %1$s" @@ -103,11 +108,19 @@ "البريد الصوتي" "%s ثانية" "%s دقيقة %s ثانية" - "البريد الصوتي" - "رسائل البريد الصوتي" - "نعم" - "لا" + "إلغاء وضع الإجراءات المجمَّع" + "حذف" + "إلغاء" "حذف رسائل %1$s المحددة؟" + "تم تحديد %1$s" + + ""حذف رسائل البريد الصوتي هذه؟ "" + ""حذف رسالتي البريد الصوتي هاتين؟ "" + ""حذف رسائل البريد الصوتي هذه؟ "" + ""حذف رسائل البريد الصوتي هذه؟ "" + ""حذف رسائل البريد الصوتي هذه؟ "" + ""حذف رسالة البريد الصوتي هذه؟ "" + @string/call_log_header_today "%1$s في %2$s" "%1$02d:%2$02d" @@ -120,7 +133,6 @@ "MEID" "‏جارٍ التحميل من شريحة SIM…" "‏شريحة SIM وجهات الاتصال" - "لا يتوفر تطبيق لجهات الاتصال" "البحث الصوتي غير متاح" "يتعذر إجراء مكالمة هاتفية نظرًا لأنه تم تعطيل تطبيق الهاتف." "البحث في جهات الاتصال" @@ -149,10 +161,9 @@ "%s من المكالمات الجديدة الفائتة" "لم تتم إضافة أية جهة اتصال إلى قائمة الاتصال السريع حتى الآن" "إضافة مفضلة" - "ليست لديك أية جهات اتصال حتى الآن" - "إضافة جهة اتصال" "المس الصورة للاطلاع على جميع الأرقام أو المس مع الاستمرار لإعادة الترتيب" "إزالة" + "تحديد الكل" "مكالمة فيديو" "إرسال رسالة" "تفاصيل المكالمة" @@ -221,11 +232,9 @@ "الأرقام المحظورة" "تم حظر %1$s." "حسابات الاتصال" - "تشغيل" "تعيين الأذونات" "لتمكين الاتصال السريع، شغِّل إذن جهات الاتصال." "للاطلاع على سجل المكالمات، شغِّل إذن الهاتف." - "للاطلاع على جهات الاتصال، شغِّل إذن جهات الاتصال." "للوصول إلى البريد الصوتي، شغِّل إذن الهاتف." "للبحث عن جهات الاتصال، عليك تشغيل أذونات جهات الاتصال." "لإجراء مكالمة، شغِّل إذن الهاتف." 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..f2b0cf35d 100644 --- a/java/com/android/dialer/app/res/values-az/strings.xml +++ b/java/com/android/dialer/app/res/values-az/strings.xml @@ -80,11 +80,16 @@ "Gözləmə əlavə edin" "Ayarlar" "Stimulyator" + "Yeni İİ Qısayolu yaradın" "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" + "Toplu əməliyyat rejiminə daxil olunur" + "Toplu əməliyyat rejimi tərk edilir" + "%1$s seçildi" + "%1$s seçilmədi" "Səsli məktubu oxudun" "%1$s adlı kontakta baxın" "Zəng %1$s" @@ -99,11 +104,15 @@ "Səsli poçt" "%s san" "%s dəq %s san" - "səsli e-məktub" - "səsli e-məktublar" - "Bəli" - "Xeyr" + "Qrup əməliyyatları rejimini ləğv edin" + "Silin" + "Ləğv edin" "Seçilmiş %1$s silinsin?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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ı" @@ -213,11 +220,9 @@ "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." 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..b011f7866 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 @@ -81,11 +81,16 @@ "Dodaj čekanje" "Podešavanja" "Simulator" + "Napravite prečicu za novi UI" "Svi kontakti" "Upotrebite brojčanik za tonsko biranje" "Vrati se na poziv koji je u toku" "Dodaj poziv" "Dolazni pozivi" + "Ulazite u režim grupnih radnji" + "Izašli ste iz režima grupnih radnji" + "Izabrano je %1$s" + "Opozvan je izbor %1$s" "Puštanje govorne pošte" "Prikaži kontakt %1$s" "Pozovi %1$s" @@ -100,11 +105,16 @@ "Govorna pošta" "%s sek" "%s min %s sek" - "govornu poruku" - "govorne poruke" - "Da" - "Ne" + "Otkažite režim grupnih radnji" + "Izbriši" + "Otkaži" "Želite li da izbrišete izabranu(e) %1$s?" + "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" @@ -117,7 +127,6 @@ "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" @@ -146,10 +155,9 @@ "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" @@ -215,11 +223,9 @@ "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." 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..f9b083747 100644 --- a/java/com/android/dialer/app/res/values-be/strings.xml +++ b/java/com/android/dialer/app/res/values-be/strings.xml @@ -82,11 +82,16 @@ "Дадаць чаканне" "Налады" "Сродак мадэліравання" + "Ярлык новага карыст. інтэрфейсу" "Усе кантакты" "Выкарыстанне тонавай клавіятуры" "Звярнуцца да бягучага выкліку" "Дадаць выклік" "Уваходныя выклікі" + "Уваход у рэжым групавога дзеяння" + "Выхад з рэжыму групавога дзеяння" + "Выбрана: %1$s" + "Выбар скасаваны: %1$s" "Прайграць паведамленне галасавой пошты" "Прагледзець кантакт %1$s" "Выклікаць карыстальнiка %1$s" @@ -101,11 +106,17 @@ "Галасавая пошта" "%s с" "%s хв %s с" - "галасавая пошта" - "галасавая пошта" - "Так" - "Не" + "Скасаваць рэжым пакетных дзеянняў" + "Выдаліць" + "Скасаваць" "Выдаліць вылучанае: %1$s?" + "Выбрана: %1$s" + + ""Выдаліць гэтыя паведамленні галасавой пошты? "" + ""Выдаліць гэтыя паведамленні галасавой пошты? "" + ""Выдаліць гэтыя паведамленні галасавой пошты? "" + ""Выдаліць гэтыя паведамленні галасавой пошты? "" + @string/call_log_header_today "%1$s у %2$s" "%1$02d:%2$02d" @@ -118,7 +129,6 @@ "MEID" "Загрузка з SIM-карты..." "Кантакты SIM-карты" - "Праграмы для аперацый з кантактамі няма" "Галасавы пошук недаступны" "Немагчыма зрабіць выклік па тэлефоне, таму што праграма Тэлефон была адключана." "Пошук кантактаў" @@ -147,10 +157,9 @@ "Новых прапушчаных выклікаў: %s" "У вас пакуль нікога няма на хуткім наборы" "Дадаць улюбёны" - "У вас пакуль няма ніякіх кантактаў" - "Дадаць кантакт" "Дакраніцеся да відарыса, каб прагледзець усе нумары, або дакраніцеся і ўтрымлівайце, каб змяніць парадак" "Выдаліць" + "Выбраць усё" "Відэавыклік" "Адправiць паведамленне" "Падрабязнасці выкліку" @@ -217,11 +226,9 @@ "Заблакіраваныя нумары" "%1$s ужо заблакіраваны." "Уліковыя запісы для выклікаў" - "Уключыць" "Задаць дазволы" "Каб уключыць хуткі набор, уключыце дазвол для Кантактаў." "Каб прагледзець свой журнал выклікаў, уключыце дазволы Тэлефона." - "Каб бачыць свае кантакты, уключыце дазвол для Кантактаў." "Каб атрымаць доступ да галасавой пошты, уключыце дазвол для Тэлефона." "Каб шукаць свае кантакты, уключыце дазвол для Кантактаў." "Каб зрабіць выклік, уключыце дазвол для Тэлефона." 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..8b1105cb3 100644 --- a/java/com/android/dialer/app/res/values-bg/strings.xml +++ b/java/com/android/dialer/app/res/values-bg/strings.xml @@ -80,11 +80,16 @@ "Добавяне на изчакване" "Настройки" "Симулатор" + "Пряк път към новия ПИ" "Всички контакти" "Използване на тонова клавиатура" "Назад към текущото обаждане" "Добавяне на обаждане" "Вх. обаждания" + "Влизате в режима на групови действия" + "Излязохте от режима на групови действия" + "Избрахте %1$s" + "Премахнахте избора от %1$s" "Пускане на гласовата поща" "Преглед на контактa %1$s" "Обаждане на %1$s" @@ -99,11 +104,15 @@ "Гласова поща" "%s сек" "%s мин %s сек" - "гласово съобщение" - "гласови съобщения" - "Да" - "Не" + "Анулиране на режима на групови действия" + "Изтриване" + "Отказ" "Избрахте %1$s – да се изтрие ли избраното?" + "Избрахте %1$s" + + ""Да се изтрият ли тези гласови съобщения? "" + ""Да се изтрие ли това гласово съобщение? "" + @string/call_log_header_today "%1$s в %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "Зарежда се от SIM карта..." "Контакти от SIM карта" - "Няма налично приложение за контакти" "Гласовото търсене не е налице" "Не може да се осъществи телефонно обаждане, защото приложението Телефон е деактивирано." "Търсене в контактите" @@ -145,10 +153,9 @@ "%s нови пропуснати обаждания" "Още нямате контакти за бързо набиране" "Добавяне на любим контакт" - "Още нямате контакти" - "Добавяне на контакт" "Докоснете изображението, за да видите всички номера, или го натиснете и задръжте за пренареждане" "Премахване" + "Избиране на всички" "Видеообаждане" "Изпращане на съобщение" "Подробности за обаждането" @@ -213,11 +220,9 @@ "Блокирани номера" "Номер %1$s вече е блокиран." "Профили за обаждане" - "Включване" "Задаване на разрешенията" "За да активирате бързото набиране, включете разрешението за Контакти." "За да видите списъка с обажданията си, включете разрешението за Телефон." - "За да видите контактите си, включете разрешението за Контакти." "За да осъществите достъп до гласовата си поща, включете разрешението за Телефон." "За да търсите в контактите си, включете разрешенията за тях." "За да извършите обаждане, включете разрешението за Телефон." 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..2ec362685 100644 --- a/java/com/android/dialer/app/res/values-bn/strings.xml +++ b/java/com/android/dialer/app/res/values-bn/strings.xml @@ -80,11 +80,16 @@ "অপেক্ষা যোগ করুন" "সেটিংস" "সিমুলেটার" + "নতুন UI শর্টকাট তৈরি করুন" "সকল পরিচিতি" "স্পর্শ স্বর কীপ্যাড ব্যবহার করুন" "প্রগতিতে থাকা কলে প্রত্যাবর্তন" "কল যোগ করুন" "ইনকামিং কলগুলি" + "বাল্ক অ্যাকশন মোডে প্রবেশ করা হচ্ছে" + "বাল্ক অ্যাকশন মোড ত্যাগ করুন" + "%1$s নির্বাচন করা হয়েছে" + "%1$s অনির্বাচন করা হয়েছে" "ভয়েসমেল প্লে করুন" "%1$s পরিচিতি দেখুন" "%1$s কে কল করুন" @@ -99,11 +104,15 @@ "ভয়েসমেল" "%s সেকেন্ড" "%s মিনিট %s সেকেন্ড" - "ভয়েসমেল" - "ভয়েসমেলগুলি" - "হ্যাঁ" - "না" + "ব্যাচ অ্যাকশন মোড বাতিল করুন" + "মুছুন" + "বাতিল করুন" "নির্বাচিত %1$s মুছে ফেলতে চান?" + "%1$sটি নির্বাচিত" + + ""এই ভয়েসমেলগুলি মুছবেন? "" + ""এই ভয়েসমেলগুলি মুছবেন? "" + @string/call_log_header_today "%1$s তারিখে %2$s\'টায়" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "সিম কার্ড থেকে লোড করা হচ্ছে…" "সিম কার্ডের পরিচিতিগুলি" - "কোনো পরিচিতি অ্যাপ্লিকেশান উপলব্ধ নয়" "ভয়েস অনুসন্ধান অনুপলব্ধ" "কোনো ফোন কল করা যাবে না কারণ ফোন অ্যাপ্লিকেশানটি অক্ষম করা হয়েছে৷" "পরিচিতিগুলি খুঁজুন" @@ -145,10 +153,9 @@ "%sটি নতুন মিসড কল" "আপনার স্পীড ডায়ালে এখনও পর্যন্ত কেউ নেই" "একটি পছন্দসই যোগ করুন" - "আপনার এখনও পর্যন্ত কোনো পরিচিতি নেই" - "একটি পরিচিতি যোগ করুন" "সমস্ত নম্বর দেখতে ছবিতে স্পর্শ করুন বা রেকর্ড করতে স্পর্শ করে ধরে রাখুন" "সরান" + "সবগুলি নির্বাচন করুন" "ভিডিও কল" "একটি বার্তা পাঠান" "কলের বিশদ বিবরণ" @@ -213,11 +220,9 @@ "ব্লক করা নাম্বারগুলি" "%1$s ইতিমধ্যেই অববোধ করা রয়েছে৷" "কলিং অ্যাকাউন্টগুলি" - "চালু করুন" "অনুমতিগুলি সেট করুন" "স্পীড ডায়াল সক্ষম করতে, পরিচিতিগুলির অনুমতি চালু করুন।" "আপনার কল লগ দেখতে, ফোনের অনুমতি চালু করুন।" - "আপনার পরিচিতিগুলি দেখতে, পরিচিতিগুলির অনুমতি চালু করুন।" "আপনার ভয়েসমেল অ্যাক্সেস করতে, ফোনের অনুমতি চালু করুন।" "আপনার পরিচিতিগুলি অনুসন্ধান করতে, পরিচিতির অনুমতিগুলি চালু করুন।" "একটি কল করতে, ফোনের অনুমতি চালু করুন।" 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..087db1274 100644 --- a/java/com/android/dialer/app/res/values-bs/strings.xml +++ b/java/com/android/dialer/app/res/values-bs/strings.xml @@ -81,11 +81,16 @@ "Dodaj čekanje" "Postavke" "Simulator" + "Kreiraj prečicu za novi UI" "Svi kontakti" "Koristi tastaturu za tonsko biranje" "Povratak na poziv u toku" "Dodaj poziv" "Dolazni pozivi" + "Ulazak u način rada za skupnu radnju" + "Napuštanje načina rada za skupnu radnju" + "Odabrano %1$s" + "Poništen odabir %1$s" "Pokretanje govorne pošte" "Prikaži kontakt %1$s" "Pozovi kontakt %1$s" @@ -100,11 +105,16 @@ "Govorna pošta" "%s sek." "%s min. %s sek." - "poruka govorne pošte" - "poruke govorne pošte" - "Da" - "Ne" + "Otkaži način rada za grupnu radnju" + "Izbriši" + "Otkaži" "Izbrisati izabranu/e %1$s?" + "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" @@ -117,7 +127,6 @@ "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." "Traži kontakte" @@ -146,10 +155,9 @@ "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" + "Izaberi sve" "Videopoziv" "Pošalji poruku" "Detalji o pozivu" @@ -215,11 +223,9 @@ "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." 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..71385805a 100644 --- a/java/com/android/dialer/app/res/values-ca/strings.xml +++ b/java/com/android/dialer/app/res/values-ca/strings.xml @@ -80,11 +80,16 @@ "Afegeix espera" "Configuració" "Simulador" + "Crea drecera per a la nova IU" "Tots els contactes" "Utilitza el teclat de tons" "Torna a la trucada en curs" "Afegeix una trucada" "Trucades entrants" + "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" "Reprodueix el missatge de veu" "Visualitza el contacte %1$s" "Truca a %1$s" @@ -99,24 +104,27 @@ "Bústia de veu" "%s s" "%s min %s s" - "missatge de veu" - "missatges de veu" - "Sí" - "No" + "Cancel·la el mode d\'accions en lot" + "Suprimeix" + "Cancel·la" "Vols suprimir l\'element o elements seleccionats (%1$s)?" + "%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 configurar els missatges de veu, ves 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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." @@ -227,7 +232,7 @@ "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ó" 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..dbff467c0 100644 --- a/java/com/android/dialer/app/res/values-cs/strings.xml +++ b/java/com/android/dialer/app/res/values-cs/strings.xml @@ -82,11 +82,16 @@ "Přidat čekání" "Nastavení" "Simulátor" + "Vytv. zkratku na nové rozhraní" "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í" + "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" "Přehrát hlasovou schránku" "Zobrazit kontakt %1$s" "Volat kontakt %1$s" @@ -101,11 +106,17 @@ "Hlasová schránka" "%s s" "%s min %s s" - "vybranou hlasovou zprávu" - "vybrané hlasové zprávy" - "Ano" - "Ne" + "Zrušit režim hromadných akcí" + "Smazat" + "Zrušit" "Smazat %1$s?" + "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" @@ -118,7 +129,6 @@ "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" @@ -147,10 +157,9 @@ "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" @@ -217,11 +226,9 @@ "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." 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..72f5a2835 100644 --- a/java/com/android/dialer/app/res/values-da/strings.xml +++ b/java/com/android/dialer/app/res/values-da/strings.xml @@ -80,11 +80,16 @@ "Tilføj ventetid" "Indstillinger" "Simulator" + "Opret ny brugerfladegenvej" "Alle kontakter" "Brug numerisk tastatur" "Vend tilbage til igangværende opkald" "Tilføj opkald" "Indgående opkald" + "Massehandlingstilstanden startes" + "Massehandlingstilstanden blev afsluttet" + "Vælg %1$s" + "Fravalgt %1$s" "Afspil telefonsvarerbesked" "Vis kontaktpersonen %1$s" "Ring til %1$s" @@ -99,11 +104,15 @@ "Telefonsvarer" "%s sek." "%s min. %s sek." - "talebesked" - "talebeskeder" - "Ja" - "Nej" + "Annuller massehandlingstilstand" + "Slet" + "Annuller" "Vil du slette de valgte %1$s?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..a7efd53a3 100644 --- a/java/com/android/dialer/app/res/values-de/strings.xml +++ b/java/com/android/dialer/app/res/values-de/strings.xml @@ -80,11 +80,16 @@ "Warten hinzufügen" "Einstellungen" "Simulator" + "Verknüpfung für neue Benutzeroberfläche erstellen" "Alle Kontakte" "Telefontastatur verwenden" "Zurück zum aktuellen Anruf" "Anruf hinzufügen" "Eingehende Anrufe" + "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" "Mailbox abhören" "Kontakt %1$s anzeigen" "%1$s anrufen" @@ -99,11 +104,15 @@ "Mailbox" "%s s" "%s min %s s" - "Mailboxnachricht" - "Mailboxnachrichten" - "Ja" - "Nein" + "Modus für Batch-Aktionen abbrechen" + "Löschen" + "Abbrechen" "Ausgewählte %1$s löschen?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..7080e5e50 100644 --- a/java/com/android/dialer/app/res/values-el/strings.xml +++ b/java/com/android/dialer/app/res/values-el/strings.xml @@ -80,11 +80,16 @@ "Προσθήκη αναμονής" "Ρυθμίσεις" "Προσομοιωτής" + "Δημ. νέας συντόμ. διεπαφής" "Όλες οι επαφές" "Χρησιμοποιήστε το πληκτρολόγιο αφής ηχητικών τόνων" "Επιστροφή στην κλήση που βρίσκεται σε εξέλιξη" "Προσθήκη κλήσης" "Εισερχόμενες κλήσεις" + "Εισαγωγή στη λειτουργία μαζικών ενεργειών" + "Αποχώρηση από τη λειτουργία μαζικών ενεργειών" + "Έγινε επιλογή %1$s" + "Καταργήθηκε η επιλογή %1$s" "Αναπαραγωγή μηνύματος αυτόματου τηλεφωνητή" "Προβολή επαφής %1$s" "Κλήση %1$s" @@ -99,11 +104,15 @@ "Αυτόματος τηλεφωνητής" "%s δευτερόλεπτα" "%s λεπτά %s δευτερόλεπτα" - "φωνητικού μηνύματος αυτόματου τηλεφωνητή" - "φωνητικών μηνυμάτων αυτόματου τηλεφωνητή" - "Ναι" - "Όχι" + "Ακύρωση λειτουργίας μαζικών ενεργειών" + "Διαγραφή" + "Ακύρωση" "Διαγραφή επιλεγμ. %1$s;" + "Έχουν επιλεγεί %1$s" + + ""Διαγραφή αυτών των μηνυμάτων αυτόματου τηλεφωνητή; "" + ""Διαγραφή αυτού του μηνύματος αυτόματου τηλεφωνητή; "" + @string/call_log_header_today "%1$s στις %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "Φόρτωση από κάρτα SIM…" "Επαφές στην κάρτα SIM" - "Δεν υπάρχουν διαθέσιμες εφαρμογές επαφών" "Η φωνητική αναζήτηση δεν είναι διαθέσιμη" "Δεν είναι δυνατή η πραγματοποίηση τηλεφωνικής κλήσης επειδή η εφαρμογή \"Τηλέφωνο\" έχει απενεργοποιηθεί." "Αναζήτηση επαφών" @@ -145,10 +153,9 @@ "%s νέες αναπάντητες κλήσεις" "Δεν έχετε ορίσει ακόμη κάποια επαφή στις ταχείες κλήσεις" "Προσθέστε ένα αγαπημένο" - "Δεν έχετε επαφές ακόμη" - "Προσθήκη επαφής" "Αγγίξτε την εικόνα για να δείτε όλους τους αριθμούς ή αγγίξτε παρατεταμένα για αναδιάταξη" "Κατάργηση" + "Επιλογή όλων" "Βιντεοκλήση" "Αποστολή μηνύματος" "Λεπτομέρειες κλήσης" @@ -213,11 +220,9 @@ "Αποκλεισμένοι αριθμοί" "Ο αριθμός %1$s αποκλείστηκε ήδη." "Λογαριασμοί κλήσης" - "Ενεργοποίηση" "Ορισμός αδειών" "Για να ενεργοποιήσετε την ταχεία κλήση, ενεργοποιήστε την άδεια επαφών." "Για να δείτε το αρχείο καταγραφής κλήσεών σας, ενεργοποιήστε την άδεια τηλεφώνου." - "Για να δείτε τις επαφές σας, ενεργοποιήστε την άδεια επαφών." "Για να αποκτήσετε πρόσβαση στον τηλεφωνητή σας, ενεργοποιήστε την άδεια τηλεφώνου." "Για να κάνετε αναζήτηση στις επαφές σας, ενεργοποιήστε τις άδειες \"Επαφές\"." "Για να πραγματοποιήσετε μια κλήση, ενεργοποιήστε την άδεια τηλεφώνου." 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..999f7dab0 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 @@ -80,11 +80,16 @@ "Add wait" "Settings" "Simulator" + "Create new UI shortcut" "All contacts" "Use touch tone keypad" "Return to call in progress" "Add call" "Incoming calls" + "Entering bulk action mode" + "Left bulk action mode" + "Selected %1$s" + "Unselected %1$s" "Play voicemail" "View contact %1$s" "Call %1$s" @@ -99,11 +104,15 @@ "Voicemail" "%s sec" "%s min %s sec" - "voicemail" - "voicemails" - "Yes" - "No" + "Cancel batch actions mode" + "Delete" + "Cancel" "Delete selected %1$s?" + "%1$s selected" + + ""Delete these voicemails? "" + ""Delete this voicemail? "" + @string/call_log_header_today "%1$s at %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..999f7dab0 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 @@ -80,11 +80,16 @@ "Add wait" "Settings" "Simulator" + "Create new UI shortcut" "All contacts" "Use touch tone keypad" "Return to call in progress" "Add call" "Incoming calls" + "Entering bulk action mode" + "Left bulk action mode" + "Selected %1$s" + "Unselected %1$s" "Play voicemail" "View contact %1$s" "Call %1$s" @@ -99,11 +104,15 @@ "Voicemail" "%s sec" "%s min %s sec" - "voicemail" - "voicemails" - "Yes" - "No" + "Cancel batch actions mode" + "Delete" + "Cancel" "Delete selected %1$s?" + "%1$s selected" + + ""Delete these voicemails? "" + ""Delete this voicemail? "" + @string/call_log_header_today "%1$s at %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..999f7dab0 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 @@ -80,11 +80,16 @@ "Add wait" "Settings" "Simulator" + "Create new UI shortcut" "All contacts" "Use touch tone keypad" "Return to call in progress" "Add call" "Incoming calls" + "Entering bulk action mode" + "Left bulk action mode" + "Selected %1$s" + "Unselected %1$s" "Play voicemail" "View contact %1$s" "Call %1$s" @@ -99,11 +104,15 @@ "Voicemail" "%s sec" "%s min %s sec" - "voicemail" - "voicemails" - "Yes" - "No" + "Cancel batch actions mode" + "Delete" + "Cancel" "Delete selected %1$s?" + "%1$s selected" + + ""Delete these voicemails? "" + ""Delete this voicemail? "" + @string/call_log_header_today "%1$s at %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..701d74ebc 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 @@ -80,11 +80,16 @@ "Agregar espera" "Configuración" "Simulador" + "Crear acceso a la nueva IU" "Todos los contactos" "Usar teclado numérico" "Regresar a la llamada en curso" "Agregar llamada" "Llamadas entrantes" + "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" "Reproducir mensaje de voz" "Ver contacto %1$s" "Llamar a %1$s" @@ -99,11 +104,15 @@ "Correo de voz" "%s s" "%s min %s s" - "el mensaje de voz" - "los mensajes de voz" - "Sí" - "No" + "Cancelar el modo de acción masiva" + "Borrar" + "Cancelar" "¿Deseas borrar %1$s que seleccionaste?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..8cf47f554 100644 --- a/java/com/android/dialer/app/res/values-es/strings.xml +++ b/java/com/android/dialer/app/res/values-es/strings.xml @@ -80,11 +80,16 @@ "Añadir espera" "Ajustes" "Simulador" + "Crear acceso a la interfaz" "Todos los contactos" "Usar teclado táctil" "Volver a la llamada" "Añadir llamada" "Llamadas entrantes" + "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" "Reproducir mensaje de voz" "Ver contacto %1$s" "Llamar a %1$s" @@ -99,11 +104,15 @@ "Buzón de voz" "%s s" "%s min y %s s" - "mensaje de voz" - "mensajes de voz" - "Sí" - "No" + "Cancelar el modo de acciones en lote" + "Eliminar" + "Cancelar" "¿Eliminar la selección de %1$s?" + "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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..da043bf3c 100644 --- a/java/com/android/dialer/app/res/values-et/strings.xml +++ b/java/com/android/dialer/app/res/values-et/strings.xml @@ -80,11 +80,16 @@ "Lisa ootamine" "Seaded" "Simulaator" + "Loo uue kasutajaliid. otsetee" "Kõik kontaktid" "Kasuta puutetooniga klahvistikku" "Tagasi käimasolevale kõnele" "Lisa kõne" "Sissetulevad kõned" + "Sisenemine hulgitoimingute režiimi" + "Lahkumine hulgitoimingute režiimist" + "%1$s on valitud" + "%1$s on valimata" "Esita kõnepostisõnum" "Kuva kontakt %1$s" "Helista kasutajale %1$s" @@ -99,11 +104,15 @@ "Kõnepost" "%s s" "%s min %s s" - "kõnepostisõnum" - "kõnepostisõnumid" - "Jah" - "Ei" + "Mitme toimigu režiimi tühistamine" + "Kustuta" + "Tühista" "Kas kustutada valitud kõnepostisõnumid %1$s?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..071c6f3f0 100644 --- a/java/com/android/dialer/app/res/values-eu/strings.xml +++ b/java/com/android/dialer/app/res/values-eu/strings.xml @@ -80,11 +80,16 @@ "Gehitu itxaronaldia" "Ezarpenak" "Simulagailua" + "Sortu interfazerako esteka" "Kontaktu guztiak" "Erabili ukipen-tonuak dituen teklatua" "Itzuli abian den deira" "Gehitu deia" "Sarrerako deiak" + "Ekintzak multzoka gauzatzeko modua aktibatzen" + "Ekintzak multzoka gauzatzeko modua desaktibatu da" + "%1$s hautatu da" + "%1$s desautatu da" "Erreproduzitu erantzungailuko ahots-mezuak" "Ikusi %1$s kontaktua" "Deitu %1$s erabiltzaileari" @@ -99,11 +104,15 @@ "Erantzungailua" "%s s" "%s min %s s" - "ahots-mezua" - "ahots-mezuak" - "Bai" - "Ez" + "Utzi bertan behera ekintzak multzoka gauzatzeko modua" + "Ezabatu" + "Utzi" "Hautatutako %1$s ezabatu?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..6c588747e 100644 --- a/java/com/android/dialer/app/res/values-fa/strings.xml +++ b/java/com/android/dialer/app/res/values-fa/strings.xml @@ -80,11 +80,16 @@ "افزودن انتظار" "تنظیمات" "شبیه‌ساز" + "ایجاد میان‌بر رابط کاربری جدید" "همه مخاطبین" "استفاده از صفحه‌کلید لمسی" "برگشت به تماس درحال انجام" "افزودن تماس" "تماس‌های ورودی" + "درحال ورود به حالت اقدام انبوه" + "خروج از حالت اقدام انبوه" + "%1$s انتخاب شد" + "%1$s از حالت انتخاب خارج شد" "پخش پست صوتی" "مشاهده مخاطب %1$s" "تماس با %1$s" @@ -99,11 +104,15 @@ "پست صوتی" "%s ثانیه" "%s دقیقه %s ثانیه" - "پست صوتی" - "پست‌های صوتی" - "بله" - "نه" + "لغو حالت اقدام‌ دسته‌ای" + "حذف" + "لغو" "%1$s انتخاب‌شده حذف شود؟" + "%1$s مورد انتخاب شد" + + ""این پست‌های صوتی حذف شوند؟ "" + ""این پست‌های صوتی حذف شوند؟ "" + @string/call_log_header_today "%1$s ساعت %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "در حال بارگیری سیم کارت..." "مخاطبین سیم کارت" - "هیچ برنامه مخاطبی در دسترس نیست" "جستجوی گفتاری در دسترس نیست" "برقراری تماس تلفنی ممکن نیست، زیرا برنامه تلفن غیرفعال شده است." "جستجوی مخاطبین" @@ -145,10 +153,9 @@ "%s تماس‌ بی‌پاسخ جدید" "هنوز کسی در فهرست شماره‌گیری سریع شما نیست" "افزودن مورد دلخواه" - "هنوز هیچ مخاطبی ندارید" - "افزودن مخاطب" "برای مشاهده همه شماره‌ها، تصویر را لمس کنید، یا برای ترتیب مجدد، لمس کنید و نگه‌دارید" "حذف" + "انتخاب همه" "تماس ویدئویی" "ارسال پیام" "جزئیات تماس" @@ -213,11 +220,9 @@ "شماره‌های مسدود‌شده" "%1$s درحال‌حاضر مسدود شده است." "حساب‌های تماس" - "روشن کردن" "تنظیم مجوزها" "برای فعال کردن شماره‌گیری سریع، مجوز «مخاطبین» را روشن کنید." "برای دیدن گزارش تماستان، مجوز «تلفن» را روشن کنید." - "برای دیدن مخاطبینتان، مجوز «مخاطبین» را روشن کنید." "برای دسترسی به پست صوتی‌تان، مجوز «تلفن» را روشن کنید." "برای جستجوی مخاطبینتان، مجوزهای مخاطبین را روشن کنید." "برای برقراری تماس، مجوز «تلفن» را روشن کنید." 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..55865d44a 100644 --- a/java/com/android/dialer/app/res/values-fi/strings.xml +++ b/java/com/android/dialer/app/res/values-fi/strings.xml @@ -80,11 +80,16 @@ "Lisää tauko" "Asetukset" "Simulaattori" + "Luo uusi UI-pikakuvake" "Kaikki yhteystiedot" "Käytä näppäimistöä" "Palaa käynnissä olevaan puheluun" "Lisää puhelu" "Saapuvat puhelut" + "Siirrytään joukkotoimintotilaan." + "Poistuttiin joukkotoimintotilasta." + "%1$s valittiin." + "%1$s ei ole enää valittuna." "Toista vastaajaviesti" "Näytä yhteystieto %1$s" "Soita: %1$s" @@ -99,11 +104,15 @@ "Vastaaja" "%s s" "%s min %s s" - "vastaajaviesti" - "vastaajaviestit" - "Kyllä" - "Ei" + "Peruuta joukkotoimintotila." + "Poista" + "Peruuta" "Poistetaanko %1$s?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..f10b121d5 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 @@ -80,11 +80,16 @@ "Ajouter Attendre" "Paramètres" "Simulateur" + "Créer un raccourci vers l\'IU" "Tous les contacts" "Utiliser le clavier DTMF" "Reprendre l\'appel en cours" "Autre appel" "Appels entrants" + "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" "Écouter le message vocal" "Afficher le contact %1$s" "Appeler %1$s" @@ -99,11 +104,15 @@ "Messagerie vocale" "%s s" "%s min et %s sec" - "message vocal" - "messages vocaux" - "Oui" - "Non" + "Annuler le mode d\'action par lots" + "Supprimer" + "Annuler" "Supprimer la sélection (%1$s)?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..2ce930af5 100644 --- a/java/com/android/dialer/app/res/values-fr/strings.xml +++ b/java/com/android/dialer/app/res/values-fr/strings.xml @@ -80,11 +80,16 @@ "Ajouter une attente" "Paramètres" "Simulateur" + "Créer un raccourci vers la nouvelle interface" "Tous les contacts" "Utiliser le clavier DTMF" "Reprendre l\'appel en cours" "Autre appel" "Appels entrants" + "Activation du mode d\'action groupée" + "Désactivation du mode d\'action groupée" + "%1$s sélectionné" + "%1$s désélectionné" "Écouter le message vocal" "Afficher le contact %1$s" "Appeler %1$s" @@ -99,11 +104,15 @@ "Messagerie vocale" "%s secondes" "%s min et %s s" - "message vocal" - "messages vocaux" - "Oui" - "Non" + "Annuler le mode d\'actions groupées" + "Supprimer" + "Annuler" "Supprimer les messages vocaux sélectionnés (%1$s) ?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "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" @@ -213,11 +220,9 @@ "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." 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..b9e540750 100644 --- a/java/com/android/dialer/app/res/values-gl/strings.xml +++ b/java/com/android/dialer/app/res/values-gl/strings.xml @@ -80,11 +80,16 @@ "Engadir espera" "Configuración" "Simulador" + "Crear atallo para a nova IU" "Todos os contactos" "Usar teclado de tons táctiles" "Volver á chamada en curso" "Engadir chamada" "Chamadas entrantes" + "Entrando no modo de acción masiva" + "Saíu do modo de acción masiva" + "Seleccionouse: %1$s" + "Anulouse a selección de: %1$s" "Reproducir correo de voz" "Ver contacto %1$s" "Chamar a %1$s" @@ -99,11 +104,15 @@ "Correo de voz" "%s s" "%s min %s s" - "correo de voz" - "correos de voz" - "Si" - "Non" + "Cancela o modo de accións en lote" + "Eliminar" + "Cancelar" "Queres eliminar a selección (%1$s)?" + "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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..ca8749ad3 100644 --- a/java/com/android/dialer/app/res/values-gu/strings.xml +++ b/java/com/android/dialer/app/res/values-gu/strings.xml @@ -80,11 +80,16 @@ "પ્રતીક્ષા ઉમેરો" "સેટિંગ્સ" "સિમ્યુલેટર" + "નવું UI શૉર્ટકટ્સ બનાવો" "તમામ સંપર્કો" "ટચ ટોન કીપેડનો ઉપયોગ કરો" "કૉલ પર પાછા આવવું પ્રગતિ પર છે" "કૉલ ઉમેરો" "ઇનકમિંગ કૉલ્સ" + "બલ્ક ક્રિયા મોડમાં દાખલ થઈ રહ્યાં છે" + "બલ્ક ક્રિયા મોડ છોડી દીધો" + "%1$s પસંદ કર્યો" + "%1$s પસંદગીમાંથી દૂર કર્યો" "વૉઇસમેઇલ ચલાવો" "%1$s સંપર્ક જુઓ" "%1$s ને કૉલ કરો" @@ -99,11 +104,15 @@ "વૉઇસમેઇલ" "%s સેકંડ" "%s મિ %s સે" - "વૉઇસમેઇલ" - "વૉઇસમેઇલ" - "હા" - "નહીં" + "બૅચ ક્રિયા મોડ રદ કરો" + "કાઢી નાખો" + "રદ કરો" "પસંદ કરેલ %1$sને કાઢી નાખીએ?" + "%1$s પસંદ કરી" + + ""આ વૉઇસમેઇલ કાઢી નાખીએ? "" + ""આ વૉઇસમેઇલ કાઢી નાખીએ? "" + @string/call_log_header_today "%1$s નાં રોજ %2$s વાગ્યે" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "SIM કાર્ડમાંથી લોડ કરી રહ્યું છે…" "SIM કાર્ડ સંપર્કો" - "કોઈ સંપર્કો ઍપ્લિકેશન ઉપલબ્ધ નથી" "વૉઇસ શોધ ઉપલબ્ધ નથી" "ફોન કૉલ કરી શકાતો નથી કારણ કે ફોન ઍપ્લિકેશન અક્ષમ કરવામાં આવી છે." "સંપર્કો શોધો" @@ -145,10 +153,9 @@ "%s નવા છૂટેલા કૉલ્સ" "તમારા ઝડપી ડાયલ પર હજી સુધી કોઇ નથી" "એક મનપસંદ ઉમેરો" - "તમે હજી સુધી કોઇપણ સંપર્કો ધરાવતાં નથી" - "સંપર્ક ઉમેરો" "બધા નંબર્સ જોવા માટે છબી ટચ કરો અથવા પુનઃક્રમાંકિત કરવા માટે ટચ કરો અને પકડી રાખો" "દૂર કરો" + "તમામ પસંદ કરો" "વિડિઓ કૉલ" "એક સંદેશ મોકલો" "કૉલની વિગતો" @@ -213,11 +220,9 @@ "અવરોધિત નંબરો" "%1$s ને પહેલેથી અવરોધિત કરવામાં આવ્યો છે." "કૉલિંગ એકાઉન્ટ્સ" - "ચાલુ કરો" "પરવાનગીઓ સેટ કરો" "ઝડપી ડાયલ સક્ષમ કરવા માટે, સંપર્કોની પરવાનગી ચાલુ કરો." "તમારો કૉલ લૉગ જોવા માટે, ફોન પરવાનગી ચાલુ કરો." - "તમારા સંપર્કો જોવા માટે, સંપર્કોની પરવાનગી ચાલુ કરો." "તમારી વૉઇસમેઇલને ઍક્સેસ કરવા માટે, ફોન પરવાનગી ચાલુ કરો." "તમારા સંપર્કો શોધવા માટે, સંપર્કોની પરવાનગીઓ ચાલુ કરો." "કૉલ કરવા માટે, ફોન પરવાનગી ચાલુ કરો." 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..3bc931921 100644 --- a/java/com/android/dialer/app/res/values-hi/strings.xml +++ b/java/com/android/dialer/app/res/values-hi/strings.xml @@ -80,11 +80,16 @@ "प्रतीक्षा का समय बढ़ाएं" "सेटिंग" "सिम्युलेटर" + "नया UI शॉर्टकट बनाएं" "सभी संपर्क" "टच टोन कीपैड का उपयोग करें" "कॉल पर लौटना प्रगति पर है" "कॉल जोड़ें" "इनकमिंग कॉल" + "बल्क कार्रवाई मोड में प्रवेश कर रहे हैं" + "बल्क कार्रवाई मोड छोड़ा" + "%1$s को चुना गया" + "%1$s को नहीं चुना गया" "ध्‍वनिमेल चलाएं" "%1$s संपर्क देखें" "%1$s को कॉल करें" @@ -99,11 +104,15 @@ "वॉयस मेल" "%s सेकंड" "%s मि. %s से." - "वॉयसमेल" - "वॉयसमेल" - "हां" - "नहीं" + "बैच कार्रवाई मोड रद्द करें" + "हटाएं" + "रद्द करें" "क्या चुने गए %1$s हटाना चाहते हैं?" + "%1$s चयनित" + + ""ये वॉइसमेल हटाएं? "" + ""ये वॉइसमेल हटाएं? "" + @string/call_log_header_today "%1$s को %2$s बजे" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "सिम कार्ड से लोड हो रहा है…" "सिम कार्ड के संपर्क" - "कोई भी संपर्क ऐप उपलब्‍ध नहीं है" "बोलकर खोजना उपलब्‍ध नहीं है" "फ़ोन कॉल नहीं किया जा सकता क्योंकि फ़ोन ऐप्लिकेशन अक्षम कर दिया गया है." "संपर्क खोजें" @@ -145,10 +153,9 @@ "%s छूटे हुए नए कॉल" "आपके स्‍पीड डायल पर अभी तक कोई भी नहीं है" "कोई पसंदीदा जोड़ें" - "आपके पास अभी कोई भी संपर्क नहीं है" - "कोई संपर्क जोड़ें" "सभी नंबर देखने के लिए चित्र को स्‍पर्श करें या पुन: क्रमित करने के लिए स्‍पर्श करके रखें" "निकालें" + "सभी चुनें" "वीडियो कॉल" "संदेश भेजें" "कॉल विवरण" @@ -213,11 +220,9 @@ "अवरोधित नंबर" "%1$s पहले से अवरोधित है." "कॉलिंग खाते" - "चालू करें" "अनुमतियां सेट करें" "स्पीड डायल सक्षम करने के लिए, संपर्क अनुमति चालू करें." "अपना कॉल लॉग देखने के लिए, फ़ोन अनुमति चालू करें." - "अपने संपर्क देखने के लिए, संपर्क अनुमति चालू करें." "अपना वॉइसमेल ऐक्सेस करने के लिए, फ़ोन अनुमति चालू करें." "अपने संपर्कों की खोज करने के लिए, संपर्क अनुमतियों को चालू करें." "कॉल करने के लिए, फ़ोन अनुमति चालू करें." 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..0d2147008 100644 --- a/java/com/android/dialer/app/res/values-hr/strings.xml +++ b/java/com/android/dialer/app/res/values-hr/strings.xml @@ -81,11 +81,16 @@ "Dodaj čekanje" "Postavke" "Simulator" + "Izrada prečaca novog sučelja" "Svi kontakti" "Koristi dodirnu zvučnu tipkovnicu" "Natrag na poziv u tijeku" "Dodaj poziv" "Dolazni pozivi" + "Ulazak u način skupne radnje" + "Napuštanje načina skupne radnje" + "Odabrano: %1$s" + "Poništen odabir: %1$s" "Reprodukcija govorne pošte" "Prikaz kontakta %1$s" "Nazovi %1$s" @@ -100,11 +105,16 @@ "Govorna pošta" "%s s" "%s min %s s" - "poruka govorne pošte" - "poruke govorne pošte" - "Da" - "Ne" + "Otkaži način skupnih radnji" + "Izbriši" + "Odustani" "Želite li izbrisati odabranu poruku/e govorne pošte %1$s?" + "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" @@ -117,7 +127,6 @@ "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" @@ -146,10 +155,9 @@ "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" @@ -215,11 +223,9 @@ "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." 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..9a373e6e8 100644 --- a/java/com/android/dialer/app/res/values-hu/strings.xml +++ b/java/com/android/dialer/app/res/values-hu/strings.xml @@ -80,11 +80,16 @@ "Várakozás hozzáadása" "Beállítások" "Szimulátor" + "Új felh. felület-parancsikon" "Ö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" + "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" "Hangposta lejátszása" "%1$s névjegyének megtekintése" "%1$s hívása" @@ -99,11 +104,15 @@ "Hangposta" "%s másodperc" "%s perc %s másodperc" - "hangpostaüzenetet" - "hangpostaüzeneteket" - "Igen" - "Nem" + "Köteges művelet mód leállítva" + "Törlés" + "Mégse" "Törli a kiválasztott %1$s?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..2b2fbf61b 100644 --- a/java/com/android/dialer/app/res/values-hy/strings.xml +++ b/java/com/android/dialer/app/res/values-hy/strings.xml @@ -80,11 +80,16 @@ "Ավելացնել սպասում" "Կարգավորումներ" "Նմանակիչ" + "Ստեղծել միջերեսի նոր դյուրանցում" "Բոլոր կոնտակտները" "Օգտագործել հնչերանգներով ստեղնաշարը" "Վերադառնալ ընթացիկ զանգին" "Ավելացնել զանգ" "Մուտքային զանգեր" + "Դուք մտել եք զանգվածային գործողության ռեժիմ" + "Դուք դուրս եկաք զանգվածային գործողությունների ռեժիմից" + "Ընտրվեց՝ %1$s" + "Ապընտրվեց՝ %1$s" "Նվագարկել ձայնային փոստը" "Դիտել %1$s կոնտակտը" "Զանգել %1$s-ին" @@ -99,11 +104,15 @@ "Ձայնային փոստ" "%s վրկ" "%s րոպե %s վայրկյան" - "ձայնային հաղորդագրություն" - "ձայնային հաղորդագրություններ" - "Այո" - "Ոչ" + "Չեղարկել փաթեթային գործողությունների ռեժիմը" + "Ջնջել" + "Չեղարկել" "Ջնջե՞լ նշված %1$sը" + "Ընտրվել է՝ %1$s" + + ""Delete these voicemails? "" + ""Ջնջե՞լ այս ձայնային հաղորդագրությունները "" + @string/call_log_header_today "%1$s-ին, ժամը %2$s-ին" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "SIM քարտը բեռնվում է..." "SIM քարտի կոնտակտները" - "Կոնտակտների հավելված չկա" "Ձայնային որոնումը հասանելի չէ" "Հնարավոր չէ զանգահարել, քանի որ Հեռախոս հավելվածն անջատված է:" "Կոնտակտների որոնում" @@ -145,10 +153,9 @@ "%s նոր բաց թողնված զանգ" "Արագ համարահավաքման ցանկը դատարկ է" "Ավելացնել կոնտակտ" - "Դեռ կոնտակտներ չունեք" - "Ավելացնել կոնտակտ" "Բոլոր համարները տեսնելու համար հպեք պատկերին: Վերադասավորելու համար հպեք և պահեք:" "Հեռացնել" + "Ընտրել բոլորը" "Տեսազանգ" "Ուղարկել հաղորդագրություն" "Զանգի մանրամասները" @@ -213,11 +220,9 @@ "Արգելափակված համարներ" "%1$s համարն արդեն արգելափակված է:" "Հաշիվներ զանգերի համար" - "Միացնել" "Թույլտվությունների սահմանում" "Արագ համարահավաքը թույլատրելու համար միացրեք Կոնտակտների թույլտվությունը:" "Ձեր զանգերի մատյանը տեսնելու համար միացրեք Հեռախոսի թույլտվությունը:" - "Ձեր կոնտակտները տեսնելու համար միացրեք Կոնտակտների թույլտվությունը:" "Ձայնային փոստն օգտագործելու համար միացրեք Հեռախոսի թույլտվությունը:" "Կոնտակտները որոնելու համար միացրեք Կոնտակտների թույլտվությունները:" "Զանգ կատարելու համար միացրեք Հեռախոսի թույլտվությունը:" 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..e72fd6337 100644 --- a/java/com/android/dialer/app/res/values-in/strings.xml +++ b/java/com/android/dialer/app/res/values-in/strings.xml @@ -80,11 +80,16 @@ "Tambahkan tunggu" "Setelan" "Simulator" + "Buat Pintasan UI Baru" "Semua kontak" "Gunakan keypad nada sentuh" "Kembali ke panggilan sedang berlangsung" "Tambahkan panggilan" "Panggilan masuk" + "Masuk ke mode tindakan massal" + "Keluar dari mode tindakan massal" + "%1$s dipilih" + "%1$s tidak dipilih" "Putar pesan suara" "Lihat kontak %1$s" "Telepon %1$s" @@ -99,11 +104,15 @@ "Kotak Pesan" "%s dtk" "%s mnt %s dtk" - "pesan suara" - "pesan suara" - "Ya" - "Tidak" + "Membatalkan mode tindakan kelompok" + "Hapus" + "Batal" "Hapus %1$s yang dipilih?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..bd329be9d 100644 --- a/java/com/android/dialer/app/res/values-is/strings.xml +++ b/java/com/android/dialer/app/res/values-is/strings.xml @@ -80,11 +80,16 @@ "Bæta töf við" "Stillingar" "Hermir" + "Stofna flýtileið í nýtt viðmót" "Allir tengiliðir" "Nota snertitónatakkaborð" "Fara aftur í símtal í gangi" "Bæta við símtali" "Móttekin símtöl" + "Opnar fjöldaaðgerðastillingu" + "Fjöldaaðgerðastillingu lokað" + "Valdi %1$s" + "Fjarlægði val á %1$s" "Spila talhólfsskilaboð" "Skoða tengiliðinn %1$s" "Hringja í %1$s" @@ -99,11 +104,15 @@ "Talhólf" "%s sek." "%s mín. og %s sek." - "talhólfsskilaboð" - "talhólfsskilaboð" - "Já" - "Nei" + "Hætta við runuaðgerðastillingu" + "Eyða" + "Hætta við" "Eyða völdum %1$s?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..356f5a603 100644 --- a/java/com/android/dialer/app/res/values-it/strings.xml +++ b/java/com/android/dialer/app/res/values-it/strings.xml @@ -80,11 +80,16 @@ "Aggiungi attesa" "Impostazioni" "Simulatore" + "Crea nuova scorciatoia UI" "Tutti i contatti" "Usa tastierino per selezione a toni" "Torna alla chiamata in corso" "Aggiungi chiamata" "Chiamate in arrivo" + "Attivazione della modalità di azione collettiva" + "Disttivazione della modalità di azione collettiva" + "%1$s selezionato" + "%1$s deselezionato" "Riproduci messaggio vocale" "Visualizza %1$s contatto" "Chiama %1$s" @@ -99,11 +104,15 @@ "Segreteria" "%s secondi" "%s min %s s" - "messaggio vocale" - "messaggi vocali" - "Sì" - "No" + "Annulla modalità di azione collettiva" + "Elimina" + "Annulla" "Eliminare i %1$s selezionati?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..230555a14 100644 --- a/java/com/android/dialer/app/res/values-iw/strings.xml +++ b/java/com/android/dialer/app/res/values-iw/strings.xml @@ -82,11 +82,16 @@ "הוסף המתנה" "הגדרות" "סימולטור" + "יצירת קיצור דרך לממשק החדש" "כל אנשי הקשר" "השתמש במקלדת עם חיוג צלילים" "חזור לשיחה פעילה" "הוסף שיחה" "שיחות נכנסות" + "עברת למצב של ביצוע פעולות בכמות גדולה" + "עזבת את המצב של ביצוע פעולות בכמות גדולה" + "בחרת את %1$s" + "ביטלת את הבחירה של %1$s" "הפעל דואר קולי" "הצג את איש הקשר %1$s" "התקשר אל %1$s" @@ -101,11 +106,17 @@ "דואר קולי" "%s שניות" "%s דק\' %s שנ\'" - "ההודעה הקולית" - "ההודעות הקוליות" - "כן" - "לא" + "ביטול המצב של ביצוע פעולות בכמות גדולה" + "מחיקה" + "ביטול" "האם למחוק את %1$s שבחרת?" + "%1$s נבחרו" + + ""האם למחוק את ההודעות הקוליות האלה? "" + ""האם למחוק את ההודעות הקוליות האלה? "" + ""האם למחוק את ההודעות הקוליות האלה? "" + ""האם למחוק את ההודעה הקולית הזו? "" + @string/call_log_header_today "%1$s ב-%2$s" "%1$02d:%2$02d" @@ -118,7 +129,6 @@ "MEID" "‏טוען מכרטיס SIM…" "‏אנשי קשר בכרטיס SIM" - "אין אפליקציה זמינה עבור אנשי קשר" "חיפוש קולי אינו זמין" "לא ניתן לבצע שיחת טלפון מפני שאפליקציית הטלפון הושבתה." "חפש אנשי קשר" @@ -147,10 +157,9 @@ "%s שיחות חדשות שלא נענו" "עדיין לא הוגדר חיוג מהיר לאף איש קשר" "הוסף פריט מועדף" - "עדיין אין לך אנשי קשר" - "הוסף איש קשר" "גע בתמונה כדי להציג את כל המספרים או גע והחזק כדי לשנות את הסדר" "הסר" + "בחירת הכל" "שיחת וידאו" "שלח הודעה" "פרטי שיחה" @@ -217,11 +226,9 @@ "מספרים חסומים" "%1$s כבר חסום." "חשבונות לביצוע שיחות" - "הפעל" "הגדר הרשאות" "כדי להפעיל חיוג מהיר, הפעל את ההרשאה \'אנשי קשר\'." "כדי לראות את יומן השיחות, הפעל את ההרשאה \'טלפון\'." - "כדי להציג את אנשי הקשר, הפעל את ההרשאה \'אנשי קשר\'." "כדי לגשת לדואר הקולי, הפעל את ההרשאה \'טלפון\'." "כדי לחפש באנשי הקשר, הפעל את ההרשאה \'אנשי קשר\'." "כדי להתקשר, הפעל את ההרשאה \'טלפון\'." 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..71fca83d5 100644 --- a/java/com/android/dialer/app/res/values-ja/strings.xml +++ b/java/com/android/dialer/app/res/values-ja/strings.xml @@ -80,11 +80,16 @@ "待機を追加" "設定" "シミュレーション" + "新しいUIのショートカットを作成" "すべての連絡先" "プッシュホン式キーパッドを使う" "通話に戻る" "別の通話を追加" "着信" + "一括操作モードを開始します" + "一括操作モードを終了しました" + "%1$s を選択しました" + "%1$s を選択解除しました" "ボイスメールを再生" "%1$sの連絡先を表示" "%1$sに発信" @@ -99,11 +104,15 @@ "ボイスメール" "%s秒" "%s%s秒" - "ボイスメール" - "ボイスメール" - "はい" - "いいえ" + "一括操作モードをキャンセルします" + "削除" + "キャンセル" "選択した%1$sを削除しますか?" + "%1$s 件選択済み" + + ""これらのボイスメールを削除しますか?"" + ""このボイスメールを削除しますか?"" + @string/call_log_header_today "%1$s%2$s" "%1$02d%2$02d 秒" @@ -116,7 +125,6 @@ "MEID" "SIMカードから読み取り中..." "SIMカードの連絡先" - "連絡先アプリがありません" "音声検索を利用できません" "電話アプリが無効になっているため発信できません。" "連絡先を検索" @@ -145,10 +153,9 @@ "%s件の不在着信" "クイックアクセスに登録済みの連絡先はまだありません" "お気に入りを追加" - "連絡先はまだありません" - "連絡先を追加" "画像をタップするとすべての番号が表示され、押し続けると番号を並べ替えることができます" "削除" + "すべて選択" "ビデオハングアウト" "メッセージを送信" "通話の詳細" @@ -213,11 +220,9 @@ "ブロックした番号" "%1$sは既にブロックしています。" "通話アカウント" - "ONにする" "権限を設定" "クイックアクセスを有効にするには、連絡先権限をONにしてください。" "通話履歴を表示するには、電話権限をONにしてください。" - "連絡先を表示するには、連絡先権限をONにしてください。" "ボイスメールにアクセスするには、電話権限をONにしてください。" "連絡先を検索するには、連絡先権限をONにしてください。" "電話をかけるには、電話権限をONにしてください。" 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..fd9351f54 100644 --- a/java/com/android/dialer/app/res/values-ka/strings.xml +++ b/java/com/android/dialer/app/res/values-ka/strings.xml @@ -80,11 +80,16 @@ "ლოდინის დამატება" "პარამეტრები" "სიმულატორი" + "ახალი UI მალსახმობის შექმნა" "ყველა კონტაქტი" "ტონალური კლავიატურის გამოყენება" "მიმდინარე ზარზე დაბრუნება" "ზარის დამატება" "შემომავალი ზარები" + "მიმდინარეობს ერთიანი ქმედების რეჟიმში შესვლა" + "ერთიანი ქმედების რეჟიმიდან გამოხვედით" + "არჩეულია %1$s" + "%1$s-ის არჩევა გაუქმდა" "ხმოვანი ფოსტის ჩართვა" "კონტაქტის %1$s ნახვა" "%1$s-თან დარეკვა" @@ -99,11 +104,15 @@ "ხმოვანი ფოსტა" "%s წმ" "%s მინ %s წამ" - "ხმოვანი ფოსტა" - "ხმოვანი ფოსტა" - "დიახ" - "არა" + "ერთიანი ქმედების რეჟიმის გაუქმება" + "წაშლა" + "გაუქმება" "გსურთ, წაშალოთ არჩეული %1$s?" + "არჩეულია %1$s" + + ""გსურთ ამ ხმოვანი შეტყობინებების წაშლა? "" + ""გსურთ ამ ხმოვანი შეტყობინების წაშლა? "" + @string/call_log_header_today "%1$s, %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "იტვირთება SIM ბარათიდან…" "SIM ბარათის კონტაქტები" - "კონტაქტების აპლიკაცია არ არის ხელმისაწვდომი" "ხმოვანი ძიება არ არის ხელმისაწვდომი" "სატელეფონო ზარის განხორციელება ვერ ხერხდება, ვინაიდან ტელეფონის აპლიკაცია გაუქმებულია." "კონტაქტებში ძიება" @@ -145,10 +153,9 @@ "%s ახალი გაცდენილი ზარი" "სწრაფი აკრეფისთვის რჩეულები ჯერ არ გყავთ" "რჩეული კონტაქტის დამატება" - "კონტაქტები ჯერ არ გაქვთ" - "კონტაქტის დამატება" "ყველა ნომრის სანახავად შეეხეთ სურათს ან შეეხეთ და დააყოვნეთ მიმდევრობის შესაცვლელად" "ამოშლა" + "ყველას არჩევა" "ვიდეო ზარი" "შეტყობინების გაგზავნა" "ზარის მონაცემები" @@ -213,11 +220,9 @@ "დაბლოკილი ნომრები" "%1$s უკვე დაბლოკილია." "ანგარიშების გამოძახება" - "ჩართვა" "ნებართვების დაყენება" "სწრაფი აკრეფის გასააქტიურებლად, ჩართეთ კონტაქტების ნებართვა." "ზარების ჟურნალის სანახავად, ჩართეთ ტელეფონის ნებართვა." - "კონტაქტების სანახავად, ჩართეთ კონტაქტების ნებართვა." "ხმოვან ფოსტაზე წვდომისთვის, ჩართეთ ტელეფონის ნებართვა." "თქვენი კონტაქტების მოსაძებნად ჩართეთ კონტაქტების ნებართვები." "ზარის განსახორციელებლად, ჩართეთ ტელეფონის ნებართვა." 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..f1763a21a 100644 --- a/java/com/android/dialer/app/res/values-kk/strings.xml +++ b/java/com/android/dialer/app/res/values-kk/strings.xml @@ -80,11 +80,16 @@ "Күтуді қосу" "Параметрлер" "Симулятор" + "Жаңа пайдаланушы интерфейсінің пернелер тіркесімін жасау" "Барлық контактілер" "Сенсорлы әуенді пернетақта" "Қосылып тұрған қоңырауға оралу" "Қоңырау қосу" "Келген қоңыраулар" + "Жаппай әрекет режиміне өту" + "Жаппай әрекет режиімінен шығу" + "%1$s таңдалды" + "%1$s таңдауы алынды" "Дауыс-хабарды ойнату" "%1$s контактісін көру" "%1$s нөміріне қоңырау шалу" @@ -99,11 +104,15 @@ "Дауыстық пошта" "%s сек." "%s мин %s сек" - "дауыстық хабар" - "дауыстық хабарлар" - "Иә" - "Жоқ" + "Топтама әрекеттер режимін жабу" + "Жою" + "Жабу" "Таңдалған %1$s хабарларын жою қажет пе?" + "%1$s таңдалды" + + ""Осы дауыстық хабарларды жою қажет пе? "" + ""Осы дауыстық хабарды жою қажет пе? "" + @string/call_log_header_today "%1$s, %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID (ұялы жабдық анықтағыш)" "SIM картасынан жүктеу…" "SIM картасының контактілері" - "Контактілер қолданбасы қол жетімді емес" "Дауыс арқылы іздеу қол жетімді емес" "Телефон қоңырауын шалу мүмкін емес, өйткені «Телефон» қолданбасы өшірілген." "Контактілерді іздеу" @@ -145,10 +153,9 @@ "%s жаңа қабылданбаған қоңыраулар" "Жылдам теруде әлі ешкім жоқ" "Таңдаулыны қосу" - "Әлі ешқандай контактілер жоқ" - "Контакт қосу" "Барлық нөмірлерді көру үшін кескінді түртіңіз, ал ретін өзгерту үшін түртіп, ұстап тұрыңыз" "Алып тастау" + "Барлығын таңдау" "Бейне қоңырау" "Хабар жіберу" "Қоңырау мәліметтері" @@ -213,11 +220,9 @@ "Бөгелген нөмірлер" "%1$s бөгеліп қойылған." "Қоңырау шалу есептік жазбалары" - "Қосу" "Рұқсаттар орнату" "Жылдам теруді қосу үшін \"Контактілер\" рұқсатын қосыңыз." "Қоңыраулар журналы көру үшін \"Телефон\" рұқсатын қосыңыз." - "Контактілерді көру үшін \"Контактілер\" рұқсатын қосыңыз." "Дауыс поштасына қатынасу үшін \"Телефон\" рұқсатын қосыңыз." "Контактілерді іздеу үшін \"Контактілер\" рұқсаттарын қосыңыз." "Қоңырауды шалу үшін \"Телефон\" рұқсатын қосыңыз." 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..54f1a126a 100644 --- a/java/com/android/dialer/app/res/values-km/strings.xml +++ b/java/com/android/dialer/app/res/values-km/strings.xml @@ -80,11 +80,16 @@ "បញ្ចូល​ការ​រង់ចាំ" "ការកំណត់" "កម្មវិធីធ្វើ​ដូច​មែនទែន" + "បង្កើត​ផ្លូវកាត់ UI ថ្មី" "ទំនាក់ទំនង​ទាំងអស់" "ប្រើ​សំឡេង​ប៉ះ​បន្ទះ​លេខ" "កំពុង​ត្រឡប់​ទៅកាន់​ការ​ហៅ" "បន្ថែម​ការ​ហៅ" "ការ​ហៅ​ចូល" + "ចូល​មុខងារ​សកម្មភាព​ច្រើន" + "បាន​ចាកចេញ​ពី​មុខងារ​សកម្មភាព​ច្រើន" + "បាន​ជ្រើសរើស %1$s" + "បាន​ដក​ការជ្រើសរើស %1$s" "ចាក់​សារ​ជា​សំឡេង" "មើល​ទំ​នាក់ទំនង %1$s" "ហៅ %1$s" @@ -99,11 +104,15 @@ "សារ​ជា​សំឡេង" "%s វិនាទី" "%s នាទី %s វិនាទី" - "សារ​ជា​សំឡេង" - "សារ​ជា​សំឡេង" - "បាទ/ចាស" - "ទេ" + "បោះបង់​មុខងារ​សកម្មភាព​ជា​ក្រុម" + "លុប" + "បោះបង់" "លុប %1$s ដែល​បាន​ជ្រើសរើស?" + "បាន​ជ្រើសរើស %1$s" + + ""លុប​សារ​ជា​សំឡេង​ទាំងនេះ? "" + ""លុប​សារ​ជា​សំឡេង​នេះ? "" + @string/call_log_header_today "%1$s នៅម៉ោង %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "កំពុង​ផ្ទុក​ពី​ស៊ីម​កាត..." "ទំនាក់ទំនង​នៅ​ក្នុង​ស៊ីម​កាត" - "មិនមានកម្មវិធីទំនាក់ទំនងទេ" "ការស្វែងរកជាសម្លេងមិនមានទេ" "មិន​អាច​ហៅ​បាន​ទេ​ ព្រោះ​កម្មវិធី​ទូរស័ព្ទ​ត្រូវ​បាន​បិទ។" "រក​ទំនាក់ទំនង" @@ -145,10 +153,9 @@ "ខកខាន​ទទួល​ថ្មី %s" "គ្មាននរណាម្នាក់នៅក្នុងការហៅរហ័សរបស់អ្នកនៅឡើយទេ" "បញ្ចូលសំណព្វ" - "អ្នកមិនទាន់មានទំនាក់ទំនងនៅឡើយទេ" - "បន្ថែមទំនាក់ទំនង" "ប៉ះរូបភាពដើម្បីមើលលេខទាំងអស់ ឬប៉ះ & សង្កត់ឲ្យជាប់ដើម្បីតម្រៀបឡើងវិញ" "លុបចេញ" + "ជ្រើសរើស​​ទាំងអស់" "ហៅជាវីដេអូ" "ផ្ញើសារ" "ព័ត៌មានលម្អិតអំពីការហៅ" @@ -213,11 +220,9 @@ "លេខបានរារាំង" "%1$s ត្រូវបានទប់ស្កាត់រួចហើយ" "គណនីហៅទូរសព្ទ" - "បើក" "កំណត់សិទ្ធិអនុញ្ញាត" "ដើម្បីបើកដំណើរការហៅរហ័ស សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីទំនាក់ទំនង។" "ដើម្បីមើលកំណត់ហេតុហៅទូរស័ព្ទរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីហៅទូរស័ព្ទ។" - "ដើម្បីមើលទំនាក់ទំនងរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីទំនាក់ទំនង។" "ដើម្បីចូលដំណើរការសារជាសំឡេងរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីហៅទូរស័ព្ទ។" "ដើម្បីស្វែងរកទំនាក់ទំនងរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតទំនាក់ទំនង។" "ដើម្បីធ្វើការហៅទូរស័ព្ទ សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីហៅទូរស័ព្ទ។" 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..d7f3aabbc 100644 --- a/java/com/android/dialer/app/res/values-kn/strings.xml +++ b/java/com/android/dialer/app/res/values-kn/strings.xml @@ -80,11 +80,16 @@ "ನಿರೀಕ್ಷೆಯನ್ನು ಸೇರಿಸಿ" "ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಸಿಮ್ಯುಲೇಟರ್" + "ಹೊಸ UI ಶಾರ್ಟ್‌ಕಟ್ ರಚಿಸಿ" "ಎಲ್ಲಾ ಸಂಪರ್ಕಗಳು" "ಸ್ಪರ್ಶ ಟೋನ್ ಕೀಪ್ಯಾಡ್ ಬಳಸಿ" "ಪ್ರತ್ಯತ್ತರ ಕರೆಯು ಪ್ರಗತಿಯಲ್ಲಿದೆ" "ಕರೆಯನ್ನು ಸೇರಿಸಿ" "ಒಳಬರುವ ಕರೆಗಳು" + "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಕ್ರಿಯೆಯ ಮೋಡ್‌ಗೆ ಪ್ರವೇಶಿಸಲಾಗುತ್ತಿದೆ" + "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಕ್ರಿಯೆಯ ಮೋಡ್ ತೊರೆಯಲಾಗಿದೆ" + "%1$s ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ" + "%1$s ಆಯ್ಕೆಯನ್ನು ರದ್ದುಮಾಡಲಾಗಿದೆ" "ಧ್ವನಿಮೇಲ್‌ ಪ್ಲೇ ಮಾಡಿ" "%1$s ಸಂಪರ್ಕ ವೀಕ್ಷಿಸಿ" "%1$s ಕರೆ ಮಾಡಿ" @@ -99,11 +104,15 @@ "ಧ್ವನಿಮೇಲ್" "%s ಸೆಕೆಂ" "%s ನಿಮಿ %s ಸೆಕೆಂ" - "ಧ್ವನಿಮೇಲ್" - "ಧ್ವನಿಮೇಲ್‌ಗಳು" - "ಹೌದು" - "ಇಲ್ಲ" + "ಬ್ಯಾಚ್ ಕ್ರಿಯೆಗಳ ಮೋಡ್ ಅನ್ನು ರದ್ದುಮಾಡಿ" + "ಅಳಿಸಿ" + "ರದ್ದುಮಾಡಿ" "ಆಯ್ಕೆ ಮಾಡಲಾದ %1$s ಅನ್ನು ಅಳಿಸುವುದೇ?" + "%1$s ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ" + + ""ಈ ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಅಳಿಸುವುದೇ? "" + ""ಈ ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಅಳಿಸುವುದೇ? "" + @string/call_log_header_today "%1$s ರಂದು %2$s ಗಂಟೆಗೆ" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "ಸಿಮ್‌ ಕಾರ್ಡ್‌ನಿಂದ ಲೋಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…" "ಸಿಮ್‌ ಕಾರ್ಡ್‌ ಸಂಪರ್ಕಗಳು" - "ಯಾವುದೇ ಸಂಪರ್ಕಗಳ ಅಪ್ಲಿಕೇಶನ್‌ ಲಭ್ಯವಿಲ್ಲ" "ಧ್ವನಿ ಹುಡುಕಾಟ ಲಭ್ಯವಿಲ್ಲ" "ಫೋನ್ ಅಪ್ಲಿಕೇಶನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುವುದರಿಂದ ಫೋನ್ ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ." "ಸಂಪರ್ಕಗಳನ್ನು ಹುಡುಕಿ" @@ -145,10 +153,9 @@ "%s ಹೊಸ ಮಿಸ್ಡ್‌ ಕರೆಗಳು" "ನಿಮ್ಮ ತ್ವರಿತ ಡಯಲ್‌ನಲ್ಲಿ ಇದುವರೆಗೆ ಯಾರೂ ಇಲ್ಲ" "ಮೆಚ್ಚಿನದನ್ನು ಸೇರಿಸಿ" - "ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಸಂಪರ್ಕಗಳನ್ನು ಹೊಂದಿಲ್ಲ" - "ಸಂಪರ್ಕ ಸೇರಿಸಿ" "ಎಲ್ಲಾ ಸಂಖ್ಯೆಗಳನ್ನು ನೋಡಲು ಚಿತ್ರವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಅಥವಾ ಮರುಕ್ರಮಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್‌‌ ಮಾಡಿ" "ತೆಗೆದುಹಾಕು" + "ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆ ಮಾಡಿ" "ವೀಡಿಯೊ ಕರೆ" "ಸಂದೇಶ ಕಳುಹಿಸಿ" "ಕರೆಯ ವಿವರಗಳು" @@ -213,11 +220,9 @@ "ನಿರ್ಬಂಧಿಸಲಾದ ಸಂಖ್ಯೆಗಳು" "%1$s ಈಗಾಗಲೇ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ." "ಕರೆ ಮಾಡುವ ಖಾತೆಗಳು" - "ಆನ್‌ ಮಾಡಿ" "ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿಸು" "ವೇಗ ಡಯಲ್ ಸಕ್ರಿಯಗೊಳಿಸಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." "ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ವೀಕ್ಷಿಸಲು, ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." - "ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ವೀಕ್ಷಿಸಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." "ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಪ್ರವೇಶಿಸಲು, ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." "ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಹುಡುಕಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಗಳನ್ನು ಆನ್ ಮಾಡಿ." "ಕರೆ ಮಾಡಲು, ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." 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..cb2e83c79 100644 --- a/java/com/android/dialer/app/res/values-ko/strings.xml +++ b/java/com/android/dialer/app/res/values-ko/strings.xml @@ -80,11 +80,16 @@ "대기 시간 추가" "설정" "시뮬레이터" + "새 UI 바로가기 만들기" "모든 연락처" "터치톤 키패드 사용" "진행 중인 통화로 돌아가기" "통화 추가" "수신전화" + "일괄 작업 모드 시작 중" + "일괄 작업 모드 종료됨" + "%1$s 선택됨" + "%1$s 선택 취소됨" "음성사서함 재생" "%1$s님의 연락처 보기" "전화걸기: %1$s" @@ -99,11 +104,15 @@ "음성사서함" "%s초" "%s%s초" - "음성사서함" - "음성사서함" - "예" - "아니요" + "일괄 작업 모드 취소" + "삭제" + "취소" "선택한 %1$s을(를) 삭제하시겠습니까?" + "%1$s개 선택됨" + + ""이 음성사서함을 삭제하시겠습니까? "" + ""이 음성사서함을 삭제하시겠습니까? "" + @string/call_log_header_today "%1$s %2$s" "%1$02d%2$02d초" @@ -116,7 +125,6 @@ "MEID" "SIM 카드에서 로딩 중..." "SIM 카드 주소록" - "사용할 수 있는 주소록 앱이 없습니다." "음성검색이 지원되지 않습니다." "전화 애플리케이션을 사용 중지했으므로 전화를 걸 수 없습니다." "주소록 검색" @@ -145,10 +153,9 @@ "새로운 부재중 전화 %s건" "아직 단축 다이얼이 설정된 연락처가 없습니다." "단축 다이얼 추가" - "아직 연락처가 없습니다." - "연락처 추가" "이미지를 터치하여 모든 번호를 확인하거나 길게 터치하여 재정렬합니다." "삭제" + "모두 선택" "화상 통화" "메시지 보내기" "통화 세부정보" @@ -213,11 +220,9 @@ "차단된 번호" "%1$s번은 이미 차단되었습니다." "통화 계정" - "사용" "권한 설정" "단축번호를 사용하려면 주소록 권한을 사용하도록 설정하세요." "통화 기록을 보려면 전화 권한을 사용하도록 설정하세요." - "주소록을 보려면 주소록 권한을 사용하도록 설정하세요." "음성사서함에 액세스하려면 전화 권한을 사용하도록 설정하세요." "주소록을 검색하려면 주소록 권한을 사용하도록 설정하세요." "전화를 걸려면 전화 권한을 사용하도록 설정하세요." 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..0a0b3e661 100644 --- a/java/com/android/dialer/app/res/values-ky/strings.xml +++ b/java/com/android/dialer/app/res/values-ky/strings.xml @@ -80,11 +80,16 @@ "Тыныгуу кошуу" "Жөндөөлөр" "Симулятор" + "Жаңы интерфейс үчүн кыска жол түзүү" "Бардык байланыштар" "Тоналдык терүү тактасын колдонуу" "Токтотулган чалууга кайтуу" "Чалууну кошуу" "Кирүүчү чалуулар" + "Жапырт аракет режимине кирдиңиз" + "Жапырт аракет режиминен чыктыңыз" + "%1$s объект тандалды" + "%1$s объект тандоодон чыгарылды" "Үнкатты угуу" "Байланышты кароо %1$s" "Чалуу %1$s" @@ -99,11 +104,15 @@ "Үн почтасы" "%s сек." "%s мүн. %s сек." - "үн почтасы" - "үн почталары" - "Ооба" - "Жок" + "Жапырт аракет режимин жокко чыгаруу" + "Жок кылуу" + "Жокко чыгаруу" "Тандалган %1$s жок кылынсынбы?" + "%1$s тандалды" + + ""Бул үн почталар жок кылынсынбы? "" + ""Бул үн почта жок кылынсынбы? "" + @string/call_log_header_today "%1$s саат %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "SIM картадан жүктөлүүдө..." "SIM картадагы байланыштар" - "Жеткиликтүү байланыштар колдонмосу жок" "Үн менен издөө жеткиликтүү эмес" "Телефон колдонмосу өчүрүлгөндүктөн, чалуу мүмкүн болбой жатат." "Байланыштарды издөө" @@ -145,10 +153,9 @@ "%s жаңы өткөзүлгөн чалуу" "Азырынча тез териле турган номерлер жок" "Сүйүктүү номер кошуу" - "Азырынча бир дагы байланышыңыз жок" - "Байланыш кошуу" "Бардык номерлерди көрүү үчүн, сүрөткө тийип коюңуз же коё бербей басып туруп иретин өзгөртсөңүз болот." "Алып салуу" + "Баарын тандоо" "Видео чалуу" "Билдирүү жөнөтүү" "Чалуунун чоо-жайы" @@ -213,11 +220,9 @@ "Бөгөттөлгөн номерлер" "%1$s мурунтан эле бөгөттөлгөн." "Чалуу каттоо эсептери" - "Күйгүзүү" "Уруксаттарды берүү" "Тез терүүнү иштетүү үчүн, \"Байланыштар\" колдонмосуна уруксат бериңиз." "Чалуулар таржымалыңызды көрүү үчүн, \"Телефон\" колдонмосуна уруксат бериңиз." - "Байланыштар тизмесин көрүү үчүн, \"Байланыштар\" колдонмосуна уруксат бериңиз." "Үн почтаңызга кирүү үчүн, \"Телефон\" колдонмосуна уруксат бериңиз." "Байланыштарыңызды издөө үчүн, Байланыштарга уруксатты күйгүзүңүз." "Чалуу үчүн, \"Телефон\" колдонмосуна уруксат бериңиз." 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..267d1c6be 100644 --- a/java/com/android/dialer/app/res/values-lo/strings.xml +++ b/java/com/android/dialer/app/res/values-lo/strings.xml @@ -80,11 +80,16 @@ "ເພີ່ມການລໍຖ້າ" "ການ​ຕັ້ງ​ຄ່າ" "ຕົວຈຳລອງ" + "ສ້າງປຸ່ມລັດສ່ວນຕິດຕໍ່ຜູ້ໃຊ້ໃໝ່" "ລາຍຊື່ຜູ່ຕິດຕໍ່ທັງໝົດ" "ໃຊ້ປຸ່ມກົດສັນຍານສຽງ" "ກັບໄປການໂທທີ່ກຳລັງດຳເນີນຢູ່" "ເພີ່ມການໂທ" "ສາຍໂທເຂົ້າ" + "ກຳລັງເຂົ້າໂໝດຄຳສັ່ງຈຳນວນຫຼາຍ" + "ອອກຈາກໂໝດຄຳສັ່ງຈຳນວນຫຼາຍແລ້ວ" + "ເລືອກ %1$s ແລ້ວ" + "ເຊົາເລືອກ %1$s ແລ້ວ" "ເປີດຂໍ້ຄວາມສຽງ" "ເບິ່ງລາຍຊື່ຜູ່ຕິດຕໍ່ %1$s" "ໂທຫາ %1$s" @@ -99,11 +104,15 @@ "ຂໍ້ຄວາມສຽງ" "%s ວິນາທີ" "%s ນ​ທ %s ວິ" - "ຂໍ້ຄວາມສຽງ" - "ຂໍ້ຄວາມສຽງ" - "ແມ່ນແລ້ວ" - "ບໍ່" + "ຍົກເລີກໂໝດຄຳສັ່ງເປັນຊຸດ" + "ລຶບ" + "ຍົກເລີກ" "ລຶບ %1$s ທີ່ເລືອກອອກໄປບໍ?" + "ເລືອກ %1$s ລາຍການແລ້ວ" + + ""ລຶບຂໍ້ຄວາມສຽງເຫຼົ່ານີ້ບໍ? "" + ""ລຶບຂໍ້ຄວາມສຽງນີ້ບໍ? "" + @string/call_log_header_today "%1$s ເວລາ %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "ກຳລັງໂຫລດຈາກ SIM card..." "ລາຍຊື່ຜູ່ຕິດຕໍ່ SIM card" - "ບໍ່​ມີ​ແອັບຯ​ລາຍ​ຊື່​ຕິດ​ຕໍ່​ຢູ່" "ບໍ່​ມີ​ການ​ຊອກ​ຫາ​ດ້ວຍ​ສຽງ​ຢູ່" "ບໍ່​ສາ​ມາດ​ໂທ​ໄດ​້​ເນື່ອງ​ຈາກ​ແອັບ​ພ​ລິ​ເຄ​ຊັນ​ໂທ​ລະ​ສັບ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໄວ້." "ຊອກຫາລາຍຊື່ຜູ່ຕິດຕໍ່" @@ -145,10 +153,9 @@ "%s ສາຍທີ່ບໍ່ໄດ້ຮັບໃໝ່" "ບໍ່​ມີ​ຜູ້​ໃດ​ຢູ່​ໃນ​ການ​ໂທ​ດ່ວນ​ຂອງ​ທ່ານ​ເທື່ອ" "ເພີ່ມ​ລາຍ​ການ​ທີ່​ມັກ" - "ທ່ານ​ບໍ່​ມີ​ລາຍ​ຊື່​ໃດ​ເທື່ອ" - "ເພີ່ມ​ລາຍ​ຊື່" "ແຕະຮູບເພື່ອເບິ່ງເບີໂທທັງໝົດ ຫຼື ແຕະຄ້າງໄວ້ເພື່ອຈັດລຳດັບໃໝ່" "​ລຶບ​ອອກ" + "ເລືອກທັງໝົດ" "​ໂທ​ດ້ວຍ​ວິ​ດີ​ໂອ" "ສົ່ງຂໍ້ຄວາມ" "ລາຍລະອຽດ​ການໂທ" @@ -213,11 +220,9 @@ "ເບີໂທລະສັບທີ່ບລັອກໄວ້" "%1$s ຖືກ​ບ​ລັອກ​ແລ້ວ." "ບັນ​ຊີ​ໂທ" - "ເປີດ​" "ຕັ້ງ​ການ​ອະ​ນຸ​ຍາດ" "ເພື່ອ​ເປີດ​ໃຊ້​ງານ​ການໂທດ່ວນ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ລາຍ​ຊື່." "ເພື່ອ​ເບິ່ງ​ບັນ​ທຶກ​ການ​ໂທ​ຂອງ​ທ່ານ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ." - "ເພື່ອ​ເບິ່ງ​ລາຍ​ຊື່​ຂອງ​ທ່ານ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ລາຍ​ຊື່" "ເພື່ອ​ເຂົ້າ​ຫາ​ຂໍ້​ຄວາມ​ສຽງ​ຂອງ​ທ່ານ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ." "ເພື່ອຄົ້ນຫາລາຍາຊື່ຂອງທ່ານ, ໃຫ້ເປີດການອະນຸຍາດລາຍຊື່." "ເພື່ອ​ເຮັດການໂທ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ." 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..e26a90927 100644 --- a/java/com/android/dialer/app/res/values-lt/strings.xml +++ b/java/com/android/dialer/app/res/values-lt/strings.xml @@ -82,11 +82,16 @@ "Pridėti laukimą" "Nustatymai" "Simuliatorius" + "Sukurti naują NS spart. klav." "Visi kontaktai" "Naudoti jutiklinę klaviatūrą" "Grįžti prie vykdomo skambučio" "Pridėti skambutį" "Gaunami skambučiai" + "Įjungiamas masinių veiksmų režimas" + "Masinių veiksmų režimas išjungtas" + "Pasirinkta: %1$s" + "Pasirinkimas atšauktas: %1$s" "Paleisti balso pašto pranešimus" "Žiūrėti kontaktą %1$s" "Skambinti %1$s" @@ -101,11 +106,17 @@ "Balso paštas" "%s sek." "%s min. %s sek." - "balso pašto praneš." - "balso pašto praneš." - "Taip" - "Ne" + "Atšaukti masinių veiksmų režimą" + "Ištrinti" + "Atšaukti" "Ištrinti pasir. %1$s?" + "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" @@ -118,7 +129,6 @@ "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ų" @@ -147,10 +157,9 @@ "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" @@ -217,11 +226,9 @@ "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ą." 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..8df2813c4 100644 --- a/java/com/android/dialer/app/res/values-lv/strings.xml +++ b/java/com/android/dialer/app/res/values-lv/strings.xml @@ -81,11 +81,16 @@ "Pievienot gaidīšanu" "Iestatījumi" "Simulators" + "Jaunās liet. saskarnes saīsne" "Visas kontaktpersonas" "Izmantot skārientoņu tastatūru" "Atgriezties pie pašreizējā zvana" "Pievienot zvanu" "Ienākošie zvani" + "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" "Atskaņot balss pasta ziņojumu" "Skatīt kontaktpersonu %1$s" "Zvanīt: %1$s" @@ -100,11 +105,16 @@ "Balss pasts" "%s s" "%s min %s s" - "balss pasta ziņojums" - "balss pasta ziņojumi" - "Jā" - "Nē" + "Iziet no grupas darbību režīma" + "Dzēst" + "Atcelt" "Vai dzēst atlasi: %1$s?" + "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" @@ -117,7 +127,6 @@ "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" @@ -146,10 +155,9 @@ "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" @@ -215,11 +223,9 @@ "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." 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..953a05569 100644 --- a/java/com/android/dialer/app/res/values-mk/strings.xml +++ b/java/com/android/dialer/app/res/values-mk/strings.xml @@ -80,11 +80,16 @@ "Додај почекај" "Поставки" "Симулатор" + "Создај крат. за нов интерфејс" "Сите контакти" "Користи тастатура со звуци на допир" "Врати се на повик во тек" "Додај повик" "Дојдовни повици" + "Влегувате во режим на групно дејство" + "Излеговте од режим на групно дејство" + "Избрано е %1$s" + "Поништен е изборот на %1$s" "Преслушај говорна пошта" "Прикажи контакт %1$s" "Повикај %1$s" @@ -99,11 +104,15 @@ "Говорна пошта" "%s сек." "%s мин. %s сек." - "говорна пошта" - "говорни пораки" - "Да" - "Не" + "Откажи го режимот на групни дејства" + "Избриши" + "Откажи" "Да се избришат избраните %1$s?" + "Избрани се %1$s" + + ""Да се избришат говорните пораки? "" + ""Да се избришат говорните пораки? "" + @string/call_log_header_today "%1$s во %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "Вчитување од SIM картичка..." "Контакти од SIM картичка" - "Не е достапна апликација за контакти" "Гласовното пребарување не е достапно" "Не може да се воспостави телефонски повик, бидејќи апликацијата Телефон е оневозможена." "Пребарај контакти" @@ -145,10 +153,9 @@ "%s нови пропуштени повици" "Сè уште немате никого на брзо бирање" "Додај омилено" - "Сè уште немате контакти" - "Додај контакт" "Допрете ја сликата за да ги видите сите броеви или допрете и држете за промена на редоследот" "Отстрани" + "Изберете ги сите" "Видеоповик" "Испрати порака" "Детали на повик" @@ -213,11 +220,9 @@ "Блокирани броеви" "%1$s веќе е блокиран." "Сметки за повикување" - "Вклучи" "Постави дозволи" "За да овозможите брзо бирање, вклучете ја дозволата за контакти." "За да ја видите евиденцијата на повици, вклучете ја дозволата за телефон." - "За да ги видите контактите, вклучете ја дозволата за контакти." "За да пристапите кон говорната пошта, вклучете ја дозволата за телефон." "За да ги пребарувате контактите, вклучете ги дозволите за контакти." "За да воспоставите повик, вклучете ја дозволата за телефон." 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..0eef40748 100644 --- a/java/com/android/dialer/app/res/values-ml/strings.xml +++ b/java/com/android/dialer/app/res/values-ml/strings.xml @@ -80,11 +80,16 @@ "കാത്തിരിക്കൽ ചേർക്കുക" "ക്രമീകരണം" "സിമുലേറ്റർ" + "പുതിയ UI കുറുക്കുവഴി സൃഷ്‌ടിക്കുക" "എല്ലാ കോൺടാക്റ്റുകളും" "ടച്ച് ടോൺ കീപാഡ് ഉപയോഗിക്കുക" "വിളിച്ചുകൊണ്ടിരിക്കുന്ന കോളിലേക്ക് മടങ്ങുക" "കോൾ ചേർക്കുക" "ഇൻകമിംഗ് കോളുകൾ" + "ബൾക്ക് പ്രവർത്തന മോഡിലേക്ക് പ്രവേശിക്കുന്നു" + "ബൾക്ക് പ്രവർത്തന മോഡ് വിട്ടു" + "%1$s തിരഞ്ഞെടുത്തു" + "%1$s തിരഞ്ഞെടുത്തത് മാറ്റി" "വോയ്‌സ്‌മെയിൽ പ്ലേ ചെയ്യുക" "%1$s എന്ന കോൺടാക്റ്റ് കാണുക" "വിളിക്കുക %1$s" @@ -99,11 +104,15 @@ "വോയ്‌സ്‌മെയിൽ" "%s സെക്കൻഡ്" "%s മി. %s സെ." - "വോയ്‌സ്‌മെയിൽ" - "വോയ്‌സ്മെയിലുകൾ" - "അതെ" - "ഇല്ല" + "\'ബാച്ച് പ്രവർത്തനങ്ങൾ\' മോഡ് റദ്ദാക്കുക" + "ഇല്ലാതാക്കുക" + "റദ്ദാക്കൂ" "തിരഞ്ഞെടുത്ത %1$s ഇല്ലാതാക്കണോ?" + "%1$s എണ്ണം തിരഞ്ഞെടുത്തു" + + ""ഈ വോയ്‌സ്‌മെയിലുകൾ ഇല്ലാതാക്കണോ? "" + ""ഈ വോയ്‌സ്‌മെയിൽ ഇല്ലാതാക്കണോ? "" + @string/call_log_header_today "%1$s, %2$s-ന്" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "സിം കാർഡിൽ നിന്നും ലോഡുചെയ്യുന്നു…" "സിം കാർഡ് കോൺടാക്റ്റുകൾ" - "കോൺടാക്റ്റ് അപ്ലിക്കേഷനൊന്നും ലഭ്യമല്ല" "വോയ്‌സ് തിരയൽ ലഭ്യമല്ല" "ഫോൺ അപ്ലിക്കേഷൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നതിനാൽ ഫോൺ കോൾ ചെയ്യാനാകില്ല." "കോണ്‍‌ടാക്റ്റുകള്‍ തിരയുക" @@ -145,10 +153,9 @@ "%s പുതിയ മിസ്‌ഡ് കോളുകൾ" "ഇതുവരെ ആരും നിങ്ങളുടെ സ്പീഡ് ഡയലിൽ ഇല്ല" "പ്രിയപ്പെട്ടത് ചേർക്കുക" - "നിങ്ങൾക്ക് ഇതുവരെയും കോൺടാക്റ്റുകൾ ഒന്നുമില്ല." - "ഒരു കോണ്‍ടാക്റ്റ് ചേര്‍ക്കുക" "എല്ലാ നമ്പറുകളും കാണാൻ ചിത്രം സ്‌പർശിക്കുക അല്ലെങ്കിൽ വീണ്ടും ക്രമീകരിക്കാൻ സ്‌പർശിച്ച് പിടിക്കുക" "നീക്കംചെയ്യുക" + "എല്ലാം തിരഞ്ഞെടുക്കുക" "വീഡിയോ കോള്‍" "ഒരു സന്ദേശം അയയ്‌ക്കുക" "കോൾ വിശദാംശങ്ങൾ" @@ -213,11 +220,9 @@ "ബ്ലോക്കുചെയ്ത നമ്പറുകൾ" "ഇതിനകം തന്നെ %1$s ബ്ലോക്കുചെയ്തിരിക്കുന്നു" "കോളിംഗ് അക്കൗണ്ട്" - "ഓണാക്കുക" "അനുമതികൾ സജ്ജമാക്കുക" "സ്പീഡ് ഡയൽ പ്രവർത്തനക്ഷമാക്കുന്നതിന്, \'കോൺടാക്റ്റുകൾ\' അനുമതി ഓണാക്കുക." "നിങ്ങളുടെ കോൾ ലോഗ് കാണുന്നതിന്, \'ഫോൺ\' അനുമതി ഓണാക്കുക." - "നിങ്ങളുടെ കോൺടാക്റ്റുകൾ കാണുന്നതിന്, \'കോൺടാക്റ്റുകൾ\' അനുമതി ഓണാക്കുക." "നിങ്ങളുടെ വോയ്‌സ്‌മെയിൽ ആക്സസ് ചെയ്യുന്നതിന്, \'ഫോൺ\' അനുമതി ഓണാക്കുക." "നിങ്ങളുടെ കോൺടാക്റ്റുകൾ തിരയുന്നതിന് കോൺടാക്റ്റുകൾക്കുള്ള അനുമതികൾ ഓണാക്കുക." "കോൾ വിളിക്കുന്നതിന്, \'ഫോൺ\' അനുമതി ഓണാക്കുക." 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..e0cd98710 100644 --- a/java/com/android/dialer/app/res/values-mn/strings.xml +++ b/java/com/android/dialer/app/res/values-mn/strings.xml @@ -80,11 +80,16 @@ "Хүлээлт нэмэх" "Тохиргоо" "Симулятор" + "Шинэ UI үүсгэх товчлол" "Бүх харилцагчид" "Хүрэлтээр дуугардаг гар ашиглах" "Үргэлжилж буй дуудлага руу буцах" "Дуудлага нэмэх" "Ирж буй дуудлага" + "Багц үйлдлийн горимд орж байна" + "Багц үйлдлийн горимоос гарсан" + "%1$s сонгосон" + "%1$s сонголтыг болиулсан" "Дуут шууданг тоглуулах" "%1$s харилцагчийг харах" "%1$s руу залгах" @@ -99,11 +104,15 @@ "Дуут шуудан" "%s сек" "%s минут %s секунд" - "дуут шуудан" - "дуут шуудан" - "Тийм" - "Үгүй" + "Багц үйлдлийн горимыг цуцлах" + "Устгах" + "Цуцлах" "Сонгосон %1$s-г устгах уу?" + "%1$s сонгосон" + + ""Эдгээр дуут шууданг устгах уу? "" + ""Энэ дуут шууданг устгах уу? "" + @string/call_log_header_today "%1$s %2$s-д" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "SIM картаас уншиж байна…" "SIM картны харилцагчид" - "Ямар ч харилцагчдын апликейшн байхгүй байна." "Дуут хайлт хийх боломжгүй байна" "Утас аппликешныг идэвхгүйжүүлсэн тул утасны дуудлага хийх боломжгүй." "Харилцагчдаас хайх" @@ -145,10 +153,9 @@ "%s шинэ аваагүй дуудлага" "Таны яаралтай залгах тохиргоон дээр одоогоор харилцагч байхгүй байна" "Таалагдсан хэсэгт нэмэх" - "Танд одоогоор харилцагч байхгүй байна" - "Харилцагч нэмэх" "Бүх дугаарыг харахын тулд зурганд хүрнэ үү эсвэл жагсаалтыг өөрчлөхийн тулд удаан дарна уу." "Хасах" + "Бүгдийг сонгох" "Видео дуудлага" "Зурвас илгээх" "Дуудлагын мэдээлэл" @@ -213,11 +220,9 @@ "Блоклосон дугаар" "%1$s-г аль хэдийн блоклосон байна." "Дуудах бүртгэл" - "Идэвхжүүлэх" "Зөвшөөрөл тохируулах" "Яаралтай дуудлагыг идэвхжүүлэхийн тулд Харилцагчдын зөвшөөрлийг идэвхжүүлнэ үү." "Дуудлагын жагсаалтыг харахын тулд утасны зөвшөөрлийг идэвхжүүлнэ үү." - "Харилцагчдаа харахын тулд Харилцагчдын зөвшөөрлийг идэвхжүүлнэ үү." "Дуут шууданд хандахын тулд Утасны зөвшөөрлийг идэвхжүүлнэ үү." "Харилцагчаа хайхын тулд, Харилцагчийн жагсаалтын зөвшөөрлийг идэвхжүүлнэ үү." "Залгахын тулд Утасны зөвшөөрлийг идэвхжүүлнэ үү." 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..70e6d410c 100644 --- a/java/com/android/dialer/app/res/values-mr/strings.xml +++ b/java/com/android/dialer/app/res/values-mr/strings.xml @@ -80,11 +80,16 @@ "प्रतीक्षा करा जोडा" "सेटिंग्ज" "सिम्युलेटर" + "नवीन UI शॉर्टकट तयार करा" "सर्व संपर्क" "स्‍पर्श टोन कीपॅडचा वापर करा" "चालू असलेल्या कॉलवर परत जा" "कॉल जोडा" "येणारे कॉल" + "मोठ्या प्रमाणात क्रिया मोडमध्ये प्रवेश करीत आहे" + "मोठ्या प्रमाणात क्रिया मोड सोडत आहे" + "%1$s निवडले" + "%1$s ची निवड रद्द केली" "व्हॉइसमेल प्ले करा" "%1$s संपर्क पहा" "%1$s ला कॉल करा" @@ -99,11 +104,15 @@ "व्हॉइसमेल" "%s सेकंद" "%s मिनिट %s सेकंद" - "व्हॉइसमेल" - "व्हॉइसमेल" - "होय" - "नाही" + "बॅच क्रिया मोड रद्द करा" + "हटवा" + "रद्द करा" "निवडलेले %1$s हटवायचेे?" + "%1$s निवडले" + + ""हा व्हॉइसमेल हटवायचा? "" + ""हे व्हॉइसमेल हटवायचे? "" + @string/call_log_header_today "%1$s रोजी %2$s वाजता" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "सिम कार्ड मधून लोड करीत आहे..." "सिम कार्ड संपर्क" - "कोणताही संपर्क अॅप उपलब्ध नाही" "व्हॉइस शोध उपलब्ध नाही" "फोन अनुप्रयोग अक्षम केला गेला असल्याने फोन कॉल करणे शक्य नाही." "संपर्क शोधा" @@ -145,10 +153,9 @@ "%s नवीन सुटलेले कॉल" "अद्याप आपल्‍या स्पीड डायलवर कोणीही नाही" "एक आवडते जोडा" - "आपल्‍याकडे अद्याप कोणतेही संपर्क नाहीत" - "एक संपर्क जोडा" "सर्व नंबर पाहण्यासाठी प्रतिमेस स्पर्श करा किंवा पुन्हा क्रम लावण्यासाठी स्पर्श करा आणि धरून ठेवा" "काढा" + "सर्व निवडा" "व्हिडिओ कॉल" "एक संदेश पाठवा" "कॉल तपशील" @@ -213,11 +220,9 @@ "अवरोधित केलेले नंबर" "%1$s आधीच अवरोधित केलेला आहे." "कॉल करण्याची खाती" - "चालू करा" "परवानग्या सेट करा" "स्पीड डायल सक्षम करण्‍यासाठी, संपर्क परवानगी चालू करा." "आपला कॉल लॉग पाहण्‍यासाठी, फोन परवानगी चालू करा." - "आपले संपर्क पाहण्‍यासाठी, संपर्क परवानगी चालू करा." "आपल्‍या व्हॉइसमेलमध्‍ये प्रवेश करण्‍यासाठी, फोन परवानगी चालू करा." "आपले संपर्क शोधण्‍यासाठी, संपर्क परवानग्या चालू करा." "कॉल करण्यासाठी, फोन परवानगी चालू करा." 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..f58f08f02 100644 --- a/java/com/android/dialer/app/res/values-ms/strings.xml +++ b/java/com/android/dialer/app/res/values-ms/strings.xml @@ -80,11 +80,16 @@ "Tambah penungguan" "Tetapan" "Simulator" + "Buat Pintasan UI Baharu" "Semua kenalan" "Gunakan pad kekunci nada sentuh" "Kembali ke panggilan yang sedang berlangsung" "Tambah panggilan" "Panggilan masuk" + "Memasuki mod tindakan pukal" + "Meninggalkan mod tindakan pukal" + "%1$s dipilih" + "%1$s dinyahpilih" "Mainkan mel suara" "Lihat kenalan %1$s" "Panggil %1$s" @@ -99,11 +104,15 @@ "Mel suara" "%s saat" "%s min %s saat" - "mel suara" - "mel suara" - "Ya" - "Tidak" + "Batalkan mod tindakan kelompok" + "Padam" + "Batal" "Padam %1$s yang dipilih?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..60c3271a0 100644 --- a/java/com/android/dialer/app/res/values-my/strings.xml +++ b/java/com/android/dialer/app/res/values-my/strings.xml @@ -80,11 +80,16 @@ "စောင့်ဆိုင်းခြင်း ထည့်ပါ" "ဆက်တင်များ" "အသစ်ကဲ့သို့ တုပသည့်စနစ်" + "UI ဖြတ်လမ်းလင့်ခ်အသစ် လုပ်ရန်" "လိပ်စာများအားလုံး" "touch tone ကီးခလုတ် ကိုအသုံးပြုပါ" "ဖုန်းပြန်ခေါ်မှု ပြုလုပ်နေစဉ်" "ဖုန်းခေါ်မှု ထပ်ထည့်ပါ" "အဝင်ခေါ်ဆိုမှုများ" + "တပြိုင်နက်တည်း စုပြုံလုပ်ဆောင်ချက်မုဒ်ကို ထည့်သွင်းခြင်း" + "တပြိုင်နက်တည်း စုပြုံလုပ်ဆောင်ချက်မုဒ်မှ ထွက်လိုက်သည်" + "ရွေးချယ်ထားသော %1$s" + "မရွေးချယ်ထားသော %1$s" "အသံပို့စာ နားထောင်ရန်" "%1$s လိပ်စာကြည့်ရန်" "%1$s ကိုခေါ်ပါ" @@ -99,11 +104,15 @@ "အသံစာပို့စနစ်" "%s စက္ကန့်" "%s မိနစ် %s စက္ကန့်" - "အသံမေးလ်" - "အသံမေးလ်များ" - "Yes" - "No" + "တပြိုင်နက်တည်း စုပြုံလုပ်ဆောင်ချက်များမုဒ်ကိ ပယ်ဖျက်ရန်" + "ဖျက်ပါ" + "မလုပ်တော့" "ရွေးထားသော %1$s ကို ဖျက်လိုပါသလား။" + "%1$s ကို ရွေးချယ်ထားသည်" + + ""ဤအသံမေးလ်များကို ဖျက်မလား။ "" + ""ဤအသံမေးလ်ကို ဖျက်မလား။ "" + @string/call_log_header_today "%1$s %2$s ၌" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEIDနံပါတ်" "ဆင်းမ်ကဒ်မှ ဖွင့်နေပါသည်..." "ဆင်းမ်ကဒ်မှ အဆက်အသွယ်များ" - "အဆက်အသွယ်များ app မရှိ" "အသံဖြင့် ရှာဖွေမှု မရှိ" "ဖုန်း အပလီကေးရှင်းကို ပိတ်ထား၍ ဖုန်း ခေါ်ဆိုမှု မပြုလုပ်နိုင်ခဲ့ပါ။" "အဆက်အသွယ်များရှာပါ" @@ -145,10 +153,9 @@ "လွတ်သွားသောဖုန်း %s ခါ" "သင်၏အမြန်ခေါ်စာရင်းတွင် မည်သူမျှ မရှိသေးပါ" "အနှစ်သက်ဆုံးတစ်ခု ထည့်ရန်" - "သင့်တွင် မည်သည့်အဆက်အသွယ်မျှ မရှိသေးပါ" - "အဆက်အသွယ်တစ်ယောက် ထည့်မည်" "နံပါတ်အားလုံးကိုကြည့်ရန် ပုံကိုထိပါ (သို့) ပြန်စီရန် ထိပြီးဖိထားပါ" "ဖယ်ရှာခြင်း" + "အားလုံးကို ရွေးချယ်ပါ" "ဗီဒီယို ခေါ်ဆိုမှု" "စာ တစ်စောင် ပို့ပါ" "ဖုန်းခေါ်မှု အသေးစိတ်အချက်အလက်" @@ -213,11 +220,9 @@ "ပိတ်ထားသည့် နံပါတ်များ" "%1$s အားပိတ်ဆို့ထားပြီးပါပြီ။" "ခေါ်ဆိုသော အကောင့်များ" - "ဖွင့်ထားရန်" "ခွင့်ပြုချက်များ သတ်မှတ်မည်" "မြန်နှုန်းမြင့်ဖုန်းခေါ်ဆိုမှုကို ဖွင့်ရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်ကို ဖွင့်ပါ။" "ခေါ်ဆိုမှုမှတ်တမ်းကို ကြည့်ရန်၊ ဖုန်းခွင့်ပြုချက်ကို ဖွင့်ပါ။" - "အဆက်အသွယ်များကိုကြည့်ရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်ကို ဖွင့်ပါ။" "အသံမေးလ်ကိုအသုံးပြုရန်၊ ဖုန်းခွင့်ပြုချက်ကိုဖွင့်ပါ။" "သင့်အဆက်အသွယ်များကို ရှာဖွေရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်များကို ဖွင့်ပါ။" "ဖုန်းခေါ်ဆိုရန်၊ ဖုန်းခွင့်ပြုချက်ကိုဖွင့်ပါ။" 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..344a26a51 100644 --- a/java/com/android/dialer/app/res/values-nb/strings.xml +++ b/java/com/android/dialer/app/res/values-nb/strings.xml @@ -80,11 +80,16 @@ "Legg til Vent" "Innstillinger" "Simulator" + "Nytt grensesnitt – lag snarvei" "Alle kontakter" "Bruk tonetastatur" "Gå tilbake til aktiv samtale" "Legg til en samtale" "Innkommende samtaler" + "Starter massehandlingsmodus" + "Massehandlingsmodus er avsluttet" + "Du har valgt %1$s" + "Du har valgt bort %1$s" "Spill av talemelding" "Se kontakten %1$s" "Ring %1$s" @@ -99,11 +104,15 @@ "Telefonsvarer" "%s sek" "%s min %s sek" - "talepost" - "talepost" - "Ja" - "Nei" + "Avbryt massehandlinsmodus" + "Slett" + "Avbryt" "Slett markert %1$s?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..5e70c40b6 100644 --- a/java/com/android/dialer/app/res/values-ne/strings.xml +++ b/java/com/android/dialer/app/res/values-ne/strings.xml @@ -80,11 +80,16 @@ "पर्खाइ थप्नुहोस्" "सेटिङ्हरू" "सिम्युलेटर" + "नयाँ UI सर्टकट सिर्जना गर्ने" "सबै सम्पर्कहरू" "स्पर्श टोन किप्याडको प्रयोग गर्नुहोस्" "हुदै गरेको कलमा फर्कनुहोस्" "कल थप्नुहोस्" "आगमन कलहरू" + "बल्क कारबाही सम्बन्धी मोडमा प्रवेश गर्दै" + "बल्क कारबाही सम्बन्धी मोड छोडियो" + "%1$s चयन गरियो" + "%1$s चयन हटाइयो" "भ्वाइसमेल बजाउनुहोस्" "%1$s सम्पर्क हेर्नुहोस्" "कल %1$s" @@ -99,11 +104,15 @@ "भ्वाइसमेल" "%s सेकेन्ड" "%s मिनेट %s सकेन्ड" - "भ्वाइस मेल" - "भ्वाइस मेलहरू" - "हो" - "होइन" + "ब्याच सम्बन्धी कारबाहीको मोडलाई रद्द गर्नुहोस्" + "मेट्नुहोस्" + "रद्द गर्नुहोस्" "चयन गरिएका %1$s लाई मेटाउने हो?" + "%1$s चयन गरियो" + + ""यी भ्वाइस मेलहरू मेट्ने हो? "" + ""यो भ्वाइस मेल मेट्ने हो? "" + @string/call_log_header_today "%1$s मा %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "SIM कार्डबाट लोड हुँदै" "SIM कार्ड सम्पर्कहरू" - "कुनै पनि सम्पर्क अनुप्रयोग उपलब्ध छैन" "आवाज खोजी उपलब्ध छैन" "फोन अनुप्रयोग असक्षम गरिएकोले फोन गर्न सकिँदैन।" "सम्पर्कहरू खोज्नुहोस्" @@ -145,10 +153,9 @@ "%s नयाँ छुटेका कलहरु" "तपाईँको स्पिड डायलमा अझसम्म कोही छैन" "एक मनपर्ने थप्नुहोस्" - "तपाईँसँग अझसम्म कुनै सम्पर्कहरू छैनन्" - "एउटा सम्पर्क थप्नुहोस्" "सबै नम्बरहरू हेर्न छविलाई छुनुहोस् वा पुन:क्रमबद्ध गर्न छोइराख्नुहोस्" "हटाउँनुहोस्" + "सबैलाई चयन गर्नुहोस्" "भिडियो कल" "सन्देश पठाउनुहोस्" "कल विवरणहरु" @@ -213,11 +220,9 @@ "रोकिएका नम्बरहरू" "%1$s पहिले नै रोकिएको छ।" "खाता कलिङ" - "सक्रिय पार्नुहोस्" "अनुमतिहरू सेट गर्नुहोस्" "तीव्र डायल सक्षम गर्न, सम्पर्क अनुमति सक्षम गर्नुहोस्।" "आफ्नो कल लग हेर्न, फोन अनुमति सक्रिय गर्नुहोस्।" - "आफ्नो सम्पर्क हेर्न सम्पर्क अनुमति सक्रिय गर्नुहोस्।" "आफ्नो भ्वाइस मेल पहुँच गर्न, फोन अनुमति सक्रिय गर्नुहोस्" "तपाईँको सम्पर्कहरू खोज गर्न सम्पर्क अनुमतिहरू सक्रिय गर्नुहोस्।" "कल गर्न फोन अनुमति सक्रिय गर्नुहोस्।" 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..dbd29bc78 100644 --- a/java/com/android/dialer/app/res/values-nl/strings.xml +++ b/java/com/android/dialer/app/res/values-nl/strings.xml @@ -80,11 +80,16 @@ "Wachten toevoegen" "Instellingen" "Simulator" + "Snelkoppeling voor nieuwe UI" "Alle contacten" "Toetsen voor toonkiezen gebruiken" "Terug naar actief gesprek" "Oproep toevoegen" "Inkomende oproepen" + "Modus voor bulkacties openen" + "Modus voor bulkacties verlaten" + "%1$s geselecteerd" + "Selectie van %1$s opgeheven" "Voicemail afspelen" "Contact %1$s bekijken" "%1$s bellen" @@ -99,11 +104,15 @@ "Voicemail" "%s sec." "%s min. %s sec." - "voicemail" - "voicemails" - "Ja" - "Nee" + "Modus voor batchacties annuleren" + "Verwijderen" + "Annuleren" "Geselecteerde %1$s verwijderen?" + "%1$s geselecteerd" + + ""Deze voicemails verwijderen? "" + ""Deze voicemail verwijderen? "" + @string/call_log_header_today "%1$s om %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..344a26a51 100644 --- a/java/com/android/dialer/app/res/values-no/strings.xml +++ b/java/com/android/dialer/app/res/values-no/strings.xml @@ -80,11 +80,16 @@ "Legg til Vent" "Innstillinger" "Simulator" + "Nytt grensesnitt – lag snarvei" "Alle kontakter" "Bruk tonetastatur" "Gå tilbake til aktiv samtale" "Legg til en samtale" "Innkommende samtaler" + "Starter massehandlingsmodus" + "Massehandlingsmodus er avsluttet" + "Du har valgt %1$s" + "Du har valgt bort %1$s" "Spill av talemelding" "Se kontakten %1$s" "Ring %1$s" @@ -99,11 +104,15 @@ "Telefonsvarer" "%s sek" "%s min %s sek" - "talepost" - "talepost" - "Ja" - "Nei" + "Avbryt massehandlinsmodus" + "Slett" + "Avbryt" "Slett markert %1$s?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..33afd5824 100644 --- a/java/com/android/dialer/app/res/values-pa/strings.xml +++ b/java/com/android/dialer/app/res/values-pa/strings.xml @@ -80,11 +80,16 @@ "ਉਡੀਕ ਜੋੜੋ" "ਸੈਟਿੰਗਾਂ" "ਸਿਮੁਲੇਟਰ" + "ਨਵਾਂ UI ਸ਼ਾਰਟਕੱਟ ਬਣਾਓ" "ਸਾਰੇ ਸੰਪਰਕ" "ਟਚ ਟੋਨ ਕੀਪੈਡ ਵਰਤੋ" "ਪ੍ਰਗਤੀ ਵਿੱਚ ਕਾਲ ਤੇ ਵਾਪਸ ਜਾਓ" "ਕਾਲ ਜੋੜੋ" "ਇਨਕਮਿੰਗ ਕਾਲਾਂ" + "ਬਲਕ ਕਾਰਵਾਈ ਮੋਡ ਵਿੱਚ ਦਾਖਲ ਹੋਇਆ ਜਾ ਰਿਹਾ ਹੈ" + "ਬਲਕ ਕਾਰਵਾਈ ਮੋਡ ਨੂੰ ਛੱਡਿਆ" + "%1$s ਨੂੰ ਚੁਣਿਆ ਗਿਆ" + "%1$s ਨੂੰ ਅਣ-ਚੁਣਿਆ ਕੀਤਾ ਗਿਆ" "ਵੌਇਸਮੇਲ ਪਲੇ ਕਰੋ" "ਸੰਪਰਕ %1$s ਦੇਖੋ" "%1$s ਨੂੰ ਕਾਲ ਕਰੋ" @@ -99,11 +104,15 @@ "ਵੌਇਸਮੇਲ" "%s ਸਕਿੰਟ" "%s ਮਿੰਟ %s ਸਕਿੰਟ" - "ਵੌਇਸਮੇਲ" - "ਵੌਇਸਮੇਲਾਂ" - "ਹਾਂ" - "ਨਹੀਂ" + "ਬੈਚ ਕਾਰਵਾਈਆਂ ਮੋਡ ਨੂੰ ਰੱਦ ਕਰੋ" + "ਮਿਟਾਓ" + "ਰੱਦ ਕਰੋ" "ਕੀ ਚੁਣੀ(ਆਂ) ਹੋਈ(ਆਂ) %1$s ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?" + "%1$s ਨੂੰ ਚੁਣਿਆ ਗਿਆ" + + ""ਕੀ ਇਸ ਵੌਇਸਮੇਲ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ? "" + ""ਕੀ ਇਹਨਾਂ ਵੌਇਸਮੇਲਾਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ? "" + @string/call_log_header_today "%1$s ਨੂੰ %2$s ਵਜੇ" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "SIM ਕਾਰਡ ਵਿੱਚੋਂ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ…" "SIM ਕਾਰਡ ਸੰਪਰਕ" - "ਕੋਈ ਸੰਪਰਕ ਐਪ ਉਪਲਬਧ ਨਹੀਂ" "ਵੌਇਸ ਖੋਜ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" "ਇੱਕ ਫੋਨ ਕਾਲ ਨਹੀਂ ਕਰ ਸਕਦਾ ਕਿਉਂਕਿ ਫੋਨ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।" "ਸੰਪਰਕ ਖੋਜੋ" @@ -145,10 +153,9 @@ "%s ਨਵੀਆਂ ਮਿਸਡ ਕਾਲਾਂ" "ਅਜੇ ਤੁਹਾਡੇ ਸਪੀਡ ਡਾਇਲ \'ਤੇ ਕੋਈ ਵੀ ਵਿਅਕਤੀ ਨਹੀਂ ਹੈ" "ਕੋਈ ਮਨਪਸੰਦ ਸ਼ਾਮਲ ਕਰੋ" - "ਤੁਹਾਡੇ ਕੋਲ ਅਜੇ ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ ਹਨ।" - "ਕੋਈ ਸੰਪਰਕ ਸ਼ਾਮਲ ਕਰੋ" "ਸਾਰੇ ਨੰਬਰਾਂ ਨੂੰ ਵੇਖਣ ਲਈ ਚਿਤਰ ਨੂੰ ਸਪਰਸ਼ ਕਰੋ ਜਾਂ ਦੁਬਾਰਾ ਕ੍ਰਮਬੱਧ ਕਰਨ ਲਈ ਸਪਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ" "ਹਟਾਓ" + "ਸਭ ਚੁਣੋ" "ਵੀਡੀਓ ਕਾਲ" "ਇੱਕ ਸੁਨੇਹਾ ਭੇਜੋ" "ਕਾਲ ਵੇਰਵੇ" @@ -213,11 +220,9 @@ "ਬਲੌਕ ਕੀਤੇ ਗਏ ਨੰਬਰ" "%1$s ਪਹਿਲਾਂ ਹੀ ਬਲੌਕ ਕੀਤਾ ਹੋਇਆ ਹੈ।" "ਕਾਲਿੰਗ ਖਾਤੇ" - "ਚਾਲੂ ਕਰੋ" "ਅਨੁਮਤੀਆਂ ਸੈੱਟ ਕਰੋ" "ਸਪੀਡ ਡਾਇਲ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਲਈ, ਸੰਪਰਕ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" "ਆਪਣਾ ਕਾਲ ਲੌਗ ਵੇਖਣ ਲਈ, ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" - "ਆਪਣੇ ਸੰਪਰਕਾਂ ਨੂੰ ਵੇਖਣ ਲਈ, ਸੰਪਰਕ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" "ਆਪਣੀ ਵੌਇਸਮੇਲ ਐਕਸੈਸ ਕਰਨ ਲਈ, ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" "ਆਪਣੇ ਸੰਪਰਕਾਂ ਦੀ ਖੋਜ ਕਰਨ ਲਈ,, ਸੰਪਰਕ ਅਨੁਮਤੀਆਂ ਨੂੰ ਚਾਲੂ ਕਰੋ।" "ਕਾਲ ਕਰਨ ਲਈ, ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।" 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..7f6027c51 100644 --- a/java/com/android/dialer/app/res/values-pl/strings.xml +++ b/java/com/android/dialer/app/res/values-pl/strings.xml @@ -82,11 +82,16 @@ "Dodaj oczekiwanie" "Ustawienia" "Symulator" + "Utwórz skrót do nowego interfejsu" "Wszystkie kontakty" "Użyj klawiatury tonowej" "Wróć do aktywnego połączenia" "Dodaj połączenie" "Połączenia przychodzące" + "Włączono tryb działań zbiorczych" + "Wyłączono tryb działań zbiorczych" + "Wybrano: %1$s" + "Anulowano wybór: %1$s" "Odtwórz pocztę głosową" "Wyświetl kontakt %1$s" "Zadzwoń do: %1$s" @@ -101,11 +106,17 @@ "Poczta głosowa" "%s s" "%s min %s s" - "wiadomości głosowe" - "wiadomości głosowe" - "Tak" - "Nie" + "Anuluj tryb działań zbiorczych" + "Usuń" + "Anuluj" "Usunąć wybrane %1$s?" + "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" @@ -118,7 +129,6 @@ "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" @@ -147,10 +157,9 @@ "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" @@ -217,11 +226,9 @@ "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." 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..768ce57d4 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 @@ -80,11 +80,16 @@ "Adicionar espera" "Configurações" "Simulador" + "Criar atalho para a nova IU" "Todos os contatos" "Usar teclado multifrequencial" "Retornar para a chamada em espera" "Ad. cham." "Chamadas recebidas" + "Entrando no modo de ação em massa" + "Saindo do modo de ação em massa" + "%1$s selecionado" + "%1$s não selecionado" "Reproduzir mensagem de voz" "Visualizar contato %1$s" "Ligar para %1$s" @@ -99,11 +104,15 @@ "Correio de voz" "%s seg" "%s m %s s" - "correio de voz" - "correios de voz" - "Sim" - "Não" + "Cancelar modo de ações em lote" + "Excluir" + "Cancelar" "Excluir a seleção de %1$s?" + "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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..3c636e1d6 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 @@ -80,11 +80,16 @@ "Adicionar espera" "Definições" "Simulador" + "Criar novo atalho de IU" "Todos os contactos" "Utilizar teclado numérico com tons de toque" "Voltar à chamada em curso" "Adicionar chamada" "Chamadas recebidas" + "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" "Reproduzir mensagem de correio de voz" "Ver o contacto %1$s" "Ligar a %1$s" @@ -99,11 +104,15 @@ "Correio de voz" "%s seg" "%s min. %s seg." - "mensagem de correio de voz" - "mensagens de correio de voz" - "Sim" - "Não" + "Cancelar modo de ações em lote" + "Eliminar" + "Cancelar" "Pretende eliminar a(s) %1$s selecionada(s)?" + "%1$s selecionada(s)" + + ""Pretende eliminar esta(s) mensagem(ns) 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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..768ce57d4 100644 --- a/java/com/android/dialer/app/res/values-pt/strings.xml +++ b/java/com/android/dialer/app/res/values-pt/strings.xml @@ -80,11 +80,16 @@ "Adicionar espera" "Configurações" "Simulador" + "Criar atalho para a nova IU" "Todos os contatos" "Usar teclado multifrequencial" "Retornar para a chamada em espera" "Ad. cham." "Chamadas recebidas" + "Entrando no modo de ação em massa" + "Saindo do modo de ação em massa" + "%1$s selecionado" + "%1$s não selecionado" "Reproduzir mensagem de voz" "Visualizar contato %1$s" "Ligar para %1$s" @@ -99,11 +104,15 @@ "Correio de voz" "%s seg" "%s m %s s" - "correio de voz" - "correios de voz" - "Sim" - "Não" + "Cancelar modo de ações em lote" + "Excluir" + "Cancelar" "Excluir a seleção de %1$s?" + "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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..b85f84987 100644 --- a/java/com/android/dialer/app/res/values-ro/strings.xml +++ b/java/com/android/dialer/app/res/values-ro/strings.xml @@ -81,11 +81,16 @@ "Adăugați interval de așteptare" "Setări" "Simulator" + "Creați comandă rapidă IU nouă" "Toată agenda" "Tastatura tactilă cu sunet" "Reveniți la apelul în curs" "Adăugați un apel" "Apeluri de intrare" + "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" "Redați mesajul vocal" "Afișați persoana din agendă %1$s" "Apelați %1$s" @@ -100,11 +105,16 @@ "Mesagerie vocală" "%s secunde" "%s min. %s sec." - "mesagerie vocală" - "mesaje vocale" - "Da" - "Nu" + "Anulați modul de acțiuni în lot" + "Ștergeți" + "Anulați" "Ștergeți cele %1$s selectate?" + "%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" @@ -117,7 +127,6 @@ "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ă" @@ -146,10 +155,9 @@ "%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" @@ -215,11 +223,9 @@ "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." 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..91441cc56 100644 --- a/java/com/android/dialer/app/res/values-ru/strings.xml +++ b/java/com/android/dialer/app/res/values-ru/strings.xml @@ -82,11 +82,16 @@ "Добавить паузу" "Настройки" "Симулятор" + "Создать ярлык для нового интерфейса" "Все контакты" "Панель тонального набора" "Вернуться к текущему вызову" "Добавить вызов" "Входящие вызовы" + "Вы вошли в режим массового действия" + "Вы вышли из режима массового действия" + "Выбран объект %1$s" + "Выбор объекта %1$s отменен" "Прослушать голосовую почту" "Просмотреть данные: %1$s" "Вызов: %1$s" @@ -101,11 +106,17 @@ "Голосовая почта" "%s сек." "%s мин. %s сек." - "голосовое сообщение" - "голосовые сообщения" - "Да" - "Нет" + "Отмена режима массового действия" + "Удалить" + "Отмена" "Удалить %1$s?" + "Выбрано: %1$s" + + ""Удалить эти голосовые сообщения? "" + ""Удалить эти голосовые сообщения? "" + ""Удалить эти голосовые сообщения? "" + ""Удалить эти голосовые сообщения? "" + @string/call_log_header_today "%1$s в %2$s" "%1$02d:%2$02d" @@ -118,7 +129,6 @@ "MEID" "Загрузка с SIM-карты…" "Контакты на SIM-карте" - "Нет приложения для работы с контактами" "Голосовой поиск недоступен" "Нельзя совершать телефонные звонки, поскольку приложение \"Телефон\" отключено." "Поиск в контактах" @@ -147,10 +157,9 @@ "Пропущенных вызовов: %s" "Нет номеров для быстрого набора" "Настроить быстрый набор" - "Нет контактов" - "Добавить контакт" "Коснитесь изображения, чтобы увидеть все номера, или нажмите и удерживайте, чтобы изменить порядок" "Удалить" + "Выбрать все" "Видеовстреча" "Отправить сообщение" "Сведения о вызове" @@ -217,11 +226,9 @@ "Заблокированные номера" "%1$s уже заблокирован." "Аккаунты для звонков" - "Включить" "Задать разрешения" "Чтобы настроить быстрый набор, предоставьте приложению разрешение \"Контакты\"." "Чтобы открыть список вызовов, предоставьте приложению разрешение \"Телефон\"." - "Чтобы открыть список контактов, предоставьте приложению разрешение \"Контакты\"." "Чтобы получить доступ к голосовой почте, предоставьте приложению разрешение \"Телефон\"." "Для поиска контактов включите разрешение \"Контакты\"." "Чтобы позвонить, предоставьте приложению разрешение \"Телефон\"." 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..8a748d53c 100644 --- a/java/com/android/dialer/app/res/values-si/strings.xml +++ b/java/com/android/dialer/app/res/values-si/strings.xml @@ -80,11 +80,16 @@ "රැඳී සිටීම එක් කරන්න" "සැකසීම්" "සමාකෘතිය" + "නව UI කෙටිමග තනන්න" "සියලුම සම්බන්ධතා" "ස්පර්ශ නාද යතුරුපෑඩය භාවිතා කරන්න" "පවතින ඇමතුමට නැවත යන්න" "ඇමතුමක් එක් කරන්න" "එන ඇමතුම්" + "තොග ක්‍රියා ප්‍රකාරය ඇතුළු කරමින්" + "තොග ක්‍රියා ප්‍රකාරය හැර යන ලදී" + "%1$s තෝරා ගන්නා ලදී" + "%1$s තෝරා ගැනීම ඉවත් කරන ලදී" "හඬ තැපෑල ධාවනය කිරීම" "%1$s සම්බන්ධතාවය බලන්න" "%1$s අමතන්න" @@ -99,11 +104,15 @@ "හඬ තැපෑල" "තත් %s" "මිනි %s තත් %s" - "හඬ තැපෑල" - "හඬ තැපැල්" - "ඔව්" - "නැත" + "කාණ්ඩ ක්‍රියා ප්‍රකාරය අවලංගු කරන්න" + "මකන්න" + "අවලංගු කරන්න" "තෝරා ගත් %1$s මකන්නද?" + "%1$s තෝරා ගන්නා ලදි" + + ""මෙම හඬ තැපැල් මකන්නද? "" + ""මෙම හඬ තැපැල් මකන්නද? "" + @string/call_log_header_today "%1$s දින %2$sට" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "SIM පතෙන් පූරණය කරමින්…" "SIM පත් සම්බන්ධතා" - "සබඳතා යෙදුමක් ලබාගත නොහැකිය" "හඬ සෙවුම ලබාගත නොහැකිය" "දුරකථන යෙදුම අබල කර ඇති නිසා දුරකථන ඇමතුම ලබාගැනීම කළ නොහැක." "සම්බන්ධතා සෙවීම" @@ -145,10 +153,9 @@ "නව මඟ හැරුණු ඇමතුම් %s" "ඔබගේ වේග ඩයල් එකේ තවමත් කවුරුවත් නැහැ" "ප්‍රියතම ලෙස එක් කරන්න" - "ඔබ තවමත් සම්බන්ධතා නැහැ" - "සම්බන්ධතාවයක් එක් කරන්න" "සියලු අංක බැලීමට රූපය ස්පර්ශ කරන්න නැතහොත් නැවත අනුපිළිවෙළට සැකසීමට ස්පර්ශ කර අල්ලාගෙන සිටින්න" "ඉවත් කරන්න" + "සියල්ල තෝරන්න" "වීඩියෝ ඇමතුම" "පණිවිඩයක් යවන්න" "ඇමතුම් විස්තර" @@ -213,11 +220,9 @@ "අවහිර කළ අංක" "%1$s දැනටමත් අවහිර කර ඇත." "ගිණුම් ඇමතීම" - "ක්‍රියාත්මක කරන්න" "අවසර සකසන්න" "වේග ඩයල් කිරීම සබල කිරීමට, සම්බන්ධතා අවසරය ක්‍රියාත්මක කරන්න." "ඔබේ ඇමතුම් ලොගය බැලීමට, දුරකථන අවසරය ක්‍රියාත්මක කරන්න." - "ඔබේ සම්බන්ධතා බැලීමට, සම්බන්ධතා අවසරය ක්‍රියාත්මක කරන්න." "ඔබේ හඬ තැපෑල වෙත ප්‍රවේශ වීමට, දුරකථන අවසරය ක්‍රියාත්මක කරන්න." "ඔබේ සම්බන්ධතා සෙවීමට, සම්බන්ධතා අවසර ක්‍රියාත්මක කරන්න." "ඇමතුමක් ලබා ගැනීමට, දුරකථන අවසරය ක්‍රියාත්මක කරන්න." 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..e84febb17 100644 --- a/java/com/android/dialer/app/res/values-sk/strings.xml +++ b/java/com/android/dialer/app/res/values-sk/strings.xml @@ -82,11 +82,16 @@ "Pridať čakanie" "Nastavenia" "Simulátor" + "Vyt. skratku na nové rozhranie" "Všetky kontakty" "Použiť dotykovú tónovú klávesnicu" "Návrat k prebiehajúcemu hovoru" "Pridať hovor" "Prichádzajúce hovory" + "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ý" "Prehrať hlasovú správu" "Zobraziť kontakt %1$s" "Zavolať kontakt %1$s" @@ -101,11 +106,17 @@ "Hlasová schránka" "%s s" "%s min. %s s" - "hlasová správa" - "hlasové správy" - "Áno" - "Nie" + "Zrušiť režim hromadných akcií" + "Odstrániť" + "Zrušiť" "Chcete odstrániť vybraté položky (%1$s)?" + "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" @@ -118,7 +129,6 @@ "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" @@ -147,10 +157,9 @@ "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" @@ -217,11 +226,9 @@ "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." 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..495b6e802 100644 --- a/java/com/android/dialer/app/res/values-sl/strings.xml +++ b/java/com/android/dialer/app/res/values-sl/strings.xml @@ -82,11 +82,16 @@ "Dodaj premor" "Nastavitve" "Simulator" + "Ustvari bliž. za novi up. vm." "Vsi stiki" "Uporabi številčnico za tonsko klicanje" "Nazaj na klic, ki poteka" "Dodaj klic" "Dohodni klici" + "Prehod v način množičnega dejanja" + "Prehod iz načina množičnega dejanja" + "Izbrano: %1$s" + "Preklican izbor: %1$s" "Predvajanje sporočil glasovne pošte" "Ogled stika %1$s" "Pokliči %1$s" @@ -101,11 +106,17 @@ "Glasovna pošta" "%s s" "%s min %s s" - "sporočilo v odzivniku" - "sporočila v odzivniku" - "Da" - "Ne" + "Prekliči način množičnega dejanja" + "Izbriši" + "Prekliči" "Želite izbrisati %1$s?" + "Š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" @@ -118,7 +129,6 @@ "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" @@ -147,10 +157,9 @@ "Š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" @@ -217,11 +226,9 @@ "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." 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..809fd8a22 100644 --- a/java/com/android/dialer/app/res/values-sq/strings.xml +++ b/java/com/android/dialer/app/res/values-sq/strings.xml @@ -80,11 +80,16 @@ "Shto një pritje" "Cilësimet" "Simuluesi" + "Krijo një shkurtore për ndërfaqen e re të përdoruesit" "Të gjitha kontaktet" "Përdor bllokun e tasteve" "Kthehu te telefonata" "Shto një telefonatë" "Telefonatat hyrëse" + "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" "Luaj postën zanore" "Shiko kontaktin %1$s" "Telefono %1$s" @@ -99,11 +104,15 @@ "Posta zanore" "%s sekonda" "%s min. e %s sek." - "posta zanore" - "postat zanore" - "Po" - "Jo" + "Anulo modalitetin e veprimeve në grup" + "Fshi" + "Anulo" "Të fshihen %1$s të zgjedhura?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..6f85c0ba8 100644 --- a/java/com/android/dialer/app/res/values-sr/strings.xml +++ b/java/com/android/dialer/app/res/values-sr/strings.xml @@ -81,11 +81,16 @@ "Додај чекање" "Подешавања" "Симулатор" + "Направите пречицу за нови UI" "Сви контакти" "Употребите бројчаник за тонско бирање" "Врати се на позив који је у току" "Додај позив" "Долазни позиви" + "Улазите у режим групних радњи" + "Изашли сте из режима групних радњи" + "Изабрано је %1$s" + "Опозван је избор %1$s" "Пуштање говорне поште" "Прикажи контакт %1$s" "Позови %1$s" @@ -100,11 +105,16 @@ "Говорна пошта" "%s сек" "%s мин %s сек" - "говорну поруку" - "говорне поруке" - "Да" - "Не" + "Откажите режим групних радњи" + "Избриши" + "Откажи" "Желите ли да избришете изабрану(е) %1$s?" + "Изабраних: %1$s" + + ""Желите ли да избришете ове говорне поруке? "" + ""Желите ли да избришете ове говорне поруке? "" + ""Желите ли да избришете ове говорне поруке? "" + @string/call_log_header_today "%1$s у %2$s" "%1$02d:%2$02d" @@ -117,7 +127,6 @@ "MEID" "Учитава се са SIM картице…" "Контакти на SIM картици" - "Нема доступне апликације за контакте" "Гласовна претрага није доступна" "Није могуће упутити телефонски позив јер је апликација Телефон онемогућена." "Претражи контакте" @@ -146,10 +155,9 @@ "Нових пропуштених позива: %s" "Немате ниједан контакт на брзом бирању" "Додај омиљен контакт" - "Још увек немате ниједан контакт" - "Додај контакт" "Додирните слику да бисте видели све бројеве или додирните и задржите да бисте им променили распоред" "Уклони" + "Изабери све" "Видео позив" "Пошаљи поруку" "Детаљи позива" @@ -215,11 +223,9 @@ "Блокирани бројеви" "%1$s је већ блокиран." "Налози за позивање" - "Укључи" "Подеси дозволе" "Да бисте омогућили брзо бирање, укључите дозволу за Контакте." "Да бисте видели евиденцију позива, укључите дозволу за Телефон." - "Да бисте видели контакте, укључите дозволу за Контакте." "Да бисте приступили говорној пошти, укључите дозволу за Телефон." "Да бисте претражили контакте, укључите дозволе за Контакте." "Да бисте упутили позив, укључите дозволу за Телефон." 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..e8446cab1 100644 --- a/java/com/android/dialer/app/res/values-sv/strings.xml +++ b/java/com/android/dialer/app/res/values-sv/strings.xml @@ -80,11 +80,16 @@ "Lägg till väntetid" "Inställningar" "Simulator" + "Skapa genväg till anv.gränssn." "Alla kontakter" "Använd tonvalstelefon" "Återvänd till pågående samtal" "Lägg t. samt." "Inkommande samtal" + "Öppnar läget för massåtgärd" + "Stängde läget för massåtgärd" + "Markerade %1$s" + "Avmarkerade %1$s" "Spela upp röstmeddelande" "Visa kontakten %1$s" "Ring %1$s" @@ -99,11 +104,15 @@ "Röstbrevlåda" "%s sekund" "%s min %s sek" - "röstbrevlåda" - "röstmeddelanden" - "Ja" - "Nej" + "Avbryt läget för massåtgärd" + "Radera" + "Avbryt" "Vill du radera markerade %1$s?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..142aaf0de 100644 --- a/java/com/android/dialer/app/res/values-sw/strings.xml +++ b/java/com/android/dialer/app/res/values-sw/strings.xml @@ -80,11 +80,16 @@ "Ongeza kusubiri" "Mipangilio" "Kielelezo" + "Unda Mkato Mpya wa Kiolesura" "Anwani zote" "Tumia kibao cha kuchapa cha sauti na kugusa" "Rudi kwa simu inayoendelea" "Ongeza simu" "Simu zinazoingia" + "Unaingia katika hali ya kutekeleza vitendo vingi" + "Umeondoka katika hali ya kutekeleza vitendo vingi" + "Umeteua %1$s" + "Umebatilisha uteuzi wa %1$s" "Sikiliza ujumbe wa sauti" "Angalia anwani %1$s" "Pigia %1$s" @@ -99,11 +104,15 @@ "Ujumbe wa sauti" "Sekunde %s" "Dak %s sek %s" - "ujumbe wa sauti" - "ujumbe wa sauti" - "Ndiyo" - "Hapana" + "Ghairi hali ya kutekeleza vitendo vingi" + "Futa" + "Ghairi" "Je, ungependa kufuta %1$s uliochagua?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "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" @@ -213,11 +220,9 @@ "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." 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..e270a3cee 100644 --- a/java/com/android/dialer/app/res/values-ta/strings.xml +++ b/java/com/android/dialer/app/res/values-ta/strings.xml @@ -80,11 +80,16 @@ "காத்திருப்பைச் சேர்" "அமைப்பு" "சிமுலேட்டர்" + "புதிய UI குறுக்குவழியை உருவாக்கு" "எல்லா தொடர்புகளும்" "டச் டோன் விசைப்பலகையைப் பயன்படுத்தவும்" "செயலிலுள்ள அழைப்பிற்குத் திரும்பு" "அழைப்பைச் சேர்" "உள்வரும் அழைப்புகள்" + "மொத்தச் செயல் பயன்முறையில் நுழைகிறீர்கள்" + "மொத்தச் செயல் பயன்முறையிலிருந்து வெளியேறிவிட்டீர்கள்" + "தேர்ந்தெடுத்த %1$s" + "தேர்வுநீக்கிய %1$s" "குரலஞ்சலை இயக்கு" "%1$s தொடர்பைக் காட்டு" "%1$s ஐ அழை" @@ -99,11 +104,15 @@ "குரலஞ்சல்" "%s வி" "%s நிமிடம் %s வினாடி" - "குரலஞ்சல்" - "குரலஞ்சல்கள்" - "ஆம்" - "வேண்டாம்" + "தொகுப்புச் செயல்கள் பயன்முறையை ரத்துசெய்யும்" + "நீக்கு" + "ரத்துசெய்" "தேர்ந்தெடுத்த %1$sஐ நீக்கவா?" + "%1$s தேர்ந்தெடுக்கப்பட்டன" + + ""இந்தக் குரலஞ்சல்களை நீக்கவா? "" + ""இந்தக் குரலஞ்சலை நீக்கவா? "" + @string/call_log_header_today "%1$s அன்று %2$s மணிக்கு" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "சிம் கார்டிலிருந்து ஏற்றுகிறது…" "சிம் கார்டின் தொடர்புகள்" - "தொடர்புகள் பயன்பாடு எதுவுமில்லை" "குரல் தேடல் இல்லை" "Phone பயன்பாடு முடக்கப்பட்டுள்ளதால், ஃபோன் அழைப்பைச் செய்ய முடியாது." "தொடர்புகளைத் தேடு" @@ -145,10 +153,9 @@ "%s புதிய தவறிய அழைப்புகள்" "இன்னும் விரைவு டயலில் யாரையும் சேர்க்கவில்லை" "முக்கியமானவர்களைச் சேர்" - "இதுவரை எந்தத் தொடர்புகளும் இல்லை" - "ஒரு தொடர்பைச் சேர்க்கவும்" "எல்லா எண்களையும் பார்க்க, படத்தைத் தொடவும் அல்லது மறுவரிசைப்படுத்த, தொட்டுப் பிடித்திருக்கவும்" "அகற்று" + "அனைத்தையும் தேர்ந்தெடு" "வீடியோ அழைப்பு" "செய்தி அனுப்பவும்" "அழைப்பு விவரங்கள்" @@ -213,11 +220,9 @@ "தடுக்கப்பட்ட எண்கள்" "%1$s ஏற்கனவே தடுக்கப்பட்டுள்ளது." "அழைப்பு கணக்குகள்" - "இயக்கு" "அனுமதிகளை அமை" "விரைவு டயலை இயக்க, தொடர்புகள் அனுமதியை இயக்கவும்." "அழைப்புப் பதிவைப் பார்க்க, ஃபோன் அனுமதியை இயக்கவும்." - "தொடர்புகளைப் பார்க்க, தொடர்புகள் அனுமதியை இயக்கவும்." "குரலஞ்சலை அணுக, ஃபோன் அனுமதியை இயக்கவும்." "தொடர்புகளைத் தேட, தொடர்புகள் அனுமதிகளை இயக்கவும்." "அழைக்க, ஃபோன் அனுமதியை இயக்கவும்." 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..8d2c66784 100644 --- a/java/com/android/dialer/app/res/values-te/strings.xml +++ b/java/com/android/dialer/app/res/values-te/strings.xml @@ -80,11 +80,16 @@ "నిరీక్షణ సమయాన్ని జోడించు" "సెట్టింగ్‌లు" "సిములేటర్" + "కొత్త UI సత్వరమార్గం సృష్టించు" "అన్ని పరిచయాలు" "టచ్ టోన్ కీప్యాడ్‌ను ఉపయోగించండి" "ప్రోగ్రెస్‌లో ఉన్న కాల్‌కు వెళ్లు" "కాల్‌ను జోడించు" "ఇన్‌కమింగ్ కాల్‌లు" + "బల్క్ చర్య మోడ్‌లోకి ప్రవేశిస్తున్నారు" + "బల్క్ చర్య మోడ్ నుండి నిష్క్రమించారు" + "%1$s ఎంచుకోబడింది" + "%1$s ఎంపిక తీసివేయబడింది" "వాయిస్ మెయిల్ ప్లే చేయండి" "%1$s పరిచయాన్ని వీక్షించండి" "%1$sకు కాల్ చేయి" @@ -99,11 +104,15 @@ "వాయిస్ మెయిల్" "%s సెక" "%s నిమి %s సెక" - "వాయిస్ మెయిల్" - "వాయిస్ మెయిల్‌లు" - "అవును" - "వద్దు" + "సమూహ చర్యల మోడ్‌ను రద్దు చేస్తుంది" + "తొలగించు" + "రద్దు చేయి" "ఎంచుకున్న %1$sను తొలగించాలా?" + "%1$s ఎంచుకోబడ్డాయి" + + ""ఈ వాయిస్ మెయిల్‌లను తొలగించాలా? "" + ""ఈ వాయిస్ మెయిల్‌ను తొలగించాలా? "" + @string/call_log_header_today "%1$s %2$sకి" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "సిమ్ కార్డు నుండి లోడ్ చేస్తోంది…" "సిమ్ కార్డు పరిచయాలు" - "పరిచయాల అనువర్తనం ఏదీ అందుబాటులో లేదు" "వాయిస్ శోధన అందుబాటులో లేదు" "ఫోన్ అనువర్తనం నిలిపివేయబడినందున ఫోన్ కాల్ చేయలేరు." "పరిచయాలను శోధించు" @@ -145,10 +153,9 @@ "%s కొత్త సమాధానం ఇవ్వని కాల్‌లు" "మీ స్పీడ్ డయల్‌లో ఇంకా ఎవరూ లేరు" "ఇష్టమైన వారిని జోడించండి" - "మీకు ఇప్పటికీ పరిచయాలేవీ లేవు" - "పరిచయాన్ని జోడించండి" "అన్ని నంబర్‌లను చూడటానికి చిత్రాన్ని తాకండి లేదా క్రమం మార్చడానికి తాకి, కాసేపు అలాగే ఉంచండి" "తీసివేయి" + "అన్నీ ఎంచుకోండి" "వీడియో కాల్" "సందేశాన్ని పంపు" "కాల్ వివరాలు" @@ -213,11 +220,9 @@ "బ్లాక్ చేయబడిన నంబర్‌లు" "%1$s ఇప్పటికే బ్లాక్ చేయబడింది." "కాల్ చేసే ఖాతాలు" - "ఆన్ చేయి" "అనుమతులను సెట్ చేయి" "స్పీడ్ డయల్‌ను ప్రారంభించడానికి, పరిచయాల అనుమతిని ఆన్ చేయండి." "మీ కాల్ లాగ్‌ను చూడటానికి, ఫోన్ అనుమతిని ఆన్ చేయండి." - "మీ పరిచయాలను చూడటానికి, పరిచయాల అనుమతిని ఆన్ చేయండి." "మీ వాయిస్ మెయిల్‌ను ప్రాప్యత చేయడానికి, ఫోన్ అనుమతిని ఆన్ చేయండి." "మీ పరిచయాలను శోధించడానికి, పరిచయాల అనుమతులను ఆన్ చేయండి." "కాల్ చేయడానికి, ఫోన్ అనుమతిని ఆన్ చేయండి." 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..76a66e20e 100644 --- a/java/com/android/dialer/app/res/values-th/strings.xml +++ b/java/com/android/dialer/app/res/values-th/strings.xml @@ -80,11 +80,16 @@ "เพิ่มการรอ" "การตั้งค่า" "เครื่องมือจำลอง" + "สร้างทางลัด UI ใหม่" "รายชื่อติดต่อทั้งหมด" "ใช้ปุ่มกดสัญญาณเสียง" "กลับไปคุยสายต่อ" "เพิ่มการโทร" "สายโทรเข้า" + "กำลังเข้าสู่โหมดการดำเนินการแบบกลุ่ม" + "ออกจากโหมดการทำงานแบบกลุ่มแล้ว" + "เลือก %1$s แล้ว" + "ยกเลิกการเลือก %1$s แล้ว" "เล่นข้อความเสียง" "ดูรายชื่อติดต่อ %1$s" "โทรหา %1$s" @@ -99,11 +104,15 @@ "ข้อความเสียง" "%s วินาที" "%s นาที %s วินาที" - "ข้อความเสียง" - "ข้อความเสียง" - "ใช่" - "ไม่" + "ยกเลิกโหมดการทำงานแบบกลุ่ม" + "ลบ" + "ยกเลิก" "ลบ%1$sที่เลือกหรือไม่" + "เลือกไว้ %1$s รายการ" + + ""ลบข้อความเสียงเหล่านี้ไหม "" + ""ลบข้อความเสียงนี้ไหม "" + @string/call_log_header_today "วันที่ %1$s เวลา %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "กำลังโหลดจากซิมการ์ด…" "รายชื่อบนซิมการ์ด" - "ไม่มีแอปรายชื่อติดต่อที่พร้อมใช้งาน" "การค้นหาด้วยเสียงไม่พร้อมใช้งาน" "ไม่สามารถโทรศัพท์ได้เนื่องจากแอปพลิเคชันโทรศัพท์ถูกปิดใช้งาน" "ค้นหารายชื่อติดต่อ" @@ -145,10 +153,9 @@ "สายที่ไม่ได้รับใหม่ %s สาย" "ยังไม่ได้กำหนดผู้ใดในการโทรด่วน" "เพิ่มรายการโปรด" - "คุณยังไม่มีรายชื่อติดต่อ" - "เพิ่มรายชื่อติดต่อ" "แตะรูปภาพเพื่อดูหมายเลขทั้งหมด หรือแตะค้างไว้เพื่อจัดเรียงใหม่" "ลบ" + "เลือกทั้งหมด" "แฮงเอาท์วิดีโอ" "ส่งข้อความ" "รายละเอียดการโทร" @@ -201,7 +208,7 @@ "ข้อความเสียง" "เลือกซิมสำหรับการตั้งค่าข้อความเสียง" "การบล็อกสายเรียกเข้าปิดชั่วคราว" - "ระบบปิดใช้การบล็อกสายเรียกเข้าเนื่องจากคุณติดต่อบริการฉุกเฉินจากโทรศัพท์เครื่องนี้ภายใน 48 ชั่วโมงที่ผ่านมา ระบบจะเปิดใช้คุณลักษณะนี้อีกครั้งโดยอัตโนมัติเมื่อครบ 48 ชั่วโมง" + "ระบบปิดใช้การบล็อกสายเรียกเข้าเนื่องจากคุณติดต่อบริการฉุกเฉินจากโทรศัพท์เครื่องนี้ภายใน 48 ชั่วโมงที่ผ่านมา ระบบจะเปิดใช้ฟีเจอร์นี้อีกครั้งโดยอัตโนมัติเมื่อครบ 48 ชั่วโมง" "นำเข้าหมายเลข" "ก่อนหน้านี้คุณได้ทำเครื่องหมายว่าให้ส่งผู้โทรบางคนไปยังข้อความเสียงโดยอัตโนมัติผ่านแอปอื่นๆ" "ดูหมายเลข" @@ -213,11 +220,9 @@ "หมายเลขที่ถูกบล็อก" "%1$s ถูกบล็อกอยู่แล้ว" "บัญชีการโทร" - "เปิด" "ตั้งค่าสิทธิ์" "หากต้องการเปิดใช้การโทรด่วน ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ" "หากต้องการดูประวัติการโทร ให้เปิดสิทธิ์เข้าถึงโทรศัพท์" - "หากต้องการดูรายชื่อติดต่อ ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ" "หากต้องการเข้าถึงข้อความเสียง ให้เปิดสิทธิ์เข้าถึงโทรศัพท์" "หากต้องการค้นหารายชื่อติดต่อ ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ" "หากต้องการโทรออก ให้เปิดสิทธิ์เข้าถึงโทรศัพท์" 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..51e7a6659 100644 --- a/java/com/android/dialer/app/res/values-tl/strings.xml +++ b/java/com/android/dialer/app/res/values-tl/strings.xml @@ -80,11 +80,16 @@ "Magdagdag ng paghihintay" "Mga Setting" "Simulator" + "Gawa ng Shortcut ng Bagong UI" "Lahat ng mga contact" "Gumamit ng touch tone na keypad" "Bumalik sa kasalukuyang tawag" "Mag-add: tawag" "Mga paparating na tawag" + "Pumapasok sa bulk action mode" + "Umalis sa bulk action mode" + "Napili %1$s" + "Inalis sa pagkakapili %1$s" "I-play ang voicemail" "Tingnan ang contact na si %1$s" "Tawagan si %1$s" @@ -99,11 +104,15 @@ "Voicemail" "%s sec" "%s min %s sec" - "voicemail" - "mga voicemail" - "Oo" - "Hindi" + "Kanselahin ang batch actions mode" + "I-delete" + "Kanselahin" "I-delete ang napiling %1$s?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..1ff0128d4 100644 --- a/java/com/android/dialer/app/res/values-tr/strings.xml +++ b/java/com/android/dialer/app/res/values-tr/strings.xml @@ -80,11 +80,16 @@ "Bekleme ekle" "Ayarlar" "Simülatör" + "Kull. Arayüzü Kısayolu Oluştur" "Tüm kişiler" "Telefon tuş takımını kullan" "Çağrıya dön" "Çağrı ekle" "Gelen çağrılar" + "Toplu işlem moduna giriliyor" + "Toplu işlem modundan çıkıldı" + "Seçildi: %1$s" + "Seçimi kaldırıldı: %1$s" "Sesli mesajı oynat" "Kişiyi görüntüle: %1$s" "Ara: %1$s" @@ -99,11 +104,15 @@ "Sesli Mesaj" "%s sn." "%s dk. %s sn." - "sesli mesaj" - "sesli mesajlar" - "Evet" - "Hayır" + "Toplu işlemler modu iptal edilir" + "Sil" + "İptal" "Seçili %1$s silinsin mi?" + "%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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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ı" @@ -213,11 +220,9 @@ "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." 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..b92970daa 100644 --- a/java/com/android/dialer/app/res/values-uk/strings.xml +++ b/java/com/android/dialer/app/res/values-uk/strings.xml @@ -82,11 +82,16 @@ "Додати паузу" "Налаштування" "Симулятор" + "Створити ярлик для нової дії" "Усі контакти" "Використовувати тональний набір" "Повернутися до поточного виклику" "Додати виклик" "Вхідні виклики" + "Перехід у режим масових дій" + "Ви вийшли з режиму масових дій" + "Вибрано користувача %1$s" + "Скасовано вибір користувача %1$s" "Відтворити голосову пошту" "Переглянути контакт %1$s" "Набрати %1$s" @@ -101,11 +106,17 @@ "Голосова пошта" "%s с" "%s хв %s с" - "голосова пошта" - "голосова пошта" - "Так" - "Ні" + "Скасувати режим масових дій" + "Видалити" + "Скасувати" "Видалити вибране (%1$s)?" + "Вибрано %1$s" + + ""Видалити ці повідомлення голосової пошти? "" + ""Видалити ці повідомлення голосової пошти? "" + ""Видалити ці повідомлення голосової пошти? "" + ""Видалити ці повідомлення голосової пошти? "" + @string/call_log_header_today "%1$s о %2$s" "%1$02d:%2$02d" @@ -118,7 +129,6 @@ "MEID" "Завантаж. із SIM-карти…" "Контакти SIM-карти" - "Немає додатка з контактами" "Голосовий пошук недоступний" "Не вдається здійснити дзвінок, оскільки додаток Телефон вимкнено." "Пошук контактів" @@ -147,10 +157,9 @@ "Нових пропущених дзвінків: %s" "Немає номерів для швидкого набору" "Додати номер" - "Ще немає контактів" - "Додати контакт" "Торкніться зображення, щоб побачити всі номери, або натисніть і утримуйте, щоб змінити порядок." "Видалити" + "Вибрати все" "Відеодзвінок" "Надіслати повідомлення" "Деталі виклику" @@ -217,11 +226,9 @@ "Заблоковані номери" "Номер %1$s уже заблоковано." "Обл. записи для дзвінків" - "Увімкнути" "Налаштувати дозволи" "Щоб активувати швидкий набір, увімкніть дозвіл \"Контакти\"." "Щоб переглянути журнал викликів, увімкніть дозвіл \"Телефон\"." - "Щоб переглянути контакти, увімкніть дозвіл \"Контакти\"." "Щоб користуватися голосовою поштою, увімкніть дозвіл \"Телефон\"." "Щоб шукати контакти, увімкніть дозвіл \"Контакти\"." "Щоб зателефонувати, увімкніть дозвіл \"Телефон\"." 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..cb2eb9e33 100644 --- a/java/com/android/dialer/app/res/values-ur/strings.xml +++ b/java/com/android/dialer/app/res/values-ur/strings.xml @@ -80,11 +80,16 @@ "انتظار شامل کریں" "ترتیبات" "Simulator" + "‏نیا UI شارٹ کٹ تخلیق کریں" "سبھی رابطے" "ٹچ ٹون کی پیڈ کا استعمال کریں" "جاری کال پر واپس لوٹیں" "کال شامل کریں" "آنے والی کالیں" + "بلک کاروائی موڈ میں داخل ہو رہا ہے" + "بلک کاروائی موڈ چھوڑ دیا" + "منتخب کردہ %1$s" + "غیر منتخب کردہ %1$s" "صوتی میل چلائیں" "رابطہ %1$s دیکھیں" "%1$s کو کال کریں" @@ -99,11 +104,15 @@ "صوتی میل" "%s سیکنڈ" "%s منٹ %s سیکنڈ" - "صوتی میل" - "صوتی میلز" - "ہاں" - "نہیں" + "بیچ کاروائی موڈ منسوخ کریں" + "حذف کریں" + "منسوخ کریں" "منتخب کردہ %1$s حذف کریں؟" + "%1$s منتخب کردہ" + + ""ان صوتی میلز کو حذف کریں؟ "" + ""اس صوتی میل کو حذف کریں؟ "" + @string/call_log_header_today "%1$s بوقت %2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "‏SIM کارڈ سے لوڈ ہو رہا ہے…" "‏SIM کارڈ کے رابطے" - "رابطوں کی کوئی ایپ دستیاب نہیں ہے" "صوتی تلاش دستیاب نہیں ہے" "فون کال نہیں کی جا سکتی ہے کیونکہ فون ایپلیکیشن کو غیر فعال کر دیا گیا ہے۔" "رابطے تلاش کریں" @@ -145,10 +153,9 @@ "%s نئی چھوٹی ہوئی کالیں" "آپ کے اسپیڈ ڈائل پر ابھی تک کوئی نہیں ہے" "ایک پسندیدہ شامل کریں" - "آپ کے پاس ابھی تک کوئی رابطے نہیں ہیں" - "ایک رابطہ شامل کریں" "سبھی نمبرز دیکھنے کیلئے تصویر ٹچ کریں یا دوبارہ ترتیب دینے کیلئے ٹچ کریں اور پکڑے رہیں" "ہٹائیں" + "سبھی کو منتخب کریں" "ویڈیو کال" "پیغام بھیجیں" "کال کی تفصیلات" @@ -213,11 +220,9 @@ "مسدود کردہ نمبرز" "%1$s پہلے ہی مسدود ہے۔" "کالنگ اکاؤنٹس" - "آن کریں" "اجازتیں طے کریں" "اسپیڈ ڈائل کو فعال کرنے کیلئے رابطوں کی اجازت آن کریں۔" "اپنا کال لاگ دیکھنے کیلئے فون کی اجازت آن کریں۔" - "اپنے رابطے دیکھنے کیلئے رابطوں کی اجازت آن کریں۔" "اپنی صوتی میل تک رسائی کیلئے فون کی اجازت آن کریں۔" "اپنے رابطوں کو تلاش کرنے کیلئے رابطوں کی اجازتیں آن کریں۔" "کال کرنے کیلئے فون کی اجازت آن کریں۔" 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..c7d08f3bf 100644 --- a/java/com/android/dialer/app/res/values-uz/strings.xml +++ b/java/com/android/dialer/app/res/values-uz/strings.xml @@ -80,11 +80,16 @@ "Kutishni qo‘shish" "Sozlamalar" "Simulyator" + "Yangi interfeys uchun yorliq" "Barcha kontaktlar" "Tovushli raqam tergich" "Amaldagi chaqiruvga qaytish" "Chaqiruv qo‘shish" "Kiruvchi qo‘ng‘iroqlar" + "Yoppasiga bajariladigan amallar rejimiga o‘tilmoqda" + "Yoppasiga bajariladigan amallar rejimidan chiqib ketildi" + "%1$s tanlandi" + "%1$s tanlovi bekor qilindi" "Ovozli xabarni eshitish" "%1$s kontaktini ko‘rish" "Qo‘ng‘iroq: %1$s" @@ -99,11 +104,15 @@ "Ovozli pochta" "%s soniya" "%s daq %s son" - "ovozli xabar" - "ovozli xabarlar" - "Ha" - "Yo‘q" + "Yoppasiga bajariladigan amallar rejimini bekor qilish" + "O‘chirish" + "Bekor qilish" "Tanlangan %1$s o‘chirib tashlansinmi?" + "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" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..c79e1ed20 100644 --- a/java/com/android/dialer/app/res/values-vi/strings.xml +++ b/java/com/android/dialer/app/res/values-vi/strings.xml @@ -80,11 +80,16 @@ "Thêm chờ" "Cài đặt" "Trình mô phỏng" + "Tạo phím tắt giao diện người dùng mới" "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" + "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" "Phát thư thoại" "Xem thông tin liên hệ của %1$s" "Gọi %1$s" @@ -99,11 +104,15 @@ "Thư thoại" "%s giây" "%s phút %s giây" - "thư thoại" - "thư thoại" - "Có" - "Không" + "Hủy chế độ tác vụ hàng loạt" + "Xóa" + "Hủy" "Xóa %1$s đã chọn?" + "Đã 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" @@ -116,7 +125,6 @@ "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ạ" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." 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..3262c1a02 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 @@ -80,11 +80,16 @@ "延长等待时间" "设置" "模拟器" + "创建可在新界面中使用的快捷键" "所有联系人" "使用按键式键盘" "返回正在进行的通话" "添加通话" "来电" + "正在进入批量操作模式" + "已退出批量操作模式" + "已选择 %1$s" + "已取消选择 %1$s" "播放语音邮件" "查看联系人%1$s" "呼叫%1$s" @@ -99,11 +104,15 @@ "语音信箱" "%s 秒" "%s 分钟 %s 秒" - "语音邮件" - "语音邮件" - "是" - "否" + "取消批量操作模式" + "删除" + "取消" "要删除所选的%1$s吗?" + "已选择 %1$s 封" + + ""要删除这些语音邮件吗?"" + ""要删除这封语音邮件吗?"" + @string/call_log_header_today "%1$s%2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "正从 SIM 卡中加载..." "SIM卡联系人" - "没有可用的通讯录应用" "无法使用语音搜索" "“电话”应用已被停用,因此无法拨打电话。" "搜索联系人" @@ -145,10 +153,9 @@ "%s个新的未接电话" "尚未给任何联系人设定快速拨号" "添加常用联系人" - "您还没有任何联系人" - "添加联系人" "触摸图片可查看所有号码,触摸并按住可重新排序" "移除" + "全选" "视频通话" "发送短信" "通话详情" @@ -213,11 +220,9 @@ "已屏蔽的号码" "%1$s 已被屏蔽。" "通话帐号" - "开启" "设置权限" "要启用快速拨号功能,请开启“通讯录”权限。" "要查看您的通话记录,请开启“电话”权限。" - "要查看您的联系人,请开启“通讯录”权限。" "要使用您的语音信箱,请开启“电话”权限。" "要搜索您的联系人,请开启“通讯录”权限。" "要拨打电话,请开启“电话”权限。" 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..71e62eddc 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 @@ -80,11 +80,16 @@ "新增插播功能" "設定" "模擬器" + "建立新使用者介面捷徑" "所有聯絡人" "使用觸控音頻按鍵" "返回進行中的通話" "新增通話" "來電" + "正在進入大量操作模式" + "已離開大量操作模式" + "已選取%1$s" + "已取消選取%1$s" "播放語音留言" "查看聯絡人%1$s" "打電話給%1$s" @@ -99,11 +104,15 @@ "留言" "%s 秒" "%s%s 秒" - "留言" - "留言" - "是" - "否" + "取消批量操作模式" + "刪除" + "取消" "要刪除所選的%1$s嗎?" + "已選取 %1$s 個" + + ""要刪除這些留言嗎?"" + ""要刪除此留言嗎?"" + @string/call_log_header_today "%1$s%2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "正在從 SIM 卡載入..." "SIM 卡聯絡人" - "沒有可用的聯絡人應用程式" "無法使用語音搜尋" "由於「電話」應用程式已停用,因此無法打電話。" "搜尋聯絡人" @@ -145,10 +153,9 @@ "%s 個新的未接來電" "快速撥號名單中沒有聯絡人" "新增常用聯絡人" - "暫時沒有聯絡人" - "新增聯絡人" "輕觸圖片以查看所有電話號碼,或輕觸並按住圖片以重新排序" "移除" + "全選" "視像通話" "傳送訊息" "通話詳情" @@ -213,11 +220,9 @@ "已封鎖的號碼" "已封鎖 %1$s。" "通話帳戶" - "開放權限" "設定權限" "如要啟用快速撥號功能,請開放「通訊錄」權限。" "如要查看通話記錄,請開放「手機」權限。" - "如要查看聯絡人,請開放「通訊錄」權限。" "如要存取留言信箱,請開放「手機」權限。" "如要搜尋聯絡人,請開啟「通訊錄」權限。" "如要撥打電話,請開放「手機」權限。" 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..9178dcf67 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 @@ -80,11 +80,16 @@ "延長等待時間" "設定" "模擬工具" + "建立新版 UI 捷徑" "所有聯絡人" "使用觸控音按鍵" "返回進行中的通話" "新增通話" "來電" + "已進入大量操作模式" + "已離開大量操作模式" + "已選取:%1$s" + "已取消選取:%1$s" "播放語音留言" "查看聯絡人%1$s" "撥電話給%1$s" @@ -99,11 +104,15 @@ "語音留言" "%s 秒" "%s%s 秒" - "語音留言" - "語音留言" - "是" - "否" + "取消批次操作模式" + "刪除" + "取消" "要刪除選取的%1$s嗎?" + "已選取 %1$s 個" + + ""要刪除這些語音留言嗎?"" + ""要刪除這則語音留言嗎?"" + @string/call_log_header_today "%1$s%2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "MEID" "從 SIM 卡讀取中…" "SIM 卡聯絡人" - "沒有可用的聯絡人應用程式" "無法使用語音搜尋" "「電話」應用程式已遭停用,因此無法撥打電話。" "搜尋聯絡人" @@ -145,10 +153,9 @@ "%s 通新的未接來電" "您的快速撥號功能尚未設定任何聯絡人" "新增常用聯絡人" - "您尚未加入任何聯絡人" - "新增聯絡人" "輕觸圖片即可查看所有號碼,按住則可重新排序" "移除" + "全選" "視訊通話" "傳送簡訊" "通話詳細資料" @@ -213,11 +220,9 @@ "已封鎖的號碼" "%1$s 已在封鎖清單中。" "通話帳戶" - "開啟" "設定權限" "如要啟用快速撥號,請開啟「聯絡人」存取權限。" "如要查看您的通話紀錄,請開啟「電話」存取權限。" - "如要查看您的聯絡人,請開啟「聯絡人」存取權限。" "如要存取您的語音信箱,請開啟「電話」存取權限。" "如要搜尋您的聯絡人,請開啟「聯絡人」存取權限。" "如要撥打電話,請開啟「電話」存取權限。" 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..f52f597c8 100644 --- a/java/com/android/dialer/app/res/values-zu/strings.xml +++ b/java/com/android/dialer/app/res/values-zu/strings.xml @@ -80,11 +80,16 @@ "Yengeza ukulinda" "Izilungiselelo" "Isilingisi" + "Dala isinqamuleli esisha se-UI" "Bonke othintana nabo" "Sebenzisa ikhiphedi yethoni yokuthinta" "Buyela kukholi eqhubekayo" "Yengeza ikholi" "Amakholi angenayo" + "Kungenwa kumodi yesenzo senqwaba" + "Ishiye imodi yesenzo senqwaba" + "Kukhethwe i-%1$s" + "Akukhethiwe i-%1$s" "Dlala i-imeyli yezwi" "Bheka oxhumana naye %1$s" "Shayela %1$s" @@ -99,11 +104,15 @@ "Ivoyisimeyili" "%s isekhondi" "%s amaminithi %s amasekhondi" - "ivoyisimeyili" - "ama-meyli ezwi" - "Yebo" - "Cha" + "Khansela imodi lezenzo zeqoqo" + "Susa" + "Khansela" "Susa okukhethiwe %1$s?" + "Engu-%1$s ekhethiwe" + + ""Sula lawa mavoyisimeyili? "" + ""Sula lawa mavoyisimeyili? "" + @string/call_log_header_today "%1$s ngo-%2$s" "%1$02d:%2$02d" @@ -116,7 +125,6 @@ "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" @@ -145,10 +153,9 @@ "%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" @@ -213,11 +220,9 @@ "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." diff --git a/java/com/android/dialer/app/res/values/colors.xml b/java/com/android/dialer/app/res/values/colors.xml index cf6b926be..2f6d87b49 100644 --- a/java/com/android/dialer/app/res/values/colors.xml +++ b/java/com/android/dialer/app/res/values/colors.xml @@ -52,8 +52,6 @@ @color/dialer_theme_color - - #fafafa #f9f9f9 @color/background_dialer_light @@ -69,8 +67,6 @@ #4d4d4d - #b2b2b2 - #ffffff diff --git a/java/com/android/dialer/app/res/values/dimens.xml b/java/com/android/dialer/app/res/values/dimens.xml index 7da29c7a3..90a8bb879 100644 --- a/java/com/android/dialer/app/res/values/dimens.xml +++ b/java/com/android/dialer/app/res/values/dimens.xml @@ -24,6 +24,11 @@ --> 16dp + + 14sp + 16dp + 18dp + 8dp 32dp @@ -105,9 +110,6 @@ 10dp - 20dp - 16sp - 16dp 16dp diff --git a/java/com/android/dialer/app/res/values/strings.xml b/java/com/android/dialer/app/res/values/strings.xml index 9e1fdeb5a..e02c6fb30 100644 --- a/java/com/android/dialer/app/res/values/strings.xml +++ b/java/com/android/dialer/app/res/values/strings.xml @@ -114,7 +114,7 @@ Voicemail - + %1$d Voicemails @@ -131,12 +131,12 @@ [CHAR LIMIT=10] --> - %1$s, + %1$s, %2$s - New voicemail from + New voicemail from %1$s @@ -165,7 +165,7 @@ Missed calls only - (%1$d) + (%1$d) %2$s @@ -258,6 +258,9 @@ and testing. [CHAR LIMIT=30]--> Simulator + + Create New UI Shortcut + All contacts @@ -279,6 +282,34 @@ Incoming calls + + Entering bulk action mode + + + Left bulk action mode + + + Selected %1$s + + + Unselected %1$s + %s min %s sec - voicemail - voicemails - Yes - No + + Cancel batch actions mode + + Delete + Cancel Delete selected %1$s? + %1$s selected + + + + Delete this voicemail? + Delete these voicemails? + + @@ -411,9 +453,6 @@ SIM card contacts - - No contacts app available - Voice search not available @@ -484,7 +523,7 @@ Undo - Call + Call %s @@ -514,12 +553,6 @@ Add a favorite - - You don\'t have any contacts yet - - - Add a contact - Remove + + Select all + @@ -550,13 +586,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 +636,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,21 +645,21 @@ 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 @@ -631,7 +667,7 @@ - + Delete voicemail from ^1 @@ -645,14 +681,14 @@ - + Create contact for ^1 - + Add ^1 to existing contact @@ -660,7 +696,7 @@ 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 @@ -769,14 +805,14 @@ - + 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 +825,7 @@ - + You previously marked some callers to be automatically sent to voicemail via other apps. @@ -811,13 +847,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 +862,7 @@ - %1$s + %1$s is already blocked. @@ -841,9 +877,6 @@ button_dtmf_settings - - Turn on - Set permissions @@ -853,9 +886,6 @@ 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. diff --git a/java/com/android/dialer/app/res/values/styles.xml b/java/com/android/dialer/app/res/values/styles.xml index 7adf7ca2c..e0122e81c 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 @@ --> + + + + - - - - - + + + diff --git a/java/com/android/dialer/multimedia/MultimediaData.java b/java/com/android/dialer/multimedia/MultimediaData.java index 22bb7641c..dee0cff0b 100644 --- a/java/com/android/dialer/multimedia/MultimediaData.java +++ b/java/com/android/dialer/multimedia/MultimediaData.java @@ -20,6 +20,7 @@ import android.location.Location; import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.text.TextUtils; import com.android.dialer.common.LogUtil; import com.google.auto.value.AutoValue; @@ -63,6 +64,11 @@ public abstract class MultimediaData { /** Returns {@code true} if this data is marked as important. */ public abstract boolean isImportant(); + /** Returns true if this has image, text or location data. */ + public boolean hasData() { + return hasImageData() || !TextUtils.isEmpty(getText()) || getLocation() != null; + } + /** Returns the string form of this MultimediaData with no PII. */ @Override public String toString() { diff --git a/java/com/android/dialer/notification/AndroidManifest.xml b/java/com/android/dialer/notification/AndroidManifest.xml index 741f481ca..b89d8f816 100644 --- a/java/com/android/dialer/notification/AndroidManifest.xml +++ b/java/com/android/dialer/notification/AndroidManifest.xml @@ -1,3 +1,4 @@ + - - - - - - - - - - - - diff --git a/java/com/android/dialer/notification/GroupedNotificationUtil.java b/java/com/android/dialer/notification/GroupedNotificationUtil.java deleted file mode 100644 index 3925248d5..000000000 --- a/java/com/android/dialer/notification/GroupedNotificationUtil.java +++ /dev/null @@ -1,66 +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.notification; - -import android.app.NotificationManager; -import android.service.notification.StatusBarNotification; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import java.util.Objects; - -/** Utilities for dealing with grouped notifications */ -public final class GroupedNotificationUtil { - - /** - * Remove notification(s) that were added as part of a group. Will ensure that if this is the last - * notification in the group the summary will be removed. - * - * @param tag String tag as included in {@link NotificationManager#notify(String, int, - * android.app.Notification)}. If null will remove all notifications under id - * @param id notification id as included with {@link NotificationManager#notify(String, int, - * android.app.Notification)}. - * @param summaryTag String tag of the summary notification - */ - public static void removeNotification( - @NonNull NotificationManager notificationManager, - @Nullable String tag, - int id, - @NonNull String summaryTag) { - if (tag == null) { - // Clear all grouped notifications - for (StatusBarNotification notification : notificationManager.getActiveNotifications()) { - if (notification.getId() == id) { - notificationManager.cancel(notification.getTag(), id); - } - } - } else { - notificationManager.cancel(tag, id); - - // See if other non-summary grouped notifications exist, and if not then clear the summary - boolean clearSummary = true; - for (StatusBarNotification notification : notificationManager.getActiveNotifications()) { - if (notification.getId() == id && !Objects.equals(summaryTag, notification.getTag())) { - clearSummary = false; - break; - } - } - if (clearSummary) { - notificationManager.cancel(summaryTag, id); - } - } - } -} diff --git a/java/com/android/dialer/notification/NotificationChannelId.java b/java/com/android/dialer/notification/NotificationChannelId.java new file mode 100644 index 000000000..4ab3d44f2 --- /dev/null +++ b/java/com/android/dialer/notification/NotificationChannelId.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.notification; + +import android.support.annotation.StringDef; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** Centralized source of all notification channels used by Dialer. */ +@Retention(RetentionPolicy.SOURCE) +@StringDef({ + NotificationChannelId.INCOMING_CALL, + NotificationChannelId.ONGOING_CALL, + NotificationChannelId.MISSED_CALL, + NotificationChannelId.DEFAULT, +}) +public @interface NotificationChannelId { + // This value is white listed in the system. + // See /vendor/google/nexus_overlay/common/frameworks/base/core/res/res/values/config.xml + String INCOMING_CALL = "phone_incoming_call"; + + String ONGOING_CALL = "phone_ongoing_call"; + + String MISSED_CALL = "phone_missed_call"; + + String DEFAULT = "phone_default"; +} diff --git a/java/com/android/dialer/notification/NotificationChannelManager.java b/java/com/android/dialer/notification/NotificationChannelManager.java index 88679066d..790aac36f 100644 --- a/java/com/android/dialer/notification/NotificationChannelManager.java +++ b/java/com/android/dialer/notification/NotificationChannelManager.java @@ -17,366 +17,156 @@ package com.android.dialer.notification; import android.annotation.TargetApi; -import android.app.Notification; import android.app.NotificationChannel; -import android.app.NotificationChannelGroup; import android.app.NotificationManager; import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; import android.media.AudioAttributes; -import android.net.Uri; import android.os.Build.VERSION_CODES; -import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.annotation.RequiresApi; -import android.support.annotation.StringDef; import android.support.v4.os.BuildCompat; -import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; -import android.telecom.TelecomManager; -import android.telephony.TelephonyManager; -import com.android.contacts.common.compat.TelephonyManagerCompat; -import com.android.dialer.buildtype.BuildType; +import android.util.ArraySet; +import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; -import com.android.dialer.common.concurrent.DialerExecutors; -import com.android.dialer.telecom.TelecomUtil; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.List; -import java.util.Objects; +import java.util.Set; -/** Contains info on how to create {@link NotificationChannel NotificationChannels} */ -public class NotificationChannelManager { - - private static final String PREFS_FILENAME = "NotificationChannelManager"; - private static final String PREF_NEED_FIRST_INIT = "needFirstInit"; - private static NotificationChannelManager instance; - - public static NotificationChannelManager getInstance() { - if (instance == null) { - instance = new NotificationChannelManager(); - } - return instance; - } +/** Creates all notification channels for Dialer. */ +@TargetApi(VERSION_CODES.O) +public final class NotificationChannelManager { /** - * Set the channel of notification appropriately. Will create the channel if it does not already - * exist. Safe to call pre-O (will no-op). + * Creates all the notification channels Dialer will need. This method is called at app startup + * and must be fast. Currently it takes between 3 to 7 milliseconds on a Pixel XL. + * + *

An alternative approach would be to lazily create channels when we actualy post a + * notification. The advatange to precreating channels is that: * - *

phoneAccount should only be null if channelName is {@link Channel#DEFAULT} or {@link - * Channel#MISSED_CALL} since these do not have account-specific settings. + *

    + *
  • channels will be available to user right away. For example, users can customize voicemail + * sounds when they first get their device without waiting for a voicemail to arrive first. + *
  • code that posts a notification can be simpler + *
  • channel management code is simpler and it's easier to ensure that the correct set of + * channels are visible. + *
      */ - @TargetApi(26) - public static void applyChannel( - @NonNull Notification.Builder notification, - @NonNull Context context, - @Channel String channelName, - @Nullable PhoneAccountHandle phoneAccount) { - checkNullity(channelName, phoneAccount); - - if (BuildCompat.isAtLeastO()) { - NotificationChannel channel = - NotificationChannelManager.getInstance().getChannel(context, channelName, phoneAccount); - notification.setChannelId(channel.getId()); - } - } - - private static void checkNullity( - @Channel String channelName, @Nullable PhoneAccountHandle phoneAccount) { - if (phoneAccount != null || channelAllowsNullPhoneAccountHandle(channelName)) { - return; - } - - // TODO (b/36568553): don't throw an exception once most cases have been identified - IllegalArgumentException exception = - new IllegalArgumentException( - "Phone account handle must not be null on channel " + channelName); - if (BuildType.get() == BuildType.RELEASE) { - LogUtil.e("NotificationChannelManager.applyChannel", null, exception); - } else { - throw exception; - } - } - - private static boolean channelAllowsNullPhoneAccountHandle(@Channel String channelName) { - switch (channelName) { - case Channel.DEFAULT: - case Channel.MISSED_CALL: - return true; - default: - return false; - } - } + public static void initChannels(@NonNull Context context) { + Assert.checkArgument(BuildCompat.isAtLeastO()); + Assert.isNotNull(context); - /** The base Channel IDs for {@link NotificationChannel} */ - @Retention(RetentionPolicy.SOURCE) - @StringDef({ - Channel.INCOMING_CALL, - Channel.ONGOING_CALL, - Channel.ONGOING_CALL_OLD, - Channel.MISSED_CALL, - Channel.VOICEMAIL, - Channel.EXTERNAL_CALL, - Channel.DEFAULT - }) - public @interface Channel { - @Deprecated String ONGOING_CALL_OLD = "ongoingCall"; - String INCOMING_CALL = "incomingCall"; - String ONGOING_CALL = "ongoingCall2"; - String MISSED_CALL = "missedCall"; - String VOICEMAIL = "voicemail"; - String EXTERNAL_CALL = "externalCall"; - String DEFAULT = "default"; - } - - @Channel - private static final String[] prepopulatedAccountChannels = - new String[] {Channel.INCOMING_CALL, Channel.ONGOING_CALL, Channel.VOICEMAIL}; - - @Channel - private static final String[] prepopulatedGlobalChannels = - new String[] {Channel.MISSED_CALL, Channel.DEFAULT}; - - private NotificationChannelManager() {} - - public void firstInitIfNeeded(@NonNull Context context) { - if (BuildCompat.isAtLeastO()) { - DialerExecutors.createNonUiTaskBuilder(this::firstInitIfNeededSync) - .build() - .executeSerial(context); - } - } - - private boolean firstInitIfNeededSync(@NonNull Context context) { - if (needsFirstInit(context)) { - initChannels(context); - return true; - } - return false; - } - - public boolean needsFirstInit(@NonNull Context context) { - return (BuildCompat.isAtLeastO() - && getSharedPreferences(context).getBoolean(PREF_NEED_FIRST_INIT, true)); - } - - @RequiresApi(VERSION_CODES.N) - private SharedPreferences getSharedPreferences(@NonNull Context context) { - // Use device protected storage since in some cases this will need to be accessed while device - // is locked - context = context.createDeviceProtectedStorageContext(); - return context.getSharedPreferences(PREFS_FILENAME, Context.MODE_PRIVATE); - } - - @RequiresApi(26) - public Intent getSettingsIntentForChannel( - @NonNull Context context, @Channel String channelName, PhoneAccountHandle accountHandle) { - checkNullity(channelName, accountHandle); - Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); - intent.putExtra( - Settings.EXTRA_CHANNEL_ID, getChannel(context, channelName, accountHandle).getId()); - intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); - return intent; - } + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + Set desiredChannelIds = getAllDesiredChannelIds(context); + Set existingChannelIds = getAllExistingChannelIds(context); - @TargetApi(26) - @SuppressWarnings("AndroidApiChecker") - public void initChannels(@NonNull Context context) { - if (!BuildCompat.isAtLeastO()) { + if (desiredChannelIds.equals(existingChannelIds)) { return; } - LogUtil.enterBlock("NotificationChannelManager.initChannels"); - List phoneAccounts = TelecomUtil.getCallCapablePhoneAccounts(context); - - // Remove notification channels for PhoneAccounts that don't exist anymore - NotificationManager notificationManager = context.getSystemService(NotificationManager.class); - List notificationChannelGroups = - notificationManager.getNotificationChannelGroups(); - notificationChannelGroups - .stream() - .filter(group -> !idExists(group.getId(), phoneAccounts)) - .forEach(group -> deleteGroup(notificationManager, group)); - - for (PhoneAccountHandle phoneAccountHandle : phoneAccounts) { - for (@Channel String channel : prepopulatedAccountChannels) { - getChannel(context, channel, phoneAccountHandle); + LogUtil.i( + "NotificationChannelManager.initChannels", + "doing an expensive initialization of all notification channels"); + LogUtil.i( + "NotificationChannelManager.initChannels", "desired channel IDs: " + desiredChannelIds); + LogUtil.i( + "NotificationChannelManager.initChannels", "existing channel IDs: " + existingChannelIds); + + // Delete any old channels that we don't use any more. This is safe because if we're recreate + // this later then any user settings will be restored. An example is SIM specific voicemail + // channel that gets deleted when the user removes the SIM and is then restored when the user + // re-inserts the SIM. + for (String existingChannelId : existingChannelIds) { + if (!desiredChannelIds.contains(existingChannelId)) { + notificationManager.deleteNotificationChannel(existingChannelId); } } - for (@Channel String channel : prepopulatedGlobalChannels) { - getChannel(context, channel, null); - } - getSharedPreferences(context).edit().putBoolean(PREF_NEED_FIRST_INIT, false).apply(); - } - - @TargetApi(26) - private void deleteGroup( - @NonNull NotificationManager notificationManager, @NonNull NotificationChannelGroup group) { - for (NotificationChannel channel : group.getChannels()) { - notificationManager.deleteNotificationChannel(channel.getId()); - } - notificationManager.deleteNotificationChannelGroup(group.getId()); - } - - private boolean idExists(String id, List phoneAccountHandles) { - for (PhoneAccountHandle handle : phoneAccountHandles) { - if (Objects.equals(handle.getId(), id)) { - return true; - } - } - return false; + // Just recreate all desired channels. We won't do this often so it's ok to do this now. + createIncomingCallChannel(context); + createOngoingCallChannel(context); + createMissedCallChannel(context); + createDefaultChannel(context); + VoicemailChannelUtils.createAllChannels(context); } @NonNull - @RequiresApi(26) - private NotificationChannel getChannel( - @NonNull Context context, - @Channel String channelName, - @Nullable PhoneAccountHandle phoneAccount) { - String channelId = channelNameToId(channelName, phoneAccount); - NotificationChannel channel = getNotificationManager(context).getNotificationChannel(channelId); - if (channel == null) { - channel = createChannel(context, channelName, phoneAccount); - } - return channel; + public static String getVoicemailChannelId( + @NonNull Context context, @Nullable PhoneAccountHandle handle) { + Assert.checkArgument(BuildCompat.isAtLeastO()); + Assert.isNotNull(context); + return VoicemailChannelUtils.getChannelId(context, handle); } - private static String channelNameToId( - @Channel String name, @Nullable PhoneAccountHandle phoneAccountHandle) { - if (phoneAccountHandle == null) { - return name; - } else { - return name + ":" + phoneAccountHandle.getId(); - } - } - - @RequiresApi(26) - private NotificationChannel createChannel( - Context context, - @Channel String channelName, - @Nullable PhoneAccountHandle phoneAccountHandle) { - String channelId = channelNameToId(channelName, phoneAccountHandle); - - if (phoneAccountHandle != null) { - PhoneAccount account = getTelecomManager(context).getPhoneAccount(phoneAccountHandle); - NotificationChannelGroup group = - new NotificationChannelGroup( - phoneAccountHandle.getId(), - (account == null) ? phoneAccountHandle.getId() : account.getLabel().toString()); - getNotificationManager(context) - .createNotificationChannelGroup(group); // No-op if already exists - } else if (!channelAllowsNullPhoneAccountHandle(channelName)) { - LogUtil.w( - "NotificationChannelManager.createChannel", - "Null PhoneAccountHandle with channel " + channelName); - } - - Uri silentRingtone = Uri.EMPTY; - - CharSequence name; - int importance; - boolean canShowBadge; - boolean lights; - boolean vibration; - Uri sound; - switch (channelName) { - case Channel.INCOMING_CALL: - name = context.getText(R.string.notification_channel_incoming_call); - importance = NotificationManager.IMPORTANCE_MAX; - canShowBadge = false; - lights = true; - vibration = false; - sound = silentRingtone; - break; - case Channel.MISSED_CALL: - name = context.getText(R.string.notification_channel_missed_call); - importance = NotificationManager.IMPORTANCE_DEFAULT; - canShowBadge = true; - lights = true; - vibration = true; - sound = silentRingtone; - break; - case Channel.ONGOING_CALL: - name = context.getText(R.string.notification_channel_ongoing_call); - importance = NotificationManager.IMPORTANCE_DEFAULT; - canShowBadge = false; - lights = false; - vibration = false; - sound = silentRingtone; - deleteOldOngoingCallChannelIfNeeded(context, phoneAccountHandle); - break; - case Channel.VOICEMAIL: - name = context.getText(R.string.notification_channel_voicemail); - importance = NotificationManager.IMPORTANCE_DEFAULT; - canShowBadge = true; - lights = true; - vibration = - TelephonyManagerCompat.isVoicemailVibrationEnabled( - getTelephonyManager(context), phoneAccountHandle); - sound = - TelephonyManagerCompat.getVoicemailRingtoneUri( - getTelephonyManager(context), phoneAccountHandle); - break; - case Channel.EXTERNAL_CALL: - name = context.getText(R.string.notification_channel_external_call); - importance = NotificationManager.IMPORTANCE_HIGH; - canShowBadge = false; - lights = true; - vibration = true; - sound = null; - break; - case Channel.DEFAULT: - name = context.getText(R.string.notification_channel_misc); - importance = NotificationManager.IMPORTANCE_DEFAULT; - canShowBadge = false; - lights = true; - vibration = true; - sound = null; - break; - default: - throw new IllegalArgumentException("Unknown channel: " + channelName); - } - - NotificationChannel channel = new NotificationChannel(channelId, name, importance); - channel.setShowBadge(canShowBadge); - if (sound != null) { - // silentRingtone acts as a sentinel value to indicate that setSound should still be called, - // but with a null value to indicate no sound. - channel.setSound( - sound.equals(silentRingtone) ? null : sound, - new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build()); - } - channel.enableLights(lights); - channel.enableVibration(vibration); - getNotificationManager(context).createNotificationChannel(channel); - return channel; - } - - @RequiresApi(26) - private void deleteOldOngoingCallChannelIfNeeded( - @NonNull Context context, PhoneAccountHandle phoneAccountHandle) { - String channelId = channelNameToId(Channel.ONGOING_CALL_OLD, phoneAccountHandle); - NotificationManager notificationManager = getNotificationManager(context); - NotificationChannel channel = notificationManager.getNotificationChannel(channelId); - if (channel != null) { - LogUtil.i( - "NotificationManager.deleteOldOngoingCallChannelIfNeeded", - "Old ongoing channel found. Deleting to create new channel"); - notificationManager.deleteNotificationChannel(channel.getId()); - } - } - - private static NotificationManager getNotificationManager(@NonNull Context context) { - return context.getSystemService(NotificationManager.class); - } - - private static TelephonyManager getTelephonyManager(@NonNull Context context) { - return context.getSystemService(TelephonyManager.class); + private static Set getAllExistingChannelIds(@NonNull Context context) { + Set result = new ArraySet<>(); + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + for (NotificationChannel channel : notificationManager.getNotificationChannels()) { + result.add(channel.getId()); + } + return result; + } + + private static Set getAllDesiredChannelIds(@NonNull Context context) { + Set result = new ArraySet<>(); + result.add(NotificationChannelId.INCOMING_CALL); + result.add(NotificationChannelId.ONGOING_CALL); + result.add(NotificationChannelId.MISSED_CALL); + result.add(NotificationChannelId.DEFAULT); + result.addAll(VoicemailChannelUtils.getAllChannelIds(context)); + return result; + } + + private static void createIncomingCallChannel(@NonNull Context context) { + NotificationChannel channel = + new NotificationChannel( + NotificationChannelId.INCOMING_CALL, + context.getText(R.string.notification_channel_incoming_call), + NotificationManager.IMPORTANCE_MAX); + channel.setShowBadge(false); + channel.enableLights(true); + channel.enableVibration(false); + channel.setSound( + null, new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build()); + context.getSystemService(NotificationManager.class).createNotificationChannel(channel); + } + + private static void createOngoingCallChannel(@NonNull Context context) { + NotificationChannel channel = + new NotificationChannel( + NotificationChannelId.ONGOING_CALL, + context.getText(R.string.notification_channel_ongoing_call), + NotificationManager.IMPORTANCE_DEFAULT); + channel.setShowBadge(false); + channel.enableLights(false); + channel.enableVibration(false); + channel.setSound( + null, new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build()); + context.getSystemService(NotificationManager.class).createNotificationChannel(channel); + } + + private static void createMissedCallChannel(@NonNull Context context) { + NotificationChannel channel = + new NotificationChannel( + NotificationChannelId.MISSED_CALL, + context.getText(R.string.notification_channel_missed_call), + NotificationManager.IMPORTANCE_DEFAULT); + channel.setShowBadge(true); + channel.enableLights(true); + channel.enableVibration(true); + channel.setSound( + null, new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build()); + context.getSystemService(NotificationManager.class).createNotificationChannel(channel); + } + + private static void createDefaultChannel(@NonNull Context context) { + NotificationChannel channel = + new NotificationChannel( + NotificationChannelId.DEFAULT, + context.getText(R.string.notification_channel_misc), + NotificationManager.IMPORTANCE_DEFAULT); + channel.setShowBadge(false); + channel.enableLights(true); + channel.enableVibration(true); + context.getSystemService(NotificationManager.class).createNotificationChannel(channel); } - private static TelecomManager getTelecomManager(@NonNull Context context) { - return context.getSystemService(TelecomManager.class); - } + private NotificationChannelManager() {} } diff --git a/java/com/android/dialer/notification/PackageUpdatedReceiver.java b/java/com/android/dialer/notification/PackageUpdatedReceiver.java deleted file mode 100644 index feed40263..000000000 --- a/java/com/android/dialer/notification/PackageUpdatedReceiver.java +++ /dev/null @@ -1,37 +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.notification; - -import android.annotation.TargetApi; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.support.v4.os.BuildCompat; - -/** Inits the notification channels when Dialer or OS is updated */ -public class PackageUpdatedReceiver extends BroadcastReceiver { - - @Override - @TargetApi(26) - public void onReceive(Context context, Intent intent) { - if (!BuildCompat.isAtLeastO()) { - return; - } - context = context.createDeviceProtectedStorageContext(); - NotificationChannelManager.getInstance().initChannels(context); - } -} diff --git a/java/com/android/dialer/notification/VoicemailChannelUtils.java b/java/com/android/dialer/notification/VoicemailChannelUtils.java new file mode 100644 index 000000000..dc74799ca --- /dev/null +++ b/java/com/android/dialer/notification/VoicemailChannelUtils.java @@ -0,0 +1,217 @@ +/* + * 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.notification; + +import android.annotation.TargetApi; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; +import android.media.AudioAttributes; +import android.os.Build.VERSION_CODES; +import android.provider.Settings; +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.telecom.TelecomManager; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.util.ArraySet; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** Utilities for working with voicemail channels. */ +@TargetApi(VERSION_CODES.O) +/* package */ final class VoicemailChannelUtils { + private static final String GLOBAL_VOICEMAIL_CHANNEL_ID = "phone_voicemail"; + private static final String PER_ACCOUNT_VOICEMAIL_CHANNEL_ID_PREFIX = "phone_voicemail_account_"; + + static Set getAllChannelIds(@NonNull Context context) { + Assert.checkArgument(BuildCompat.isAtLeastO()); + Assert.isNotNull(context); + + Set result = new ArraySet<>(); + if (isSingleSimDevice(context)) { + result.add(GLOBAL_VOICEMAIL_CHANNEL_ID); + } else { + for (PhoneAccountHandle handle : getAllEligableAccounts(context)) { + result.add(getChannelIdForAccount(handle)); + } + } + return result; + } + + static void createAllChannels(@NonNull Context context) { + Assert.checkArgument(BuildCompat.isAtLeastO()); + Assert.isNotNull(context); + + if (isSingleSimDevice(context)) { + createGlobalVoicemailChannel(context); + } else { + for (PhoneAccountHandle handle : getAllEligableAccounts(context)) { + createVoicemailChannelForAccount(context, handle); + } + } + } + + @NonNull + static String getChannelId(@NonNull Context context, @Nullable PhoneAccountHandle handle) { + Assert.checkArgument(BuildCompat.isAtLeastO()); + Assert.isNotNull(context); + + // Most devices we deal with have a single SIM slot. No need to distinguish between phone + // accounts. + if (isSingleSimDevice(context)) { + return GLOBAL_VOICEMAIL_CHANNEL_ID; + } + + // We can get a null phone account at random points (modem reboot, etc...). Gracefully degrade + // by using the default channel. + if (handle == null) { + LogUtil.i( + "VoicemailChannelUtils.getChannelId", + "no phone account on a multi-SIM device, using default channel"); + return NotificationChannelId.DEFAULT; + } + + // Voicemail notifications should always be associated with a SIM based phone account. + if (!isChannelAllowedForAccount(context, handle)) { + LogUtil.i( + "VoicemailChannelUtils.getChannelId", + "phone account is not for a SIM, using default channel"); + return NotificationChannelId.DEFAULT; + } + + // Now we're in the multi-SIM case. + String channelId = getChannelIdForAccount(handle); + if (!doesChannelExist(context, channelId)) { + LogUtil.i( + "VoicemailChannelUtils.getChannelId", + "voicemail channel not found for phone account (possible SIM swap?), creating a new one"); + createVoicemailChannelForAccount(context, handle); + } + return channelId; + } + + private static boolean doesChannelExist(@NonNull Context context, @NonNull String channelId) { + return context.getSystemService(NotificationManager.class).getNotificationChannel(channelId) + != null; + } + + private static String getChannelIdForAccount(@NonNull PhoneAccountHandle handle) { + Assert.isNotNull(handle); + return PER_ACCOUNT_VOICEMAIL_CHANNEL_ID_PREFIX + ":" + handle.getId(); + } + + /** + * Creates a voicemail channel but doesn't associate it with a SIM. For devices with only one SIM + * slot this is ideal because there won't be duplication in the settings UI. + */ + private static void createGlobalVoicemailChannel(@NonNull Context context) { + NotificationChannel channel = newChannel(context, GLOBAL_VOICEMAIL_CHANNEL_ID, null); + + TelecomManager telecomManager = context.getSystemService(TelecomManager.class); + PhoneAccountHandle handle = + telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL); + if (handle == null) { + LogUtil.i( + "VoicemailChannelUtils.createGlobalVoicemailChannel", + "phone account is null, not migrating sound settings"); + } else if (!isChannelAllowedForAccount(context, handle)) { + LogUtil.i( + "VoicemailChannelUtils.createGlobalVoicemailChannel", + "phone account is not eligable, not migrating sound settings"); + } else { + migrateVoicemailSoundSettings(context, channel, handle); + } + context.getSystemService(NotificationManager.class).createNotificationChannel(channel); + } + + private static List getAllEligableAccounts(@NonNull Context context) { + List handles = new ArrayList<>(); + TelecomManager telecomManager = context.getSystemService(TelecomManager.class); + for (PhoneAccountHandle handle : telecomManager.getCallCapablePhoneAccounts()) { + if (isChannelAllowedForAccount(context, handle)) { + handles.add(handle); + } + } + return handles; + } + + private static void createVoicemailChannelForAccount( + @NonNull Context context, @NonNull PhoneAccountHandle handle) { + PhoneAccount phoneAccount = + context.getSystemService(TelecomManager.class).getPhoneAccount(handle); + NotificationChannel channel = + newChannel(context, getChannelIdForAccount(handle), phoneAccount.getLabel()); + migrateVoicemailSoundSettings(context, channel, handle); + context.getSystemService(NotificationManager.class).createNotificationChannel(channel); + } + + private static void migrateVoicemailSoundSettings( + @NonNull Context context, + @NonNull NotificationChannel channel, + @NonNull PhoneAccountHandle handle) { + TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); + channel.enableVibration(telephonyManager.isVoicemailVibrationEnabled(handle)); + channel.setSound( + telephonyManager.getVoicemailRingtoneUri(handle), + new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build()); + } + + private static boolean isChannelAllowedForAccount( + @NonNull Context context, @NonNull PhoneAccountHandle handle) { + PhoneAccount phoneAccount = + context.getSystemService(TelecomManager.class).getPhoneAccount(handle); + if (phoneAccount == null) { + return false; + } + if (!phoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) { + return false; + } + return true; + } + + private static NotificationChannel newChannel( + @NonNull Context context, @NonNull String channelId, @Nullable CharSequence nameSuffix) { + CharSequence name = context.getText(R.string.notification_channel_voicemail); + // TODO: Use a string resource template after v10. + if (!TextUtils.isEmpty(nameSuffix)) { + name = TextUtils.concat(name, ": ", nameSuffix); + } + + NotificationChannel channel = + new NotificationChannel(channelId, name, NotificationManager.IMPORTANCE_DEFAULT); + channel.setShowBadge(true); + channel.enableLights(true); + channel.enableVibration(true); + channel.setSound( + Settings.System.DEFAULT_NOTIFICATION_URI, + new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_NOTIFICATION).build()); + return channel; + } + + private static boolean isSingleSimDevice(@NonNull Context context) { + return context.getSystemService(TelephonyManager.class).getPhoneCount() <= 1; + } + + private VoicemailChannelUtils() {} +} diff --git a/java/com/android/dialer/notification/res/values-af/strings.xml b/java/com/android/dialer/notification/res/values-af/strings.xml index 08dd754dd..e48249b3c 100644 --- a/java/com/android/dialer/notification/res/values-af/strings.xml +++ b/java/com/android/dialer/notification/res/values-af/strings.xml @@ -21,6 +21,5 @@ "Deurlopende oproepe" "Gemiste oproepe" "Stemboodskappe" - "Ekterne oproepe" "Verstek" diff --git a/java/com/android/dialer/notification/res/values-am/strings.xml b/java/com/android/dialer/notification/res/values-am/strings.xml index 56d6c2ca1..0983e0591 100644 --- a/java/com/android/dialer/notification/res/values-am/strings.xml +++ b/java/com/android/dialer/notification/res/values-am/strings.xml @@ -21,6 +21,5 @@ "በመካሄድ ላይ ያሉ ጥሪዎች" "ያመለጡ ጥሪዎች" "የድምፅ መልዕክቶች" - "ውጫዊ ጥሪዎች" "ነባሪ" diff --git a/java/com/android/dialer/notification/res/values-ar/strings.xml b/java/com/android/dialer/notification/res/values-ar/strings.xml index 71857c274..ab6059ff1 100644 --- a/java/com/android/dialer/notification/res/values-ar/strings.xml +++ b/java/com/android/dialer/notification/res/values-ar/strings.xml @@ -21,6 +21,5 @@ "المكالمات الجارية" "المكالمات الفائتة" "رسائل البريد الصوتي" - "المكالمات الخارجية" "افتراضي" diff --git a/java/com/android/dialer/notification/res/values-az/strings.xml b/java/com/android/dialer/notification/res/values-az/strings.xml index f907e554e..425f30ad7 100644 --- a/java/com/android/dialer/notification/res/values-az/strings.xml +++ b/java/com/android/dialer/notification/res/values-az/strings.xml @@ -21,6 +21,5 @@ "Gedən zənglər" "Buraxılmış zənglər" "Səsli məktublar" - "External calls" "Defolt" diff --git a/java/com/android/dialer/notification/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/notification/res/values-b+sr+Latn/strings.xml index 4d5b5e78a..4598e7644 100644 --- a/java/com/android/dialer/notification/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/notification/res/values-b+sr+Latn/strings.xml @@ -21,6 +21,5 @@ "Pozivi u toku" "Propušteni pozivi" "Govorne poruke" - "Spoljni pozivi" "Podrazumevano" diff --git a/java/com/android/dialer/notification/res/values-be/strings.xml b/java/com/android/dialer/notification/res/values-be/strings.xml index 70defe342..586a36c31 100644 --- a/java/com/android/dialer/notification/res/values-be/strings.xml +++ b/java/com/android/dialer/notification/res/values-be/strings.xml @@ -21,6 +21,5 @@ "Адбываючыяся выклікі" "Прапушчаныя выклікі" "Галасавая пошта" - "Знешнія выклікі" "Стандартны" diff --git a/java/com/android/dialer/notification/res/values-bg/strings.xml b/java/com/android/dialer/notification/res/values-bg/strings.xml index 1ec202e6c..9bc8f8f02 100644 --- a/java/com/android/dialer/notification/res/values-bg/strings.xml +++ b/java/com/android/dialer/notification/res/values-bg/strings.xml @@ -21,6 +21,5 @@ "Текущи обаждания" "Пропуснати обаждания" "Гласови съобщения" - "Външни обаждания" "По подразбиране" diff --git a/java/com/android/dialer/notification/res/values-bn/strings.xml b/java/com/android/dialer/notification/res/values-bn/strings.xml index 886f8317d..1d7781797 100644 --- a/java/com/android/dialer/notification/res/values-bn/strings.xml +++ b/java/com/android/dialer/notification/res/values-bn/strings.xml @@ -21,6 +21,5 @@ "সংযুক্ত কল" "মিস করা কল" "ভয়েসমেল" - "বাহ্যিক কল" "ডিফল্ট" diff --git a/java/com/android/dialer/notification/res/values-bs/strings.xml b/java/com/android/dialer/notification/res/values-bs/strings.xml index e408a6468..dedbb1c2d 100644 --- a/java/com/android/dialer/notification/res/values-bs/strings.xml +++ b/java/com/android/dialer/notification/res/values-bs/strings.xml @@ -21,6 +21,5 @@ "Tekući pozivi" "Propušteni pozivi" "Poruke govorne pošte" - "Vanjski pozivi" "Zadano" diff --git a/java/com/android/dialer/notification/res/values-ca/strings.xml b/java/com/android/dialer/notification/res/values-ca/strings.xml index ea81b627a..1c19d0f74 100644 --- a/java/com/android/dialer/notification/res/values-ca/strings.xml +++ b/java/com/android/dialer/notification/res/values-ca/strings.xml @@ -21,6 +21,5 @@ "Trucades en curs" "Trucades perdudes" "Missatges de veu" - "Trucades externes" "Predeterminat" diff --git a/java/com/android/dialer/notification/res/values-cs/strings.xml b/java/com/android/dialer/notification/res/values-cs/strings.xml index 9ea7b61ca..c428ca2f3 100644 --- a/java/com/android/dialer/notification/res/values-cs/strings.xml +++ b/java/com/android/dialer/notification/res/values-cs/strings.xml @@ -21,6 +21,5 @@ "Probíhající hovory" "Zmeškané hovory" "Hlasové zprávy" - "Externí hovory" "Výchozí" diff --git a/java/com/android/dialer/notification/res/values-da/strings.xml b/java/com/android/dialer/notification/res/values-da/strings.xml index e4fc4dded..7f0ce9f10 100644 --- a/java/com/android/dialer/notification/res/values-da/strings.xml +++ b/java/com/android/dialer/notification/res/values-da/strings.xml @@ -21,6 +21,5 @@ "Igangværende opkald" "Ubesvarede opkald" "Talebeskeder" - "Eksterne opkald" "Standard" diff --git a/java/com/android/dialer/notification/res/values-de/strings.xml b/java/com/android/dialer/notification/res/values-de/strings.xml index 7fce6bf47..86b752016 100644 --- a/java/com/android/dialer/notification/res/values-de/strings.xml +++ b/java/com/android/dialer/notification/res/values-de/strings.xml @@ -21,6 +21,5 @@ "Laufende Anrufe" "Entgangene Anrufe" "Mailboxnachrichten" - "Externe Anrufe" "Standard" diff --git a/java/com/android/dialer/notification/res/values-el/strings.xml b/java/com/android/dialer/notification/res/values-el/strings.xml index a25bb43e9..812dc2564 100644 --- a/java/com/android/dialer/notification/res/values-el/strings.xml +++ b/java/com/android/dialer/notification/res/values-el/strings.xml @@ -21,6 +21,5 @@ "Κλήσεις σε εξέλιξη" "Αναπάντητες κλήσεις" "Μηνύματα αυτόματου τηλεφωνητή" - "Εξωτερικές κλήσεις" "Προεπιλογή" diff --git a/java/com/android/dialer/notification/res/values-en-rAU/strings.xml b/java/com/android/dialer/notification/res/values-en-rAU/strings.xml index 7d4bd825b..43b722beb 100644 --- a/java/com/android/dialer/notification/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/notification/res/values-en-rAU/strings.xml @@ -21,6 +21,5 @@ "Ongoing calls" "Missed calls" "Voicemail" - "External calls" "Default" diff --git a/java/com/android/dialer/notification/res/values-en-rGB/strings.xml b/java/com/android/dialer/notification/res/values-en-rGB/strings.xml index 7d4bd825b..43b722beb 100644 --- a/java/com/android/dialer/notification/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/notification/res/values-en-rGB/strings.xml @@ -21,6 +21,5 @@ "Ongoing calls" "Missed calls" "Voicemail" - "External calls" "Default" diff --git a/java/com/android/dialer/notification/res/values-en-rIN/strings.xml b/java/com/android/dialer/notification/res/values-en-rIN/strings.xml index 7d4bd825b..43b722beb 100644 --- a/java/com/android/dialer/notification/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/notification/res/values-en-rIN/strings.xml @@ -21,6 +21,5 @@ "Ongoing calls" "Missed calls" "Voicemail" - "External calls" "Default" diff --git a/java/com/android/dialer/notification/res/values-es-rUS/strings.xml b/java/com/android/dialer/notification/res/values-es-rUS/strings.xml index fe8fe1354..c56edcfe6 100644 --- a/java/com/android/dialer/notification/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/notification/res/values-es-rUS/strings.xml @@ -21,6 +21,5 @@ "Llamadas en curso" "Llamadas perdidas" "Mensajes de voz" - "Llamadas externas" "Predeterminado" diff --git a/java/com/android/dialer/notification/res/values-es/strings.xml b/java/com/android/dialer/notification/res/values-es/strings.xml index fe8fe1354..c56edcfe6 100644 --- a/java/com/android/dialer/notification/res/values-es/strings.xml +++ b/java/com/android/dialer/notification/res/values-es/strings.xml @@ -21,6 +21,5 @@ "Llamadas en curso" "Llamadas perdidas" "Mensajes de voz" - "Llamadas externas" "Predeterminado" diff --git a/java/com/android/dialer/notification/res/values-et/strings.xml b/java/com/android/dialer/notification/res/values-et/strings.xml index 41623951f..9c60a3195 100644 --- a/java/com/android/dialer/notification/res/values-et/strings.xml +++ b/java/com/android/dialer/notification/res/values-et/strings.xml @@ -21,6 +21,5 @@ "Käimasolevad kõned" "Vastamata kõned" "Kõnepostisõnumid" - "Välised kõned" "Vaikeseade" diff --git a/java/com/android/dialer/notification/res/values-eu/strings.xml b/java/com/android/dialer/notification/res/values-eu/strings.xml index 326ac0ab6..d94ac0ab6 100644 --- a/java/com/android/dialer/notification/res/values-eu/strings.xml +++ b/java/com/android/dialer/notification/res/values-eu/strings.xml @@ -21,6 +21,5 @@ "Abian diren deiak" "Dei galduak" "Ahots-mezuak" - "Kanpoko deiak" "Lehenetsia" diff --git a/java/com/android/dialer/notification/res/values-fa/strings.xml b/java/com/android/dialer/notification/res/values-fa/strings.xml index f1a7efc3d..edbc98336 100644 --- a/java/com/android/dialer/notification/res/values-fa/strings.xml +++ b/java/com/android/dialer/notification/res/values-fa/strings.xml @@ -21,6 +21,5 @@ "تماس‌های درحال انجام" "تماس‌های بی‌پاسخ" "پست‌های صوتی" - "تماس‌های خارجی" "پیش‌فرض" diff --git a/java/com/android/dialer/notification/res/values-fi/strings.xml b/java/com/android/dialer/notification/res/values-fi/strings.xml index c88c2325a..87652f8a8 100644 --- a/java/com/android/dialer/notification/res/values-fi/strings.xml +++ b/java/com/android/dialer/notification/res/values-fi/strings.xml @@ -21,6 +21,5 @@ "Käynnissä olevat puhelut" "Vastaamattomat puhelut" "Vastaajaviestit" - "Ulkopuoliset puhelut" "Oletus" diff --git a/java/com/android/dialer/notification/res/values-fr-rCA/strings.xml b/java/com/android/dialer/notification/res/values-fr-rCA/strings.xml index a21d6b28b..5a2d7dcfe 100644 --- a/java/com/android/dialer/notification/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/notification/res/values-fr-rCA/strings.xml @@ -21,6 +21,5 @@ "Appels en cours" "Appels manqués" "Messages vocaux" - "Appels externes" "Par défaut" diff --git a/java/com/android/dialer/notification/res/values-fr/strings.xml b/java/com/android/dialer/notification/res/values-fr/strings.xml index a21d6b28b..5a2d7dcfe 100644 --- a/java/com/android/dialer/notification/res/values-fr/strings.xml +++ b/java/com/android/dialer/notification/res/values-fr/strings.xml @@ -21,6 +21,5 @@ "Appels en cours" "Appels manqués" "Messages vocaux" - "Appels externes" "Par défaut" diff --git a/java/com/android/dialer/notification/res/values-gl/strings.xml b/java/com/android/dialer/notification/res/values-gl/strings.xml index 3b57a59b3..0e7fb612b 100644 --- a/java/com/android/dialer/notification/res/values-gl/strings.xml +++ b/java/com/android/dialer/notification/res/values-gl/strings.xml @@ -21,6 +21,5 @@ "Chamadas saíntes" "Chamadas perdidas" "Correos de voz" - "Chamadas externas" "Predeterminado" diff --git a/java/com/android/dialer/notification/res/values-gu/strings.xml b/java/com/android/dialer/notification/res/values-gu/strings.xml index f185e5971..a4a0a7ae1 100644 --- a/java/com/android/dialer/notification/res/values-gu/strings.xml +++ b/java/com/android/dialer/notification/res/values-gu/strings.xml @@ -21,6 +21,5 @@ "ચાલુ કૉલ" "છૂટેલા કૉલ" "વૉઇસમેઇલ" - "બાહ્ય કૉલ" "ડિફૉલ્ટ" diff --git a/java/com/android/dialer/notification/res/values-hi/strings.xml b/java/com/android/dialer/notification/res/values-hi/strings.xml index 89c8e5547..69ed9b0b2 100644 --- a/java/com/android/dialer/notification/res/values-hi/strings.xml +++ b/java/com/android/dialer/notification/res/values-hi/strings.xml @@ -21,6 +21,5 @@ "चल रहे कॉल" "छूटे कॉल" "वॉइसमेल" - "बाहरी कॉल" "डिफ़ॉल्ट" diff --git a/java/com/android/dialer/notification/res/values-hr/strings.xml b/java/com/android/dialer/notification/res/values-hr/strings.xml index 9f786d7d8..a5924c3ce 100644 --- a/java/com/android/dialer/notification/res/values-hr/strings.xml +++ b/java/com/android/dialer/notification/res/values-hr/strings.xml @@ -21,6 +21,5 @@ "Pozivi u tijeku" "Propušteni pozivi" "Poruke govorne pošte" - "Vanjski pozivi" "Zadano" diff --git a/java/com/android/dialer/notification/res/values-hu/strings.xml b/java/com/android/dialer/notification/res/values-hu/strings.xml index 09fa795d6..719252f0f 100644 --- a/java/com/android/dialer/notification/res/values-hu/strings.xml +++ b/java/com/android/dialer/notification/res/values-hu/strings.xml @@ -21,6 +21,5 @@ "Kimenő hívások" "Nem fogadott hívások" "Hangüzenetek" - "Külső hívások" "Alapértelmezett" diff --git a/java/com/android/dialer/notification/res/values-hy/strings.xml b/java/com/android/dialer/notification/res/values-hy/strings.xml index 693898a55..6bb2c34e3 100644 --- a/java/com/android/dialer/notification/res/values-hy/strings.xml +++ b/java/com/android/dialer/notification/res/values-hy/strings.xml @@ -21,6 +21,5 @@ "Ընթացիկ զանգեր" "Բաց թողնված զանգեր" "Ձայնային փոստ" - "Արտաքին զանգեր" "Կանխադրված" diff --git a/java/com/android/dialer/notification/res/values-in/strings.xml b/java/com/android/dialer/notification/res/values-in/strings.xml index 405b2927d..88ef3d524 100644 --- a/java/com/android/dialer/notification/res/values-in/strings.xml +++ b/java/com/android/dialer/notification/res/values-in/strings.xml @@ -21,6 +21,5 @@ "Panggilan keluar" "Panggilan tak terjawab" "Pesan suara" - "Panggilan eksternal" "Default" diff --git a/java/com/android/dialer/notification/res/values-is/strings.xml b/java/com/android/dialer/notification/res/values-is/strings.xml index be84917fc..166d97443 100644 --- a/java/com/android/dialer/notification/res/values-is/strings.xml +++ b/java/com/android/dialer/notification/res/values-is/strings.xml @@ -21,6 +21,5 @@ "Símtöl í gangi" "Ósvöruð símtöl" "Talhólfsskilaboð" - "Utanaðkomandi símtöl" "Sjálfgefið" diff --git a/java/com/android/dialer/notification/res/values-it/strings.xml b/java/com/android/dialer/notification/res/values-it/strings.xml index 1ac6e2d41..7b55da991 100644 --- a/java/com/android/dialer/notification/res/values-it/strings.xml +++ b/java/com/android/dialer/notification/res/values-it/strings.xml @@ -21,6 +21,5 @@ "Chiamate in uscita" "Chiamate perse" "Messaggi vocali" - "Chiamate esterne" "Predefinito" diff --git a/java/com/android/dialer/notification/res/values-iw/strings.xml b/java/com/android/dialer/notification/res/values-iw/strings.xml index ed07b8643..2b8b9df33 100644 --- a/java/com/android/dialer/notification/res/values-iw/strings.xml +++ b/java/com/android/dialer/notification/res/values-iw/strings.xml @@ -21,6 +21,5 @@ "שיחות יוצאות" "שיחות שלא נענו" "הודעות קוליות" - "שיחות חיצוניות" "ברירת מחדל" diff --git a/java/com/android/dialer/notification/res/values-ja/strings.xml b/java/com/android/dialer/notification/res/values-ja/strings.xml index 3265d7266..2ff8da7d0 100644 --- a/java/com/android/dialer/notification/res/values-ja/strings.xml +++ b/java/com/android/dialer/notification/res/values-ja/strings.xml @@ -21,6 +21,5 @@ "通話中" "不在着信" "ボイスメール" - "外部通話" "デフォルト" diff --git a/java/com/android/dialer/notification/res/values-ka/strings.xml b/java/com/android/dialer/notification/res/values-ka/strings.xml index 6d81465e2..73394efeb 100644 --- a/java/com/android/dialer/notification/res/values-ka/strings.xml +++ b/java/com/android/dialer/notification/res/values-ka/strings.xml @@ -21,6 +21,5 @@ "გამავალი ზარები" "გამოტოვებული ზარები" "ხმოვანი ფოსტა" - "გარე ზარები" "ნაგულისხმევი" diff --git a/java/com/android/dialer/notification/res/values-kk/strings.xml b/java/com/android/dialer/notification/res/values-kk/strings.xml index 35733fb04..8151c9ca9 100644 --- a/java/com/android/dialer/notification/res/values-kk/strings.xml +++ b/java/com/android/dialer/notification/res/values-kk/strings.xml @@ -21,6 +21,5 @@ "Қазіргі қоңыраулар" "Қабылданбаған қоңыраулар" "Дауыстық хабарлар" - "Сыртқы қоңыраулар" "Әдепкі" diff --git a/java/com/android/dialer/notification/res/values-km/strings.xml b/java/com/android/dialer/notification/res/values-km/strings.xml index 42bc11350..22131ff39 100644 --- a/java/com/android/dialer/notification/res/values-km/strings.xml +++ b/java/com/android/dialer/notification/res/values-km/strings.xml @@ -21,6 +21,5 @@ "ការ​ហៅ​បន្ត" "ការ​ហៅ​ដែល​មិន​បាន​ទទួល" "សារ​ជា​សំឡេង" - "ការ​ហៅខាង​ក្រៅ" "លំ​នាំ​ដើម" diff --git a/java/com/android/dialer/notification/res/values-kn/strings.xml b/java/com/android/dialer/notification/res/values-kn/strings.xml index 45f26e378..d6e55bdb1 100644 --- a/java/com/android/dialer/notification/res/values-kn/strings.xml +++ b/java/com/android/dialer/notification/res/values-kn/strings.xml @@ -21,6 +21,5 @@ "ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆಗಳು" "ಮಿಸ್ಡ್‌ ಕರೆಗಳು" "ಧ್ವನಿಮೇಲ್‌ಗಳು" - "ಹೊರಗಿನ ಕರೆಗಳು" "ಡಿಫಾಲ್ಟ್" diff --git a/java/com/android/dialer/notification/res/values-ko/strings.xml b/java/com/android/dialer/notification/res/values-ko/strings.xml index d806cad06..5a667176d 100644 --- a/java/com/android/dialer/notification/res/values-ko/strings.xml +++ b/java/com/android/dialer/notification/res/values-ko/strings.xml @@ -21,6 +21,5 @@ "진행 중인 전화" "부재중 전화" "음성사서함" - "외부 전화" "기본" diff --git a/java/com/android/dialer/notification/res/values-ky/strings.xml b/java/com/android/dialer/notification/res/values-ky/strings.xml index eb6adf6e7..c5259315a 100644 --- a/java/com/android/dialer/notification/res/values-ky/strings.xml +++ b/java/com/android/dialer/notification/res/values-ky/strings.xml @@ -21,6 +21,5 @@ "Учурдагы чалуулар" "Кабыл алынбаган чалуулар" "Үнкаттар" - "Тышкы чалуулар" "Демейки" diff --git a/java/com/android/dialer/notification/res/values-lo/strings.xml b/java/com/android/dialer/notification/res/values-lo/strings.xml index f439807de..a52d9df14 100644 --- a/java/com/android/dialer/notification/res/values-lo/strings.xml +++ b/java/com/android/dialer/notification/res/values-lo/strings.xml @@ -21,6 +21,5 @@ "ສາຍໂທອອກ" "ສາຍບໍ່ໄດ້ຮັບ" "ຂໍ້ຄວາມສຽງ" - "ສາຍພາຍນອກ" "ຄ່າເລີ່ມຕົ້ນ" diff --git a/java/com/android/dialer/notification/res/values-lt/strings.xml b/java/com/android/dialer/notification/res/values-lt/strings.xml index f08697ad6..6f26d3e66 100644 --- a/java/com/android/dialer/notification/res/values-lt/strings.xml +++ b/java/com/android/dialer/notification/res/values-lt/strings.xml @@ -21,6 +21,5 @@ "Vykstantys skambučiai" "Praleisti skambučiai" "Balso pašto pranešimai" - "Išoriniai skambučiai" "Numatytasis" diff --git a/java/com/android/dialer/notification/res/values-lv/strings.xml b/java/com/android/dialer/notification/res/values-lv/strings.xml index d465b682d..1819d810a 100644 --- a/java/com/android/dialer/notification/res/values-lv/strings.xml +++ b/java/com/android/dialer/notification/res/values-lv/strings.xml @@ -21,6 +21,5 @@ "Aktīvie zvani" "Neatbildētie zvani" "Balss pasta ziņojumi" - "Ārējie zvani" "Noklusējums" diff --git a/java/com/android/dialer/notification/res/values-mk/strings.xml b/java/com/android/dialer/notification/res/values-mk/strings.xml index 838065ba9..56459c479 100644 --- a/java/com/android/dialer/notification/res/values-mk/strings.xml +++ b/java/com/android/dialer/notification/res/values-mk/strings.xml @@ -21,6 +21,5 @@ "Појдовни повици" "Пропуштени повици" "Говорни пораки" - "Надворешни повици" "Стандардно" diff --git a/java/com/android/dialer/notification/res/values-ml/strings.xml b/java/com/android/dialer/notification/res/values-ml/strings.xml index 448186a36..49a64e8f5 100644 --- a/java/com/android/dialer/notification/res/values-ml/strings.xml +++ b/java/com/android/dialer/notification/res/values-ml/strings.xml @@ -21,6 +21,5 @@ "നിലവിലുള്ള കോളുകൾ" "മിസ്‌ഡ് കോളുകൾ" "വോയ്‌സ്മെയിലുകൾ" - "എക്‌സ്റ്റേണൽ കോളുകൾ" "ഡിഫോൾട്ട്" diff --git a/java/com/android/dialer/notification/res/values-mn/strings.xml b/java/com/android/dialer/notification/res/values-mn/strings.xml index 3dca52e6b..28297b3c1 100644 --- a/java/com/android/dialer/notification/res/values-mn/strings.xml +++ b/java/com/android/dialer/notification/res/values-mn/strings.xml @@ -21,6 +21,5 @@ "Үргэлжилж буй дуудлага" "Аваагүй дуудлага" "Дуут шуудан" - "Гадаад дуудлага" "Өгөгдмөл" diff --git a/java/com/android/dialer/notification/res/values-mr/strings.xml b/java/com/android/dialer/notification/res/values-mr/strings.xml index 568537640..38fbd606a 100644 --- a/java/com/android/dialer/notification/res/values-mr/strings.xml +++ b/java/com/android/dialer/notification/res/values-mr/strings.xml @@ -21,6 +21,5 @@ "सुरू असलेले कॉल" "सुटलेले कॉल" "व्हॉइसमेल" - "बाह्य कॉल" "डीफॉल्ट" diff --git a/java/com/android/dialer/notification/res/values-ms/strings.xml b/java/com/android/dialer/notification/res/values-ms/strings.xml index a1961c4a4..ec7be04ef 100644 --- a/java/com/android/dialer/notification/res/values-ms/strings.xml +++ b/java/com/android/dialer/notification/res/values-ms/strings.xml @@ -21,6 +21,5 @@ "Panggilan sedang berlangsung" "Panggilan terlepas" "Mel suara" - "Panggilan luar" "Lalai" diff --git a/java/com/android/dialer/notification/res/values-my/strings.xml b/java/com/android/dialer/notification/res/values-my/strings.xml index 26398b459..44df84798 100644 --- a/java/com/android/dialer/notification/res/values-my/strings.xml +++ b/java/com/android/dialer/notification/res/values-my/strings.xml @@ -21,6 +21,5 @@ "လက်ရှိခေါ်ဆိုမှုများ" "လွဲသွားသော ခေါ်ဆိုမှုများ" "အသံစာပို့စနစ်များ" - "ပြင်ပခေါ်ဆိုမှုများ" "မူရင်း" diff --git a/java/com/android/dialer/notification/res/values-nb/strings.xml b/java/com/android/dialer/notification/res/values-nb/strings.xml index e4ccd48a0..8e63fd24b 100644 --- a/java/com/android/dialer/notification/res/values-nb/strings.xml +++ b/java/com/android/dialer/notification/res/values-nb/strings.xml @@ -21,6 +21,5 @@ "Pågående samtaler" "Tapte anrop" "Talepost" - "Eksterne anrop" "Standard" diff --git a/java/com/android/dialer/notification/res/values-ne/strings.xml b/java/com/android/dialer/notification/res/values-ne/strings.xml index 8ccd2997a..e653bb3f8 100644 --- a/java/com/android/dialer/notification/res/values-ne/strings.xml +++ b/java/com/android/dialer/notification/res/values-ne/strings.xml @@ -21,6 +21,5 @@ "जारी रहेका कलहरू" "छुटेका कलहरू" "भ्वाइस मेलहरू" - "बाह्य कलहरू" "पूर्वनिर्धारित मान" diff --git a/java/com/android/dialer/notification/res/values-nl/strings.xml b/java/com/android/dialer/notification/res/values-nl/strings.xml index e46dd19e3..094cc357f 100644 --- a/java/com/android/dialer/notification/res/values-nl/strings.xml +++ b/java/com/android/dialer/notification/res/values-nl/strings.xml @@ -21,6 +21,5 @@ "Actieve oproepen" "Gemiste oproepen" "Voicemails" - "Externe oproepen" "Standaard" diff --git a/java/com/android/dialer/notification/res/values-no/strings.xml b/java/com/android/dialer/notification/res/values-no/strings.xml index e4ccd48a0..8e63fd24b 100644 --- a/java/com/android/dialer/notification/res/values-no/strings.xml +++ b/java/com/android/dialer/notification/res/values-no/strings.xml @@ -21,6 +21,5 @@ "Pågående samtaler" "Tapte anrop" "Talepost" - "Eksterne anrop" "Standard" diff --git a/java/com/android/dialer/notification/res/values-pa/strings.xml b/java/com/android/dialer/notification/res/values-pa/strings.xml index 40709c1ac..c4ee97b22 100644 --- a/java/com/android/dialer/notification/res/values-pa/strings.xml +++ b/java/com/android/dialer/notification/res/values-pa/strings.xml @@ -21,6 +21,5 @@ "ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ" "ਖੁੰਝੀਆਂ ਕਾਲਾਂ" "ਵੌਇਸਮੇਲਾਂ" - "ਬਾਹਰੀ ਕਾਲਾਂ" "ਪੂਰਵ-ਨਿਰਧਾਰਤ" diff --git a/java/com/android/dialer/notification/res/values-pl/strings.xml b/java/com/android/dialer/notification/res/values-pl/strings.xml index 73b795cff..4b3346001 100644 --- a/java/com/android/dialer/notification/res/values-pl/strings.xml +++ b/java/com/android/dialer/notification/res/values-pl/strings.xml @@ -21,6 +21,5 @@ "Połączenia trwające" "Połączenia nieodebrane" "Wiadomości głosowe" - "Połączenia zewnętrzne" "Domyślny" diff --git a/java/com/android/dialer/notification/res/values-pt-rBR/strings.xml b/java/com/android/dialer/notification/res/values-pt-rBR/strings.xml index f6e41cb11..4b988c3cc 100644 --- a/java/com/android/dialer/notification/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/notification/res/values-pt-rBR/strings.xml @@ -21,6 +21,5 @@ "Chamadas em andamento" "Chamadas perdidas" "Correios de voz" - "Chamadas externas" "Padrão" diff --git a/java/com/android/dialer/notification/res/values-pt-rPT/strings.xml b/java/com/android/dialer/notification/res/values-pt-rPT/strings.xml index ec42a5bf5..45b31ebd0 100644 --- a/java/com/android/dialer/notification/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/notification/res/values-pt-rPT/strings.xml @@ -21,6 +21,5 @@ "Chamadas efetuadas" "Chamadas não atendidas" "Mensagens de correio de voz" - "Chamadas externas" "Predefinição" diff --git a/java/com/android/dialer/notification/res/values-pt/strings.xml b/java/com/android/dialer/notification/res/values-pt/strings.xml index f6e41cb11..4b988c3cc 100644 --- a/java/com/android/dialer/notification/res/values-pt/strings.xml +++ b/java/com/android/dialer/notification/res/values-pt/strings.xml @@ -21,6 +21,5 @@ "Chamadas em andamento" "Chamadas perdidas" "Correios de voz" - "Chamadas externas" "Padrão" diff --git a/java/com/android/dialer/notification/res/values-ro/strings.xml b/java/com/android/dialer/notification/res/values-ro/strings.xml index 7deeabba3..040c58ad2 100644 --- a/java/com/android/dialer/notification/res/values-ro/strings.xml +++ b/java/com/android/dialer/notification/res/values-ro/strings.xml @@ -21,6 +21,5 @@ "Apeluri în desfășurare" "Apeluri nepreluate" "Mesaje vocale" - "Apeluri externe" "Prestabilit" diff --git a/java/com/android/dialer/notification/res/values-ru/strings.xml b/java/com/android/dialer/notification/res/values-ru/strings.xml index 3a1140455..a8117990a 100644 --- a/java/com/android/dialer/notification/res/values-ru/strings.xml +++ b/java/com/android/dialer/notification/res/values-ru/strings.xml @@ -21,6 +21,5 @@ "Текущие вызовы" "Пропущенные вызовы" "Голосовые сообщения" - "Внешние вызовы" "По умолчанию" diff --git a/java/com/android/dialer/notification/res/values-si/strings.xml b/java/com/android/dialer/notification/res/values-si/strings.xml index bf0a5a798..3ad0af729 100644 --- a/java/com/android/dialer/notification/res/values-si/strings.xml +++ b/java/com/android/dialer/notification/res/values-si/strings.xml @@ -21,6 +21,5 @@ "යන ඇමතුම්" "මඟ හැරුණු ඇමතුම්" "හඬ තැපැල්" - "බාහිර ඇමතුම්" "පෙරනිමි" diff --git a/java/com/android/dialer/notification/res/values-sk/strings.xml b/java/com/android/dialer/notification/res/values-sk/strings.xml index 4a67e60d2..30941bcd5 100644 --- a/java/com/android/dialer/notification/res/values-sk/strings.xml +++ b/java/com/android/dialer/notification/res/values-sk/strings.xml @@ -21,6 +21,5 @@ "Prebiehajúce hovory" "Zmeškané hovory" "Hlasové správy" - "Externé hovory" "Predvolené" diff --git a/java/com/android/dialer/notification/res/values-sl/strings.xml b/java/com/android/dialer/notification/res/values-sl/strings.xml index e54111d12..70474b87b 100644 --- a/java/com/android/dialer/notification/res/values-sl/strings.xml +++ b/java/com/android/dialer/notification/res/values-sl/strings.xml @@ -21,6 +21,5 @@ "Aktivni klici" "Neodgovorjeni klici" "Sporočila v odzivniku" - "Zunanji klici" "Privzeto" diff --git a/java/com/android/dialer/notification/res/values-sq/strings.xml b/java/com/android/dialer/notification/res/values-sq/strings.xml index 42d4daac3..03bc24775 100644 --- a/java/com/android/dialer/notification/res/values-sq/strings.xml +++ b/java/com/android/dialer/notification/res/values-sq/strings.xml @@ -21,6 +21,5 @@ "Telefonatat në vazhdim" "Telefonatat e humbura" "Postat zanore" - "Telefonatat e jashtme" "I parazgjedhur" diff --git a/java/com/android/dialer/notification/res/values-sr/strings.xml b/java/com/android/dialer/notification/res/values-sr/strings.xml index 10477170f..8326c0403 100644 --- a/java/com/android/dialer/notification/res/values-sr/strings.xml +++ b/java/com/android/dialer/notification/res/values-sr/strings.xml @@ -21,6 +21,5 @@ "Позиви у току" "Пропуштени позиви" "Говорне поруке" - "Спољни позиви" "Подразумевано" diff --git a/java/com/android/dialer/notification/res/values-sv/strings.xml b/java/com/android/dialer/notification/res/values-sv/strings.xml index 6c9ff83b7..e3170d48f 100644 --- a/java/com/android/dialer/notification/res/values-sv/strings.xml +++ b/java/com/android/dialer/notification/res/values-sv/strings.xml @@ -21,6 +21,5 @@ "Pågående samtal" "Missade samtal" "Röstmeddelanden" - "Externa samtal" "Standard" diff --git a/java/com/android/dialer/notification/res/values-sw/strings.xml b/java/com/android/dialer/notification/res/values-sw/strings.xml index a493f8897..d0a65b08c 100644 --- a/java/com/android/dialer/notification/res/values-sw/strings.xml +++ b/java/com/android/dialer/notification/res/values-sw/strings.xml @@ -21,6 +21,5 @@ "Simu zinazoendelea" "Simu ambazo hukujibu" "Ujumbe wa sauti" - "Simu za nje" "Chaguo-msingi" diff --git a/java/com/android/dialer/notification/res/values-ta/strings.xml b/java/com/android/dialer/notification/res/values-ta/strings.xml index d3000cf90..8a6ae89a8 100644 --- a/java/com/android/dialer/notification/res/values-ta/strings.xml +++ b/java/com/android/dialer/notification/res/values-ta/strings.xml @@ -21,6 +21,5 @@ "செயலில் உள்ள அழைப்புகள்" "தவறிய அழைப்புகள்" "குரலஞ்சல்கள்" - "வெளி அழைப்புகள்" "இயல்பு" diff --git a/java/com/android/dialer/notification/res/values-te/strings.xml b/java/com/android/dialer/notification/res/values-te/strings.xml index b14b21071..b1911d34d 100644 --- a/java/com/android/dialer/notification/res/values-te/strings.xml +++ b/java/com/android/dialer/notification/res/values-te/strings.xml @@ -21,6 +21,5 @@ "కొనసాగుతున్న కాల్‌లు" "సమాధానమివ్వని కాల్‌లు" "వాయిస్ మెయిల్‌లు" - "బాహ్య కాల్‌లు" "డిఫాల్ట్" diff --git a/java/com/android/dialer/notification/res/values-th/strings.xml b/java/com/android/dialer/notification/res/values-th/strings.xml index 45248bbbe..b2949e42f 100644 --- a/java/com/android/dialer/notification/res/values-th/strings.xml +++ b/java/com/android/dialer/notification/res/values-th/strings.xml @@ -21,6 +21,5 @@ "สายที่สนทนาอยู่" "สายที่ไม่ได้รับ" "ข้อความเสียง" - "สายนอก" "ค่าเริ่มต้น" diff --git a/java/com/android/dialer/notification/res/values-tl/strings.xml b/java/com/android/dialer/notification/res/values-tl/strings.xml index 3e88a055f..1219ad86f 100644 --- a/java/com/android/dialer/notification/res/values-tl/strings.xml +++ b/java/com/android/dialer/notification/res/values-tl/strings.xml @@ -21,6 +21,5 @@ "Mga kasalukuyang tawag" "Mga hindi nasagot na tawag" "Mga voicemail" - "Mga external na tawag" "Default" diff --git a/java/com/android/dialer/notification/res/values-tr/strings.xml b/java/com/android/dialer/notification/res/values-tr/strings.xml index d4e063bc2..71c91c806 100644 --- a/java/com/android/dialer/notification/res/values-tr/strings.xml +++ b/java/com/android/dialer/notification/res/values-tr/strings.xml @@ -21,6 +21,5 @@ "Devam eden çağrılar" "Cevapsız çağrılar" "Sesli mesajlar" - "Harici çağrılar" "Varsayılan" diff --git a/java/com/android/dialer/notification/res/values-uk/strings.xml b/java/com/android/dialer/notification/res/values-uk/strings.xml index a83a58460..a002f42e1 100644 --- a/java/com/android/dialer/notification/res/values-uk/strings.xml +++ b/java/com/android/dialer/notification/res/values-uk/strings.xml @@ -21,6 +21,5 @@ "Поточні виклики" "Пропущені виклики" "Голосова пошта" - "Зовнішні виклики" "За умовчанням" diff --git a/java/com/android/dialer/notification/res/values-ur/strings.xml b/java/com/android/dialer/notification/res/values-ur/strings.xml index ba6e0d1da..805fe08f8 100644 --- a/java/com/android/dialer/notification/res/values-ur/strings.xml +++ b/java/com/android/dialer/notification/res/values-ur/strings.xml @@ -21,6 +21,5 @@ "جاری کالیں" "چھوٹی ہوئی کالیں" "صوتی میلز" - "بیرونی کالیں" "ڈیفالٹ" diff --git a/java/com/android/dialer/notification/res/values-uz/strings.xml b/java/com/android/dialer/notification/res/values-uz/strings.xml index d45ff47d2..16075b031 100644 --- a/java/com/android/dialer/notification/res/values-uz/strings.xml +++ b/java/com/android/dialer/notification/res/values-uz/strings.xml @@ -21,6 +21,5 @@ "Davom etayotgan suhbatlar" "Javobsiz chaqiruvlar" "Ovozli xabarlar" - "Tashqi chaqiruvlar" "Standart" diff --git a/java/com/android/dialer/notification/res/values-vi/strings.xml b/java/com/android/dialer/notification/res/values-vi/strings.xml index 6df88721e..b6ab3d2d8 100644 --- a/java/com/android/dialer/notification/res/values-vi/strings.xml +++ b/java/com/android/dialer/notification/res/values-vi/strings.xml @@ -21,6 +21,5 @@ "Cuộc gọi đến" "Cuộc gọi nhỡ" "Thư thoại" - "Cuộc gọi bên ngoài" "Mặc định" diff --git a/java/com/android/dialer/notification/res/values-zh-rCN/strings.xml b/java/com/android/dialer/notification/res/values-zh-rCN/strings.xml index fa5f0a657..1ef46c2b9 100644 --- a/java/com/android/dialer/notification/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/notification/res/values-zh-rCN/strings.xml @@ -21,6 +21,5 @@ "正在进行的通话" "未接电话" "语音邮件" - "外部来电" "默认" diff --git a/java/com/android/dialer/notification/res/values-zh-rHK/strings.xml b/java/com/android/dialer/notification/res/values-zh-rHK/strings.xml index 307a7f9bf..43a6fabf6 100644 --- a/java/com/android/dialer/notification/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/notification/res/values-zh-rHK/strings.xml @@ -21,6 +21,5 @@ "進行中的通話" "未接來電" "留言信箱" - "外部通話" "預設" diff --git a/java/com/android/dialer/notification/res/values-zh-rTW/strings.xml b/java/com/android/dialer/notification/res/values-zh-rTW/strings.xml index 054a2d737..35236be1d 100644 --- a/java/com/android/dialer/notification/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/notification/res/values-zh-rTW/strings.xml @@ -21,6 +21,5 @@ "進行中的通話" "未接來電" "語音留言" - "外部通話" "預設" diff --git a/java/com/android/dialer/notification/res/values-zu/strings.xml b/java/com/android/dialer/notification/res/values-zu/strings.xml index 744ffc816..f3d95531f 100644 --- a/java/com/android/dialer/notification/res/values-zu/strings.xml +++ b/java/com/android/dialer/notification/res/values-zu/strings.xml @@ -21,6 +21,5 @@ "Amakholi aqhubekayo" "Amakholi akuphuthile" "Amavoyisimeyili" - "Amakholi angaphandle" "Okuzenzakalelayo" diff --git a/java/com/android/dialer/notification/res/values/ids.xml b/java/com/android/dialer/notification/res/values/ids.xml deleted file mode 100644 index c965f319d..000000000 --- a/java/com/android/dialer/notification/res/values/ids.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - diff --git a/java/com/android/dialer/notification/res/values/strings.xml b/java/com/android/dialer/notification/res/values/strings.xml index cb3119f67..a3c6935aa 100644 --- a/java/com/android/dialer/notification/res/values/strings.xml +++ b/java/com/android/dialer/notification/res/values/strings.xml @@ -20,7 +20,6 @@ Ongoing calls Missed calls Voicemails - External calls Default diff --git a/java/com/android/dialer/oem/CequintCallerIdManager.java b/java/com/android/dialer/oem/CequintCallerIdManager.java index 095ee4e66..86097c41a 100644 --- a/java/com/android/dialer/oem/CequintCallerIdManager.java +++ b/java/com/android/dialer/oem/CequintCallerIdManager.java @@ -18,7 +18,6 @@ package com.android.dialer.oem; import android.annotation.TargetApi; import android.content.Context; import android.content.pm.PackageManager; -import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Build.VERSION_CODES; @@ -29,9 +28,8 @@ import android.support.annotation.WorkerThread; import android.telephony.PhoneNumberUtils; import android.text.TextUtils; import com.android.dialer.common.Assert; -import com.android.dialer.common.ConfigProviderBindings; import com.android.dialer.common.LogUtil; -import com.android.dialer.util.PermissionsUtil; +import com.android.dialer.configprovider.ConfigProviderBindings; import java.util.concurrent.ConcurrentHashMap; /** @@ -73,17 +71,12 @@ public class CequintCallerIdManager { private static final String IMAGE = "cid_pLogo"; private static final String DISPLAY_NAME = "cid_pDisplayName"; - // TODO: Revisit it and maybe remove it if it's not necessary. - private static final ConcurrentHashMap callLogCache = - new ConcurrentHashMap<>(); - private static final ConcurrentHashMap incallIncomingCallCache = - new ConcurrentHashMap<>(); - private static final ConcurrentHashMap incallOutgoingCallCache = - new ConcurrentHashMap<>(); - private static boolean hasRegisteredContentObserver; private static boolean hasAlreadyCheckedCequintCallerIdPackage; private static boolean isCequintCallerIdEnabled; + // TODO: Revisit it and maybe remove it if it's not necessary. + private final ConcurrentHashMap callLogCache; + /** Cequint caller id contact information. */ public static class CequintCallerIdContact { public final String name; @@ -117,27 +110,8 @@ public class CequintCallerIdManager { return isCequintCallerIdEnabled; } - @WorkerThread - @Nullable - public static CequintCallerIdContact getCequintCallerIdContact(Context context, String number) { - Assert.isWorkerThread(); - LogUtil.d( - "CequintCallerIdManager.getCequintCallerIdContact", - "number: %s", - LogUtil.sanitizePhoneNumber(number)); - if (callLogCache.containsKey(number)) { - return callLogCache.get(number); - } - CequintCallerIdContact cequintCallerIdContact = - lookup( - context, - CONTENT_URI, - PhoneNumberUtils.stripSeparators(number), - new String[] {"system"}); - if (cequintCallerIdContact != null) { - callLogCache.put(number, cequintCallerIdContact); - } - return cequintCallerIdContact; + public static CequintCallerIdManager createInstanceForCallLog() { + return new CequintCallerIdManager(); } @WorkerThread @@ -151,12 +125,6 @@ public class CequintCallerIdManager { LogUtil.sanitizePhoneNumber(number), LogUtil.sanitizePii(cnapName), isIncoming); - registerContentObserver(context); - if (isIncoming && incallIncomingCallCache.containsKey(number)) { - return incallIncomingCallCache.get(number); - } else if (!isIncoming && incallOutgoingCallCache.containsKey(number)) { - return incallOutgoingCallCache.get(number); - } int flag = 0; if (isIncoming) { flag |= CALLER_ID_LOOKUP_INCOMING_CALL; @@ -165,14 +133,28 @@ public class CequintCallerIdManager { flag |= CALLER_ID_LOOKUP_USER_PROVIDED_CID; } String[] flags = {cnapName, String.valueOf(flag)}; + return lookup(context, CONTENT_URI_FOR_INCALL, number, flags); + } + + @WorkerThread + @Nullable + public CequintCallerIdContact getCequintCallerIdContact(Context context, String number) { + Assert.isWorkerThread(); + LogUtil.d( + "CequintCallerIdManager.getCequintCallerIdContact", + "number: %s", + LogUtil.sanitizePhoneNumber(number)); + if (callLogCache.containsKey(number)) { + return callLogCache.get(number); + } CequintCallerIdContact cequintCallerIdContact = - lookup(context, CONTENT_URI_FOR_INCALL, number, flags); + lookup( + context, + CONTENT_URI, + PhoneNumberUtils.stripSeparators(number), + new String[] {"system"}); if (cequintCallerIdContact != null) { - if (isIncoming) { - incallIncomingCallCache.put(number, cequintCallerIdContact); - } else { - incallOutgoingCallCache.put(number, cequintCallerIdContact); - } + callLogCache.put(number, cequintCallerIdContact); } return cequintCallerIdContact; } @@ -285,33 +267,7 @@ public class CequintCallerIdManager { return geoDescription; } - private static synchronized void registerContentObserver(Context context) { - if (!PermissionsUtil.hasCequintPermissions(context)) { - LogUtil.i("CequintCallerIdManager.registerContentObserver", "no cequint permissions"); - return; - } - - if (hasRegisteredContentObserver) { - return; - } - ContentObserver contentObserver = - new ContentObserver(null) { - @Override - public void onChange(boolean selfChange) { - invalidateCache(); - } - }; - - context - .getContentResolver() - .registerContentObserver(CONTENT_URI_FOR_INCALL, true, contentObserver); - hasRegisteredContentObserver = true; - } - - private static void invalidateCache() { - incallIncomingCallCache.clear(); - incallOutgoingCallCache.clear(); + private CequintCallerIdManager() { + callLogCache = new ConcurrentHashMap<>(); } - - private CequintCallerIdManager() {} } diff --git a/java/com/android/dialer/oem/MotorolaHiddenMenuKeySequence.java b/java/com/android/dialer/oem/MotorolaHiddenMenuKeySequence.java index 9cf145b7a..79abff08e 100644 --- a/java/com/android/dialer/oem/MotorolaHiddenMenuKeySequence.java +++ b/java/com/android/dialer/oem/MotorolaHiddenMenuKeySequence.java @@ -67,9 +67,7 @@ public class MotorolaHiddenMenuKeySequence { } private MotorolaHiddenMenuKeySequence(Context context) { - featureHiddenMenuEnabled = - MotorolaUtils.isSpnMatched(context) - && context.getResources().getBoolean(R.bool.motorola_feature_hidden_menu); + featureHiddenMenuEnabled = MotorolaUtils.isSupportingHiddenMenu(context); // In case we do have a SPN from resource we need to match from service; otherwise we are // free to go if (featureHiddenMenuEnabled) { diff --git a/java/com/android/dialer/oem/MotorolaUtils.java b/java/com/android/dialer/oem/MotorolaUtils.java index db2b8909a..ffab8ea23 100644 --- a/java/com/android/dialer/oem/MotorolaUtils.java +++ b/java/com/android/dialer/oem/MotorolaUtils.java @@ -18,8 +18,11 @@ package com.android.dialer.oem; import android.content.Context; import android.content.res.Resources; import android.telephony.TelephonyManager; -import com.android.dialer.common.ConfigProviderBindings; +import com.android.dialer.common.LogUtil; import com.android.dialer.common.PackageUtils; +import com.android.dialer.configprovider.ConfigProviderBindings; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; /** Util class for Motorola OEM devices. */ public class MotorolaUtils { @@ -39,6 +42,8 @@ public class MotorolaUtils { // This is used to check if a Motorola device supports WiFi call feature, by checking if a certain // package is enabled. private static final String WIFI_CALL_PACKAGE_NAME = "com.motorola.sprintwfc"; + // Thi is used to check if a Motorola device supports hidden menu feature. + private static final String HIDDEN_MENU_FEATURE = "com.motorola.software.sprint.hidden_menu"; // Feature flag indicates it's a HD call, currently this is only used by Motorola system build. // TODO(b/35359461): Use reference to android.provider.CallLog once it's in new SDK. @@ -64,6 +69,10 @@ public class MotorolaUtils { } } + static boolean isSupportingHiddenMenu(Context context) { + return context.getPackageManager().hasSystemFeature(HIDDEN_MENU_FEATURE); + } + public static boolean shouldBlinkHdIconWhenConnectingCall(Context context) { return ConfigProviderBindings.get(context) .getBoolean(CONFIG_HD_CODEC_BLINKING_ICON_WHEN_CONNECTING_CALL_ENABLED, true) @@ -102,6 +111,22 @@ public class MotorolaUtils { return MotorolaHiddenMenuKeySequence.handleCharSequence(context, input); } + public static boolean isWifiCallingAvailable(Context context) { + if (!isSupportingSprintWifiCall(context)) { + return false; + } + TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); + try { + Method method = TelephonyManager.class.getMethod("isWifiCallingAvailable"); + boolean isWifiCallingAvailable = (boolean) method.invoke(telephonyManager); + LogUtil.d("MotorolaUtils.isWifiCallingAvailable", "%b", isWifiCallingAvailable); + return isWifiCallingAvailable; + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + LogUtil.e("MotorolaUtils.isWifiCallingAvailable", "", e); + } + return false; + } + private static boolean isSupportingSprintHdCodec(Context context) { return isSpnMatched(context) && context.getResources().getBoolean(R.bool.motorola_sprint_hd_codec) diff --git a/java/com/android/dialer/oem/res/values-mcc310-mnc000/motorola_config.xml b/java/com/android/dialer/oem/res/values-mcc310-mnc000/motorola_config.xml index 7f63bee75..ac3397520 100644 --- a/java/com/android/dialer/oem/res/values-mcc310-mnc000/motorola_config.xml +++ b/java/com/android/dialer/oem/res/values-mcc310-mnc000/motorola_config.xml @@ -1,6 +1,21 @@ + + true - true Sprint \ No newline at end of file diff --git a/java/com/android/dialer/oem/res/values-mcc310-mnc120/motorola_config.xml b/java/com/android/dialer/oem/res/values-mcc310-mnc120/motorola_config.xml index 39b72cdd1..c5cb0d1f7 100644 --- a/java/com/android/dialer/oem/res/values-mcc310-mnc120/motorola_config.xml +++ b/java/com/android/dialer/oem/res/values-mcc310-mnc120/motorola_config.xml @@ -1,5 +1,20 @@ + + true - true \ No newline at end of file diff --git a/java/com/android/dialer/oem/res/values-mcc311-mnc490/motorola_config.xml b/java/com/android/dialer/oem/res/values-mcc311-mnc490/motorola_config.xml index 39b72cdd1..c5cb0d1f7 100644 --- a/java/com/android/dialer/oem/res/values-mcc311-mnc490/motorola_config.xml +++ b/java/com/android/dialer/oem/res/values-mcc311-mnc490/motorola_config.xml @@ -1,5 +1,20 @@ + + true - true \ No newline at end of file diff --git a/java/com/android/dialer/oem/res/values-mcc311-mnc870/motorola_config.xml b/java/com/android/dialer/oem/res/values-mcc311-mnc870/motorola_config.xml index 39b72cdd1..c5cb0d1f7 100644 --- a/java/com/android/dialer/oem/res/values-mcc311-mnc870/motorola_config.xml +++ b/java/com/android/dialer/oem/res/values-mcc311-mnc870/motorola_config.xml @@ -1,5 +1,20 @@ + + true - true \ No newline at end of file diff --git a/java/com/android/dialer/oem/res/values-mcc312-mnc530/motorola_config.xml b/java/com/android/dialer/oem/res/values-mcc312-mnc530/motorola_config.xml index 39b72cdd1..c5cb0d1f7 100644 --- a/java/com/android/dialer/oem/res/values-mcc312-mnc530/motorola_config.xml +++ b/java/com/android/dialer/oem/res/values-mcc312-mnc530/motorola_config.xml @@ -1,5 +1,20 @@ + + true - true \ No newline at end of file diff --git a/java/com/android/dialer/oem/res/values-mcc316-mnc010/motorola_config.xml b/java/com/android/dialer/oem/res/values-mcc316-mnc010/motorola_config.xml index 39b72cdd1..c5cb0d1f7 100644 --- a/java/com/android/dialer/oem/res/values-mcc316-mnc010/motorola_config.xml +++ b/java/com/android/dialer/oem/res/values-mcc316-mnc010/motorola_config.xml @@ -1,5 +1,20 @@ + + true - true \ No newline at end of file diff --git a/java/com/android/dialer/oem/res/values/motorola_config.xml b/java/com/android/dialer/oem/res/values/motorola_config.xml index f875d573d..46e7a16b6 100644 --- a/java/com/android/dialer/oem/res/values/motorola_config.xml +++ b/java/com/android/dialer/oem/res/values/motorola_config.xml @@ -1,12 +1,25 @@ + + false - - false - diff --git a/java/com/android/dialer/p13n/inference/P13nRanking.java b/java/com/android/dialer/p13n/inference/P13nRanking.java index 0682e85db..79b4d7136 100644 --- a/java/com/android/dialer/p13n/inference/P13nRanking.java +++ b/java/com/android/dialer/p13n/inference/P13nRanking.java @@ -22,7 +22,7 @@ import android.support.annotation.MainThread; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.android.dialer.common.Assert; -import com.android.dialer.common.ConfigProviderBindings; +import com.android.dialer.configprovider.ConfigProviderBindings; import com.android.dialer.p13n.inference.protocol.P13nRanker; import com.android.dialer.p13n.inference.protocol.P13nRankerFactory; import java.util.List; diff --git a/java/com/android/dialer/performancereport/PerformanceReport.java b/java/com/android/dialer/performancereport/PerformanceReport.java new file mode 100644 index 000000000..27fd7485b --- /dev/null +++ b/java/com/android/dialer/performancereport/PerformanceReport.java @@ -0,0 +1,155 @@ +/* + * 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.performancereport; + +import android.os.SystemClock; +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; +import android.widget.AbsListView; +import com.android.dialer.common.LogUtil; +import com.android.dialer.logging.UiAction; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** Tracks UI performance for a call. */ +public final class PerformanceReport { + + private static final long INVALID_TIME = -1; + private static final long ACTIVE_DURATION = TimeUnit.MINUTES.toMillis(5); + + private static final List actions = new ArrayList<>(); + private static final List actionTimestamps = new ArrayList<>(); + + private static final RecyclerView.OnScrollListener recordOnScrollListener = + new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + if (newState == RecyclerView.SCROLL_STATE_SETTLING) { + PerformanceReport.recordClick(UiAction.Type.SCROLL); + } + super.onScrollStateChanged(recyclerView, newState); + } + }; + + private static boolean recording = false; + private static long appLaunchTimeMillis = INVALID_TIME; + private static long firstClickTimeMillis = INVALID_TIME; + private static long lastActionTimeMillis = INVALID_TIME; + + @Nullable private static UiAction.Type ignoreActionOnce = null; + + private PerformanceReport() {} + + public static void startRecording() { + LogUtil.enterBlock("PerformanceReport.startRecording"); + + appLaunchTimeMillis = SystemClock.elapsedRealtime(); + lastActionTimeMillis = appLaunchTimeMillis; + if (!actions.isEmpty()) { + actions.clear(); + actionTimestamps.clear(); + } + recording = true; + } + + public static void stopRecording() { + LogUtil.enterBlock("PerformanceReport.stopRecording"); + recording = false; + } + + public static void recordClick(UiAction.Type action) { + if (!recording) { + return; + } + + if (action == ignoreActionOnce) { + LogUtil.i("PerformanceReport.recordClick", "%s is ignored", action.toString()); + ignoreActionOnce = null; + return; + } + ignoreActionOnce = null; + + LogUtil.v("PerformanceReport.recordClick", action.toString()); + + // Timeout + long currentTime = SystemClock.elapsedRealtime(); + if (currentTime - lastActionTimeMillis > ACTIVE_DURATION) { + startRecording(); + recordClick(action); + return; + } + + lastActionTimeMillis = currentTime; + if (actions.isEmpty()) { + firstClickTimeMillis = currentTime; + } + actions.add(action); + actionTimestamps.add(currentTime - appLaunchTimeMillis); + } + + public static void recordScrollStateChange(int scrollState) { + if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { + recordClick(UiAction.Type.SCROLL); + } + } + + public static void logOnScrollStateChange(RecyclerView recyclerView) { + // Remove the listener in case it was added before + recyclerView.removeOnScrollListener(recordOnScrollListener); + recyclerView.addOnScrollListener(recordOnScrollListener); + } + + public static boolean isRecording() { + return recording; + } + + public static long getTimeSinceAppLaunch() { + if (appLaunchTimeMillis == INVALID_TIME) { + return INVALID_TIME; + } + return SystemClock.elapsedRealtime() - appLaunchTimeMillis; + } + + public static long getTimeSinceFirstClick() { + if (firstClickTimeMillis == INVALID_TIME) { + return INVALID_TIME; + } + return SystemClock.elapsedRealtime() - firstClickTimeMillis; + } + + public static List getActions() { + return actions; + } + + public static List getActionTimestamps() { + return actionTimestamps; + } + + @Nullable + public static UiAction.Type getIgnoreActionOnce() { + return ignoreActionOnce; + } + + public static void setIgnoreActionOnce(@Nullable UiAction.Type ignoreActionOnce) { + PerformanceReport.ignoreActionOnce = ignoreActionOnce; + LogUtil.i( + "PerformanceReport.setIgnoreActionOnce", + "next action will be ignored once if it is %s", + ignoreActionOnce.toString()); + } +} diff --git a/java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java b/java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java index 2aed9e75e..c398251e4 100644 --- a/java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java +++ b/java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java @@ -49,6 +49,8 @@ public interface CachedNumberLookupService { boolean canReportAsInvalid(ContactSource.Type sourceType, String objectId); + boolean reportAsInvalid(Context context, CachedContactInfo cachedContactInfo); + /** @return return {@link Uri} to the photo or return {@code null} when failing to add photo */ @Nullable Uri addPhoto(Context context, String number, InputStream in); diff --git a/java/com/android/dialer/phonenumbercache/ContactInfo.java b/java/com/android/dialer/phonenumbercache/ContactInfo.java index 5546553f9..aef7374e4 100644 --- a/java/com/android/dialer/phonenumbercache/ContactInfo.java +++ b/java/com/android/dialer/phonenumbercache/ContactInfo.java @@ -17,7 +17,7 @@ package com.android.dialer.phonenumbercache; import android.net.Uri; -import android.support.annotation.Nullable; +import android.support.annotation.NonNull; import android.text.TextUtils; import com.android.contacts.common.ContactsUtils.UserType; import com.android.contacts.common.util.UriUtils; @@ -59,7 +59,7 @@ public class ContactInfo { public boolean isBadData; public String objectId; public @UserType long userType; - public @Nullable ContactSource.Type sourceType = ContactSource.Type.UNKNOWN_SOURCE_TYPE; + public @NonNull ContactSource.Type sourceType = ContactSource.Type.UNKNOWN_SOURCE_TYPE; /** * True if local contact exists. This is only used for Cequint Caller ID so it won't overwrite * photo if local contact exists. diff --git a/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java b/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java index bd4ba9764..4fa3147eb 100644 --- a/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java +++ b/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java @@ -203,6 +203,7 @@ public class ContactInfoHelper { return info; } + @Nullable public ContactInfo lookupNumber(String number, String countryIso) { return lookupNumber(number, countryIso, -1); } @@ -223,12 +224,14 @@ public class ContactInfoHelper { @SuppressWarnings("ReferenceEquality") public ContactInfo lookupNumber(String number, String countryIso, long directoryId) { if (TextUtils.isEmpty(number)) { + LogUtil.d("ContactInfoHelper.lookupNumber", "number is empty"); return null; } ContactInfo info; if (PhoneNumberHelper.isUriNumber(number)) { + LogUtil.d("ContactInfoHelper.lookupNumber", "number is sip"); // The number is a SIP address.. info = lookupContactFromUri(getContactInfoLookupUri(number, directoryId)); if (info == null || info == ContactInfo.EMPTY) { @@ -246,6 +249,7 @@ public class ContactInfoHelper { final ContactInfo updatedInfo; if (info == null) { // The lookup failed. + LogUtil.d("ContactInfoHelper.lookupNumber", "lookup failed"); updatedInfo = null; } else { // If we did not find a matching contact, generate an empty contact info for the number. @@ -325,9 +329,11 @@ public class ContactInfoHelper { */ ContactInfo lookupContactFromUri(Uri uri) { if (uri == null) { + LogUtil.d("ContactInfoHelper.lookupContactFromUri", "uri is null"); return null; } if (!PermissionsUtil.hasContactsReadPermissions(mContext)) { + LogUtil.d("ContactInfoHelper.lookupContactFromUri", "no contact permission, return empty"); return ContactInfo.EMPTY; } @@ -336,10 +342,12 @@ public class ContactInfoHelper { String[] projection = PhoneQuery.getPhoneLookupProjection(uri); phoneLookupCursor = mContext.getContentResolver().query(uri, projection, null, null, null); } catch (NullPointerException e) { + LogUtil.e("ContactInfoHelper.lookupContactFromUri", "phone lookup", e); // Trap NPE from pre-N CP2 return null; } if (phoneLookupCursor == null) { + LogUtil.d("ContactInfoHelper.lookupContactFromUri", "phoneLookupCursor is null"); return null; } @@ -408,19 +416,32 @@ public class ContactInfoHelper { private ContactInfo queryContactInfoForPhoneNumber( String number, String countryIso, long directoryId) { if (TextUtils.isEmpty(number)) { + LogUtil.d("ContactInfoHelper.queryContactInfoForPhoneNumber", "number is empty"); return null; } ContactInfo info = lookupContactFromUri(getContactInfoLookupUri(number, directoryId)); + if (info == null) { + LogUtil.d("ContactInfoHelper.queryContactInfoForPhoneNumber", "info looked up is null"); + } if (info != null && info != ContactInfo.EMPTY) { info.formattedNumber = formatPhoneNumber(number, null, countryIso); + if (directoryId == -1) { + // Contact found in the default directory + info.sourceType = ContactSource.Type.SOURCE_TYPE_DIRECTORY; + } else { + // Contact found in the extended directory specified by directoryId + info.sourceType = ContactSource.Type.SOURCE_TYPE_EXTENDED; + } } else if (mCachedNumberLookupService != null) { CachedContactInfo cacheInfo = mCachedNumberLookupService.lookupCachedContactFromNumber(mContext, number); if (cacheInfo != null) { - info = cacheInfo.getContactInfo().isBadData ? null : cacheInfo.getContactInfo(); - } else { - info = null; + if (!cacheInfo.getContactInfo().isBadData) { + info = cacheInfo.getContactInfo(); + } else { + LogUtil.i("ContactInfoHelper.queryContactInfoForPhoneNumber", "info is bad data"); + } } } return info; @@ -601,13 +622,17 @@ public class ContactInfoHelper { * will be updated if available. */ @WorkerThread - public void updateFromCequintCallerId(ContactInfo info, String number) { + public void updateFromCequintCallerId( + @Nullable CequintCallerIdManager cequintCallerIdManager, ContactInfo info, String number) { Assert.isWorkerThread(); if (!CequintCallerIdManager.isCequintCallerIdEnabled(mContext)) { return; } + if (cequintCallerIdManager == null) { + return; + } CequintCallerIdContact cequintCallerIdContact = - CequintCallerIdManager.getCequintCallerIdContact(mContext, number); + cequintCallerIdManager.getCequintCallerIdContact(mContext, number); if (cequintCallerIdContact == null) { return; } diff --git a/java/com/android/dialer/phonenumberproto/Converter.java b/java/com/android/dialer/phonenumberproto/Converter.java new file mode 100644 index 000000000..453b98844 --- /dev/null +++ b/java/com/android/dialer/phonenumberproto/Converter.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.phonenumberproto; + +import com.android.dialer.DialerInternalPhoneNumber; +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; + +/** + * Methods for converting from {@link PhoneNumber} POJOs to {@link DialerInternalPhoneNumber} protos + * and back. + */ +class Converter { + + static DialerInternalPhoneNumber pojoToProto(PhoneNumber pojo) { + DialerInternalPhoneNumber.Builder proto = DialerInternalPhoneNumber.newBuilder(); + if (pojo.hasCountryCode()) { + proto.setCountryCode(pojo.getCountryCode()); + } + if (pojo.hasCountryCodeSource()) { + switch (pojo.getCountryCodeSource()) { + case FROM_NUMBER_WITH_PLUS_SIGN: + proto.setCountryCodeSource( + DialerInternalPhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN); + break; + case FROM_NUMBER_WITH_IDD: + proto.setCountryCodeSource( + DialerInternalPhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_IDD); + break; + case FROM_NUMBER_WITHOUT_PLUS_SIGN: + proto.setCountryCodeSource( + DialerInternalPhoneNumber.CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN); + break; + case FROM_DEFAULT_COUNTRY: + proto.setCountryCodeSource( + DialerInternalPhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY); + break; + default: + throw new IllegalArgumentException( + "unsupported country code source: " + pojo.getCountryCodeSource()); + } + } + if (pojo.hasExtension()) { + proto.setExtension(pojo.getExtension()); + } + if (pojo.hasItalianLeadingZero()) { + proto.setItalianLeadingZero(pojo.isItalianLeadingZero()); + } + if (pojo.hasNationalNumber()) { + proto.setNationalNumber(pojo.getNationalNumber()); + } + if (pojo.hasNumberOfLeadingZeros()) { + proto.setNumberOfLeadingZeros(pojo.getNumberOfLeadingZeros()); + } + if (pojo.hasPreferredDomesticCarrierCode()) { + proto.setPreferredDomesticCarrierCode(pojo.getPreferredDomesticCarrierCode()); + } + if (pojo.hasRawInput()) { + proto.setRawInput(pojo.getRawInput()); + } + return proto.build(); + } + + static PhoneNumber protoToPojo(DialerInternalPhoneNumber proto) { + PhoneNumber pojo = new PhoneNumber(); + if (proto.hasCountryCode()) { + pojo.setCountryCode(proto.getCountryCode()); + } + if (proto.hasCountryCodeSource()) { + switch (proto.getCountryCodeSource()) { + case FROM_NUMBER_WITH_PLUS_SIGN: + pojo.setCountryCodeSource(PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN); + break; + case FROM_NUMBER_WITH_IDD: + pojo.setCountryCodeSource(PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_IDD); + break; + case FROM_NUMBER_WITHOUT_PLUS_SIGN: + pojo.setCountryCodeSource(PhoneNumber.CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN); + break; + case FROM_DEFAULT_COUNTRY: + pojo.setCountryCodeSource(PhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY); + break; + default: + throw new IllegalArgumentException( + "unsupported country code source: " + proto.getCountryCodeSource()); + } + } + if (proto.hasExtension()) { + pojo.setExtension(proto.getExtension()); + } + if (proto.hasItalianLeadingZero()) { + pojo.setItalianLeadingZero(proto.getItalianLeadingZero()); + } + if (proto.hasNationalNumber()) { + pojo.setNationalNumber(proto.getNationalNumber()); + } + if (proto.hasNumberOfLeadingZeros()) { + pojo.setNumberOfLeadingZeros(proto.getNumberOfLeadingZeros()); + } + if (proto.hasPreferredDomesticCarrierCode()) { + pojo.setPreferredDomesticCarrierCode(proto.getPreferredDomesticCarrierCode()); + } + if (proto.hasRawInput()) { + pojo.setRawInput(proto.getRawInput()); + } + return pojo; + } +} diff --git a/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java b/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java new file mode 100644 index 000000000..cc509f41b --- /dev/null +++ b/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java @@ -0,0 +1,108 @@ +/* + * 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.phonenumberproto; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.WorkerThread; +import com.android.dialer.DialerInternalPhoneNumber; +import com.android.dialer.DialerPhoneNumber; +import com.android.dialer.DialerPhoneNumber.RawInput; +import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.google.i18n.phonenumbers.NumberParseException; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.PhoneNumberUtil.MatchType; + +/** + * Wrapper for selected methods in {@link PhoneNumberUtil} which uses the {@link DialerPhoneNumber} + * lite proto instead of the {@link com.google.i18n.phonenumbers.Phonenumber.PhoneNumber} POJO. + * + *

      All methods should be called on a worker thread. + */ +public class DialerPhoneNumberUtil { + private final PhoneNumberUtil phoneNumberUtil; + + @WorkerThread + public DialerPhoneNumberUtil(@NonNull PhoneNumberUtil phoneNumberUtil) { + Assert.isWorkerThread(); + this.phoneNumberUtil = Assert.isNotNull(phoneNumberUtil); + } + + /** + * Parses the provided raw phone number into a {@link DialerPhoneNumber}. + * + * @see PhoneNumberUtil#parse(String, String) + */ + @WorkerThread + public DialerPhoneNumber parse(@Nullable String numberToParse, @Nullable String defaultRegion) { + Assert.isWorkerThread(); + + DialerPhoneNumber.Builder dialerPhoneNumber = DialerPhoneNumber.newBuilder(); + RawInput.Builder rawInput = RawInput.newBuilder(); + // Numbers can be null or empty for incoming "unknown" calls. + if (numberToParse != null) { + rawInput.setNumber(numberToParse); + } + if (defaultRegion != null) { + rawInput.setCountryIso(defaultRegion); + } + dialerPhoneNumber.setRawInput(rawInput.build()); + + try { + dialerPhoneNumber.setDialerInternalPhoneNumber( + Converter.pojoToProto(phoneNumberUtil.parse(numberToParse, defaultRegion))); + } catch (NumberParseException e) { + LogUtil.w("DialerPhoneNumberUtil.parse", "couldn't parse phone number", e); + } + return dialerPhoneNumber.build(); + } + + /** + * Returns true if the two numbers were parseable by libphonenumber and are an {@link + * MatchType#EXACT_MATCH} or if they have the same raw input. + */ + @WorkerThread + public boolean isExactMatch( + @NonNull DialerPhoneNumber firstNumberIn, @NonNull DialerPhoneNumber secondNumberIn) { + Assert.isWorkerThread(); + if (!Assert.isNotNull(firstNumberIn).hasDialerInternalPhoneNumber() + || !Assert.isNotNull(secondNumberIn).hasDialerInternalPhoneNumber()) { + return firstNumberIn.getRawInput().equals(secondNumberIn.getRawInput()); + } + return isNumberMatch( + firstNumberIn.getDialerInternalPhoneNumber(), + secondNumberIn.getDialerInternalPhoneNumber()) + == MatchType.EXACT_MATCH; + } + + /** + * Compares the provided phone numbers. + * + * @see PhoneNumberUtil#isNumberMatch(com.google.i18n.phonenumbers.Phonenumber.PhoneNumber, + * com.google.i18n.phonenumbers.Phonenumber.PhoneNumber) + */ + @WorkerThread + private MatchType isNumberMatch( + @NonNull DialerInternalPhoneNumber firstNumberIn, + @NonNull DialerInternalPhoneNumber secondNumberIn) { + Assert.isWorkerThread(); + return phoneNumberUtil.isNumberMatch( + Converter.protoToPojo(Assert.isNotNull(firstNumberIn)), + Converter.protoToPojo(Assert.isNotNull(secondNumberIn))); + } +} diff --git a/java/com/android/dialer/phonenumberproto/dialer_phone_number.proto b/java/com/android/dialer/phonenumberproto/dialer_phone_number.proto new file mode 100644 index 000000000..a0f362631 --- /dev/null +++ b/java/com/android/dialer/phonenumberproto/dialer_phone_number.proto @@ -0,0 +1,172 @@ +// 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 + +syntax = "proto2"; + +option java_package = "com.android.dialer"; +option java_multiple_files = true; +option optimize_for = LITE_RUNTIME; + +package com.android.dialer; + +// A phone number for use in the dialer application. It consists of a +// DialerInternalPhoneNumber, which is a copy of libphonenumber's PhoneNumber +// proto, and the raw input used to create it. +message DialerPhoneNumber { + // libphonenumber representation of the phone number. May be empty if the raw + // input failed to parse, in which case raw_input should be used. + optional DialerInternalPhoneNumber dialer_internal_phone_number = 1; + + // The raw input which was used to create a DialerPhoneNumber. + message RawInput { + // The phone number as it was entered or received. + optional string number = 1; + // The ISO 3166-1 two letter country code of the country where the user made + // or received the call. + optional string country_iso = 2; + } + // Prefer to use dialer_internal_phone_number if present. + optional RawInput raw_input = 2; +} + +// This is a copy of libphonenumber proto file for use in the dialer codebase. +// We cannot depend on the real libphonenumber proto because it is not exposed +// in any open source library. As such, this file could fall out of sync with +// that proto over time. +// +// The only difference between this proto and the libphonenumber proto (as of +// when this file was created) is the package name and proto name. +// +// If the libphonenumber proto becomes accessible some day, it may be possible +// to remove this proto and use the real libphonenumber proto assuming this +// proto is kept wire-compatible with it. +message DialerInternalPhoneNumber { + // The country calling code for this number, as defined by the International + // Telecommunication Union (ITU). For example, this would be 1 for NANPA + // countries, and 33 for France. + required int32 country_code = 1; + + // The National (significant) Number, as defined in International + // Telecommunication Union (ITU) Recommendation E.164, without any leading + // zero. The leading-zero is stored separately if required, since this is an + // uint64 and hence cannot store such information. Do not use this field + // directly: if you want the national significant number, call the + // getNationalSignificantNumber method of PhoneNumberUtil. + // + // For countries which have the concept of an "area code" or "national + // destination code", this is included in the National (significant) Number. + // Although the ITU says the maximum length should be 15, we have found longer + // numbers in some countries e.g. Germany. + // Note that the National (significant) Number does not contain the National + // (trunk) prefix. Obviously, as a uint64, it will never contain any + // formatting (hyphens, spaces, parentheses), nor any alphanumeric spellings. + required uint64 national_number = 2 [jstype = JS_NUMBER]; + + // Extension is not standardized in ITU recommendations, except for being + // defined as a series of numbers with a maximum length of 40 digits. It is + // defined as a string here to accommodate for the possible use of a leading + // zero in the extension (organizations have complete freedom to do so, as + // there is no standard defined). Other than digits, some other dialling + // characters such as "," (indicating a wait) may be stored here. + optional string extension = 3; + + // In some countries, the national (significant) number starts with one or + // more "0"s without this being a national prefix or trunk code of some kind. + // For example, the leading zero in the national (significant) number of an + // Italian phone number indicates the number is a fixed-line number. There + // have been plans to migrate fixed-line numbers to start with the digit two + // since December 2000, but it has not happened yet. See + // http://en.wikipedia.org/wiki/%2B39 for more details. + // + // These fields can be safely ignored (there is no need to set them) for most + // countries. Some limited number of countries behave like Italy - for these + // cases, if the leading zero(s) of a number would be retained even when + // dialling internationally, set this flag to true, and also set the number of + // leading zeros. + // + // Clients who use the parsing or conversion functionality of the i18n phone + // number libraries (go/phonenumbers) will have these fields set if necessary + // automatically. + optional bool italian_leading_zero = 4; + optional int32 number_of_leading_zeros = 8 [default = 1]; + + // The next few fields are non-essential fields for a phone number. They + // retain extra information about the form the phone number was in when it was + // provided to us to parse. They can be safely ignored by most clients. To + // populate them, call parseAndKeepRawInput on PhoneNumberUtil. + + // This field is used to store the raw input string containing phone numbers + // before it was canonicalized by the library. For example, it could be used + // to store alphanumerical numbers such as "1-800-GOOG-411". + optional string raw_input = 5; + + // The source from which the country_code is derived. This is not set in the + // general parsing method, but in the method that parses and keeps raw_input. + // New fields could be added upon request. + enum CountryCodeSource { + // The country_code is derived based on a phone number with a leading "+", + // e.g. the French number "+33 1 42 68 53 00". + FROM_NUMBER_WITH_PLUS_SIGN = 1; + + // The country_code is derived based on a phone number with a leading IDD, + // e.g. the French number "011 33 1 42 68 53 00", as it is dialled from US. + FROM_NUMBER_WITH_IDD = 5; + + // The country_code is derived based on a phone number without a leading + // "+", e.g. the French number "33 1 42 68 53 00" when defaultCountry is + // supplied as France. + FROM_NUMBER_WITHOUT_PLUS_SIGN = 10; + + // The country_code is derived NOT based on the phone number itself, but + // from the defaultCountry parameter provided in the parsing function by the + // clients. This happens mostly for numbers written in the national format + // (without country code). For example, this would be set when parsing the + // French number "01 42 68 53 00", when defaultCountry is supplied as + // France. + FROM_DEFAULT_COUNTRY = 20; + } + + // The source from which the country_code is derived. + optional CountryCodeSource country_code_source = 6; + + // The carrier selection code that is preferred when calling this phone number + // domestically. This also includes codes that need to be dialed in some + // countries when calling from landlines to mobiles or vice versa. For + // example, in Columbia, a "3" needs to be dialed before the phone number + // itself when calling from a mobile phone to a domestic landline phone and + // vice versa. + // + // Note this is the "preferred" code, which means other codes may work as + // well. + optional string preferred_domestic_carrier_code = 7; +} + +// Examples: +// +// Google MTV, +1 650-253-0000, (650) 253-0000 +// country_code: 1 +// national_number: 6502530000 +// +// Google Paris, +33 (0)1 42 68 53 00, 01 42 68 53 00 +// country_code: 33 +// national_number: 142685300 +// +// Google Beijing, +86-10-62503000, (010) 62503000 +// country_code: 86 +// national_number: 1062503000 +// +// Google Italy, +39 02-36618 300, 02-36618 300 +// country_code: 39 +// national_number: 236618300 +// italian_leading_zero: true \ No newline at end of file diff --git a/java/com/android/dialer/postcall/AndroidManifest.xml b/java/com/android/dialer/postcall/AndroidManifest.xml index 79ca5d5eb..22c77dd93 100644 --- a/java/com/android/dialer/postcall/AndroidManifest.xml +++ b/java/com/android/dialer/postcall/AndroidManifest.xml @@ -21,7 +21,7 @@ diff --git a/java/com/android/dialer/postcall/PostCall.java b/java/com/android/dialer/postcall/PostCall.java index 586b47395..b17a9b66d 100644 --- a/java/com/android/dialer/postcall/PostCall.java +++ b/java/com/android/dialer/postcall/PostCall.java @@ -26,24 +26,23 @@ import android.support.design.widget.Snackbar; import android.telephony.TelephonyManager; import android.view.View; import android.view.View.OnClickListener; -import com.android.dialer.buildtype.BuildType; -import com.android.dialer.common.Assert; -import com.android.dialer.common.ConfigProvider; -import com.android.dialer.common.ConfigProviderBindings; import com.android.dialer.common.LogUtil; +import com.android.dialer.configprovider.ConfigProvider; +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.logging.DialerImpression; import com.android.dialer.logging.Logger; +import com.android.dialer.performancereport.PerformanceReport; import com.android.dialer.util.DialerUtils; import com.android.dialer.util.IntentUtil; /** Helper class to handle all post call actions. */ public class PostCall { - private static final String KEY_POST_CALL_CALL_CONNECT_TIME = "post_call_call_connect_time"; private static final String KEY_POST_CALL_CALL_DISCONNECT_TIME = "post_call_call_disconnect_time"; + private static final String KEY_POST_CALL_CALL_CONNECT_TIME = "post_call_call_connect_time"; private static final String KEY_POST_CALL_CALL_NUMBER = "post_call_call_number"; private static final String KEY_POST_CALL_MESSAGE_SENT = "post_call_message_sent"; @@ -55,6 +54,8 @@ public class PostCall { promptUserToViewSentMessage(activity, rootView); } else if (shouldPromptUserToSendMessage(activity)) { promptUserToSendMessage(activity, rootView); + } else { + clear(activity); } } } @@ -160,6 +161,19 @@ public class PostCall { .apply(); } + /** + * Restart performance recording if there is a recent call (disconnect time to now is under + * threshold) + */ + public static void restartPerformanceRecordingIfARecentCallExist(Context context) { + long disconnectTimeMillis = + DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context) + .getLong(PostCall.KEY_POST_CALL_CALL_DISCONNECT_TIME, -1); + if (disconnectTimeMillis != -1 && PerformanceReport.isRecording()) { + PerformanceReport.startRecording(); + } + } + private static void clear(Context context) { activeSnackbar = null; @@ -203,19 +217,7 @@ public class PostCall { } private static boolean isEnabled(Context context) { - @BuildType.Type int type = BuildType.get(); - switch (type) { - case BuildType.BUGFOOD: - case BuildType.DOGFOOD: - case BuildType.FISHFOOD: - case BuildType.TEST: - return ConfigProviderBindings.get(context).getBoolean("enable_post_call", true); - case BuildType.RELEASE: - return ConfigProviderBindings.get(context).getBoolean("enable_post_call_prod", true); - default: - Assert.fail(); - return false; - } + return ConfigProviderBindings.get(context).getBoolean("enable_post_call_prod", true); } private static boolean isSimReady(Context context) { diff --git a/java/com/android/dialer/protos/ProtoParsers.java b/java/com/android/dialer/protos/ProtoParsers.java index b77c0699b..5a60799bc 100644 --- a/java/com/android/dialer/protos/ProtoParsers.java +++ b/java/com/android/dialer/protos/ProtoParsers.java @@ -18,13 +18,10 @@ package com.android.dialer.protos; import android.content.Intent; import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; +import android.support.annotation.NonNull; import com.android.dialer.common.Assert; -import com.google.protobuf.CodedOutputStream; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.MessageLite; -import java.io.IOException; /** Useful methods for using Protocol Buffers with Android. */ public final class ProtoParsers { @@ -35,11 +32,8 @@ public final class ProtoParsers { @SuppressWarnings("unchecked") // We want to eventually optimize away parser classes, so cast public static T get(Bundle bundle, String key, T defaultInstance) throws InvalidProtocolBufferException { - // Class loaders are unique to each Class instance, so we need to specify how to decode - // the information again, even though we set the class loaders when serializing the data. - bundle.setClassLoader(ProtoParsers.class.getClassLoader()); - InternalDontUse parcelable = bundle.getParcelable(key); - return (T) parcelable.getMessageUnsafe(defaultInstance.getDefaultInstanceForType()); + byte[] bytes = bundle.getByteArray(key); + return (T) mergeFrom(bytes, defaultInstance.getDefaultInstanceForType()); } /** @@ -51,7 +45,7 @@ public final class ProtoParsers { try { return get(bundle, key, defaultInstance); } catch (InvalidProtocolBufferException e) { - throw new RuntimeException(e); + throw Assert.createIllegalStateFailException(e.toString()); } } @@ -68,121 +62,28 @@ public final class ProtoParsers { * Stores a proto in a Bundle, for later retrieval by {@link #get(Bundle, String, MessageLite)} or * {@link #getFromInstanceState(Bundle, String, MessageLite)}. */ - public static void put(Bundle bundle, String key, MessageLite message) { - bundle.putParcelable(key, new InternalDontUse<>(null, message)); + public static void put( + @NonNull Bundle bundle, @NonNull String key, @NonNull MessageLite message) { + Assert.checkState(message != null); + bundle.putByteArray(key, message.toByteArray()); } /** * Stores a proto in an Intent, for later retrieval by {@link #get(Bundle, String, MessageLite)}. * Needs separate method because Intent has similar to but different API than Bundle. */ - public static void put(Intent intent, String key, MessageLite message) { - intent.putExtra(key, new InternalDontUse<>(null, message)); - } - - /** Returns a {@linkplain Parcelable} representation of this protobuf message. */ - public static ParcelableProto asParcelable(T message) { - return new InternalDontUse<>(null, message); - } - - /** - * A protobuf message that can be stored in a {@link Parcel}. - * - *

      Note: This Parcelable can only be used in single app. Attempting to send - * it to another app through an Intent will result in an exception due to Proguard - * obfusation when the target application attempts to load the ParcelableProto class. - */ - public interface ParcelableProto extends Parcelable { - /** - * @throws IllegalStateException if the parceled data does not correspond to the defaultInstance - * type. - */ - T getMessage(T defaultInstance); - } - - /** Public because of Parcelable requirements. Do not use. */ - public static final class InternalDontUse implements ParcelableProto { - /* One of these two fields is always populated - since the bytes field never escapes this - * object, there is no risk of concurrent modification by multiple threads, and volatile - * is sufficient to be thread-safe. */ - private volatile byte[] bytes; - private volatile T message; - - /** - * Ideally, we would have type safety here. However, a static field {@link Creator} is required - * by {@link Parcelable}. Static fields are inherently not type safe, since only 1 exists per - * class (rather than 1 per type). - */ - public static final Parcelable.Creator> CREATOR = - new Creator>() { - @Override - public InternalDontUse createFromParcel(Parcel parcel) { - int serializedSize = parcel.readInt(); - byte[] array = new byte[serializedSize]; - parcel.readByteArray(array); - return new InternalDontUse<>(array, null); - } - - @Override - public InternalDontUse[] newArray(int i) { - return new InternalDontUse[i]; - } - }; - - private InternalDontUse(byte[] bytes, T message) { - Assert.checkArgument(bytes != null || message != null, "Must have a message or bytes"); - this.bytes = bytes; - this.message = message; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel parcel, int i) { - if (bytes == null) { - final byte[] flatArray = new byte[message.getSerializedSize()]; - try { - message.writeTo(CodedOutputStream.newInstance(flatArray)); - bytes = flatArray; - } catch (IOException impossible) { - throw new AssertionError(impossible); - } - } - parcel.writeInt(bytes.length); - parcel.writeByteArray(bytes); - } - - @Override - public T getMessage(T defaultInstance) { - try { - // The proto should never be invalid if it came from our application, so if it is, throw. - return getMessageUnsafe(defaultInstance); - } catch (InvalidProtocolBufferException e) { - throw new IllegalStateException(e); - } - } - - @SuppressWarnings("unchecked") // We're being deserialized, so there's no real type safety - T getMessageUnsafe(T defaultInstance) throws InvalidProtocolBufferException { - // There's a risk that we'll double-parse the bytes, but that's OK, because it'll end up - // as the same immutable object anyway. - if (message == null) { - message = (T) defaultInstance.toBuilder().mergeFrom(bytes).build(); - } - return message; - } + public static void put(@NonNull Intent intent, @NonNull String key, MessageLite message) { + Assert.checkState(message != null); + intent.putExtra(key, message.toByteArray()); } /** Parses a proto, throwing parser errors as runtime exceptions. */ @SuppressWarnings("unchecked") // We want to eventually optimize away parser classes - public static T mergeFrom(byte[] bytes, T defaultInstance) { + private static T mergeFrom(byte[] bytes, T defaultInstance) { try { return (T) defaultInstance.toBuilder().mergeFrom(bytes).build(); } catch (InvalidProtocolBufferException e) { - throw new RuntimeException(e); + throw Assert.createIllegalStateFailException(e.toString()); } } } diff --git a/java/com/android/dialer/searchfragment/README.md b/java/com/android/dialer/searchfragment/README.md new file mode 100644 index 000000000..b3b9135e5 --- /dev/null +++ b/java/com/android/dialer/searchfragment/README.md @@ -0,0 +1,62 @@ +# Dialer Search Ui + +searchfragment/ contains all code relevant to loading, rendering and filtering +search results in both dialpad search and regular search. + +## Loading + +### On Device Contacts + +On device contacts loading happens in SearchContactsCursorLoader. It is used in +conjunction with NewSearchFragment and Loader Callbacks to return a cursor from +cp2 containing all of the relevant info needed to rendering. + +### Business Search + +// TODO(calderwoodra) + +### Google Directory Search + +// TODO(calderwoodra) + +## Rendering + +NewSearchFragment, SearchAdapter, SearchContactViewHolder and +SearchCursorManager are used to render contact information. The fragment's +recyclerview, adapter and viewholder work as expected like a normal recyclerview +paradigm. + +The are three things to note about rendering: + +* There are three data sources rendered: On device contacts, business search + results and google directory results. +* SearchContactsCursorLoader returns its cursor from cp2 and we filter/wrap it + with SearchContactCursor to render useful results (see below). +* SearchCursorManager is used to coalesce all three data sources to help with + determining row count, row type and returning the correct data source for + each position. + +## Filtering + +On device contacts are filtered using SearchContactCursor. We wrap the cursor +returned from SearchContactsCursorLoader in NewSearchFragment#onLoadFinished in +order to abstract away the filtering logic from the recyclerview adapter and +viewholders. + +SearchContactCursor applies filtering in SearchContactCursor#filter to remove +duplicate phone numbers returned from cp2 and phone numbers that do not match +the given search query. + +Filtering methods used are: + +* T9/dialpad search methods + * Initial match (957 matches [W]illiam [J]ohn [S]mith) + * Number + name match (1800946 matches [1800-Win]-A-Prize) +* Numeric/dialpad search methods + * Simple number match (510333 matches [510-333]-7596) + * Country-code agnostic matching for E164 normalized numbers (9177 matches + +65[9177]6930) + * Country-code agnostic matching (510333 matches 1-[510-333]-7596) + * Area-code agnostic matching (333 matches 510-[333]-7596) +* Name/keyboard search methods: + * Simple name match (564 matches [Joh]n) diff --git a/java/com/android/dialer/searchfragment/common/AndroidManifest.xml b/java/com/android/dialer/searchfragment/common/AndroidManifest.xml new file mode 100644 index 000000000..178cd83c3 --- /dev/null +++ b/java/com/android/dialer/searchfragment/common/AndroidManifest.xml @@ -0,0 +1,16 @@ + + \ No newline at end of file diff --git a/java/com/android/dialer/searchfragment/common/Projections.java b/java/com/android/dialer/searchfragment/common/Projections.java new file mode 100644 index 000000000..37e20d195 --- /dev/null +++ b/java/com/android/dialer/searchfragment/common/Projections.java @@ -0,0 +1,50 @@ +/* + * 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.searchfragment.common; + +import android.provider.ContactsContract.CommonDataKinds.Phone; + +/** Class containing relevant projections for searching contacts. */ +public class Projections { + + public static final int PHONE_ID = 0; + public static final int PHONE_TYPE = 1; + public static final int PHONE_LABEL = 2; + public static final int PHONE_NUMBER = 3; + public static final int PHONE_DISPLAY_NAME = 4; + public static final int PHONE_PHOTO_ID = 5; + public static final int PHONE_PHOTO_URI = 6; + public static final int PHONE_LOOKUP_KEY = 7; + public static final int PHONE_CARRIER_PRESENCE = 8; + + @SuppressWarnings("unused") + public static final int PHONE_SORT_KEY = 9; + + public static final String[] PHONE_PROJECTION = + new String[] { + Phone._ID, // 0 + Phone.TYPE, // 1 + Phone.LABEL, // 2 + Phone.NUMBER, // 3 + Phone.DISPLAY_NAME_PRIMARY, // 4 + Phone.PHOTO_ID, // 5 + Phone.PHOTO_THUMBNAIL_URI, // 6 + Phone.LOOKUP_KEY, // 7 + Phone.CARRIER_PRESENCE, // 8 + Phone.SORT_KEY_PRIMARY // 9 + }; +} diff --git a/java/com/android/dialer/searchfragment/common/QueryBoldingUtil.java b/java/com/android/dialer/searchfragment/common/QueryBoldingUtil.java new file mode 100644 index 000000000..7bdd69567 --- /dev/null +++ b/java/com/android/dialer/searchfragment/common/QueryBoldingUtil.java @@ -0,0 +1,154 @@ +/* + * 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.searchfragment.common; + +import android.graphics.Typeface; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.StyleSpan; + +/** Utility class for handling bolding queries contained in string. */ +public class QueryBoldingUtil { + + /** + * Compares a name and query and returns a {@link CharSequence} with bolded characters. + * + *

      Some example: + * + *

        + *
      • "query" would bold "John [query] Smith" + *
      • "222" would bold "[AAA] Mom" + *
      • "222" would bold "[A]llen [A]lex [A]aron" + *
      + * + * @param query containing any characters + * @param name of a contact/string that query will compare to + * @return name with query bolded if query can be found in the name. + */ + public static CharSequence getNameWithQueryBolded(@Nullable String query, @NonNull String name) { + if (TextUtils.isEmpty(query)) { + return name; + } + + int index = -1; + int numberOfBoldedCharacters = 0; + + if (QueryFilteringUtil.nameMatchesT9Query(query, name)) { + // Bold the characters that match the t9 query + String t9 = QueryFilteringUtil.getT9Representation(name); + index = QueryFilteringUtil.indexOfQueryNonDigitsIgnored(query, t9); + if (index == -1) { + return getNameWithInitialsBolded(query, name); + } + numberOfBoldedCharacters = query.length(); + + for (int i = 0; i < query.length(); i++) { + char c = query.charAt(i); + if (!Character.isDigit(c)) { + numberOfBoldedCharacters--; + } + } + + for (int i = 0; i < index + numberOfBoldedCharacters; i++) { + if (!Character.isLetterOrDigit(name.charAt(i))) { + if (i < index) { + index++; + } else { + numberOfBoldedCharacters++; + } + } + } + } + + if (index == -1) { + // Bold the query as an exact match in the name + index = name.toLowerCase().indexOf(query); + numberOfBoldedCharacters = query.length(); + } + + return index == -1 ? name : getBoldedString(name, index, numberOfBoldedCharacters); + } + + private static CharSequence getNameWithInitialsBolded(String query, String name) { + SpannableString boldedInitials = new SpannableString(name); + name = name.toLowerCase(); + int initialsBolded = 0; + int nameIndex = -1; + + while (++nameIndex < name.length() && initialsBolded < query.length()) { + if ((nameIndex == 0 || name.charAt(nameIndex - 1) == ' ') + && QueryFilteringUtil.getDigit(name.charAt(nameIndex)) == query.charAt(initialsBolded)) { + boldedInitials.setSpan( + new StyleSpan(Typeface.BOLD), + nameIndex, + nameIndex + 1, + Spanned.SPAN_INCLUSIVE_INCLUSIVE); + initialsBolded++; + } + } + return boldedInitials; + } + + /** + * Compares a number and a query and returns a {@link CharSequence} with bolded characters. + * + *
        + *
      • "123" would bold "(650)34[1-23]24" + *
      • "123" would bold "+1([123])111-2222 + *
      + * + * @param query containing only numbers and phone number related characters "(", ")", "-", "+" + * @param number phone number of a contact that the query will compare to. + * @return number with query bolded if query can be found in the number. + */ + public static CharSequence getNumberWithQueryBolded( + @Nullable String query, @NonNull String number) { + if (TextUtils.isEmpty(query) || !QueryFilteringUtil.numberMatchesNumberQuery(query, number)) { + return number; + } + + int index = QueryFilteringUtil.indexOfQueryNonDigitsIgnored(query, number); + int boldedCharacters = query.length(); + + for (char c : query.toCharArray()) { + if (!Character.isDigit(c)) { + boldedCharacters--; + } + } + + for (int i = 0; i < index + boldedCharacters; i++) { + if (!Character.isDigit(number.charAt(i))) { + if (i <= index) { + index++; + } else { + boldedCharacters++; + } + } + } + return getBoldedString(number, index, boldedCharacters); + } + + private static SpannableString getBoldedString(String s, int index, int numBolded) { + SpannableString span = new SpannableString(s); + span.setSpan( + new StyleSpan(Typeface.BOLD), index, index + numBolded, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + return span; + } +} diff --git a/java/com/android/dialer/searchfragment/common/QueryFilteringUtil.java b/java/com/android/dialer/searchfragment/common/QueryFilteringUtil.java new file mode 100644 index 000000000..b23315b15 --- /dev/null +++ b/java/com/android/dialer/searchfragment/common/QueryFilteringUtil.java @@ -0,0 +1,141 @@ +/* + * 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.searchfragment.common; + +import android.support.annotation.NonNull; +import android.telephony.PhoneNumberUtils; +import android.text.TextUtils; +import java.util.regex.Pattern; + +/** Utility class for filtering, comparing and handling strings and queries. */ +public class QueryFilteringUtil { + + /** Matches strings with "-", "(", ")", 2-9 of at least length one. */ + static final Pattern T9_PATTERN = Pattern.compile("[\\-()2-9]+"); + + /** + * @return true if the query is of T9 format and the name's T9 representation belongs to the + * query; false otherwise. + */ + public static boolean nameMatchesT9Query(String query, String name) { + if (!T9_PATTERN.matcher(query).matches()) { + return false; + } + + // Substring + if (indexOfQueryNonDigitsIgnored(query, getT9Representation(name)) != -1) { + return true; + } + + // Check matches initials + // TODO investigate faster implementation + query = digitsOnly(query); + int queryIndex = 0; + + String[] names = name.toLowerCase().split("\\s"); + for (int i = 0; i < names.length && queryIndex < query.length(); i++) { + if (TextUtils.isEmpty(names[i])) { + continue; + } + + if (getDigit(names[i].charAt(0)) == query.charAt(queryIndex)) { + queryIndex++; + } + } + + return queryIndex == query.length(); + } + + /** @return true if the number belongs to the query. */ + public static boolean numberMatchesNumberQuery(String query, String number) { + return PhoneNumberUtils.isGlobalPhoneNumber(query) + && indexOfQueryNonDigitsIgnored(query, number) != -1; + } + + /** + * Checks if query is contained in number while ignoring all characters in both that are not + * digits (i.e. {@link Character#isDigit(char)} returns false). + * + * @return index where query is found with all non-digits removed, -1 if it's not found. + */ + static int indexOfQueryNonDigitsIgnored(@NonNull String query, @NonNull String number) { + return digitsOnly(number).indexOf(digitsOnly(query)); + } + + // Returns string with letters replaced with their T9 representation. + static String getT9Representation(String s) { + StringBuilder builder = new StringBuilder(s.length()); + for (char c : s.toLowerCase().toCharArray()) { + builder.append(getDigit(c)); + } + return builder.toString(); + } + + /** @return String s with only digits recognized by Character#isDigit() remaining */ + public static String digitsOnly(String s) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (Character.isDigit(c)) { + sb.append(c); + } + } + return sb.toString(); + } + + // Returns the T9 representation of a lower case character, otherwise returns the character. + static char getDigit(char c) { + switch (c) { + case 'a': + case 'b': + case 'c': + return '2'; + case 'd': + case 'e': + case 'f': + return '3'; + case 'g': + case 'h': + case 'i': + return '4'; + case 'j': + case 'k': + case 'l': + return '5'; + case 'm': + case 'n': + case 'o': + return '6'; + case 'p': + case 'q': + case 'r': + case 's': + return '7'; + case 't': + case 'u': + case 'v': + return '8'; + case 'w': + case 'x': + case 'y': + case 'z': + return '9'; + default: + return c; + } + } +} diff --git a/java/com/android/dialer/searchfragment/common/res/layout/search_contact_row.xml b/java/com/android/dialer/searchfragment/common/res/layout/search_contact_row.xml new file mode 100644 index 000000000..dd871af70 --- /dev/null +++ b/java/com/android/dialer/searchfragment/common/res/layout/search_contact_row.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/searchfragment/common/res/values/dimens.xml b/java/com/android/dialer/searchfragment/common/res/values/dimens.xml new file mode 100644 index 000000000..d5459ddb3 --- /dev/null +++ b/java/com/android/dialer/searchfragment/common/res/values/dimens.xml @@ -0,0 +1,23 @@ + + + + 56dp + 8dp + 8dp + 16dp + 16sp + \ No newline at end of file diff --git a/java/com/android/dialer/searchfragment/cp2/SearchContactCursor.java b/java/com/android/dialer/searchfragment/cp2/SearchContactCursor.java new file mode 100644 index 000000000..a2ef58c3c --- /dev/null +++ b/java/com/android/dialer/searchfragment/cp2/SearchContactCursor.java @@ -0,0 +1,392 @@ +/* + * 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.searchfragment.cp2; + +import android.content.ContentResolver; +import android.database.CharArrayBuffer; +import android.database.ContentObserver; +import android.database.Cursor; +import android.database.DataSetObserver; +import android.net.Uri; +import android.os.Bundle; +import android.support.annotation.IntDef; +import android.support.annotation.Nullable; +import android.text.TextUtils; +import com.android.dialer.searchfragment.common.Projections; +import com.android.dialer.searchfragment.common.QueryFilteringUtil; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.List; + +/** + * Wrapper for a cursor returned by {@link SearchContactsCursorLoader}. + * + *

      This cursor removes duplicate phone numbers associated with the same contact and can filter + * contacts based on a query by calling {@link #filter(String)}. + */ +public final class SearchContactCursor implements Cursor { + + private final Cursor cursor; + // List of cursor ids that are valid for displaying after filtering. + private final List queryFilteredPositions = new ArrayList<>(); + + private int currentPosition = 0; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + Qualification.NUMBERS_ARE_NOT_DUPLICATES, + Qualification.NEW_NUMBER_IS_MORE_QUALIFIED, + Qualification.CURRENT_MORE_QUALIFIED + }) + private @interface Qualification { + /** Numbers are not duplicates (i.e. neither is more qualified than the other). */ + int NUMBERS_ARE_NOT_DUPLICATES = 0; + /** Number are duplicates and new number is more qualified than the existing number. */ + int NEW_NUMBER_IS_MORE_QUALIFIED = 1; + /** Numbers are duplicates but current/existing number is more qualified than new number. */ + int CURRENT_MORE_QUALIFIED = 2; + } + + /** + * @param cursor with projection {@link Projections#PHONE_PROJECTION}. + * @param query to filter cursor results. + */ + public SearchContactCursor(Cursor cursor, @Nullable String query) { + // TODO investigate copying this into a MatrixCursor and holding in memory + this.cursor = cursor; + filter(query); + } + + /** + * Filters out contacts that do not match the query. + * + *

      The query can have at least 1 of 3 forms: + * + *

        + *
      • A phone number + *
      • A T9 representation of a name (matches {@link QueryFilteringUtil#T9_PATTERN}). + *
      • A name + *
      + * + *

      A contact is considered a match if: + * + *

        + *
      • Its phone number contains the phone number query + *
      • Its name represented in T9 contains the T9 query + *
      • Its name contains the query + *
      + */ + public void filter(@Nullable String query) { + if (query == null) { + query = ""; + } + queryFilteredPositions.clear(); + + // On some devices, contacts have multiple rows with identical phone numbers. These numbers are + // considered duplicates. Since the order might not be guaranteed, we compare all of the numbers + // and hold onto the most qualified one as the one we want to display to the user. + // See #getQualification for details on how qualification is determined. + int previousMostQualifiedPosition = 0; + String previousName = ""; + String previousMostQualifiedNumber = ""; + + query = query.toLowerCase(); + cursor.moveToPosition(-1); + + while (cursor.moveToNext()) { + int position = cursor.getPosition(); + String currentNumber = cursor.getString(Projections.PHONE_NUMBER); + String currentName = cursor.getString(Projections.PHONE_DISPLAY_NAME); + + if (!previousName.equals(currentName)) { + previousName = currentName; + previousMostQualifiedNumber = currentNumber; + previousMostQualifiedPosition = position; + } else { + // Since the contact name is the same, check if this number is a duplicate + switch (getQualification(currentNumber, previousMostQualifiedNumber)) { + case Qualification.CURRENT_MORE_QUALIFIED: + // Number is a less qualified duplicate, ignore it. + continue; + case Qualification.NEW_NUMBER_IS_MORE_QUALIFIED: + // If number wasn't filtered out before, remove it and add it's more qualified version. + if (queryFilteredPositions.contains(previousMostQualifiedPosition)) { + queryFilteredPositions.remove(previousMostQualifiedPosition); + queryFilteredPositions.add(position); + } + previousMostQualifiedNumber = currentNumber; + previousMostQualifiedPosition = position; + continue; + case Qualification.NUMBERS_ARE_NOT_DUPLICATES: + default: + previousMostQualifiedNumber = currentNumber; + previousMostQualifiedPosition = position; + } + } + + if (TextUtils.isEmpty(query) + || QueryFilteringUtil.nameMatchesT9Query(query, previousName) + || QueryFilteringUtil.numberMatchesNumberQuery(query, previousMostQualifiedNumber) + || previousName.contains(query)) { + queryFilteredPositions.add(previousMostQualifiedPosition); + } + } + currentPosition = 0; + cursor.moveToFirst(); + } + + /** + * @param number that may or may not be more qualified than the existing most qualified number + * @param mostQualifiedNumber currently most qualified number associated with same contact + * @return {@link Qualification} where the more qualified number is the number with the most + * digits. If the digits are the same, the number with the most formatting is more qualified. + */ + private @Qualification int getQualification(String number, String mostQualifiedNumber) { + // Ignore formatting + String numberDigits = QueryFilteringUtil.digitsOnly(number); + String qualifiedNumberDigits = QueryFilteringUtil.digitsOnly(mostQualifiedNumber); + + // If the numbers are identical, return version with more formatting + if (qualifiedNumberDigits.equals(numberDigits)) { + if (mostQualifiedNumber.length() >= number.length()) { + return Qualification.CURRENT_MORE_QUALIFIED; + } else { + return Qualification.NEW_NUMBER_IS_MORE_QUALIFIED; + } + } + + // If one number is a suffix of another, then return the longer one. + // If they are equal, then return the current most qualified number. + if (qualifiedNumberDigits.endsWith(numberDigits)) { + return Qualification.CURRENT_MORE_QUALIFIED; + } + if (numberDigits.endsWith(qualifiedNumberDigits)) { + return Qualification.NEW_NUMBER_IS_MORE_QUALIFIED; + } + return Qualification.NUMBERS_ARE_NOT_DUPLICATES; + } + + @Override + public boolean moveToPosition(int position) { + currentPosition = position; + return currentPosition < getCount() + && cursor.moveToPosition(queryFilteredPositions.get(currentPosition)); + } + + @Override + public boolean move(int offset) { + currentPosition += offset; + return moveToPosition(currentPosition); + } + + @Override + public int getCount() { + return queryFilteredPositions.size(); + } + + @Override + public boolean isFirst() { + return currentPosition == 0; + } + + @Override + public boolean isLast() { + return currentPosition == getCount() - 1; + } + + @Override + public int getPosition() { + return currentPosition; + } + + @Override + public boolean moveToFirst() { + return moveToPosition(0); + } + + @Override + public boolean moveToLast() { + return moveToPosition(getCount() - 1); + } + + @Override + public boolean moveToNext() { + return moveToPosition(++currentPosition); + } + + @Override + public boolean moveToPrevious() { + return moveToPosition(--currentPosition); + } + + // Methods below simply call the corresponding method in cursor. + @Override + public boolean isBeforeFirst() { + return cursor.isBeforeFirst(); + } + + @Override + public boolean isAfterLast() { + return cursor.isAfterLast(); + } + + @Override + public int getColumnIndex(String columnName) { + return cursor.getColumnIndex(columnName); + } + + @Override + public int getColumnIndexOrThrow(String columnName) { + return cursor.getColumnIndexOrThrow(columnName); + } + + @Override + public String getColumnName(int columnIndex) { + return cursor.getColumnName(columnIndex); + } + + @Override + public String[] getColumnNames() { + return cursor.getColumnNames(); + } + + @Override + public int getColumnCount() { + return cursor.getColumnCount(); + } + + @Override + public byte[] getBlob(int columnIndex) { + return cursor.getBlob(columnIndex); + } + + @Override + public String getString(int columnIndex) { + return cursor.getString(columnIndex); + } + + @Override + public void copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) { + cursor.copyStringToBuffer(columnIndex, buffer); + } + + @Override + public short getShort(int columnIndex) { + return cursor.getShort(columnIndex); + } + + @Override + public int getInt(int columnIndex) { + return cursor.getInt(columnIndex); + } + + @Override + public long getLong(int columnIndex) { + return cursor.getLong(columnIndex); + } + + @Override + public float getFloat(int columnIndex) { + return cursor.getFloat(columnIndex); + } + + @Override + public double getDouble(int columnIndex) { + return cursor.getDouble(columnIndex); + } + + @Override + public int getType(int columnIndex) { + return cursor.getType(columnIndex); + } + + @Override + public boolean isNull(int columnIndex) { + return cursor.isNull(columnIndex); + } + + @Override + public void deactivate() { + cursor.deactivate(); + } + + @Override + public boolean requery() { + return cursor.requery(); + } + + @Override + public void close() { + cursor.close(); + } + + @Override + public boolean isClosed() { + return cursor.isClosed(); + } + + @Override + public void registerContentObserver(ContentObserver observer) { + cursor.registerContentObserver(observer); + } + + @Override + public void unregisterContentObserver(ContentObserver observer) { + cursor.unregisterContentObserver(observer); + } + + @Override + public void registerDataSetObserver(DataSetObserver observer) { + cursor.registerDataSetObserver(observer); + } + + @Override + public void unregisterDataSetObserver(DataSetObserver observer) { + cursor.unregisterDataSetObserver(observer); + } + + @Override + public void setNotificationUri(ContentResolver cr, Uri uri) { + cursor.setNotificationUri(cr, uri); + } + + @Override + public Uri getNotificationUri() { + return cursor.getNotificationUri(); + } + + @Override + public boolean getWantsAllOnMoveCalls() { + return cursor.getWantsAllOnMoveCalls(); + } + + @Override + public void setExtras(Bundle extras) { + cursor.setExtras(extras); + } + + @Override + public Bundle getExtras() { + return cursor.getExtras(); + } + + @Override + public Bundle respond(Bundle extras) { + return cursor.respond(extras); + } +} diff --git a/java/com/android/dialer/searchfragment/cp2/SearchContactViewHolder.java b/java/com/android/dialer/searchfragment/cp2/SearchContactViewHolder.java new file mode 100644 index 000000000..5f06b5991 --- /dev/null +++ b/java/com/android/dialer/searchfragment/cp2/SearchContactViewHolder.java @@ -0,0 +1,204 @@ +/* + * 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.searchfragment.cp2; + +import android.content.Context; +import android.content.res.Resources; +import android.database.Cursor; +import android.net.Uri; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.provider.ContactsContract.Contacts; +import android.support.annotation.IntDef; +import android.support.v7.widget.RecyclerView.ViewHolder; +import android.text.TextUtils; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ImageView; +import android.widget.QuickContactBadge; +import android.widget.TextView; +import com.android.contacts.common.ContactPhotoManager; +import com.android.contacts.common.lettertiles.LetterTileDrawable; +import com.android.dialer.callintent.CallInitiationType.Type; +import com.android.dialer.callintent.CallIntentBuilder; +import com.android.dialer.common.Assert; +import com.android.dialer.searchfragment.common.Projections; +import com.android.dialer.searchfragment.common.QueryBoldingUtil; +import com.android.dialer.searchfragment.common.R; +import com.android.dialer.telecom.TelecomUtil; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** ViewHolder for a contact row. */ +public final class SearchContactViewHolder extends ViewHolder implements OnClickListener { + + /** IntDef for the different types of actions that can be shown. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({CallToAction.NONE, CallToAction.VIDEO_CALL, CallToAction.SHARE_AND_CALL}) + @interface CallToAction { + int NONE = 0; + int VIDEO_CALL = 1; + int SHARE_AND_CALL = 2; + } + + private final QuickContactBadge photo; + private final TextView nameOrNumberView; + private final TextView numberView; + private final ImageView callToActionView; + private final Context context; + + private String number; + private @CallToAction int currentAction; + + public SearchContactViewHolder(View view) { + super(view); + view.setOnClickListener(this); + photo = view.findViewById(R.id.photo); + nameOrNumberView = view.findViewById(R.id.primary); + numberView = view.findViewById(R.id.secondary); + callToActionView = view.findViewById(R.id.call_to_action); + context = view.getContext(); + } + + /** + * Binds the ViewHolder with a cursor from {@link SearchContactsCursorLoader} with the data found + * at the cursors set position. + */ + public void bind(Cursor cursor, String query) { + number = cursor.getString(Projections.PHONE_NUMBER); + String name = cursor.getString(Projections.PHONE_DISPLAY_NAME); + String label = getLabel(context.getResources(), cursor); + String secondaryInfo = + TextUtils.isEmpty(label) + ? number + : context.getString( + com.android.contacts.common.R.string.call_subject_type_and_number, label, number); + + nameOrNumberView.setText(QueryBoldingUtil.getNameWithQueryBolded(query, name)); + numberView.setText(QueryBoldingUtil.getNumberWithQueryBolded(query, secondaryInfo)); + setCallToAction(cursor); + + if (shouldShowPhoto(cursor, name)) { + nameOrNumberView.setVisibility(View.VISIBLE); + photo.setVisibility(View.VISIBLE); + String photoUri = cursor.getString(Projections.PHONE_PHOTO_URI); + ContactPhotoManager.getInstance(context) + .loadDialerThumbnailOrPhoto( + photo, + getContactUri(cursor), + cursor.getLong(Projections.PHONE_PHOTO_ID), + photoUri == null ? null : Uri.parse(photoUri), + name, + LetterTileDrawable.TYPE_DEFAULT); + } else { + nameOrNumberView.setVisibility(View.GONE); + photo.setVisibility(View.INVISIBLE); + } + } + + private boolean shouldShowPhoto(Cursor cursor, String currentName) { + int currentPosition = cursor.getPosition(); + if (currentPosition == 0) { + return true; + } else { + cursor.moveToPosition(currentPosition - 1); + String previousName = cursor.getString(Projections.PHONE_DISPLAY_NAME); + cursor.moveToPosition(currentPosition); + return !currentName.equals(previousName); + } + } + + private static Uri getContactUri(Cursor cursor) { + long contactId = cursor.getLong(Projections.PHONE_ID); + String lookupKey = cursor.getString(Projections.PHONE_LOOKUP_KEY); + return Contacts.getLookupUri(contactId, lookupKey); + } + + // TODO: handle CNAP and cequint types. + // TODO: unify this into a utility method with CallLogAdapter#getNumberType + private static String getLabel(Resources resources, Cursor cursor) { + int numberType = cursor.getInt(Projections.PHONE_TYPE); + String numberLabel = cursor.getString(Projections.PHONE_LABEL); + + // Returns empty label instead of "custom" if the custom label is empty. + if (numberType == Phone.TYPE_CUSTOM && TextUtils.isEmpty(numberLabel)) { + return ""; + } + return (String) Phone.getTypeLabel(resources, numberType, numberLabel); + } + + private void setCallToAction(Cursor cursor) { + currentAction = getCallToAction(cursor); + switch (currentAction) { + case CallToAction.NONE: + callToActionView.setVisibility(View.GONE); + callToActionView.setOnClickListener(null); + break; + case CallToAction.SHARE_AND_CALL: + callToActionView.setVisibility(View.VISIBLE); + callToActionView.setImageDrawable( + context.getDrawable(com.android.contacts.common.R.drawable.ic_phone_attach)); + callToActionView.setOnClickListener(this); + break; + case CallToAction.VIDEO_CALL: + callToActionView.setVisibility(View.VISIBLE); + callToActionView.setImageDrawable( + context.getDrawable(R.drawable.quantum_ic_videocam_white_24)); + callToActionView.setOnClickListener(this); + break; + default: + throw Assert.createIllegalStateFailException( + "Invalid Call to action type: " + currentAction); + } + } + + private static @CallToAction int getCallToAction(Cursor cursor) { + int carrierPresence = cursor.getInt(Projections.PHONE_CARRIER_PRESENCE); + if ((carrierPresence & Phone.CARRIER_PRESENCE_VT_CAPABLE) == 1) { + return CallToAction.VIDEO_CALL; + } + + // TODO: enriched calling + return CallToAction.NONE; + } + + @Override + public void onClick(View view) { + if (view == callToActionView) { + switch (currentAction) { + case CallToAction.SHARE_AND_CALL: + callToActionView.setVisibility(View.VISIBLE); + callToActionView.setImageDrawable( + context.getDrawable(com.android.contacts.common.R.drawable.ic_phone_attach)); + // TODO: open call composer. + break; + case CallToAction.VIDEO_CALL: + callToActionView.setVisibility(View.VISIBLE); + callToActionView.setImageDrawable( + context.getDrawable(R.drawable.quantum_ic_videocam_white_24)); + // TODO: place a video call + break; + case CallToAction.NONE: + default: + throw Assert.createIllegalStateFailException( + "Invalid Call to action type: " + currentAction); + } + } else { + // TODO: set the correct call initiation type. + TelecomUtil.placeCall(context, new CallIntentBuilder(number, Type.REGULAR_SEARCH).build()); + } + } +} diff --git a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java new file mode 100644 index 000000000..c72f28b25 --- /dev/null +++ b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.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.searchfragment.cp2; + +import android.content.Context; +import android.content.CursorLoader; +import android.database.Cursor; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import com.android.dialer.searchfragment.common.Projections; + +/** Cursor Loader for CP2 contacts. */ +public final class SearchContactsCursorLoader extends CursorLoader { + + public SearchContactsCursorLoader(Context context) { + super( + context, + Phone.CONTENT_URI, + Projections.PHONE_PROJECTION, + null, + null, + Phone.SORT_KEY_PRIMARY + " ASC"); + } + + @Override + public Cursor loadInBackground() { + return new SearchContactCursor(super.loadInBackground(), null); + } +} diff --git a/java/com/android/dialer/searchfragment/list/AndroidManifest.xml b/java/com/android/dialer/searchfragment/list/AndroidManifest.xml new file mode 100644 index 000000000..e0890cc2c --- /dev/null +++ b/java/com/android/dialer/searchfragment/list/AndroidManifest.xml @@ -0,0 +1,16 @@ + + \ No newline at end of file diff --git a/java/com/android/dialer/searchfragment/list/HeaderViewHolder.java b/java/com/android/dialer/searchfragment/list/HeaderViewHolder.java new file mode 100644 index 000000000..dd35b13ee --- /dev/null +++ b/java/com/android/dialer/searchfragment/list/HeaderViewHolder.java @@ -0,0 +1,36 @@ +/* + * 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.searchfragment.list; + +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.TextView; + +/** ViewHolder for header rows in {@link NewSearchFragment}. */ +final class HeaderViewHolder extends RecyclerView.ViewHolder { + + private final TextView header; + + HeaderViewHolder(View view) { + super(view); + header = view.findViewById(R.id.header); + } + + public void setHeader(String header) { + this.header.setText(header); + } +} diff --git a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java new file mode 100644 index 000000000..fcc87c386 --- /dev/null +++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java @@ -0,0 +1,125 @@ +/* + * 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.searchfragment.list; + +import android.app.Fragment; +import android.app.LoaderManager.LoaderCallbacks; +import android.content.Loader; +import android.database.Cursor; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import com.android.contacts.common.extensions.PhoneDirectoryExtenderAccessor; +import com.android.dialer.common.concurrent.ThreadUtil; +import com.android.dialer.searchfragment.cp2.SearchContactsCursorLoader; +import com.android.dialer.searchfragment.nearbyplaces.NearbyPlacesCursorLoader; + +/** Fragment used for searching contacts. */ +public final class NewSearchFragment extends Fragment implements LoaderCallbacks { + + // Since some of our queries can generate network requests, we should delay them until the user + // stops typing to prevent generating too much network traffic. + private static final int NETWORK_SEARCH_DELAY_MILLIS = 300; + + private static final int CONTACTS_LOADER_ID = 0; + private static final int NEARBY_PLACES_ID = 1; + + private RecyclerView recyclerView; + private SearchAdapter adapter; + private String query; + + private final Runnable loadNearbyPlacesRunnable = + () -> getLoaderManager().restartLoader(NEARBY_PLACES_ID, null, this); + + @Nullable + @Override + public View onCreateView( + LayoutInflater inflater, @Nullable ViewGroup parent, @Nullable Bundle bundle) { + getLoaderManager().initLoader(0, null, this); + View view = inflater.inflate(R.layout.fragment_search, parent, false); + adapter = new SearchAdapter(getContext()); + recyclerView = view.findViewById(R.id.recycler_view); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + recyclerView.setAdapter(adapter); + + getLoaderManager().initLoader(CONTACTS_LOADER_ID, null, this); + loadNearbyPlacesCursor(); + return view; + } + + @Override + public Loader onCreateLoader(int id, Bundle bundle) { + // TODO add enterprise loader + if (id == CONTACTS_LOADER_ID) { + return new SearchContactsCursorLoader(getContext()); + } else if (id == NEARBY_PLACES_ID) { + return new NearbyPlacesCursorLoader(getContext(), query); + } else { + throw new IllegalStateException("Invalid loader id: " + id); + } + } + + @Override + public void onLoadFinished(Loader loader, Cursor cursor) { + if (loader instanceof SearchContactsCursorLoader) { + adapter.setContactsCursor(cursor); + } else if (loader instanceof NearbyPlacesCursorLoader) { + adapter.setNearbyPlacesCursor(cursor); + } else { + throw new IllegalStateException("Invalid loader: " + loader); + } + } + + @Override + public void onLoaderReset(Loader loader) { + adapter.clear(); + recyclerView.setAdapter(null); + } + + public void setQuery(String query) { + this.query = query; + if (adapter != null) { + adapter.setQuery(query); + loadNearbyPlacesCursor(); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + // close adapters + adapter.setNearbyPlacesCursor(null); + adapter.setContactsCursor(null); + ThreadUtil.getUiThreadHandler().removeCallbacks(loadNearbyPlacesRunnable); + } + + private void loadNearbyPlacesCursor() { + // Cancel existing load if one exists. + ThreadUtil.getUiThreadHandler().removeCallbacks(loadNearbyPlacesRunnable); + + // If nearby places is not enabled, do not try to load them. + if (!PhoneDirectoryExtenderAccessor.get(getContext()).isEnabled(getContext())) { + return; + } + ThreadUtil.getUiThreadHandler() + .postDelayed(loadNearbyPlacesRunnable, NETWORK_SEARCH_DELAY_MILLIS); + } +} diff --git a/java/com/android/dialer/searchfragment/list/SearchAdapter.java b/java/com/android/dialer/searchfragment/list/SearchAdapter.java new file mode 100644 index 000000000..023513e47 --- /dev/null +++ b/java/com/android/dialer/searchfragment/list/SearchAdapter.java @@ -0,0 +1,108 @@ +/* + * 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.searchfragment.list; + +import android.content.Context; +import android.database.Cursor; +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.common.Assert; +import com.android.dialer.searchfragment.cp2.SearchContactViewHolder; +import com.android.dialer.searchfragment.list.SearchCursorManager.RowType; +import com.android.dialer.searchfragment.nearbyplaces.NearbyPlaceViewHolder; + +/** RecyclerView adapter for {@link NewSearchFragment}. */ +class SearchAdapter extends RecyclerView.Adapter { + + private final SearchCursorManager searchCursorManager; + private final Context context; + + private String query; + + SearchAdapter(Context context) { + searchCursorManager = new SearchCursorManager(); + this.context = context; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup root, @RowType int rowType) { + switch (rowType) { + case RowType.CONTACT_ROW: + return new SearchContactViewHolder( + LayoutInflater.from(context).inflate(R.layout.search_contact_row, root, false)); + case RowType.NEARBY_PLACES_ROW: + return new NearbyPlaceViewHolder( + LayoutInflater.from(context).inflate(R.layout.search_contact_row, root, false)); + case RowType.DIRECTORY_HEADER: + case RowType.NEARBY_PLACES_HEADER: + return new HeaderViewHolder( + LayoutInflater.from(context).inflate(R.layout.header_layout, root, false)); + case RowType.DIRECTORY_ROW: // TODO: add directory rows to search + case RowType.INVALID: + default: + throw Assert.createIllegalStateFailException("Invalid RowType: " + rowType); + } + } + + @Override + public @RowType int getItemViewType(int position) { + return searchCursorManager.getRowType(position); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + if (holder instanceof SearchContactViewHolder) { + Cursor cursor = searchCursorManager.getCursor(position); + ((SearchContactViewHolder) holder).bind(cursor, query); + } else if (holder instanceof NearbyPlaceViewHolder) { + Cursor cursor = searchCursorManager.getCursor(position); + ((NearbyPlaceViewHolder) holder).bind(cursor, query); + } else if (holder instanceof HeaderViewHolder) { + String header = context.getString(searchCursorManager.getHeaderText(position)); + ((HeaderViewHolder) holder).setHeader(header); + } else { + throw Assert.createIllegalStateFailException("Invalid ViewHolder: " + holder); + } + } + + void setContactsCursor(Cursor cursor) { + searchCursorManager.setContactsCursor(cursor); + notifyDataSetChanged(); + } + + void clear() { + searchCursorManager.clear(); + } + + @Override + public int getItemCount() { + return searchCursorManager.getCount(); + } + + public void setQuery(String query) { + this.query = query; + searchCursorManager.setQuery(query); + notifyDataSetChanged(); + } + + public void setNearbyPlacesCursor(Cursor nearbyPlacesCursor) { + searchCursorManager.setNearbyPlacesCursor(nearbyPlacesCursor); + notifyDataSetChanged(); + } +} diff --git a/java/com/android/dialer/searchfragment/list/SearchCursorManager.java b/java/com/android/dialer/searchfragment/list/SearchCursorManager.java new file mode 100644 index 000000000..216a9ada9 --- /dev/null +++ b/java/com/android/dialer/searchfragment/list/SearchCursorManager.java @@ -0,0 +1,273 @@ +/* + * 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.searchfragment.list; + +import android.database.Cursor; +import android.support.annotation.IntDef; +import android.support.annotation.StringRes; +import com.android.dialer.common.Assert; +import com.android.dialer.searchfragment.cp2.SearchContactCursor; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Manages all of the cursors needed for {@link SearchAdapter}. + * + *

      This class accepts three cursors: + * + *

        + *
      • A contacts cursor {@link #setContactsCursor(Cursor)} + *
      • A google search results cursor {@link #setNearbyPlacesCursor(Cursor)} + *
      • A work directory cursor {@link #setCorpDirectoryCursor(Cursor)} + *
      + * + *

      The key purpose of this class is to compose three aforementioned cursors together to function + * as one cursor. The key methods needed to utilize this class as a cursor are: + * + *

        + *
      • {@link #getCursor(int)} + *
      • {@link #getCount()} + *
      • {@link #getRowType(int)} + *
      + */ +final class SearchCursorManager { + + /** IntDef for the different types of rows that can be shown when searching. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + SearchCursorManager.RowType.INVALID, + SearchCursorManager.RowType.CONTACT_ROW, + SearchCursorManager.RowType.NEARBY_PLACES_HEADER, + SearchCursorManager.RowType.NEARBY_PLACES_ROW, + SearchCursorManager.RowType.DIRECTORY_HEADER, + SearchCursorManager.RowType.DIRECTORY_ROW + }) + @interface RowType { + int INVALID = 0; + /** A row containing contact information for contacts stored locally on device. */ + int CONTACT_ROW = 1; + /** Header to mark the end of contact rows and start of nearby places rows. */ + int NEARBY_PLACES_HEADER = 2; + /** A row containing nearby places information/search results. */ + int NEARBY_PLACES_ROW = 3; + /** Header to mark the end of the previous row set and start of directory rows. */ + int DIRECTORY_HEADER = 4; + /** A row containing contact information for contacts stored externally in corp directories. */ + int DIRECTORY_ROW = 5; + } + + private Cursor contactsCursor = null; + private Cursor nearbyPlacesCursor = null; + private Cursor corpDirectoryCursor = null; + + void setContactsCursor(Cursor cursor) { + if (cursor == contactsCursor) { + return; + } + + if (contactsCursor != null && !contactsCursor.isClosed()) { + contactsCursor.close(); + } + + if (cursor != null && cursor.getCount() > 0) { + contactsCursor = cursor; + } else { + contactsCursor = null; + } + } + + void setNearbyPlacesCursor(Cursor cursor) { + if (cursor == nearbyPlacesCursor) { + return; + } + + if (nearbyPlacesCursor != null && !nearbyPlacesCursor.isClosed()) { + nearbyPlacesCursor.close(); + } + + if (cursor != null && cursor.getCount() > 0) { + nearbyPlacesCursor = cursor; + } else { + nearbyPlacesCursor = null; + } + } + + void setCorpDirectoryCursor(Cursor cursor) { + if (cursor == corpDirectoryCursor) { + return; + } + + if (corpDirectoryCursor != null && !corpDirectoryCursor.isClosed()) { + corpDirectoryCursor.close(); + } + + if (cursor != null && cursor.getCount() > 0) { + corpDirectoryCursor = cursor; + } else { + corpDirectoryCursor = null; + } + } + + void setQuery(String query) { + if (contactsCursor != null) { + // TODO: abstract this + ((SearchContactCursor) contactsCursor).filter(query); + } + } + + /** @return the sum of counts of all cursors, including headers. */ + int getCount() { + int count = 0; + if (contactsCursor != null) { + count += contactsCursor.getCount(); + } + + if (nearbyPlacesCursor != null) { + count++; // header + count += nearbyPlacesCursor.getCount(); + } + + if (corpDirectoryCursor != null) { + count++; // header + count += corpDirectoryCursor.getCount(); + } + + return count; + } + + @RowType + int getRowType(int position) { + if (contactsCursor != null) { + position -= contactsCursor.getCount(); + + if (position < 0) { + return SearchCursorManager.RowType.CONTACT_ROW; + } + } + + if (nearbyPlacesCursor != null) { + if (position == 0) { + return SearchCursorManager.RowType.NEARBY_PLACES_HEADER; + } else { + position--; // header + } + + position -= nearbyPlacesCursor.getCount(); + + if (position < 0) { + return SearchCursorManager.RowType.NEARBY_PLACES_ROW; + } + } + + if (corpDirectoryCursor != null) { + if (position == 0) { + return SearchCursorManager.RowType.DIRECTORY_HEADER; + } else { + position--; // header + } + + position -= corpDirectoryCursor.getCount(); + + if (position < 0) { + return SearchCursorManager.RowType.DIRECTORY_ROW; + } + } + + throw Assert.createIllegalStateFailException("No valid row type."); + } + + /** + * Gets cursor corresponding to position in coelesced list of search cursors. Callers should + * ensure that {@link #getRowType(int)} doesn't correspond to header position, otherwise an + * exception will be thrown. + * + * @param position in coalecsed list of search cursors + * @return Cursor moved to position specific to passed in position. + */ + Cursor getCursor(int position) { + if (contactsCursor != null) { + int count = contactsCursor.getCount(); + + if (position - count < 0) { + contactsCursor.moveToPosition(position); + return contactsCursor; + } + position -= count; + } + + if (nearbyPlacesCursor != null) { + Assert.checkArgument(position != 0, "No valid cursor, position is nearby places header."); + position--; // header + int count = nearbyPlacesCursor.getCount(); + + if (position - count < 0) { + nearbyPlacesCursor.moveToPosition(position); + return nearbyPlacesCursor; + } + position -= count; + } + + if (corpDirectoryCursor != null) { + Assert.checkArgument(position != 0, "No valid cursor, position is directory search header."); + position--; // header + int count = corpDirectoryCursor.getCount(); + + if (position - count < 0) { + corpDirectoryCursor.moveToPosition(position); + return corpDirectoryCursor; + } + position -= count; + } + + throw Assert.createIllegalStateFailException("No valid cursor."); + } + + @StringRes + int getHeaderText(int position) { + @RowType int rowType = getRowType(position); + switch (rowType) { + case RowType.NEARBY_PLACES_HEADER: + return R.string.nearby_places; + case RowType.DIRECTORY_HEADER: // TODO + case RowType.DIRECTORY_ROW: + case RowType.CONTACT_ROW: + case RowType.NEARBY_PLACES_ROW: + case RowType.INVALID: + default: + throw Assert.createIllegalStateFailException( + "Invalid row type, position " + position + " is rowtype " + rowType); + } + } + + /** removes all cursors. */ + void clear() { + if (contactsCursor != null) { + contactsCursor.close(); + contactsCursor = null; + } + + if (nearbyPlacesCursor != null) { + nearbyPlacesCursor.close(); + nearbyPlacesCursor = null; + } + + if (corpDirectoryCursor != null) { + corpDirectoryCursor.close(); + corpDirectoryCursor = null; + } + } +} diff --git a/java/com/android/dialer/searchfragment/list/res/layout/fragment_search.xml b/java/com/android/dialer/searchfragment/list/res/layout/fragment_search.xml new file mode 100644 index 000000000..06f234889 --- /dev/null +++ b/java/com/android/dialer/searchfragment/list/res/layout/fragment_search.xml @@ -0,0 +1,21 @@ + + + diff --git a/java/com/android/dialer/searchfragment/list/res/layout/header_layout.xml b/java/com/android/dialer/searchfragment/list/res/layout/header_layout.xml new file mode 100644 index 000000000..36af42ed9 --- /dev/null +++ b/java/com/android/dialer/searchfragment/list/res/layout/header_layout.xml @@ -0,0 +1,22 @@ + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/AndroidManifest.xml b/java/com/android/dialer/searchfragment/nearbyplaces/AndroidManifest.xml new file mode 100644 index 000000000..178cd83c3 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/AndroidManifest.xml @@ -0,0 +1,16 @@ + + \ No newline at end of file diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlaceViewHolder.java b/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlaceViewHolder.java new file mode 100644 index 000000000..b6e5a9013 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlaceViewHolder.java @@ -0,0 +1,90 @@ +/* + * 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.searchfragment.nearbyplaces; + +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.provider.ContactsContract; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.QuickContactBadge; +import android.widget.TextView; +import com.android.contacts.common.ContactPhotoManager; +import com.android.contacts.common.lettertiles.LetterTileDrawable; +import com.android.dialer.callintent.CallInitiationType; +import com.android.dialer.callintent.CallIntentBuilder; +import com.android.dialer.searchfragment.common.Projections; +import com.android.dialer.searchfragment.common.QueryBoldingUtil; +import com.android.dialer.searchfragment.common.R; +import com.android.dialer.telecom.TelecomUtil; + +/** ViewHolder for a nearby place row. */ +public final class NearbyPlaceViewHolder extends RecyclerView.ViewHolder + implements View.OnClickListener { + + private final Context context; + private final TextView placeName; + private final TextView placeAddress; + private final QuickContactBadge photo; + + private String number; + + public NearbyPlaceViewHolder(View view) { + super(view); + view.setOnClickListener(this); + photo = view.findViewById(R.id.photo); + placeName = view.findViewById(R.id.primary); + placeAddress = view.findViewById(R.id.secondary); + context = view.getContext(); + } + + /** + * Binds the ViewHolder with a cursor from {@link NearbyPlacesCursorLoader} with the data found at + * the cursors set position. + */ + public void bind(Cursor cursor, String query) { + number = cursor.getString(Projections.PHONE_NUMBER); + String name = cursor.getString(Projections.PHONE_DISPLAY_NAME); + String address = cursor.getString(Projections.PHONE_LABEL); + + placeName.setText(QueryBoldingUtil.getNameWithQueryBolded(query, name)); + placeAddress.setText(QueryBoldingUtil.getNameWithQueryBolded(query, address)); + + String photoUri = cursor.getString(Projections.PHONE_PHOTO_URI); + ContactPhotoManager.getInstance(context) + .loadDialerThumbnailOrPhoto( + photo, + getContactUri(cursor), + cursor.getLong(Projections.PHONE_PHOTO_ID), + photoUri == null ? null : Uri.parse(photoUri), + name, + LetterTileDrawable.TYPE_DEFAULT); + } + + private static Uri getContactUri(Cursor cursor) { + long contactId = cursor.getLong(Projections.PHONE_ID); + String lookupKey = cursor.getString(Projections.PHONE_LOOKUP_KEY); + return ContactsContract.Contacts.getLookupUri(contactId, lookupKey); + } + + @Override + public void onClick(View v) { + TelecomUtil.placeCall( + context, new CallIntentBuilder(number, CallInitiationType.Type.REGULAR_SEARCH).build()); + } +} diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlacesCursorLoader.java b/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlacesCursorLoader.java new file mode 100644 index 000000000..9f3193e92 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlacesCursorLoader.java @@ -0,0 +1,43 @@ +/* + * 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.searchfragment.nearbyplaces; + +import android.content.Context; +import android.content.CursorLoader; +import android.net.Uri; +import android.provider.ContactsContract; +import com.android.contacts.common.extensions.PhoneDirectoryExtenderAccessor; +import com.android.dialer.searchfragment.common.Projections; + +/** Cursor loader for nearby places search results. */ +public final class NearbyPlacesCursorLoader extends CursorLoader { + + private static final String MAX_RESULTS = "3"; + + public NearbyPlacesCursorLoader(Context context, String query) { + super(context, getContentUri(context, query), Projections.PHONE_PROJECTION, null, null, null); + } + + private static Uri getContentUri(Context context, String query) { + return PhoneDirectoryExtenderAccessor.get(context) + .getContentUri() + .buildUpon() + .appendPath(query) + .appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY, MAX_RESULTS) + .build(); + } +} diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-af/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-af/strings.xml new file mode 100644 index 000000000..21eb4b11d --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-af/strings.xml @@ -0,0 +1,21 @@ + + + + + "Nabygeleë plekke" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-am/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-am/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-am/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ar/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ar/strings.xml new file mode 100644 index 000000000..d68b4d1ee --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ar/strings.xml @@ -0,0 +1,21 @@ + + + + + "الأماكن المجاورة" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-az/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-az/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-az/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-b+sr+Latn/strings.xml new file mode 100644 index 000000000..bb9f06fe7 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,21 @@ + + + + + "Obližnja mesta" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-be/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-be/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-be/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-bg/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-bg/strings.xml new file mode 100644 index 000000000..e8839532a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-bg/strings.xml @@ -0,0 +1,21 @@ + + + + + "Места в района" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-bn/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-bn/strings.xml new file mode 100644 index 000000000..4bc3fedb4 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-bn/strings.xml @@ -0,0 +1,21 @@ + + + + + "আশপাশের জায়গাগুলি" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-bs/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-bs/strings.xml new file mode 100644 index 000000000..f3fb92187 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-bs/strings.xml @@ -0,0 +1,21 @@ + + + + + "Mjesta u blizini" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ca/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ca/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ca/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-cs/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-cs/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-cs/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-da/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-da/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-da/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-de/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-de/strings.xml new file mode 100644 index 000000000..9e2db4a32 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-de/strings.xml @@ -0,0 +1,21 @@ + + + + + "Orte in der Nähe" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-el/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-el/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-el/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rAU/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rAU/strings.xml new file mode 100644 index 000000000..077827315 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rAU/strings.xml @@ -0,0 +1,21 @@ + + + + + "Places nearby" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rGB/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rGB/strings.xml new file mode 100644 index 000000000..077827315 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rGB/strings.xml @@ -0,0 +1,21 @@ + + + + + "Places nearby" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rIN/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rIN/strings.xml new file mode 100644 index 000000000..077827315 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-en-rIN/strings.xml @@ -0,0 +1,21 @@ + + + + + "Places nearby" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-es-rUS/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-es-rUS/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-es-rUS/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-es/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-es/strings.xml new file mode 100644 index 000000000..fada6bcaf --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-es/strings.xml @@ -0,0 +1,21 @@ + + + + + "Sitios cercanos" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-et/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-et/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-et/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-eu/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-eu/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-eu/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fa/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fa/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fa/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fi/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fi/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fi/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fr-rCA/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fr-rCA/strings.xml new file mode 100644 index 000000000..d65e7bd55 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fr-rCA/strings.xml @@ -0,0 +1,21 @@ + + + + + "Adresses à proximité" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fr/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fr/strings.xml new file mode 100644 index 000000000..d65e7bd55 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-fr/strings.xml @@ -0,0 +1,21 @@ + + + + + "Adresses à proximité" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-gl/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-gl/strings.xml new file mode 100644 index 000000000..5a4cce7e0 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-gl/strings.xml @@ -0,0 +1,21 @@ + + + + + "Lugares próximos" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-gu/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-gu/strings.xml new file mode 100644 index 000000000..ee32e466f --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-gu/strings.xml @@ -0,0 +1,21 @@ + + + + + "નજીકના સ્થળો" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hi/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hi/strings.xml new file mode 100644 index 000000000..079c03e04 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hi/strings.xml @@ -0,0 +1,21 @@ + + + + + "आस-पास के स्थल" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hr/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hr/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hr/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hu/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hu/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hu/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hy/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hy/strings.xml new file mode 100644 index 000000000..3a2ba3938 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-hy/strings.xml @@ -0,0 +1,21 @@ + + + + + "Մոտակա վայրեր" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-in/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-in/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-in/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-is/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-is/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-is/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-it/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-it/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-it/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-iw/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-iw/strings.xml new file mode 100644 index 000000000..0f07995f3 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-iw/strings.xml @@ -0,0 +1,21 @@ + + + + + "מקומות קרובים" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ja/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ja/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ja/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ka/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ka/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ka/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-kk/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-kk/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-kk/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-km/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-km/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-km/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-kn/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-kn/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-kn/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ko/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ko/strings.xml new file mode 100644 index 000000000..f05a33289 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ko/strings.xml @@ -0,0 +1,21 @@ + + + + + "주변 장소" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ky/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ky/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ky/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-lo/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-lo/strings.xml new file mode 100644 index 000000000..2ff0e8548 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-lo/strings.xml @@ -0,0 +1,21 @@ + + + + + "ສະຖານທີ່ໃກ້ຄຽງ" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-lt/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-lt/strings.xml new file mode 100644 index 000000000..9baf54044 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-lt/strings.xml @@ -0,0 +1,21 @@ + + + + + "Netoliese esančios vietos" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-lv/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-lv/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-lv/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-mk/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-mk/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-mk/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ml/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ml/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ml/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-mn/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-mn/strings.xml new file mode 100644 index 000000000..707a6c955 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-mn/strings.xml @@ -0,0 +1,21 @@ + + + + + "Ойролцоох газрууд" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-mr/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-mr/strings.xml new file mode 100644 index 000000000..862cd0419 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-mr/strings.xml @@ -0,0 +1,21 @@ + + + + + "जवळपासची ठिकाणे" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ms/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ms/strings.xml new file mode 100644 index 000000000..aed0bbb4d --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ms/strings.xml @@ -0,0 +1,21 @@ + + + + + "Tempat berdekatan" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-my/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-my/strings.xml new file mode 100644 index 000000000..74e60a089 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-my/strings.xml @@ -0,0 +1,21 @@ + + + + + "အနီးတဝိုက်ရှိ နေရာများ" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-nb/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-nb/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-nb/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ne/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ne/strings.xml new file mode 100644 index 000000000..29b6854fe --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ne/strings.xml @@ -0,0 +1,21 @@ + + + + + "नजिकका स्थानहरू" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-nl/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-nl/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-nl/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-no/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-no/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-no/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pa/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pa/strings.xml new file mode 100644 index 000000000..1d4d472a3 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pa/strings.xml @@ -0,0 +1,21 @@ + + + + + "ਨਜ਼ਦੀਕੀ ਸਥਾਨ" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pl/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pl/strings.xml new file mode 100644 index 000000000..c00b6081a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pl/strings.xml @@ -0,0 +1,21 @@ + + + + + "Miejsca w pobliżu" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt-rBR/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt-rBR/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt-rBR/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt-rPT/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt-rPT/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt-rPT/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-pt/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ro/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ro/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ro/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ru/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ru/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ru/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-si/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-si/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-si/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sk/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sk/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sk/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sl/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sl/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sl/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sq/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sq/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sq/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sr/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sr/strings.xml new file mode 100644 index 000000000..21af04328 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sr/strings.xml @@ -0,0 +1,21 @@ + + + + + "Оближња места" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sv/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sv/strings.xml new file mode 100644 index 000000000..c309b8df4 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sv/strings.xml @@ -0,0 +1,21 @@ + + + + + "Platser i närheten" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sw/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sw/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-sw/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ta/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ta/strings.xml new file mode 100644 index 000000000..ce7496e53 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ta/strings.xml @@ -0,0 +1,21 @@ + + + + + "அருகிலுள்ள இடங்கள்" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-te/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-te/strings.xml new file mode 100644 index 000000000..c8229fb64 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-te/strings.xml @@ -0,0 +1,21 @@ + + + + + "సమీప స్థలాలు" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-th/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-th/strings.xml new file mode 100644 index 000000000..1167d2f57 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-th/strings.xml @@ -0,0 +1,21 @@ + + + + + "สถานที่ใกล้เคียง" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-tl/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-tl/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-tl/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-tr/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-tr/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-tr/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-uk/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-uk/strings.xml new file mode 100644 index 000000000..a3936be25 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-uk/strings.xml @@ -0,0 +1,21 @@ + + + + + "Місця поблизу" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ur/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ur/strings.xml new file mode 100644 index 000000000..1a220b3c2 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-ur/strings.xml @@ -0,0 +1,21 @@ + + + + + "قریبی مقامات" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-uz/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-uz/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-uz/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-vi/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-vi/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-vi/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rCN/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rCN/strings.xml new file mode 100644 index 000000000..e060cb589 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rCN/strings.xml @@ -0,0 +1,21 @@ + + + + + "附近的地点" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rHK/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000..5cdf5b9a7 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rHK/strings.xml @@ -0,0 +1,21 @@ + + + + + "附近地點" + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rTW/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zh-rTW/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zu/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zu/strings.xml new file mode 100644 index 000000000..8039ea04a --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values-zu/strings.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values/strings.xml new file mode 100644 index 000000000..ed8068018 --- /dev/null +++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values/strings.xml @@ -0,0 +1,20 @@ + + + + + Nearby places + \ No newline at end of file diff --git a/java/com/android/dialer/shortcuts/AndroidManifest.xml b/java/com/android/dialer/shortcuts/AndroidManifest.xml index 71320517d..15f77944e 100644 --- a/java/com/android/dialer/shortcuts/AndroidManifest.xml +++ b/java/com/android/dialer/shortcuts/AndroidManifest.xml @@ -20,7 +20,7 @@ android:minSdkVersion="23" android:targetSdkVersion="26"/> - + , Boolean> isVoicemailNumberCache = + new ConcurrentHashMap<>(); + + @VisibleForTesting(otherwise = VisibleForTesting.NONE) + public static void setInstanceForTesting(TelecomUtilImpl instanceForTesting) { + instance = instanceForTesting; + } public static void showInCallScreen(Context context, boolean showDialpad) { if (hasReadPhoneStatePermission(context)) { @@ -125,18 +141,30 @@ public class TelecomUtil { } public static boolean isInCall(Context context) { - if (hasReadPhoneStatePermission(context)) { - return getTelecomManager(context).isInCall(); - } - return false; + return instance.isInCall(context); } + /** + * {@link TelecomManager#isVoiceMailNumber(PhoneAccountHandle, String)} takes about 10ms, which is + * way too slow for regular purposes. This method will cache the result for the life time of the + * process. The cache will not be invalidated, for example, if the voicemail number is changed by + * setting up apps like Google Voicemail, the result will be wrong. These events are rare. + */ public static boolean isVoicemailNumber( Context context, PhoneAccountHandle accountHandle, String number) { + if (TextUtils.isEmpty(number)) { + return false; + } + Pair cacheKey = new Pair<>(accountHandle, number); + if (isVoicemailNumberCache.containsKey(cacheKey)) { + return isVoicemailNumberCache.get(cacheKey); + } + boolean result = false; if (hasReadPhoneStatePermission(context)) { - return getTelecomManager(context).isVoiceMailNumber(accountHandle, number); + result = getTelecomManager(context).isVoiceMailNumber(accountHandle, number); } - return false; + isVoicemailNumberCache.put(cacheKey, result); + return result; } @Nullable @@ -189,43 +217,47 @@ public class TelecomUtil { } private static boolean hasPermission(Context context, String permission) { - if (hasPermissionForTesting != null) { - return hasPermissionForTesting; - } - return ContextCompat.checkSelfPermission(context, permission) - == PackageManager.PERMISSION_GRANTED; - } - - public static boolean isDefaultDialer(Context context) { - if (isDefaultDialerForTesting != null) { - return isDefaultDialerForTesting; - } - final boolean result = - TextUtils.equals( - context.getPackageName(), getTelecomManager(context).getDefaultDialerPackage()); - if (result) { - sWarningLogged = false; - } else { - if (!sWarningLogged) { - // Log only once to prevent spam. - LogUtil.w(TAG, "Dialer is not currently set to be default dialer"); - sWarningLogged = true; - } - } - return result; + return instance.hasPermission(context, permission); } private static TelecomManager getTelecomManager(Context context) { return (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE); } - @VisibleForTesting(otherwise = VisibleForTesting.NONE) - public static void setIsDefaultDialerForTesting(Boolean defaultDialer) { - isDefaultDialerForTesting = defaultDialer; + public static boolean isDefaultDialer(Context context) { + return instance.isDefaultDialer(context); } - @VisibleForTesting(otherwise = VisibleForTesting.NONE) - public static void setHasPermissionForTesting(Boolean hasPermission) { - hasPermissionForTesting = hasPermission; + /** Contains an implementation for {@link TelecomUtil} methods */ + @VisibleForTesting() + public static class TelecomUtilImpl { + + public boolean isInCall(Context context) { + if (hasReadPhoneStatePermission(context)) { + return getTelecomManager(context).isInCall(); + } + return false; + } + + public boolean hasPermission(Context context, String permission) { + return ContextCompat.checkSelfPermission(context, permission) + == PackageManager.PERMISSION_GRANTED; + } + + public boolean isDefaultDialer(Context context) { + final boolean result = + TextUtils.equals( + context.getPackageName(), getTelecomManager(context).getDefaultDialerPackage()); + if (result) { + sWarningLogged = false; + } else { + if (!sWarningLogged) { + // Log only once to prevent spam. + LogUtil.w(TAG, "Dialer is not currently set to be default dialer"); + sWarningLogged = true; + } + } + return result; + } } } diff --git a/java/com/android/dialer/theme/res/values-af/strings.xml b/java/com/android/dialer/theme/res/values-af/strings.xml index f263a8186..17e6ceac4 100644 --- a/java/com/android/dialer/theme/res/values-af/strings.xml +++ b/java/com/android/dialer/theme/res/values-af/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefoonhokkie" "Foon" + "Kameratoestemming is geaktiveer" + "Video-oproep" "Bel"
      diff --git a/java/com/android/dialer/theme/res/values-am/strings.xml b/java/com/android/dialer/theme/res/values-am/strings.xml index 4f3624428..5b0b2fd1f 100644 --- a/java/com/android/dialer/theme/res/values-am/strings.xml +++ b/java/com/android/dialer/theme/res/values-am/strings.xml @@ -21,5 +21,7 @@ "%s %d" "የሕዝብ ስልክ" "ስልክ" + "የካሜራ ፈቃድ ነቅቷል" + "የቪዲዮ ጥሪ" "ደውል" diff --git a/java/com/android/dialer/theme/res/values-ar/strings.xml b/java/com/android/dialer/theme/res/values-ar/strings.xml index 951bde2c0..ea3468e61 100644 --- a/java/com/android/dialer/theme/res/values-ar/strings.xml +++ b/java/com/android/dialer/theme/res/values-ar/strings.xml @@ -21,5 +21,7 @@ "%s %d" "هاتف يعمل بالعملة" "الهاتف" + "تم تمكين إذن الكاميرا" + "مكالمة فيديو" "اتصال" diff --git a/java/com/android/dialer/theme/res/values-az/strings.xml b/java/com/android/dialer/theme/res/values-az/strings.xml index 08eaf337b..91ead1b68 100644 --- a/java/com/android/dialer/theme/res/values-az/strings.xml +++ b/java/com/android/dialer/theme/res/values-az/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Taksofon" "Telefon" + "Kamera icazəsi aktiv edildi" + "Video zəng" "Zəng edin" diff --git a/java/com/android/dialer/theme/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/theme/res/values-b+sr+Latn/strings.xml index 01cdb4722..a1e59654f 100644 --- a/java/com/android/dialer/theme/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/theme/res/values-b+sr+Latn/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefonska govornica" "Telefon" + "Omogućena je dozvola za kameru" + "Uputi video poziv" "Pozovi" diff --git a/java/com/android/dialer/theme/res/values-be/strings.xml b/java/com/android/dialer/theme/res/values-be/strings.xml index 49be019bf..881aa7f20 100644 --- a/java/com/android/dialer/theme/res/values-be/strings.xml +++ b/java/com/android/dialer/theme/res/values-be/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Таксафон" "Тэлефон" + "Уключаны дазвол на выкарыстанне камеры" + "Відэавыклік" "Выклікаць" diff --git a/java/com/android/dialer/theme/res/values-bg/strings.xml b/java/com/android/dialer/theme/res/values-bg/strings.xml index 87af9f0fd..debc23803 100644 --- a/java/com/android/dialer/theme/res/values-bg/strings.xml +++ b/java/com/android/dialer/theme/res/values-bg/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Обществен телефон" "Телефон" + "Активирано бе разрешението за камерата" + "Видеообаждане" "Обаждане" diff --git a/java/com/android/dialer/theme/res/values-bn/strings.xml b/java/com/android/dialer/theme/res/values-bn/strings.xml index ab1c65b5d..806ee8e02 100644 --- a/java/com/android/dialer/theme/res/values-bn/strings.xml +++ b/java/com/android/dialer/theme/res/values-bn/strings.xml @@ -21,5 +21,7 @@ "%s %d" "পে ফোন" "ফোন" + "ক্যামেরার অনুমতি সক্ষম করা হয়েছে" + "ভিডিও কল" "কল করুন" diff --git a/java/com/android/dialer/theme/res/values-bs/strings.xml b/java/com/android/dialer/theme/res/values-bs/strings.xml index 01cdb4722..bed71a230 100644 --- a/java/com/android/dialer/theme/res/values-bs/strings.xml +++ b/java/com/android/dialer/theme/res/values-bs/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefonska govornica" "Telefon" + "Dozvola za kameru je omogućena" + "Videopoziv" "Pozovi" diff --git a/java/com/android/dialer/theme/res/values-ca/strings.xml b/java/com/android/dialer/theme/res/values-ca/strings.xml index 1e21a1f76..5140ca574 100644 --- a/java/com/android/dialer/theme/res/values-ca/strings.xml +++ b/java/com/android/dialer/theme/res/values-ca/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telèfon públic" "Telèfon" + "S\'ha activat el permís d\'accés a la càmera" + "Videotrucada" "Truca" diff --git a/java/com/android/dialer/theme/res/values-cs/strings.xml b/java/com/android/dialer/theme/res/values-cs/strings.xml index ca7bad9bb..a951fe7a8 100644 --- a/java/com/android/dialer/theme/res/values-cs/strings.xml +++ b/java/com/android/dialer/theme/res/values-cs/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefonní automat" "Telefon" + "Byl povolen přístup k fotoaparátu" + "Zahájit videohovor" "Volat" diff --git a/java/com/android/dialer/theme/res/values-da/strings.xml b/java/com/android/dialer/theme/res/values-da/strings.xml index c606b281e..54f185041 100644 --- a/java/com/android/dialer/theme/res/values-da/strings.xml +++ b/java/com/android/dialer/theme/res/values-da/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Mønttelefon" "Opkald" + "Kameratilladelse er aktiveret" + "Videoopkald" "Ring op" diff --git a/java/com/android/dialer/theme/res/values-de/strings.xml b/java/com/android/dialer/theme/res/values-de/strings.xml index d214287c2..0c97581cb 100644 --- a/java/com/android/dialer/theme/res/values-de/strings.xml +++ b/java/com/android/dialer/theme/res/values-de/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Münztelefon" "Telefon" + "Berechtigung für Kamera aktiviert" + "Videoanruf" "Anrufen" diff --git a/java/com/android/dialer/theme/res/values-el/strings.xml b/java/com/android/dialer/theme/res/values-el/strings.xml index abe1d3f18..1c34a69c7 100644 --- a/java/com/android/dialer/theme/res/values-el/strings.xml +++ b/java/com/android/dialer/theme/res/values-el/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Τηλέφωνο με χρέωση" "Τηλέφωνο" + "Το δικαίωμα χρήσης της κάμερας έχει ενεργοποιηθεί" + "Βιντεοκλήση" "Κλήση" diff --git a/java/com/android/dialer/theme/res/values-en-rAU/strings.xml b/java/com/android/dialer/theme/res/values-en-rAU/strings.xml index b086b4ca5..136d7df33 100644 --- a/java/com/android/dialer/theme/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/theme/res/values-en-rAU/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Payphone" "Phone" + "Camera permission enabled" + "Video call" "Call" diff --git a/java/com/android/dialer/theme/res/values-en-rGB/strings.xml b/java/com/android/dialer/theme/res/values-en-rGB/strings.xml index b086b4ca5..136d7df33 100644 --- a/java/com/android/dialer/theme/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/theme/res/values-en-rGB/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Payphone" "Phone" + "Camera permission enabled" + "Video call" "Call" diff --git a/java/com/android/dialer/theme/res/values-en-rIN/strings.xml b/java/com/android/dialer/theme/res/values-en-rIN/strings.xml index b086b4ca5..136d7df33 100644 --- a/java/com/android/dialer/theme/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/theme/res/values-en-rIN/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Payphone" "Phone" + "Camera permission enabled" + "Video call" "Call" diff --git a/java/com/android/dialer/theme/res/values-es-rUS/strings.xml b/java/com/android/dialer/theme/res/values-es-rUS/strings.xml index aee2d0a9d..90837b76a 100644 --- a/java/com/android/dialer/theme/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/theme/res/values-es-rUS/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Teléfono público" "Teléfono" + "Se activó el permiso de la cámara" + "Videollamada" "Llamar" diff --git a/java/com/android/dialer/theme/res/values-es/strings.xml b/java/com/android/dialer/theme/res/values-es/strings.xml index 343ac2158..c2d3ee3d4 100644 --- a/java/com/android/dialer/theme/res/values-es/strings.xml +++ b/java/com/android/dialer/theme/res/values-es/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Teléfono público" "Teléfono" + "Se ha habilitado el acceso a la cámara" + "Videollamada" "Llamar" diff --git a/java/com/android/dialer/theme/res/values-et/strings.xml b/java/com/android/dialer/theme/res/values-et/strings.xml index 5b1e6c044..269fa6403 100644 --- a/java/com/android/dialer/theme/res/values-et/strings.xml +++ b/java/com/android/dialer/theme/res/values-et/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefoniautomaat" "Telefon" + "Kaameraluba on antud" + "Videokõne" "Helista" diff --git a/java/com/android/dialer/theme/res/values-eu/strings.xml b/java/com/android/dialer/theme/res/values-eu/strings.xml index dbb4f703c..14345f05f 100644 --- a/java/com/android/dialer/theme/res/values-eu/strings.xml +++ b/java/com/android/dialer/theme/res/values-eu/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefono publikoa" "Telefonoa" + "Kamera atzitzeko baimena eman da" + "Bideo-deia" "Deitu" diff --git a/java/com/android/dialer/theme/res/values-fa/strings.xml b/java/com/android/dialer/theme/res/values-fa/strings.xml index 99bed5f22..f751f3404 100644 --- a/java/com/android/dialer/theme/res/values-fa/strings.xml +++ b/java/com/android/dialer/theme/res/values-fa/strings.xml @@ -21,5 +21,7 @@ "%d %s" "تلفن عمومی" "تلفن" + "مجوز دوربین فعال شد" + "تماس ویدیویی" "تماس" diff --git a/java/com/android/dialer/theme/res/values-fi/strings.xml b/java/com/android/dialer/theme/res/values-fi/strings.xml index a180be565..0c09d7f43 100644 --- a/java/com/android/dialer/theme/res/values-fi/strings.xml +++ b/java/com/android/dialer/theme/res/values-fi/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Maksupuhelin" "Puhelin" + "Kameran käyttöoikeus myönnettiin" + "Videopuhelu" "Soita" diff --git a/java/com/android/dialer/theme/res/values-fr-rCA/strings.xml b/java/com/android/dialer/theme/res/values-fr-rCA/strings.xml index 18a70bbe8..7d901ca39 100644 --- a/java/com/android/dialer/theme/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/theme/res/values-fr-rCA/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Cabine téléphonique" "Téléphone" + "Autorisation d\'accès à l\'appareil photo activée" + "Appel vidéo" "Appeler" diff --git a/java/com/android/dialer/theme/res/values-fr/strings.xml b/java/com/android/dialer/theme/res/values-fr/strings.xml index 18a70bbe8..1c30ef1e7 100644 --- a/java/com/android/dialer/theme/res/values-fr/strings.xml +++ b/java/com/android/dialer/theme/res/values-fr/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Cabine téléphonique" "Téléphone" + "Autorisation d\'accès à l\'appareil photo accordée" + "Appel vidéo" "Appeler" diff --git a/java/com/android/dialer/theme/res/values-gl/strings.xml b/java/com/android/dialer/theme/res/values-gl/strings.xml index fbbad6c07..083d395ad 100644 --- a/java/com/android/dialer/theme/res/values-gl/strings.xml +++ b/java/com/android/dialer/theme/res/values-gl/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Teléfono público" "Teléfono" + "Activouse o permiso de acceso á cámara" + "Videochamada" "Chamar" diff --git a/java/com/android/dialer/theme/res/values-gu/strings.xml b/java/com/android/dialer/theme/res/values-gu/strings.xml index 9b38dcd3f..4baba6971 100644 --- a/java/com/android/dialer/theme/res/values-gu/strings.xml +++ b/java/com/android/dialer/theme/res/values-gu/strings.xml @@ -21,5 +21,7 @@ "%s %d" "પેફોન" "ફોન" + "કૅમેરાની પરવાનગી સક્ષમ કરી" + "વિડિઓ કૉલ" "કૉલ કરો" diff --git a/java/com/android/dialer/theme/res/values-hi/strings.xml b/java/com/android/dialer/theme/res/values-hi/strings.xml index ee360b404..758be5d22 100644 --- a/java/com/android/dialer/theme/res/values-hi/strings.xml +++ b/java/com/android/dialer/theme/res/values-hi/strings.xml @@ -21,5 +21,7 @@ "%s %d" "पे-फ़ोन" "फ़ोन" + "कैमरे की अनुमति सक्षम की गई" + "वीडियो कॉल" "कॉल करें" diff --git a/java/com/android/dialer/theme/res/values-hr/strings.xml b/java/com/android/dialer/theme/res/values-hr/strings.xml index 92e19567d..89a5aeec2 100644 --- a/java/com/android/dialer/theme/res/values-hr/strings.xml +++ b/java/com/android/dialer/theme/res/values-hr/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Javna telefonska govornica" "Telefon" + "Omogućen je pristup kameri" + "Videopoziv" "Pozovi" diff --git a/java/com/android/dialer/theme/res/values-hu/strings.xml b/java/com/android/dialer/theme/res/values-hu/strings.xml index dfcc876e4..30051d430 100644 --- a/java/com/android/dialer/theme/res/values-hu/strings.xml +++ b/java/com/android/dialer/theme/res/values-hu/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Nyilvános telefon" "Telefon" + "Kameraengedély megadva" + "Videohívás" "Hívás" diff --git a/java/com/android/dialer/theme/res/values-hy/strings.xml b/java/com/android/dialer/theme/res/values-hy/strings.xml index 3b4e862b3..6577dab16 100644 --- a/java/com/android/dialer/theme/res/values-hy/strings.xml +++ b/java/com/android/dialer/theme/res/values-hy/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Բջջային տերմինալ" "Հեռախոս" + "Տեսախցիկից օգտվելու թույլտվությունը տրամադրված է" + "Տեսազանգ" "Զանգել" diff --git a/java/com/android/dialer/theme/res/values-in/strings.xml b/java/com/android/dialer/theme/res/values-in/strings.xml index eda15a299..d2d72b832 100644 --- a/java/com/android/dialer/theme/res/values-in/strings.xml +++ b/java/com/android/dialer/theme/res/values-in/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telepon Umum" "Telepon" + "Izin kamera diaktifkan" + "Video call" "Telepon" diff --git a/java/com/android/dialer/theme/res/values-is/strings.xml b/java/com/android/dialer/theme/res/values-is/strings.xml index cda7fc8fe..ff3faf836 100644 --- a/java/com/android/dialer/theme/res/values-is/strings.xml +++ b/java/com/android/dialer/theme/res/values-is/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Símasjálfsali" "Sími" + "Myndavélarheimild virk" + "Hringja myndsímtal" "Hringja" diff --git a/java/com/android/dialer/theme/res/values-it/strings.xml b/java/com/android/dialer/theme/res/values-it/strings.xml index fa2caa6bb..4b26288ac 100644 --- a/java/com/android/dialer/theme/res/values-it/strings.xml +++ b/java/com/android/dialer/theme/res/values-it/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Cabina telefonica" "Telefono" + "Autorizzazioni della fotocamera attivate" + "Videochiamata" "Chiama" diff --git a/java/com/android/dialer/theme/res/values-iw/strings.xml b/java/com/android/dialer/theme/res/values-iw/strings.xml index 18d87eaf7..09abf2ed1 100644 --- a/java/com/android/dialer/theme/res/values-iw/strings.xml +++ b/java/com/android/dialer/theme/res/values-iw/strings.xml @@ -21,5 +21,7 @@ "%s %d" "טלפון ציבורי" "טלפון" + "הרשאת הגישה למצלמה הופעלה" + "שיחת וידאו" "התקשר" diff --git a/java/com/android/dialer/theme/res/values-ja/strings.xml b/java/com/android/dialer/theme/res/values-ja/strings.xml index 39215598c..551d67983 100644 --- a/java/com/android/dialer/theme/res/values-ja/strings.xml +++ b/java/com/android/dialer/theme/res/values-ja/strings.xml @@ -21,5 +21,7 @@ "%s%d)" "公衆電話" "電話" + "カメラへのアクセスを自動で許可しました" + "ビデオハングアウト" "発信" diff --git a/java/com/android/dialer/theme/res/values-ka/strings.xml b/java/com/android/dialer/theme/res/values-ka/strings.xml index 18e7cb34d..ab225954e 100644 --- a/java/com/android/dialer/theme/res/values-ka/strings.xml +++ b/java/com/android/dialer/theme/res/values-ka/strings.xml @@ -21,5 +21,7 @@ "%s %d" "გადახდის ტელეფონი" "ტელეფონი" + "კამერაზე წვდომის ნებართვა ჩართულია" + "ვიდეოზარი" "დარეკვა" diff --git a/java/com/android/dialer/theme/res/values-kk/strings.xml b/java/com/android/dialer/theme/res/values-kk/strings.xml index f9c62d32e..d3a1b7bb9 100644 --- a/java/com/android/dialer/theme/res/values-kk/strings.xml +++ b/java/com/android/dialer/theme/res/values-kk/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Автомат-телефон" "Телефон" + "Камера рұқсаты қосылды" + "Бейне қоңырау" "Қоңырау шалу" diff --git a/java/com/android/dialer/theme/res/values-km/strings.xml b/java/com/android/dialer/theme/res/values-km/strings.xml index 7e375cf99..900f1d690 100644 --- a/java/com/android/dialer/theme/res/values-km/strings.xml +++ b/java/com/android/dialer/theme/res/values-km/strings.xml @@ -21,5 +21,7 @@ "%s %d" "ទូរស័ព្ទសាធារណៈ" "ទូរស័ព្ទ" + "បានបើក​ការអនុញ្ញាត​កាមេរ៉ា" + "ការ​ហៅវីដេអូ" "ហៅ​ទូរសព្ទ" diff --git a/java/com/android/dialer/theme/res/values-kn/strings.xml b/java/com/android/dialer/theme/res/values-kn/strings.xml index 718fea0d4..ab9f816db 100644 --- a/java/com/android/dialer/theme/res/values-kn/strings.xml +++ b/java/com/android/dialer/theme/res/values-kn/strings.xml @@ -21,5 +21,7 @@ "%s %d" "ಪೇಫೋನ್" "ಫೋನ್" + "ಕ್ಯಾಮರಾ ಅನುಮತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" + "ವೀಡಿಯೊ ಕರೆ" "ಕರೆಮಾಡಿ" diff --git a/java/com/android/dialer/theme/res/values-ko/strings.xml b/java/com/android/dialer/theme/res/values-ko/strings.xml index 29f608c6e..b5ac55695 100644 --- a/java/com/android/dialer/theme/res/values-ko/strings.xml +++ b/java/com/android/dialer/theme/res/values-ko/strings.xml @@ -21,5 +21,7 @@ "%s %d" "공중전화" "휴대전화" + "카메라 권한 사용 가능" + "화상 통화" "전화" diff --git a/java/com/android/dialer/theme/res/values-ky/strings.xml b/java/com/android/dialer/theme/res/values-ky/strings.xml index 905b8c5ff..0a9bec294 100644 --- a/java/com/android/dialer/theme/res/values-ky/strings.xml +++ b/java/com/android/dialer/theme/res/values-ky/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Таксофон" "Телефон" + "Камеранын уруксаты иштетилди" + "Видео чалуу" "Чалуу" diff --git a/java/com/android/dialer/theme/res/values-lo/strings.xml b/java/com/android/dialer/theme/res/values-lo/strings.xml index 6826a753f..d33d43e5b 100644 --- a/java/com/android/dialer/theme/res/values-lo/strings.xml +++ b/java/com/android/dialer/theme/res/values-lo/strings.xml @@ -21,5 +21,7 @@ "%s %d" "ຕູ້​ໂທ​ລະ​ສັບ​ສາ​ທາ​ລະ​ນະ" "ໂທລະສັບ" + "ເປີດໃຊ້ສິດອະນຸຍາດກ້ອງຖ່າຍຮູບແລ້ວ" + "ໂທວິດີໂອ" "ໂທ" diff --git a/java/com/android/dialer/theme/res/values-lt/strings.xml b/java/com/android/dialer/theme/res/values-lt/strings.xml index 43469a1fd..fdf31e227 100644 --- a/java/com/android/dialer/theme/res/values-lt/strings.xml +++ b/java/com/android/dialer/theme/res/values-lt/strings.xml @@ -21,5 +21,7 @@ "%d %s" "Taksofonas" "Telefonas" + "Fotoaparato leidimas įgalintas" + "Vaizdo skambutis" "Skambinti" diff --git a/java/com/android/dialer/theme/res/values-lv/strings.xml b/java/com/android/dialer/theme/res/values-lv/strings.xml index f9a6deca8..031c5bdea 100644 --- a/java/com/android/dialer/theme/res/values-lv/strings.xml +++ b/java/com/android/dialer/theme/res/values-lv/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Maksas tālrunis" "Tālrunis" + "Kameras atļauja iespējota" + "Videozvans" "Zvanīt" diff --git a/java/com/android/dialer/theme/res/values-mk/strings.xml b/java/com/android/dialer/theme/res/values-mk/strings.xml index 1328edbb2..d89d12e90 100644 --- a/java/com/android/dialer/theme/res/values-mk/strings.xml +++ b/java/com/android/dialer/theme/res/values-mk/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Говорница" "Телефон" + "Дозволата за камера е овозможена" + "Воспоставете видеоповик" "Повикајте" diff --git a/java/com/android/dialer/theme/res/values-ml/strings.xml b/java/com/android/dialer/theme/res/values-ml/strings.xml index 03f9533ff..f02ceeb06 100644 --- a/java/com/android/dialer/theme/res/values-ml/strings.xml +++ b/java/com/android/dialer/theme/res/values-ml/strings.xml @@ -21,5 +21,7 @@ "%s %d" "പണം നൽകി ഉപയോഗിക്കുന്ന ഫോൺ" "ഫോണ്‍" + "ക്യാമറ അനുമതി നൽകി" + "വീഡിയോ കോള്‍" "വിളിക്കുക" diff --git a/java/com/android/dialer/theme/res/values-mn/strings.xml b/java/com/android/dialer/theme/res/values-mn/strings.xml index c47f08324..7a07e5d4d 100644 --- a/java/com/android/dialer/theme/res/values-mn/strings.xml +++ b/java/com/android/dialer/theme/res/values-mn/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Payphone" "Утас" + "Камерын зөвшөөрөл идэвхжсэн" + "Видео дуудлага" "Залгах" diff --git a/java/com/android/dialer/theme/res/values-mr/strings.xml b/java/com/android/dialer/theme/res/values-mr/strings.xml index 41a9c96e0..eeb9afa1e 100644 --- a/java/com/android/dialer/theme/res/values-mr/strings.xml +++ b/java/com/android/dialer/theme/res/values-mr/strings.xml @@ -21,5 +21,7 @@ "%s %d" "सार्वजनिक फोन" "फोन" + "कॅमेरा परवानगी सक्षम केली" + "व्हिडिओ कॉल" "कॉल करा" diff --git a/java/com/android/dialer/theme/res/values-ms/strings.xml b/java/com/android/dialer/theme/res/values-ms/strings.xml index b28fe26ac..2e424fdf7 100644 --- a/java/com/android/dialer/theme/res/values-ms/strings.xml +++ b/java/com/android/dialer/theme/res/values-ms/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefon Awam" "Telefon" + "Kebenaran kamera didayakan" + "Panggilan video" "Panggil" diff --git a/java/com/android/dialer/theme/res/values-my/strings.xml b/java/com/android/dialer/theme/res/values-my/strings.xml index eb21b6ef2..97b871b30 100644 --- a/java/com/android/dialer/theme/res/values-my/strings.xml +++ b/java/com/android/dialer/theme/res/values-my/strings.xml @@ -21,5 +21,7 @@ "%s %d" "ငွေပေးရသည့်ဖုန်း" "ဖုန်း" + "ကင်မရာအသုံးပြုခွင့် ဖွင့်ထားပါသည်" + "ဗီဒီယိုခေါ်ဆိုမှု" "ခေါ်ဆိုရန်" diff --git a/java/com/android/dialer/theme/res/values-nb/strings.xml b/java/com/android/dialer/theme/res/values-nb/strings.xml index dcd9b17ad..7587b7e30 100644 --- a/java/com/android/dialer/theme/res/values-nb/strings.xml +++ b/java/com/android/dialer/theme/res/values-nb/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefonkiosk" "Telefon" + "Kameratillatelsen er aktivert" + "Videosamtale" "Ring" diff --git a/java/com/android/dialer/theme/res/values-ne/strings.xml b/java/com/android/dialer/theme/res/values-ne/strings.xml index 383ac2c8d..af1ad5e24 100644 --- a/java/com/android/dialer/theme/res/values-ne/strings.xml +++ b/java/com/android/dialer/theme/res/values-ne/strings.xml @@ -21,5 +21,7 @@ "%s %d" "पेफोन" "फोन" + "क्यामेरा सम्बन्धी अनुमतिहरूलाई सक्षम पारियो" + "भिडियो कल" "कल गर्नुहोस्" diff --git a/java/com/android/dialer/theme/res/values-nl/strings.xml b/java/com/android/dialer/theme/res/values-nl/strings.xml index 96357081d..ab51c97ae 100644 --- a/java/com/android/dialer/theme/res/values-nl/strings.xml +++ b/java/com/android/dialer/theme/res/values-nl/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefooncel" "Telefoon" + "Camerarechten ingeschakeld" + "Videogesprek" "Bellen" diff --git a/java/com/android/dialer/theme/res/values-no/strings.xml b/java/com/android/dialer/theme/res/values-no/strings.xml index dcd9b17ad..7587b7e30 100644 --- a/java/com/android/dialer/theme/res/values-no/strings.xml +++ b/java/com/android/dialer/theme/res/values-no/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefonkiosk" "Telefon" + "Kameratillatelsen er aktivert" + "Videosamtale" "Ring" diff --git a/java/com/android/dialer/theme/res/values-pa/strings.xml b/java/com/android/dialer/theme/res/values-pa/strings.xml index dc23b7a69..8784bcae1 100644 --- a/java/com/android/dialer/theme/res/values-pa/strings.xml +++ b/java/com/android/dialer/theme/res/values-pa/strings.xml @@ -21,5 +21,7 @@ "%s %d" "ਪੇਫੋਨ" "ਫੋਨ" + "ਕੈਮਰਾ ਇਜਾਜ਼ਤ ਨੂੰ ਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ" + "ਵੀਡੀਓ ਕਾਲ" "ਕਾਲ ਕਰੋ" diff --git a/java/com/android/dialer/theme/res/values-pl/strings.xml b/java/com/android/dialer/theme/res/values-pl/strings.xml index 1ebaad2cc..246261e97 100644 --- a/java/com/android/dialer/theme/res/values-pl/strings.xml +++ b/java/com/android/dialer/theme/res/values-pl/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Automat telefoniczny" "Telefon" + "Uprawnienia do korzystania z aparatu zostały włączone" + "Rozmowa wideo" "Zadzwoń" diff --git a/java/com/android/dialer/theme/res/values-pt-rBR/strings.xml b/java/com/android/dialer/theme/res/values-pt-rBR/strings.xml index 6caf87cb8..c1356d9b3 100644 --- a/java/com/android/dialer/theme/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/theme/res/values-pt-rBR/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefone público" "Telefone" + "Permissão de câmera ativada" + "Videochamada" "Ligar" diff --git a/java/com/android/dialer/theme/res/values-pt-rPT/strings.xml b/java/com/android/dialer/theme/res/values-pt-rPT/strings.xml index ef7c7d6c6..2b46e44a1 100644 --- a/java/com/android/dialer/theme/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/theme/res/values-pt-rPT/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefone público" "Telefone" + "Autorização da câmara ativada" + "Videochamada" "Telefonar" diff --git a/java/com/android/dialer/theme/res/values-pt/strings.xml b/java/com/android/dialer/theme/res/values-pt/strings.xml index 6caf87cb8..c1356d9b3 100644 --- a/java/com/android/dialer/theme/res/values-pt/strings.xml +++ b/java/com/android/dialer/theme/res/values-pt/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefone público" "Telefone" + "Permissão de câmera ativada" + "Videochamada" "Ligar" diff --git a/java/com/android/dialer/theme/res/values-ro/strings.xml b/java/com/android/dialer/theme/res/values-ro/strings.xml index 4d0c09baf..8978e9240 100644 --- a/java/com/android/dialer/theme/res/values-ro/strings.xml +++ b/java/com/android/dialer/theme/res/values-ro/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefon public" "Telefon" + "Permisiunea pentru cameră a fost activată." + "Apel video" "Apelați" diff --git a/java/com/android/dialer/theme/res/values-ru/strings.xml b/java/com/android/dialer/theme/res/values-ru/strings.xml index aeab13624..a155052be 100644 --- a/java/com/android/dialer/theme/res/values-ru/strings.xml +++ b/java/com/android/dialer/theme/res/values-ru/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Телефон-автомат" "Телефон" + "Доступ к камере разрешен" + "Видеовызов" "Позвонить" diff --git a/java/com/android/dialer/theme/res/values-si/strings.xml b/java/com/android/dialer/theme/res/values-si/strings.xml index ba3bb0577..424a11255 100644 --- a/java/com/android/dialer/theme/res/values-si/strings.xml +++ b/java/com/android/dialer/theme/res/values-si/strings.xml @@ -21,5 +21,7 @@ "%s %d" "පේෆෝනය" "දුරකථනය" + "කැමරා අවසර සබල කර ඇත" + "වීඩියෝ ඇමතුම" "ඇමතුම" diff --git a/java/com/android/dialer/theme/res/values-sk/strings.xml b/java/com/android/dialer/theme/res/values-sk/strings.xml index 6863463ae..411b85edc 100644 --- a/java/com/android/dialer/theme/res/values-sk/strings.xml +++ b/java/com/android/dialer/theme/res/values-sk/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefónny automat" "Telefón" + "Povolenie pre fotoaparát je aktivované" + "Videohovor" "Volať" diff --git a/java/com/android/dialer/theme/res/values-sl/strings.xml b/java/com/android/dialer/theme/res/values-sl/strings.xml index 1b1776abc..85a3e2b8e 100644 --- a/java/com/android/dialer/theme/res/values-sl/strings.xml +++ b/java/com/android/dialer/theme/res/values-sl/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefonska govorilnica" "Telefon" + "Dovoljenje za dostop do fotoaparata je omogočeno" + "Videoklic" "Pokliči" diff --git a/java/com/android/dialer/theme/res/values-sq/strings.xml b/java/com/android/dialer/theme/res/values-sq/strings.xml index 0d7084af6..5cbd587d3 100644 --- a/java/com/android/dialer/theme/res/values-sq/strings.xml +++ b/java/com/android/dialer/theme/res/values-sq/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefon me pagesë" "Telefoni" + "Leja e kamerës është aktivizuar" + "Telefonatë me video" "Telefono" diff --git a/java/com/android/dialer/theme/res/values-sr/strings.xml b/java/com/android/dialer/theme/res/values-sr/strings.xml index a744e9530..310da735d 100644 --- a/java/com/android/dialer/theme/res/values-sr/strings.xml +++ b/java/com/android/dialer/theme/res/values-sr/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Телефонска говорница" "Телефон" + "Омогућена је дозвола за камеру" + "Упути видео позив" "Позови" diff --git a/java/com/android/dialer/theme/res/values-sv/strings.xml b/java/com/android/dialer/theme/res/values-sv/strings.xml index f409807ef..af8e5f7b1 100644 --- a/java/com/android/dialer/theme/res/values-sv/strings.xml +++ b/java/com/android/dialer/theme/res/values-sv/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Telefonautomat" "Telefon" + "Kamerabehörighet har aktiverats" + "Videosamtal" "Ring" diff --git a/java/com/android/dialer/theme/res/values-sw/strings.xml b/java/com/android/dialer/theme/res/values-sw/strings.xml index a2f98888d..31615febb 100644 --- a/java/com/android/dialer/theme/res/values-sw/strings.xml +++ b/java/com/android/dialer/theme/res/values-sw/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Simu ya kulipia" "Simu" + "Imewasha ruhusa ya kamera" + "Simu ya video" "Piga simu" diff --git a/java/com/android/dialer/theme/res/values-ta/strings.xml b/java/com/android/dialer/theme/res/values-ta/strings.xml index a4f55f5c7..ab15f0b0c 100644 --- a/java/com/android/dialer/theme/res/values-ta/strings.xml +++ b/java/com/android/dialer/theme/res/values-ta/strings.xml @@ -21,5 +21,7 @@ "%s %d" "கட்டணத் தொலைபேசி" "மொபைல்" + "கேமராவிற்கான அனுமதி இயக்கப்பட்டது" + "வீடியோ அழைப்பு" "அழை" diff --git a/java/com/android/dialer/theme/res/values-te/strings.xml b/java/com/android/dialer/theme/res/values-te/strings.xml index 59f00ca1f..4a6fca1fb 100644 --- a/java/com/android/dialer/theme/res/values-te/strings.xml +++ b/java/com/android/dialer/theme/res/values-te/strings.xml @@ -21,5 +21,7 @@ "%s %d" "పే ఫోన్" "ఫోన్" + "కెమెరా అనుమతిని ప్రారంభించాము" + "వీడియో కాల్" "కాల్ చేయి" diff --git a/java/com/android/dialer/theme/res/values-th/strings.xml b/java/com/android/dialer/theme/res/values-th/strings.xml index 3870b4da6..51db053fa 100644 --- a/java/com/android/dialer/theme/res/values-th/strings.xml +++ b/java/com/android/dialer/theme/res/values-th/strings.xml @@ -21,5 +21,7 @@ "%s %d" "โทรศัพท์สาธารณะ" "โทรศัพท์" + "ให้สิทธิ์เข้าถึงกล้องถ่ายรูปแล้ว" + "แฮงเอาท์วิดีโอ" "โทร" diff --git a/java/com/android/dialer/theme/res/values-tl/strings.xml b/java/com/android/dialer/theme/res/values-tl/strings.xml index 81692789f..97f69ec1c 100644 --- a/java/com/android/dialer/theme/res/values-tl/strings.xml +++ b/java/com/android/dialer/theme/res/values-tl/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Payphone" "Telepono" + "Na-enable ang pahintulot sa camera" + "Mag-video call" "Tawag" diff --git a/java/com/android/dialer/theme/res/values-tr/strings.xml b/java/com/android/dialer/theme/res/values-tr/strings.xml index c11cd1375..b38f0674d 100644 --- a/java/com/android/dialer/theme/res/values-tr/strings.xml +++ b/java/com/android/dialer/theme/res/values-tr/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Ankesörlü telefon" "Telefon" + "Kamera izni etkinleştirildi" + "Görüntülü görüşme" "Telefon et" diff --git a/java/com/android/dialer/theme/res/values-uk/strings.xml b/java/com/android/dialer/theme/res/values-uk/strings.xml index c87fe89b7..f0702770a 100644 --- a/java/com/android/dialer/theme/res/values-uk/strings.xml +++ b/java/com/android/dialer/theme/res/values-uk/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Таксофон" "Телефон" + "Камері надано дозвіл" + "Відеодзвінок" "Виклик" diff --git a/java/com/android/dialer/theme/res/values-ur/strings.xml b/java/com/android/dialer/theme/res/values-ur/strings.xml index abc0d6d6b..e9a4b44bb 100644 --- a/java/com/android/dialer/theme/res/values-ur/strings.xml +++ b/java/com/android/dialer/theme/res/values-ur/strings.xml @@ -21,5 +21,7 @@ "%s %d" "پے فون" "فون" + "کیمرا کی اجازت فعال ہے" + "ویڈیو کال" "کال کریں" diff --git a/java/com/android/dialer/theme/res/values-uz/strings.xml b/java/com/android/dialer/theme/res/values-uz/strings.xml index 2889f3f12..2bbaf2080 100644 --- a/java/com/android/dialer/theme/res/values-uz/strings.xml +++ b/java/com/android/dialer/theme/res/values-uz/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Taksofon" "Telefon" + "Kameraga kirishga ruxsat berildi" + "Video suhbat" "Chaqirish" diff --git a/java/com/android/dialer/theme/res/values-vi/strings.xml b/java/com/android/dialer/theme/res/values-vi/strings.xml index b014516be..fae318091 100644 --- a/java/com/android/dialer/theme/res/values-vi/strings.xml +++ b/java/com/android/dialer/theme/res/values-vi/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Điện thoại công cộng" "Điện thoại" + "Đã bật quyền sử dụng máy ảnh" + "Gọi điện video" "Gọi" diff --git a/java/com/android/dialer/theme/res/values-zh-rCN/strings.xml b/java/com/android/dialer/theme/res/values-zh-rCN/strings.xml index baff75258..2e6096296 100644 --- a/java/com/android/dialer/theme/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/theme/res/values-zh-rCN/strings.xml @@ -21,5 +21,7 @@ "%s %d" "公用电话" "电话" + "已启用相机使用权限" + "视频通话" "拨打电话" diff --git a/java/com/android/dialer/theme/res/values-zh-rHK/strings.xml b/java/com/android/dialer/theme/res/values-zh-rHK/strings.xml index 8b26663d1..7b08024ac 100644 --- a/java/com/android/dialer/theme/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/theme/res/values-zh-rHK/strings.xml @@ -21,5 +21,7 @@ "%s %d" "公共電話" "電話" + "已啟用相機權限" + "視像通話" "通話" diff --git a/java/com/android/dialer/theme/res/values-zh-rTW/strings.xml b/java/com/android/dialer/theme/res/values-zh-rTW/strings.xml index 24a5c10d1..57d7fe2b1 100644 --- a/java/com/android/dialer/theme/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/theme/res/values-zh-rTW/strings.xml @@ -21,5 +21,7 @@ "%s %d" "公用電話" "電話" + "已啟用相機權限" + "視訊通話" "撥號" diff --git a/java/com/android/dialer/theme/res/values-zu/strings.xml b/java/com/android/dialer/theme/res/values-zu/strings.xml index 96cd79873..d0dd7288b 100644 --- a/java/com/android/dialer/theme/res/values-zu/strings.xml +++ b/java/com/android/dialer/theme/res/values-zu/strings.xml @@ -21,5 +21,7 @@ "%s %d" "Ucingo olufakwa imali" "Ifoni" + "Imvume yekhamera inikwe amandla" + "Ikholi yevidiyo" "Shaya" diff --git a/java/com/android/dialer/theme/res/values/strings.xml b/java/com/android/dialer/theme/res/values/strings.xml index a14693f51..af61d3596 100644 --- a/java/com/android/dialer/theme/res/values/strings.xml +++ b/java/com/android/dialer/theme/res/values/strings.xml @@ -30,6 +30,12 @@ used in the Launcher icon. --> Phone + + Camera permission enabled + + + Video call + Call diff --git a/java/com/android/dialer/theme/res/values/themes.xml b/java/com/android/dialer/theme/res/values/themes.xml index 0d0c45f90..124682692 100644 --- a/java/com/android/dialer/theme/res/values/themes.xml +++ b/java/com/android/dialer/theme/res/values/themes.xml @@ -1,4 +1,19 @@ + + + + + + + + diff --git a/java/com/android/dialer/util/CallUtil.java b/java/com/android/dialer/util/CallUtil.java index 81a4bb21e..0afe930c9 100644 --- a/java/com/android/dialer/util/CallUtil.java +++ b/java/com/android/dialer/util/CallUtil.java @@ -21,6 +21,7 @@ import android.net.Uri; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; +import com.android.dialer.common.LogUtil; import com.android.dialer.compat.CompatUtils; import com.android.dialer.phonenumberutil.PhoneNumberHelper; import java.util.List; @@ -40,6 +41,9 @@ public class CallUtil { */ public static final int VIDEO_CALLING_PRESENCE = 2; + private static boolean hasInitializedIsVideoEnabledState; + private static boolean cachedIsVideoEnabledState; + /** Return Uri with an appropriate scheme, accepting both SIP and usual phone call numbers. */ public static Uri getCallUri(String number) { if (PhoneNumberHelper.isUriNumber(number)) { @@ -102,7 +106,23 @@ public class CallUtil { * false} otherwise. */ public static boolean isVideoEnabled(Context context) { - return (getVideoCallingAvailability(context) & VIDEO_CALLING_ENABLED) != 0; + boolean isVideoEnabled = (getVideoCallingAvailability(context) & VIDEO_CALLING_ENABLED) != 0; + + // Log everytime the video enabled state changes. + if (!hasInitializedIsVideoEnabledState) { + LogUtil.i("CallUtil.isVideoEnabled", "isVideoEnabled: " + isVideoEnabled); + hasInitializedIsVideoEnabledState = true; + cachedIsVideoEnabledState = isVideoEnabled; + } else if (cachedIsVideoEnabledState != isVideoEnabled) { + LogUtil.i( + "CallUtil.isVideoEnabled", + "isVideoEnabled changed from %b to %b", + cachedIsVideoEnabledState, + isVideoEnabled); + cachedIsVideoEnabledState = isVideoEnabled; + } + + return isVideoEnabled; } /** diff --git a/java/com/android/dialer/util/PermissionsUtil.java b/java/com/android/dialer/util/PermissionsUtil.java index 466e86204..34828317d 100644 --- a/java/com/android/dialer/util/PermissionsUtil.java +++ b/java/com/android/dialer/util/PermissionsUtil.java @@ -16,15 +16,33 @@ package com.android.dialer.util; +import static android.Manifest.permission.ACCESS_COARSE_LOCATION; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.Manifest.permission.ADD_VOICEMAIL; +import static android.Manifest.permission.CALL_PHONE; +import static android.Manifest.permission.MODIFY_PHONE_STATE; +import static android.Manifest.permission.READ_CALL_LOG; +import static android.Manifest.permission.READ_CONTACTS; +import static android.Manifest.permission.READ_PHONE_STATE; +import static android.Manifest.permission.READ_VOICEMAIL; +import static android.Manifest.permission.WRITE_CALL_LOG; +import static android.Manifest.permission.WRITE_CONTACTS; +import static android.Manifest.permission.WRITE_VOICEMAIL; + import android.Manifest.permission; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v4.content.LocalBroadcastManager; import com.android.dialer.common.LogUtil; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; /** Utility class to help with runtime permissions. */ public class PermissionsUtil { @@ -32,6 +50,27 @@ public class PermissionsUtil { private static final String PERMISSION_PREFERENCE = "dialer_permissions"; private static final String CEQUINT_PERMISSION = "com.cequint.ecid.CALLER_ID_LOOKUP"; + // Permissions list retrieved from application manifest. + // Starting in Android O Permissions must be explicitly enumerated: + // https://developer.android.com/preview/behavior-changes.html#rmp + public static final List allPhoneGroupPermissionsUsedInDialer = + Collections.unmodifiableList( + Arrays.asList( + READ_CALL_LOG, + WRITE_CALL_LOG, + READ_PHONE_STATE, + MODIFY_PHONE_STATE, + CALL_PHONE, + ADD_VOICEMAIL, + WRITE_VOICEMAIL, + READ_VOICEMAIL)); + + public static final List allContactsGroupPermissionsUsedInDialer = + Collections.unmodifiableList(Arrays.asList(READ_CONTACTS, WRITE_CONTACTS)); + + public static final List allLocationGroupPermissionsUsedInDialer = + Collections.unmodifiableList(Arrays.asList(ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION)); + public static boolean hasPhonePermissions(Context context) { return hasPermission(context, permission.CALL_PHONE); } @@ -147,4 +186,25 @@ public class PermissionsUtil { final Intent intent = new Intent(permission); LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } + + /** + * Returns a list of permissions currently not granted to the application from the supplied list. + * + * @param context - The Application context. + * @param permissionsList - A list of permissions to check if the current application has been + * granted. + * @return An array of permissions that are currently DENIED to the application; a subset of + * permissionsList. + */ + @NonNull + public static String[] getPermissionsCurrentlyDenied( + @NonNull Context context, @NonNull List permissionsList) { + List permissionsCurrentlyDenied = new ArrayList<>(); + for (String permission : permissionsList) { + if (!hasPermission(context, permission)) { + permissionsCurrentlyDenied.add(permission); + } + } + return permissionsCurrentlyDenied.toArray(new String[permissionsCurrentlyDenied.size()]); + } } diff --git a/java/com/android/dialer/widget/DialerToolbar.java b/java/com/android/dialer/widget/DialerToolbar.java index 9e1058383..fe0e86110 100644 --- a/java/com/android/dialer/widget/DialerToolbar.java +++ b/java/com/android/dialer/widget/DialerToolbar.java @@ -41,6 +41,11 @@ public class DialerToolbar extends Toolbar { setNavigationIcon(R.drawable.quantum_ic_close_white_24); setNavigationContentDescription(R.string.toolbar_close); setNavigationOnClickListener(v -> ((Activity) context).finish()); + setPaddingRelative( + getPaddingStart(), + getPaddingTop(), + getResources().getDimensionPixelSize(R.dimen.toolbar_end_padding), + getPaddingBottom()); } @Override diff --git a/java/com/android/dialer/widget/EmptyContentView.java b/java/com/android/dialer/widget/EmptyContentView.java new file mode 100644 index 000000000..a76ab98d6 --- /dev/null +++ b/java/com/android/dialer/widget/EmptyContentView.java @@ -0,0 +1,127 @@ +/* + * 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.widget; + +import android.content.Context; +import android.support.annotation.StringRes; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +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; + + private @StringRes int actionLabel; + + 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.empty_list_view_image); + mDescriptionView = (TextView) findViewById(R.id.empty_list_view_message); + mActionView = (TextView) findViewById(R.id.empty_list_view_action); + 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(@StringRes int resourceId) { + actionLabel = resourceId; + if (resourceId == NO_LABEL) { + mActionView.setText(null); + mActionView.setVisibility(View.GONE); + } else { + mActionView.setText(resourceId); + mActionView.setVisibility(View.VISIBLE); + } + } + + public @StringRes int getActionLabel() { + return actionLabel; + } + + 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/widget/LockableViewPager.java b/java/com/android/dialer/widget/LockableViewPager.java new file mode 100644 index 000000000..b5d4022e7 --- /dev/null +++ b/java/com/android/dialer/widget/LockableViewPager.java @@ -0,0 +1,50 @@ +/* + * 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.widget; + +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; + +/** {@link ViewPager} useful for disabled swiping between pages. */ +public class LockableViewPager extends ViewPager { + + private boolean swipingLocked; + + public LockableViewPager(Context context, AttributeSet attributeSet) { + super(context, attributeSet); + } + + public void setSwipingLocked(boolean swipingLocked) { + this.swipingLocked = swipingLocked; + } + + public boolean isSwipingLocked() { + return swipingLocked; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent motionEvent) { + return !swipingLocked && super.onInterceptTouchEvent(motionEvent); + } + + @Override + public boolean onTouchEvent(MotionEvent motionEvent) { + return !swipingLocked && super.onTouchEvent(motionEvent); + } +} diff --git a/java/com/android/dialer/widget/MessageFragment.java b/java/com/android/dialer/widget/MessageFragment.java index b136f47eb..615ad3b77 100644 --- a/java/com/android/dialer/widget/MessageFragment.java +++ b/java/com/android/dialer/widget/MessageFragment.java @@ -23,6 +23,7 @@ import android.text.Editable; import android.text.InputFilter; import android.text.TextUtils; import android.text.TextWatcher; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -31,11 +32,13 @@ import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.TextView.OnEditorActionListener; import com.android.dialer.common.Assert; import com.android.dialer.common.FragmentUtils; /** Fragment used to compose call with message fragment. */ -public class MessageFragment extends Fragment implements OnClickListener, TextWatcher { +public class MessageFragment extends Fragment + implements OnClickListener, TextWatcher, OnEditorActionListener { private static final String CHAR_LIMIT_KEY = "char_limit"; private static final String SHOW_SEND_ICON_KEY = "show_send_icon"; private static final String MESSAGE_LIST_KEY = "message_list"; @@ -69,7 +72,7 @@ public class MessageFragment extends Fragment implements OnClickListener, TextWa LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_message, container, false); - sendMessage = (ImageView) view.findViewById(R.id.send_message); + sendMessage = view.findViewById(R.id.send_message); sendMessageContainer = view.findViewById(R.id.count_and_send_container); if (getArguments().getBoolean(SHOW_SEND_ICON_KEY, false)) { sendMessage.setVisibility(View.VISIBLE); @@ -77,18 +80,19 @@ public class MessageFragment extends Fragment implements OnClickListener, TextWa sendMessageContainer.setOnClickListener(this); } - customMessage = (EditText) view.findViewById(R.id.custom_message); + customMessage = view.findViewById(R.id.custom_message); customMessage.addTextChangedListener(this); + customMessage.setOnEditorActionListener(this); charLimit = getArguments().getInt(CHAR_LIMIT_KEY, NO_CHAR_LIMIT); if (charLimit != NO_CHAR_LIMIT) { - remainingChar = (TextView) view.findViewById(R.id.remaining_characters); + remainingChar = view.findViewById(R.id.remaining_characters); remainingChar.setVisibility(View.VISIBLE); - remainingChar = (TextView) view.findViewById(R.id.remaining_characters); - remainingChar.setText("" + charLimit); + remainingChar = view.findViewById(R.id.remaining_characters); + remainingChar.setText(Integer.toString(charLimit)); customMessage.setFilters(new InputFilter[] {new InputFilter.LengthFilter(charLimit)}); } - LinearLayout messageContainer = (LinearLayout) view.findViewById(R.id.message_container); + LinearLayout messageContainer = view.findViewById(R.id.message_container); for (String message : getArguments().getStringArray(MESSAGE_LIST_KEY)) { TextView textView = (TextView) inflater.inflate(R.layout.selectable_text_view, null); textView.setOnClickListener(this); @@ -123,11 +127,20 @@ public class MessageFragment extends Fragment implements OnClickListener, TextWa @Override public void afterTextChanged(Editable s) { if (charLimit != NO_CHAR_LIMIT) { - remainingChar.setText("" + (charLimit - s.length())); + remainingChar.setText(Integer.toString(charLimit - s.length())); } getListener().onMessageFragmentAfterTextChange(s.toString()); } + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (getMessage() == null) { + return false; + } + getListener().onMessageFragmentSendMessage(getMessage()); + return true; + } + private Listener getListener() { return FragmentUtils.getParentUnsafe(this, Listener.class); } diff --git a/java/com/android/dialer/widget/res/drawable-hdpi/empty_contacts.png b/java/com/android/dialer/widget/res/drawable-hdpi/empty_contacts.png new file mode 100644 index 000000000..d3c0378f5 Binary files /dev/null and b/java/com/android/dialer/widget/res/drawable-hdpi/empty_contacts.png differ diff --git a/java/com/android/dialer/widget/res/drawable-mdpi/empty_contacts.png b/java/com/android/dialer/widget/res/drawable-mdpi/empty_contacts.png new file mode 100644 index 000000000..2ce7eae37 Binary files /dev/null and b/java/com/android/dialer/widget/res/drawable-mdpi/empty_contacts.png differ diff --git a/java/com/android/dialer/widget/res/drawable-xhdpi/empty_contacts.png b/java/com/android/dialer/widget/res/drawable-xhdpi/empty_contacts.png new file mode 100644 index 000000000..65b1de333 Binary files /dev/null and b/java/com/android/dialer/widget/res/drawable-xhdpi/empty_contacts.png differ diff --git a/java/com/android/dialer/widget/res/drawable-xxhdpi/empty_contacts.png b/java/com/android/dialer/widget/res/drawable-xxhdpi/empty_contacts.png new file mode 100644 index 000000000..407d78c9c Binary files /dev/null and b/java/com/android/dialer/widget/res/drawable-xxhdpi/empty_contacts.png differ diff --git a/java/com/android/dialer/widget/res/drawable-xxxhdpi/empty_contacts.png b/java/com/android/dialer/widget/res/drawable-xxxhdpi/empty_contacts.png new file mode 100644 index 000000000..5893965e9 Binary files /dev/null and b/java/com/android/dialer/widget/res/drawable-xxxhdpi/empty_contacts.png differ diff --git a/java/com/android/dialer/widget/res/layout-land/empty_content_view.xml b/java/com/android/dialer/widget/res/layout-land/empty_content_view.xml new file mode 100644 index 000000000..00344bf44 --- /dev/null +++ b/java/com/android/dialer/widget/res/layout-land/empty_content_view.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + diff --git a/java/com/android/dialer/widget/res/layout/dialer_toolbar.xml b/java/com/android/dialer/widget/res/layout/dialer_toolbar.xml index c4aac65fb..023b0ffe2 100644 --- a/java/com/android/dialer/widget/res/layout/dialer_toolbar.xml +++ b/java/com/android/dialer/widget/res/layout/dialer_toolbar.xml @@ -29,7 +29,9 @@ android:gravity="top" android:textSize="@dimen/toolbar_title_text_size" android:textColor="@color/background_dialer_white" - android:fontFamily="sans-serif-medium"/> + android:fontFamily="sans-serif-medium" + android:maxLines="1" + android:ellipsize="end"/> + android:visibility="gone" + android:maxLines="1" + android:ellipsize="end"/> \ No newline at end of file diff --git a/java/com/android/dialer/widget/res/layout/empty_content_view.xml b/java/com/android/dialer/widget/res/layout/empty_content_view.xml new file mode 100644 index 000000000..177744385 --- /dev/null +++ b/java/com/android/dialer/widget/res/layout/empty_content_view.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + diff --git a/java/com/android/dialer/widget/res/layout/fragment_message.xml b/java/com/android/dialer/widget/res/layout/fragment_message.xml index e39e03aee..5b0bab536 100644 --- a/java/com/android/dialer/widget/res/layout/fragment_message.xml +++ b/java/com/android/dialer/widget/res/layout/fragment_message.xml @@ -48,7 +48,9 @@ android:textColorHint="@color/dialer_edit_text_hint_color" android:background="@color/background_dialer_white" android:textCursorDrawable="@drawable/searchedittext_custom_cursor" - android:layout_toStartOf="@+id/count_and_send_container"/> + android:layout_toStartOf="@+id/count_and_send_container" + android:inputType="textShortMessage|textCapSentences" + android:imeOptions="actionSend"/> + + "Skryf \'n gepasmaakte boodskap" "Maak toe" + "Jy het nog nie enige kontakte nie" + "Skep nuwe kontak" + "Skakel aan" + "Skakel die kontaktetoestemming aan om jou kontakte te sien." + "Geen kontakte-program beskikbaar nie" diff --git a/java/com/android/dialer/widget/res/values-am/strings.xml b/java/com/android/dialer/widget/res/values-am/strings.xml index f11b46835..3952e83cc 100644 --- a/java/com/android/dialer/widget/res/values-am/strings.xml +++ b/java/com/android/dialer/widget/res/values-am/strings.xml @@ -1,6 +1,28 @@ + + "ብጁ መልዕክት ይጻፉ" "ዝጋ" + "ገና ምንም እውቂያዎች የሉዎትም" + + + "አብራ" + "የእርስዎን እውቂያዎች ለማየት፣ የእውቂያዎች ፍቃዱን ያብሩ።" + "ምንም የእውቂያዎች መተግበሪያ አይገኝም" diff --git a/java/com/android/dialer/widget/res/values-ar/strings.xml b/java/com/android/dialer/widget/res/values-ar/strings.xml index cb2e73378..26ed748f0 100644 --- a/java/com/android/dialer/widget/res/values-ar/strings.xml +++ b/java/com/android/dialer/widget/res/values-ar/strings.xml @@ -1,6 +1,27 @@ + + "كتابة رسالة مخصصة" "إغلاق" + "ليست لديك أية جهات اتصال حتى الآن" + "إنشاء جهة اتصال" + "تشغيل" + "للاطلاع على جهات الاتصال، شغِّل إذن جهات الاتصال." + "لا يتوفر تطبيق لجهات الاتصال" diff --git a/java/com/android/dialer/widget/res/values-az/strings.xml b/java/com/android/dialer/widget/res/values-az/strings.xml index 3860a5846..cb40af6d7 100644 --- a/java/com/android/dialer/widget/res/values-az/strings.xml +++ b/java/com/android/dialer/widget/res/values-az/strings.xml @@ -1,6 +1,28 @@ + + "Fərdi mesaj yazın" "Bağlayın" + "Hələ heç bir kontakt yoxdur" + + + "Aktiv edin" + "Kontaktları görmək üçün Kontakt icazəsini aktiv edin." + "Kontakt tətbiqi əlçatan deyil" diff --git a/java/com/android/dialer/widget/res/values-b+sr+Latn/strings.xml b/java/com/android/dialer/widget/res/values-b+sr+Latn/strings.xml index daefd9020..fea3cb0ef 100644 --- a/java/com/android/dialer/widget/res/values-b+sr+Latn/strings.xml +++ b/java/com/android/dialer/widget/res/values-b+sr+Latn/strings.xml @@ -1,6 +1,27 @@ + + "Napišite prilagođenu poruku" "Zatvorite" + "Još uvek nemate nijedan kontakt" + "Napravi novi kontakt" + "Uključi" + "Da biste videli kontakte, uključite dozvolu za Kontakte." + "Nema dostupne aplikacije za kontakte" diff --git a/java/com/android/dialer/widget/res/values-be/strings.xml b/java/com/android/dialer/widget/res/values-be/strings.xml index 87861321f..6805984c3 100644 --- a/java/com/android/dialer/widget/res/values-be/strings.xml +++ b/java/com/android/dialer/widget/res/values-be/strings.xml @@ -1,6 +1,28 @@ + + "Напісаць карыстальніцкае паведамленне" "Закрыць" + "У вас пакуль няма ніякіх кантактаў" + + + "Уключыць" + "Каб бачыць свае кантакты, уключыце дазвол для Кантактаў." + "Праграмы для аперацый з кантактамі няма" diff --git a/java/com/android/dialer/widget/res/values-bg/strings.xml b/java/com/android/dialer/widget/res/values-bg/strings.xml index 35e980c5f..fbb87d031 100644 --- a/java/com/android/dialer/widget/res/values-bg/strings.xml +++ b/java/com/android/dialer/widget/res/values-bg/strings.xml @@ -1,6 +1,27 @@ + + "Напишете свое съобщение" "Затваряне" + "Още нямате контакти" + "Създаване на нов контакт" + "Включване" + "За да видите контактите си, включете разрешението за Контакти." + "Няма налично приложение за контакти" diff --git a/java/com/android/dialer/widget/res/values-bn/strings.xml b/java/com/android/dialer/widget/res/values-bn/strings.xml index 9e1707114..58bf44c6a 100644 --- a/java/com/android/dialer/widget/res/values-bn/strings.xml +++ b/java/com/android/dialer/widget/res/values-bn/strings.xml @@ -1,6 +1,27 @@ + + "একটি কাস্টম বার্তা লিখুন" "বন্ধ করুন" + "আপনার এখনও পর্যন্ত কোনো পরিচিতি নেই" + "নতুন পরিচিতি তৈরি করুন" + "চালু করুন" + "আপনার পরিচিতিগুলি দেখতে, পরিচিতিগুলির অনুমতি চালু করুন।" + "কোনো পরিচিতি অ্যাপ্লিকেশান উপলব্ধ নয়" diff --git a/java/com/android/dialer/widget/res/values-bs/strings.xml b/java/com/android/dialer/widget/res/values-bs/strings.xml index 0bc1a9c15..239c07412 100644 --- a/java/com/android/dialer/widget/res/values-bs/strings.xml +++ b/java/com/android/dialer/widget/res/values-bs/strings.xml @@ -1,6 +1,27 @@ + + "Napišite prilagođenu poruku" "Zatvori" + "Još nemate nijedan kontakt" + "Kreirajte novi kontakt" + "Uključi" + "Da vidite kontakte, uključite dozvolu za Kontakte." + "Nije dostupna nijedna aplikacija za kontakte" diff --git a/java/com/android/dialer/widget/res/values-ca/strings.xml b/java/com/android/dialer/widget/res/values-ca/strings.xml index 863930039..8f01cb53e 100644 --- a/java/com/android/dialer/widget/res/values-ca/strings.xml +++ b/java/com/android/dialer/widget/res/values-ca/strings.xml @@ -1,6 +1,28 @@ + + "Escriu un miss. personalitzat" "Tanca" + "Encara no tens cap contacte" + + + "Activa" + "Activa el permís Contactes per veure els teus contactes." + "No hi ha cap contacte disponible" diff --git a/java/com/android/dialer/widget/res/values-cs/strings.xml b/java/com/android/dialer/widget/res/values-cs/strings.xml index 829aab8dd..ee8d14022 100644 --- a/java/com/android/dialer/widget/res/values-cs/strings.xml +++ b/java/com/android/dialer/widget/res/values-cs/strings.xml @@ -1,6 +1,28 @@ + + "Napište vlastní zprávu" "Zavřít" + "Zatím nemáte žádné kontakty" + + + "Povolit" + "Pokud chcete zobrazit kontakty, povolte aplikaci přístup ke Kontaktům." + "Není k dispozici žádná aplikace pro práci s kontakty" diff --git a/java/com/android/dialer/widget/res/values-da/strings.xml b/java/com/android/dialer/widget/res/values-da/strings.xml index 9381f36f5..0e449489d 100644 --- a/java/com/android/dialer/widget/res/values-da/strings.xml +++ b/java/com/android/dialer/widget/res/values-da/strings.xml @@ -1,6 +1,28 @@ + + "Skriv en tilpasset besked" "Luk" + "Du har endnu ikke nogen kontaktpersoner" + + + "Slå til" + "Slå tilladelsen Kontaktpersoner til for at se dine kontaktpersoner." + "Der er ingen tilgængelig app til kontaktpersoner" diff --git a/java/com/android/dialer/widget/res/values-de/strings.xml b/java/com/android/dialer/widget/res/values-de/strings.xml index 949fe9e49..f650df9f0 100644 --- a/java/com/android/dialer/widget/res/values-de/strings.xml +++ b/java/com/android/dialer/widget/res/values-de/strings.xml @@ -1,6 +1,27 @@ + + "Eigene Nachricht schreiben" "Schließen" + "Du hast noch keine Kontakte" + "Neuen Kontakt erstellen" + "Aktivieren" + "Aktiviere die Berechtigung \"Kontakte\", um deine Kontakte abzurufen." + "Keine Kontakte-App verfügbar" diff --git a/java/com/android/dialer/widget/res/values-el/strings.xml b/java/com/android/dialer/widget/res/values-el/strings.xml index 21e049bf7..849fd6a8a 100644 --- a/java/com/android/dialer/widget/res/values-el/strings.xml +++ b/java/com/android/dialer/widget/res/values-el/strings.xml @@ -1,6 +1,28 @@ + + "Γράψτε ένα προσαρμ. μήνυμα" "Κλείσιμο" + "Δεν έχετε επαφές ακόμη" + + + "Ενεργοποίηση" + "Για να δείτε τις επαφές σας, ενεργοποιήστε την άδεια πρόσβασης στις Επαφές." + "Δεν υπάρχει διαθέσιμη εφαρμογή επαφών" diff --git a/java/com/android/dialer/widget/res/values-en-rAU/strings.xml b/java/com/android/dialer/widget/res/values-en-rAU/strings.xml index 7f22b46da..33cba3337 100644 --- a/java/com/android/dialer/widget/res/values-en-rAU/strings.xml +++ b/java/com/android/dialer/widget/res/values-en-rAU/strings.xml @@ -1,6 +1,27 @@ + + "Write a custom message" "Close" + "You don\'t have any contacts yet" + "Create new contact" + "Turn on" + "To see your contacts, turn on the Contacts permission." + "No contacts app available" diff --git a/java/com/android/dialer/widget/res/values-en-rGB/strings.xml b/java/com/android/dialer/widget/res/values-en-rGB/strings.xml index 7f22b46da..33cba3337 100644 --- a/java/com/android/dialer/widget/res/values-en-rGB/strings.xml +++ b/java/com/android/dialer/widget/res/values-en-rGB/strings.xml @@ -1,6 +1,27 @@ + + "Write a custom message" "Close" + "You don\'t have any contacts yet" + "Create new contact" + "Turn on" + "To see your contacts, turn on the Contacts permission." + "No contacts app available" diff --git a/java/com/android/dialer/widget/res/values-en-rIN/strings.xml b/java/com/android/dialer/widget/res/values-en-rIN/strings.xml index 7f22b46da..33cba3337 100644 --- a/java/com/android/dialer/widget/res/values-en-rIN/strings.xml +++ b/java/com/android/dialer/widget/res/values-en-rIN/strings.xml @@ -1,6 +1,27 @@ + + "Write a custom message" "Close" + "You don\'t have any contacts yet" + "Create new contact" + "Turn on" + "To see your contacts, turn on the Contacts permission." + "No contacts app available" diff --git a/java/com/android/dialer/widget/res/values-es-rUS/strings.xml b/java/com/android/dialer/widget/res/values-es-rUS/strings.xml index c7fbdaa58..8c257b2d0 100644 --- a/java/com/android/dialer/widget/res/values-es-rUS/strings.xml +++ b/java/com/android/dialer/widget/res/values-es-rUS/strings.xml @@ -1,6 +1,28 @@ + + "Escribe tu propio mensaje" "Cerrar" + "Aún no tienes contactos" + + + "Activar" + "Para ver los contactos, activa el permiso Contactos." + "No hay ninguna app de contactos disponible" diff --git a/java/com/android/dialer/widget/res/values-es/strings.xml b/java/com/android/dialer/widget/res/values-es/strings.xml index 507e8af0d..dcb695e20 100644 --- a/java/com/android/dialer/widget/res/values-es/strings.xml +++ b/java/com/android/dialer/widget/res/values-es/strings.xml @@ -1,6 +1,27 @@ + + "Mensaje personalizado" "Cerrar" + "Aún no tienes contactos" + "Crear un contacto" + "Activar" + "Para ver tus contactos, activa el permiso de Contactos." + "No hay aplicaciones de contactos disponibles" diff --git a/java/com/android/dialer/widget/res/values-et/strings.xml b/java/com/android/dialer/widget/res/values-et/strings.xml index 71dab4276..f7357c279 100644 --- a/java/com/android/dialer/widget/res/values-et/strings.xml +++ b/java/com/android/dialer/widget/res/values-et/strings.xml @@ -1,6 +1,28 @@ + + "Kirjutage kohandatud sõnum" "Sule" + "Teil pole veel kontakte" + + + "Lülita sisse" + "Kontaktide vaatamiseks lülitage sisse kontaktide luba." + "Kontaktide rakendus pole saadaval" diff --git a/java/com/android/dialer/widget/res/values-eu/strings.xml b/java/com/android/dialer/widget/res/values-eu/strings.xml index b8e4085a0..f4d0d1d7a 100644 --- a/java/com/android/dialer/widget/res/values-eu/strings.xml +++ b/java/com/android/dialer/widget/res/values-eu/strings.xml @@ -1,6 +1,28 @@ + + "Idatzi mezu bat" "Itxi" + "Oraindik ez duzu kontakturik" + + + "Aktibatu" + "Kontaktuak ikusteko, aktibatu Kontaktuak atzitzeko baimena." + "Ez dago kontaktu-aplikaziorik erabilgarri" diff --git a/java/com/android/dialer/widget/res/values-fa/strings.xml b/java/com/android/dialer/widget/res/values-fa/strings.xml index 0c3b1d4f5..9168ac293 100644 --- a/java/com/android/dialer/widget/res/values-fa/strings.xml +++ b/java/com/android/dialer/widget/res/values-fa/strings.xml @@ -1,6 +1,28 @@ + + "پیام سفارشی بنویسید" "بستن" + "هنوز هیچ مخاطبی ندارید" + + + "فعال‌سازی" + "برای دیدن مخاطبینتان، مجوز «مخاطبین» را روشن کنید." + "هیچ برنامه مخاطبی در دسترس نیست" diff --git a/java/com/android/dialer/widget/res/values-fi/strings.xml b/java/com/android/dialer/widget/res/values-fi/strings.xml index e0e971cd8..80f190253 100644 --- a/java/com/android/dialer/widget/res/values-fi/strings.xml +++ b/java/com/android/dialer/widget/res/values-fi/strings.xml @@ -1,6 +1,28 @@ + + "Kirjoita oma viesti" "Sulje" + "Sinulla ei ole vielä yhteystietoja." + + + "Ota käyttöön" + "Jos haluat katsella yhteystietojasi, ota Yhteystiedot-käyttöoikeus käyttöön." + "Yhteystietosovellusta ei ole käytettävissä." diff --git a/java/com/android/dialer/widget/res/values-fr-rCA/strings.xml b/java/com/android/dialer/widget/res/values-fr-rCA/strings.xml index 9776385b4..778550997 100644 --- a/java/com/android/dialer/widget/res/values-fr-rCA/strings.xml +++ b/java/com/android/dialer/widget/res/values-fr-rCA/strings.xml @@ -1,6 +1,27 @@ + + "Rédiger message personnalisé" "Fermer" + "Vous n\'avez pas encore de contacts" + "Créer un contact" + "Activer" + "Pour consulter vos contacts, activez l\'autorisation Contacts." + "Aucune application Contacts n\'est disponible" diff --git a/java/com/android/dialer/widget/res/values-fr/strings.xml b/java/com/android/dialer/widget/res/values-fr/strings.xml index fececd84a..be8810fd9 100644 --- a/java/com/android/dialer/widget/res/values-fr/strings.xml +++ b/java/com/android/dialer/widget/res/values-fr/strings.xml @@ -1,6 +1,27 @@ + + "Écrire mon propre message" "Fermer" + "Vous n\'avez pas encore de contacts." + "Créer un contact" + "Activer" + "Pour consulter vos contacts, activez l\'autorisation Contacts." + "Aucune application de gestion des contacts n\'est disponible" diff --git a/java/com/android/dialer/widget/res/values-gl/strings.xml b/java/com/android/dialer/widget/res/values-gl/strings.xml index 6a756810b..a519e68b6 100644 --- a/java/com/android/dialer/widget/res/values-gl/strings.xml +++ b/java/com/android/dialer/widget/res/values-gl/strings.xml @@ -1,6 +1,27 @@ + + "Escribe unha mensaxe personalizada" "Pechar" + "Aínda non tes ningún contacto" + "Crear novo contacto" + "Activar" + "Para ver os teus contactos, activa o permiso de Contactos." + "Non hai ningunha aplicación de contactos dispoñible" diff --git a/java/com/android/dialer/widget/res/values-gu/strings.xml b/java/com/android/dialer/widget/res/values-gu/strings.xml index c2f8cf0e1..81e6f1011 100644 --- a/java/com/android/dialer/widget/res/values-gu/strings.xml +++ b/java/com/android/dialer/widget/res/values-gu/strings.xml @@ -1,6 +1,27 @@ + + "એક કસ્ટમ સંદેશ લખો" "બંધ કરો" + "તમે હજી સુધી કોઇપણ સંપર્કો ધરાવતાં નથી" + "નવો સંપર્ક બનાવો" + "ચાલુ કરો" + "તમારા સંપર્કો જોવા માટે, સંપર્કોની પરવાનગી ચાલુ કરો." + "કોઈ સંપર્કો ઍપ્લિકેશન ઉપલબ્ધ નથી" diff --git a/java/com/android/dialer/widget/res/values-hi/strings.xml b/java/com/android/dialer/widget/res/values-hi/strings.xml index 63c94e7f6..622cdca06 100644 --- a/java/com/android/dialer/widget/res/values-hi/strings.xml +++ b/java/com/android/dialer/widget/res/values-hi/strings.xml @@ -1,6 +1,27 @@ + + "कोई कस्टम संदेश लिखें" "बंद करें" + "आपके पास अभी कोई भी संपर्क नहीं है" + "नया संपर्क बनाएं" + "चालू करें" + "अपने संपर्क देखने के लिए, संपर्क अनुमति चालू करें." + "कोई भी संपर्क ऐप उपलब्‍ध नहीं है" diff --git a/java/com/android/dialer/widget/res/values-hr/strings.xml b/java/com/android/dialer/widget/res/values-hr/strings.xml index 28a58d453..7254bc062 100644 --- a/java/com/android/dialer/widget/res/values-hr/strings.xml +++ b/java/com/android/dialer/widget/res/values-hr/strings.xml @@ -1,6 +1,28 @@ + + "Napišite prilagođenu poruku" "Zatvaranje" + "Još nemate nijedan kontakt" + + + "Uključi" + "Da biste vidjeli svoje kontakte, uključite dopuštenje za kontakte." + "Nije dostupna nijedna aplikacija za kontakte" diff --git a/java/com/android/dialer/widget/res/values-hu/strings.xml b/java/com/android/dialer/widget/res/values-hu/strings.xml index dcd2b36ea..5301d6970 100644 --- a/java/com/android/dialer/widget/res/values-hu/strings.xml +++ b/java/com/android/dialer/widget/res/values-hu/strings.xml @@ -1,6 +1,28 @@ + + "Egyéni üzenet írása" "Bezárás" + "Még nem rendelkezik egyetlen névjeggyel sem" + + + "Bekapcsolás" + "A névjegyek megtekintéséhez kapcsolja be a Névjegyek engedélyt." + "Nincs elérhető névjegykezelő alkalmazás" diff --git a/java/com/android/dialer/widget/res/values-hy/strings.xml b/java/com/android/dialer/widget/res/values-hy/strings.xml index 7b78bb23e..95d0b7303 100644 --- a/java/com/android/dialer/widget/res/values-hy/strings.xml +++ b/java/com/android/dialer/widget/res/values-hy/strings.xml @@ -1,6 +1,27 @@ + + "Գրել տեքստն ինքնուրույն" "Փակել" + "Դեռ կոնտակտներ չունեք" + "Ստեղծել նոր կոնտակտ" + "Միացնել" + "Ձեր կոնտակտները տեսնելու համար միացրեք Կոնտակտների թույլտվությունը:" + "Կոնտակտների հավելված չկա" diff --git a/java/com/android/dialer/widget/res/values-in/strings.xml b/java/com/android/dialer/widget/res/values-in/strings.xml index b4b65504b..98dfe7be2 100644 --- a/java/com/android/dialer/widget/res/values-in/strings.xml +++ b/java/com/android/dialer/widget/res/values-in/strings.xml @@ -1,6 +1,28 @@ + + "Tulis pesan khusus" "Tutup" + "Anda belum memiliki kontak" + + + "Aktifkan" + "Untuk melihat kontak, aktifkan izin Kontak." + "Aplikasi kontak tidak tersedia" diff --git a/java/com/android/dialer/widget/res/values-is/strings.xml b/java/com/android/dialer/widget/res/values-is/strings.xml index fd844197e..22485aa46 100644 --- a/java/com/android/dialer/widget/res/values-is/strings.xml +++ b/java/com/android/dialer/widget/res/values-is/strings.xml @@ -1,6 +1,28 @@ + + "Skrifa sérsniðin skilaboð" "Loka" + "Þú ert ekki með neina tengiliði enn sem komið er" + + + "Kveikja" + "Kveiktu á tengiliðaheimildinni til að sjá tengiliðina þína." + "Ekkert tengiliðaforrit í boði" diff --git a/java/com/android/dialer/widget/res/values-it/strings.xml b/java/com/android/dialer/widget/res/values-it/strings.xml index 0af3fd2eb..059a7d644 100644 --- a/java/com/android/dialer/widget/res/values-it/strings.xml +++ b/java/com/android/dialer/widget/res/values-it/strings.xml @@ -1,6 +1,28 @@ + + "Scrivi un messaggio personalizzato" "Chiudi" + "Nessun contatto disponibile" + + + "Attiva" + "Per accedere ai tuoi contatti, attiva l\'autorizzazione Contatti." + "Nessuna app di contatti disponibile" diff --git a/java/com/android/dialer/widget/res/values-iw/strings.xml b/java/com/android/dialer/widget/res/values-iw/strings.xml index a485888ae..48bf21911 100644 --- a/java/com/android/dialer/widget/res/values-iw/strings.xml +++ b/java/com/android/dialer/widget/res/values-iw/strings.xml @@ -1,6 +1,27 @@ + + "כתוב הודעה מותאמת אישית" "סגירה" + "עדיין אין לך אנשי קשר" + "איש קשר חדש" + "הפעלה" + "עליך להפעיל את ההרשאה \'אנשי קשר\' כדי להציג את אנשי הקשר שלך." + "אין אף אפליקציה לניהול אנשי קשר" diff --git a/java/com/android/dialer/widget/res/values-ja/strings.xml b/java/com/android/dialer/widget/res/values-ja/strings.xml index 9fd65a806..969ffbac0 100644 --- a/java/com/android/dialer/widget/res/values-ja/strings.xml +++ b/java/com/android/dialer/widget/res/values-ja/strings.xml @@ -1,6 +1,28 @@ + + "カスタム メッセージを入力" "閉じる" + "連絡先はまだありません" + + + "ON にする" + "連絡先を表示するには、連絡先へのアクセスを許可する設定を ON にしてください。" + "利用できる連絡先アプリがありません" diff --git a/java/com/android/dialer/widget/res/values-ka/strings.xml b/java/com/android/dialer/widget/res/values-ka/strings.xml index 6dde04430..fcd45439e 100644 --- a/java/com/android/dialer/widget/res/values-ka/strings.xml +++ b/java/com/android/dialer/widget/res/values-ka/strings.xml @@ -1,6 +1,28 @@ + + "დაწერეთ მორგებ. შეტყობინება" "დახურვა" + "კონტაქტები ჯერ არ გაქვთ" + + + "ჩართვა" + "კონტაქტების სანახავად ჩართეთ კონტაქტების ნებართვა." + "კონტაქტების აპი მიუწვდომელია" diff --git a/java/com/android/dialer/widget/res/values-kk/strings.xml b/java/com/android/dialer/widget/res/values-kk/strings.xml index 334d915e2..cab827192 100644 --- a/java/com/android/dialer/widget/res/values-kk/strings.xml +++ b/java/com/android/dialer/widget/res/values-kk/strings.xml @@ -1,6 +1,28 @@ + + "Арнаулы хабар жазу" "Жабу" + "Әлі ешқандай контактілер жоқ" + + + "Қосу" + "Контактілерді көру үшін \"Контактілер\" рұқсатын қосыңыз." + "Контактілер қолданбасы қолжетімді емес" diff --git a/java/com/android/dialer/widget/res/values-km/strings.xml b/java/com/android/dialer/widget/res/values-km/strings.xml index d0f5633e4..2d6f2f25d 100644 --- a/java/com/android/dialer/widget/res/values-km/strings.xml +++ b/java/com/android/dialer/widget/res/values-km/strings.xml @@ -1,6 +1,28 @@ + + "សរសេរ​សារ​ផ្ទាល់ខ្លួន" "បិទ" + "អ្នកមិនទាន់មានទំនាក់ទំនងនៅឡើយទេ" + + + "បើក" + "ដើម្បីមើលទំនាក់ទំនងរបស់អ្នក សូមបើកការ​អនុញ្ញាតកម្មវិធីទំនាក់ទំនង។" + "មិនមានកម្មវិធីទំនាក់ទំនងទេ" diff --git a/java/com/android/dialer/widget/res/values-kn/strings.xml b/java/com/android/dialer/widget/res/values-kn/strings.xml index 3535bfcb7..d449cb8b7 100644 --- a/java/com/android/dialer/widget/res/values-kn/strings.xml +++ b/java/com/android/dialer/widget/res/values-kn/strings.xml @@ -1,6 +1,28 @@ + + "ಕಸ್ಟಮ್ ಸಂದೇಶವನ್ನು ಬರೆಯಿರಿ" "ಮುಚ್ಚಿ" + "ನಿಮ್ಮ ಬಳಿ ಇನ್ನೂ ಯಾವುದೇ ಸಂಪರ್ಕಗಳಿಲ್ಲ" + + + "ಆನ್ ಮಾಡಿ" + "ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ವೀಕ್ಷಿಸಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ." + "ಯಾವುದೇ ಸಂಪರ್ಕಗಳ ಅಪ್ಲಿಕೇಶನ್‌ ಲಭ್ಯವಿಲ್ಲ" diff --git a/java/com/android/dialer/widget/res/values-ko/strings.xml b/java/com/android/dialer/widget/res/values-ko/strings.xml index 8c00cea8b..0827d3648 100644 --- a/java/com/android/dialer/widget/res/values-ko/strings.xml +++ b/java/com/android/dialer/widget/res/values-ko/strings.xml @@ -1,6 +1,27 @@ + + "맞춤 메시지를 작성하세요." "닫기" + "아직 연락처가 없습니다." + "새 연락처 만들기" + "사용" + "연락처를 보려면 연락처에 액세스할 권한을 부여하세요." + "사용할 수 있는 연락처 앱이 없습니다." diff --git a/java/com/android/dialer/widget/res/values-ky/strings.xml b/java/com/android/dialer/widget/res/values-ky/strings.xml index 46ea8514c..62bd08851 100644 --- a/java/com/android/dialer/widget/res/values-ky/strings.xml +++ b/java/com/android/dialer/widget/res/values-ky/strings.xml @@ -1,6 +1,28 @@ + + "Башка билдирүүнү жазыңыз" "Жабуу" + "Азырынча эч байланышыңыз жок" + + + "Күйгүзүү" + "Байланыштарыңызды көрүү үчүн, \"Байланыштар\" уруксатын күйгүзүңүз." + "Жеткиликтүү байланыштар колдонмосу жок" diff --git a/java/com/android/dialer/widget/res/values-lo/strings.xml b/java/com/android/dialer/widget/res/values-lo/strings.xml index 0db64a78a..8b7e476d9 100644 --- a/java/com/android/dialer/widget/res/values-lo/strings.xml +++ b/java/com/android/dialer/widget/res/values-lo/strings.xml @@ -1,6 +1,27 @@ + + "ຂຽນຂໍ້ຄວາມດ້ວຍຕົນເອງ" "ປິດ" + "ທ່ານຍັງບໍ່ມີລາຍຊື່ຜູ້ຕິດຕໍ່ເທື່ອ" + "ສ້າງລາຍຊື່ຜູ້ຕິດຕໍ່ໃໝ່" + "ເປີດໃຊ້" + "ເພື່ອເບິ່ງລາຍຊື່ຜູ້ຕິດຕໍ່ຂອງທ່ານ, ໃຫ້ເປີດການອະນຸຍາດລາຍຊື່ຜູ້ຕິດຕໍ່ກ່ອນ" + "ບໍ່ມີແອັບລາຍຊື່ຜູ້ຕິດຕໍ່ທີ່ສາມາດໃຊ້ໄດ້" diff --git a/java/com/android/dialer/widget/res/values-lt/strings.xml b/java/com/android/dialer/widget/res/values-lt/strings.xml index a10b91ef6..30cc0adeb 100644 --- a/java/com/android/dialer/widget/res/values-lt/strings.xml +++ b/java/com/android/dialer/widget/res/values-lt/strings.xml @@ -1,6 +1,27 @@ + + "Parašykite tinkintą praneš." "Uždaryti" + "Dar neturite jokių kontaktų" + "Sukurti naują kontaktą" + "Įjungti" + "Jei norite peržiūrėti kontaktus, įjunkite Kontaktų leidimą." + "Nepasiekiama jokia kontaktų programa" diff --git a/java/com/android/dialer/widget/res/values-lv/strings.xml b/java/com/android/dialer/widget/res/values-lv/strings.xml index 8ff079390..87464c576 100644 --- a/java/com/android/dialer/widget/res/values-lv/strings.xml +++ b/java/com/android/dialer/widget/res/values-lv/strings.xml @@ -1,6 +1,28 @@ + + "Rakstīt pielāgotu ziņojumu" "Aizvērt" + "Jums vēl nav nevienas kontaktpersonas." + + + "Ieslēgt" + "Lai skatītu savas kontaktpersonas, ieslēdziet atļauju Kontaktpersonas." + "Nav pieejama neviena kontaktpersonu lietotne." diff --git a/java/com/android/dialer/widget/res/values-mk/strings.xml b/java/com/android/dialer/widget/res/values-mk/strings.xml index aa9be3055..cd2f86b7c 100644 --- a/java/com/android/dialer/widget/res/values-mk/strings.xml +++ b/java/com/android/dialer/widget/res/values-mk/strings.xml @@ -1,6 +1,28 @@ + + "Напиши приспособена порака" "Затвори" + "Сè уште немате контакти" + + + "Вклучи" + "За да ги видите контактите, вклучете ја дозволата за контакти." + "Нема достапна апликација за контакти" diff --git a/java/com/android/dialer/widget/res/values-ml/strings.xml b/java/com/android/dialer/widget/res/values-ml/strings.xml index b52ee401c..1799755d1 100644 --- a/java/com/android/dialer/widget/res/values-ml/strings.xml +++ b/java/com/android/dialer/widget/res/values-ml/strings.xml @@ -1,6 +1,28 @@ + + "ഒരു ഇ‌ഷ്‌ടാനുസൃത സന്ദേശം രചിക്കൂ" "അടയ്‌ക്കുക" + "നിങ്ങൾക്ക് ഇതുവരെയും കോൺടാക്റ്റുകൾ ഒന്നുമില്ല." + + + "ഓൺ ചെയ്യുക" + "നിങ്ങളുടെ കോൺടാക്റ്റുകൾ കാണുന്നതിന്, \'കോൺടാക്റ്റുകൾ\' അനുമതി ഓണാക്കുക." + "കോൺടാക്റ്റ് അപ്ലിക്കേഷനൊന്നും ലഭ്യമല്ല" diff --git a/java/com/android/dialer/widget/res/values-mn/strings.xml b/java/com/android/dialer/widget/res/values-mn/strings.xml index 6bdad8983..e5f5c2162 100644 --- a/java/com/android/dialer/widget/res/values-mn/strings.xml +++ b/java/com/android/dialer/widget/res/values-mn/strings.xml @@ -1,6 +1,27 @@ + + "Тусгай зурвас бичих" "Хаах" + "Танд одоогоор харилцагч байхгүй байна" + "Шинэ харилцагч үүсгэх" + "Асаах" + "Харилцагчдаа харахын тулд Харилцагчдын зөвшөөрлийг идэвхжүүлнэ үү." + "Ямар ч харилцагчдын апликейшн байхгүй байна" diff --git a/java/com/android/dialer/widget/res/values-mr/strings.xml b/java/com/android/dialer/widget/res/values-mr/strings.xml index 5661fa8b9..63239d21d 100644 --- a/java/com/android/dialer/widget/res/values-mr/strings.xml +++ b/java/com/android/dialer/widget/res/values-mr/strings.xml @@ -1,6 +1,27 @@ + + "एक सानुकूल संदेश लिहा" "बंद करा" + "आपल्‍याकडे अद्याप कोणतेही संपर्क नाहीत" + "नवीन संपर्क तयार करा" + "चालू करा" + "आपले संपर्क पाहण्‍यासाठी, संपर्क परवानगी चालू करा." + "कोणताही संपर्क अॅप उपलब्ध नाही" diff --git a/java/com/android/dialer/widget/res/values-ms/strings.xml b/java/com/android/dialer/widget/res/values-ms/strings.xml index 8889ccc8d..cf61fc171 100644 --- a/java/com/android/dialer/widget/res/values-ms/strings.xml +++ b/java/com/android/dialer/widget/res/values-ms/strings.xml @@ -1,6 +1,27 @@ + + "Tulis mesej tersuai" "Tutup" + "Anda belum mempunyai sebarang kenalan" + "Buat kenalan baharu" + "Hidupkan" + "Untuk melihat kenalan anda, hidupkan kebenaran Kenalan." + "Tiada apl kenalan yang tersedia" diff --git a/java/com/android/dialer/widget/res/values-my/strings.xml b/java/com/android/dialer/widget/res/values-my/strings.xml index 9a69f29eb..5d3d9ebff 100644 --- a/java/com/android/dialer/widget/res/values-my/strings.xml +++ b/java/com/android/dialer/widget/res/values-my/strings.xml @@ -1,6 +1,27 @@ + + "စိတ်ကြိုက် မက်ဆေ့ဂျ်တစ်ခု ရေးပါ" "ပိတ်ရန်" + "သင့်တွင် မည်သည့်အဆက်အသွယ်မျှ မရှိသေးပါ" + "အဆက်အသွယ်အသစ် ပြုလုပ်ရန်" + "ဖွင့်ရန်" + "အဆက်အသွယ်များကိုကြည့်ရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်ကို ဖွင့်ပါ။" + "အဆက်အသွယ်များ app မရှိပါ" diff --git a/java/com/android/dialer/widget/res/values-nb/strings.xml b/java/com/android/dialer/widget/res/values-nb/strings.xml index 100156bd1..441218267 100644 --- a/java/com/android/dialer/widget/res/values-nb/strings.xml +++ b/java/com/android/dialer/widget/res/values-nb/strings.xml @@ -1,6 +1,28 @@ + + "Skriv egendefinert melding" "Lukk" + "Du har ingen kontakter ennå" + + + "Slå på" + "For å se kontaktene dine må du slå på Kontakter-tillatelsen." + "Ingen kontaktapper er tilgjengelige" diff --git a/java/com/android/dialer/widget/res/values-ne/strings.xml b/java/com/android/dialer/widget/res/values-ne/strings.xml index abb8bb04b..e1f6e959b 100644 --- a/java/com/android/dialer/widget/res/values-ne/strings.xml +++ b/java/com/android/dialer/widget/res/values-ne/strings.xml @@ -1,6 +1,27 @@ + + "आफू अनुकूल सन्देश लेख्‍ने" "बन्द गर्नुहोस्" + "अहिलेसम्म तपाईंसँग कुनै सम्पर्कहरू छैनन्" + "नयाँ सम्पर्क सिर्जना गर्नुहोस्" + "सक्रिय गर्नुहोस्" + "आफ्ना सम्पर्कहरू हेर्न सम्पर्क सम्बन्धी अनुमतिलाई सक्रिय गर्नुहोस्।" + "सम्पर्क सम्बन्धी कुनै अनुप्रयोग उपलब्ध छैन" diff --git a/java/com/android/dialer/widget/res/values-nl/strings.xml b/java/com/android/dialer/widget/res/values-nl/strings.xml index 556028893..1fb5f5ed3 100644 --- a/java/com/android/dialer/widget/res/values-nl/strings.xml +++ b/java/com/android/dialer/widget/res/values-nl/strings.xml @@ -1,6 +1,28 @@ + + "Schrijf zelf een bericht" "Sluiten" + "Je hebt nog geen contacten" + + + "Inschakelen" + "Als je je contacten wilt bekijken, schakel je de machtiging voor Contacten in." + "Geen app voor contacten beschikbaar" diff --git a/java/com/android/dialer/widget/res/values-no/strings.xml b/java/com/android/dialer/widget/res/values-no/strings.xml index 100156bd1..441218267 100644 --- a/java/com/android/dialer/widget/res/values-no/strings.xml +++ b/java/com/android/dialer/widget/res/values-no/strings.xml @@ -1,6 +1,28 @@ + + "Skriv egendefinert melding" "Lukk" + "Du har ingen kontakter ennå" + + + "Slå på" + "For å se kontaktene dine må du slå på Kontakter-tillatelsen." + "Ingen kontaktapper er tilgjengelige" diff --git a/java/com/android/dialer/widget/res/values-pa/strings.xml b/java/com/android/dialer/widget/res/values-pa/strings.xml index 4c69c2c6e..14b7b416b 100644 --- a/java/com/android/dialer/widget/res/values-pa/strings.xml +++ b/java/com/android/dialer/widget/res/values-pa/strings.xml @@ -1,6 +1,27 @@ + + "ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਸੰਦੇਸ਼ ਲਿਖੋ" "ਬੰਦ ਕਰੋ" + "ਤੁਹਾਡੇ ਕੋਲ ਹਾਲੇ ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ ਹਨ" + "ਨਵਾਂ ਸੰਪਰਕ ਬਣਾਓ" + "ਚਾਲੂ ਕਰੋ" + "ਆਪਣੇ ਸੰਪਰਕਾਂ ਨੂੰ ਵੇਖਣ ਲਈ, ਸੰਪਰਕ ਇਜਾਜ਼ਤ ਚਾਲੂ ਕਰੋ।" + "ਕੋਈ ਸੰਪਰਕ ਐਪ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" diff --git a/java/com/android/dialer/widget/res/values-pl/strings.xml b/java/com/android/dialer/widget/res/values-pl/strings.xml index cec7a4045..3f0668c98 100644 --- a/java/com/android/dialer/widget/res/values-pl/strings.xml +++ b/java/com/android/dialer/widget/res/values-pl/strings.xml @@ -1,6 +1,27 @@ + + "Wpisz wiadomość" "Zamknij" + "Nie masz jeszcze żadnych kontaktów" + "Utwórz nowy kontakt" + "Włącz" + "Aby zobaczyć swoje kontakty, włącz uprawnienia Kontakty." + "Nie jest dostępna żadna aplikacja do obsługi kontaktów" diff --git a/java/com/android/dialer/widget/res/values-pt-rBR/strings.xml b/java/com/android/dialer/widget/res/values-pt-rBR/strings.xml index b15bfac8d..7bc501e4f 100644 --- a/java/com/android/dialer/widget/res/values-pt-rBR/strings.xml +++ b/java/com/android/dialer/widget/res/values-pt-rBR/strings.xml @@ -1,6 +1,28 @@ + + "Escreva sua mensagem" "Fechar" + "Você ainda não tem contatos" + + + "Ativar" + "Para ver seus contatos, ative a permissão para o app Contatos." + "Nenhum app de contatos disponível" diff --git a/java/com/android/dialer/widget/res/values-pt-rPT/strings.xml b/java/com/android/dialer/widget/res/values-pt-rPT/strings.xml index ece2ef2c3..459ba5790 100644 --- a/java/com/android/dialer/widget/res/values-pt-rPT/strings.xml +++ b/java/com/android/dialer/widget/res/values-pt-rPT/strings.xml @@ -1,6 +1,28 @@ + + "Escreva uma mensagem" "Fechar" + "Ainda não tem nenhum contacto" + + + "Ativar" + "Para ver os seus contactos, ative a autorização Contactos." + "Não existe nenhuma aplicação de contactos disponível" diff --git a/java/com/android/dialer/widget/res/values-pt/strings.xml b/java/com/android/dialer/widget/res/values-pt/strings.xml index b15bfac8d..7bc501e4f 100644 --- a/java/com/android/dialer/widget/res/values-pt/strings.xml +++ b/java/com/android/dialer/widget/res/values-pt/strings.xml @@ -1,6 +1,28 @@ + + "Escreva sua mensagem" "Fechar" + "Você ainda não tem contatos" + + + "Ativar" + "Para ver seus contatos, ative a permissão para o app Contatos." + "Nenhum app de contatos disponível" diff --git a/java/com/android/dialer/widget/res/values-ro/strings.xml b/java/com/android/dialer/widget/res/values-ro/strings.xml index 753b920b4..6138eb1b6 100644 --- a/java/com/android/dialer/widget/res/values-ro/strings.xml +++ b/java/com/android/dialer/widget/res/values-ro/strings.xml @@ -1,6 +1,28 @@ + + "Scrieți mesaj personalizat" "Închideți" + "Nu aveți încă persoane de contact." + + + "Activați" + "Pentru a vedea persoanele de contact, activați permisiunea pentru Agendă." + "Nu este disponibilă nicio aplicație pentru agendă" diff --git a/java/com/android/dialer/widget/res/values-ru/strings.xml b/java/com/android/dialer/widget/res/values-ru/strings.xml index bdebd3ce4..7eb9f1de1 100644 --- a/java/com/android/dialer/widget/res/values-ru/strings.xml +++ b/java/com/android/dialer/widget/res/values-ru/strings.xml @@ -1,6 +1,28 @@ + + "Добавьте свой текст" "Закрыть" + "Контактов нет" + + + "Предоставить разрешение" + "Чтобы открыть список контактов, предоставьте приложению разрешение \"Контакты\"." + "Нет приложения для работы с контактами" diff --git a/java/com/android/dialer/widget/res/values-si/strings.xml b/java/com/android/dialer/widget/res/values-si/strings.xml index 4988259d4..fb5742576 100644 --- a/java/com/android/dialer/widget/res/values-si/strings.xml +++ b/java/com/android/dialer/widget/res/values-si/strings.xml @@ -1,6 +1,28 @@ + + "අභිරුචි පණිවිඩයක් ලියන්න" "වසන්න" + "ඔබට තවම කිසිදු සම්බන්ධතාවක් නැත" + + + "ක්‍රියාත්මක කරන්න" + "ඔබේ සම්බන්ධතා බැලීමට, සම්බන්ධතා අවසරය ක්‍රියාත්මක කරන්න." + "සබඳතා යෙදුම ලබා ගැනීමට නොහැකිය" diff --git a/java/com/android/dialer/widget/res/values-sk/strings.xml b/java/com/android/dialer/widget/res/values-sk/strings.xml index 5dc1bd505..5912b574a 100644 --- a/java/com/android/dialer/widget/res/values-sk/strings.xml +++ b/java/com/android/dialer/widget/res/values-sk/strings.xml @@ -1,6 +1,28 @@ + + "Napíšte vlastnú správu" "Zavrieť" + "Zatiaľ nemáte žiadne kontakty" + + + "Zapnúť" + "Ak si chcete zobraziť kontakty, zapnite povolenie Kontakty." + "Nie je k dispozícii žiadna aplikácia na prácu s kontaktmi" diff --git a/java/com/android/dialer/widget/res/values-sl/strings.xml b/java/com/android/dialer/widget/res/values-sl/strings.xml index 0ba965b2e..1ee87d13d 100644 --- a/java/com/android/dialer/widget/res/values-sl/strings.xml +++ b/java/com/android/dialer/widget/res/values-sl/strings.xml @@ -1,6 +1,28 @@ + + "Napišite sporočilo po meri" "Zapri" + "Nimate še nobenega stika" + + + "Vklopi" + "Če si želite ogledati stike, vklopite dovoljenje za stike." + "Na voljo ni nobene aplikacije za stike" diff --git a/java/com/android/dialer/widget/res/values-sq/strings.xml b/java/com/android/dialer/widget/res/values-sq/strings.xml index 7f5e0f285..b55e47c89 100644 --- a/java/com/android/dialer/widget/res/values-sq/strings.xml +++ b/java/com/android/dialer/widget/res/values-sq/strings.xml @@ -1,6 +1,28 @@ + + "Shkruaj mesazh të person." "Mbyll" + "Nuk ke ende kontakte" + + + "Aktivizo" + "Për të parë kontaktet, aktivizo lejen e Kontakteve." + "Nuk ka asnjë aplikacion për kontaktet" diff --git a/java/com/android/dialer/widget/res/values-sr/strings.xml b/java/com/android/dialer/widget/res/values-sr/strings.xml index 446c27363..c2f269d3f 100644 --- a/java/com/android/dialer/widget/res/values-sr/strings.xml +++ b/java/com/android/dialer/widget/res/values-sr/strings.xml @@ -1,6 +1,27 @@ + + "Напишите прилагођену поруку" "Затворите" + "Још увек немате ниједан контакт" + "Направи нови контакт" + "Укључи" + "Да бисте видели контакте, укључите дозволу за Контакте." + "Нема доступне апликације за контакте" diff --git a/java/com/android/dialer/widget/res/values-sv/strings.xml b/java/com/android/dialer/widget/res/values-sv/strings.xml index 7d2f44c45..75add78ac 100644 --- a/java/com/android/dialer/widget/res/values-sv/strings.xml +++ b/java/com/android/dialer/widget/res/values-sv/strings.xml @@ -1,6 +1,27 @@ + + "Skriv anpassat meddelande" "Stäng" + "Du har inga kontakter ännu" + "Skapa ny kontakt" + "Aktivera" + "Du måste aktivera behörigheten Kontakter för att visa kontakterna." + "Det finns inga appar för kontakter" diff --git a/java/com/android/dialer/widget/res/values-sw/strings.xml b/java/com/android/dialer/widget/res/values-sw/strings.xml index d2c2a9721..a9139809f 100644 --- a/java/com/android/dialer/widget/res/values-sw/strings.xml +++ b/java/com/android/dialer/widget/res/values-sw/strings.xml @@ -1,6 +1,28 @@ + + "Andika ujumbe maalum" "Funga" + "Bado huna anwani zozote" + + + "Washa" + "Ili uone anwani zako, washa ruhusa ya Anwani." + "Hakuna programu ya anwani iliyopatikana" diff --git a/java/com/android/dialer/widget/res/values-ta/strings.xml b/java/com/android/dialer/widget/res/values-ta/strings.xml index 4061c169f..17333304f 100644 --- a/java/com/android/dialer/widget/res/values-ta/strings.xml +++ b/java/com/android/dialer/widget/res/values-ta/strings.xml @@ -1,6 +1,27 @@ + + "தனிப்பயன் செய்தியை எழுதவும்" "மூடு" + "இதுவரை தொடர்புகள் எதுவுமில்லை" + "புதிய தொடர்பை உருவாக்கு" + "இயக்கு" + "தொடர்புகளைப் பார்க்க, தொடர்புகள் அனுமதியை இயக்கவும்." + "தொடர்புகள் பயன்பாடு எதுவுமில்லை" diff --git a/java/com/android/dialer/widget/res/values-te/strings.xml b/java/com/android/dialer/widget/res/values-te/strings.xml index c2474b7ce..27e6b0536 100644 --- a/java/com/android/dialer/widget/res/values-te/strings.xml +++ b/java/com/android/dialer/widget/res/values-te/strings.xml @@ -1,6 +1,27 @@ + + "అనుకూల సందేశాన్ని వ్రాయండి" "మూసివేయి" + "మీకు ఇప్పటికీ పరిచయాలేవీ లేవు" + "కొత్త పరిచయాన్ని సృష్టించండి" + "ఆన్ చేయి" + "మీ పరిచయాలను చూడటానికి, పరిచయాల అనుమతిని ఆన్ చేయండి." + "పరిచయాల అనువర్తనం ఏదీ అందుబాటులో లేదు" diff --git a/java/com/android/dialer/widget/res/values-th/strings.xml b/java/com/android/dialer/widget/res/values-th/strings.xml index d450b4b13..40134c84d 100644 --- a/java/com/android/dialer/widget/res/values-th/strings.xml +++ b/java/com/android/dialer/widget/res/values-th/strings.xml @@ -1,6 +1,27 @@ + + "เขียนข้อความที่กำหนดเอง" "ปิด" + "คุณยังไม่มีรายชื่อติดต่อ" + "สร้างรายชื่อติดต่อใหม่" + "เปิด" + "หากต้องการดูรายชื่อติดต่อ ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ" + "ไม่มีแอปรายชื่อติดต่อที่พร้อมใช้งาน" diff --git a/java/com/android/dialer/widget/res/values-tl/strings.xml b/java/com/android/dialer/widget/res/values-tl/strings.xml index ee7c52f7b..406f18b5e 100644 --- a/java/com/android/dialer/widget/res/values-tl/strings.xml +++ b/java/com/android/dialer/widget/res/values-tl/strings.xml @@ -1,6 +1,28 @@ + + "Sumulat ng custom na mensahe" "Isara" + "Wala ka pang sinumang contact" + + + "I-on" + "Upang makita ang iyong mga contact, i-on ang pahintulot ng Mga Contact." + "Walang available na app ng mga contact" diff --git a/java/com/android/dialer/widget/res/values-tr/strings.xml b/java/com/android/dialer/widget/res/values-tr/strings.xml index 64e2ea535..e1dcabd48 100644 --- a/java/com/android/dialer/widget/res/values-tr/strings.xml +++ b/java/com/android/dialer/widget/res/values-tr/strings.xml @@ -1,6 +1,28 @@ + + "Özel bir mesaj yazın" "Kapat" + "Henüz hiç kişiniz yok" + + + "Etkinleştir" + "Kişilerinizi görmek için Kişiler iznini etkinleştirin." + "Kullanılabilir kişi uygulaması yok" diff --git a/java/com/android/dialer/widget/res/values-uk/strings.xml b/java/com/android/dialer/widget/res/values-uk/strings.xml index f8d9bb871..d1a281c64 100644 --- a/java/com/android/dialer/widget/res/values-uk/strings.xml +++ b/java/com/android/dialer/widget/res/values-uk/strings.xml @@ -1,6 +1,27 @@ + + "Ваше власне повідомлення" "Закрити" + "Ще немає контактів" + "Створити контакт" + "Увімкнути" + "Щоб переглянути контакти, увімкніть дозвіл \"Контакти\"." + "Немає додатка з контактами" diff --git a/java/com/android/dialer/widget/res/values-ur/strings.xml b/java/com/android/dialer/widget/res/values-ur/strings.xml index 6edeb5c95..d5dcad0bd 100644 --- a/java/com/android/dialer/widget/res/values-ur/strings.xml +++ b/java/com/android/dialer/widget/res/values-ur/strings.xml @@ -1,6 +1,27 @@ + + "ایک حسب ضرورت پیغام لکھیں" "بند کریں" + "آپ کے پاس ابھی تک کوئی رابطے نہیں ہیں" + "نیا رابطہ بنائیں" + "آن کریں" + "اپنے رابطے دیکھنے کیلئے رابطوں کی اجازت آن کریں۔" + "رابطوں کی کوئی ایپ دستیاب نہیں ہے" diff --git a/java/com/android/dialer/widget/res/values-uz/strings.xml b/java/com/android/dialer/widget/res/values-uz/strings.xml index 434464aef..b3003be16 100644 --- a/java/com/android/dialer/widget/res/values-uz/strings.xml +++ b/java/com/android/dialer/widget/res/values-uz/strings.xml @@ -1,6 +1,28 @@ + + "Boshqa xabar yozing" "Yopish" + "Kontaktlar yo‘q" + + + "Ruxsat berish" + "Kontaktlar ro‘yxatini ko‘rish uchun ilovaga Kontaktlarga kirishga ruxsat bering." + "Kontaktlarni ochadigan ilova yo‘q" diff --git a/java/com/android/dialer/widget/res/values-vi/strings.xml b/java/com/android/dialer/widget/res/values-vi/strings.xml index 1a30f7c96..68669ec67 100644 --- a/java/com/android/dialer/widget/res/values-vi/strings.xml +++ b/java/com/android/dialer/widget/res/values-vi/strings.xml @@ -1,6 +1,28 @@ + + "Viết tin nhắn tùy chỉnh" "Đóng" + "Bạn chưa có bất kỳ liên hệ nào" + + + "Bật" + "Để xem danh bạ của bạn, bật quyền đối với Danh bạ." + "Không có ứng dụng danh bạ" diff --git a/java/com/android/dialer/widget/res/values-zh-rCN/strings.xml b/java/com/android/dialer/widget/res/values-zh-rCN/strings.xml index 799972393..4a5e45801 100644 --- a/java/com/android/dialer/widget/res/values-zh-rCN/strings.xml +++ b/java/com/android/dialer/widget/res/values-zh-rCN/strings.xml @@ -1,6 +1,27 @@ + + "自行撰写信息" "关闭" + "您还没有任何联系人" + "创建新联系人" + "开启" + "要查看您的联系人,请开启“通讯录”权限。" + "没有可用的通讯录应用" diff --git a/java/com/android/dialer/widget/res/values-zh-rHK/strings.xml b/java/com/android/dialer/widget/res/values-zh-rHK/strings.xml index b0bfcc8d9..3d5fe6ebb 100644 --- a/java/com/android/dialer/widget/res/values-zh-rHK/strings.xml +++ b/java/com/android/dialer/widget/res/values-zh-rHK/strings.xml @@ -1,6 +1,27 @@ + + "撰寫自訂訊息" "關閉" + "您尚無任何聯絡人" + "建立新聯絡人" + "開放" + "如要查看聯絡人,請開放「通訊錄」權限。" + "沒有可用的聯絡人應用程式" diff --git a/java/com/android/dialer/widget/res/values-zh-rTW/strings.xml b/java/com/android/dialer/widget/res/values-zh-rTW/strings.xml index b0bfcc8d9..0cb8d152d 100644 --- a/java/com/android/dialer/widget/res/values-zh-rTW/strings.xml +++ b/java/com/android/dialer/widget/res/values-zh-rTW/strings.xml @@ -1,6 +1,28 @@ + + "撰寫自訂訊息" "關閉" + "你還沒有任何聯絡人" + + + "開啟" + "如要查看你的聯絡人,請開啟「聯絡人」存取權限。" + "沒有可用的聯絡人應用程式" diff --git a/java/com/android/dialer/widget/res/values-zu/strings.xml b/java/com/android/dialer/widget/res/values-zu/strings.xml index 074aa5822..ca5898341 100644 --- a/java/com/android/dialer/widget/res/values-zu/strings.xml +++ b/java/com/android/dialer/widget/res/values-zu/strings.xml @@ -1,6 +1,28 @@ + + "Bhala umlayezo wangokwezifiso" "Vala" + "Awunabo oxhumana nabo okwamanje" + + + "Vula" + "Ukuze ubone oxhumana nabo, vula imvume yoxhumana nabo." + "Alukho uhlelo lokusebenza loxhumana nabo olutholakalayo" diff --git a/java/com/android/dialer/widget/res/values/colors.xml b/java/com/android/dialer/widget/res/values/colors.xml new file mode 100644 index 000000000..c974609ef --- /dev/null +++ b/java/com/android/dialer/widget/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #b2b2b2 + \ No newline at end of file diff --git a/java/com/android/dialer/widget/res/values/dimens.xml b/java/com/android/dialer/widget/res/values/dimens.xml index 20393a842..537ad7bd7 100644 --- a/java/com/android/dialer/widget/res/values/dimens.xml +++ b/java/com/android/dialer/widget/res/values/dimens.xml @@ -26,4 +26,9 @@ 14sp 12sp 4dp + 4dp + + + 20dp + 16sp \ No newline at end of file diff --git a/java/com/android/dialer/widget/res/values/strings.xml b/java/com/android/dialer/widget/res/values/strings.xml index a5829bb0b..74a5f0f21 100644 --- a/java/com/android/dialer/widget/res/values/strings.xml +++ b/java/com/android/dialer/widget/res/values/strings.xml @@ -1,8 +1,38 @@ + Write a custom message Close + + + You don\'t have any contacts yet + + + Create new contact + + + Turn on + + + To see your contacts, turn on the Contacts permission. + + + No contacts app available \ No newline at end of file -- cgit v1.2.3