summaryrefslogtreecommitdiff
path: root/java/com/android/dialer
diff options
context:
space:
mode:
authorEric Erfanian <erfanian@google.com>2017-04-06 09:41:50 -0700
committerEric Erfanian <erfanian@google.com>2017-04-06 09:41:50 -0700
commitd8046e520a866b9948ee9ba47cf642b441ca8e23 (patch)
tree8d08d4f2292aa84dc435d455891e7ab633d95a25 /java/com/android/dialer
parentcdb1edf966a892abebcba425a85b7d4e47758302 (diff)
Update AOSP Dialer source from internal google3 repository at
cl/152373142. 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/151342913 (3/27/2017) to cl/152373142 (4/06/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: I2fbc88cf6867b90ac8b65f75e5e34468988c7217
Diffstat (limited to 'java/com/android/dialer')
-rw-r--r--java/com/android/dialer/app/AndroidManifest.xml5
-rw-r--r--java/com/android/dialer/app/DialtactsActivity.java68
-rw-r--r--java/com/android/dialer/app/SpecialCharSequenceMgr.java26
-rw-r--r--java/com/android/dialer/app/calllog/CallLogAdapter.java101
-rw-r--r--java/com/android/dialer/app/calllog/CallLogFragment.java21
-rw-r--r--java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java175
-rw-r--r--java/com/android/dialer/app/calllog/CallLogNotificationsActivity.java70
-rw-r--r--java/com/android/dialer/app/calllog/CallLogNotificationsService.java10
-rw-r--r--java/com/android/dialer/app/calllog/ClearCallLogDialog.java1
-rw-r--r--java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java5
-rw-r--r--java/com/android/dialer/app/calllog/IntentProvider.java10
-rw-r--r--java/com/android/dialer/app/calllog/MissedCallNotifier.java27
-rw-r--r--java/com/android/dialer/app/calllog/PhoneAccountHandles.java6
-rw-r--r--java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java19
-rw-r--r--java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java26
-rw-r--r--java/com/android/dialer/app/contactinfo/ContactInfoCache.java4
-rw-r--r--java/com/android/dialer/app/list/AllContactsFragment.java16
-rw-r--r--java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java6
-rw-r--r--java/com/android/dialer/app/list/DialtactsPagerAdapter.java189
-rw-r--r--java/com/android/dialer/app/list/ListsFragment.java274
-rw-r--r--java/com/android/dialer/app/list/OldSpeedDialFragment.java (renamed from java/com/android/dialer/app/list/SpeedDialFragment.java)29
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/empty_call_log.pngbin3538 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/empty_contacts.pngbin2461 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/empty_speed_dial.pngbin6041 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_archive_white_24dp.pngbin247 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_content_copy_24dp.pngbin203 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_delete_24dp.pngbin242 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_add_call.pngbin1649 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_current_call.pngbin2305 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_tt_keypad.pngbin2419 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_grade_24dp.pngbin370 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_handle.pngbin543 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_menu_history_lt.pngbin1565 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_mic_grey600.pngbin377 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_more_vert_24dp.pngbin134 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_not_interested_googblue_24dp.pngbin565 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_not_spam.pngbin858 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_pause_24dp.pngbin105 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_people_24dp.pngbin299 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_phone_24dp.pngbin347 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_play_arrow_24dp.pngbin195 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_remove.pngbin884 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_results_phone.pngbin1084 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_schedule_24dp.pngbin575 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_share_white_24dp.pngbin397 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_star.pngbin732 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_unblock.pngbin1049 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dis.pngbin1339 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dk.pngbin1337 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dis.pngbin1755 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dk.pngbin1750 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_voicemail_24dp.pngbin478 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_volume_down_24dp.pngbin186 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/ic_volume_up_24dp.pngbin365 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/search_shadow.9.pngbin183 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-hdpi/shadow_contact_photo.pngbin960 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_archive_white_24dp.pngbin181 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_content_copy_24dp.pngbin134 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_delete_24dp.pngbin195 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_grade_24dp.pngbin271 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_more_vert_24dp.pngbin112 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_pause_24dp.pngbin83 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_people_24dp.pngbin210 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_play_arrow_24dp.pngbin157 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_schedule_24dp.pngbin377 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_share_white_24dp.pngbin268 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_voicemail_24dp.pngbin221 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_volume_down_24dp.pngbin139 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-mdpi/ic_volume_up_24dp.pngbin251 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_archive_white_24dp.pngbin267 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_content_copy_24dp.pngbin188 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_delete_24dp.pngbin271 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_grade_24dp.pngbin479 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_more_vert_24dp.pngbin158 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_pause_24dp.pngbin90 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_people_24dp.pngbin368 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_play_arrow_24dp.pngbin220 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_schedule_24dp.pngbin737 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_share_white_24dp.pngbin496 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_voicemail_24dp.pngbin487 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_volume_down_24dp.pngbin212 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xhdpi/ic_volume_up_24dp.pngbin455 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_archive_white_24dp.pngbin390 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_content_copy_24dp.pngbin266 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_delete_24dp.pngbin323 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_grade_24dp.pngbin676 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_more_vert_24dp.pngbin216 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_pause_24dp.pngbin92 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_people_24dp.pngbin488 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_play_arrow_24dp.pngbin283 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_schedule_24dp.pngbin1107 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_share_white_24dp.pngbin698 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_voicemail_24dp.pngbin625 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_volume_down_24dp.pngbin291 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxhdpi/ic_volume_up_24dp.pngbin654 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_archive_white_24dp.pngbin489 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_content_copy_24dp.pngbin329 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_delete_24dp.pngbin1394 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_grade_24dp.pngbin887 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_more_vert_24dp.pngbin305 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_pause_24dp.pngbin94 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_people_24dp.pngbin636 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_play_arrow_24dp.pngbin343 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_schedule_24dp.pngbin1478 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_share_white_24dp.pngbin938 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_voicemail_24dp.pngbin971 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_volume_down_24dp.pngbin356 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable-xxxhdpi/ic_volume_up_24dp.pngbin878 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/drawable/ic_pause.xml4
-rw-r--r--java/com/android/dialer/app/res/drawable/ic_play_arrow.xml4
-rw-r--r--java/com/android/dialer/app/res/layout/call_log_list_item.xml32
-rw-r--r--java/com/android/dialer/app/res/layout/call_log_list_item_actions.xml14
-rw-r--r--java/com/android/dialer/app/res/layout/phone_favorite_tile_view.xml2
-rw-r--r--java/com/android/dialer/app/res/layout/search_edittext.xml4
-rw-r--r--java/com/android/dialer/app/res/layout/voicemail_playback_layout.xml4
-rw-r--r--java/com/android/dialer/app/res/menu/actionbar_delete.xml25
-rw-r--r--java/com/android/dialer/app/res/mipmap-hdpi/ic_launcher_phone.pngbin2780 -> 0 bytes
-rw-r--r--java/com/android/dialer/app/res/values-de/strings.xml34
-rw-r--r--java/com/android/dialer/app/res/values-en-rAU/strings.xml6
-rw-r--r--java/com/android/dialer/app/res/values-en-rGB/strings.xml6
-rw-r--r--java/com/android/dialer/app/res/values-en-rIN/strings.xml6
-rw-r--r--java/com/android/dialer/app/res/values-fa/strings.xml4
-rw-r--r--java/com/android/dialer/app/res/values/styles.xml13
-rw-r--r--java/com/android/dialer/app/settings/DialerSettingsActivity.java44
-rw-r--r--java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java4
-rw-r--r--java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java172
-rw-r--r--java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java184
-rw-r--r--java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java38
-rw-r--r--java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java2
-rw-r--r--java/com/android/dialer/app/voicemail/error/res/values-de/strings.xml12
-rw-r--r--java/com/android/dialer/backup/DialerBackupAgent.java3
-rw-r--r--java/com/android/dialer/binary/aosp/AospDialerRootComponent.java4
-rw-r--r--java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java4
-rw-r--r--java/com/android/dialer/binary/common/DialerApplication.java23
-rw-r--r--java/com/android/dialer/blocking/BlockedNumbersAutoMigrator.java97
-rw-r--r--java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java14
-rw-r--r--java/com/android/dialer/blocking/FilteredNumbersUtil.java2
-rw-r--r--java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.pngbin478 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.pngbin240 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.pngbin312 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-mdpi/ic_block_24dp.pngbin335 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-mdpi/ic_report_24dp.pngbin174 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-mdpi/ic_report_white_36dp.pngbin240 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-xhdpi/ic_block_24dp.pngbin665 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-xhdpi/ic_report_24dp.pngbin272 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-xhdpi/ic_report_white_36dp.pngbin340 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_block_24dp.pngbin973 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_report_24dp.pngbin340 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_report_white_36dp.pngbin522 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_block_24dp.pngbin1295 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_report_24dp.pngbin450 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_report_white_36dp.pngbin649 -> 0 bytes
-rw-r--r--java/com/android/dialer/blocking/res/drawable/blocked_contact.xml2
-rw-r--r--java/com/android/dialer/blocking/res/values-de/strings.xml4
-rw-r--r--java/com/android/dialer/callcomposer/CallComposerActivity.java162
-rw-r--r--java/com/android/dialer/callcomposer/CallComposerFragment.java3
-rw-r--r--java/com/android/dialer/callcomposer/CameraComposerFragment.java1
-rw-r--r--java/com/android/dialer/callcomposer/MessageComposerFragment.java18
-rw-r--r--java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml41
-rw-r--r--java/com/android/dialer/callcomposer/res/layout/fragment_camera_composer.xml3
-rw-r--r--java/com/android/dialer/callcomposer/res/layout/fragment_gallery_composer.xml3
-rw-r--r--java/com/android/dialer/callcomposer/res/layout/fragment_message_composer.xml9
-rw-r--r--java/com/android/dialer/callcomposer/res/values/dimens.xml2
-rw-r--r--java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java4
-rw-r--r--java/com/android/dialer/calldetails/CallDetailsActivity.java14
-rw-r--r--java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java1
-rw-r--r--java/com/android/dialer/calldetails/res/layout/call_details_activity.xml9
-rw-r--r--java/com/android/dialer/calldetails/res/menu/call_details_menu.xml5
-rw-r--r--java/com/android/dialer/calllogutils/CallTypeIconsView.java54
-rw-r--r--java/com/android/dialer/calllogutils/PhoneCallDetails.java3
-rw-r--r--java/com/android/dialer/common/Assert.java4
-rw-r--r--java/com/android/dialer/common/concurrent/AsyncTaskExecutors.java2
-rw-r--r--java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java255
-rw-r--r--java/com/android/dialer/common/concurrent/DialerExecutor.java100
-rw-r--r--java/com/android/dialer/common/concurrent/DialerExecutorFactory.java63
-rw-r--r--java/com/android/dialer/common/concurrent/DialerExecutors.java134
-rw-r--r--java/com/android/dialer/common/concurrent/DialerUiTaskFragment.java (renamed from java/com/android/dialer/common/concurrent/DialerAsyncTaskHelper.java)142
-rw-r--r--java/com/android/dialer/common/concurrent/ThreadUtil.java38
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_close_black_24dp.pngbin207 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_delete.pngbin805 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_voicemail.pngbin623 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_overflow_menu.pngbin503 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_close_black_24dp.pngbin164 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialpad_delete.pngbin669 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialpad_voicemail.pngbin504 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_overflow_menu.pngbin424 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_close_black_24dp.pngbin235 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialpad_delete.pngbin1110 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialpad_voicemail.pngbin787 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_overflow_menu.pngbin550 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_close_black_24dp.pngbin309 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialpad_delete.pngbin1745 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialpad_voicemail.pngbin1578 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_overflow_menu.pngbin1384 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_close_black_24dp.pngbin377 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_dialpad_delete.pngbin2128 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_dialpad_voicemail.pngbin1829 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_overflow_menu.pngbin1785 -> 0 bytes
-rw-r--r--java/com/android/dialer/dialpadview/res/layout-land/dialpad_key_one.xml2
-rw-r--r--java/com/android/dialer/dialpadview/res/layout/dialpad_key_one.xml2
-rw-r--r--java/com/android/dialer/dialpadview/res/layout/dialpad_view_unthemed.xml6
-rw-r--r--java/com/android/dialer/dialpadview/res/values-de/strings.xml2
-rw-r--r--java/com/android/dialer/interactions/PhoneNumberInteraction.java15
-rw-r--r--java/com/android/dialer/lightbringer/Lightbringer.java47
-rw-r--r--java/com/android/dialer/lightbringer/LightbringerComponent.java41
-rw-r--r--java/com/android/dialer/lightbringer/LightbringerListener.java21
-rw-r--r--java/com/android/dialer/lightbringer/stub/LightbringerStub.java59
-rw-r--r--java/com/android/dialer/lightbringer/stub/StubLightbringerModule.java30
-rw-r--r--java/com/android/dialer/logging/nano/DialerImpression.java12
-rw-r--r--java/com/android/dialer/notification/GroupedNotificationUtil.java4
-rw-r--r--java/com/android/dialer/notification/NotificationChannelManager.java45
-rw-r--r--java/com/android/dialer/notification/res/values-de/strings.xml2
-rw-r--r--java/com/android/dialer/oem/AndroidManifest.xml5
-rw-r--r--java/com/android/dialer/oem/CequintCallerIdManager.java42
-rw-r--r--java/com/android/dialer/oem/MotorolaUtils.java6
-rw-r--r--java/com/android/dialer/persistentlog/PersistentLogFileHandler.java198
-rw-r--r--java/com/android/dialer/persistentlog/PersistentLogger.java170
-rw-r--r--java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java17
-rw-r--r--java/com/android/dialer/phonenumbercache/ContactInfo.java3
-rw-r--r--java/com/android/dialer/phonenumbercache/ContactInfoHelper.java9
-rw-r--r--java/com/android/dialer/postcall/PostCallActivity.java7
-rw-r--r--java/com/android/dialer/postcall/res/layout/post_call_activity.xml13
-rw-r--r--java/com/android/dialer/shortcuts/CallContactActivity.java14
-rw-r--r--java/com/android/dialer/shortcuts/res/values/themes.xml2
-rw-r--r--java/com/android/dialer/simulator/impl/SimulatorActionProvider.java32
-rw-r--r--java/com/android/dialer/speeddial/AndroidManifest.xml16
-rw-r--r--java/com/android/dialer/speeddial/SpeedDialFragment.java44
-rw-r--r--java/com/android/dialer/speeddial/res/layout/fragment_speed_dial.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-af/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-am/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ar/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-az/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-be/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-bg/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-bn/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-bs/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ca/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-cs/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-da/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-de/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-el/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-en-rAU/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-en-rGB/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-en-rIN/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-es-rUS/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-es/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-et/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-eu/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-fa/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-fi/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-fr-rCA/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-fr/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-gl/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-gu/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-hi/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-hr/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-hu/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-hy/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-in/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-is/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-it/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-iw/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ja/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ka/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-kk/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-km/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-kn/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ko/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ky/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-lo/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-lt/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-lv/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-mk/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ml/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-mn/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-mr/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ms/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-my/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-nb/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ne/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-nl/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-no/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-pa/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-pl/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-pt-rBR/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-pt-rPT/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-pt/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ro/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ru/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-si/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-sk/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-sl/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-sq/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-sr/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-sv/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-sw/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ta/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-te/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-th/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-tl/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-tr/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-uk/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-ur/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-uz/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-vi/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-zh-rCN/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-zh-rHK/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-zh-rTW/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values-zu/strings.xml20
-rw-r--r--java/com/android/dialer/speeddial/res/values/colors.xml (renamed from java/com/android/dialer/app/res/drawable/overflow_menu.xml)8
-rw-r--r--java/com/android/dialer/speeddial/res/values/dimens.xml18
-rw-r--r--java/com/android/dialer/speeddial/res/values/strings.xml18
-rw-r--r--java/com/android/dialer/theme/res/drawable-hdpi/ic_block_24dp.pngbin478 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/drawable-hdpi/ic_call_arrow.pngbin538 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/drawable-mdpi/ic_block_24dp.pngbin335 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/drawable-mdpi/ic_call_arrow.pngbin455 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/drawable-xhdpi/ic_block_24dp.pngbin665 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/drawable-xhdpi/ic_call_arrow.pngbin627 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/drawable-xxhdpi/ic_block_24dp.pngbin973 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/drawable-xxhdpi/ic_call_arrow.pngbin1203 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/drawable-xxxhdpi/ic_block_24dp.pngbin1295 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/drawable-xxxhdpi/ic_call_arrow.pngbin1344 -> 0 bytes
-rw-r--r--java/com/android/dialer/theme/res/values/colors.xml3
-rw-r--r--java/com/android/dialer/theme/res/values/dimens.xml5
-rw-r--r--java/com/android/dialer/theme/res/values/styles.xml11
-rw-r--r--java/com/android/dialer/theme/res/values/themes.xml8
-rw-r--r--java/com/android/dialer/voicemailstatus/res/values-de/strings.xml2
-rw-r--r--java/com/android/dialer/widget/DialerToolbar.java67
-rw-r--r--java/com/android/dialer/widget/res/layout/dialer_toolbar.xml42
-rw-r--r--java/com/android/dialer/widget/res/values/dimens.xml5
330 files changed, 4475 insertions, 1143 deletions
diff --git a/java/com/android/dialer/app/AndroidManifest.xml b/java/com/android/dialer/app/AndroidManifest.xml
index 5ce13dbd7..67290b591 100644
--- a/java/com/android/dialer/app/AndroidManifest.xml
+++ b/java/com/android/dialer/app/AndroidManifest.xml
@@ -91,6 +91,11 @@
</intent-filter>
</receiver>
+ <activity
+ android:name="com.android.dialer.app.calllog.CallLogNotificationsActivity"
+ android:theme="@style/Theme.AppCompat.Translucent">
+ </activity>
+
<service
android:directBootAware="true"
android:exported="false"
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index 11056c414..139fc6486 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -28,6 +28,7 @@ import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
+import android.os.SystemClock;
import android.os.Trace;
import android.provider.CallLog.Calls;
import android.speech.RecognizerIntent;
@@ -72,15 +73,16 @@ import com.android.dialer.app.calllog.CallLogActivity;
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.DragDropController;
import com.android.dialer.app.list.ListsFragment;
+import com.android.dialer.app.list.OldSpeedDialFragment;
import com.android.dialer.app.list.OnDragDropListener;
import com.android.dialer.app.list.OnListFragmentScrolledListener;
import com.android.dialer.app.list.PhoneFavoriteSquareTileView;
import com.android.dialer.app.list.RegularSearchFragment;
import com.android.dialer.app.list.SearchFragment;
import com.android.dialer.app.list.SmartDialSearchFragment;
-import com.android.dialer.app.list.SpeedDialFragment;
import com.android.dialer.app.settings.DialerSettingsActivity;
import com.android.dialer.app.widget.ActionBarController;
import com.android.dialer.app.widget.SearchEditTextLayout;
@@ -118,6 +120,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
+import java.util.concurrent.TimeUnit;
/** The dialer tab's title is 'phone', a more common name (see strings.xml). */
@UsedByReflection(value = "AndroidManifest-app.xml")
@@ -127,7 +130,7 @@ public class DialtactsActivity extends TransactionSafeActivity
OnListFragmentScrolledListener,
CallLogFragment.HostInterface,
DialpadFragment.HostInterface,
- SpeedDialFragment.HostInterface,
+ OldSpeedDialFragment.HostInterface,
SearchFragment.HostInterface,
OnDragDropListener,
OnPhoneNumberPickerActionListener,
@@ -160,6 +163,12 @@ public class DialtactsActivity extends TransactionSafeActivity
public static final int ACTIVITY_REQUEST_CODE_CALL_COMPOSE = 2;
private static final int FAB_SCALE_IN_DELAY_MS = 300;
+
+ /**
+ * Minimum time the history tab must have been selected for it to be marked as seen in onStop()
+ */
+ private static final long HISTORY_TAB_SEEN_TIMEOUT = TimeUnit.SECONDS.toMillis(3);
+
/** Fragment containing the dialpad that slides into view */
protected DialpadFragment mDialpadFragment;
@@ -211,6 +220,7 @@ public class DialtactsActivity extends TransactionSafeActivity
private ActionBarController mActionBarController;
private FloatingActionButtonController mFloatingActionButtonController;
private boolean mWasConfigurationChange;
+ private long timeTabSelected;
private P13nLogger mP13nLogger;
private P13nRanker mP13nRanker;
@@ -391,7 +401,7 @@ public class DialtactsActivity extends TransactionSafeActivity
mIsLandscape =
getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
- mPreviouslySelectedTabIndex = ListsFragment.TAB_INDEX_SPEED_DIAL;
+ mPreviouslySelectedTabIndex = DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL;
FloatingActionButton floatingActionButton =
(FloatingActionButton) findViewById(R.id.floating_action_button);
floatingActionButton.setOnClickListener(this);
@@ -517,13 +527,14 @@ public class DialtactsActivity extends TransactionSafeActivity
// used internally.
final Bundle extras = getIntent().getExtras();
if (extras != null && extras.getInt(Calls.EXTRA_CALL_TYPE_FILTER) == Calls.VOICEMAIL_TYPE) {
- mListsFragment.showTab(ListsFragment.TAB_INDEX_VOICEMAIL);
+ mListsFragment.showTab(DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
Logger.get(this).logImpression(DialerImpression.Type.VVM_NOTIFICATION_CLICKED);
} else {
- mListsFragment.showTab(ListsFragment.TAB_INDEX_HISTORY);
+ mListsFragment.showTab(DialtactsPagerAdapter.TAB_INDEX_HISTORY);
}
} else if (getIntent().hasExtra(EXTRA_SHOW_TAB)) {
- int index = getIntent().getIntExtra(EXTRA_SHOW_TAB, ListsFragment.TAB_INDEX_SPEED_DIAL);
+ int index =
+ getIntent().getIntExtra(EXTRA_SHOW_TAB, DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);
if (index < mListsFragment.getTabCount()) {
// Hide dialpad since this is an explicit intent to show a specific tab, which is coming
// from missed call or voicemail notification.
@@ -569,6 +580,18 @@ public class DialtactsActivity extends TransactionSafeActivity
}
@Override
+ protected void onStop() {
+ super.onStop();
+ boolean timeoutElapsed =
+ SystemClock.elapsedRealtime() - timeTabSelected >= HISTORY_TAB_SEEN_TIMEOUT;
+ boolean isOnHistoryTab =
+ mListsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_HISTORY;
+ if (isOnHistoryTab && timeoutElapsed && !isChangingConfigurations()) {
+ mListsFragment.markMissedCallsAsReadAndRemoveNotifications();
+ }
+ }
+
+ @Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_SEARCH_QUERY, mSearchQuery);
@@ -637,7 +660,7 @@ public class DialtactsActivity extends TransactionSafeActivity
public void onClick(View view) {
int resId = view.getId();
if (resId == R.id.floating_action_button) {
- if (mListsFragment.getCurrentTabIndex() == ListsFragment.TAB_INDEX_ALL_CONTACTS
+ if (mListsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS
&& !mInRegularSearch
&& !mInDialpadSearch) {
DialerUtils.startActivityWithErrorToast(
@@ -1275,11 +1298,11 @@ public class DialtactsActivity extends TransactionSafeActivity
mListsFragment.getRemoveView().setDragDropController(dragController);
}
- /** Implemented to satisfy {@link SpeedDialFragment.HostInterface} */
+ /** Implemented to satisfy {@link OldSpeedDialFragment.HostInterface} */
@Override
public void showAllContactsTab() {
if (mListsFragment != null) {
- mListsFragment.showTab(ListsFragment.TAB_INDEX_ALL_CONTACTS);
+ mListsFragment.showTab(DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS);
}
}
@@ -1335,11 +1358,11 @@ public class DialtactsActivity extends TransactionSafeActivity
// In RTL, scroll when the current tab is Call History instead, since the order of the tabs
// is reversed and the ViewPager returns the left tab position during scroll.
boolean isRtl = ViewUtil.isRtl();
- if (!isRtl && tabIndex == ListsFragment.TAB_INDEX_SPEED_DIAL && !mIsLandscape) {
+ if (!isRtl && tabIndex == DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL && !mIsLandscape) {
mFloatingActionButtonController.onPageScrolled(positionOffset);
- } else if (isRtl && tabIndex == ListsFragment.TAB_INDEX_HISTORY && !mIsLandscape) {
+ } else if (isRtl && tabIndex == DialtactsPagerAdapter.TAB_INDEX_HISTORY && !mIsLandscape) {
mFloatingActionButtonController.onPageScrolled(1 - positionOffset);
- } else if (tabIndex != ListsFragment.TAB_INDEX_SPEED_DIAL) {
+ } else if (tabIndex != DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL) {
mFloatingActionButtonController.onPageScrolled(1);
}
}
@@ -1350,7 +1373,7 @@ public class DialtactsActivity extends TransactionSafeActivity
int tabIndex = mListsFragment.getCurrentTabIndex();
mPreviouslySelectedTabIndex = tabIndex;
mFloatingActionButtonController.setVisible(true);
- if (tabIndex == ListsFragment.TAB_INDEX_ALL_CONTACTS
+ if (tabIndex == DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS
&& !mInRegularSearch
&& !mInDialpadSearch) {
mFloatingActionButtonController.changeIcon(
@@ -1361,6 +1384,8 @@ public class DialtactsActivity extends TransactionSafeActivity
getResources().getDrawable(R.drawable.quantum_ic_dialpad_white_24, null),
getResources().getString(R.string.action_menu_dialpad_button));
}
+
+ timeTabSelected = SystemClock.elapsedRealtime();
}
@Override
@@ -1397,14 +1422,14 @@ public class DialtactsActivity extends TransactionSafeActivity
private int getFabAlignment() {
if (!mIsLandscape
&& !isInSearchUi()
- && mListsFragment.getCurrentTabIndex() == ListsFragment.TAB_INDEX_SPEED_DIAL) {
+ && mListsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL) {
return FloatingActionButtonController.ALIGN_MIDDLE;
}
return FloatingActionButtonController.ALIGN_END;
}
private void updateMissedCalls() {
- if (mPreviouslySelectedTabIndex == ListsFragment.TAB_INDEX_HISTORY) {
+ if (mPreviouslySelectedTabIndex == DialtactsPagerAdapter.TAB_INDEX_HISTORY) {
mListsFragment.markMissedCallsAsReadAndRemoveNotifications();
}
}
@@ -1452,15 +1477,12 @@ public class DialtactsActivity extends TransactionSafeActivity
@Override
public void show() {
- final boolean hasContactsPermission =
- PermissionsUtil.hasContactsPermissions(DialtactsActivity.this);
- final Menu menu = getMenu();
- final MenuItem clearFrequents = menu.findItem(R.id.menu_clear_frequents);
+ Menu menu = getMenu();
+ MenuItem clearFrequents = menu.findItem(R.id.menu_clear_frequents);
clearFrequents.setVisible(
- mListsFragment != null
- && mListsFragment.getSpeedDialFragment() != null
- && mListsFragment.getSpeedDialFragment().hasFrequents()
- && hasContactsPermission);
+ PermissionsUtil.hasContactsPermissions(DialtactsActivity.this)
+ && mListsFragment != null
+ && mListsFragment.hasFrequents());
menu.findItem(R.id.menu_history)
.setVisible(PermissionsUtil.hasPhonePermissions(DialtactsActivity.this));
diff --git a/java/com/android/dialer/app/SpecialCharSequenceMgr.java b/java/com/android/dialer/app/SpecialCharSequenceMgr.java
index 712659c12..85c2ea650 100644
--- a/java/com/android/dialer/app/SpecialCharSequenceMgr.java
+++ b/java/com/android/dialer/app/SpecialCharSequenceMgr.java
@@ -30,7 +30,6 @@ import android.database.Cursor;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telephony.PhoneNumberUtils;
@@ -71,7 +70,6 @@ public class SpecialCharSequenceMgr {
private static final String TAG_SELECT_ACCT_FRAGMENT = "tag_select_acct_fragment";
- private static final String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE";
private static final String MMI_IMEI_DISPLAY = "*#06#";
private static final String MMI_REGULATORY_INFO_DISPLAY = "*#07#";
/** ***** This code is used to handle SIM Contact queries ***** */
@@ -133,31 +131,21 @@ public class SpecialCharSequenceMgr {
/**
* Handles secret codes to launch arbitrary activities in the form of *#*#<code>#*#*.
- * If a secret code is encountered, an Intent is started with the android_secret_code://<code>
- * URI.
*
* @param context the context to use
* @param input the text to check for a secret code in
- * @return true if a secret code was encountered and intent is sent out
+ * @return true if a secret code was encountered and handled
*/
static boolean handleSecretCode(Context context, String input) {
- // Must use system service on O+ to avoid using broadcasts, which are not allowed on O+.
- if (BuildCompat.isAtLeastO()) {
- return context.getSystemService(TelephonyManager.class).sendDialerCode(input);
- }
+ // Secret codes are accessed by dialing *#*#<code>#*#*
- // System service call is not supported pre-O, so must use a broadcast for N-.
- // Secret codes are in the form *#*#<code>#*#*
int len = input.length();
- if (len > 8 && input.startsWith("*#*#") && input.endsWith("#*#*")) {
- final Intent intent =
- new Intent(
- SECRET_CODE_ACTION,
- Uri.parse("android_secret_code://" + input.substring(4, len - 4)));
- context.sendBroadcast(intent);
- return true;
+ if (len <= 8 || !input.startsWith("*#*#") || !input.endsWith("#*#*")) {
+ return false;
}
- return false;
+ String secretCode = input.substring(4, len - 4);
+ TelephonyManagerCompat.handleSecretCode(context, secretCode);
+ return true;
}
/**
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index 301fc009e..06f48aa20 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -17,6 +17,7 @@
package com.android.dialer.app.calllog;
import android.app.Activity;
+import android.content.ContentUris;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
@@ -38,7 +39,12 @@ import android.telecom.PhoneAccountHandle;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.SparseBooleanArray;
+import android.view.ActionMode;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.android.contacts.common.ContactsUtils;
@@ -58,6 +64,7 @@ import com.android.dialer.calldetails.nano.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;
@@ -65,6 +72,9 @@ import com.android.dialer.enrichedcall.EnrichedCallCapabilities;
import com.android.dialer.enrichedcall.EnrichedCallComponent;
import com.android.dialer.enrichedcall.EnrichedCallManager;
import com.android.dialer.enrichedcall.historyquery.proto.nano.HistoryResult;
+import com.android.dialer.lightbringer.Lightbringer;
+import com.android.dialer.lightbringer.LightbringerComponent;
+import com.android.dialer.lightbringer.LightbringerListener;
import com.android.dialer.logging.Logger;
import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.phonenumbercache.CallLogQuery;
@@ -80,7 +90,7 @@ import java.util.Set;
/** Adapter class to fill in data for the Call Log. */
public class CallLogAdapter extends GroupingListAdapter
- implements GroupCreator, OnVoicemailDeletedListener {
+ implements GroupCreator, OnVoicemailDeletedListener, LightbringerListener {
// Types of activities the call log adapter is used for
public static final int ACTIVITY_TYPE_CALL_LOG = 1;
@@ -118,6 +128,58 @@ public class CallLogAdapter extends GroupingListAdapter
private long mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
private final CallLogAlertManager mCallLogAlertManager;
+
+ public static ActionMode mActionMode = null;
+ private final SparseBooleanArray selectedItems = new SparseBooleanArray();
+
+ private final ActionMode.Callback mActionModeCallback =
+ new ActionMode.Callback() {
+
+ // Called when the action mode is created; startActionMode() was called
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ mActionMode = mode;
+ // Inflate a menu resource providing context menu items
+ MenuInflater inflater = mode.getMenuInflater();
+ inflater.inflate(R.menu.actionbar_delete, menu);
+ return true;
+ }
+
+ // Called each time the action mode is shown. Always called after onCreateActionMode, but
+ // may be called multiple times if the mode is invalidated.
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return false; // Return false if nothing is done
+ }
+
+ // Called when the user selects a contextual menu item
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ return false;
+ }
+
+ // Called when the user exits the action mode
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ selectedItems.clear();
+ mActionMode = null;
+ notifyDataSetChanged();
+ }
+ };
+
+ private final View.OnLongClickListener mLongPressListener =
+ new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ if (ConfigProviderBindings.get(v.getContext())
+ .getBoolean("enable_call_log_multiselect", false)) {
+ v.startActionMode(mActionModeCallback);
+ return false;
+ }
+ return true;
+ }
+ };
+
/** The OnClickListener used to expand or collapse the action buttons of a call log entry. */
private final View.OnClickListener mExpandCollapseListener =
new View.OnClickListener() {
@@ -127,6 +189,20 @@ public class CallLogAdapter extends GroupingListAdapter
if (viewHolder == null) {
return;
}
+ if (mActionMode != null && viewHolder.voicemailUri != null) {
+ if (selectedItems.get((int) ContentUris.parseId(Uri.parse(viewHolder.voicemailUri)))) {
+ selectedItems.delete((int) ContentUris.parseId(Uri.parse(viewHolder.voicemailUri)));
+ viewHolder.checkBoxView.setVisibility(View.GONE);
+ viewHolder.quickContactView.setVisibility(View.VISIBLE);
+ } else {
+ viewHolder.quickContactView.setVisibility(View.GONE);
+ viewHolder.checkBoxView.setVisibility(View.VISIBLE);
+ selectedItems.put(
+ (int) ContentUris.parseId(Uri.parse(viewHolder.voicemailUri)), true);
+ }
+ mActionMode.setTitle(Integer.toString(selectedItems.size()));
+ return;
+ }
if (mVoicemailPlaybackPresenter != null) {
// Always reset the voicemail playback state on expand or collapse.
@@ -313,10 +389,12 @@ public class CallLogAdapter extends GroupingListAdapter
}
mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
mIsSpamEnabled = Spam.get(mActivity).isSpamEnabled();
+ getLightbringer().registerListener(this);
notifyDataSetChanged();
}
public void onPause() {
+ getLightbringer().unregisterListener(this);
pauseCache();
for (Uri uri : mHiddenItemUris) {
CallLogAsyncTaskUtil.deleteVoicemail(mActivity, uri, null);
@@ -365,6 +443,7 @@ public class CallLogAdapter extends GroupingListAdapter
mActivity,
mBlockReportSpamListener,
mExpandCollapseListener,
+ mLongPressListener,
mCallLogCache,
mCallLogListItemHelper,
mVoicemailPlaybackPresenter);
@@ -471,6 +550,7 @@ public class CallLogAdapter extends GroupingListAdapter
setCallDetailsEntriesHistoryResults(
views.number, callDetailsEntries, getAllHistoricalData(views.number, callDetailsEntries));
views.setDetailedPhoneDetails(callDetailsEntries);
+ views.lightbringerReady = getLightbringer().isReachable(mActivity, views.number);
final AsyncTask<Void, Void, Boolean> loadDataTask =
new AsyncTask<Void, Void, Boolean>() {
@Override
@@ -741,6 +821,15 @@ public class CallLogAdapter extends GroupingListAdapter
views.workIconView.setVisibility(
details.contactUserType == ContactsUtils.USER_TYPE_WORK ? View.VISIBLE : View.GONE);
+ if (views.voicemailUri != null
+ && selectedItems.get((int) ContentUris.parseId(Uri.parse(views.voicemailUri)))) {
+ views.checkBoxView.setVisibility(View.VISIBLE);
+ views.quickContactView.setVisibility(View.GONE);
+ } else if (views.voicemailUri != null) {
+ 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
@@ -997,6 +1086,16 @@ public class CallLogAdapter extends GroupingListAdapter
return EnrichedCallComponent.get(mActivity).getEnrichedCallManager();
}
+ @NonNull
+ private Lightbringer getLightbringer() {
+ return LightbringerComponent.get(mActivity).getLightbringer();
+ }
+
+ @Override
+ public void onLightbringerStateChanged() {
+ notifyDataSetChanged();
+ }
+
/** Interface used to initiate a refresh of the content. */
public interface CallFetcher {
diff --git a/java/com/android/dialer/app/calllog/CallLogFragment.java b/java/com/android/dialer/app/calllog/CallLogFragment.java
index 4abef3430..fcc34ebef 100644
--- a/java/com/android/dialer/app/calllog/CallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/CallLogFragment.java
@@ -49,11 +49,11 @@ 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.list.ListsFragment.ListsPage;
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.phonenumbercache.ContactInfoHelper;
@@ -64,8 +64,7 @@ import com.android.dialer.util.PermissionsUtil;
* voicemails), specify it in the constructor.
*/
public class CallLogFragment extends Fragment
- implements ListsPage,
- CallLogQueryHandler.Listener,
+ implements CallLogQueryHandler.Listener,
CallLogAdapter.CallFetcher,
OnEmptyViewActionButtonClickedListener,
FragmentCompat.OnRequestPermissionsResultCallback,
@@ -133,6 +132,8 @@ public class CallLogFragment extends Fragment
refreshData();
rescheduleDisplayUpdate();
break;
+ default:
+ throw Assert.createAssertionFailException("Invalid message: " + msg);
}
}
};
@@ -541,20 +542,18 @@ public class CallLogFragment extends Fragment
mDisplayUpdateHandler.removeMessages(EVENT_UPDATE_DISPLAY);
}
- @Override
@CallSuper
- public void onPageResume(@Nullable Activity activity) {
- LogUtil.d("CallLogFragment.onPageResume", "frag: %s", this);
- if (activity != null) {
- ((HostInterface) activity)
+ public void onVisible() {
+ LogUtil.enterBlock("CallLogFragment.onPageSelected");
+ if (getActivity() != null) {
+ ((HostInterface) getActivity())
.enableFloatingButton(mModalAlertManager == null || mModalAlertManager.isEmpty());
}
}
- @Override
@CallSuper
- public void onPagePause(@Nullable Activity activity) {
- LogUtil.d("CallLogFragment.onPagePause", "frag: %s", this);
+ public void onNotVisible() {
+ LogUtil.enterBlock("CallLogFragment.onPageUnselected");
}
@Override
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index 6a3187fa8..9adcddb3c 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -22,19 +22,16 @@ import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.AsyncTask;
-import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
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.MenuItem;
import android.view.View;
import android.view.ViewStub;
@@ -45,7 +42,6 @@ import android.widget.TextView;
import com.android.contacts.common.ClipboardUtils;
import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
-import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
import com.android.contacts.common.dialog.CallSubjectDialog;
import com.android.contacts.common.util.UriUtils;
import com.android.dialer.app.DialtactsActivity;
@@ -61,10 +57,13 @@ import com.android.dialer.callcomposer.nano.CallComposerContact;
import com.android.dialer.calldetails.nano.CallDetailsEntries;
import com.android.dialer.common.LogUtil;
import com.android.dialer.compat.CompatUtils;
+import com.android.dialer.lightbringer.Lightbringer;
+import com.android.dialer.lightbringer.LightbringerComponent;
import com.android.dialer.logging.Logger;
import com.android.dialer.logging.nano.DialerImpression;
-import com.android.dialer.logging.nano.ScreenEvent;
+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;
@@ -77,9 +76,7 @@ import com.android.dialer.util.DialerUtils;
* CallLogAdapter.
*/
public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
- implements View.OnClickListener,
- MenuItem.OnMenuItemClickListener,
- View.OnCreateContextMenuListener {
+ implements View.OnClickListener, MenuItem.OnMenuItemClickListener {
/** The root view of the call log list item */
public final View rootView;
/** The quick contact badge for the contact. */
@@ -98,6 +95,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
private final Context mContext;
private final CallLogCache mCallLogCache;
private final CallLogListItemHelper mCallLogListItemHelper;
+ private final CachedNumberLookupService mCachedNumberLookupService;
private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
private final OnClickListener mBlockReportListener;
private final int mPhotoSize;
@@ -122,6 +120,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
public View callComposeButtonView;
public View sendVoicemailButtonView;
public ImageView workIconView;
+ public ImageView checkBoxView;
/**
* The row Id for the first call associated with the call log entry. Used as a key for the map
* used to track which call log entries have the action button section expanded.
@@ -182,8 +181,6 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
* voicemail log's call button
*/
public CharSequence callTypeOrLocation;
- /** Whether this row is for a business or not. */
- public boolean isBusiness;
/** The contact info for the contact displayed in this list item. */
public volatile ContactInfo info;
/** Whether spam feature is enabled, which affects UI. */
@@ -192,8 +189,10 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
public boolean isSpam;
public boolean isCallComposerCapable;
+ public boolean lightbringerReady;
private View.OnClickListener mExpandCollapseListener;
+ private final View.OnLongClickListener longPressListener;
private boolean mVoicemailPrimaryActionButtonClicked;
public int dayGroupHeaderVisibility;
@@ -207,6 +206,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
Context context,
OnClickListener blockReportListener,
View.OnClickListener expandCollapseListener,
+ View.OnLongClickListener longClickListener,
CallLogCache callLogCache,
CallLogListItemHelper callLogListItemHelper,
VoicemailPlaybackPresenter voicemailPlaybackPresenter,
@@ -221,10 +221,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
mContext = context;
mExpandCollapseListener = expandCollapseListener;
+ longPressListener = longClickListener;
mCallLogCache = callLogCache;
mCallLogListItemHelper = callLogListItemHelper;
mVoicemailPlaybackPresenter = voicemailPlaybackPresenter;
mBlockReportListener = blockReportListener;
+ mCachedNumberLookupService = PhoneNumberCache.get(mContext).getCachedNumberLookupService();
this.rootView = rootView;
this.quickContactView = quickContactView;
@@ -234,6 +236,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
this.dayGroupHeader = dayGroupHeader;
this.primaryActionButtonView = primaryActionButtonView;
this.workIconView = (ImageView) rootView.findViewById(R.id.work_profile_icon);
+ this.checkBoxView = (ImageView) rootView.findViewById(R.id.quick_contact_checkbox);
mPhotoSize = mContext.getResources().getDimensionPixelSize(R.dimen.contact_photo_size);
// Set text height to false on the TextViews so they don't have extra padding.
@@ -246,7 +249,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
}
primaryActionButtonView.setOnClickListener(this);
primaryActionView.setOnClickListener(mExpandCollapseListener);
- primaryActionView.setOnCreateContextMenuListener(this);
+ primaryActionView.setOnLongClickListener(longPressListener);
}
public static CallLogListItemViewHolder create(
@@ -254,6 +257,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
Context context,
OnClickListener blockReportListener,
View.OnClickListener expandCollapseListener,
+ View.OnLongClickListener longClickListener,
CallLogCache callLogCache,
CallLogListItemHelper callLogListItemHelper,
VoicemailPlaybackPresenter voicemailPlaybackPresenter) {
@@ -262,6 +266,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
context,
blockReportListener,
expandCollapseListener,
+ longClickListener,
callLogCache,
callLogListItemHelper,
voicemailPlaybackPresenter,
@@ -285,6 +290,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
context,
null,
null /* expandCollapseListener */,
+ null,
callLogCache,
new CallLogListItemHelper(phoneCallDetailsHelper, resources, callLogCache),
null /* voicemailPlaybackPresenter */,
@@ -299,108 +305,11 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
viewHolder.actionsView = new View(context);
viewHolder.voicemailPlaybackView = new VoicemailPlaybackLayout(context);
viewHolder.workIconView = new ImageButton(context);
+ viewHolder.checkBoxView = new ImageButton(context);
return viewHolder;
}
@Override
- public void onCreateContextMenu(
- final ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
- if (TextUtils.isEmpty(number)) {
- return;
- }
-
- if (callType == CallLog.Calls.VOICEMAIL_TYPE) {
- menu.setHeaderTitle(mContext.getResources().getText(R.string.voicemail));
- } else {
- menu.setHeaderTitle(
- PhoneNumberUtilsCompat.createTtsSpannable(
- BidiFormatter.getInstance().unicodeWrap(number, TextDirectionHeuristics.LTR)));
- }
-
- menu.add(
- ContextMenu.NONE,
- R.id.context_menu_copy_to_clipboard,
- ContextMenu.NONE,
- R.string.action_copy_number_text)
- .setOnMenuItemClickListener(this);
-
- // The edit number before call does not show up if any of the conditions apply:
- // 1) Number cannot be called
- // 2) Number is the voicemail number
- // 3) Number is a SIP address
-
- if (PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation)
- && !mCallLogCache.isVoicemailNumber(accountHandle, number)
- && !PhoneNumberHelper.isSipNumber(number)) {
- menu.add(
- ContextMenu.NONE,
- R.id.context_menu_edit_before_call,
- ContextMenu.NONE,
- R.string.action_edit_number_before_call)
- .setOnMenuItemClickListener(this);
- }
-
- if (callType == CallLog.Calls.VOICEMAIL_TYPE
- && phoneCallDetailsViews.voicemailTranscriptionView.length() > 0) {
- menu.add(
- ContextMenu.NONE,
- R.id.context_menu_copy_transcript_to_clipboard,
- ContextMenu.NONE,
- R.string.copy_transcript_text)
- .setOnMenuItemClickListener(this);
- }
-
- String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
- boolean isVoicemailNumber = mCallLogCache.isVoicemailNumber(accountHandle, number);
- if (!isVoicemailNumber
- && FilteredNumbersUtil.canBlockNumber(mContext, e164Number, number)
- && FilteredNumberCompat.canAttemptBlockOperations(mContext)) {
- boolean isBlocked = blockId != null;
- if (isBlocked) {
- menu.add(
- ContextMenu.NONE,
- R.id.context_menu_unblock,
- ContextMenu.NONE,
- R.string.call_log_action_unblock_number)
- .setOnMenuItemClickListener(this);
- } else {
- if (isSpamFeatureEnabled) {
- if (isSpam) {
- menu.add(
- ContextMenu.NONE,
- R.id.context_menu_report_not_spam,
- ContextMenu.NONE,
- R.string.call_log_action_remove_spam)
- .setOnMenuItemClickListener(this);
- menu.add(
- ContextMenu.NONE,
- R.id.context_menu_block,
- ContextMenu.NONE,
- R.string.call_log_action_block_number)
- .setOnMenuItemClickListener(this);
- } else {
- menu.add(
- ContextMenu.NONE,
- R.id.context_menu_block_report_spam,
- ContextMenu.NONE,
- R.string.call_log_action_block_report_number)
- .setOnMenuItemClickListener(this);
- }
- } else {
- menu.add(
- ContextMenu.NONE,
- R.id.context_menu_block,
- ContextMenu.NONE,
- R.string.call_log_action_block_number)
- .setOnMenuItemClickListener(this);
- }
- }
- }
-
- Logger.get(mContext).logScreenView(ScreenEvent.Type.CALL_LOG_CONTEXT_MENU, (Activity) mContext);
- }
-
- @Override
public boolean onMenuItemClick(MenuItem item) {
int resId = item.getItemId();
if (resId == R.id.context_menu_copy_to_clipboard) {
@@ -518,7 +427,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
if (!TextUtils.isEmpty(voicemailUri)) {
// Treat as voicemail list item; show play button if not expanded.
if (!isExpanded) {
- primaryActionButtonView.setImageResource(R.drawable.ic_play_arrow_24dp);
+ primaryActionButtonView.setImageResource(R.drawable.quantum_ic_play_arrow_white_24);
primaryActionButtonView.setContentDescription(
TextUtils.expandTemplate(
mContext.getString(R.string.description_voicemail_action), validNameOrNumber));
@@ -541,7 +450,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
primaryActionButtonView.setContentDescription(
TextUtils.expandTemplate(
mContext.getString(R.string.description_call_action), validNameOrNumber));
- primaryActionButtonView.setImageResource(R.drawable.ic_call_24dp);
+ primaryActionButtonView.setImageResource(R.drawable.quantum_ic_call_white_24);
primaryActionButtonView.setVisibility(View.VISIBLE);
} else {
primaryActionButtonView.setTag(null);
@@ -607,9 +516,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
callButtonView.setVisibility(View.GONE);
}
- if (shouldShowVideoCallActionButton(canPlaceCallToNumber)) {
+ if (hasPlacedCarrierVideoCall() || canSupportCarrierVideoCall()) {
videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number));
videoCallButtonView.setVisibility(View.VISIBLE);
+ } else if (lightbringerReady) {
+ videoCallButtonView.setTag(IntentProvider.getLightbringerIntentProvider(number));
+ videoCallButtonView.setVisibility(View.VISIBLE);
} else {
videoCallButtonView.setVisibility(View.GONE);
}
@@ -659,7 +571,8 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
addToExistingContactButtonView.setVisibility(View.GONE);
}
- if (canPlaceCallToNumber && !isBlockedOrSpam) {
+ boolean isVoicemailNumber = mCallLogCache.isVoicemailNumber(accountHandle, number);
+ if (canPlaceCallToNumber && !isBlockedOrSpam && !isVoicemailNumber) {
sendMessageView.setTag(IntentProvider.getSendSmsIntentProvider(number));
sendMessageView.setVisibility(View.VISIBLE);
} else {
@@ -669,7 +582,6 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
mCallLogListItemHelper.setActionContentDescriptions(this);
boolean supportsCallSubject = mCallLogCache.doesAccountSupportCallSubject(accountHandle);
- boolean isVoicemailNumber = mCallLogCache.isVoicemailNumber(accountHandle, number);
callWithNoteButtonView.setVisibility(
supportsCallSubject && !isVoicemailNumber && info != null ? View.VISIBLE : View.GONE);
@@ -699,15 +611,22 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
return false;
}
- private boolean shouldShowVideoCallActionButton(boolean canPlaceCallToNumber) {
- return canPlaceCallToNumber && (hasPlacedVideoCall() || canSupportVideoCall());
- }
-
- private boolean hasPlacedVideoCall() {
- return phoneCallDetailsViews.callTypeIcons.isVideoShown();
+ private boolean hasPlacedCarrierVideoCall() {
+ if (!phoneCallDetailsViews.callTypeIcons.isVideoShown()) {
+ return false;
+ }
+ if (accountHandle == null) {
+ return false;
+ }
+ if (accountHandle
+ .getComponentName()
+ .equals(getLightbringer().getPhoneAccountComponentName(mContext))) {
+ return false;
+ }
+ return true;
}
- private boolean canSupportVideoCall() {
+ private boolean canSupportCarrierVideoCall() {
return mCallLogCache.canRelyOnVideoPresence()
&& info != null
&& (info.carrierPresence & Phone.CARRIER_PRESENCE_VT_CAPABLE) != 0;
@@ -800,7 +719,8 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
int contactType = ContactPhotoManager.TYPE_DEFAULT;
if (mCallLogCache.isVoicemailNumber(accountHandle, number)) {
contactType = ContactPhotoManager.TYPE_VOICEMAIL;
- } else if (isBusiness) {
+ } else if (mCachedNumberLookupService != null
+ && mCachedNumberLookupService.isBusiness(info.sourceType)) {
contactType = ContactPhotoManager.TYPE_BUSINESS;
} else if (numberPresentation == TelecomManager.PRESENTATION_RESTRICTED) {
contactType = ContactPhotoManager.TYPE_GENERIC_AVATAR;
@@ -810,6 +730,10 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
@Override
public void onClick(View view) {
+ if (view.getId() == R.id.primary_action_button) {
+ CallLogAsyncTaskUtil.markCallAsRead(mContext, callIds);
+ }
+
if (view.getId() == R.id.primary_action_button && !TextUtils.isEmpty(voicemailUri)) {
Logger.get(mContext).logImpression(DialerImpression.Type.VOICEMAIL_PLAY_AUDIO_DIRECTLY);
mVoicemailPrimaryActionButtonClicked = true;
@@ -947,6 +871,11 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
return callDetailsEntries;
}
+ @NonNull
+ private Lightbringer getLightbringer() {
+ return LightbringerComponent.get(mContext).getLightbringer();
+ }
+
public interface OnClickListener {
void onBlockReportSpam(
diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsActivity.java b/java/com/android/dialer/app/calllog/CallLogNotificationsActivity.java
new file mode 100644
index 000000000..c08d2c02b
--- /dev/null
+++ b/java/com/android/dialer/app/calllog/CallLogNotificationsActivity.java
@@ -0,0 +1,70 @@
+/*
+ * 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.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.util.PermissionsUtil;
+
+/**
+ * Provides operations for managing call-related notifications. This is used to forward intent
+ * that's requiring to unlock screen and it will never be visible to user.
+ *
+ * <p>It handles the following actions:
+ *
+ * <ul>
+ * <li>Sending an SMS from a missed call
+ * </ul>
+ */
+public class CallLogNotificationsActivity extends AppCompatActivity {
+
+ public static final String ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION =
+ "com.android.dialer.calllog.SEND_SMS_FROM_MISSED_CALL_NOTIFICATION";
+
+ /**
+ * Extra to be included with {@link #ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION} to identify
+ * the number to text back.
+ *
+ * <p>It must be a {@link String}.
+ */
+ public static final String EXTRA_MISSED_CALL_NUMBER = "MISSED_CALL_NUMBER";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Intent intent = getIntent();
+
+ if (!PermissionsUtil.hasPermission(this, android.Manifest.permission.READ_CALL_LOG)) {
+ return;
+ }
+
+ String action = intent.getAction();
+ switch (action) {
+ case ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION:
+ MissedCallNotifier.getInstance(this)
+ .sendSmsFromMissedCall(
+ intent.getStringExtra(EXTRA_MISSED_CALL_NUMBER), intent.getData());
+ break;
+ default:
+ LogUtil.d("CallLogNotificationsActivity.onCreate", "could not handle: " + intent);
+ break;
+ }
+ finish();
+ }
+}
diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java
index 2f26027f9..f67837f8a 100644
--- a/java/com/android/dialer/app/calllog/CallLogNotificationsService.java
+++ b/java/com/android/dialer/app/calllog/CallLogNotificationsService.java
@@ -71,11 +71,8 @@ public class CallLogNotificationsService extends IntentService {
public static final String ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION =
"com.android.dialer.calllog.CALL_BACK_FROM_MISSED_CALL_NOTIFICATION";
- public static final String ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION =
- "com.android.dialer.calllog.SEND_SMS_FROM_MISSED_CALL_NOTIFICATION";
/**
- * Extra to be included with {@link #ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS}, {@link
- * #ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION} and {@link
+ * Extra to be included with {@link #ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS} and {@link
* #ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION} to identify the number to display, call or
* text back.
*
@@ -226,11 +223,6 @@ public class CallLogNotificationsService extends IntentService {
.callBackFromMissedCall(
intent.getStringExtra(EXTRA_MISSED_CALL_NUMBER), intent.getData());
break;
- case ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION:
- MissedCallNotifier.getInstance(this)
- .sendSmsFromMissedCall(
- intent.getStringExtra(EXTRA_MISSED_CALL_NUMBER), intent.getData());
- break;
default:
LogUtil.d("CallLogNotificationsService.onHandleIntent", "could not handle: " + intent);
break;
diff --git a/java/com/android/dialer/app/calllog/ClearCallLogDialog.java b/java/com/android/dialer/app/calllog/ClearCallLogDialog.java
index 0c9bd4b35..a01b89527 100644
--- a/java/com/android/dialer/app/calllog/ClearCallLogDialog.java
+++ b/java/com/android/dialer/app/calllog/ClearCallLogDialog.java
@@ -54,6 +54,7 @@ public class ClearCallLogDialog extends DialogFragment {
ProgressDialog.show(
getActivity(), getString(R.string.clearCallLogProgress_title), "", true, false);
progressDialog.setOwnerActivity(getActivity());
+ CallLogNotificationsService.markNewMissedCallsAsOld(getContext(), null);
final AsyncTask<Void, Void, Void> task =
new AsyncTask<Void, Void, Void>() {
@Override
diff --git a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java b/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
index b0a6ee135..dfe5776d8 100644
--- a/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/DefaultVoicemailNotifier.java
@@ -40,7 +40,7 @@ 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.ListsFragment;
+import com.android.dialer.app.list.DialtactsPagerAdapter;
import com.android.dialer.blocking.FilteredNumbersUtil;
import com.android.dialer.common.LogUtil;
import com.android.dialer.logging.Logger;
@@ -274,7 +274,8 @@ public class DefaultVoicemailNotifier {
}
private PendingIntent newVoicemailIntent(@Nullable NewCall voicemail) {
- Intent intent = DialtactsActivity.getShowTabIntent(context, ListsFragment.TAB_INDEX_VOICEMAIL);
+ Intent intent =
+ DialtactsActivity.getShowTabIntent(context, DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL);
// TODO (b/35486204): scroll to this voicemail
if (voicemail != null) {
intent.setData(voicemail.voicemailUri);
diff --git a/java/com/android/dialer/app/calllog/IntentProvider.java b/java/com/android/dialer/app/calllog/IntentProvider.java
index c53e3ec5e..8b77c3f51 100644
--- a/java/com/android/dialer/app/calllog/IntentProvider.java
+++ b/java/com/android/dialer/app/calllog/IntentProvider.java
@@ -29,6 +29,7 @@ import com.android.dialer.calldetails.CallDetailsActivity;
import com.android.dialer.calldetails.nano.CallDetailsEntries;
import com.android.dialer.callintent.CallIntentBuilder;
import com.android.dialer.callintent.nano.CallInitiationType;
+import com.android.dialer.lightbringer.LightbringerComponent;
import com.android.dialer.util.CallUtil;
import com.android.dialer.util.IntentUtil;
import java.util.ArrayList;
@@ -75,6 +76,15 @@ public abstract class IntentProvider {
};
}
+ public static IntentProvider getLightbringerIntentProvider(String number) {
+ return new IntentProvider() {
+ @Override
+ public Intent getIntent(Context context) {
+ return LightbringerComponent.get(context).getLightbringer().getIntent(context, number);
+ }
+ };
+ }
+
public static IntentProvider getReturnVoicemailCallIntentProvider() {
return new IntentProvider() {
@Override
diff --git a/java/com/android/dialer/app/calllog/MissedCallNotifier.java b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
index 5b5661615..aa04d81eb 100644
--- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java
+++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
@@ -40,7 +40,7 @@ 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.ListsFragment;
+import com.android.dialer.app.list.DialtactsPagerAdapter;
import com.android.dialer.callintent.CallIntentBuilder;
import com.android.dialer.callintent.nano.CallInitiationType;
import com.android.dialer.common.LogUtil;
@@ -48,7 +48,6 @@ import com.android.dialer.notification.NotificationChannelManager;
import com.android.dialer.notification.NotificationChannelManager.Channel;
import com.android.dialer.phonenumbercache.ContactInfo;
import com.android.dialer.phonenumberutil.PhoneNumberHelper;
-import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.IntentUtil;
import java.util.HashSet;
@@ -187,11 +186,7 @@ public class MissedCallNotifier {
.setOnlyAlertOnce(useCallList)
.setPublicVersion(publicSummaryBuilder.build());
- NotificationChannelManager.applyChannel(
- groupSummary,
- context,
- Channel.MISSED_CALL,
- PhoneAccountHandles.getAccount(context, useCallList ? newCalls.get(0) : null));
+ NotificationChannelManager.applyChannel(groupSummary, context, Channel.MISSED_CALL, null);
Notification notification = groupSummary.build();
configureLedOnNotification(notification);
@@ -291,7 +286,7 @@ public class MissedCallNotifier {
if (!PhoneNumberHelper.isUriNumber(call.number)) {
builder.addAction(
new Notification.Action.Builder(
- Icon.createWithResource(context, R.drawable.ic_message_24dp),
+ Icon.createWithResource(context, R.drawable.quantum_ic_message_white_24),
context.getString(R.string.notification_missedCall_message),
createSendSmsFromNotificationPendingIntent(call.number, call.callsUri))
.build());
@@ -322,8 +317,7 @@ public class MissedCallNotifier {
.setDeleteIntent(createClearMissedCallsPendingIntent(call.callsUri))
.setContentIntent(createCallLogPendingIntent(call.callsUri));
- NotificationChannelManager.applyChannel(
- builder, context, Channel.MISSED_CALL, PhoneAccountHandles.getAccount(context, call));
+ NotificationChannelManager.applyChannel(builder, context, Channel.MISSED_CALL, null);
return builder;
}
@@ -332,7 +326,6 @@ public class MissedCallNotifier {
public void callBackFromMissedCall(String number, Uri callUri) {
closeSystemDialogs(context);
CallLogNotificationsQueryHelper.removeMissedCallNotifications(context, callUri);
- TelecomUtil.cancelMissedCallsNotification(context);
DialerUtils.startActivityWithErrorToast(
context,
new CallIntentBuilder(number, CallInitiationType.Type.MISSED_CALL_NOTIFICATION)
@@ -341,11 +334,9 @@ public class MissedCallNotifier {
}
/** Trigger an intent to send an sms from a missed call number. */
- @WorkerThread
public void sendSmsFromMissedCall(String number, Uri callUri) {
closeSystemDialogs(context);
CallLogNotificationsQueryHelper.removeMissedCallNotifications(context, callUri);
- TelecomUtil.cancelMissedCallsNotification(context);
DialerUtils.startActivityWithErrorToast(
context, IntentUtil.getSendSmsIntent(number).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
@@ -367,7 +358,7 @@ public class MissedCallNotifier {
*/
private PendingIntent createCallLogPendingIntent(@Nullable Uri callUri) {
Intent contentIntent =
- DialtactsActivity.getShowTabIntent(context, ListsFragment.TAB_INDEX_HISTORY);
+ DialtactsActivity.getShowTabIntent(context, DialtactsPagerAdapter.TAB_INDEX_HISTORY);
// TODO (b/35486204): scroll to call
contentIntent.setData(callUri);
return PendingIntent.getActivity(context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
@@ -393,13 +384,13 @@ public class MissedCallNotifier {
private PendingIntent createSendSmsFromNotificationPendingIntent(
String number, @NonNull Uri callUri) {
- Intent intent = new Intent(context, CallLogNotificationsService.class);
- intent.setAction(CallLogNotificationsService.ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION);
- intent.putExtra(CallLogNotificationsService.EXTRA_MISSED_CALL_NUMBER, number);
+ Intent intent = new Intent(context, CallLogNotificationsActivity.class);
+ intent.setAction(CallLogNotificationsActivity.ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION);
+ intent.putExtra(CallLogNotificationsActivity.EXTRA_MISSED_CALL_NUMBER, number);
intent.setData(callUri);
// Use FLAG_UPDATE_CURRENT to make sure any previous pending intent is updated with the new
// extra.
- return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
/** Configures a notification to emit the blinky notification light. */
diff --git a/java/com/android/dialer/app/calllog/PhoneAccountHandles.java b/java/com/android/dialer/app/calllog/PhoneAccountHandles.java
index b0fa1ed45..acffffb1d 100644
--- a/java/com/android/dialer/app/calllog/PhoneAccountHandles.java
+++ b/java/com/android/dialer/app/calllog/PhoneAccountHandles.java
@@ -24,6 +24,7 @@ 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 {
@@ -37,6 +38,11 @@ class PhoneAccountHandles {
"accountComponentName == null || callToNotify.accountId == null");
handle = TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_TEL);
if (handle == null) {
+ List<PhoneAccountHandle> callCapablePhoneAccounts =
+ TelecomUtil.getCallCapablePhoneAccounts(context);
+ if (!callCapablePhoneAccounts.isEmpty()) {
+ return callCapablePhoneAccounts.get(0);
+ }
return null;
}
} else {
diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
index 15f860009..bc78eda02 100644
--- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
+++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
@@ -31,6 +31,7 @@ import com.android.dialer.app.R;
import com.android.dialer.app.calllog.calllogcache.CallLogCache;
import com.android.dialer.calllogutils.PhoneCallDetails;
import com.android.dialer.oem.MotorolaUtils;
+import com.android.dialer.phonenumbercache.CachedNumberLookupService.CachedContactInfo;
import com.android.dialer.phonenumberutil.PhoneNumberHelper;
import com.android.dialer.util.DialerUtils;
import java.util.ArrayList;
@@ -205,7 +206,7 @@ public class PhoneCallDetailsHelper {
&& !PhoneNumberHelper.isUriNumber(details.number.toString())
&& !mCallLogCache.isVoicemailNumber(details.accountHandle, details.number)) {
- if (TextUtils.isEmpty(details.namePrimary) && !TextUtils.isEmpty(details.geocode)) {
+ if (shouldShowLocation(details)) {
numberFormattedLabel = details.geocode;
} else if (!(details.numberType == Phone.TYPE_CUSTOM
&& TextUtils.isEmpty(details.numberLabel))) {
@@ -223,6 +224,22 @@ public class PhoneCallDetailsHelper {
return numberFormattedLabel;
}
+ /** Returns true if primary name is empty or the data is from Cequint Caller ID. */
+ private static boolean shouldShowLocation(PhoneCallDetails details) {
+ if (TextUtils.isEmpty(details.geocode)) {
+ return false;
+ }
+ // For caller ID provided by Cequint we want to show the geo location.
+ if (details.sourceType == CachedContactInfo.SOURCE_TYPE_CEQUINT_CALLER_ID) {
+ return true;
+ }
+ // Don't bother showing geo location for contacts.
+ if (!TextUtils.isEmpty(details.namePrimary)) {
+ return false;
+ }
+ return true;
+ }
+
public void setPhoneTypeLabelForTest(CharSequence phoneTypeLabel) {
this.mPhoneTypeLabelForTest = phoneTypeLabel;
}
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
index edbe5c6ed..5e820a750 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
@@ -16,14 +16,12 @@
package com.android.dialer.app.calllog;
-import android.app.Activity;
import android.content.Intent;
import android.database.ContentObserver;
import android.media.AudioManager;
import android.os.Bundle;
import android.provider.CallLog;
import android.provider.VoicemailContract;
-import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -119,22 +117,22 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment {
}
@Override
- public void onPageResume(@Nullable Activity activity) {
- LogUtil.d("VisualVoicemailCallLogFragment.onPageResume", null);
- super.onPageResume(activity);
- if (activity != null) {
- activity.sendBroadcast(new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL));
- Logger.get(activity).logImpression(DialerImpression.Type.VVM_TAB_VIEWED);
- activity.setVolumeControlStream(VoicemailAudioManager.PLAYBACK_STREAM);
+ public void onVisible() {
+ LogUtil.enterBlock("VisualVoicemailCallLogFragment.onPageSelected");
+ super.onVisible();
+ if (getActivity() != null) {
+ getActivity().sendBroadcast(new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL));
+ Logger.get(getActivity()).logImpression(DialerImpression.Type.VVM_TAB_VIEWED);
+ getActivity().setVolumeControlStream(VoicemailAudioManager.PLAYBACK_STREAM);
}
}
@Override
- public void onPagePause(@Nullable Activity activity) {
- LogUtil.d("VisualVoicemailCallLogFragment.onPagePause", null);
- super.onPagePause(activity);
- if (activity != null) {
- activity.setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE);
+ public void onNotVisible() {
+ LogUtil.enterBlock("VisualVoicemailCallLogFragment.onPageUnselected");
+ super.onNotVisible();
+ if (getActivity() != null) {
+ getActivity().setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE);
}
}
}
diff --git a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
index ab5541b6f..85a9c3ef1 100644
--- a/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
+++ b/java/com/android/dialer/app/contactinfo/ContactInfoCache.java
@@ -153,9 +153,9 @@ public class ContactInfoCache {
if (request.isLocalRequest()) {
info = mContactInfoHelper.lookupNumber(request.number, request.countryIso);
// TODO: Maybe skip look up if it's already available in cached number lookup service.
- long start = SystemClock.uptimeMillis();
+ long start = SystemClock.elapsedRealtime();
mContactInfoHelper.updateFromCequintCallerId(info, request.number);
- long time = SystemClock.uptimeMillis() - start;
+ long time = SystemClock.elapsedRealtime() - start;
LogUtil.d("ContactInfoCache.queryContactInfo", "Cequint Caller Id look up takes %d ms", time);
if (request.type == ContactInfoRequest.TYPE_LOCAL_AND_REMOTE) {
if (!mContactInfoHelper.hasName(info)) {
diff --git a/java/com/android/dialer/app/list/AllContactsFragment.java b/java/com/android/dialer/app/list/AllContactsFragment.java
index 29c0ec47f..04609970a 100644
--- a/java/com/android/dialer/app/list/AllContactsFragment.java
+++ b/java/com/android/dialer/app/list/AllContactsFragment.java
@@ -28,7 +28,6 @@ import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.QuickContact;
-import android.support.annotation.Nullable;
import android.support.v13.app.FragmentCompat;
import android.view.LayoutInflater;
import android.view.View;
@@ -39,10 +38,8 @@ 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.list.ListsFragment.ListsPage;
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.util.DialerUtils;
import com.android.dialer.util.IntentUtil;
@@ -50,8 +47,7 @@ import com.android.dialer.util.PermissionsUtil;
/** Fragments to show all contacts with phone numbers. */
public class AllContactsFragment extends ContactEntryListFragment<ContactEntryListAdapter>
- implements ListsPage,
- OnEmptyViewActionButtonClickedListener,
+ implements OnEmptyViewActionButtonClickedListener,
FragmentCompat.OnRequestPermissionsResultCallback {
private static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1;
@@ -193,14 +189,4 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi
}
}
}
-
- @Override
- public void onPageResume(@Nullable Activity activity) {
- LogUtil.i("AllContactsFragment.onPageResume", null);
- }
-
- @Override
- public void onPagePause(@Nullable Activity activity) {
- LogUtil.i("AllContactsFragment.onPagePause", null);
- }
}
diff --git a/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java b/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java
index 7e2525f24..542501cfd 100644
--- a/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java
+++ b/java/com/android/dialer/app/list/DialerPhoneNumberListAdapter.java
@@ -185,15 +185,15 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
break;
case SHORTCUT_ADD_TO_EXISTING_CONTACT:
text = resources.getString(R.string.search_shortcut_add_to_contact);
- drawableId = R.drawable.ic_person_24dp;
+ drawableId = R.drawable.quantum_ic_person_white_24;
break;
case SHORTCUT_SEND_SMS_MESSAGE:
text = resources.getString(R.string.search_shortcut_send_sms_message);
- drawableId = R.drawable.ic_message_24dp;
+ drawableId = R.drawable.quantum_ic_message_white_24;
break;
case SHORTCUT_MAKE_VIDEO_CALL:
text = resources.getString(R.string.search_shortcut_make_video_call);
- drawableId = R.drawable.ic_videocam;
+ drawableId = R.drawable.quantum_ic_videocam_white_24;
break;
case SHORTCUT_BLOCK_NUMBER:
text = resources.getString(R.string.search_shortcut_block_number);
diff --git a/java/com/android/dialer/app/list/DialtactsPagerAdapter.java b/java/com/android/dialer/app/list/DialtactsPagerAdapter.java
new file mode 100644
index 000000000..3b700d81b
--- /dev/null
+++ b/java/com/android/dialer/app/list/DialtactsPagerAdapter.java
@@ -0,0 +1,189 @@
+/*
+ * 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.app.Fragment;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.support.annotation.IntDef;
+import android.support.v13.app.FragmentPagerAdapter;
+import android.view.ViewGroup;
+import com.android.dialer.app.calllog.CallLogFragment;
+import com.android.dialer.app.calllog.VisualVoicemailCallLogFragment;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.ConfigProviderBindings;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.database.CallLogQueryHandler;
+import com.android.dialer.speeddial.SpeedDialFragment;
+import com.android.dialer.util.ViewUtil;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/** ViewPager adapter for {@link com.android.dialer.app.DialtactsActivity}. */
+public class DialtactsPagerAdapter extends FragmentPagerAdapter {
+
+ /** IntDef for indices of ViewPager tabs. */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({TAB_INDEX_SPEED_DIAL, TAB_INDEX_HISTORY, TAB_INDEX_ALL_CONTACTS, TAB_INDEX_VOICEMAIL})
+ public @interface TabIndex {}
+
+ public static final int TAB_INDEX_SPEED_DIAL = 0;
+ public static final int TAB_INDEX_HISTORY = 1;
+ public static final int TAB_INDEX_ALL_CONTACTS = 2;
+ public static final int TAB_INDEX_VOICEMAIL = 3;
+ public static final int TAB_COUNT_DEFAULT = 3;
+ public static final int TAB_COUNT_WITH_VOICEMAIL = 4;
+
+ private final List<Fragment> fragments = new ArrayList<>();
+ private final String[] tabTitles;
+ private final boolean useNewSpeedDialTab;
+
+ private OldSpeedDialFragment oldSpeedDialFragment;
+ private SpeedDialFragment speedDialFragment;
+ private CallLogFragment callLogFragment;
+ private AllContactsFragment contactsFragment;
+ private CallLogFragment voicemailFragment;
+
+ public boolean hasActiveVoicemailProvider;
+
+ public DialtactsPagerAdapter(
+ Context context, FragmentManager fm, String[] tabTitles, boolean hasVoicemailProvider) {
+ super(fm);
+ useNewSpeedDialTab =
+ ConfigProviderBindings.get(context).getBoolean("enable_new_favorites_tab", false);
+ this.tabTitles = tabTitles;
+ hasActiveVoicemailProvider = hasVoicemailProvider;
+ fragments.addAll(Collections.nCopies(TAB_COUNT_WITH_VOICEMAIL, null));
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return getRtlPosition(position);
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ LogUtil.d("ViewPagerAdapter.getItem", "position: %d", position);
+ switch (getRtlPosition(position)) {
+ case TAB_INDEX_SPEED_DIAL:
+ if (useNewSpeedDialTab) {
+ if (speedDialFragment == null) {
+ speedDialFragment = SpeedDialFragment.newInstance();
+ }
+ return speedDialFragment;
+ } else {
+ if (oldSpeedDialFragment == null) {
+ oldSpeedDialFragment = new OldSpeedDialFragment();
+ }
+ return oldSpeedDialFragment;
+ }
+ case TAB_INDEX_HISTORY:
+ if (callLogFragment == null) {
+ callLogFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL);
+ }
+ return callLogFragment;
+ case TAB_INDEX_ALL_CONTACTS:
+ if (contactsFragment == null) {
+ contactsFragment = new AllContactsFragment();
+ }
+ return contactsFragment;
+ case TAB_INDEX_VOICEMAIL:
+ if (voicemailFragment == null) {
+ voicemailFragment = new VisualVoicemailCallLogFragment();
+ LogUtil.v(
+ "ViewPagerAdapter.getItem",
+ "new VisualVoicemailCallLogFragment: %s",
+ voicemailFragment);
+ }
+ return voicemailFragment;
+ default:
+ throw Assert.createIllegalStateFailException("No fragment at position " + position);
+ }
+ }
+
+ @Override
+ public Fragment instantiateItem(ViewGroup container, int position) {
+ LogUtil.d("ViewPagerAdapter.instantiateItem", "position: %d", position);
+ // On rotation the FragmentManager handles rotation. Therefore getItem() isn't called.
+ // Copy the fragments that the FragmentManager finds so that we can store them in
+ // instance variables for later.
+ final Fragment fragment = (Fragment) super.instantiateItem(container, position);
+ if (fragment instanceof OldSpeedDialFragment) {
+ oldSpeedDialFragment = (OldSpeedDialFragment) fragment;
+ } else if (fragment instanceof SpeedDialFragment) {
+ speedDialFragment = (SpeedDialFragment) fragment;
+ } else if (fragment instanceof CallLogFragment && position == TAB_INDEX_HISTORY) {
+ callLogFragment = (CallLogFragment) fragment;
+ } else if (fragment instanceof AllContactsFragment) {
+ contactsFragment = (AllContactsFragment) fragment;
+ } else if (fragment instanceof CallLogFragment && position == TAB_INDEX_VOICEMAIL) {
+ voicemailFragment = (CallLogFragment) fragment;
+ LogUtil.v("ViewPagerAdapter.instantiateItem", voicemailFragment.toString());
+ }
+ fragments.set(position, fragment);
+ return fragment;
+ }
+
+ /**
+ * When {@link android.support.v4.view.PagerAdapter#notifyDataSetChanged} is called, this method
+ * is called on all pages to determine whether they need to be recreated. When the voicemail tab
+ * is removed, the view needs to be recreated by returning POSITION_NONE. If notifyDataSetChanged
+ * is called for some other reason, the voicemail tab is recreated only if it is active. All other
+ * tabs do not need to be recreated and POSITION_UNCHANGED is returned.
+ */
+ @Override
+ public int getItemPosition(Object object) {
+ return !hasActiveVoicemailProvider && fragments.indexOf(object) == TAB_INDEX_VOICEMAIL
+ ? POSITION_NONE
+ : POSITION_UNCHANGED;
+ }
+
+ @Override
+ public int getCount() {
+ return hasActiveVoicemailProvider ? TAB_COUNT_WITH_VOICEMAIL : TAB_COUNT_DEFAULT;
+ }
+
+ @Override
+ public CharSequence getPageTitle(@TabIndex int position) {
+ return tabTitles[position];
+ }
+
+ public int getRtlPosition(int position) {
+ if (ViewUtil.isRtl()) {
+ return getCount() - 1 - position;
+ }
+ return position;
+ }
+
+ public void removeVoicemailFragment(FragmentManager manager) {
+ if (voicemailFragment != null) {
+ manager.beginTransaction().remove(voicemailFragment).commitAllowingStateLoss();
+ voicemailFragment = null;
+ }
+ }
+
+ public boolean hasActiveVoicemailProvider() {
+ return hasActiveVoicemailProvider;
+ }
+
+ public void setHasActiveVoicemailProvider(boolean hasActiveVoicemailProvider) {
+ this.hasActiveVoicemailProvider = hasActiveVoicemailProvider;
+ }
+}
diff --git a/java/com/android/dialer/app/list/ListsFragment.java b/java/com/android/dialer/app/list/ListsFragment.java
index 3b94e1562..bf29ef310 100644
--- a/java/com/android/dialer/app/list/ListsFragment.java
+++ b/java/com/android/dialer/app/list/ListsFragment.java
@@ -13,11 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.dialer.app.list;
-import android.app.Activity;
+import static com.android.dialer.app.list.DialtactsPagerAdapter.TAB_COUNT_WITH_VOICEMAIL;
+import static com.android.dialer.app.list.DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS;
+import static com.android.dialer.app.list.DialtactsPagerAdapter.TAB_INDEX_HISTORY;
+import static com.android.dialer.app.list.DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL;
+import static com.android.dialer.app.list.DialtactsPagerAdapter.TAB_INDEX_VOICEMAIL;
+
import android.app.Fragment;
-import android.app.FragmentManager;
import android.content.SharedPreferences;
import android.database.ContentObserver;
import android.database.Cursor;
@@ -26,8 +31,6 @@ import android.os.Handler;
import android.os.Trace;
import android.preference.PreferenceManager;
import android.provider.VoicemailContract;
-import android.support.annotation.Nullable;
-import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
@@ -37,7 +40,6 @@ import com.android.contacts.common.list.ViewPagerTabs;
import com.android.dialer.app.R;
import com.android.dialer.app.calllog.CallLogFragment;
import com.android.dialer.app.calllog.CallLogNotificationsService;
-import com.android.dialer.app.calllog.VisualVoicemailCallLogFragment;
import com.android.dialer.app.voicemail.error.VoicemailStatusCorruptionHandler;
import com.android.dialer.app.voicemail.error.VoicemailStatusCorruptionHandler.Source;
import com.android.dialer.common.LogUtil;
@@ -45,11 +47,10 @@ import com.android.dialer.database.CallLogQueryHandler;
import com.android.dialer.logging.Logger;
import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.logging.nano.ScreenEvent;
-import com.android.dialer.util.ViewUtil;
+import com.android.dialer.speeddial.SpeedDialFragment;
import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
import com.android.dialer.voicemailstatus.VoicemailStatusHelper;
import java.util.ArrayList;
-import java.util.List;
/**
* Fragment that is used as the main screen of the Dialer.
@@ -61,51 +62,18 @@ import java.util.List;
public class ListsFragment extends Fragment
implements ViewPager.OnPageChangeListener, CallLogQueryHandler.Listener {
- /** Every fragment in the list show implement this interface. */
- public interface ListsPage {
-
- /**
- * Called when the page is resumed, including selecting the page or activity resume. Note: This
- * is called before the page fragment is attached to a activity.
- *
- * @param activity the activity hosting the ListFragment
- */
- void onPageResume(@Nullable Activity activity);
-
- /**
- * Called when the page is paused, including selecting another page or activity pause. Note:
- * This is called after the page fragment is detached from a activity.
- *
- * @param activity the activity hosting the ListFragment
- */
- void onPagePause(@Nullable Activity activity);
- }
-
- public static final int TAB_INDEX_SPEED_DIAL = 0;
- public static final int TAB_INDEX_HISTORY = 1;
- public static final int TAB_INDEX_ALL_CONTACTS = 2;
- public static final int TAB_INDEX_VOICEMAIL = 3;
- public static final int TAB_COUNT_DEFAULT = 3;
- public static final int TAB_COUNT_WITH_VOICEMAIL = 4;
private static final String TAG = "ListsFragment";
private ViewPager mViewPager;
private ViewPagerTabs mViewPagerTabs;
- private ViewPagerAdapter mViewPagerAdapter;
+ private DialtactsPagerAdapter mAdapter;
private RemoveView mRemoveView;
private View mRemoveViewContent;
- private SpeedDialFragment mSpeedDialFragment;
- private CallLogFragment mHistoryFragment;
- private AllContactsFragment mAllContactsFragment;
- private CallLogFragment mVoicemailFragment;
- private ListsPage mCurrentPage;
+ private Fragment mCurrentPage;
private SharedPreferences mPrefs;
- private boolean mHasActiveVoicemailProvider;
private boolean mHasFetchedVoicemailStatus;
private boolean mShowVoicemailTabAfterVoicemailStatusIsFetched;
private VoicemailStatusHelper mVoicemailStatusHelper;
private final ArrayList<OnPageChangeListener> mOnPageChangeListeners = new ArrayList<>();
- private String[] mTabTitles;
- private int[] mTabIcons;
/** The position of the currently selected tab. */
private int mTabIndex = TAB_INDEX_SPEED_DIAL;
@@ -125,15 +93,8 @@ public class ListsFragment extends Fragment
LogUtil.d("ListsFragment.onCreate", null);
Trace.beginSection(TAG + " onCreate");
super.onCreate(savedInstanceState);
-
mVoicemailStatusHelper = new VoicemailStatusHelper();
- mHasFetchedVoicemailStatus = false;
-
mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
- mHasActiveVoicemailProvider =
- mPrefs.getBoolean(
- VisualVoicemailEnabledChecker.PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, false);
-
Trace.endSection();
}
@@ -153,17 +114,17 @@ public class ListsFragment extends Fragment
mCallLogQueryHandler.fetchVoicemailStatus();
mCallLogQueryHandler.fetchMissedCallsUnreadCount();
Trace.endSection();
- mCurrentPage = getListsPage(mViewPager.getCurrentItem());
- if (mCurrentPage != null) {
- mCurrentPage.onPageResume(getActivity());
+ mCurrentPage = mAdapter.getItem(mViewPager.getCurrentItem());
+ if (mCurrentPage instanceof CallLogFragment) {
+ ((CallLogFragment) mCurrentPage).onVisible();
}
}
@Override
public void onPause() {
LogUtil.d("ListsFragment.onPause", null);
- if (mCurrentPage != null) {
- mCurrentPage.onPagePause(getActivity());
+ if (mCurrentPage instanceof CallLogFragment) {
+ ((CallLogFragment) mCurrentPage).onNotVisible();
}
super.onPause();
}
@@ -183,27 +144,34 @@ public class ListsFragment extends Fragment
final View parentView = inflater.inflate(R.layout.lists_fragment, container, false);
Trace.endSection();
Trace.beginSection(TAG + " setup views");
+
+ 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);
+ tabTitles[TAB_INDEX_ALL_CONTACTS] = getResources().getString(R.string.tab_all_contacts);
+ tabTitles[TAB_INDEX_VOICEMAIL] = getResources().getString(R.string.tab_voicemail);
+
+ int[] tabIcons = new int[TAB_COUNT_WITH_VOICEMAIL];
+ tabIcons[TAB_INDEX_SPEED_DIAL] = R.drawable.quantum_ic_grade_white_24;
+ tabIcons[TAB_INDEX_HISTORY] = R.drawable.quantum_ic_schedule_white_24;
+ 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);
- mViewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());
- mViewPager.setAdapter(mViewPagerAdapter);
+ mAdapter =
+ new DialtactsPagerAdapter(
+ getContext(),
+ getChildFragmentManager(),
+ tabTitles,
+ mPrefs.getBoolean(
+ VisualVoicemailEnabledChecker.PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, false));
+ mViewPager.setAdapter(mAdapter);
mViewPager.setOffscreenPageLimit(TAB_COUNT_WITH_VOICEMAIL - 1);
mViewPager.addOnPageChangeListener(this);
showTab(TAB_INDEX_SPEED_DIAL);
- mTabTitles = new String[TAB_COUNT_WITH_VOICEMAIL];
- mTabTitles[TAB_INDEX_SPEED_DIAL] = getResources().getString(R.string.tab_speed_dial);
- mTabTitles[TAB_INDEX_HISTORY] = getResources().getString(R.string.tab_history);
- mTabTitles[TAB_INDEX_ALL_CONTACTS] = getResources().getString(R.string.tab_all_contacts);
- mTabTitles[TAB_INDEX_VOICEMAIL] = getResources().getString(R.string.tab_voicemail);
-
- mTabIcons = new int[TAB_COUNT_WITH_VOICEMAIL];
- mTabIcons[TAB_INDEX_SPEED_DIAL] = R.drawable.ic_grade_24dp;
- mTabIcons[TAB_INDEX_HISTORY] = R.drawable.ic_schedule_24dp;
- mTabIcons[TAB_INDEX_ALL_CONTACTS] = R.drawable.ic_people_24dp;
- mTabIcons[TAB_INDEX_VOICEMAIL] = R.drawable.ic_voicemail_24dp;
-
mViewPagerTabs = (ViewPagerTabs) parentView.findViewById(R.id.lists_pager_header);
- mViewPagerTabs.configureTabIcons(mTabIcons);
+ mViewPagerTabs.configureTabIcons(tabIcons);
mViewPagerTabs.setViewPager(mViewPager);
addOnPageChangeListener(mViewPagerTabs);
@@ -239,20 +207,20 @@ public class ListsFragment extends Fragment
*/
public void showTab(int index) {
if (index == TAB_INDEX_VOICEMAIL) {
- if (mHasActiveVoicemailProvider) {
- mViewPager.setCurrentItem(getRtlPosition(TAB_INDEX_VOICEMAIL));
+ if (mAdapter.hasActiveVoicemailProvider()) {
+ mViewPager.setCurrentItem(mAdapter.getRtlPosition(TAB_INDEX_VOICEMAIL));
} else if (!mHasFetchedVoicemailStatus) {
// Try to show the voicemail tab after the voicemail status returns.
mShowVoicemailTabAfterVoicemailStatusIsFetched = true;
}
} else if (index < getTabCount()) {
- mViewPager.setCurrentItem(getRtlPosition(index));
+ mViewPager.setCurrentItem(mAdapter.getRtlPosition(index));
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- mTabIndex = getRtlPosition(position);
+ mTabIndex = mAdapter.getRtlPosition(position);
final int count = mOnPageChangeListeners.size();
for (int i = 0; i < count; i++) {
@@ -263,7 +231,7 @@ public class ListsFragment extends Fragment
@Override
public void onPageSelected(int position) {
LogUtil.i("ListsFragment.onPageSelected", "position: %d", position);
- mTabIndex = getRtlPosition(position);
+ mTabIndex = mAdapter.getRtlPosition(position);
// Show the tab which has been selected instead.
mShowVoicemailTabAfterVoicemailStatusIsFetched = false;
@@ -274,12 +242,12 @@ public class ListsFragment extends Fragment
}
sendScreenViewForCurrentPosition();
- if (mCurrentPage != null) {
- mCurrentPage.onPagePause(getActivity());
+ if (mCurrentPage instanceof CallLogFragment) {
+ ((CallLogFragment) mCurrentPage).onNotVisible();
}
- mCurrentPage = getListsPage(position);
- if (mCurrentPage != null) {
- mCurrentPage.onPageResume(getActivity());
+ mCurrentPage = mAdapter.getItem(position);
+ if (mCurrentPage instanceof CallLogFragment) {
+ ((CallLogFragment) mCurrentPage).onVisible();
}
}
@@ -302,19 +270,19 @@ public class ListsFragment extends Fragment
VoicemailStatusCorruptionHandler.maybeFixVoicemailStatus(
getContext(), statusCursor, Source.Activity);
- // Update mHasActiveVoicemailProvider, which controls the number of tabs displayed.
+ // Update hasActiveVoicemailProvider, which controls the number of tabs displayed.
boolean hasActiveVoicemailProvider =
mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor) > 0;
- if (hasActiveVoicemailProvider != mHasActiveVoicemailProvider) {
- mHasActiveVoicemailProvider = hasActiveVoicemailProvider;
- mViewPagerAdapter.notifyDataSetChanged();
+ if (hasActiveVoicemailProvider != mAdapter.hasActiveVoicemailProvider()) {
+ mAdapter.setHasActiveVoicemailProvider(hasActiveVoicemailProvider);
+ mAdapter.notifyDataSetChanged();
if (hasActiveVoicemailProvider) {
Logger.get(getContext()).logImpression(DialerImpression.Type.VVM_TAB_VISIBLE);
mViewPagerTabs.updateTab(TAB_INDEX_VOICEMAIL);
} else {
mViewPagerTabs.removeTab(TAB_INDEX_VOICEMAIL);
- removeVoicemailFragment();
+ mAdapter.removeVoicemailFragment(getChildFragmentManager());
}
mPrefs
@@ -329,7 +297,7 @@ public class ListsFragment extends Fragment
mCallLogQueryHandler.fetchVoicemailUnreadCount();
}
- if (mHasActiveVoicemailProvider && mShowVoicemailTabAfterVoicemailStatusIsFetched) {
+ if (mAdapter.hasActiveVoicemailProvider() && mShowVoicemailTabAfterVoicemailStatusIsFetched) {
mShowVoicemailTabAfterVoicemailStatusIsFetched = false;
showTab(TAB_INDEX_VOICEMAIL);
}
@@ -386,7 +354,7 @@ public class ListsFragment extends Fragment
public void updateTabUnreadCounts() {
if (mCallLogQueryHandler != null) {
mCallLogQueryHandler.fetchMissedCallsUnreadCount();
- if (mHasActiveVoicemailProvider) {
+ if (mAdapter.hasActiveVoicemailProvider()) {
mCallLogQueryHandler.fetchVoicemailUnreadCount();
}
}
@@ -406,8 +374,11 @@ public class ListsFragment extends Fragment
mRemoveView.animate().alpha(show ? 1 : 0).start();
}
- public SpeedDialFragment getSpeedDialFragment() {
- return mSpeedDialFragment;
+ public boolean hasFrequents() {
+ Fragment page = mAdapter.getItem(mAdapter.getRtlPosition(TAB_INDEX_SPEED_DIAL));
+ return page instanceof OldSpeedDialFragment
+ ? ((OldSpeedDialFragment) page).hasFrequents()
+ : ((SpeedDialFragment) page).hasFrequents();
}
public RemoveView getRemoveView() {
@@ -415,14 +386,7 @@ public class ListsFragment extends Fragment
}
public int getTabCount() {
- return mViewPagerAdapter.getCount();
- }
-
- private int getRtlPosition(int position) {
- if (ViewUtil.isRtl()) {
- return mViewPagerAdapter.getCount() - 1 - position;
- }
- return position;
+ return mAdapter.getCount();
}
public void sendScreenViewForCurrentPosition() {
@@ -449,122 +413,4 @@ public class ListsFragment extends Fragment
}
Logger.get(getActivity()).logScreenView(screenType, getActivity());
}
-
- private void removeVoicemailFragment() {
- if (mVoicemailFragment != null) {
- getChildFragmentManager()
- .beginTransaction()
- .remove(mVoicemailFragment)
- .commitAllowingStateLoss();
- mVoicemailFragment = null;
- }
- }
-
- private ListsPage getListsPage(int position) {
- switch (getRtlPosition(position)) {
- case TAB_INDEX_SPEED_DIAL:
- return mSpeedDialFragment;
- case TAB_INDEX_HISTORY:
- return mHistoryFragment;
- case TAB_INDEX_ALL_CONTACTS:
- return mAllContactsFragment;
- case TAB_INDEX_VOICEMAIL:
- return mVoicemailFragment;
- }
- throw new IllegalStateException("No fragment at position " + position);
- }
-
- public class ViewPagerAdapter extends FragmentPagerAdapter {
-
- private final List<Fragment> mFragments = new ArrayList<>();
-
- public ViewPagerAdapter(FragmentManager fm) {
- super(fm);
- for (int i = 0; i < TAB_COUNT_WITH_VOICEMAIL; i++) {
- mFragments.add(null);
- }
- }
-
- @Override
- public long getItemId(int position) {
- return getRtlPosition(position);
- }
-
- @Override
- public Fragment getItem(int position) {
- LogUtil.d("ViewPagerAdapter.getItem", "position: %d", position);
- switch (getRtlPosition(position)) {
- case TAB_INDEX_SPEED_DIAL:
- if (mSpeedDialFragment == null) {
- mSpeedDialFragment = new SpeedDialFragment();
- }
- return mSpeedDialFragment;
- case TAB_INDEX_HISTORY:
- if (mHistoryFragment == null) {
- mHistoryFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL);
- }
- return mHistoryFragment;
- case TAB_INDEX_ALL_CONTACTS:
- if (mAllContactsFragment == null) {
- mAllContactsFragment = new AllContactsFragment();
- }
- return mAllContactsFragment;
- case TAB_INDEX_VOICEMAIL:
- if (mVoicemailFragment == null) {
- mVoicemailFragment = new VisualVoicemailCallLogFragment();
- LogUtil.v(
- "ViewPagerAdapter.getItem",
- "new VisualVoicemailCallLogFragment: %s",
- mVoicemailFragment);
- }
- return mVoicemailFragment;
- }
- throw new IllegalStateException("No fragment at position " + position);
- }
-
- @Override
- public Fragment instantiateItem(ViewGroup container, int position) {
- LogUtil.d("ViewPagerAdapter.instantiateItem", "position: %d", position);
- // On rotation the FragmentManager handles rotation. Therefore getItem() isn't called.
- // Copy the fragments that the FragmentManager finds so that we can store them in
- // instance variables for later.
- final Fragment fragment = (Fragment) super.instantiateItem(container, position);
- if (fragment instanceof SpeedDialFragment) {
- mSpeedDialFragment = (SpeedDialFragment) fragment;
- } else if (fragment instanceof CallLogFragment && position == TAB_INDEX_HISTORY) {
- mHistoryFragment = (CallLogFragment) fragment;
- } else if (fragment instanceof AllContactsFragment) {
- mAllContactsFragment = (AllContactsFragment) fragment;
- } else if (fragment instanceof CallLogFragment && position == TAB_INDEX_VOICEMAIL) {
- mVoicemailFragment = (CallLogFragment) fragment;
- LogUtil.v("ViewPagerAdapter.instantiateItem", mVoicemailFragment.toString());
- }
- mFragments.set(position, fragment);
- return fragment;
- }
-
- /**
- * When {@link android.support.v4.view.PagerAdapter#notifyDataSetChanged} is called, this method
- * is called on all pages to determine whether they need to be recreated. When the voicemail tab
- * is removed, the view needs to be recreated by returning POSITION_NONE. If
- * notifyDataSetChanged is called for some other reason, the voicemail tab is recreated only if
- * it is active. All other tabs do not need to be recreated and POSITION_UNCHANGED is returned.
- */
- @Override
- public int getItemPosition(Object object) {
- return !mHasActiveVoicemailProvider && mFragments.indexOf(object) == TAB_INDEX_VOICEMAIL
- ? POSITION_NONE
- : POSITION_UNCHANGED;
- }
-
- @Override
- public int getCount() {
- return mHasActiveVoicemailProvider ? TAB_COUNT_WITH_VOICEMAIL : TAB_COUNT_DEFAULT;
- }
-
- @Override
- public CharSequence getPageTitle(int position) {
- return mTabTitles[position];
- }
- }
}
diff --git a/java/com/android/dialer/app/list/SpeedDialFragment.java b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
index 8e0f89028..4aafd9625 100644
--- a/java/com/android/dialer/app/list/SpeedDialFragment.java
+++ b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
@@ -31,7 +31,6 @@ import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.os.Trace;
-import android.support.annotation.Nullable;
import android.support.v13.app.FragmentCompat;
import android.support.v4.util.LongSparseArray;
import android.view.LayoutInflater;
@@ -51,7 +50,6 @@ 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.list.ListsFragment.ListsPage;
import com.android.dialer.app.widget.EmptyContentView;
import com.android.dialer.callintent.nano.CallInitiationType;
import com.android.dialer.callintent.nano.CallSpecificAppData;
@@ -61,9 +59,8 @@ import com.android.dialer.util.ViewUtil;
import java.util.ArrayList;
/** This fragment displays the user's favorite/frequent contacts in a grid. */
-public class SpeedDialFragment extends Fragment
- implements ListsPage,
- OnItemClickListener,
+public class OldSpeedDialFragment extends Fragment
+ implements OnItemClickListener,
PhoneFavoritesTileAdapter.OnDataSetChangedForAnimationListener,
EmptyContentView.OnEmptyViewActionButtonClickedListener,
FragmentCompat.OnRequestPermissionsResultCallback {
@@ -79,7 +76,7 @@ public class SpeedDialFragment extends Fragment
*/
private static final long KEY_REMOVED_ITEM_HEIGHT = Long.MAX_VALUE;
- private static final String TAG = "SpeedDialFragment";
+ private static final String TAG = "OldSpeedDialFragment";
private static final boolean DEBUG = false;
/** Used with LoaderManager. */
private static final int LOADER_ID_CONTACT_TILE = 1;
@@ -104,7 +101,7 @@ public class SpeedDialFragment extends Fragment
@Override
public void onCreate(Bundle savedState) {
if (DEBUG) {
- LogUtil.d("SpeedDialFragment.onCreate", null);
+ LogUtil.d("OldSpeedDialFragment.onCreate", null);
}
Trace.beginSection(TAG + " onCreate");
super.onCreate(savedState);
@@ -256,7 +253,7 @@ public class SpeedDialFragment extends Fragment
final int contactTileAdapterCount = mContactTileAdapter.getCount();
if (position <= contactTileAdapterCount) {
LogUtil.e(
- "SpeedDialFragment.onItemClick",
+ "OldSpeedDialFragment.onItemClick",
"event for unexpected position. The position "
+ position
+ " is before \"all\" section. Ignored.");
@@ -272,7 +269,7 @@ public class SpeedDialFragment extends Fragment
private void saveOffsets(int removedItemHeight) {
final int firstVisiblePosition = mListView.getFirstVisiblePosition();
if (DEBUG) {
- LogUtil.d("SpeedDialFragment.saveOffsets", "Child count : " + mListView.getChildCount());
+ LogUtil.d("OldSpeedDialFragment.saveOffsets", "Child count : " + mListView.getChildCount());
}
for (int i = 0; i < mListView.getChildCount(); i++) {
final View child = mListView.getChildAt(i);
@@ -286,7 +283,7 @@ public class SpeedDialFragment extends Fragment
final long itemId = mContactTileAdapter.getItemId(position);
if (DEBUG) {
LogUtil.d(
- "SpeedDialFragment.saveOffsets",
+ "OldSpeedDialFragment.saveOffsets",
"Saving itemId: " + itemId + " for listview child " + i + " Top: " + child.getTop());
}
mItemIdTopMap.put(itemId, child.getTop());
@@ -356,7 +353,7 @@ public class SpeedDialFragment extends Fragment
if (DEBUG) {
LogUtil.d(
- "SpeedDialFragment.onPreDraw",
+ "OldSpeedDialFragment.onPreDraw",
"Found itemId: "
+ itemId
+ " for listview child "
@@ -426,16 +423,6 @@ public class SpeedDialFragment extends Fragment
}
}
- @Override
- public void onPageResume(@Nullable Activity activity) {
- LogUtil.i("SpeedDialFragment.onPageResume", null);
- }
-
- @Override
- public void onPagePause(@Nullable Activity activity) {
- LogUtil.i("SpeedDialFragment.onPagePause", null);
- }
-
public interface HostInterface {
void setDragDropController(DragDropController controller);
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/empty_call_log.png b/java/com/android/dialer/app/res/drawable-hdpi/empty_call_log.png
deleted file mode 100644
index d6f6daaab..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/empty_call_log.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/empty_contacts.png b/java/com/android/dialer/app/res/drawable-hdpi/empty_contacts.png
deleted file mode 100644
index d3c0378f5..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/empty_contacts.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/empty_speed_dial.png b/java/com/android/dialer/app/res/drawable-hdpi/empty_speed_dial.png
deleted file mode 100644
index 3e9232fc9..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/empty_speed_dial.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_archive_white_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_archive_white_24dp.png
deleted file mode 100644
index bb72e890f..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_archive_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_content_copy_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_content_copy_24dp.png
deleted file mode 100644
index 70eb07378..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_content_copy_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_delete_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_delete_24dp.png
deleted file mode 100644
index 9fb43b066..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_delete_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_add_call.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_add_call.png
deleted file mode 100644
index 4e0d5649e..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_add_call.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_current_call.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_current_call.png
deleted file mode 100644
index 2cf41d598..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_current_call.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png
deleted file mode 100644
index 043685fd9..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_dialer_fork_tt_keypad.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_grade_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_grade_24dp.png
deleted file mode 100644
index 86eecdd4a..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_grade_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_handle.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_handle.png
deleted file mode 100644
index 34310aa49..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_handle.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_menu_history_lt.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_menu_history_lt.png
deleted file mode 100644
index a36323ca9..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_menu_history_lt.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_mic_grey600.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_mic_grey600.png
deleted file mode 100644
index 4b67cf71a..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_mic_grey600.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_more_vert_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_more_vert_24dp.png
deleted file mode 100644
index 67f07e473..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_more_vert_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_not_interested_googblue_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_not_interested_googblue_24dp.png
deleted file mode 100644
index 26a26f911..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_not_interested_googblue_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_not_spam.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_not_spam.png
deleted file mode 100644
index bf413f912..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_not_spam.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_pause_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_pause_24dp.png
deleted file mode 100644
index 4d2ea05c4..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_pause_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_people_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_people_24dp.png
deleted file mode 100644
index ff698afc0..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_people_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_phone_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_phone_24dp.png
deleted file mode 100644
index b27dfba06..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_phone_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_play_arrow_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_play_arrow_24dp.png
deleted file mode 100644
index 57c9fa546..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_play_arrow_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_remove.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_remove.png
deleted file mode 100644
index 1ee6adf8d..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_remove.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_results_phone.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_results_phone.png
deleted file mode 100644
index 3a1a7a790..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_results_phone.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_schedule_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_schedule_24dp.png
deleted file mode 100644
index f3581d104..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_schedule_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_share_white_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_share_white_24dp.png
deleted file mode 100644
index b09a6926d..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_share_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_star.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_star.png
deleted file mode 100644
index 62e1f8a6d..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_star.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_unblock.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_unblock.png
deleted file mode 100644
index 03643b20d..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_unblock.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dis.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dis.png
deleted file mode 100644
index 47e32492c..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dis.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dk.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dk.png
deleted file mode 100644
index 2bfe0c0cf..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_off_dk.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dis.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dis.png
deleted file mode 100644
index 90b5238f3..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dis.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dk.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dk.png
deleted file mode 100644
index 7556637fc..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_vm_sound_on_dk.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_voicemail_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_voicemail_24dp.png
deleted file mode 100644
index 03a62e15f..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_voicemail_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_down_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_down_24dp.png
deleted file mode 100644
index e22e92c85..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_down_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_up_24dp.png b/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_up_24dp.png
deleted file mode 100644
index 57d787163..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/ic_volume_up_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/search_shadow.9.png b/java/com/android/dialer/app/res/drawable-hdpi/search_shadow.9.png
deleted file mode 100644
index 3dc1c17f6..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/search_shadow.9.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-hdpi/shadow_contact_photo.png b/java/com/android/dialer/app/res/drawable-hdpi/shadow_contact_photo.png
deleted file mode 100644
index 44b06f261..000000000
--- a/java/com/android/dialer/app/res/drawable-hdpi/shadow_contact_photo.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_archive_white_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_archive_white_24dp.png
deleted file mode 100644
index f6aa3f966..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_archive_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_content_copy_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_content_copy_24dp.png
deleted file mode 100644
index 80c069557..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_content_copy_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_delete_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_delete_24dp.png
deleted file mode 100644
index c903fd1dd..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_delete_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_grade_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_grade_24dp.png
deleted file mode 100644
index d2cbe4c92..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_grade_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_more_vert_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_more_vert_24dp.png
deleted file mode 100644
index 017e45ede..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_more_vert_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_pause_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_pause_24dp.png
deleted file mode 100644
index 2272d478c..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_pause_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_people_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_people_24dp.png
deleted file mode 100644
index 270e4de2e..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_people_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_play_arrow_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_play_arrow_24dp.png
deleted file mode 100644
index c61e948bb..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_play_arrow_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_schedule_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_schedule_24dp.png
deleted file mode 100644
index 501ee842e..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_schedule_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_share_white_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_share_white_24dp.png
deleted file mode 100644
index e944fd70c..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_share_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_voicemail_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_voicemail_24dp.png
deleted file mode 100644
index e5aa7db05..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_voicemail_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_volume_down_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_volume_down_24dp.png
deleted file mode 100644
index 10992ed70..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_volume_down_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-mdpi/ic_volume_up_24dp.png b/java/com/android/dialer/app/res/drawable-mdpi/ic_volume_up_24dp.png
deleted file mode 100644
index 7cfd4c7b8..000000000
--- a/java/com/android/dialer/app/res/drawable-mdpi/ic_volume_up_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_archive_white_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_archive_white_24dp.png
deleted file mode 100644
index 3513bd9fe..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_archive_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_content_copy_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_content_copy_24dp.png
deleted file mode 100644
index 537fd4e8b..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_content_copy_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_delete_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_delete_24dp.png
deleted file mode 100644
index be1ee4d07..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_delete_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_grade_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_grade_24dp.png
deleted file mode 100644
index d65f39d7c..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_grade_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_more_vert_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_more_vert_24dp.png
deleted file mode 100644
index efab8a74f..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_more_vert_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_pause_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_pause_24dp.png
deleted file mode 100644
index f49aed757..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_pause_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_people_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_people_24dp.png
deleted file mode 100644
index 323981ccf..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_people_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_play_arrow_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_play_arrow_24dp.png
deleted file mode 100644
index a3c80e73d..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_play_arrow_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_schedule_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_schedule_24dp.png
deleted file mode 100644
index 2e27936a4..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_schedule_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_share_white_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_share_white_24dp.png
deleted file mode 100644
index 22a8783e7..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_share_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_voicemail_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_voicemail_24dp.png
deleted file mode 100644
index 59126d706..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_voicemail_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_volume_down_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_volume_down_24dp.png
deleted file mode 100644
index 2621bc15d..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_volume_down_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xhdpi/ic_volume_up_24dp.png b/java/com/android/dialer/app/res/drawable-xhdpi/ic_volume_up_24dp.png
deleted file mode 100644
index 2ed00343b..000000000
--- a/java/com/android/dialer/app/res/drawable-xhdpi/ic_volume_up_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_archive_white_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_archive_white_24dp.png
deleted file mode 100644
index 00e04e42b..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_archive_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_content_copy_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_content_copy_24dp.png
deleted file mode 100644
index 9dff893e7..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_content_copy_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_delete_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_delete_24dp.png
deleted file mode 100644
index eb637920d..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_delete_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_grade_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_grade_24dp.png
deleted file mode 100644
index aa5879215..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_grade_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_more_vert_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_more_vert_24dp.png
deleted file mode 100644
index d32281307..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_more_vert_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_pause_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_pause_24dp.png
deleted file mode 100644
index 7192ad487..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_pause_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_people_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_people_24dp.png
deleted file mode 100644
index 6c68435fb..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_people_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_play_arrow_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_play_arrow_24dp.png
deleted file mode 100644
index 547ef30aa..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_play_arrow_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_schedule_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_schedule_24dp.png
deleted file mode 100644
index bfc72736a..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_schedule_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_share_white_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_share_white_24dp.png
deleted file mode 100644
index a35b3cd14..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_share_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_voicemail_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_voicemail_24dp.png
deleted file mode 100644
index 28b8e936a..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_voicemail_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_volume_down_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_volume_down_24dp.png
deleted file mode 100644
index 5eb8b671f..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_volume_down_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_volume_up_24dp.png b/java/com/android/dialer/app/res/drawable-xxhdpi/ic_volume_up_24dp.png
deleted file mode 100644
index 2e751a40f..000000000
--- a/java/com/android/dialer/app/res/drawable-xxhdpi/ic_volume_up_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_archive_white_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_archive_white_24dp.png
deleted file mode 100644
index 34cd3fd80..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_archive_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_content_copy_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_content_copy_24dp.png
deleted file mode 100644
index 4ddee9ef0..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_content_copy_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_delete_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_delete_24dp.png
deleted file mode 100644
index 2f250f64a..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_delete_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_grade_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_grade_24dp.png
deleted file mode 100644
index 7f38d0963..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_grade_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_more_vert_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_more_vert_24dp.png
deleted file mode 100644
index 2f2cb3d00..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_more_vert_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_pause_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_pause_24dp.png
deleted file mode 100644
index 660ac6585..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_pause_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_people_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_people_24dp.png
deleted file mode 100644
index 5676f7041..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_people_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_play_arrow_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_play_arrow_24dp.png
deleted file mode 100644
index be5c062b5..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_play_arrow_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_schedule_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_schedule_24dp.png
deleted file mode 100644
index b94f4dfa1..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_schedule_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_share_white_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_share_white_24dp.png
deleted file mode 100644
index e351c7beb..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_share_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_voicemail_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_voicemail_24dp.png
deleted file mode 100644
index 820ff5066..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_voicemail_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_volume_down_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_volume_down_24dp.png
deleted file mode 100644
index 4ab55abbd..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_volume_down_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_volume_up_24dp.png b/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_volume_up_24dp.png
deleted file mode 100644
index 82972b4e5..000000000
--- a/java/com/android/dialer/app/res/drawable-xxxhdpi/ic_volume_up_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/app/res/drawable/ic_pause.xml b/java/com/android/dialer/app/res/drawable/ic_pause.xml
index 5bea58192..7696eb0e2 100644
--- a/java/com/android/dialer/app/res/drawable/ic_pause.xml
+++ b/java/com/android/dialer/app/res/drawable/ic_pause.xml
@@ -18,13 +18,13 @@
<item android:state_enabled="false">
<bitmap
- android:src="@drawable/ic_pause_24dp"
+ android:src="@drawable/quantum_ic_pause_white_24"
android:tint="@color/voicemail_icon_disabled_tint"/>
</item>
<item>
<bitmap
- android:src="@drawable/ic_pause_24dp"
+ android:src="@drawable/quantum_ic_pause_white_24"
android:tint="@color/voicemail_playpause_icon_tint"/>
</item>
diff --git a/java/com/android/dialer/app/res/drawable/ic_play_arrow.xml b/java/com/android/dialer/app/res/drawable/ic_play_arrow.xml
index d7d935016..97f736c1f 100644
--- a/java/com/android/dialer/app/res/drawable/ic_play_arrow.xml
+++ b/java/com/android/dialer/app/res/drawable/ic_play_arrow.xml
@@ -19,13 +19,13 @@
<item android:state_enabled="false">
<bitmap
- android:src="@drawable/ic_play_arrow_24dp"
+ android:src="@drawable/quantum_ic_play_arrow_white_24"
android:tint="@color/voicemail_icon_disabled_tint"/>
</item>
<item>
<bitmap
- android:src="@drawable/ic_play_arrow_24dp"
+ android:src="@drawable/quantum_ic_play_arrow_white_24"
android:tint="@color/voicemail_playpause_icon_tint"/>
</item>
diff --git a/java/com/android/dialer/app/res/layout/call_log_list_item.xml b/java/com/android/dialer/app/res/layout/call_log_list_item.xml
index 1592aa928..0fbbb9dd1 100644
--- a/java/com/android/dialer/app/res/layout/call_log_list_item.xml
+++ b/java/com/android/dialer/app/res/layout/call_log_list_item.xml
@@ -60,14 +60,30 @@
android:nextFocusRight="@+id/call_back_action"
android:nextFocusLeft="@+id/quick_contact_photo">
- <QuickContactBadge
- android:id="@+id/quick_contact_photo"
- android:layout_width="@dimen/contact_photo_size"
- android:layout_height="@dimen/contact_photo_size"
- android:paddingTop="2dp"
- android:nextFocusRight="@id/primary_action_view"
- android:layout_gravity="top"
- android:focusable="true"/>
+ <FrameLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ >
+
+ <QuickContactBadge
+ android:id="@+id/quick_contact_photo"
+ android:layout_width="@dimen/contact_photo_size"
+ android:layout_height="@dimen/contact_photo_size"
+ android:paddingTop="2dp"
+ android:nextFocusRight="@id/primary_action_view"
+ android:layout_gravity="top"
+ android:focusable="true"/>
+
+ <ImageView
+ android:id="@+id/quick_contact_checkbox"
+ android:scaleType="fitCenter"
+ android:layout_width="@dimen/contact_photo_size"
+ android:layout_height="@dimen/contact_photo_size"
+ android:visibility="gone"
+ android:src="@drawable/quantum_ic_check_circle_googblue_24" />
+
+ </FrameLayout>
+
<LinearLayout
android:layout_width="0dp"
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 fe77ac613..862882a62 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
@@ -40,7 +40,7 @@
<ImageView
style="@style/CallLogActionIconStyle"
- android:src="@drawable/ic_call_24dp"/>
+ android:src="@drawable/quantum_ic_call_white_24"/>
<LinearLayout
android:layout_width="match_parent"
@@ -93,7 +93,7 @@
<ImageView
style="@style/CallLogActionIconStyle"
- android:src="@drawable/ic_person_24dp"/>
+ android:src="@drawable/quantum_ic_person_white_24"/>
<TextView
style="@style/CallLogActionTextStyle"
@@ -107,7 +107,7 @@
<ImageView
style="@style/CallLogActionIconStyle"
- android:src="@drawable/ic_message_24dp"/>
+ android:src="@drawable/quantum_ic_message_white_24"/>
<TextView
style="@style/CallLogActionTextStyle"
@@ -164,7 +164,7 @@
<ImageView
style="@style/CallLogActionIconStyle"
- android:src="@drawable/ic_block_24dp"/>
+ android:src="@drawable/quantum_ic_block_white_24"/>
<TextView
style="@style/CallLogActionTextStyle"
@@ -178,7 +178,7 @@
<ImageView
style="@style/CallLogActionIconStyle"
- android:src="@drawable/ic_block_24dp"/>
+ android:src="@drawable/quantum_ic_block_white_24"/>
<TextView
style="@style/CallLogActionTextStyle"
@@ -205,7 +205,7 @@
<ImageView
style="@style/CallLogActionIconStyle"
- android:src="@drawable/ic_info_outline_24dp"/>
+ android:src="@drawable/quantum_ic_info_outline_white_24"/>
<TextView
style="@style/CallLogActionTextStyle"
@@ -220,7 +220,7 @@
<ImageView
style="@style/CallLogActionIconStyle"
- android:src="@drawable/quantum_ic_send_black_24"/>
+ android:src="@drawable/quantum_ic_send_white_24"/>
<TextView
style="@style/CallLogActionTextStyle"
diff --git a/java/com/android/dialer/app/res/layout/phone_favorite_tile_view.xml b/java/com/android/dialer/app/res/layout/phone_favorite_tile_view.xml
index 92b2e8e53..43594f649 100644
--- a/java/com/android/dialer/app/res/layout/phone_favorite_tile_view.xml
+++ b/java/com/android/dialer/app/res/layout/phone_favorite_tile_view.xml
@@ -122,7 +122,7 @@
android:background="@drawable/item_background_material_dark"
android:contentDescription="@string/description_view_contact_detail"
android:scaleType="center"
- android:src="@drawable/ic_more_vert_24dp"/>
+ android:src="@drawable/quantum_ic_more_vert_white_24"/>
</RelativeLayout>
</view>
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 1b4f9c4a4..903fbcae9 100644
--- a/java/com/android/dialer/app/res/layout/search_edittext.xml
+++ b/java/com/android/dialer/app/res/layout/search_edittext.xml
@@ -27,7 +27,7 @@
android:padding="@dimen/search_box_search_icon_padding"
android:importantForAccessibility="no"
android:scaleType="center"
- android:src="@drawable/ic_ab_search"
+ android:src="@drawable/quantum_ic_search_white_24"
android:tint="@color/searchbox_icon_tint"/>
<TextView
@@ -61,7 +61,7 @@
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/action_menu_overflow_description"
android:scaleType="center"
- android:src="@drawable/ic_overflow_menu"
+ android:src="@drawable/quantum_ic_more_vert_white_24"
android:tint="@color/searchbox_icon_tint"/>
</LinearLayout>
diff --git a/java/com/android/dialer/app/res/layout/voicemail_playback_layout.xml b/java/com/android/dialer/app/res/layout/voicemail_playback_layout.xml
index 7fff9d204..2589a67c6 100644
--- a/java/com/android/dialer/app/res/layout/voicemail_playback_layout.xml
+++ b/java/com/android/dialer/app/res/layout/voicemail_playback_layout.xml
@@ -79,7 +79,7 @@
android:id="@+id/playback_speakerphone"
style="@style/VoicemailPlaybackLayoutButtonStyle"
android:contentDescription="@string/description_playback_speakerphone"
- android:src="@drawable/ic_volume_down_24dp"
+ android:src="@drawable/quantum_ic_volume_down_white_24"
android:tint="@color/voicemail_icon_tint"/>
<Space
@@ -102,7 +102,7 @@
android:id="@+id/delete_voicemail"
style="@style/VoicemailPlaybackLayoutButtonStyle"
android:contentDescription="@string/call_log_trash_voicemail"
- android:src="@drawable/ic_delete_24dp"
+ android:src="@drawable/quantum_ic_delete_white_24"
android:tint="@color/voicemail_icon_tint"/>
<Space
diff --git a/java/com/android/dialer/app/res/menu/actionbar_delete.xml b/java/com/android/dialer/app/res/menu/actionbar_delete.xml
new file mode 100644
index 000000000..10e534941
--- /dev/null
+++ b/java/com/android/dialer/app/res/menu/actionbar_delete.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <item
+ android:id="@+id/call_detail_delete_menu_item"
+ android:icon="@drawable/quantum_ic_delete_white_24"
+ android:title="@string/delete"
+ app:showAsAction="always"/>
+</menu> \ No newline at end of file
diff --git a/java/com/android/dialer/app/res/mipmap-hdpi/ic_launcher_phone.png b/java/com/android/dialer/app/res/mipmap-hdpi/ic_launcher_phone.png
deleted file mode 100644
index 15c41423b..000000000
--- a/java/com/android/dialer/app/res/mipmap-hdpi/ic_launcher_phone.png
+++ /dev/null
Binary files differ
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 d6195ba30..25bc8a6df 100644
--- a/java/com/android/dialer/app/res/values-de/strings.xml
+++ b/java/com/android/dialer/app/res/values-de/strings.xml
@@ -28,7 +28,7 @@
<string name="action_unblock_number" msgid="6583611581996402004">"Blockierung der Nummer aufheben"</string>
<string name="action_edit_number_before_call" msgid="8017492815878473837">"Nummer vor Anruf bearbeiten"</string>
<string name="call_log_delete_all" msgid="7852970926906523784">"Anrufliste löschen"</string>
- <string name="call_log_trash_voicemail" msgid="6118493534178533972">"Mailbox-Nachricht löschen"</string>
+ <string name="call_log_trash_voicemail" msgid="6118493534178533972">"Mailboxnachricht löschen"</string>
<string name="snackbar_voicemail_deleted" msgid="7463166543725496307">"Mailbox gelöscht"</string>
<string name="snackbar_voicemail_deleted_undo" msgid="6959743982796409941">"Rückgängig"</string>
<string name="clearCallLogConfirmation_title" msgid="7051888019546472245">"Anrufliste löschen?"</string>
@@ -43,16 +43,16 @@
<string name="notification_missedCall_message" msgid="5086910028988305964">"Nachricht"</string>
<string name="post_call_notification_message" msgid="5417476789860590611">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="MESSAGE">%2$s</xliff:g>"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="1551847434476438657">
- <item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Mailbox-Nachrichten </item>
- <item quantity="one">Mailbox-Nachricht</item>
+ <item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Mailboxnachrichten </item>
+ <item quantity="one">Mailboxnachricht</item>
</plurals>
<string name="notification_action_voicemail_play" msgid="5156500902796354071">"Anhören"</string>
<string name="notification_voicemail_callers_list" msgid="7543659703018479564">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
- <string name="notification_new_voicemail_ticker" msgid="6547711461667072303">"Neue Mailbox-Nachricht von <xliff:g id="CALLER">%1$s</xliff:g>"</string>
- <string name="voicemail_playback_error" msgid="4384373852257757295">"Mailbox-Nachricht-Wiedergabe nicht möglich"</string>
- <string name="voicemail_fetching_content" msgid="572320120918636014">"Mailbox-Nachricht wird geladen…"</string>
- <string name="voicemail_archiving_content" msgid="2415183864104922185">"Mailbox-Nachricht wird archiviert…"</string>
- <string name="voicemail_fetching_timout" msgid="2128873915839949783">"Laden der Mailbox-Nachricht nicht möglich"</string>
+ <string name="notification_new_voicemail_ticker" msgid="6547711461667072303">"Neue Mailboxnachricht von <xliff:g id="CALLER">%1$s</xliff:g>"</string>
+ <string name="voicemail_playback_error" msgid="4384373852257757295">"Mailboxnachricht-Wiedergabe nicht möglich"</string>
+ <string name="voicemail_fetching_content" msgid="572320120918636014">"Mailboxnachricht wird geladen…"</string>
+ <string name="voicemail_archiving_content" msgid="2415183864104922185">"Mailboxnachricht wird archiviert…"</string>
+ <string name="voicemail_fetching_timout" msgid="2128873915839949783">"Laden der Mailboxnachricht nicht möglich"</string>
<string name="call_log_voicemail_header" msgid="5799424860394542726">"Nur Mailbox-Anrufe"</string>
<string name="call_log_incoming_header" msgid="1158753168119845168">"Nur eingehende Anrufe"</string>
<string name="call_log_outgoing_header" msgid="149333910997122683">"Nur ausgehende Anrufe"</string>
@@ -91,7 +91,7 @@
<string name="description_num_calls" msgid="6483594535796216044">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> Anrufe"</string>
<string name="description_video_call" msgid="3738199365585751727">"Videoanruf"</string>
<string name="description_send_text_message" msgid="8450269896765568596">"SMS an <xliff:g id="NAME">%1$s</xliff:g> senden"</string>
- <string name="description_call_log_unheard_voicemail" msgid="2258821530650350303">"Nicht abgehörte Mailbox-Nachricht"</string>
+ <string name="description_call_log_unheard_voicemail" msgid="2258821530650350303">"Nicht abgehörte Mailboxnachricht"</string>
<string name="description_start_voice_search" msgid="8380022725973015261">"Sprachsuche starten"</string>
<string name="menu_callNumber" msgid="1540773545517152514">"<xliff:g id="NUMBER">%s</xliff:g> wählen"</string>
<string name="voicemail" msgid="8899540969000957954">"Mailbox"</string>
@@ -122,7 +122,7 @@
<string name="call_log_activity_title" msgid="1275242727244945527">"Anrufliste"</string>
<string name="call_log_all_title" msgid="6042262422192020327">"Alle"</string>
<string name="call_log_missed_title" msgid="17254005889268015">"Entgangen"</string>
- <string name="call_log_voicemail_title" msgid="6504826963256437971">"Mailbox-Nachrichten"</string>
+ <string name="call_log_voicemail_title" msgid="6504826963256437971">"Mailboxnachrichten"</string>
<string name="tab_speed_dial" msgid="6616404752227561075">"Schnellauswahl"</string>
<string name="tab_history" msgid="7420269368689503596">"Anrufliste"</string>
<string name="tab_all_contacts" msgid="5531733977693943015">"Kontakte"</string>
@@ -149,17 +149,17 @@
<string name="call_log_action_call" msgid="682724094251540583">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> anrufen"</string>
<string name="description_incoming_missed_call" msgid="8292535799379230029">"Anruf von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> verpasst"</string>
<string name="description_incoming_answered_call" msgid="3920182963103160610">"Anruf von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> angenommen"</string>
- <string name="description_unread_voicemail" msgid="145170985013419170">"Ungelesene Mailbox-Nachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
- <string name="description_read_voicemail" msgid="5585559881573227732">"Mailbox-Nachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="145170985013419170">"Ungelesene Mailboxnachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="5585559881573227732">"Mailboxnachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="543952487882919924">"Ausgehender Anruf an <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="call_log_via_number" msgid="1340307109806397650">"über <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
<string name="call_log_via_number_phone_account" msgid="7698459003033083416">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> über <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_action" msgid="4042796498169106545">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> anrufen"</string>
<string name="description_video_call_action" msgid="1237090968588659650">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> über Videoanruf anrufen"</string>
<string name="description_voicemail_action" msgid="3290143432403538524">"Mailboxnachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g> anhören"</string>
- <string name="description_voicemail_play" msgid="737337291418966183">"Mailbox-Nachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g> abhören"</string>
- <string name="description_voicemail_pause" msgid="2400610579956333661">"Mailbox-Nachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g> pausieren"</string>
- <string name="description_voicemail_delete" msgid="5305509366448404410">"Mailbox-Nachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g> löschen"</string>
+ <string name="description_voicemail_play" msgid="737337291418966183">"Mailboxnachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g> abhören"</string>
+ <string name="description_voicemail_pause" msgid="2400610579956333661">"Mailboxnachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g> pausieren"</string>
+ <string name="description_voicemail_delete" msgid="5305509366448404410">"Mailboxnachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g> löschen"</string>
<plurals name="description_voicemail_unread" formatted="false" msgid="7562208210097630839">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> neue Mailboxnachrichten</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> neue Mailboxnachricht</item>
@@ -200,8 +200,8 @@
<string name="blocked_call_settings_import_button" msgid="7319111700387470727">"Importieren"</string>
<string name="description_blocked_number_list_delete" msgid="2139644216858370740">"Blockierung der Nummer aufheben"</string>
<string name="addBlockedNumber" msgid="3053473735238295551">"Nummer hinzufügen"</string>
- <string name="block_number_footer_message_vvm" msgid="7955326304033982368">"Anrufe von diesen Nummern werden blockiert und Mailbox-Nachrichten automatisch gelöscht."</string>
- <string name="block_number_footer_message_no_vvm" msgid="1152684139070471665">"Anrufe von diesen Nummern werden blockiert. Die Anrufer haben aber unter Umständen weiterhin die Möglichkeit, dir Mailbox-Nachrichten zu hinterlassen."</string>
+ <string name="block_number_footer_message_vvm" msgid="7955326304033982368">"Anrufe von diesen Nummern werden blockiert und Mailboxnachrichten automatisch gelöscht."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="1152684139070471665">"Anrufe von diesen Nummern werden blockiert. Die Anrufer haben aber unter Umständen weiterhin die Möglichkeit, dir Mailboxnachrichten zu hinterlassen."</string>
<string name="block_list" msgid="4701585783411870782">"Blockierte Nummern"</string>
<string name="alreadyBlocked" msgid="5483253180532475653">"<xliff:g id="NUMBER">%1$s</xliff:g> ist bereits blockiert."</string>
<string name="phone_account_settings_label" msgid="8372485478006965920">"Anrufkonten"</string>
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 e9a508510..36d25346d 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
@@ -18,7 +18,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="2202739481132958990">"Phone"</string>
- <string name="launcherDialpadActivityLabel" msgid="4170587663888307424">"Phone key pad"</string>
+ <string name="launcherDialpadActivityLabel" msgid="4170587663888307424">"Phone keypad"</string>
<string name="dialerIconLabel" msgid="3422916015542176907">"Phone"</string>
<string name="callHistoryIconLabel" msgid="7493268743411968630">"Call history"</string>
<string name="action_report_number" msgid="7231442711369737797">"Report inaccurate number"</string>
@@ -182,8 +182,8 @@
<string name="accessibility_settings_title" msgid="3329027650429831820">"Accessibility"</string>
<string name="ringtone_title" msgid="8377174189894648486">"Phone ringtone"</string>
<string name="vibrate_on_ring_title" msgid="631441314790960485">"Also vibrate for calls"</string>
- <string name="dtmf_tone_enable_title" msgid="3273762431523939277">"Key pad tones"</string>
- <string name="dtmf_tone_length_title" msgid="534096029202438539">"Key pad tone length"</string>
+ <string name="dtmf_tone_enable_title" msgid="3273762431523939277">"Keypad tones"</string>
+ <string name="dtmf_tone_length_title" msgid="534096029202438539">"Keypad tone length"</string>
<string-array name="dtmf_tone_length_entries">
<item msgid="3136353015227162823">"Normal"</item>
<item msgid="5376841175538523822">"Long"</item>
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 e9a508510..36d25346d 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
@@ -18,7 +18,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="2202739481132958990">"Phone"</string>
- <string name="launcherDialpadActivityLabel" msgid="4170587663888307424">"Phone key pad"</string>
+ <string name="launcherDialpadActivityLabel" msgid="4170587663888307424">"Phone keypad"</string>
<string name="dialerIconLabel" msgid="3422916015542176907">"Phone"</string>
<string name="callHistoryIconLabel" msgid="7493268743411968630">"Call history"</string>
<string name="action_report_number" msgid="7231442711369737797">"Report inaccurate number"</string>
@@ -182,8 +182,8 @@
<string name="accessibility_settings_title" msgid="3329027650429831820">"Accessibility"</string>
<string name="ringtone_title" msgid="8377174189894648486">"Phone ringtone"</string>
<string name="vibrate_on_ring_title" msgid="631441314790960485">"Also vibrate for calls"</string>
- <string name="dtmf_tone_enable_title" msgid="3273762431523939277">"Key pad tones"</string>
- <string name="dtmf_tone_length_title" msgid="534096029202438539">"Key pad tone length"</string>
+ <string name="dtmf_tone_enable_title" msgid="3273762431523939277">"Keypad tones"</string>
+ <string name="dtmf_tone_length_title" msgid="534096029202438539">"Keypad tone length"</string>
<string-array name="dtmf_tone_length_entries">
<item msgid="3136353015227162823">"Normal"</item>
<item msgid="5376841175538523822">"Long"</item>
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 e9a508510..36d25346d 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
@@ -18,7 +18,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="2202739481132958990">"Phone"</string>
- <string name="launcherDialpadActivityLabel" msgid="4170587663888307424">"Phone key pad"</string>
+ <string name="launcherDialpadActivityLabel" msgid="4170587663888307424">"Phone keypad"</string>
<string name="dialerIconLabel" msgid="3422916015542176907">"Phone"</string>
<string name="callHistoryIconLabel" msgid="7493268743411968630">"Call history"</string>
<string name="action_report_number" msgid="7231442711369737797">"Report inaccurate number"</string>
@@ -182,8 +182,8 @@
<string name="accessibility_settings_title" msgid="3329027650429831820">"Accessibility"</string>
<string name="ringtone_title" msgid="8377174189894648486">"Phone ringtone"</string>
<string name="vibrate_on_ring_title" msgid="631441314790960485">"Also vibrate for calls"</string>
- <string name="dtmf_tone_enable_title" msgid="3273762431523939277">"Key pad tones"</string>
- <string name="dtmf_tone_length_title" msgid="534096029202438539">"Key pad tone length"</string>
+ <string name="dtmf_tone_enable_title" msgid="3273762431523939277">"Keypad tones"</string>
+ <string name="dtmf_tone_length_title" msgid="534096029202438539">"Keypad tone length"</string>
<string-array name="dtmf_tone_length_entries">
<item msgid="3136353015227162823">"Normal"</item>
<item msgid="5376841175538523822">"Long"</item>
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 6a2c1ce94..63461664f 100644
--- a/java/com/android/dialer/app/res/values-fa/strings.xml
+++ b/java/com/android/dialer/app/res/values-fa/strings.xml
@@ -92,7 +92,7 @@
<string name="description_video_call" msgid="3738199365585751727">"تماس ویدئویی."</string>
<string name="description_send_text_message" msgid="8450269896765568596">"ارسال پیامک به <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call_log_unheard_voicemail" msgid="2258821530650350303">"پست صوتی شنیده نشده"</string>
- <string name="description_start_voice_search" msgid="8380022725973015261">"شروع جستجوی صوتی"</string>
+ <string name="description_start_voice_search" msgid="8380022725973015261">"شروع جستجوی گفتاری"</string>
<string name="menu_callNumber" msgid="1540773545517152514">"تماس با <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="voicemail" msgid="8899540969000957954">"پست صوتی"</string>
<string name="callDetailsShortDurationFormat" msgid="8517030531054801588">"<xliff:g id="SECONDS">%s</xliff:g> ثانیه"</string>
@@ -110,7 +110,7 @@
<string name="simContacts_emptyLoading" msgid="6205424276735652071">"در حال بارگیری سیم کارت..."</string>
<string name="simContacts_title" msgid="7961069730386378887">"مخاطبین سیم کارت"</string>
<string name="add_contact_not_available" msgid="7065884447935173347">"هیچ برنامه مخاطبی در دسترس نیست"</string>
- <string name="voice_search_not_available" msgid="6546240433719732905">"جستجوی شفاهی در دسترس نیست"</string>
+ <string name="voice_search_not_available" msgid="6546240433719732905">"جستجوی گفتاری در دسترس نیست"</string>
<string name="call_not_available" msgid="7850148370757361155">"برقراری تماس تلفنی ممکن نیست، زیرا برنامه تلفن غیرفعال شده است."</string>
<string name="dialer_hint_find_contact" msgid="2023214799381149808">"جستجوی مخاطبین"</string>
<string name="block_number_search_hint" msgid="5377706079015099416">"افزودن شماره یا جستجوی مخاطب"</string>
diff --git a/java/com/android/dialer/app/res/values/styles.xml b/java/com/android/dialer/app/res/values/styles.xml
index 24521ddaf..3b2df96f2 100644
--- a/java/com/android/dialer/app/res/values/styles.xml
+++ b/java/com/android/dialer/app/res/values/styles.xml
@@ -18,10 +18,6 @@
<style name="DialtactsTheme" parent="DialerThemeBase">
- <!-- Style for the overflow button in the actionbar. -->
- <item name="android:actionOverflowButtonStyle">@style/DialtactsActionBarOverflow</item>
- <item name="actionOverflowButtonStyle">@style/DialtactsActionBarOverflow</item>
-
<!-- Styles that require AppCompat compatibility, remember to update both sets -->
<item name="android:windowActionBarOverlay">true</item>
<item name="windowActionBarOverlay">true</item>
@@ -35,7 +31,6 @@
<item name="android:homeAsUpIndicator">@drawable/ic_back_arrow</item>
<item name="android:listViewStyle">@style/ListViewStyle</item>
- <item name="activated_background">@drawable/list_item_activated_background</item>
<item name="section_header_background">@drawable/list_title_holo</item>
<item name="list_section_header_height">32dip</item>
<item name="list_item_padding_top">7dp</item>
@@ -77,16 +72,10 @@
<item name="dialpad_style">@style/Dialpad.Light</item>
</style>
- <!-- Action bar overflow menu icon. -->
- <style name="DialtactsActionBarOverflow"
- parent="@android:style/Widget.Material.Light.ActionButton.Overflow">
- <item name="android:src">@drawable/ic_overflow_menu</item>
- </style>
-
<!-- Action bar overflow menu icon. White with no shadow. -->
<style name="DialtactsActionBarOverflowWhite"
parent="@android:style/Widget.Material.Light.ActionButton.Overflow">
- <item name="android:src">@drawable/overflow_menu</item>
+ <item name="android:src">@drawable/quantum_ic_more_vert_white_24</item>
</style>
<style name="DialpadTheme" parent="DialtactsTheme">
diff --git a/java/com/android/dialer/app/settings/DialerSettingsActivity.java b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
index bbf1cfae5..ff3841aa1 100644
--- a/java/com/android/dialer/app/settings/DialerSettingsActivity.java
+++ b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
@@ -24,6 +24,8 @@ import android.os.Bundle;
import android.os.UserManager;
import android.preference.PreferenceManager;
import android.provider.Settings;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.TelephonyManager;
import android.view.MenuItem;
@@ -31,8 +33,10 @@ import android.widget.Toast;
import com.android.contacts.common.compat.TelephonyManagerCompat;
import com.android.dialer.app.R;
import com.android.dialer.blocking.FilteredNumberCompat;
+import com.android.dialer.common.LogUtil;
import com.android.dialer.compat.CompatUtils;
import com.android.dialer.proguard.UsedByReflection;
+import com.android.voicemail.VoicemailClient;
import com.android.voicemail.VoicemailComponent;
import java.util.List;
@@ -119,14 +123,7 @@ public class DialerSettingsActivity extends AppCompatPreferenceActivity {
migrationStatusOnBuildHeaders = FilteredNumberCompat.hasMigratedToNewBlocking(this);
}
- String voicemailSettingsFragment =
- VoicemailComponent.get(this).getVoicemailClient().getSettingsFragment();
- if (isPrimaryUser && voicemailSettingsFragment != null) {
- Header voicemailSettings = new Header();
- voicemailSettings.titleRes = R.string.voicemail_settings_label;
- voicemailSettings.fragment = voicemailSettingsFragment;
- target.add(voicemailSettings);
- }
+ addVoicemailSettings(target, isPrimaryUser);
if (isPrimaryUser
&& (TelephonyManagerCompat.isTtyModeSupported(telephonyManager)
@@ -140,6 +137,37 @@ public class DialerSettingsActivity extends AppCompatPreferenceActivity {
}
}
+ private void addVoicemailSettings(List<Header> target, boolean isPrimaryUser) {
+ if (!isPrimaryUser) {
+ LogUtil.i("DialerSettingsActivity.addVoicemailSettings", "user not primary user");
+ return;
+ }
+ String voicemailSettingsFragment =
+ VoicemailComponent.get(this).getVoicemailClient().getSettingsFragment();
+ if (voicemailSettingsFragment == null) {
+ LogUtil.i(
+ "DialerSettingsActivity.addVoicemailSettings",
+ "VoicemailClient does not provide settings");
+ return;
+ }
+
+ PhoneAccountHandle phoneAccountHandle =
+ getSystemService(TelecomManager.class)
+ .getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL);
+ if (phoneAccountHandle == null) {
+ LogUtil.e("DialerSettingsActivity.addVoicemailSettings", "phoneAccountHandle is null");
+ return;
+ }
+ LogUtil.i("DialerSettingsActivity.addVoicemailSettings", "adding voicemail settings");
+ Header voicemailSettings = new Header();
+ voicemailSettings.titleRes = R.string.voicemail_settings_label;
+ voicemailSettings.fragment = voicemailSettingsFragment;
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(VoicemailClient.PARAM_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
+ voicemailSettings.fragmentArguments = bundle;
+ target.add(voicemailSettings);
+ }
+
/**
* Returns {@code true} or {@code false} based on whether the display options setting should be
* shown. For languages such as Chinese, Japanese, or Korean, display options aren't useful since
diff --git a/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java b/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java
index f40ed2794..04fe7f66a 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailPlaybackLayout.java
@@ -276,12 +276,12 @@ public class VoicemailPlaybackLayout extends LinearLayout
@Override
public void onSpeakerphoneOn(boolean on) {
if (on) {
- mPlaybackSpeakerphone.setImageResource(R.drawable.ic_volume_up_24dp);
+ mPlaybackSpeakerphone.setImageResource(R.drawable.quantum_ic_volume_up_white_24);
// Speaker is now on, tapping button will turn it off.
mPlaybackSpeakerphone.setContentDescription(
mContext.getString(R.string.voicemail_speaker_off));
} else {
- mPlaybackSpeakerphone.setImageResource(R.drawable.ic_volume_down_24dp);
+ mPlaybackSpeakerphone.setImageResource(R.drawable.quantum_ic_volume_down_white_24);
// Speaker is now off, tapping button will turn it on.
mPlaybackSpeakerphone.setContentDescription(
mContext.getString(R.string.voicemail_speaker_on));
diff --git a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
index 492f2088b..5bfa03e90 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
@@ -39,6 +39,7 @@ import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.support.v4.content.FileProvider;
import android.text.TextUtils;
+import android.util.Pair;
import android.view.View;
import android.view.WindowManager.LayoutParams;
import android.webkit.MimeTypeMap;
@@ -50,6 +51,8 @@ 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.common.concurrent.DialerExecutor;
+import com.android.dialer.common.concurrent.DialerExecutors;
import com.android.dialer.constants.Constants;
import com.android.dialer.logging.Logger;
import com.android.dialer.logging.nano.DialerImpression;
@@ -146,6 +149,8 @@ public class VoicemailPlaybackPresenter
private OnVoicemailDeletedListener mOnVoicemailDeletedListener;
private View shareVoicemailButtonView;
+ private DialerExecutor<Pair<Context, Uri>> shareVoicemailExecutor;
+
/** Initialize variables which are activity-independent and state-independent. */
protected VoicemailPlaybackPresenter(Activity activity) {
Context context = activity.getApplicationContext();
@@ -213,6 +218,23 @@ public class VoicemailPlaybackPresenter
} else {
mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
}
+ shareVoicemailExecutor =
+ DialerExecutors.createUiTaskBuilder(
+ mActivity.getFragmentManager(), "test", new ShareVoicemailWorker())
+ .onSuccess(
+ output -> {
+ if (output == null) {
+ LogUtil.e("VoicemailAsyncTaskUtil.shareVoicemail", "failed to get voicemail");
+ return;
+ }
+ mContext.startActivity(
+ Intent.createChooser(
+ getShareIntent(mContext, output.first, output.second),
+ mContext
+ .getResources()
+ .getText(R.string.call_log_action_share_voicemail)));
+ })
+ .build();
}
}
@@ -838,78 +860,65 @@ public class VoicemailPlaybackPresenter
return ConfigProviderBindings.get(context).getBoolean(CONFIG_SHARE_VOICEMAIL_ALLOWED, true);
}
+ private static class ShareVoicemailWorker
+ implements DialerExecutor.Worker<Pair<Context, Uri>, Pair<Uri, String>> {
+
+ @Nullable
+ @Override
+ public Pair<Uri, String> doInBackground(Pair<Context, Uri> input) {
+ Context context = input.first;
+ Uri voicemailUri = input.second;
+ ContentResolver contentResolver = context.getContentResolver();
+ try (Cursor callLogInfo = getCallLogInfoCursor(contentResolver, voicemailUri);
+ Cursor contentInfo = getContentInfoCursor(contentResolver, voicemailUri)) {
+
+ if (hasContent(callLogInfo) && hasContent(contentInfo)) {
+ String cachedName = callLogInfo.getString(CallLogQuery.CACHED_NAME);
+ String number = contentInfo.getString(contentInfo.getColumnIndex(Voicemails.NUMBER));
+ long date = contentInfo.getLong(contentInfo.getColumnIndex(Voicemails.DATE));
+ String mimeType = contentInfo.getString(contentInfo.getColumnIndex(Voicemails.MIME_TYPE));
+ String transcription =
+ contentInfo.getString(contentInfo.getColumnIndex(Voicemails.TRANSCRIPTION));
+
+ // Copy voicemail content to a new file.
+ // Please see reference in third_party/java_src/android_app/dialer/java/com/android/
+ // dialer/app/res/xml/file_paths.xml for correct cache directory name.
+ File parentDir = new File(context.getCacheDir(), "my_cache");
+ if (!parentDir.exists()) {
+ parentDir.mkdirs();
+ }
+ File temporaryVoicemailFile =
+ new File(parentDir, getFileName(cachedName, number, mimeType, date));
+
+ try (InputStream inputStream = contentResolver.openInputStream(voicemailUri);
+ OutputStream outputStream =
+ contentResolver.openOutputStream(Uri.fromFile(temporaryVoicemailFile))) {
+ if (inputStream != null && outputStream != null) {
+ ByteStreams.copy(inputStream, outputStream);
+ return new Pair<>(
+ FileProvider.getUriForFile(
+ context, Constants.get().getFileProviderAuthority(), temporaryVoicemailFile),
+ transcription);
+ }
+ } catch (IOException e) {
+ LogUtil.e(
+ "VoicemailAsyncTaskUtil.shareVoicemail",
+ "failed to copy voicemail content to new file: ",
+ e);
+ }
+ return null;
+ }
+ }
+ return null;
+ }
+ }
+
/**
* Share voicemail to be opened by user selected apps. This method will collect information, copy
* voicemail to a temporary file in background and launch a chooser intent to share it.
*/
- @TargetApi(VERSION_CODES.M)
public void shareVoicemail() {
- mAsyncTaskExecutor.submit(
- Tasks.SHARE_VOICEMAIL,
- new AsyncTask<Void, Void, Uri>() {
- @Nullable
- @Override
- protected Uri doInBackground(Void... params) {
- ContentResolver contentResolver = mContext.getContentResolver();
- try (Cursor callLogInfo = getCallLogInfoCursor(contentResolver, mVoicemailUri);
- Cursor contentInfo = getContentInfoCursor(contentResolver, mVoicemailUri)) {
-
- if (hasContent(callLogInfo) && hasContent(contentInfo)) {
- String cachedName = callLogInfo.getString(CallLogQuery.CACHED_NAME);
- String number =
- contentInfo.getString(
- contentInfo.getColumnIndex(VoicemailContract.Voicemails.NUMBER));
- long date =
- contentInfo.getLong(
- contentInfo.getColumnIndex(VoicemailContract.Voicemails.DATE));
- String mimeType =
- contentInfo.getString(
- contentInfo.getColumnIndex(VoicemailContract.Voicemails.MIME_TYPE));
-
- // Copy voicemail content to a new file.
- // Please see reference in third_party/java_src/android_app/dialer/java/com/android/
- // dialer/app/res/xml/file_paths.xml for correct cache directory name.
- File parentDir = new File(mContext.getCacheDir(), "my_cache");
- if (!parentDir.exists()) {
- parentDir.mkdirs();
- }
- File temporaryVoicemailFile =
- new File(parentDir, getFileName(cachedName, number, mimeType, date));
-
- try (InputStream inputStream = contentResolver.openInputStream(mVoicemailUri);
- OutputStream outputStream =
- contentResolver.openOutputStream(Uri.fromFile(temporaryVoicemailFile))) {
- if (inputStream != null && outputStream != null) {
- ByteStreams.copy(inputStream, outputStream);
- return FileProvider.getUriForFile(
- mContext,
- Constants.get().getFileProviderAuthority(),
- temporaryVoicemailFile);
- }
- } catch (IOException e) {
- LogUtil.e(
- "VoicemailAsyncTaskUtil.shareVoicemail",
- "failed to copy voicemail content to new file: ",
- e);
- }
- return null;
- }
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Uri uri) {
- if (uri == null) {
- LogUtil.e("VoicemailAsyncTaskUtil.shareVoicemail", "failed to get voicemail");
- } else {
- mContext.startActivity(
- Intent.createChooser(
- getShareIntent(mContext, uri),
- mContext.getResources().getText(R.string.call_log_action_share_voicemail)));
- }
- }
- });
+ shareVoicemailExecutor.executeParallel(new Pair<>(mContext, mVoicemailUri));
}
private static String getFileName(String cachedName, String number, String mimeType, long date) {
@@ -925,12 +934,22 @@ public class VoicemailPlaybackPresenter
+ (TextUtils.isEmpty(fileExtension) ? "" : "." + fileExtension);
}
- private static Intent getShareIntent(Context context, Uri voicemailFileUri) {
+ private static Intent getShareIntent(
+ Context context, Uri voicemailFileUri, String transcription) {
Intent shareIntent = new Intent();
- shareIntent.setAction(Intent.ACTION_SEND);
- shareIntent.putExtra(Intent.EXTRA_STREAM, voicemailFileUri);
- shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- shareIntent.setType(context.getContentResolver().getType(voicemailFileUri));
+ if (TextUtils.isEmpty(transcription)) {
+ shareIntent.setAction(Intent.ACTION_SEND);
+ shareIntent.putExtra(Intent.EXTRA_STREAM, voicemailFileUri);
+ shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ shareIntent.setType(context.getContentResolver().getType(voicemailFileUri));
+ } else {
+ shareIntent.setAction(Intent.ACTION_SEND);
+ shareIntent.putExtra(Intent.EXTRA_STREAM, voicemailFileUri);
+ shareIntent.putExtra(Intent.EXTRA_TEXT, transcription);
+ shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ shareIntent.setType("*/*");
+ }
+
return shareIntent;
}
@@ -954,10 +973,11 @@ public class VoicemailPlaybackPresenter
return contentResolver.query(
voicemailUri,
new String[] {
- VoicemailContract.Voicemails._ID,
- VoicemailContract.Voicemails.NUMBER,
- VoicemailContract.Voicemails.DATE,
- VoicemailContract.Voicemails.MIME_TYPE,
+ Voicemails._ID,
+ Voicemails.NUMBER,
+ Voicemails.DATE,
+ Voicemails.MIME_TYPE,
+ Voicemails.TRANSCRIPTION,
},
null,
null,
diff --git a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
index b56d568b7..2b19bd7bb 100644
--- a/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/OmtpVoicemailMessageCreator.java
@@ -22,7 +22,6 @@ import android.provider.VoicemailContract.Status;
import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
import com.android.dialer.app.voicemail.error.VoicemailErrorMessage.Action;
-import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.PerAccountSharedPreferences;
import com.android.dialer.logging.Logger;
@@ -136,92 +135,122 @@ public class OmtpVoicemailMessageCreator {
Context context, VoicemailStatus status, VoicemailStatusReader statusReader) {
if (status.quotaOccupied != Status.QUOTA_UNAVAILABLE
&& status.quotaTotal != Status.QUOTA_UNAVAILABLE) {
+ return createInboxErrorMessage(context, status, statusReader);
+ }
+ Logger.get(context).logImpression(DialerImpression.Type.VVM_QUOTA_CHECK_UNAVAILABLE);
+ return null;
+ }
- PhoneAccountHandle phoneAccountHandle = status.getPhoneAccountHandle();
+ @Nullable
+ private static VoicemailErrorMessage createInboxErrorMessage(
+ Context context, VoicemailStatus status, VoicemailStatusReader statusReader) {
- VoicemailClient voicemailClient = VoicemailComponent.get(context).getVoicemailClient();
+ float voicemailOccupiedFraction = (float) status.quotaOccupied / (float) status.quotaTotal;
- PerAccountSharedPreferences sharedPreferenceForAccount =
- new PerAccountSharedPreferences(
- context, phoneAccountHandle, PreferenceManager.getDefaultSharedPreferences(context));
+ if (voicemailOccupiedFraction < QUOTA_NEAR_FULL_THRESHOLD) {
+ return null;
+ }
- boolean isVoicemailArchiveEnabled =
- VoicemailComponent.get(context)
- .getVoicemailClient()
- .isVoicemailArchiveEnabled(context, phoneAccountHandle);
+ boolean isFull = voicemailOccupiedFraction >= QUOTA_FULL_THRESHOLD;
- if ((float) status.quotaOccupied / (float) status.quotaTotal >= QUOTA_FULL_THRESHOLD) {
- return createInboxErrorMessage(
- context,
- status,
- status.getPhoneAccountHandle(),
- statusReader,
- sharedPreferenceForAccount,
- voicemailClient,
- isVoicemailArchiveEnabled,
- context.getString(R.string.voicemail_error_inbox_full_turn_archive_on_title),
- context.getText(R.string.voicemail_error_inbox_full_turn_archive_on_message),
- context.getString(R.string.voicemail_error_inbox_full_title),
- context.getString(R.string.voicemail_error_inbox_full_message),
- VOICEMAIL_PROMO_DISMISSED_KEY);
- }
+ PhoneAccountHandle phoneAccountHandle = status.getPhoneAccountHandle();
- if ((float) status.quotaOccupied / (float) status.quotaTotal >= QUOTA_NEAR_FULL_THRESHOLD) {
- return createInboxErrorMessage(
- context,
- status,
- status.getPhoneAccountHandle(),
- statusReader,
- sharedPreferenceForAccount,
- voicemailClient,
- isVoicemailArchiveEnabled,
- context.getString(R.string.voicemail_error_inbox_almost_full_turn_archive_on_title),
- context.getText(R.string.voicemail_error_inbox_almost_full_turn_archive_on_message),
+ PerAccountSharedPreferences sharedPreferenceForAccount =
+ new PerAccountSharedPreferences(
+ context, phoneAccountHandle, PreferenceManager.getDefaultSharedPreferences(context));
+
+ VoicemailClient voicemailClient = VoicemailComponent.get(context).getVoicemailClient();
+
+ boolean shouldShowPromoForArchive =
+ !isPromoForArchiveDismissed(sharedPreferenceForAccount, isFull)
+ && !voicemailClient.isVoicemailArchiveEnabled(context, phoneAccountHandle)
+ && voicemailClient.isVoicemailArchiveAvailable(context);
+
+ if (!shouldShowPromoForArchive) {
+ if (isFull) {
+ Logger.get(context)
+ .logImpression(DialerImpression.Type.VVM_USER_SHOWN_VM_FULL_ERROR_MESSAGE);
+ return new VoicemailErrorMessage(
+ context.getString(R.string.voicemail_error_inbox_full_title),
+ context.getString(R.string.voicemail_error_inbox_full_message));
+ } else {
+ Logger.get(context)
+ .logImpression(DialerImpression.Type.VVM_USER_SHOWN_VM_ALMOST_FULL_ERROR_MESSAGE);
+ return new VoicemailErrorMessage(
context.getString(R.string.voicemail_error_inbox_near_full_title),
- context.getString(R.string.voicemail_error_inbox_near_full_message),
- VOICEMAIL_PROMO_ALMOST_FULL_DISMISSED_KEY);
+ context.getString(R.string.voicemail_error_inbox_near_full_message));
}
}
- return null;
+
+ String title;
+ CharSequence message;
+ int enabledImpression;
+ int dismissedImpression;
+ String dismissedKey;
+
+ if (isFull) {
+ Logger.get(context).logImpression(DialerImpression.Type.VVM_USER_SHOWN_VM_FULL_PROMO);
+ title = context.getString(R.string.voicemail_error_inbox_full_turn_archive_on_title);
+ message = context.getText(R.string.voicemail_error_inbox_full_turn_archive_on_message);
+ enabledImpression = DialerImpression.Type.VVM_USER_ENABLED_ARCHIVE_FROM_VM_FULL_PROMO;
+ dismissedImpression = DialerImpression.Type.VVM_USER_DISMISSED_VM_FULL_PROMO;
+ dismissedKey = VOICEMAIL_PROMO_DISMISSED_KEY;
+ } else {
+ Logger.get(context).logImpression(DialerImpression.Type.VVM_USER_SHOWN_VM_ALMOST_FULL_PROMO);
+ title = context.getString(R.string.voicemail_error_inbox_almost_full_turn_archive_on_title);
+ message = context.getText(R.string.voicemail_error_inbox_almost_full_turn_archive_on_message);
+ enabledImpression = DialerImpression.Type.VVM_USER_ENABLED_ARCHIVE_FROM_VM_ALMOST_FULL_PROMO;
+ dismissedImpression = DialerImpression.Type.VVM_USER_DISMISSED_VM_ALMOST_FULL_PROMO;
+ dismissedKey = VOICEMAIL_PROMO_ALMOST_FULL_DISMISSED_KEY;
+ }
+
+ return createVMQuotaPromo(
+ context,
+ phoneAccountHandle,
+ status,
+ statusReader,
+ voicemailClient,
+ sharedPreferenceForAccount,
+ title,
+ message,
+ enabledImpression,
+ dismissedImpression,
+ dismissedKey);
}
- private static VoicemailErrorMessage createInboxErrorMessage(
+ private static boolean isPromoForArchiveDismissed(
+ PerAccountSharedPreferences sharedPreferenceForAccount, boolean isFull) {
+ if (isFull) {
+ return sharedPreferenceForAccount.getBoolean(VOICEMAIL_PROMO_DISMISSED_KEY, false);
+ } else {
+ return sharedPreferenceForAccount.getBoolean(
+ VOICEMAIL_PROMO_ALMOST_FULL_DISMISSED_KEY, false);
+ }
+ }
+
+ private static VoicemailErrorMessage createVMQuotaPromo(
Context context,
- VoicemailStatus status,
PhoneAccountHandle phoneAccountHandle,
+ VoicemailStatus status,
VoicemailStatusReader statusReader,
- PerAccountSharedPreferences sharedPreferenceForAccount,
VoicemailClient voicemailClient,
- boolean isVoicemailArchiveEnabled,
- String promoTitle,
- CharSequence promoMessage,
- String nonPromoTitle,
- String nonPromoMessage,
- String preferenceKey) {
-
- boolean wasPromoDismissed = sharedPreferenceForAccount.getBoolean(preferenceKey, false);
-
- if (!wasPromoDismissed && !isVoicemailArchiveEnabled) {
- logArchiveImpression(
- context,
- preferenceKey,
- DialerImpression.Type.VVM_USER_SHOWN_VM_ALMOST_FULL_PROMO,
- DialerImpression.Type.VVM_USER_SHOWN_VM_FULL_PROMO);
- return new VoicemailErrorMessage(
- promoTitle,
- promoMessage,
- VoicemailErrorMessage.createDismissTurnArchiveOnAction(
- context, statusReader, sharedPreferenceForAccount, preferenceKey),
- VoicemailErrorMessage.createTurnArchiveOnAction(
- context, status, voicemailClient, phoneAccountHandle, preferenceKey));
- } else {
- logArchiveImpression(
- context,
- preferenceKey,
- DialerImpression.Type.VVM_USER_SHOWN_VM_ALMOST_FULL_ERROR_MESSAGE,
- DialerImpression.Type.VVM_USER_SHOWN_VM_FULL_ERROR_MESSAGE);
- return new VoicemailErrorMessage(nonPromoTitle, nonPromoMessage);
- }
+ PerAccountSharedPreferences sharedPreferenceForAccount,
+ String title,
+ CharSequence message,
+ int impressionToLogOnEnable,
+ int impressionToLogOnDismiss,
+ String preferenceKeyToUpdate) {
+ return new VoicemailErrorMessage(
+ title,
+ message,
+ VoicemailErrorMessage.createDismissTurnArchiveOnAction(
+ context,
+ impressionToLogOnDismiss,
+ statusReader,
+ sharedPreferenceForAccount,
+ preferenceKeyToUpdate),
+ VoicemailErrorMessage.createTurnArchiveOnAction(
+ context, impressionToLogOnEnable, status, voicemailClient, phoneAccountHandle));
}
@Nullable
@@ -260,15 +289,4 @@ public class OmtpVoicemailMessageCreator {
}
return new VoicemailErrorMessage(title, description, actions);
}
-
- protected static void logArchiveImpression(
- Context context, String preference, int vmAlmostFullImpression, int vmFullImpression) {
- if (preference.equals(VOICEMAIL_PROMO_DISMISSED_KEY)) {
- Logger.get(context).logImpression(vmAlmostFullImpression);
- } else if (preference.equals(VOICEMAIL_PROMO_ALMOST_FULL_DISMISSED_KEY)) {
- Logger.get(context).logImpression(vmFullImpression);
- } else {
- throw Assert.createAssertionFailException("Invalid preference key " + preference);
- }
- }
}
diff --git a/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java b/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java
index 4addcb996..1ef80288b 100644
--- a/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java
+++ b/java/com/android/dialer/app/voicemail/error/VoicemailErrorMessage.java
@@ -23,14 +23,15 @@ import android.provider.VoicemailContract;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
-import android.telephony.TelephonyManager;
import android.view.View;
import android.view.View.OnClickListener;
+import com.android.dialer.common.Assert;
import com.android.dialer.common.PerAccountSharedPreferences;
import com.android.dialer.logging.Logger;
import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.util.CallUtil;
import com.android.voicemail.VoicemailClient;
+import com.android.voicemail.VoicemailComponent;
import java.util.Arrays;
import java.util.List;
@@ -126,7 +127,8 @@ public class VoicemailErrorMessage {
}
@NonNull
- public static Action createSetPinAction(final Context context) {
+ public static Action createSetPinAction(
+ final Context context, PhoneAccountHandle phoneAccountHandle) {
return new Action(
context.getString(R.string.voicemail_action_set_pin),
new OnClickListener() {
@@ -134,8 +136,10 @@ public class VoicemailErrorMessage {
public void onClick(View v) {
Logger.get(context)
.logImpression(DialerImpression.Type.VOICEMAIL_ALERT_SET_PIN_CLICKED);
- Intent intent = new Intent(TelephonyManager.ACTION_CONFIGURE_VOICEMAIL);
- context.startActivity(intent);
+ context.startActivity(
+ VoicemailComponent.get(context)
+ .getVoicemailClient()
+ .getSetPinIntent(context, phoneAccountHandle));
}
});
}
@@ -187,21 +191,20 @@ public class VoicemailErrorMessage {
@NonNull
public static Action createTurnArchiveOnAction(
final Context context,
+ int impressionToLog,
final VoicemailStatus status,
VoicemailClient voicemailClient,
- PhoneAccountHandle phoneAccountHandle,
- String preference) {
+ PhoneAccountHandle phoneAccountHandle) {
return new Action(
context.getString(R.string.voicemail_action_turn_archive_on),
new OnClickListener() {
@Override
public void onClick(View v) {
- OmtpVoicemailMessageCreator.logArchiveImpression(
- context,
- preference,
- DialerImpression.Type.VVM_USER_ENABLED_ARCHIVE_FROM_VM_FULL_PROMO,
- DialerImpression.Type.VVM_USER_ENABLED_ARCHIVE_FROM_VM_ALMOST_FULL_PROMO);
-
+ Assert.checkArgument(
+ VoicemailComponent.get(context)
+ .getVoicemailClient()
+ .isVoicemailArchiveAvailable(context));
+ Logger.get(context).logImpression(impressionToLog);
voicemailClient.setVoicemailArchiveEnabled(context, phoneAccountHandle, true);
Intent intent = new Intent(VoicemailContract.ACTION_SYNC_VOICEMAIL);
intent.setPackage(status.sourcePackage);
@@ -213,6 +216,7 @@ public class VoicemailErrorMessage {
@NonNull
public static Action createDismissTurnArchiveOnAction(
final Context context,
+ int impressionToLog,
VoicemailStatusReader statusReader,
PerAccountSharedPreferences sharedPreferenceForAccount,
String preferenceKeyToUpdate) {
@@ -221,11 +225,11 @@ public class VoicemailErrorMessage {
new OnClickListener() {
@Override
public void onClick(View v) {
- OmtpVoicemailMessageCreator.logArchiveImpression(
- context,
- preferenceKeyToUpdate,
- DialerImpression.Type.VVM_USER_DISMISSED_VM_FULL_PROMO,
- DialerImpression.Type.VVM_USER_DISMISSED_VM_ALMOST_FULL_PROMO);
+ Assert.checkArgument(
+ VoicemailComponent.get(context)
+ .getVoicemailClient()
+ .isVoicemailArchiveAvailable(context));
+ Logger.get(context).logImpression(impressionToLog);
sharedPreferenceForAccount.edit().putBoolean(preferenceKeyToUpdate, true).apply();
statusReader.refresh();
}
diff --git a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
index 8b10ff4a8..d98ac2cd5 100644
--- a/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
+++ b/java/com/android/dialer/app/voicemail/error/Vvm3VoicemailMessageCreator.java
@@ -264,7 +264,7 @@ public class Vvm3VoicemailMessageCreator {
return new VoicemailErrorMessage(
context.getString(R.string.voicemail_error_pin_not_set_title),
getCustomerSupportString(context, R.string.voicemail_error_pin_not_set_message),
- VoicemailErrorMessage.createSetPinAction(context));
+ VoicemailErrorMessage.createSetPinAction(context, status.getPhoneAccountHandle()));
}
return OmtpVoicemailMessageCreator.create(context, status, statusReader);
diff --git a/java/com/android/dialer/app/voicemail/error/res/values-de/strings.xml b/java/com/android/dialer/app/voicemail/error/res/values-de/strings.xml
index 09283d3d6..8939e687e 100644
--- a/java/com/android/dialer/app/voicemail/error/res/values-de/strings.xml
+++ b/java/com/android/dialer/app/voicemail/error/res/values-de/strings.xml
@@ -24,8 +24,8 @@
<string name="voicemail_error_not_activate_no_signal_message" msgid="4511975927252363280">"Vergewissere dich, dass dein Smartphone eine Mobilfunkverbindung hat und versuche es noch einmal."</string>
<string name="voicemail_error_not_activate_no_signal_airplane_mode_message" msgid="2005255281543281215">"Schalte den Flugmodus aus und versuche es noch einmal."</string>
<string name="voicemail_error_no_signal_title" msgid="341954685733680219">"Keine Verbindung"</string>
- <string name="voicemail_error_no_signal_message" msgid="8557509373166292640">"Du wirst nicht über neue Mailbox-Nachrichten informiert. Wenn du eine WLAN-Verbindung hast, kannst du deine Mailbox abrufen, indem du dein Smartphone jetzt synchronisierst."</string>
- <string name="voicemail_error_no_signal_airplane_mode_message" msgid="8553646558282754276">"Du wirst nicht über neue Mailbox-Nachrichten informiert. Schalte den Flugmodus aus, um deine Mailbox zu synchronisieren."</string>
+ <string name="voicemail_error_no_signal_message" msgid="8557509373166292640">"Du wirst nicht über neue Mailboxnachrichten informiert. Wenn du eine WLAN-Verbindung hast, kannst du deine Mailbox abrufen, indem du dein Smartphone jetzt synchronisierst."</string>
+ <string name="voicemail_error_no_signal_airplane_mode_message" msgid="8553646558282754276">"Du wirst nicht über neue Mailboxnachrichten informiert. Schalte den Flugmodus aus, um deine Mailbox zu synchronisieren."</string>
<string name="voicemail_error_no_signal_cellular_required_message" msgid="8461294934887808098">"Dein Smartphone benötigt eine mobile Datenverbindung, um die Mailbox abzurufen."</string>
<string name="voicemail_error_activation_failed_title" msgid="3823477898681399391">"Visuelle Mailbox kann nicht aktiviert werden"</string>
<string name="voicemail_error_activation_failed_message" msgid="2188301459207765442">"Du kannst deine Mailbox immer noch per Anruf abhören."</string>
@@ -42,12 +42,12 @@
<string name="voicemail_error_server_message" msgid="3538157415413084592">"Du kannst deine Mailbox immer noch per Anruf abhören."</string>
<string name="voicemail_error_inbox_near_full_title" msgid="7568681773644454672">"Mailbox fast voll"</string>
<string name="voicemail_error_inbox_near_full_message" msgid="354118612203528244">"Wenn deine Mailbox voll ist, kannst du keine neuen Sprachnachrichten empfangen."</string>
- <string name="voicemail_error_inbox_full_title" msgid="249268068442046872">"Es können keine neuen Mailbox-Nachrichten empfangen werden"</string>
+ <string name="voicemail_error_inbox_full_title" msgid="249268068442046872">"Es können keine neuen Mailboxnachrichten empfangen werden"</string>
<string name="voicemail_error_inbox_full_message" msgid="5788411018158899123">"Deine Mailbox ist voll. Lösche einige Nachrichten, um neue empfangen zu können."</string>
<string name="voicemail_error_inbox_full_turn_archive_on_title" msgid="3083779676549536189">"[Testfunktion] Zusätzlichen Speicher und Sicherung aktivieren"</string>
- <string name="voicemail_error_inbox_full_turn_archive_on_message" msgid="4236256841748725792">"Dein Postfach ist voll. Aktivere zusätzlichen Speicher, um Speicherplatz freizugeben. So kann Google deine Mailbox-Nachrichten verwalten und sichern. "<b><i>"Diese Funktion wird gerade getestet."</i></b>" Hiermit werden möglicherweise Mailbox-Nachrichten von deinem Mailbox-Server gelöscht und es wird nicht garantiert, dass diese Funktion auch in Zukunft unterstützt wird. Wir würden uns aber sehr über Feedback dazu freuen."</string>
+ <string name="voicemail_error_inbox_full_turn_archive_on_message" msgid="4236256841748725792">"Dein Postfach ist voll. Aktivere zusätzlichen Speicher, um Speicherplatz freizugeben. So kann Google deine Mailboxnachrichten verwalten und sichern. "<b><i>"Diese Funktion wird gerade getestet."</i></b>" Hiermit werden möglicherweise Mailboxnachrichten von deinem Mailbox-Server gelöscht und es wird nicht garantiert, dass diese Funktion auch in Zukunft unterstützt wird. Wir würden uns aber sehr über Feedback dazu freuen."</string>
<string name="voicemail_error_inbox_almost_full_turn_archive_on_title" msgid="6118464905488477869">"[Testfunktion] Zusätzlichen Speicher und Sicherung aktivieren"</string>
- <string name="voicemail_error_inbox_almost_full_turn_archive_on_message" msgid="7289015622668426730">"Dein Postfach ist voll. Aktivere zusätzlichen Speicher, um Speicherplatz freizugeben. So kann Google deine Mailbox-Nachrichten verwalten und sichern. "<b><i>"Diese Funktion wird gerade getestet."</i></b>" Hiermit werden möglicherweise Mailbox-Nachrichten von deinem Mailbox-Server gelöscht und es wird nicht garantiert, dass diese Funktion auch in Zukunft unterstützt wird. Wir würden uns aber sehr über Feedback dazu freuen."</string>
+ <string name="voicemail_error_inbox_almost_full_turn_archive_on_message" msgid="7289015622668426730">"Dein Postfach ist voll. Aktivere zusätzlichen Speicher, um Speicherplatz freizugeben. So kann Google deine Mailboxnachrichten verwalten und sichern. "<b><i>"Diese Funktion wird gerade getestet."</i></b>" Hiermit werden möglicherweise Mailboxnachrichten von deinem Mailbox-Server gelöscht und es wird nicht garantiert, dass diese Funktion auch in Zukunft unterstützt wird. Wir würden uns aber sehr über Feedback dazu freuen."</string>
<string name="voicemail_error_pin_not_set_title" msgid="1287168514277948082">"Mailbox-PIN festlegen"</string>
<string name="voicemail_error_pin_not_set_message" msgid="3802375002103184625">"Bei jedem Anruf auf deiner Mailbox benötigst du eine Mailbox-PIN."</string>
<string name="voicemail_error_unknown_title" msgid="7214482611706360680">"Unbekannter Fehler"</string>
@@ -105,6 +105,6 @@
<string name="verizon_terms_and_conditions_message" msgid="271780225159084419">"Du muss den Nutzungsbedingungen von Verizon Wireless zustimmen, um die visuelle Mailbox zu verwenden:\n\n%s"</string>
<string name="verizon_terms_and_conditions_decline_dialog_message" msgid="7852059293806766767">"Die visuelle Mailbox wird deaktiviert, wenn du die Nutzungsbedingungen ablehnst."</string>
<string name="verizon_terms_and_conditions_decline_dialog_downgrade" msgid="8347128304508008823">"Visuelle Mailbox deaktivieren"</string>
- <string name="verizon_terms_and_conditions_decline_set_pin_dialog_message" msgid="2200388197966526000">"Du kannst nur auf Mailbox-Nachrichten zugreifen, indem du *86 anrufst. Lege eine neue Mailbox-PIN fest, um fortzufahren."</string>
+ <string name="verizon_terms_and_conditions_decline_set_pin_dialog_message" msgid="2200388197966526000">"Du kannst nur auf Mailboxnachrichten zugreifen, indem du *86 anrufst. Lege eine neue Mailbox-PIN fest, um fortzufahren."</string>
<string name="verizon_terms_and_conditions_decline_set_pin_dialog_set_pin" msgid="4320664492466296770">"PIN festlegen"</string>
</resources>
diff --git a/java/com/android/dialer/backup/DialerBackupAgent.java b/java/com/android/dialer/backup/DialerBackupAgent.java
index 2f8684aa2..0841e82e7 100644
--- a/java/com/android/dialer/backup/DialerBackupAgent.java
+++ b/java/com/android/dialer/backup/DialerBackupAgent.java
@@ -100,8 +100,7 @@ public class DialerBackupAgent extends BackupAgent {
LogUtil.i("DialerBackupAgent.onFullBackup", "performing dialer backup");
boolean autoBackupEnabled =
ConfigProviderBindings.get(this).getBoolean("enable_autobackup", true);
- boolean vmBackupEnabled =
- ConfigProviderBindings.get(this).getBoolean("enable_vm_backup", false);
+ boolean vmBackupEnabled = ConfigProviderBindings.get(this).getBoolean("enable_vm_backup", true);
List<PhoneAccountHandle> phoneAccountsToArchive =
DialerBackupUtils.getPhoneAccountsToArchive(this);
diff --git a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
index 54fedc2be..3a2f3cf9a 100644
--- a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
+++ b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
@@ -19,6 +19,7 @@ package com.android.dialer.binary.aosp;
import com.android.dialer.binary.basecomponent.BaseDialerRootComponent;
import com.android.dialer.enrichedcall.stub.StubEnrichedCallModule;
import com.android.dialer.inject.ContextModule;
+import com.android.dialer.lightbringer.stub.StubLightbringerModule;
import com.android.dialer.simulator.impl.SimulatorModule;
import com.android.incallui.calllocation.stub.StubCallLocationModule;
import com.android.incallui.maps.stub.StubMapsModule;
@@ -35,7 +36,8 @@ import javax.inject.Singleton;
StubCallLocationModule.class,
StubEnrichedCallModule.class,
StubMapsModule.class,
- VoicemailModule.class
+ VoicemailModule.class,
+ StubLightbringerModule.class
}
)
public interface AospDialerRootComponent extends BaseDialerRootComponent {}
diff --git a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
index 907671b01..e8962c248 100644
--- a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
+++ b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
@@ -17,6 +17,7 @@
package com.android.dialer.binary.basecomponent;
import com.android.dialer.enrichedcall.EnrichedCallComponent;
+import com.android.dialer.lightbringer.LightbringerComponent;
import com.android.dialer.simulator.SimulatorComponent;
import com.android.incallui.calllocation.CallLocationComponent;
import com.android.incallui.maps.MapsComponent;
@@ -31,4 +32,5 @@ public interface BaseDialerRootComponent
EnrichedCallComponent.HasComponent,
MapsComponent.HasComponent,
SimulatorComponent.HasComponent,
- VoicemailComponent.HasComponent {}
+ VoicemailComponent.HasComponent,
+ LightbringerComponent.HasComponent {}
diff --git a/java/com/android/dialer/binary/common/DialerApplication.java b/java/com/android/dialer/binary/common/DialerApplication.java
index cc7befc90..352c4eba9 100644
--- a/java/com/android/dialer/binary/common/DialerApplication.java
+++ b/java/com/android/dialer/binary/common/DialerApplication.java
@@ -17,12 +17,15 @@
package com.android.dialer.binary.common;
import android.app.Application;
+import android.os.StrictMode;
import android.os.Trace;
-import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import com.android.dialer.blocking.BlockedNumbersAutoMigrator;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.buildtype.BuildType;
+import com.android.dialer.common.concurrent.DefaultDialerExecutorFactory;
import com.android.dialer.inject.HasRootComponent;
+import com.android.dialer.persistentlog.PersistentLogger;
/** A common application subclass for all Dialer build variants. */
public abstract class DialerApplication extends Application implements HasRootComponent {
@@ -32,15 +35,25 @@ public abstract class DialerApplication extends Application implements HasRootCo
@Override
public void onCreate() {
Trace.beginSection("DialerApplication.onCreate");
+ if (BuildType.get() == BuildType.BUGFOOD) {
+ enableStrictMode();
+ }
super.onCreate();
new BlockedNumbersAutoMigrator(
- this,
- PreferenceManager.getDefaultSharedPreferences(this),
- new FilteredNumberAsyncQueryHandler(this))
- .autoMigrate();
+ this.getApplicationContext(),
+ new FilteredNumberAsyncQueryHandler(this),
+ new DefaultDialerExecutorFactory())
+ .asyncAutoMigrate();
+ PersistentLogger.initialize(this);
Trace.endSection();
}
+ private void enableStrictMode() {
+ StrictMode.setThreadPolicy(
+ new StrictMode.ThreadPolicy.Builder().detectAll().penaltyDeath().build());
+ StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyDeath().build());
+ }
+
/**
* Returns a new instance of the root component for the application. Sub classes should define a
* root component that extends all the sub components "HasComponent" intefaces. The component
diff --git a/java/com/android/dialer/blocking/BlockedNumbersAutoMigrator.java b/java/com/android/dialer/blocking/BlockedNumbersAutoMigrator.java
index 1773e9b84..3cc42207d 100644
--- a/java/com/android/dialer/blocking/BlockedNumbersAutoMigrator.java
+++ b/java/com/android/dialer/blocking/BlockedNumbersAutoMigrator.java
@@ -18,10 +18,14 @@ package com.android.dialer.blocking;
import android.content.Context;
import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
+import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
-import java.util.Objects;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+import com.android.dialer.common.concurrent.DialerExecutorFactory;
/**
* Class responsible for checking if the user can be auto-migrated to {@link
@@ -32,36 +36,42 @@ public class BlockedNumbersAutoMigrator {
static final String HAS_CHECKED_AUTO_MIGRATE_KEY = "checkedAutoMigrate";
- @NonNull private final Context context;
- @NonNull private final SharedPreferences sharedPreferences;
+ @NonNull private final Context appContext;
@NonNull private final FilteredNumberAsyncQueryHandler queryHandler;
+ @NonNull private final DialerExecutorFactory dialerExecutorFactory;
/**
- * Constructs the BlockedNumbersAutoMigrator with the given {@link SharedPreferences} and {@link
+ * Constructs the BlockedNumbersAutoMigrator with the given {@link
* FilteredNumberAsyncQueryHandler}.
*
- * @param sharedPreferences The SharedPreferences used to persist information.
* @param queryHandler The FilteredNumberAsyncQueryHandler used to determine if there are blocked
* numbers.
* @throws NullPointerException if sharedPreferences or queryHandler are null.
*/
public BlockedNumbersAutoMigrator(
- @NonNull Context context,
- @NonNull SharedPreferences sharedPreferences,
- @NonNull FilteredNumberAsyncQueryHandler queryHandler) {
- this.context = Objects.requireNonNull(context);
- this.sharedPreferences = Objects.requireNonNull(sharedPreferences);
- this.queryHandler = Objects.requireNonNull(queryHandler);
+ @NonNull Context appContext,
+ @NonNull FilteredNumberAsyncQueryHandler queryHandler,
+ @NonNull DialerExecutorFactory dialerExecutorFactory) {
+ this.appContext = Assert.isNotNull(appContext);
+ this.queryHandler = Assert.isNotNull(queryHandler);
+ this.dialerExecutorFactory = Assert.isNotNull(dialerExecutorFactory);
+ }
+
+ public void asyncAutoMigrate() {
+ dialerExecutorFactory
+ .createNonUiTaskBuilder(new ShouldAttemptAutoMigrate(appContext))
+ .onSuccess(this::autoMigrate)
+ .build()
+ .executeParallel(null);
}
/**
* Attempts to perform the auto-migration. Auto-migration will only be attempted once and can be
* performed only when the user has no blocked numbers. As a result of this method, the user will
- * be migrated to the framework blocking solution, as determined by {@link
- * FilteredNumberCompat#hasMigratedToNewBlocking()}.
+ * be migrated to the framework blocking solution if blocked numbers don't exist.
*/
- public void autoMigrate() {
- if (!shouldAttemptAutoMigrate()) {
+ private void autoMigrate(boolean shouldAttemptAutoMigrate) {
+ if (!shouldAttemptAutoMigrate) {
return;
}
@@ -75,36 +85,51 @@ public class BlockedNumbersAutoMigrator {
return;
}
LogUtil.i("BlockedNumbersAutoMigrator", "auto-migrating: no blocked numbers.");
- FilteredNumberCompat.setHasMigratedToNewBlocking(context, true);
+ FilteredNumberCompat.setHasMigratedToNewBlocking(appContext, true);
}
});
}
- private boolean shouldAttemptAutoMigrate() {
- if (sharedPreferences.contains(HAS_CHECKED_AUTO_MIGRATE_KEY)) {
- LogUtil.v("BlockedNumbersAutoMigrator", "not attempting auto-migrate: already checked once.");
- return false;
+ private static class ShouldAttemptAutoMigrate implements Worker<Void, Boolean> {
+ private final Context appContext;
+
+ ShouldAttemptAutoMigrate(Context appContext) {
+ this.appContext = appContext;
}
- if (!FilteredNumberCompat.canAttemptBlockOperations(context)) {
- // This may be the case where the user is on the lock screen, so we shouldn't record that the
- // migration status was checked.
+ @Nullable
+ @Override
+ public Boolean doInBackground(@Nullable Void input) {
+ SharedPreferences sharedPreferences =
+ PreferenceManager.getDefaultSharedPreferences(appContext);
+
+ if (sharedPreferences.contains(HAS_CHECKED_AUTO_MIGRATE_KEY)) {
+ LogUtil.v(
+ "BlockedNumbersAutoMigrator", "not attempting auto-migrate: already checked once.");
+ return false;
+ }
+
+ if (!FilteredNumberCompat.canAttemptBlockOperations(appContext)) {
+ // This may be the case where the user is on the lock screen, so we shouldn't record that
+ // the migration status was checked.
+ LogUtil.i(
+ "BlockedNumbersAutoMigrator", "not attempting auto-migrate: current user can't block");
+ return false;
+ }
LogUtil.i(
- "BlockedNumbersAutoMigrator", "not attempting auto-migrate: current user can't block");
- return false;
- }
- LogUtil.i("BlockedNumbersAutoMigrator", "updating state as already checked for auto-migrate.");
- sharedPreferences.edit().putBoolean(HAS_CHECKED_AUTO_MIGRATE_KEY, true).apply();
+ "BlockedNumbersAutoMigrator", "updating state as already checked for auto-migrate.");
+ sharedPreferences.edit().putBoolean(HAS_CHECKED_AUTO_MIGRATE_KEY, true).apply();
- if (!FilteredNumberCompat.canUseNewFiltering()) {
- LogUtil.i("BlockedNumbersAutoMigrator", "not attempting auto-migrate: not available.");
- return false;
- }
+ if (!FilteredNumberCompat.canUseNewFiltering()) {
+ LogUtil.i("BlockedNumbersAutoMigrator", "not attempting auto-migrate: not available.");
+ return false;
+ }
- if (FilteredNumberCompat.hasMigratedToNewBlocking(context)) {
- LogUtil.i("BlockedNumbersAutoMigrator", "not attempting auto-migrate: already migrated.");
- return false;
+ if (FilteredNumberCompat.hasMigratedToNewBlocking(appContext)) {
+ LogUtil.i("BlockedNumbersAutoMigrator", "not attempting auto-migrate: already migrated.");
+ return false;
+ }
+ return true;
}
- return true;
}
}
diff --git a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
index 852e7a0ed..bd4156846 100644
--- a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
+++ b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
@@ -56,8 +56,14 @@ public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler {
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
- if (cookie != null) {
- ((Listener) cookie).onQueryComplete(token, cookie, cursor);
+ try {
+ if (cookie != null) {
+ ((Listener) cookie).onQueryComplete(token, cookie, cursor);
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
}
@@ -82,7 +88,7 @@ public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler {
}
}
- public void hasBlockedNumbers(final OnHasBlockedNumbersListener listener) {
+ void hasBlockedNumbers(final OnHasBlockedNumbersListener listener) {
if (!FilteredNumberCompat.canAttemptBlockOperations(context)) {
listener.onHasBlockedNumbers(false);
return;
@@ -405,7 +411,7 @@ public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler {
void onUnblockComplete(int rows, ContentValues values);
}
- public interface OnHasBlockedNumbersListener {
+ interface OnHasBlockedNumbersListener {
/**
* @param hasBlockedNumbers {@code true} if any blocked numbers are stored. {@code false}
diff --git a/java/com/android/dialer/blocking/FilteredNumbersUtil.java b/java/com/android/dialer/blocking/FilteredNumbersUtil.java
index f09370e6e..8908238ea 100644
--- a/java/com/android/dialer/blocking/FilteredNumbersUtil.java
+++ b/java/com/android/dialer/blocking/FilteredNumbersUtil.java
@@ -285,7 +285,7 @@ public class FilteredNumbersUtil {
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder =
new Notification.Builder(context)
- .setSmallIcon(R.drawable.ic_block_24dp)
+ .setSmallIcon(R.drawable.quantum_ic_block_white_24)
.setContentTitle(
context.getString(R.string.call_blocking_disabled_notification_title))
.setContentText(
diff --git a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png
deleted file mode 100644
index 2ccc89d24..000000000
--- a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png
deleted file mode 100644
index dc0c995c1..000000000
--- a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png b/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png
deleted file mode 100644
index 919a872e0..000000000
--- a/java/com/android/dialer/blocking/res/drawable-hdpi/ic_report_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-mdpi/ic_block_24dp.png b/java/com/android/dialer/blocking/res/drawable-mdpi/ic_block_24dp.png
deleted file mode 100644
index ec1b33f0e..000000000
--- a/java/com/android/dialer/blocking/res/drawable-mdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-mdpi/ic_report_24dp.png b/java/com/android/dialer/blocking/res/drawable-mdpi/ic_report_24dp.png
deleted file mode 100644
index 70b82d6c1..000000000
--- a/java/com/android/dialer/blocking/res/drawable-mdpi/ic_report_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-mdpi/ic_report_white_36dp.png b/java/com/android/dialer/blocking/res/drawable-mdpi/ic_report_white_36dp.png
deleted file mode 100644
index dc0c995c1..000000000
--- a/java/com/android/dialer/blocking/res/drawable-mdpi/ic_report_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-xhdpi/ic_block_24dp.png b/java/com/android/dialer/blocking/res/drawable-xhdpi/ic_block_24dp.png
deleted file mode 100644
index 7aba97b65..000000000
--- a/java/com/android/dialer/blocking/res/drawable-xhdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-xhdpi/ic_report_24dp.png b/java/com/android/dialer/blocking/res/drawable-xhdpi/ic_report_24dp.png
deleted file mode 100644
index 18e7764ab..000000000
--- a/java/com/android/dialer/blocking/res/drawable-xhdpi/ic_report_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-xhdpi/ic_report_white_36dp.png b/java/com/android/dialer/blocking/res/drawable-xhdpi/ic_report_white_36dp.png
deleted file mode 100644
index aed766804..000000000
--- a/java/com/android/dialer/blocking/res/drawable-xhdpi/ic_report_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_block_24dp.png b/java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_block_24dp.png
deleted file mode 100644
index fddfa54b8..000000000
--- a/java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_report_24dp.png b/java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_report_24dp.png
deleted file mode 100644
index aed766804..000000000
--- a/java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_report_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_report_white_36dp.png b/java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_report_white_36dp.png
deleted file mode 100644
index f7cfacbd4..000000000
--- a/java/com/android/dialer/blocking/res/drawable-xxhdpi/ic_report_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_block_24dp.png b/java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_block_24dp.png
deleted file mode 100644
index 0378d1bed..000000000
--- a/java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_report_24dp.png b/java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_report_24dp.png
deleted file mode 100644
index 855e59015..000000000
--- a/java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_report_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_report_white_36dp.png b/java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_report_white_36dp.png
deleted file mode 100644
index 7ef0d7afc..000000000
--- a/java/com/android/dialer/blocking/res/drawable-xxxhdpi/ic_report_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/blocking/res/drawable/blocked_contact.xml b/java/com/android/dialer/blocking/res/drawable/blocked_contact.xml
index 09d7989e8..905616d4a 100644
--- a/java/com/android/dialer/blocking/res/drawable/blocked_contact.xml
+++ b/java/com/android/dialer/blocking/res/drawable/blocked_contact.xml
@@ -28,7 +28,7 @@
</item>
<item
- android:drawable="@drawable/ic_report_24dp"
+ android:drawable="@drawable/quantum_ic_report_white_24"
android:gravity="center"
android:height="18dp"
android:width="18dp"/>
diff --git a/java/com/android/dialer/blocking/res/values-de/strings.xml b/java/com/android/dialer/blocking/res/values-de/strings.xml
index f1677e91f..37507ebbe 100644
--- a/java/com/android/dialer/blocking/res/values-de/strings.xml
+++ b/java/com/android/dialer/blocking/res/values-de/strings.xml
@@ -21,8 +21,8 @@
<string name="migrate_blocked_numbers_dialog_message" msgid="8309736147266462485">"Um dich besser schützen zu können, müssen die Einstellungen der Blockierung beim Telefon geändert werden. Von blockierten Nummern erhältst du jetzt keine Anrufe und Nachrichten mehr und diese Nummern können auch an andere Apps weitergegeben werden."</string>
<string name="migrate_blocked_numbers_dialog_allow_button" msgid="5192836471557751367">"Zulassen"</string>
<string name="block_number_confirmation_title" msgid="2699521227461376076">"<xliff:g id="NUMBER">%1$s</xliff:g> blockieren?"</string>
- <string name="block_number_confirmation_message_vvm" msgid="6501105244172290939">"Anrufe von dieser Nummer werden blockiert und Mailbox-Nachrichten automatisch gelöscht."</string>
- <string name="block_number_confirmation_message_no_vvm" msgid="8236641245709649882">"Anrufe von dieser Nummer werden blockiert. Der Anrufer hat aber unter Umständen weiterhin die Möglichkeit, dir Mailbox-Nachrichten zu hinterlassen."</string>
+ <string name="block_number_confirmation_message_vvm" msgid="6501105244172290939">"Anrufe von dieser Nummer werden blockiert und Mailboxnachrichten automatisch gelöscht."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="8236641245709649882">"Anrufe von dieser Nummer werden blockiert. Der Anrufer hat aber unter Umständen weiterhin die Möglichkeit, dir Mailboxnachrichten zu hinterlassen."</string>
<string name="block_number_confirmation_message_new_filtering" msgid="8487449683723062644">"Du erhältst von dieser Nummer keine Anrufe oder Nachrichten mehr."</string>
<string name="block_number_ok" msgid="739786082788038932">"BLOCKIEREN"</string>
<string name="unblock_number_confirmation_title" msgid="7897778825085659941">"Blockierung von <xliff:g id="NUMBER">%1$s</xliff:g> aufheben?"</string>
diff --git a/java/com/android/dialer/callcomposer/CallComposerActivity.java b/java/com/android/dialer/callcomposer/CallComposerActivity.java
index 9fb6c38f4..3c0beb101 100644
--- a/java/com/android/dialer/callcomposer/CallComposerActivity.java
+++ b/java/com/android/dialer/callcomposer/CallComposerActivity.java
@@ -41,13 +41,13 @@ import android.view.View.OnClickListener;
import android.view.View.OnLayoutChangeListener;
import android.view.ViewAnimationUtils;
import android.view.ViewGroup;
+import android.view.WindowManager.LayoutParams;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.QuickContactBadge;
import android.widget.RelativeLayout;
import android.widget.TextView;
-import android.widget.Toolbar;
import com.android.contacts.common.ContactPhotoManager;
import com.android.dialer.callcomposer.CallComposerFragment.CallComposerListener;
import com.android.dialer.callcomposer.nano.CallComposerContact;
@@ -70,6 +70,7 @@ import com.android.dialer.multimedia.MultimediaData;
import com.android.dialer.protos.ProtoParsers;
import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.util.ViewUtil;
+import com.android.dialer.widget.DialerToolbar;
import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
import java.io.File;
@@ -110,7 +111,7 @@ public class CallComposerActivity extends AppCompatActivity
private TextView numberView;
private QuickContactBadge contactPhoto;
private RelativeLayout contactContainer;
- private Toolbar toolbar;
+ private DialerToolbar toolbar;
private View sendAndCall;
private TextView sendAndCallText;
@@ -151,7 +152,7 @@ public class CallComposerActivity extends AppCompatActivity
pager = (ViewPager) findViewById(R.id.call_composer_view_pager);
background = (FrameLayout) findViewById(R.id.background);
windowContainer = (LinearLayout) findViewById(R.id.call_composer_container);
- toolbar = (Toolbar) findViewById(R.id.toolbar);
+ toolbar = (DialerToolbar) findViewById(R.id.toolbar);
sendAndCall = findViewById(R.id.send_and_call_button);
sendAndCallText = (TextView) findViewById(R.id.send_and_call_text);
@@ -163,10 +164,6 @@ public class CallComposerActivity extends AppCompatActivity
pager.setAdapter(adapter);
pager.addOnPageChangeListener(this);
- setActionBar(toolbar);
- toolbar.setNavigationIcon(R.drawable.quantum_ic_close_white_24);
- toolbar.setNavigationOnClickListener(v -> finish());
-
background.addOnLayoutChangeListener(this);
cameraIcon.setOnClickListener(this);
galleryIcon.setOnClickListener(this);
@@ -183,6 +180,11 @@ public class CallComposerActivity extends AppCompatActivity
onPageSelected(currentIndex);
}
+ int adjustMode =
+ isLandscapeLayout()
+ ? LayoutParams.SOFT_INPUT_ADJUST_PAN
+ : LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
+ getWindow().setSoftInputMode(adjustMode);
// Since we can't animate the views until they are ready to be drawn, we use this listener to
// track that and animate the call compose UI as soon as it's ready.
ViewUtil.doOnPreDraw(
@@ -262,79 +264,83 @@ public class CallComposerActivity extends AppCompatActivity
} else if (view == messageIcon) {
pager.setCurrentItem(CallComposerPagerAdapter.INDEX_MESSAGE, true /* animate */);
} else if (view == sendAndCall) {
- if (!sessionReady()) {
- LogUtil.i(
- "CallComposerActivity.onClick", "sendAndCall pressed, but the session isn't ready");
- Logger.get(this)
- .logImpression(
- DialerImpression.Type
- .CALL_COMPOSER_ACTIVITY_SEND_AND_CALL_PRESSED_WHEN_SESSION_NOT_READY);
- return;
- }
- sendAndCall.setEnabled(false);
- CallComposerFragment fragment =
- (CallComposerFragment) adapter.instantiateItem(pager, currentIndex);
- MultimediaData.Builder builder = MultimediaData.builder();
-
- if (fragment instanceof MessageComposerFragment) {
- MessageComposerFragment messageComposerFragment = (MessageComposerFragment) fragment;
- builder.setText(messageComposerFragment.getMessage());
- placeRCSCall(builder);
- }
- if (fragment instanceof GalleryComposerFragment) {
- GalleryComposerFragment galleryComposerFragment = (GalleryComposerFragment) fragment;
- // If the current data is not a copy, make one.
- if (!galleryComposerFragment.selectedDataIsCopy()) {
- new CopyAndResizeImageTask(
- CallComposerActivity.this,
- galleryComposerFragment.getGalleryData().getFileUri(),
- new Callback() {
- @Override
- public void onCopySuccessful(File file, String mimeType) {
- Uri shareableUri =
- FileProvider.getUriForFile(
- CallComposerActivity.this,
- Constants.get().getFileProviderAuthority(),
- file);
-
- builder.setImage(grantUriPermission(shareableUri), mimeType);
- placeRCSCall(builder);
- }
-
- @Override
- public void onCopyFailed(Throwable throwable) {
- // TODO(b/34279096) - gracefully handle message failure
- LogUtil.e("CallComposerActivity.onCopyFailed", "copy Failed", throwable);
- }
- })
- .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- } else {
- Uri shareableUri =
- FileProvider.getUriForFile(
- this,
- Constants.get().getFileProviderAuthority(),
- new File(galleryComposerFragment.getGalleryData().getFilePath()));
-
- builder.setImage(
- grantUriPermission(shareableUri),
- galleryComposerFragment.getGalleryData().getMimeType());
-
- placeRCSCall(builder);
- }
- }
- if (fragment instanceof CameraComposerFragment) {
- CameraComposerFragment cameraComposerFragment = (CameraComposerFragment) fragment;
- cameraComposerFragment.getCameraUriWhenReady(
- uri -> {
- builder.setImage(grantUriPermission(uri), cameraComposerFragment.getMimeType());
- placeRCSCall(builder);
- });
- }
+ sendAndCall();
} else {
Assert.fail();
}
}
+ @Override
+ public void sendAndCall() {
+ if (!sessionReady()) {
+ LogUtil.i("CallComposerActivity.onClick", "sendAndCall pressed, but the session isn't ready");
+ Logger.get(this)
+ .logImpression(
+ DialerImpression.Type
+ .CALL_COMPOSER_ACTIVITY_SEND_AND_CALL_PRESSED_WHEN_SESSION_NOT_READY);
+ return;
+ }
+ sendAndCall.setEnabled(false);
+ CallComposerFragment fragment =
+ (CallComposerFragment) adapter.instantiateItem(pager, currentIndex);
+ MultimediaData.Builder builder = MultimediaData.builder();
+
+ if (fragment instanceof MessageComposerFragment) {
+ MessageComposerFragment messageComposerFragment = (MessageComposerFragment) fragment;
+ builder.setText(messageComposerFragment.getMessage());
+ placeRCSCall(builder);
+ }
+ if (fragment instanceof GalleryComposerFragment) {
+ GalleryComposerFragment galleryComposerFragment = (GalleryComposerFragment) fragment;
+ // If the current data is not a copy, make one.
+ if (!galleryComposerFragment.selectedDataIsCopy()) {
+ new CopyAndResizeImageTask(
+ CallComposerActivity.this,
+ galleryComposerFragment.getGalleryData().getFileUri(),
+ new Callback() {
+ @Override
+ public void onCopySuccessful(File file, String mimeType) {
+ Uri shareableUri =
+ FileProvider.getUriForFile(
+ CallComposerActivity.this,
+ Constants.get().getFileProviderAuthority(),
+ file);
+
+ builder.setImage(grantUriPermission(shareableUri), mimeType);
+ placeRCSCall(builder);
+ }
+
+ @Override
+ public void onCopyFailed(Throwable throwable) {
+ // TODO(b/34279096) - gracefully handle message failure
+ LogUtil.e("CallComposerActivity.onCopyFailed", "copy Failed", throwable);
+ }
+ })
+ .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ } else {
+ Uri shareableUri =
+ FileProvider.getUriForFile(
+ this,
+ Constants.get().getFileProviderAuthority(),
+ new File(galleryComposerFragment.getGalleryData().getFilePath()));
+
+ builder.setImage(
+ grantUriPermission(shareableUri),
+ galleryComposerFragment.getGalleryData().getMimeType());
+
+ placeRCSCall(builder);
+ }
+ }
+ if (fragment instanceof CameraComposerFragment) {
+ CameraComposerFragment cameraComposerFragment = (CameraComposerFragment) fragment;
+ cameraComposerFragment.getCameraUriWhenReady(
+ uri -> {
+ builder.setImage(grantUriPermission(uri), cameraComposerFragment.getMimeType());
+ placeRCSCall(builder);
+ });
+ }
+ }
+
private boolean sessionReady() {
Session session = getEnrichedCallManager().getSession(sessionId);
if (session == null) {
@@ -482,7 +488,7 @@ public class CallComposerActivity extends AppCompatActivity
contact.contactType);
nameView.setText(contact.nameOrNumber);
- getActionBar().setTitle(contact.nameOrNumber);
+ toolbar.setTitle(contact.nameOrNumber);
if (!TextUtils.isEmpty(contact.numberLabel) && !TextUtils.isEmpty(contact.displayNumber)) {
numberView.setVisibility(View.VISIBLE);
String secondaryInfo =
@@ -577,11 +583,11 @@ public class CallComposerActivity extends AppCompatActivity
inFullscreenMode = fullscreen;
ViewGroup.LayoutParams layoutParams = pager.getLayoutParams();
if (isLandscapeLayout()) {
- layoutParams.height = background.getHeight() - messageIcon.getHeight();
+ layoutParams.height = background.getHeight();
toolbar.setVisibility(View.INVISIBLE);
contactContainer.setVisibility(View.GONE);
} else if (fullscreen || getResources().getBoolean(R.bool.show_toolbar)) {
- layoutParams.height = background.getHeight() - toolbar.getHeight() - messageIcon.getHeight();
+ layoutParams.height = background.getHeight() - toolbar.getHeight();
toolbar.setVisibility(View.VISIBLE);
contactContainer.setVisibility(View.GONE);
} else {
diff --git a/java/com/android/dialer/callcomposer/CallComposerFragment.java b/java/com/android/dialer/callcomposer/CallComposerFragment.java
index ee1eb462a..b60657189 100644
--- a/java/com/android/dialer/callcomposer/CallComposerFragment.java
+++ b/java/com/android/dialer/callcomposer/CallComposerFragment.java
@@ -62,5 +62,8 @@ public abstract class CallComposerFragment extends Fragment {
/** True if the layout is in landscape mode. */
boolean isLandscapeLayout();
+
+ /** Tell the listener that call composition is done and we should start the call. */
+ void sendAndCall();
}
}
diff --git a/java/com/android/dialer/callcomposer/CameraComposerFragment.java b/java/com/android/dialer/callcomposer/CameraComposerFragment.java
index 01f7f6087..ceefc068e 100644
--- a/java/com/android/dialer/callcomposer/CameraComposerFragment.java
+++ b/java/com/android/dialer/callcomposer/CameraComposerFragment.java
@@ -331,6 +331,7 @@ public class CameraComposerFragment extends CallComposerFragment
if (cameraUri != null) {
previewImageView.setImageURI(cameraUri);
previewImageView.setVisibility(View.VISIBLE);
+ previewImageView.setScaleX(cameraDirection == CameraInfo.CAMERA_FACING_FRONT ? -1 : 1);
} else {
previewImageView.setVisibility(View.GONE);
}
diff --git a/java/com/android/dialer/callcomposer/MessageComposerFragment.java b/java/com/android/dialer/callcomposer/MessageComposerFragment.java
index d8100033f..2a342bb08 100644
--- a/java/com/android/dialer/callcomposer/MessageComposerFragment.java
+++ b/java/com/android/dialer/callcomposer/MessageComposerFragment.java
@@ -22,6 +22,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.MotionEvent;
import android.view.View;
@@ -31,10 +32,15 @@ import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
+import android.widget.TextView.OnEditorActionListener;
/** Fragment used to compose call with message fragment. */
public class MessageComposerFragment extends CallComposerFragment
- implements OnClickListener, TextWatcher, OnTouchListener, OnLongClickListener {
+ implements OnClickListener,
+ TextWatcher,
+ OnTouchListener,
+ OnLongClickListener,
+ OnEditorActionListener {
private static final String CHAR_LIMIT_KEY = "char_limit";
public static final int NO_CHAR_LIMIT = -1;
@@ -70,6 +76,7 @@ public class MessageComposerFragment extends CallComposerFragment
customMessage.setOnTouchListener(this);
customMessage.setOnLongClickListener(this);
customMessage.addTextChangedListener(this);
+ customMessage.setOnEditorActionListener(this);
if (charLimit != NO_CHAR_LIMIT) {
TextView remainingChar = (TextView) view.findViewById(R.id.remaining_characters);
remainingChar.setText("" + charLimit);
@@ -144,4 +151,13 @@ public class MessageComposerFragment extends CallComposerFragment
public void clearComposer() {
customMessage.getText().clear();
}
+
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ if (getMessage() == null) {
+ return false;
+ }
+ getListener().sendAndCall();
+ return true;
+ }
}
diff --git a/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml b/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml
index f687f0b5c..c3f1102d1 100644
--- a/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml
+++ b/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml
@@ -74,12 +74,14 @@
android:id="@+id/call_composer_view_pager"
android:layout_width="match_parent"
android:layout_height="@dimen/call_composer_view_pager_height"/>
+ </LinearLayout>
- <FrameLayout
+ <FrameLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content">
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom">
- <LinearLayout
+ <LinearLayout
android:id="@+id/media_actions"
android:layout_width="match_parent"
android:layout_height="@dimen/call_composer_media_bar_height"
@@ -88,7 +90,7 @@
android:background="@color/dialer_secondary_color"
android:clickable="true">
- <ImageView
+ <ImageView
android:id="@+id/call_composer_camera"
android:layout_width="@dimen/call_composer_media_actions_width"
android:layout_height="match_parent"
@@ -96,7 +98,7 @@
android:src="@drawable/quantum_ic_camera_alt_white_24"
android:background="?android:attr/selectableItemBackgroundBorderless"/>
- <ImageView
+ <ImageView
android:id="@+id/call_composer_photo"
android:layout_width="@dimen/call_composer_media_actions_width"
android:layout_height="match_parent"
@@ -104,22 +106,22 @@
android:src="@drawable/quantum_ic_photo_white_24"
android:background="?android:attr/selectableItemBackgroundBorderless"/>
- <ImageView
+ <ImageView
android:id="@+id/call_composer_message"
android:layout_width="@dimen/call_composer_media_actions_width"
android:layout_height="match_parent"
android:scaleType="center"
- android:src="@drawable/ic_message_24dp"
+ android:src="@drawable/quantum_ic_message_white_24"
android:background="?android:attr/selectableItemBackgroundBorderless"/>
- </LinearLayout>
+ </LinearLayout>
- <FrameLayout
+ <FrameLayout
android:id="@+id/send_and_call_button"
android:layout_width="match_parent"
android:layout_height="@dimen/call_composer_media_bar_height"
android:visibility="invisible"
android:background="@color/compose_and_call_background">
- <TextView
+ <TextView
android:id="@+id/send_and_call_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -131,18 +133,11 @@
android:textSize="@dimen/send_and_call_text_size"
android:fontFamily="sans-serif-medium"
android:textColor="@color/background_dialer_white"/>
- </FrameLayout>
</FrameLayout>
- </LinearLayout>
+ </FrameLayout>
- <Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?attr/actionBarSize"
- android:visibility="invisible"
- android:titleTextAppearance="@style/toolbar_title_text"
- android:subtitleTextAppearance="@style/toolbar_subtitle_text"
- android:navigationIcon="@drawable/quantum_ic_close_white_24"
- android:background="@color/dialer_theme_color"/>
-</FrameLayout> \ No newline at end of file
+ <com.android.dialer.widget.DialerToolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+</FrameLayout>
diff --git a/java/com/android/dialer/callcomposer/res/layout/fragment_camera_composer.xml b/java/com/android/dialer/callcomposer/res/layout/fragment_camera_composer.xml
index 200a3dce7..f1db48e5b 100644
--- a/java/com/android/dialer/callcomposer/res/layout/fragment_camera_composer.xml
+++ b/java/com/android/dialer/callcomposer/res/layout/fragment_camera_composer.xml
@@ -17,7 +17,8 @@
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
- android:layout_width="match_parent">
+ android:layout_width="match_parent"
+ android:paddingBottom="@dimen/call_composer_media_bar_height">
<include
android:layout_width="match_parent"
diff --git a/java/com/android/dialer/callcomposer/res/layout/fragment_gallery_composer.xml b/java/com/android/dialer/callcomposer/res/layout/fragment_gallery_composer.xml
index a4bd4df03..6cd6418a4 100644
--- a/java/com/android/dialer/callcomposer/res/layout/fragment_gallery_composer.xml
+++ b/java/com/android/dialer/callcomposer/res/layout/fragment_gallery_composer.xml
@@ -18,7 +18,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/background_dialer_white">
+ android:background="@color/background_dialer_white"
+ android:paddingBottom="@dimen/call_composer_media_bar_height">
<GridView
android:id="@+id/gallery_grid_view"
diff --git a/java/com/android/dialer/callcomposer/res/layout/fragment_message_composer.xml b/java/com/android/dialer/callcomposer/res/layout/fragment_message_composer.xml
index 577887be9..77c7a58d1 100644
--- a/java/com/android/dialer/callcomposer/res/layout/fragment_message_composer.xml
+++ b/java/com/android/dialer/callcomposer/res/layout/fragment_message_composer.xml
@@ -59,7 +59,10 @@
android:id="@+id/custom_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:padding="@dimen/message_composer_item_padding"
+ android:paddingTop="@dimen/message_composer_item_padding"
+ android:paddingStart="@dimen/message_composer_item_padding"
+ android:paddingEnd="@dimen/message_composer_item_padding"
+ android:paddingBottom="64dp"
android:textSize="@dimen/message_compose_item_text_size"
android:hint="@string/message_composer_custom_message_hint"
android:textColor="@color/dialer_primary_text_color"
@@ -67,13 +70,15 @@
android:background="@color/background_dialer_white"
android:textCursorDrawable="@drawable/searchedittext_custom_cursor"
android:layout_toStartOf="@+id/remaining_characters"
- android:imeOptions="flagNoExtractUi"/>
+ android:inputType="textShortMessage"
+ android:imeOptions="flagNoExtractUi|actionSend"/>
<TextView
android:id="@+id/remaining_characters"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/message_composer_item_padding"
+ android:paddingBottom="@dimen/call_composer_media_bar_height"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:textSize="@dimen/message_compose_remaining_char_text_size"
diff --git a/java/com/android/dialer/callcomposer/res/values/dimens.xml b/java/com/android/dialer/callcomposer/res/values/dimens.xml
index 5571170b2..d55540077 100644
--- a/java/com/android/dialer/callcomposer/res/values/dimens.xml
+++ b/java/com/android/dialer/callcomposer/res/values/dimens.xml
@@ -15,7 +15,7 @@
~ limitations under the License
-->
<resources>
- <dimen name="call_composer_view_pager_height">258dp</dimen>
+ <dimen name="call_composer_view_pager_height">306dp</dimen>
<!-- Contact bar -->
<dimen name="call_composer_contact_photo_border_thickness">2dp</dimen>
diff --git a/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java b/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java
index be08555f9..81511d274 100644
--- a/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java
+++ b/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java
@@ -36,7 +36,7 @@ import java.io.OutputStream;
/** Task for copying and resizing images to be shared with RCS process. */
@TargetApi(VERSION_CODES.M)
public class CopyAndResizeImageTask extends FallibleAsyncTask<Void, Void, File> {
- public static final int MAX_OUTPUT_RESOLUTION = 1024;
+ public static final int MAX_OUTPUT_RESOLUTION = 640;
private static final String MIME_TYPE = "image/jpeg";
private final Context context;
@@ -59,7 +59,7 @@ public class CopyAndResizeImageTask extends FallibleAsyncTask<Void, Void, File>
File outputFile = DialerUtils.createShareableFile(context);
try (OutputStream outputStream = new FileOutputStream(outputFile)) {
// Encode images to jpeg as it is better for camera pictures which we expect to be sending
- bitmap.compress(CompressFormat.JPEG, 90, outputStream);
+ bitmap.compress(CompressFormat.JPEG, 80, outputStream);
return outputFile;
}
}
diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java
index bb2f58083..757c6eed2 100644
--- a/java/com/android/dialer/calldetails/CallDetailsActivity.java
+++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java
@@ -26,8 +26,9 @@ import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.support.v7.widget.Toolbar.OnMenuItemClickListener;
import android.view.MenuItem;
-import android.widget.Toolbar;
import com.android.dialer.callcomposer.nano.CallComposerContact;
import com.android.dialer.calldetails.nano.CallDetailsEntries;
import com.android.dialer.calldetails.nano.CallDetailsEntries.CallDetailsEntry;
@@ -38,7 +39,7 @@ import com.android.dialer.logging.nano.DialerImpression;
import com.android.dialer.protos.ProtoParsers;
/** Displays the details of a specific call log entry. */
-public class CallDetailsActivity extends AppCompatActivity {
+public class CallDetailsActivity extends AppCompatActivity implements OnMenuItemClickListener {
private static final String EXTRA_CALL_DETAILS_ENTRIES = "call_details_entries";
private static final String EXTRA_CONTACT = "contact";
@@ -61,11 +62,10 @@ public class CallDetailsActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.call_details_activity);
-
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- setActionBar(toolbar);
toolbar.inflateMenu(R.menu.call_details_menu);
- toolbar.setNavigationOnClickListener(v -> finish());
+ toolbar.setOnMenuItemClickListener(this);
+ toolbar.setTitle(R.string.call_details);
onHandleIntent(getIntent());
}
@@ -89,14 +89,14 @@ public class CallDetailsActivity extends AppCompatActivity {
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
+ public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.call_detail_delete_menu_item) {
Logger.get(this).logImpression(DialerImpression.Type.USER_DELETED_CALL_LOG_ITEM);
AsyncTaskExecutors.createAsyncTaskExecutor().submit(TASK_DELETE, new DeleteCallsTask());
item.setEnabled(false);
return true;
}
- return super.onOptionsItemSelected(item);
+ return false;
}
/** Delete specified calls from the call log. */
diff --git a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
index 86036a319..a8958d911 100644
--- a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
@@ -95,6 +95,7 @@ public class CallDetailsEntryViewHolder extends ViewHolder {
(entry.features & Calls.FEATURES_PULLED_EXTERNALLY) == Calls.FEATURES_PULLED_EXTERNALLY;
callTime.setTextColor(getColorForCallType(context, callType));
+ callTypeIcon.clear();
callTypeIcon.add(callType);
callTypeIcon.setShowVideo((entry.features & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO);
callTypeIcon.setShowHd(MotorolaUtils.shouldShowHdIconInCallLog(context, entry.features));
diff --git a/java/com/android/dialer/calldetails/res/layout/call_details_activity.xml b/java/com/android/dialer/calldetails/res/layout/call_details_activity.xml
index 79f283705..10927af73 100644
--- a/java/com/android/dialer/calldetails/res/layout/call_details_activity.xml
+++ b/java/com/android/dialer/calldetails/res/layout/call_details_activity.xml
@@ -20,15 +20,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <Toolbar
+ <com.android.dialer.widget.DialerToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
- android:background="@color/dialer_theme_color"
- android:elevation="4dp"
- android:titleTextAppearance="@style/toolbar_title_text"
- android:title="@string/call_details"
- android:navigationIcon="@drawable/quantum_ic_arrow_back_white_24"/>
+ android:layout_height="wrap_content"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
diff --git a/java/com/android/dialer/calldetails/res/menu/call_details_menu.xml b/java/com/android/dialer/calldetails/res/menu/call_details_menu.xml
index c2d1032da..df0c34827 100644
--- a/java/com/android/dialer/calldetails/res/menu/call_details_menu.xml
+++ b/java/com/android/dialer/calldetails/res/menu/call_details_menu.xml
@@ -14,10 +14,11 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/call_detail_delete_menu_item"
android:icon="@drawable/quantum_ic_delete_white_24"
android:title="@string/delete"
- android:showAsAction="ifRoom"/>
+ app:showAsAction="ifRoom"/>
</menu> \ No newline at end of file
diff --git a/java/com/android/dialer/calllogutils/CallTypeIconsView.java b/java/com/android/dialer/calllogutils/CallTypeIconsView.java
index 8389a8027..55672ca07 100644
--- a/java/com/android/dialer/calllogutils/CallTypeIconsView.java
+++ b/java/com/android/dialer/calllogutils/CallTypeIconsView.java
@@ -26,7 +26,6 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
-import com.android.contacts.common.util.BitmapUtil;
import com.android.dialer.compat.AppCompatConstants;
import java.util.ArrayList;
import java.util.List;
@@ -169,7 +168,7 @@ public class CallTypeIconsView extends View {
int left = 0;
// If we are using large icons, we should only show one icon (video, hd or call type) with
// priority give to HD or Video. So we skip the call type icon if we plan to show them.
- if (!useLargeIcons || !(mShowHd || mShowVideo)) {
+ if (!useLargeIcons || !(mShowHd || mShowVideo || mShowWifi)) {
for (Integer callType : mCallTypes) {
final Drawable drawable = getCallTypeDrawable(callType);
final int right = left + drawable.getIntrinsicWidth();
@@ -181,29 +180,25 @@ public class CallTypeIconsView extends View {
// If showing the video call icon, draw it scaled appropriately.
if (mShowVideo) {
- final Drawable drawable = resources.videoCall;
- final int right = left + resources.videoCall.getIntrinsicWidth();
- drawable.setBounds(left, 0, right, resources.videoCall.getIntrinsicHeight());
- drawable.draw(canvas);
- left = right + sResources.iconMargin;
+ left = addDrawable(canvas, resources.videoCall, left) + resources.iconMargin;
}
// If showing HD call icon, draw it scaled appropriately.
if (mShowHd) {
- final Drawable drawable = resources.hdCall;
- final int right = left + resources.hdCall.getIntrinsicWidth();
- drawable.setBounds(left, 0, right, resources.hdCall.getIntrinsicHeight());
- drawable.draw(canvas);
- left = right + sResources.iconMargin;
+ left = addDrawable(canvas, resources.hdCall, left) + resources.iconMargin;
}
// If showing HD call icon, draw it scaled appropriately.
if (mShowWifi) {
- final Drawable drawable = sResources.wifiCall;
- final int right = left + sResources.wifiCall.getIntrinsicWidth();
- drawable.setBounds(left, 0, right, sResources.wifiCall.getIntrinsicHeight());
- drawable.draw(canvas);
+ left = addDrawable(canvas, resources.wifiCall, left) + resources.iconMargin;
}
}
+ private int addDrawable(Canvas canvas, Drawable drawable, int left) {
+ int right = left + drawable.getIntrinsicWidth();
+ drawable.setBounds(left, 0, right, drawable.getIntrinsicHeight());
+ drawable.draw(canvas);
+ return right;
+ }
+
private static class Resources {
// Drawable representing an incoming answered call.
@@ -242,25 +237,24 @@ public class CallTypeIconsView extends View {
public Resources(Context context, boolean largeIcons) {
final android.content.res.Resources r = context.getResources();
- int iconId =
- largeIcons ? R.drawable.quantum_ic_call_received_white_24 : R.drawable.ic_call_arrow;
- incoming = r.getDrawable(iconId);
+ int iconId = R.drawable.quantum_ic_call_received_white_24;
+ incoming = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
incoming.setColorFilter(r.getColor(R.color.answered_call), PorterDuff.Mode.MULTIPLY);
// Create a rotated instance of the call arrow for outgoing calls.
- outgoing = BitmapUtil.getRotatedDrawable(r, iconId, 180f);
+ iconId = R.drawable.quantum_ic_call_made_white_24;
+ outgoing = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
outgoing.setColorFilter(r.getColor(R.color.answered_call), PorterDuff.Mode.MULTIPLY);
// Need to make a copy of the arrow drawable, otherwise the same instance colored
// above will be recolored here.
- iconId = largeIcons ? R.drawable.quantum_ic_call_missed_white_24 : R.drawable.ic_call_arrow;
- missed = r.getDrawable(iconId).mutate();
+ iconId = R.drawable.quantum_ic_call_missed_white_24;
+ missed = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
missed.setColorFilter(r.getColor(R.color.missed_call), PorterDuff.Mode.MULTIPLY);
iconId = R.drawable.quantum_ic_voicemail_white_24;
voicemail = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
- voicemail.setColorFilter(
- r.getColor(R.color.dialer_secondary_text_color), PorterDuff.Mode.MULTIPLY);
+ voicemail.setColorFilter(r.getColor(R.color.call_type_icon_color), PorterDuff.Mode.MULTIPLY);
iconId = R.drawable.quantum_ic_block_white_24;
blocked = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
@@ -268,17 +262,15 @@ public class CallTypeIconsView extends View {
iconId = R.drawable.quantum_ic_videocam_white_24;
videoCall = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
- videoCall.setColorFilter(
- r.getColor(R.color.dialer_secondary_text_color), PorterDuff.Mode.MULTIPLY);
+ videoCall.setColorFilter(r.getColor(R.color.call_type_icon_color), PorterDuff.Mode.MULTIPLY);
iconId = R.drawable.quantum_ic_hd_white_24;
hdCall = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
- hdCall.setColorFilter(
- r.getColor(R.color.dialer_secondary_text_color), PorterDuff.Mode.MULTIPLY);
+ hdCall.setColorFilter(r.getColor(R.color.call_type_icon_color), PorterDuff.Mode.MULTIPLY);
- wifiCall = getScaledBitmap(context, R.drawable.quantum_ic_signal_wifi_4_bar_white_24);
- wifiCall.setColorFilter(
- r.getColor(R.color.dialer_secondary_text_color), PorterDuff.Mode.MULTIPLY);
+ iconId = R.drawable.quantum_ic_signal_wifi_4_bar_white_24;
+ wifiCall = largeIcons ? r.getDrawable(iconId) : getScaledBitmap(context, iconId);
+ wifiCall.setColorFilter(r.getColor(R.color.call_type_icon_color), PorterDuff.Mode.MULTIPLY);
iconMargin = largeIcons ? 0 : r.getDimensionPixelSize(R.dimen.call_log_icon_margin);
}
diff --git a/java/com/android/dialer/calllogutils/PhoneCallDetails.java b/java/com/android/dialer/calllogutils/PhoneCallDetails.java
index ba05a87e2..6fa507325 100644
--- a/java/com/android/dialer/calllogutils/PhoneCallDetails.java
+++ b/java/com/android/dialer/calllogutils/PhoneCallDetails.java
@@ -27,6 +27,7 @@ import android.text.TextUtils;
import com.android.contacts.common.ContactsUtils.UserType;
import com.android.contacts.common.preference.ContactsPreferences;
import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.dialer.phonenumbercache.CachedNumberLookupService.CachedContactInfo.ContactSourceType;
import com.android.dialer.phonenumbercache.ContactInfo;
/** The details of a phone call to be shown in the UI. */
@@ -81,7 +82,7 @@ public class PhoneCallDetails {
public Uri photoUri;
// The source type of the contact associated with this call.
- public int sourceType;
+ public @ContactSourceType int sourceType;
// The object id type of the contact associated with this call.
public String objectId;
diff --git a/java/com/android/dialer/common/Assert.java b/java/com/android/dialer/common/Assert.java
index 943e1ddcf..189d209c8 100644
--- a/java/com/android/dialer/common/Assert.java
+++ b/java/com/android/dialer/common/Assert.java
@@ -30,6 +30,10 @@ public class Assert {
Assert.areThreadAssertsEnabled = areThreadAssertsEnabled;
}
+ public static boolean areThreadAssertsEnabled() {
+ return areThreadAssertsEnabled;
+ }
+
/**
* Called when a truly exceptional case occurs.
*
diff --git a/java/com/android/dialer/common/concurrent/AsyncTaskExecutors.java b/java/com/android/dialer/common/concurrent/AsyncTaskExecutors.java
index fd358328e..a25e9fbf5 100644
--- a/java/com/android/dialer/common/concurrent/AsyncTaskExecutors.java
+++ b/java/com/android/dialer/common/concurrent/AsyncTaskExecutors.java
@@ -74,7 +74,7 @@ public final class AsyncTaskExecutors {
AsyncTaskExecutor createAsyncTaskExeuctor();
}
- private static class SimpleAsyncTaskExecutor implements AsyncTaskExecutor {
+ static class SimpleAsyncTaskExecutor implements AsyncTaskExecutor {
private final Executor mExecutor;
diff --git a/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java
new file mode 100644
index 000000000..80ed725bc
--- /dev/null
+++ b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.common.concurrent;
+
+import android.app.FragmentManager;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.DialerExecutor.Builder;
+import com.android.dialer.common.concurrent.DialerExecutor.FailureListener;
+import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+/** The production {@link DialerExecutorFactory}. */
+public class DefaultDialerExecutorFactory implements DialerExecutorFactory {
+
+ @Override
+ @NonNull
+ public <InputT, OutputT> DialerExecutor.Builder<InputT, OutputT> createUiTaskBuilder(
+ @NonNull FragmentManager fragmentManager,
+ @NonNull String taskId,
+ @NonNull Worker<InputT, OutputT> worker) {
+ return new UiTaskBuilder<>(
+ Assert.isNotNull(fragmentManager), Assert.isNotNull(taskId), Assert.isNotNull(worker));
+ }
+
+ @Override
+ @NonNull
+ public <InputT, OutputT> DialerExecutor.Builder<InputT, OutputT> createNonUiTaskBuilder(
+ @NonNull Worker<InputT, OutputT> worker) {
+ return new NonUiTaskBuilder<>(Assert.isNotNull(worker));
+ }
+
+ private abstract static class BaseTaskBuilder<InputT, OutputT>
+ implements DialerExecutor.Builder<InputT, OutputT> {
+
+ private final Worker<InputT, OutputT> worker;
+ private SuccessListener<OutputT> successListener = output -> {};
+ private FailureListener failureListener =
+ throwable -> {
+ throw new RuntimeException(throwable);
+ };
+ @Nullable final ExecutorService serialExecutorService;
+ @Nullable final ExecutorService parallelExecutorService;
+
+ BaseTaskBuilder(
+ Worker<InputT, OutputT> worker,
+ @Nullable ExecutorService serialExecutorService,
+ @Nullable ExecutorService parallelExecutorService) {
+ this.worker = worker;
+ this.serialExecutorService = serialExecutorService;
+ this.parallelExecutorService = parallelExecutorService;
+ }
+
+ @NonNull
+ @Override
+ public Builder<InputT, OutputT> onSuccess(@NonNull SuccessListener<OutputT> successListener) {
+ this.successListener = Assert.isNotNull(successListener);
+ return this;
+ }
+
+ @NonNull
+ @Override
+ public Builder<InputT, OutputT> onFailure(@NonNull FailureListener failureListener) {
+ this.failureListener = Assert.isNotNull(failureListener);
+ return this;
+ }
+ }
+
+ /** Convenience class for use by {@link DialerExecutorFactory} implementations. */
+ public static class UiTaskBuilder<InputT, OutputT> extends BaseTaskBuilder<InputT, OutputT> {
+
+ private final FragmentManager fragmentManager;
+ private final String id;
+
+ private DialerUiTaskFragment<InputT, OutputT> dialerUiTaskFragment;
+
+ UiTaskBuilder(FragmentManager fragmentManager, String id, Worker<InputT, OutputT> worker) {
+ this(
+ fragmentManager,
+ id,
+ worker,
+ null /* serialExecutorService */,
+ null /* parallelExecutorService */);
+ }
+
+ public UiTaskBuilder(
+ FragmentManager fragmentManager,
+ String id,
+ Worker<InputT, OutputT> worker,
+ ExecutorService serialExecutor,
+ ExecutorService parallelExecutor) {
+ super(worker, serialExecutor, parallelExecutor);
+ this.fragmentManager = fragmentManager;
+ this.id = id;
+ }
+
+ @NonNull
+ @Override
+ public DialerExecutor<InputT> build() {
+ dialerUiTaskFragment = DialerUiTaskFragment.create(
+ fragmentManager,
+ id,
+ super.worker,
+ super.successListener,
+ super.failureListener,
+ serialExecutorService,
+ parallelExecutorService);
+ return new UiDialerExecutor<>(dialerUiTaskFragment);
+ }
+ }
+
+ /** Convenience class for use by {@link DialerExecutorFactory} implementations. */
+ public static class NonUiTaskBuilder<InputT, OutputT> extends BaseTaskBuilder<InputT, OutputT> {
+ private static final ExecutorService defaultSerialExecutorService =
+ Executors.newSingleThreadExecutor(
+ new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable runnable) {
+ LogUtil.i("NonUiTaskBuilder.newThread", "creating serial thread");
+ Thread thread = new Thread(runnable, "NonUiTaskBuilder");
+ thread.setPriority(4); // Corresponds to Process.THREAD_PRIORITY_BACKGROUND
+ return thread;
+ }
+ });
+
+ private static final ExecutorService defaultParallelExecutorService =
+ Executors.newFixedThreadPool(
+ 5,
+ new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable runnable) {
+ LogUtil.i("NonUiTaskBuilder.newThread", "creating parallel thread");
+ Thread thread = new Thread(runnable, "NonUiTaskBuilder");
+ thread.setPriority(4); // Corresponds to Process.THREAD_PRIORITY_BACKGROUND
+ return thread;
+ }
+ });
+
+ NonUiTaskBuilder(Worker<InputT, OutputT> worker) {
+ this(worker, defaultSerialExecutorService, defaultParallelExecutorService);
+ }
+
+ public NonUiTaskBuilder(
+ Worker<InputT, OutputT> worker,
+ @NonNull ExecutorService serialExecutor,
+ @NonNull ExecutorService parallelExecutor) {
+ super(worker, Assert.isNotNull(serialExecutor), Assert.isNotNull(parallelExecutor));
+ }
+
+ @NonNull
+ @Override
+ public DialerExecutor<InputT> build() {
+ return new NonUiDialerExecutor<>(
+ super.worker,
+ super.successListener,
+ super.failureListener,
+ serialExecutorService,
+ parallelExecutorService);
+ }
+ }
+
+ private static class UiDialerExecutor<InputT, OutputT> implements DialerExecutor<InputT> {
+
+ private final DialerUiTaskFragment<InputT, OutputT> dialerUiTaskFragment;
+
+ UiDialerExecutor(DialerUiTaskFragment<InputT, OutputT> dialerUiTaskFragment) {
+ this.dialerUiTaskFragment = dialerUiTaskFragment;
+ }
+
+ @Override
+ public void executeSerial(@Nullable InputT input) {
+ dialerUiTaskFragment.executeSerial(input);
+ }
+
+ @Override
+ public void executeParallel(@Nullable InputT input) {
+ dialerUiTaskFragment.executeParallel(input);
+ }
+
+ @Override
+ public void executeOnCustomExecutorService(
+ @NonNull ExecutorService executorService, @Nullable InputT input) {
+ dialerUiTaskFragment.executeOnCustomExecutor(Assert.isNotNull(executorService), input);
+ }
+ }
+
+ private static class NonUiDialerExecutor<InputT, OutputT> implements DialerExecutor<InputT> {
+
+ private final Worker<InputT, OutputT> worker;
+ private final SuccessListener<OutputT> successListener;
+ private final FailureListener failureListener;
+
+ private final ExecutorService serialExecutorService;
+ private final ExecutorService parallelExecutorService;
+
+ NonUiDialerExecutor(
+ Worker<InputT, OutputT> worker,
+ SuccessListener<OutputT> successListener,
+ FailureListener failureListener,
+ ExecutorService serialExecutorService,
+ ExecutorService parallelExecutorService) {
+ this.worker = worker;
+ this.successListener = successListener;
+ this.failureListener = failureListener;
+ this.serialExecutorService = serialExecutorService;
+ this.parallelExecutorService = parallelExecutorService;
+ }
+
+ @Override
+ public void executeSerial(@Nullable InputT input) {
+ executeOnCustomExecutorService(serialExecutorService, input);
+ }
+
+ @Override
+ public void executeParallel(@Nullable InputT input) {
+ executeOnCustomExecutorService(parallelExecutorService, input);
+ }
+
+ @Override
+ public void executeOnCustomExecutorService(
+ @NonNull ExecutorService executorService, @Nullable InputT input) {
+ Assert.isNotNull(executorService)
+ .execute(
+ () -> {
+ OutputT output;
+ try {
+ output = worker.doInBackground(input);
+ } catch (Throwable throwable) {
+ ThreadUtil.postOnUiThread(() -> failureListener.onFailure(throwable));
+ return;
+ }
+ ThreadUtil.postOnUiThread(() -> successListener.onSuccess(output));
+ });
+ }
+ }
+}
diff --git a/java/com/android/dialer/common/concurrent/DialerExecutor.java b/java/com/android/dialer/common/concurrent/DialerExecutor.java
new file mode 100644
index 000000000..b0d1eac66
--- /dev/null
+++ b/java/com/android/dialer/common/concurrent/DialerExecutor.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.common.concurrent;
+
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.WorkerThread;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * Provides a consistent interface for doing background work in either UI or non-UI contexts.
+ *
+ * <p>See {@link DialerExecutors} for usage examples.
+ */
+public interface DialerExecutor<InputT> {
+
+ /** Functional interface for doing work in the background. */
+ interface Worker<InputT, OutputT> {
+ @WorkerThread
+ @Nullable
+ OutputT doInBackground(@Nullable InputT input);
+ }
+
+ /** Functional interface for handling the result of background work. */
+ interface SuccessListener<OutputT> {
+ @MainThread
+ void onSuccess(@Nullable OutputT output);
+ }
+
+ /** Functional interface for handling an error produced while performing background work. */
+ interface FailureListener {
+ @MainThread
+ void onFailure(@NonNull Throwable throwable);
+ }
+
+ /** Builder for {@link DialerExecutor}. */
+ interface Builder<InputT, OutputT> {
+
+ /**
+ * Optional. Default is no-op.
+ *
+ * @param successListener a function executed on the main thread upon task success. There are no
+ * restraints on this as it is executed on the main thread, so lambdas, anonymous, or inner
+ * classes of your activity or fragment are all fine.
+ */
+ @NonNull
+ Builder<InputT, OutputT> onSuccess(@NonNull SuccessListener<OutputT> successListener);
+
+ /**
+ * Optional. If this is not set and your worker throws an exception, the application will crash.
+ *
+ * @param failureListener a function executed on the main thread upon task failure. There are no
+ * restraints on this as it is executed on the main thread, so lambdas, anonymous, or inner
+ * classes of your activity or fragment are all fine.
+ */
+ @NonNull
+ Builder<InputT, OutputT> onFailure(@NonNull FailureListener failureListener);
+
+ /**
+ * Builds the {@link DialerExecutor} which can be used to execute your task (repeatedly with
+ * differing inputs if desired).
+ */
+ @NonNull
+ DialerExecutor<InputT> build();
+ }
+
+ /** Executes the task such that repeated executions for this executor are serialized. */
+ @MainThread
+ void executeSerial(@Nullable InputT input);
+
+ /**
+ * Executes the task on a thread pool shared across the application. Multiple calls using this
+ * method may result in tasks being executed in parallel.
+ */
+ @MainThread
+ void executeParallel(@Nullable InputT input);
+
+ /**
+ * Executes the task on a custom executor service. This should rarely be used; instead prefer
+ * {@link #executeSerial(Object)} or {@link #executeParallel(Object)}.
+ */
+ @MainThread
+ void executeOnCustomExecutorService(
+ @NonNull ExecutorService executorService, @Nullable InputT input);
+}
diff --git a/java/com/android/dialer/common/concurrent/DialerExecutorFactory.java b/java/com/android/dialer/common/concurrent/DialerExecutorFactory.java
new file mode 100644
index 000000000..82f8c7c3d
--- /dev/null
+++ b/java/com/android/dialer/common/concurrent/DialerExecutorFactory.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.common.concurrent;
+
+import android.app.FragmentManager;
+import android.support.annotation.NonNull;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+
+/**
+ * Factory interface for creating {@link DialerExecutor} objects.
+ *
+ * <p>Factory instances may be used instead of the static methods in {@link DialerExecutors} in
+ * order to improve testability.
+ *
+ * @see DialerExecutors
+ */
+public interface DialerExecutorFactory {
+
+ /**
+ * Must be called from onCreate of your activity or fragment.
+ *
+ * @param taskId used for the headless fragment ID and task ID
+ * @param worker a function executed on a worker thread which accepts an {@link InputT} and
+ * returns an {@link OutputT}. It should ideally not be an inner class of your (meaning it
+ * should not be a lambda, anonymous, or non-static) but it can be a static nested class. The
+ * static nested class should not contain any reference to UI, including any activity or
+ * fragment or activity context, though it may reference some threadsafe system objects such
+ * as the application context.
+ */
+ @NonNull
+ <InputT, OutputT> DialerExecutor.Builder<InputT, OutputT> createUiTaskBuilder(
+ @NonNull FragmentManager fragmentManager,
+ @NonNull String taskId,
+ @NonNull Worker<InputT, OutputT> worker);
+
+ /**
+ * Create a task from a non-UI context.
+ *
+ * @param worker a function executed on a worker thread which accepts an {@link InputT} and
+ * returns an {@link OutputT}. It should ideally not be an inner class of your (meaning it
+ * should not be a lambda, anonymous, or non-static) but it can be a static nested class. The
+ * static nested class should not contain any reference to UI, including any activity or
+ * fragment or activity context, though it may reference some threadsafe system objects such
+ * as the application context.
+ */
+ @NonNull
+ <InputT, OutputT> DialerExecutor.Builder<InputT, OutputT> createNonUiTaskBuilder(
+ @NonNull Worker<InputT, OutputT> worker);
+}
diff --git a/java/com/android/dialer/common/concurrent/DialerExecutors.java b/java/com/android/dialer/common/concurrent/DialerExecutors.java
new file mode 100644
index 000000000..148d8660c
--- /dev/null
+++ b/java/com/android/dialer/common/concurrent/DialerExecutors.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.common.concurrent;
+
+import android.app.FragmentManager;
+import android.support.annotation.NonNull;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+
+/**
+ * Factory methods for creating {@link DialerExecutor} objects for doing background work.
+ *
+ * <p>You may create an executor from a UI component (activity or fragment) or a non-UI component.
+ * Using this class provides a number of benefits:
+ *
+ * <ul>
+ * <li>Ensures that UI tasks keep running across configuration changes by using a headless
+ * fragment.
+ * <li>Forces exceptions to crash the application, unless the user implements their own onFailure
+ * method.
+ * <li>Checks for dead UI components which can be encountered if a UI task runs longer than its
+ * UI. If a dead UI component is encountered, onSuccess/onFailure are not called (because they
+ * can't be) but a message is logged.
+ * <li>Helps prevents memory leaks in UI tasks by ensuring that callbacks are nulled out when the
+ * headless fragment is detached.
+ * <li>UI and non-UI threads are shared across the application and run at reasonable priorities
+ * </ul>
+ *
+ * <p>Executors accept a single input and output parameter which should be immutable data objects.
+ * If you don't require an input or output, use Void and null as needed.
+ *
+ * <p>You may optionally specify onSuccess and onFailure listeners; the default behavior on success
+ * is a no-op and the default behavior on failure is to crash the application.
+ *
+ * <p>To use an executor from a UI component, you must create it in your onCreate method and then
+ * use it from anywhere:
+ *
+ * <pre><code>
+ *
+ * public class MyActivity extends Activity {
+ *
+ * private final DialerExecutor&lt;MyInputType&gt; myExecutor;
+ *
+ * public void onCreate(Bundle state) {
+ * super.onCreate(bundle);
+ *
+ * // Must be called in onCreate; don't use non-static or anonymous inner classes for worker!
+ * myExecutor = DialerExecutors.createUiTaskBuilder(fragmentManager, taskId, worker)
+ * .onSuccess(this::onSuccess) // Lambdas, anonymous, or non-static inner classes all fine
+ * .onFailure(this::onFailure) // Lambdas, anonymous, or non-static inner classes all fine
+ * .build();
+ * );
+ * }
+ *
+ * private static class MyWorker implements Worker&lt;MyInputType, MyOutputType&gt; {
+ * MyOutputType doInBackground(MyInputType input) { ... }
+ * }
+ * private void onSuccess(MyOutputType output) { ... }
+ * private void onFailure(Throwable throwable) { ... }
+ *
+ * private void userDidSomething() { myExecutor.executeParallel(input); }
+ * }
+ * </code></pre>
+ *
+ * <p>Usage for non-UI tasks is the same, except that tasks can be created from anywhere instead of
+ * in onCreate. Non-UI tasks use low-priority threads separate from the UI task threads so as not to
+ * compete with more critical UI tasks.
+ *
+ * <pre><code>
+ *
+ * public class MyManager {
+ *
+ * private final DialerExecutor&lt;MyInputType&gt; myExecutor;
+ *
+ * public void init() {
+ * // Don't use non-static or anonymous inner classes for worker!
+ * myExecutor = DialerExecutors.createNonUiTaskBuilder(worker)
+ * .onSuccess(this::onSuccess) // Lambdas, anonymous, or non-static inner classes all fine
+ * .onFailure(this::onFailure) // Lambdas, anonymous, or non-static inner classes all fine
+ * .build();
+ * );
+ * }
+ *
+ * private static class MyWorker implements Worker&lt;MyInputType, MyOutputType&gt; {
+ * MyOutputType doInBackground(MyInputType input) { ... }
+ * }
+ * private void onSuccess(MyOutputType output) { ... }
+ * private void onFailure(Throwable throwable) { ... }
+ *
+ * private void userDidSomething() { myExecutor.executeParallel(input); }
+ * }
+ * </code></pre>
+ *
+ * Note that non-UI tasks are intended to be relatively quick; for example reading/writing shared
+ * preferences or doing simple database work. If you submit long running non-UI tasks you may
+ * saturate the shared application threads and block other tasks. Also, this class does not create
+ * any wakelocks, so a long running task could be killed if the device goes to sleep while your task
+ * is still running. If you have to do long running or periodic work, consider using a job
+ * scheduler.
+ */
+public final class DialerExecutors {
+
+ /** @see DialerExecutorFactory#createUiTaskBuilder(FragmentManager, String, Worker) */
+ @NonNull
+ public static <InputT, OutputT> DialerExecutor.Builder<InputT, OutputT> createUiTaskBuilder(
+ @NonNull FragmentManager fragmentManager,
+ @NonNull String taskId,
+ @NonNull Worker<InputT, OutputT> worker) {
+ return new DefaultDialerExecutorFactory()
+ .createUiTaskBuilder(
+ Assert.isNotNull(fragmentManager), Assert.isNotNull(taskId), Assert.isNotNull(worker));
+ }
+
+ /** @see DialerExecutorFactory#createNonUiTaskBuilder(Worker) */
+ @NonNull
+ public static <InputT, OutputT> DialerExecutor.Builder<InputT, OutputT> createNonUiTaskBuilder(
+ @NonNull Worker<InputT, OutputT> worker) {
+ return new DefaultDialerExecutorFactory().createNonUiTaskBuilder(Assert.isNotNull(worker));
+ }
+}
diff --git a/java/com/android/dialer/common/concurrent/DialerAsyncTaskHelper.java b/java/com/android/dialer/common/concurrent/DialerUiTaskFragment.java
index 65b408094..627336895 100644
--- a/java/com/android/dialer/common/concurrent/DialerAsyncTaskHelper.java
+++ b/java/com/android/dialer/common/concurrent/DialerUiTaskFragment.java
@@ -21,89 +21,33 @@ import android.app.FragmentManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.MainThread;
-import android.support.annotation.WorkerThread;
+import android.support.annotation.Nullable;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.AsyncTaskExecutors.SimpleAsyncTaskExecutor;
+import com.android.dialer.common.concurrent.DialerExecutor.FailureListener;
+import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener;
+import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+import java.util.concurrent.ExecutorService;
/**
- * Helps use async task properly.
- *
- * <p>This provides a number of benefits over using AsyncTask directly:
- *
- * <ul>
- * <li>Ensures that tasks keep running across configuration changes by using a headless fragment.
- * <li>Propagates exceptions to users, who must implement both onSuccess and onFailure methods.
- * <li>Checks for dead UI components which can be encountered if a task runs longer than its UI.
- * If a dead UI component is encountered, onSuccess/onFailure are not called (because they
- * can't be) but a message is logged.
- * <li>Helps prevents memory leaks by ensuring that callbacks are nulled out when the headless
- * fragment is detached.
- * </ul>
- *
- * <p>In your activity or fragment:
- *
- * <pre><code>
- *
- * public class MyActivity extends Activity {
- *
- * private final DialerAsyncTaskHelper&lt;MyInputType, MyOutputType&gt; myTaskHelper;
- *
- * public void onCreate(Bundle state) {
- * super.onCreate(bundle);
- *
- * // Must be called in onCreate
- * myTaskHelper = DialerAsyncTaskHelper.create(
- * fragmentManager,
- * taskId,
- * new MyWorker(), # Don't use non-static or anonymous inner classes!
- * this::onSuccess, # Lambdas, anonymous, or non-static inner classes all fine
- * this::onFailure # Lambdas, anonymous, or non-static inner classes all fine
- * );
- * }
- *
- * private static class MyWorker implements Worker&lt;MyInputType, MyOutputType&gt; {
- * MyOutputType doInBackground(MyInputType input) { ... }
- * }
- * private void onSuccess(MyOutputType output) { ... }
- * private void onFailure(Throwable throwable) { ... }
- *
- * private void userDidSomething() { myTaskHelper.execute(executor, input); }
- * }
- * </code></pre>
+ * Do not use this class directly. Instead use {@link DialerExecutors}.
*
* @param <InputT> the type of the object sent to the task upon execution
* @param <OutputT> the type of the result of the background computation
*/
-public final class DialerAsyncTaskHelper<InputT, OutputT> extends Fragment {
+public final class DialerUiTaskFragment<InputT, OutputT> extends Fragment {
private String taskId;
private Worker<InputT, OutputT> worker;
private SuccessListener<OutputT> successListener;
private FailureListener failureListener;
- private final AsyncTaskExecutor serialExecutor = AsyncTaskExecutors.createAsyncTaskExecutor();
- private final AsyncTaskExecutor parallelExecutor = AsyncTaskExecutors.createThreadPoolExecutor();
-
- /** Functional interface for doing work in the background. */
- public interface Worker<InputT, OutputT> {
- @WorkerThread
- OutputT doInBackground(InputT input);
- }
-
- /** Functional interface for handling the result of background work. */
- public interface SuccessListener<OutputT> {
- @MainThread
- void onSuccess(OutputT output);
- }
-
- /** Functional interface for handling an error produced while performing background work. */
- public interface FailureListener {
- @MainThread
- void onFailure(Throwable throwable);
- }
+ private AsyncTaskExecutor serialExecutor = AsyncTaskExecutors.createAsyncTaskExecutor();
+ private AsyncTaskExecutor parallelExecutor = AsyncTaskExecutors.createThreadPoolExecutor();
/**
- * Creates a new {@link DialerAsyncTaskHelper} or gets an existing one in the event that a
+ * Creates a new {@link DialerUiTaskFragment} or gets an existing one in the event that a
* configuration change occurred while the previous activity's task was still running. Must be
* called from onCreate of your activity or fragment.
*
@@ -123,30 +67,38 @@ public final class DialerAsyncTaskHelper<InputT, OutputT> extends Fragment {
* fragment are all fine.
* @param <InputT> the type of the object sent to the task upon execution
* @param <OutputT> the type of the result of the background computation
- * @return a {@link DialerAsyncTaskHelper} which may be used to call the "execute*" methods
+ * @return a {@link DialerUiTaskFragment} which may be used to call the "execute*" methods
*/
@MainThread
- public static <InputT, OutputT> DialerAsyncTaskHelper<InputT, OutputT> create(
+ static <InputT, OutputT> DialerUiTaskFragment<InputT, OutputT> create(
FragmentManager fragmentManager,
String taskId,
Worker<InputT, OutputT> worker,
SuccessListener<OutputT> successListener,
- FailureListener failureListener) {
+ FailureListener failureListener,
+ @Nullable ExecutorService serialExecutorService,
+ @Nullable ExecutorService parallelExecutorService) {
Assert.isMainThread();
- DialerAsyncTaskHelper<InputT, OutputT> helperFragment =
- (DialerAsyncTaskHelper<InputT, OutputT>) fragmentManager.findFragmentByTag(taskId);
+ DialerUiTaskFragment<InputT, OutputT> fragment =
+ (DialerUiTaskFragment<InputT, OutputT>) fragmentManager.findFragmentByTag(taskId);
- if (helperFragment == null) {
- LogUtil.i("DialerAsyncTaskHelper.create", "creating new helper fragment");
- helperFragment = new DialerAsyncTaskHelper<>();
- fragmentManager.beginTransaction().add(helperFragment, taskId).commit();
+ if (fragment == null) {
+ LogUtil.i("DialerUiTaskFragment.create", "creating new DialerUiTaskFragment");
+ fragment = new DialerUiTaskFragment<>();
+ fragmentManager.beginTransaction().add(fragment, taskId).commit();
+ }
+ fragment.taskId = taskId;
+ fragment.worker = worker;
+ fragment.successListener = successListener;
+ fragment.failureListener = failureListener;
+ if (serialExecutorService != null) {
+ fragment.serialExecutor = new SimpleAsyncTaskExecutor(serialExecutorService);
}
- helperFragment.taskId = taskId;
- helperFragment.worker = worker;
- helperFragment.successListener = successListener;
- helperFragment.failureListener = failureListener;
- return helperFragment;
+ if (parallelExecutorService != null) {
+ fragment.parallelExecutor = new SimpleAsyncTaskExecutor(parallelExecutorService);
+ }
+ return fragment;
}
@Override
@@ -158,40 +110,22 @@ public final class DialerAsyncTaskHelper<InputT, OutputT> extends Fragment {
@Override
public void onDetach() {
super.onDetach();
- LogUtil.enterBlock("DialerAsyncTaskHelper.onDetach");
+ LogUtil.enterBlock("DialerUiTaskFragment.onDetach");
taskId = null;
successListener = null;
failureListener = null;
}
- /**
- * Executes the task on a single thread global to the process. Multiple calls using this method
- * will result in tasks being executed serially.
- */
- @MainThread
- public void executeSerial(InputT input) {
- Assert.isMainThread();
+ void executeSerial(InputT input) {
serialExecutor.submit(taskId, new InternalTask(), input);
}
- /**
- * Executes the task on a thread pool shared across the application. Multiple calls using this
- * method may result in tasks being executed in parallel.
- */
- @MainThread
- public void executeParallel(InputT input) {
- Assert.isMainThread();
+ void executeParallel(InputT input) {
parallelExecutor.submit(taskId, new InternalTask(), input);
}
- /**
- * Executes the task on a custom executor. This should rarely be used; instead prefer {@link
- * #executeSerial(Object)} or {@link #executeParallel(Object)}.
- */
- @MainThread
- public void executeOnCustomExecutor(AsyncTaskExecutor executor, InputT input) {
- Assert.isMainThread();
- executor.submit(taskId, new InternalTask(), input);
+ void executeOnCustomExecutor(ExecutorService executor, InputT input) {
+ new SimpleAsyncTaskExecutor(executor).submit(taskId, new InternalTask(), input);
}
private final class InternalTask extends AsyncTask<InputT, Void, InternalTaskResult<OutputT>> {
diff --git a/java/com/android/dialer/common/concurrent/ThreadUtil.java b/java/com/android/dialer/common/concurrent/ThreadUtil.java
new file mode 100644
index 000000000..21cf4634e
--- /dev/null
+++ b/java/com/android/dialer/common/concurrent/ThreadUtil.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.common.concurrent;
+
+import android.os.Handler;
+import android.os.Looper;
+
+/** Application-wide utility methods for working with threads. */
+public class ThreadUtil {
+ private static volatile Handler mainThreadHandler;
+
+ /** Posts a runnable to the UI thread. */
+ public static void postOnUiThread(Runnable runnable) {
+ getUiThreadHandler().post(runnable);
+ }
+
+ /** Gets a handler which uses the main looper. */
+ public static Handler getUiThreadHandler() {
+ if (mainThreadHandler == null) {
+ mainThreadHandler = new Handler(Looper.getMainLooper());
+ }
+ return mainThreadHandler;
+ }
+}
diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_close_black_24dp.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_close_black_24dp.png
deleted file mode 100644
index 1a9cd75a0..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_close_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_delete.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_delete.png
deleted file mode 100644
index e588d90e9..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_delete.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_voicemail.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_voicemail.png
deleted file mode 100644
index 4706112d6..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_dialpad_voicemail.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_overflow_menu.png b/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_overflow_menu.png
deleted file mode 100644
index 262e9df91..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-hdpi/ic_overflow_menu.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_close_black_24dp.png b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_close_black_24dp.png
deleted file mode 100644
index 40a1a84e3..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_close_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialpad_delete.png b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialpad_delete.png
deleted file mode 100644
index 64a52d030..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialpad_delete.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialpad_voicemail.png b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialpad_voicemail.png
deleted file mode 100644
index e84d8f4a8..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_dialpad_voicemail.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_overflow_menu.png b/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_overflow_menu.png
deleted file mode 100644
index 0e720ddbd..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-mdpi/ic_overflow_menu.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_close_black_24dp.png b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_close_black_24dp.png
deleted file mode 100644
index 6bc437298..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_close_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialpad_delete.png b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialpad_delete.png
deleted file mode 100644
index 87bc11364..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialpad_delete.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialpad_voicemail.png b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialpad_voicemail.png
deleted file mode 100644
index 0b4e18389..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_dialpad_voicemail.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_overflow_menu.png b/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_overflow_menu.png
deleted file mode 100644
index 915607633..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xhdpi/ic_overflow_menu.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_close_black_24dp.png b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_close_black_24dp.png
deleted file mode 100644
index 51b4401ca..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_close_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialpad_delete.png b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialpad_delete.png
deleted file mode 100644
index 186508a9f..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialpad_delete.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialpad_voicemail.png b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialpad_voicemail.png
deleted file mode 100644
index a0a7c9d28..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_dialpad_voicemail.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_overflow_menu.png b/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_overflow_menu.png
deleted file mode 100644
index 92526f5a6..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xxhdpi/ic_overflow_menu.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_close_black_24dp.png b/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_close_black_24dp.png
deleted file mode 100644
index df42feecb..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_close_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_dialpad_delete.png b/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_dialpad_delete.png
deleted file mode 100644
index c974a8005..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_dialpad_delete.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_dialpad_voicemail.png b/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_dialpad_voicemail.png
deleted file mode 100644
index c6e8be023..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_dialpad_voicemail.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_overflow_menu.png b/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_overflow_menu.png
deleted file mode 100644
index 9028bd437..000000000
--- a/java/com/android/dialer/dialpadview/res/drawable-xxxhdpi/ic_overflow_menu.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/dialpadview/res/layout-land/dialpad_key_one.xml b/java/com/android/dialer/dialpadview/res/layout-land/dialpad_key_one.xml
index 65a2308fc..6f178f0e1 100644
--- a/java/com/android/dialer/dialpadview/res/layout-land/dialpad_key_one.xml
+++ b/java/com/android/dialer/dialpadview/res/layout-land/dialpad_key_one.xml
@@ -37,7 +37,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
- android:src="@drawable/ic_dialpad_voicemail"
+ android:src="@drawable/quantum_ic_voicemail_white_24"
android:tint="@color/dialpad_voicemail_tint"/>
</FrameLayout>
</LinearLayout>
diff --git a/java/com/android/dialer/dialpadview/res/layout/dialpad_key_one.xml b/java/com/android/dialer/dialpadview/res/layout/dialpad_key_one.xml
index 36f62c85d..88594401f 100644
--- a/java/com/android/dialer/dialpadview/res/layout/dialpad_key_one.xml
+++ b/java/com/android/dialer/dialpadview/res/layout/dialpad_key_one.xml
@@ -32,7 +32,7 @@
android:layout_centerInParent="true"
android:paddingTop="@dimen/dialpad_voicemail_icon_padding_top"
android:scaleType="fitCenter"
- android:src="@drawable/ic_dialpad_voicemail"
+ android:src="@drawable/quantum_ic_voicemail_white_24"
android:tint="?attr/dialpad_voicemail_tint"/>
<!-- Place empty text view so vertical height is same as other dialpad keys. -->
<TextView style="@style/DialpadKeyLettersStyle"/>
diff --git a/java/com/android/dialer/dialpadview/res/layout/dialpad_view_unthemed.xml b/java/com/android/dialer/dialpadview/res/layout/dialpad_view_unthemed.xml
index 4b08c6de7..9f69f983a 100644
--- a/java/com/android/dialer/dialpadview/res/layout/dialpad_view_unthemed.xml
+++ b/java/com/android/dialer/dialpadview/res/layout/dialpad_view_unthemed.xml
@@ -80,7 +80,7 @@
android:background="@drawable/btn_dialpad_key"
android:contentDescription="@string/description_dialpad_back"
android:gravity="center"
- android:src="@drawable/ic_close_black_24dp"
+ android:src="@drawable/quantum_ic_close_white_24"
android:tint="?attr/dialpad_icon_tint"
android:tintMode="src_in"
android:visibility="gone"/>
@@ -95,7 +95,7 @@
android:background="@drawable/btn_dialpad_key"
android:contentDescription="@string/description_dialpad_overflow"
android:gravity="center"
- android:src="@drawable/ic_overflow_menu"
+ android:src="@drawable/quantum_ic_more_vert_white_24"
android:tint="?attr/dialpad_icon_tint"
android:tintMode="src_in"
android:visibility="gone"/>
@@ -129,7 +129,7 @@
android:paddingRight="@dimen/dialpad_digits_padding"
android:background="@drawable/btn_dialpad_key"
android:contentDescription="@string/description_delete_button"
- android:src="@drawable/ic_dialpad_delete"
+ android:src="@drawable/quantum_ic_backspace_white_24"
android:state_enabled="false"
android:tint="?attr/dialpad_icon_tint"
android:tintMode="src_in"/>
diff --git a/java/com/android/dialer/dialpadview/res/values-de/strings.xml b/java/com/android/dialer/dialpadview/res/values-de/strings.xml
index b3b13fb2f..c93ce4d4f 100644
--- a/java/com/android/dialer/dialpadview/res/values-de/strings.xml
+++ b/java/com/android/dialer/dialpadview/res/values-de/strings.xml
@@ -21,5 +21,5 @@
<string name="description_dialpad_overflow" msgid="5984341386518189787">"Mehr Optionen"</string>
<string name="description_delete_button" msgid="8431313818404527096">"Rücktaste"</string>
<string name="description_image_button_plus" msgid="8936338119824589388">"Plus"</string>
- <string name="description_voicemail_button" msgid="4187006295368768215">"Mailbox-Nachricht"</string>
+ <string name="description_voicemail_button" msgid="4187006295368768215">"Mailboxnachricht"</string>
</resources>
diff --git a/java/com/android/dialer/interactions/PhoneNumberInteraction.java b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
index b797629dc..f333419ba 100644
--- a/java/com/android/dialer/interactions/PhoneNumberInteraction.java
+++ b/java/com/android/dialer/interactions/PhoneNumberInteraction.java
@@ -193,14 +193,13 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
* numbers have been queried for. The activity must implement {@link InteractionErrorListener}
* and {@link DisambigDialogDismissedListener}.
* @param isVideoCall {@code true} if the call is a video call, {@code false} otherwise.
- * @return true if the necessary permissions were found to start the interaction, false otherwise
*/
- public static boolean startInteractionForPhoneCall(
+ public static void startInteractionForPhoneCall(
TransactionSafeActivity activity,
Uri uri,
boolean isVideoCall,
CallSpecificAppData callSpecificAppData) {
- return new PhoneNumberInteraction(
+ new PhoneNumberInteraction(
activity, ContactDisplayUtils.INTERACTION_CALL, isVideoCall, callSpecificAppData)
.startInteraction(uri);
}
@@ -214,9 +213,8 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
* Initiates the interaction to result in either a phone call or sms message for a contact.
*
* @param uri Contact Uri
- * @return true if the necessary permissions were found to start the interaction, false otherwise
*/
- private boolean startInteraction(Uri uri) {
+ private void startInteraction(Uri uri) {
// It's possible for a shortcut to have been created, and then permissions revoked. To avoid a
// crash when the user tries to use such a shortcut, check for this condition and ask the user
// for the permission.
@@ -225,7 +223,7 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
LogUtil.i("PhoneNumberInteraction.startInteraction", "No phone permissions");
ActivityCompat.requestPermissions(
(Activity) mContext, new String[] {Manifest.permission.CALL_PHONE}, REQUEST_CALL_PHONE);
- return false;
+ return;
}
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
@@ -234,7 +232,7 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
(Activity) mContext,
new String[] {Manifest.permission.READ_CONTACTS},
REQUEST_READ_CONTACTS);
- return false;
+ return;
}
if (mLoader != null) {
@@ -260,7 +258,6 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
mContext, queryUri, PHONE_NUMBER_PROJECTION, PHONE_NUMBER_SELECTION, null, null);
mLoader.registerListener(0, this);
mLoader.startLoading();
- return true;
}
@Override
@@ -353,6 +350,7 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
final Activity activity = (Activity) mContext;
if (activity.isDestroyed()) {
// Check whether the activity is still running
+ LogUtil.i("PhoneNumberInteraction.showDisambiguationDialog", "activity destroyed");
return;
}
try {
@@ -365,6 +363,7 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
} catch (IllegalStateException e) {
// ignore to be safe. Shouldn't happen because we checked the
// activity wasn't destroyed, but to be safe.
+ LogUtil.e("PhoneNumberInteraction.showDisambiguationDialog", "caught exception", e);
}
}
diff --git a/java/com/android/dialer/lightbringer/Lightbringer.java b/java/com/android/dialer/lightbringer/Lightbringer.java
new file mode 100644
index 000000000..8caafda7e
--- /dev/null
+++ b/java/com/android/dialer/lightbringer/Lightbringer.java
@@ -0,0 +1,47 @@
+/*
+ * 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.lightbringer;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+public interface Lightbringer {
+
+ @MainThread
+ boolean isReachable(@NonNull Context context, @NonNull String number);
+
+ @MainThread
+ Intent getIntent(@NonNull Context context, @NonNull String number);
+
+ @MainThread
+ void registerListener(@NonNull LightbringerListener listener);
+
+ @MainThread
+ void unregisterListener(@NonNull LightbringerListener listener);
+
+ @Nullable
+ @MainThread
+ ComponentName getPhoneAccountComponentName(@NonNull Context context);
+
+ @NonNull
+ @MainThread
+ String getPackageName(@NonNull Context context);
+}
diff --git a/java/com/android/dialer/lightbringer/LightbringerComponent.java b/java/com/android/dialer/lightbringer/LightbringerComponent.java
new file mode 100644
index 000000000..5bb342406
--- /dev/null
+++ b/java/com/android/dialer/lightbringer/LightbringerComponent.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.lightbringer;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import com.android.dialer.inject.HasRootComponent;
+import dagger.Subcomponent;
+
+/**
+ */
+@Subcomponent
+public abstract class LightbringerComponent {
+
+ @NonNull
+ public abstract Lightbringer getLightbringer();
+
+ public static LightbringerComponent get(Context context) {
+ return ((HasComponent) ((HasRootComponent) context.getApplicationContext()).component())
+ .lightbringerComponent();
+ }
+
+ /** Used to refer to the root application component. */
+ public interface HasComponent {
+ LightbringerComponent lightbringerComponent();
+ }
+}
diff --git a/java/com/android/dialer/lightbringer/LightbringerListener.java b/java/com/android/dialer/lightbringer/LightbringerListener.java
new file mode 100644
index 000000000..90fffb349
--- /dev/null
+++ b/java/com/android/dialer/lightbringer/LightbringerListener.java
@@ -0,0 +1,21 @@
+/*
+ * 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.lightbringer;
+
+public interface LightbringerListener {
+ void onLightbringerStateChanged();
+}
diff --git a/java/com/android/dialer/lightbringer/stub/LightbringerStub.java b/java/com/android/dialer/lightbringer/stub/LightbringerStub.java
new file mode 100644
index 000000000..f9bb4cd6c
--- /dev/null
+++ b/java/com/android/dialer/lightbringer/stub/LightbringerStub.java
@@ -0,0 +1,59 @@
+/*
+ * 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.lightbringer.stub;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.support.annotation.NonNull;
+import com.android.dialer.common.Assert;
+import com.android.dialer.lightbringer.Lightbringer;
+import com.android.dialer.lightbringer.LightbringerListener;
+import javax.inject.Inject;
+
+public class LightbringerStub implements Lightbringer {
+
+ @Inject
+ public LightbringerStub() {}
+
+ @Override
+ public boolean isReachable(Context context, String number) {
+ return false;
+ }
+
+ @Override
+ public Intent getIntent(Context context, String number) {
+ return null;
+ }
+
+ @Override
+ public void registerListener(LightbringerListener listener) {}
+
+ @Override
+ public void unregisterListener(LightbringerListener listener) {}
+
+ @Override
+ public ComponentName getPhoneAccountComponentName(Context context) {
+ return null;
+ }
+
+ @NonNull
+ @Override
+ public String getPackageName(@NonNull Context context) {
+ throw Assert.createUnsupportedOperationFailException();
+ }
+}
diff --git a/java/com/android/dialer/lightbringer/stub/StubLightbringerModule.java b/java/com/android/dialer/lightbringer/stub/StubLightbringerModule.java
new file mode 100644
index 000000000..e0be0a270
--- /dev/null
+++ b/java/com/android/dialer/lightbringer/stub/StubLightbringerModule.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.lightbringer.stub;
+
+import com.android.dialer.lightbringer.Lightbringer;
+import dagger.Binds;
+import dagger.Module;
+import javax.inject.Singleton;
+
+@Module
+public abstract class StubLightbringerModule {
+
+ @Binds
+ @Singleton
+ public abstract Lightbringer bindsLightbringer(LightbringerStub lightbringer);
+}
diff --git a/java/com/android/dialer/logging/nano/DialerImpression.java b/java/com/android/dialer/logging/nano/DialerImpression.java
index 717b43903..9f3f96116 100644
--- a/java/com/android/dialer/logging/nano/DialerImpression.java
+++ b/java/com/android/dialer/logging/nano/DialerImpression.java
@@ -179,6 +179,18 @@ public final class DialerImpression
public static final int VVM_TRANSCRIPTION_DOWNLOADED = 1159;
public static final int VVM_CHANGE_AIRPLANE_MODE_CLICKED = 1160;
public static final int VVM_CALL_VOICEMAIL_CLICKED = 1161;
+ public static final int VVM_QUOTA_CHECK_UNAVAILABLE = 1162;
+ public static final int EMERGENCY_NEW_EMERGENCY_CALL = 1163;
+ public static final int EMERGENCY_CALLBACK = 1164;
+ public static final int EMERGENCY_NO_LOCATION_PERMISSION = 1165;
+ public static final int EMERGENCY_BATTERY_TOO_LOW_TO_GET_LOCATION = 1166;
+ public static final int EMERGENCY_CANT_GET_LOCATION = 1167;
+ public static final int EMERGENCY_STALE_LOCATION = 1168;
+ public static final int EMERGENCY_INACCURATE_LOCATION = 1169;
+ public static final int EMERGENCY_GOT_LOCATION = 1170;
+ public static final int EMERGENCY_GOT_ADDRESS = 1171;
+ public static final int EMERGENCY_GOT_MAP = 1172;
+ public static final int EMERGENCY_LAUNCHED_MAP = 1173;
}
private static volatile DialerImpression[] _emptyArray;
diff --git a/java/com/android/dialer/notification/GroupedNotificationUtil.java b/java/com/android/dialer/notification/GroupedNotificationUtil.java
index 63ea51739..3925248d5 100644
--- a/java/com/android/dialer/notification/GroupedNotificationUtil.java
+++ b/java/com/android/dialer/notification/GroupedNotificationUtil.java
@@ -41,7 +41,7 @@ public final class GroupedNotificationUtil {
int id,
@NonNull String summaryTag) {
if (tag == null) {
- // Clear all missed call notifications
+ // Clear all grouped notifications
for (StatusBarNotification notification : notificationManager.getActiveNotifications()) {
if (notification.getId() == id) {
notificationManager.cancel(notification.getTag(), id);
@@ -50,7 +50,7 @@ public final class GroupedNotificationUtil {
} else {
notificationManager.cancel(tag, id);
- // See if other non-summary missed call notifications exist, and if not then clear the summary
+ // 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())) {
diff --git a/java/com/android/dialer/notification/NotificationChannelManager.java b/java/com/android/dialer/notification/NotificationChannelManager.java
index 5cae3d8c8..f23c02ad3 100644
--- a/java/com/android/dialer/notification/NotificationChannelManager.java
+++ b/java/com/android/dialer/notification/NotificationChannelManager.java
@@ -53,25 +53,15 @@ public 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).
*
- * <p>phoneAccount should only be null if channelName is {@link Channel#MISC}.
+ * <p>phoneAccount should only be null if channelName is {@link Channel#MISC} or {@link
+ * Channel#MISSED_CALL} since these do not have account-specific settings.
*/
public static void applyChannel(
@NonNull Notification.Builder notification,
@NonNull Context context,
@Channel String channelName,
@Nullable PhoneAccountHandle phoneAccount) {
- if (phoneAccount == null) {
- if (!Channel.MISC.equals(channelName)) {
- IllegalArgumentException exception =
- new IllegalArgumentException(
- "Phone account handle must not be null unless on Channel.MISC");
- if (BuildType.get() >= BuildType.RELEASE) {
- LogUtil.e("NotificationChannelManager.applyChannel", null, exception);
- } else {
- throw exception;
- }
- }
- }
+ checkNullity(channelName, phoneAccount);
if (BuildCompat.isAtLeastO()) {
NotificationChannel channel =
@@ -80,6 +70,33 @@ public class NotificationChannelManager {
}
}
+ 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.MISC:
+ case Channel.MISSED_CALL:
+ return true;
+ default:
+ return false;
+ }
+ }
+
/** The base Channel IDs for {@link NotificationChannel} */
@Retention(RetentionPolicy.SOURCE)
@StringDef({
@@ -136,7 +153,7 @@ public class NotificationChannelManager {
(account == null) ? phoneAccountHandle.getId() : account.getLabel().toString());
getNotificationManager(context)
.createNotificationChannelGroup(group); // No-op if already exists
- } else if (!Channel.MISC.equals(channelName)) {
+ } else if (!channelAllowsNullPhoneAccountHandle(channelName)) {
LogUtil.w(
"NotificationChannelManager.createChannel",
"Null PhoneAccountHandle with channel " + channelName);
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 a9dbd5b94..18a41291f 100644
--- a/java/com/android/dialer/notification/res/values-de/strings.xml
+++ b/java/com/android/dialer/notification/res/values-de/strings.xml
@@ -20,7 +20,7 @@
<string name="notification_channel_incoming_call" msgid="2478740764736158630">"Eingehende Anrufe"</string>
<string name="notification_channel_ongoing_call" msgid="5593444445363940672">"Laufende Anrufe"</string>
<string name="notification_channel_missed_call" msgid="5820652855908217695">"Entgangene Anrufe"</string>
- <string name="notification_channel_voicemail" msgid="9206363659849426204">"Mailbox-Nachrichten"</string>
+ <string name="notification_channel_voicemail" msgid="9206363659849426204">"Mailboxnachrichten"</string>
<string name="notification_channel_external_call" msgid="2200143959948071132">"Externe Anrufe"</string>
<string name="notification_channel_misc" msgid="5181419532951960166">"Sonstiges"</string>
</resources>
diff --git a/java/com/android/dialer/oem/AndroidManifest.xml b/java/com/android/dialer/oem/AndroidManifest.xml
index 685bc3d20..9e0373ab4 100644
--- a/java/com/android/dialer/oem/AndroidManifest.xml
+++ b/java/com/android/dialer/oem/AndroidManifest.xml
@@ -13,6 +13,9 @@
limitations under the License.
-->
-<manifest
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.dialer.oem">
+ <!-- This is used for querying Cequint caller id. -->
+ <uses-permission android:name="com.cequint.ecid.CALLER_ID_LOOKUP"/>
+
</manifest> \ No newline at end of file
diff --git a/java/com/android/dialer/oem/CequintCallerIdManager.java b/java/com/android/dialer/oem/CequintCallerIdManager.java
index 094cc842d..c8e6010a3 100644
--- a/java/com/android/dialer/oem/CequintCallerIdManager.java
+++ b/java/com/android/dialer/oem/CequintCallerIdManager.java
@@ -22,6 +22,7 @@ import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build.VERSION_CODES;
+import android.support.annotation.AnyThread;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.WorkerThread;
@@ -57,6 +58,8 @@ public class CequintCallerIdManager {
private static final Uri CONTENT_URI_FOR_INCALL =
Uri.parse("content://" + PROVIDER_NAME + "/incalllookup");
+ private static final String[] EMPTY_PROJECTION = new String[] {};
+
// Column names in Cequint provider.
private static final String CITY_NAME = "cid_pCityName";
private static final String STATE_NAME = "cid_pStateName";
@@ -72,9 +75,9 @@ public class CequintCallerIdManager {
// TODO: Revisit it and maybe remove it if it's not necessary.
private static final ConcurrentHashMap<String, CequintCallerIdContact> callLogCache =
new ConcurrentHashMap<>();
- // Cache for incall lookup. Key is phone number + "i" for incoming call or "o" for outgoing call.
- // TODO: Revisit it and maybe remove it if it's not necessary.
- private static final ConcurrentHashMap<String, CequintCallerIdContact> incallCache =
+ private static final ConcurrentHashMap<String, CequintCallerIdContact> incallIncomingCallCache =
+ new ConcurrentHashMap<>();
+ private static final ConcurrentHashMap<String, CequintCallerIdContact> incallOutgoingCallCache =
new ConcurrentHashMap<>();
private static boolean hasRegisteredContentObserver;
private static boolean hasAlreadyCheckedCequintCallerIdPackage;
@@ -94,6 +97,7 @@ public class CequintCallerIdManager {
}
/** Check whether Cequint Caller Id provider package is available and enabled. */
+ @AnyThread
public static synchronized boolean isCequintCallerIdEnabled(@NonNull Context context) {
if (!ConfigProviderBindings.get(context).getBoolean(CONFIG_CALLER_ID_ENABLED, true)) {
return false;
@@ -113,13 +117,13 @@ public class CequintCallerIdManager {
}
@WorkerThread
+ @Nullable
public static CequintCallerIdContact getCequintCallerIdContact(Context context, String number) {
Assert.isWorkerThread();
LogUtil.d(
"CequintCallerIdManager.getCequintCallerIdContact",
"number: %s",
LogUtil.sanitizePhoneNumber(number));
- registerContentObserver(context);
if (callLogCache.containsKey(number)) {
return callLogCache.get(number);
}
@@ -136,6 +140,7 @@ public class CequintCallerIdManager {
}
@WorkerThread
+ @Nullable
public static CequintCallerIdContact getCequintCallerIdContactForInCall(
Context context, String number, String cnapName, boolean isIncoming) {
Assert.isWorkerThread();
@@ -146,9 +151,10 @@ public class CequintCallerIdManager {
LogUtil.sanitizePii(cnapName),
isIncoming);
registerContentObserver(context);
- String key = number + (isIncoming ? "i" : "o");
- if (incallCache.containsKey(key)) {
- return incallCache.get(key);
+ if (isIncoming && incallIncomingCallCache.containsKey(number)) {
+ return incallIncomingCallCache.get(number);
+ } else if (!isIncoming && incallOutgoingCallCache.containsKey(number)) {
+ return incallOutgoingCallCache.get(number);
}
int flag = 0;
if (isIncoming) {
@@ -161,7 +167,11 @@ public class CequintCallerIdManager {
CequintCallerIdContact cequintCallerIdContact =
lookup(context, CONTENT_URI_FOR_INCALL, number, flags);
if (cequintCallerIdContact != null) {
- incallCache.put(key, cequintCallerIdContact);
+ if (isIncoming) {
+ incallIncomingCallCache.put(number, cequintCallerIdContact);
+ } else {
+ incallOutgoingCallCache.put(number, cequintCallerIdContact);
+ }
}
return cequintCallerIdContact;
}
@@ -169,11 +179,13 @@ public class CequintCallerIdManager {
@WorkerThread
@Nullable
private static CequintCallerIdContact lookup(
- Context context, Uri uri, String number, String[] flags) {
+ Context context, Uri uri, @NonNull String number, String[] flags) {
Assert.isWorkerThread();
+ Assert.isNotNull(number);
// Cequint is using custom arguments for content provider. See more details in b/35766080.
- try (Cursor cursor = context.getContentResolver().query(uri, null, number, flags, null)) {
+ try (Cursor cursor =
+ context.getContentResolver().query(uri, EMPTY_PROJECTION, number, flags, null)) {
if (cursor != null && cursor.moveToFirst()) {
String city = getString(cursor, cursor.getColumnIndex(CITY_NAME));
String state = getString(cursor, cursor.getColumnIndex(STATE_NAME));
@@ -203,6 +215,9 @@ public class CequintCallerIdManager {
LogUtil.d("CequintCallerIdManager.lookup", "No CequintCallerIdContact found");
return null;
}
+ } catch (Exception e) {
+ LogUtil.e("CequintCallerIdManager.lookup", "exception on query", e);
+ return null;
}
}
@@ -269,7 +284,7 @@ public class CequintCallerIdManager {
return geoDescription;
}
- private static void registerContentObserver(Context context) {
+ private static synchronized void registerContentObserver(Context context) {
if (hasRegisteredContentObserver) {
return;
}
@@ -281,7 +296,6 @@ public class CequintCallerIdManager {
}
};
- context.getContentResolver().registerContentObserver(CONTENT_URI, true, contentObserver);
context
.getContentResolver()
.registerContentObserver(CONTENT_URI_FOR_INCALL, true, contentObserver);
@@ -289,8 +303,8 @@ public class CequintCallerIdManager {
}
private static void invalidateCache() {
- callLogCache.clear();
- incallCache.clear();
+ incallIncomingCallCache.clear();
+ incallOutgoingCallCache.clear();
}
private CequintCallerIdManager() {}
diff --git a/java/com/android/dialer/oem/MotorolaUtils.java b/java/com/android/dialer/oem/MotorolaUtils.java
index d0589103d..db2b8909a 100644
--- a/java/com/android/dialer/oem/MotorolaUtils.java
+++ b/java/com/android/dialer/oem/MotorolaUtils.java
@@ -41,10 +41,10 @@ public class MotorolaUtils {
private static final String WIFI_CALL_PACKAGE_NAME = "com.motorola.sprintwfc";
// Feature flag indicates it's a HD call, currently this is only used by Motorola system build.
- // TODO(b/35359461): Upstream and move it to android.provider.CallLog.
- private static final int FEATURES_HD_CALL = 0x10000000;
+ // TODO(b/35359461): Use reference to android.provider.CallLog once it's in new SDK.
+ private static final int FEATURES_HD_CALL = 0x4;
// Feature flag indicates it's a WiFi call, currently this is only used by Motorola system build.
- private static final int FEATURES_WIFI = 0x80000000;
+ private static final int FEATURES_WIFI = 0x8;
private static boolean hasCheckedSprintWifiCall;
private static boolean supportSprintWifiCall;
diff --git a/java/com/android/dialer/persistentlog/PersistentLogFileHandler.java b/java/com/android/dialer/persistentlog/PersistentLogFileHandler.java
new file mode 100644
index 000000000..bb51fa881
--- /dev/null
+++ b/java/com/android/dialer/persistentlog/PersistentLogFileHandler.java
@@ -0,0 +1,198 @@
+/*
+ * 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.persistentlog;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Build.VERSION_CODES;
+import android.preference.PreferenceManager;
+import android.support.annotation.AnyThread;
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.WorkerThread;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Handles serialization of byte arrays and read/write them to multiple rotating files. If a logText
+ * file exceeds {@code fileSizeLimit} after a write, a new file will be used. if the total number of
+ * files exceeds {@code fileCountLimit} the oldest ones will be deleted. The logs are stored in the
+ * cache but the file index is stored in the data (clearing data will also clear the cache). The
+ * logs will be stored under /cache_dir/persistent_log/{@code subfolder}, so multiple independent
+ * logs can be created.
+ *
+ * <p>This class is NOT thread safe. All methods expect the constructor must be called on the same
+ * worker thread.
+ */
+@SuppressWarnings("AndroidApiChecker") // lambdas
+@TargetApi(VERSION_CODES.N)
+final class PersistentLogFileHandler {
+
+ private static final String LOG_DIRECTORY = "persistent_log";
+ private static final String NEXT_FILE_INDEX_PREFIX = "persistent_long_next_file_index_";
+
+ private File logDirectory;
+ private final String subfolder;
+ private final int fileSizeLimit;
+ private final int fileCountLimit;
+
+ private SharedPreferences sharedPreferences;
+
+ private File outputFile;
+
+ @MainThread
+ PersistentLogFileHandler(String subfolder, int fileSizeLimit, int fileCountLimit) {
+ this.subfolder = subfolder;
+ this.fileSizeLimit = fileSizeLimit;
+ this.fileCountLimit = fileCountLimit;
+ }
+
+ /** Must be called right after the logger thread is created. */
+ @WorkerThread
+ void initialize(Context context) {
+ logDirectory = new File(new File(context.getCacheDir(), LOG_DIRECTORY), subfolder);
+ sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
+ }
+
+ /**
+ * Write the list of byte arrays to the current log file, prefixing each entry with its' length. A
+ * new file will only be selected when the batch is completed, so the resulting file might be
+ * larger then {@code fileSizeLimit}
+ */
+ @WorkerThread
+ void writeLogs(List<byte[]> logs) throws IOException {
+ if (outputFile == null) {
+ selectNextFileToWrite();
+ }
+ outputFile.createNewFile();
+ try (DataOutputStream outputStream =
+ new DataOutputStream(new FileOutputStream(outputFile, true))) {
+ for (byte[] log : logs) {
+ outputStream.writeInt(log.length);
+ outputStream.write(log);
+ }
+ outputStream.close();
+ if (outputFile.length() > fileSizeLimit) {
+ selectNextFileToWrite();
+ }
+ }
+ }
+
+ /** Concatenate all log files in chronicle order and return a byte array. */
+ @WorkerThread
+ @NonNull
+ private byte[] readBlob() throws IOException {
+ File[] files = getLogFiles();
+
+ ByteBuffer byteBuffer =
+ ByteBuffer.allocate(Arrays.stream(files).mapToInt(file -> (int) file.length()).sum());
+ for (File file : files) {
+ byteBuffer.put(readAllBytes(file));
+ }
+ return byteBuffer.array();
+ }
+
+ /** Parses the content of all files back to individual byte arrays. */
+ @WorkerThread
+ @NonNull
+ List<byte[]> getLogs() throws IOException {
+ byte[] blob = readBlob();
+ List<byte[]> logs = new ArrayList<>();
+ try (DataInputStream input = new DataInputStream(new ByteArrayInputStream(blob))) {
+ byte[] log = readLog(input);
+ while (log != null) {
+ logs.add(log);
+ log = readLog(input);
+ }
+ }
+ return logs;
+ }
+
+ @WorkerThread
+ private void selectNextFileToWrite() throws IOException {
+ File[] files = getLogFiles();
+
+ if (files.length == 0 || files[files.length - 1].length() > fileSizeLimit) {
+ if (files.length >= fileCountLimit) {
+ for (int i = 0; i <= files.length - fileCountLimit; i++) {
+ files[i].delete();
+ }
+ }
+ outputFile = new File(logDirectory, String.valueOf(getAndIncrementNextFileIndex()));
+ } else {
+ outputFile = files[files.length - 1];
+ }
+ }
+
+ @NonNull
+ @WorkerThread
+ private File[] getLogFiles() {
+ logDirectory.mkdirs();
+ File[] files = logDirectory.listFiles();
+ Arrays.sort(
+ files,
+ (File lhs, File rhs) ->
+ Long.compare(Long.valueOf(lhs.getName()), Long.valueOf(rhs.getName())));
+ return files;
+ }
+
+ @Nullable
+ @WorkerThread
+ private static byte[] readLog(DataInputStream inputStream) throws IOException {
+ try {
+ byte[] data = new byte[inputStream.readInt()];
+ inputStream.read(data);
+ return data;
+ } catch (EOFException e) {
+ return null;
+ }
+ }
+
+ @NonNull
+ @WorkerThread
+ private static byte[] readAllBytes(File file) throws IOException {
+ byte[] result = new byte[(int) file.length()];
+ try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) {
+ randomAccessFile.readFully(result);
+ }
+ return result;
+ }
+
+ @WorkerThread
+ private int getAndIncrementNextFileIndex() {
+ int index = sharedPreferences.getInt(getNextFileKey(), 0);
+ sharedPreferences.edit().putInt(getNextFileKey(), index + 1).commit();
+ return index;
+ }
+
+ @AnyThread
+ private String getNextFileKey() {
+ return NEXT_FILE_INDEX_PREFIX + subfolder;
+ }
+}
diff --git a/java/com/android/dialer/persistentlog/PersistentLogger.java b/java/com/android/dialer/persistentlog/PersistentLogger.java
new file mode 100644
index 000000000..049eb9687
--- /dev/null
+++ b/java/com/android/dialer/persistentlog/PersistentLogger.java
@@ -0,0 +1,170 @@
+/*
+ * 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.persistentlog;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.support.annotation.AnyThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.VisibleForTesting;
+import android.support.annotation.WorkerThread;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * Logs data that is persisted across app termination and device reboot. The logs are stored as
+ * rolling files in cache with a limit of {@link #LOG_FILE_SIZE_LIMIT} * {@link
+ * #LOG_FILE_COUNT_LIMIT}. The log writing is batched and there is a {@link #FLUSH_DELAY_MILLIS}
+ * delay before the logs are committed to disk to avoid excessive IO. If the app is terminated
+ * before the logs are committed it will be lost. {@link
+ * com.google.android.apps.dialer.crashreporter.SilentCrashReporter} is expected to handle such
+ * cases.
+ *
+ * <p>{@link #logText(String, String)} should be used to log ad-hoc text logs. TODO: switch
+ * to structured logging
+ */
+public final class PersistentLogger {
+
+ private static final int FLUSH_DELAY_MILLIS = 200;
+ private static final String LOG_FOLDER = "plain_text";
+ private static final int MESSAGE_FLUSH = 1;
+
+ @VisibleForTesting static final int LOG_FILE_SIZE_LIMIT = 64 * 1024;
+ @VisibleForTesting static final int LOG_FILE_COUNT_LIMIT = 8;
+
+ private static PersistentLogFileHandler fileHandler;
+
+ private static HandlerThread loggerThread;
+ private static Handler loggerThreadHandler;
+
+ private static final LinkedBlockingQueue<byte[]> messageQueue = new LinkedBlockingQueue<>();
+
+ private PersistentLogger() {}
+
+ public static void initialize(Context context) {
+ fileHandler =
+ new PersistentLogFileHandler(LOG_FOLDER, LOG_FILE_SIZE_LIMIT, LOG_FILE_COUNT_LIMIT);
+ loggerThread = new HandlerThread("PersistentLogger");
+ loggerThread.start();
+ loggerThreadHandler =
+ new Handler(
+ loggerThread.getLooper(),
+ (message) -> {
+ if (message.what == MESSAGE_FLUSH) {
+ if (messageQueue.isEmpty()) {
+ return true;
+ }
+ loggerThreadHandler.removeMessages(MESSAGE_FLUSH);
+ List<byte[]> messages = new ArrayList<>();
+ messageQueue.drainTo(messages);
+ try {
+ fileHandler.writeLogs(messages);
+ } catch (IOException e) {
+ LogUtil.e("PersistentLogger.MESSAGE_FLUSH", "error writing message", e);
+ }
+ }
+ return true;
+ });
+ loggerThreadHandler.post(() -> fileHandler.initialize(context));
+ }
+
+ static HandlerThread getLoggerThread() {
+ return loggerThread;
+ }
+
+ @AnyThread
+ public static void logText(String tag, String string) {
+ log(buildTextLog(tag, string));
+ }
+
+ @VisibleForTesting
+ @AnyThread
+ static void log(byte[] data) {
+ messageQueue.add(data);
+ loggerThreadHandler.sendEmptyMessageDelayed(MESSAGE_FLUSH, FLUSH_DELAY_MILLIS);
+ }
+
+ /** Dump the log as human readable string. Blocks until the dump is finished. */
+ @NonNull
+ @WorkerThread
+ public static String dumpLogToString() {
+ Assert.isWorkerThread();
+ DumpStringRunnable dumpStringRunnable = new DumpStringRunnable();
+ loggerThreadHandler.post(dumpStringRunnable);
+ try {
+ return dumpStringRunnable.get();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return "Cannot dump logText: " + e;
+ }
+ }
+
+ private static class DumpStringRunnable implements Runnable {
+ private String result;
+ private final CountDownLatch latch = new CountDownLatch(1);
+
+ @Override
+ public void run() {
+ result = dumpLogToStringInternal();
+ latch.countDown();
+ }
+
+ public String get() throws InterruptedException {
+ latch.await();
+ return result;
+ }
+ }
+
+ @NonNull
+ @WorkerThread
+ private static String dumpLogToStringInternal() {
+ StringBuilder result = new StringBuilder();
+ List<byte[]> logs;
+ try {
+ logs = readLogs();
+ } catch (IOException e) {
+ return "Cannot dump logText: " + e;
+ }
+
+ for (byte[] log : logs) {
+ result.append(new String(log, StandardCharsets.UTF_8)).append("\n");
+ }
+ return result.toString();
+ }
+
+ @NonNull
+ @WorkerThread
+ @VisibleForTesting
+ static List<byte[]> readLogs() throws IOException {
+ Assert.isWorkerThread();
+ return fileHandler.getLogs();
+ }
+
+ private static byte[] buildTextLog(String tag, String string) {
+ Calendar c = Calendar.getInstance();
+ return String.format("%tm-%td %tH:%tM:%tS.%tL - %s - %s", c, c, c, c, c, c, tag, string)
+ .getBytes(StandardCharsets.UTF_8);
+ }
+}
diff --git a/java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java b/java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java
index f443d56fb..e589a6882 100644
--- a/java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java
+++ b/java/com/android/dialer/phonenumbercache/CachedNumberLookupService.java
@@ -18,10 +18,13 @@ package com.android.dialer.phonenumbercache;
import android.content.Context;
import android.net.Uri;
+import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.WorkerThread;
import java.io.InputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
public interface CachedNumberLookupService {
@@ -66,11 +69,23 @@ public interface CachedNumberLookupService {
int SOURCE_TYPE_PLACES = 3;
int SOURCE_TYPE_PROFILE = 4;
int SOURCE_TYPE_CNAP = 5;
+ int SOURCE_TYPE_CEQUINT_CALLER_ID = 6;
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ SOURCE_TYPE_DIRECTORY,
+ SOURCE_TYPE_EXTENDED,
+ SOURCE_TYPE_PLACES,
+ SOURCE_TYPE_PROFILE,
+ SOURCE_TYPE_CNAP,
+ SOURCE_TYPE_CEQUINT_CALLER_ID
+ })
+ public @interface ContactSourceType {}
@NonNull
ContactInfo getContactInfo();
- void setSource(int sourceType, String name, long directoryId);
+ void setSource(@ContactSourceType int sourceType, String name, long directoryId);
void setDirectorySource(String name, long directoryId);
diff --git a/java/com/android/dialer/phonenumbercache/ContactInfo.java b/java/com/android/dialer/phonenumbercache/ContactInfo.java
index 03240cc62..dab5e4b4c 100644
--- a/java/com/android/dialer/phonenumbercache/ContactInfo.java
+++ b/java/com/android/dialer/phonenumbercache/ContactInfo.java
@@ -20,6 +20,7 @@ import android.net.Uri;
import android.text.TextUtils;
import com.android.contacts.common.ContactsUtils.UserType;
import com.android.contacts.common.util.UriUtils;
+import com.android.dialer.phonenumbercache.CachedNumberLookupService.CachedContactInfo.ContactSourceType;
/** Information for a contact as needed by the Call Log. */
public class ContactInfo {
@@ -57,7 +58,7 @@ public class ContactInfo {
public boolean isBadData;
public String objectId;
public @UserType long userType;
- public int sourceType = 0;
+ public @ContactSourceType int sourceType = 0;
/** @see android.provider.ContactsContract.CommonDataKinds.Phone#CARRIER_PRESENCE */
public int carrierPresence;
diff --git a/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java b/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java
index 66ddd06fd..dc11c1b21 100644
--- a/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java
+++ b/java/com/android/dialer/phonenumbercache/ContactInfoHelper.java
@@ -31,6 +31,7 @@ import android.provider.ContactsContract.Directory;
import android.provider.ContactsContract.DisplayNameSources;
import android.provider.ContactsContract.PhoneLookup;
import android.support.annotation.Nullable;
+import android.support.annotation.WorkerThread;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import com.android.contacts.common.ContactsUtils;
@@ -38,6 +39,7 @@ import com.android.contacts.common.ContactsUtils.UserType;
import com.android.contacts.common.compat.DirectoryCompat;
import com.android.contacts.common.util.Constants;
import com.android.contacts.common.util.UriUtils;
+import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.oem.CequintCallerIdManager;
import com.android.dialer.oem.CequintCallerIdManager.CequintCallerIdContact;
@@ -596,7 +598,9 @@ public class ContactInfoHelper {
* Update ContactInfo by querying to Cequint Caller ID. Only name, geoDescription and photo uri
* will be updated if available.
*/
+ @WorkerThread
public void updateFromCequintCallerId(ContactInfo info, String number) {
+ Assert.isWorkerThread();
if (!CequintCallerIdManager.isCequintCallerIdEnabled(mContext)) {
return;
}
@@ -605,13 +609,14 @@ public class ContactInfoHelper {
if (cequintCallerIdContact == null) {
return;
}
- if (!TextUtils.isEmpty(cequintCallerIdContact.name)) {
+ if (TextUtils.isEmpty(info.name) && !TextUtils.isEmpty(cequintCallerIdContact.name)) {
info.name = cequintCallerIdContact.name;
}
if (!TextUtils.isEmpty(cequintCallerIdContact.geoDescription)) {
info.geoDescription = cequintCallerIdContact.geoDescription;
+ info.sourceType = CachedContactInfo.SOURCE_TYPE_CEQUINT_CALLER_ID;
}
- if (cequintCallerIdContact.imageUrl != null) {
+ if (info.photoUri == null && cequintCallerIdContact.imageUrl != null) {
info.photoUri = UriUtils.parseUriOrNull(cequintCallerIdContact.imageUrl);
}
}
diff --git a/java/com/android/dialer/postcall/PostCallActivity.java b/java/com/android/dialer/postcall/PostCallActivity.java
index 8da03dcd1..28cf5709e 100644
--- a/java/com/android/dialer/postcall/PostCallActivity.java
+++ b/java/com/android/dialer/postcall/PostCallActivity.java
@@ -27,13 +27,13 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.telephony.SmsManager;
-import android.widget.Toolbar;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.enrichedcall.EnrichedCallCapabilities;
import com.android.dialer.enrichedcall.EnrichedCallComponent;
import com.android.dialer.enrichedcall.EnrichedCallManager;
import com.android.dialer.util.PermissionsUtil;
+import com.android.dialer.widget.DialerToolbar;
import com.android.dialer.widget.MessageFragment;
/** Activity used to send post call messages after a phone call. */
@@ -56,10 +56,7 @@ public class PostCallActivity extends AppCompatActivity implements MessageFragme
super.onCreate(bundle);
setContentView(R.layout.post_call_activity);
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- toolbar.setTitle(getString(R.string.post_call_message));
- toolbar.setNavigationOnClickListener(v -> finish());
-
+ ((DialerToolbar) findViewById(R.id.toolbar)).setTitle(R.string.post_call_message);
useRcs = canUseRcs(getIntent().getStringExtra(KEY_PHONE_NUMBER));
LogUtil.i("PostCallActivity.onCreate", "useRcs: %b", useRcs);
diff --git a/java/com/android/dialer/postcall/res/layout/post_call_activity.xml b/java/com/android/dialer/postcall/res/layout/post_call_activity.xml
index 6ea8126c5..256c110b9 100644
--- a/java/com/android/dialer/postcall/res/layout/post_call_activity.xml
+++ b/java/com/android/dialer/postcall/res/layout/post_call_activity.xml
@@ -26,13 +26,8 @@
android:layout_alignParentBottom="true"
android:background="@color/background_dialer_white"/>
- <Toolbar
- android:id="@+id/toolbar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?attr/actionBarSize"
- android:titleTextAppearance="@style/toolbar_title_text"
- android:subtitleTextAppearance="@style/toolbar_subtitle_text"
- android:navigationIcon="@drawable/quantum_ic_close_white_24"
- android:background="@color/dialer_theme_color"/>
+ <com.android.dialer.widget.DialerToolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
</RelativeLayout> \ No newline at end of file
diff --git a/java/com/android/dialer/shortcuts/CallContactActivity.java b/java/com/android/dialer/shortcuts/CallContactActivity.java
index 40bf97b87..d2c9a760d 100644
--- a/java/com/android/dialer/shortcuts/CallContactActivity.java
+++ b/java/com/android/dialer/shortcuts/CallContactActivity.java
@@ -56,6 +56,12 @@ public class CallContactActivity extends TransactionSafeActivity
}
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ LogUtil.enterBlock("CallContactActivity.onDestroy");
+ }
+
/**
* Attempt to make a call, finishing the activity if the required permissions are already granted.
* If the required permissions are not already granted, the activity is not finished so that the
@@ -64,12 +70,8 @@ public class CallContactActivity extends TransactionSafeActivity
private void makeCall() {
CallSpecificAppData callSpecificAppData = new CallSpecificAppData();
callSpecificAppData.callInitiationType = CallInitiationType.Type.LAUNCHER_SHORTCUT;
- boolean interactionStarted =
- PhoneNumberInteraction.startInteractionForPhoneCall(
- this, contactUri, false /* isVideoCall */, callSpecificAppData);
- if (interactionStarted) {
- finish();
- }
+ PhoneNumberInteraction.startInteractionForPhoneCall(
+ this, contactUri, false /* isVideoCall */, callSpecificAppData);
}
@Override
diff --git a/java/com/android/dialer/shortcuts/res/values/themes.xml b/java/com/android/dialer/shortcuts/res/values/themes.xml
index 085854d89..d38a09a51 100644
--- a/java/com/android/dialer/shortcuts/res/values/themes.xml
+++ b/java/com/android/dialer/shortcuts/res/values/themes.xml
@@ -26,7 +26,7 @@
<style name="CallContactsTheme" parent="Theme.AppCompat.Light">
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">false</item>
- <item name="android:windowBackground">@null</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@null</item>
diff --git a/java/com/android/dialer/simulator/impl/SimulatorActionProvider.java b/java/com/android/dialer/simulator/impl/SimulatorActionProvider.java
index 4acb548a6..8257d9853 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorActionProvider.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorActionProvider.java
@@ -21,17 +21,30 @@ import android.content.Intent;
import android.os.AsyncTask;
import android.provider.VoicemailContract;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.view.ActionProvider;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
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.persistentlog.PersistentLogger;
/** Implements the simulator submenu. */
final class SimulatorActionProvider extends ActionProvider {
@NonNull private final Context context;
+ private static class ShareLogWorker implements Worker<Void, String> {
+
+ @Nullable
+ @Override
+ public String doInBackground(Void unused) {
+ return PersistentLogger.dumpLogToString();
+ }
+ }
+
public SimulatorActionProvider(@NonNull Context context) {
super(Assert.isNotNull(context));
this.context = context;
@@ -82,6 +95,25 @@ final class SimulatorActionProvider extends ActionProvider {
context.sendBroadcast(intent);
return true;
});
+
+ subMenu
+ .add("Share persistent log")
+ .setOnMenuItemClickListener(
+ (item) -> {
+ DialerExecutors.createNonUiTaskBuilder(new ShareLogWorker())
+ .onSuccess(
+ (String log) -> {
+ Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.setType("text/plain");
+ intent.putExtra(Intent.EXTRA_TEXT, log);
+ if (intent.resolveActivity(context.getPackageManager()) != null) {
+ context.startActivity(intent);
+ }
+ })
+ .build()
+ .executeSerial(null);
+ return true;
+ });
}
private void populateDatabase() {
diff --git a/java/com/android/dialer/speeddial/AndroidManifest.xml b/java/com/android/dialer/speeddial/AndroidManifest.xml
new file mode 100644
index 000000000..f4f0d82eb
--- /dev/null
+++ b/java/com/android/dialer/speeddial/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<!--
+ ~ 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
+ -->
+<manifest package="com.android.dialer.speeddial"/>
diff --git a/java/com/android/dialer/speeddial/SpeedDialFragment.java b/java/com/android/dialer/speeddial/SpeedDialFragment.java
new file mode 100644
index 000000000..68ee3888b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/SpeedDialFragment.java
@@ -0,0 +1,44 @@
+/*
+ * 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.speeddial;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/** Favorites fragment. Contents TBD. TODO */
+public class SpeedDialFragment extends Fragment {
+
+ public static SpeedDialFragment newInstance() {
+ return new SpeedDialFragment();
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.fragment_speed_dial, container, false);
+ }
+
+ public boolean hasFrequents() {
+ // TODO
+ return false;
+ }
+}
diff --git a/java/com/android/dialer/speeddial/res/layout/fragment_speed_dial.xml b/java/com/android/dialer/speeddial/res/layout/fragment_speed_dial.xml
new file mode 100644
index 000000000..04e230e4d
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/layout/fragment_speed_dial.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"/>
diff --git a/java/com/android/dialer/speeddial/res/values-af/strings.xml b/java/com/android/dialer/speeddial/res/values-af/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-af/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-am/strings.xml b/java/com/android/dialer/speeddial/res/values-am/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-am/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ar/strings.xml b/java/com/android/dialer/speeddial/res/values-ar/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ar/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-az/strings.xml b/java/com/android/dialer/speeddial/res/values-az/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-az/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-be/strings.xml b/java/com/android/dialer/speeddial/res/values-be/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-be/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-bg/strings.xml b/java/com/android/dialer/speeddial/res/values-bg/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-bg/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-bn/strings.xml b/java/com/android/dialer/speeddial/res/values-bn/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-bn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-bs/strings.xml b/java/com/android/dialer/speeddial/res/values-bs/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-bs/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ca/strings.xml b/java/com/android/dialer/speeddial/res/values-ca/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ca/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-cs/strings.xml b/java/com/android/dialer/speeddial/res/values-cs/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-cs/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-da/strings.xml b/java/com/android/dialer/speeddial/res/values-da/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-da/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-de/strings.xml b/java/com/android/dialer/speeddial/res/values-de/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-de/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-el/strings.xml b/java/com/android/dialer/speeddial/res/values-el/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-el/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-en-rAU/strings.xml b/java/com/android/dialer/speeddial/res/values-en-rAU/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-en-rAU/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-en-rGB/strings.xml b/java/com/android/dialer/speeddial/res/values-en-rGB/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-en-rGB/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-en-rIN/strings.xml b/java/com/android/dialer/speeddial/res/values-en-rIN/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-en-rIN/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-es-rUS/strings.xml b/java/com/android/dialer/speeddial/res/values-es-rUS/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-es-rUS/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-es/strings.xml b/java/com/android/dialer/speeddial/res/values-es/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-es/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-et/strings.xml b/java/com/android/dialer/speeddial/res/values-et/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-et/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-eu/strings.xml b/java/com/android/dialer/speeddial/res/values-eu/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-eu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-fa/strings.xml b/java/com/android/dialer/speeddial/res/values-fa/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-fa/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-fi/strings.xml b/java/com/android/dialer/speeddial/res/values-fi/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-fi/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-fr-rCA/strings.xml b/java/com/android/dialer/speeddial/res/values-fr-rCA/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-fr-rCA/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-fr/strings.xml b/java/com/android/dialer/speeddial/res/values-fr/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-fr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-gl/strings.xml b/java/com/android/dialer/speeddial/res/values-gl/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-gl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-gu/strings.xml b/java/com/android/dialer/speeddial/res/values-gu/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-gu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-hi/strings.xml b/java/com/android/dialer/speeddial/res/values-hi/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-hi/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-hr/strings.xml b/java/com/android/dialer/speeddial/res/values-hr/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-hr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-hu/strings.xml b/java/com/android/dialer/speeddial/res/values-hu/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-hu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-hy/strings.xml b/java/com/android/dialer/speeddial/res/values-hy/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-hy/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-in/strings.xml b/java/com/android/dialer/speeddial/res/values-in/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-in/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-is/strings.xml b/java/com/android/dialer/speeddial/res/values-is/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-is/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-it/strings.xml b/java/com/android/dialer/speeddial/res/values-it/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-it/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-iw/strings.xml b/java/com/android/dialer/speeddial/res/values-iw/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-iw/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ja/strings.xml b/java/com/android/dialer/speeddial/res/values-ja/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ja/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ka/strings.xml b/java/com/android/dialer/speeddial/res/values-ka/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ka/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-kk/strings.xml b/java/com/android/dialer/speeddial/res/values-kk/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-kk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-km/strings.xml b/java/com/android/dialer/speeddial/res/values-km/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-km/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-kn/strings.xml b/java/com/android/dialer/speeddial/res/values-kn/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-kn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ko/strings.xml b/java/com/android/dialer/speeddial/res/values-ko/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ko/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ky/strings.xml b/java/com/android/dialer/speeddial/res/values-ky/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ky/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-lo/strings.xml b/java/com/android/dialer/speeddial/res/values-lo/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-lo/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-lt/strings.xml b/java/com/android/dialer/speeddial/res/values-lt/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-lt/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-lv/strings.xml b/java/com/android/dialer/speeddial/res/values-lv/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-lv/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-mk/strings.xml b/java/com/android/dialer/speeddial/res/values-mk/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-mk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ml/strings.xml b/java/com/android/dialer/speeddial/res/values-ml/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ml/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-mn/strings.xml b/java/com/android/dialer/speeddial/res/values-mn/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-mn/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-mr/strings.xml b/java/com/android/dialer/speeddial/res/values-mr/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-mr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ms/strings.xml b/java/com/android/dialer/speeddial/res/values-ms/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ms/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-my/strings.xml b/java/com/android/dialer/speeddial/res/values-my/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-my/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-nb/strings.xml b/java/com/android/dialer/speeddial/res/values-nb/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-nb/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ne/strings.xml b/java/com/android/dialer/speeddial/res/values-ne/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ne/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-nl/strings.xml b/java/com/android/dialer/speeddial/res/values-nl/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-nl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-no/strings.xml b/java/com/android/dialer/speeddial/res/values-no/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-no/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-pa/strings.xml b/java/com/android/dialer/speeddial/res/values-pa/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-pa/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-pl/strings.xml b/java/com/android/dialer/speeddial/res/values-pl/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-pl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-pt-rBR/strings.xml b/java/com/android/dialer/speeddial/res/values-pt-rBR/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-pt-rBR/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-pt-rPT/strings.xml b/java/com/android/dialer/speeddial/res/values-pt-rPT/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-pt-rPT/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-pt/strings.xml b/java/com/android/dialer/speeddial/res/values-pt/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-pt/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ro/strings.xml b/java/com/android/dialer/speeddial/res/values-ro/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ro/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ru/strings.xml b/java/com/android/dialer/speeddial/res/values-ru/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ru/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-si/strings.xml b/java/com/android/dialer/speeddial/res/values-si/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-si/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-sk/strings.xml b/java/com/android/dialer/speeddial/res/values-sk/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-sk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-sl/strings.xml b/java/com/android/dialer/speeddial/res/values-sl/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-sl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-sq/strings.xml b/java/com/android/dialer/speeddial/res/values-sq/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-sq/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-sr/strings.xml b/java/com/android/dialer/speeddial/res/values-sr/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-sr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-sv/strings.xml b/java/com/android/dialer/speeddial/res/values-sv/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-sv/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-sw/strings.xml b/java/com/android/dialer/speeddial/res/values-sw/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-sw/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ta/strings.xml b/java/com/android/dialer/speeddial/res/values-ta/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ta/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-te/strings.xml b/java/com/android/dialer/speeddial/res/values-te/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-te/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-th/strings.xml b/java/com/android/dialer/speeddial/res/values-th/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-th/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-tl/strings.xml b/java/com/android/dialer/speeddial/res/values-tl/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-tl/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-tr/strings.xml b/java/com/android/dialer/speeddial/res/values-tr/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-tr/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-uk/strings.xml b/java/com/android/dialer/speeddial/res/values-uk/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-uk/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-ur/strings.xml b/java/com/android/dialer/speeddial/res/values-ur/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-ur/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-uz/strings.xml b/java/com/android/dialer/speeddial/res/values-uz/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-uz/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-vi/strings.xml b/java/com/android/dialer/speeddial/res/values-vi/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-vi/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-zh-rCN/strings.xml b/java/com/android/dialer/speeddial/res/values-zh-rCN/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-zh-rCN/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-zh-rHK/strings.xml b/java/com/android/dialer/speeddial/res/values-zh-rHK/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-zh-rHK/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-zh-rTW/strings.xml b/java/com/android/dialer/speeddial/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-zh-rTW/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/speeddial/res/values-zu/strings.xml b/java/com/android/dialer/speeddial/res/values-zu/strings.xml
new file mode 100644
index 000000000..b0c27bc7b
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values-zu/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/java/com/android/dialer/app/res/drawable/overflow_menu.xml b/java/com/android/dialer/speeddial/res/values/colors.xml
index 81be5dcd5..5929df8dd 100644
--- a/java/com/android/dialer/app/res/drawable/overflow_menu.xml
+++ b/java/com/android/dialer/speeddial/res/values/colors.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2014 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.
@@ -14,7 +14,5 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:autoMirrored="true"
- android:src="@drawable/ic_overflow_menu"
- android:tint="@color/actionbar_icon_color"/>
+<resources>
+</resources> \ No newline at end of file
diff --git a/java/com/android/dialer/speeddial/res/values/dimens.xml b/java/com/android/dialer/speeddial/res/values/dimens.xml
new file mode 100644
index 000000000..5929df8dd
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values/dimens.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+<resources>
+</resources> \ No newline at end of file
diff --git a/java/com/android/dialer/speeddial/res/values/strings.xml b/java/com/android/dialer/speeddial/res/values/strings.xml
new file mode 100644
index 000000000..5929df8dd
--- /dev/null
+++ b/java/com/android/dialer/speeddial/res/values/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+<resources>
+</resources> \ No newline at end of file
diff --git a/java/com/android/dialer/theme/res/drawable-hdpi/ic_block_24dp.png b/java/com/android/dialer/theme/res/drawable-hdpi/ic_block_24dp.png
deleted file mode 100644
index 2ccc89d24..000000000
--- a/java/com/android/dialer/theme/res/drawable-hdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/drawable-hdpi/ic_call_arrow.png b/java/com/android/dialer/theme/res/drawable-hdpi/ic_call_arrow.png
deleted file mode 100644
index 14a33e39f..000000000
--- a/java/com/android/dialer/theme/res/drawable-hdpi/ic_call_arrow.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/drawable-mdpi/ic_block_24dp.png b/java/com/android/dialer/theme/res/drawable-mdpi/ic_block_24dp.png
deleted file mode 100644
index ec1b33f0e..000000000
--- a/java/com/android/dialer/theme/res/drawable-mdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/drawable-mdpi/ic_call_arrow.png b/java/com/android/dialer/theme/res/drawable-mdpi/ic_call_arrow.png
deleted file mode 100644
index 169cf2934..000000000
--- a/java/com/android/dialer/theme/res/drawable-mdpi/ic_call_arrow.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/drawable-xhdpi/ic_block_24dp.png b/java/com/android/dialer/theme/res/drawable-xhdpi/ic_block_24dp.png
deleted file mode 100644
index 7aba97b65..000000000
--- a/java/com/android/dialer/theme/res/drawable-xhdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/drawable-xhdpi/ic_call_arrow.png b/java/com/android/dialer/theme/res/drawable-xhdpi/ic_call_arrow.png
deleted file mode 100644
index 6f1366018..000000000
--- a/java/com/android/dialer/theme/res/drawable-xhdpi/ic_call_arrow.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/drawable-xxhdpi/ic_block_24dp.png b/java/com/android/dialer/theme/res/drawable-xxhdpi/ic_block_24dp.png
deleted file mode 100644
index fddfa54b8..000000000
--- a/java/com/android/dialer/theme/res/drawable-xxhdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/drawable-xxhdpi/ic_call_arrow.png b/java/com/android/dialer/theme/res/drawable-xxhdpi/ic_call_arrow.png
deleted file mode 100644
index 0364ee015..000000000
--- a/java/com/android/dialer/theme/res/drawable-xxhdpi/ic_call_arrow.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/drawable-xxxhdpi/ic_block_24dp.png b/java/com/android/dialer/theme/res/drawable-xxxhdpi/ic_block_24dp.png
deleted file mode 100644
index 0378d1bed..000000000
--- a/java/com/android/dialer/theme/res/drawable-xxxhdpi/ic_block_24dp.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/drawable-xxxhdpi/ic_call_arrow.png b/java/com/android/dialer/theme/res/drawable-xxxhdpi/ic_call_arrow.png
deleted file mode 100644
index 8243c2536..000000000
--- a/java/com/android/dialer/theme/res/drawable-xxxhdpi/ic_call_arrow.png
+++ /dev/null
Binary files differ
diff --git a/java/com/android/dialer/theme/res/values/colors.xml b/java/com/android/dialer/theme/res/values/colors.xml
index 755c3dbe2..a31a75e4e 100644
--- a/java/com/android/dialer/theme/res/values/colors.xml
+++ b/java/com/android/dialer/theme/res/values/colors.xml
@@ -63,4 +63,7 @@
<color name="titlebar_in_recents_background_color">@color/dialer_theme_color_dark</color>
<color name="blue_grey_100">#CFD8DC</color>
+
+ <!-- Color of call type icons in call log, e.g. voicemail, video, WiFi, HD etc. -->
+ <color name="call_type_icon_color">#89000000</color>
</resources>
diff --git a/java/com/android/dialer/theme/res/values/dimens.xml b/java/com/android/dialer/theme/res/values/dimens.xml
index 373b33dfc..8b8e61f11 100644
--- a/java/com/android/dialer/theme/res/values/dimens.xml
+++ b/java/com/android/dialer/theme/res/values/dimens.xml
@@ -26,8 +26,5 @@
<dimen name="actionbar_and_tab_height">107dp</dimen>
<dimen name="actionbar_contentInsetStart">72dp</dimen>
- <dimen name="toolbar_title_text_size">14sp</dimen>
- <dimen name="toolbar_subtitle_text_size">12sp</dimen>
-
- <dimen name="call_log_icon_margin">4dp</dimen>
+ <dimen name="call_log_icon_margin">2dp</dimen>
</resources>
diff --git a/java/com/android/dialer/theme/res/values/styles.xml b/java/com/android/dialer/theme/res/values/styles.xml
index b5e89ff48..ac94d0687 100644
--- a/java/com/android/dialer/theme/res/values/styles.xml
+++ b/java/com/android/dialer/theme/res/values/styles.xml
@@ -53,15 +53,4 @@
<item name="android:background">@color/actionbar_background_color</item>
<item name="background">@color/actionbar_background_color</item>
</style>
-
- <style name="toolbar_title_text">
- <item name="android:textSize">@dimen/toolbar_title_text_size</item>
- <item name="android:textColor">@color/background_dialer_white</item>
- <item name="android:fontFamily">sans-serif-medium</item>
- </style>
-
- <style name="toolbar_subtitle_text">
- <item name="android:textSize">@dimen/toolbar_subtitle_text_size</item>
- <item name="android:textColor">@color/background_dialer_white</item>
- </style>
</resources>
diff --git a/java/com/android/dialer/theme/res/values/themes.xml b/java/com/android/dialer/theme/res/values/themes.xml
index 452b36929..0d0c45f90 100644
--- a/java/com/android/dialer/theme/res/values/themes.xml
+++ b/java/com/android/dialer/theme/res/values/themes.xml
@@ -18,4 +18,12 @@
<item name="android:actionBarSize">@dimen/action_bar_height</item>
<item name="actionBarSize">@dimen/action_bar_height</item>
</style>
+
+ <style name="Theme.AppCompat.Translucent" parent="Theme.AppCompat.NoActionBar">
+ <item name="android:windowNoTitle">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:colorBackgroundCacheHint">@null</item>
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowAnimationStyle">@android:style/Animation</item>
+ </style>
</resources>
diff --git a/java/com/android/dialer/voicemailstatus/res/values-de/strings.xml b/java/com/android/dialer/voicemailstatus/res/values-de/strings.xml
index 75a5a0742..1c1ede17b 100644
--- a/java/com/android/dialer/voicemailstatus/res/values-de/strings.xml
+++ b/java/com/android/dialer/voicemailstatus/res/values-de/strings.xml
@@ -18,7 +18,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="voicemail_status_voicemail_not_available" msgid="5853033558114540057">"Keine Mailbox-Aktualisierungen verfügbar"</string>
- <string name="voicemail_status_messages_waiting" msgid="8900895357460505877">"Neue Mailbox-Nachricht wartet. Laden momentan nicht möglich."</string>
+ <string name="voicemail_status_messages_waiting" msgid="8900895357460505877">"Neue Mailboxnachricht wartet. Laden momentan nicht möglich."</string>
<string name="voicemail_status_configure_voicemail" msgid="8642831215097798709">"Richte deine Mailbox ein."</string>
<string name="voicemail_status_audio_not_available" msgid="2341871147130931237">"Audio nicht verfügbar"</string>
<string name="voicemail_status_action_configure" msgid="4445818528232235329">"Einrichten"</string>
diff --git a/java/com/android/dialer/widget/DialerToolbar.java b/java/com/android/dialer/widget/DialerToolbar.java
new file mode 100644
index 000000000..715a27701
--- /dev/null
+++ b/java/com/android/dialer/widget/DialerToolbar.java
@@ -0,0 +1,67 @@
+/*
+ * 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.widget;
+
+import android.app.Activity;
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.support.v7.widget.Toolbar;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+/** Toolbar widget for Dialer. */
+public class DialerToolbar extends Toolbar {
+
+ private final TextView title;
+ private final TextView subtitle;
+
+ public DialerToolbar(Context context, @Nullable AttributeSet attributeSet) {
+ super(context, attributeSet);
+ inflate(context, R.layout.dialer_toolbar, this);
+ title = (TextView) findViewById(R.id.title);
+ subtitle = (TextView) findViewById(R.id.subtitle);
+
+ setElevation(getResources().getDimensionPixelSize(R.dimen.toolbar_elevation));
+ setBackgroundColor(getResources().getColor(R.color.dialer_theme_color));
+ setNavigationIcon(R.drawable.quantum_ic_close_white_24);
+ setNavigationOnClickListener(v -> ((Activity) context).finish());
+ }
+
+ @Override
+ public void setTitle(@StringRes int id) {
+ setTitle(getResources().getString(id));
+ }
+
+ @Override
+ public void setTitle(CharSequence charSequence) {
+ title.setText(charSequence);
+ }
+
+ @Override
+ public void setSubtitle(@StringRes int id) {
+ setSubtitle(getResources().getString(id));
+ }
+
+ @Override
+ public void setSubtitle(CharSequence charSequence) {
+ if (charSequence != null) {
+ subtitle.setText(charSequence);
+ subtitle.setVisibility(VISIBLE);
+ }
+ }
+}
diff --git a/java/com/android/dialer/widget/res/layout/dialer_toolbar.xml b/java/com/android/dialer/widget/res/layout/dialer_toolbar.xml
new file mode 100644
index 000000000..c4aac65fb
--- /dev/null
+++ b/java/com/android/dialer/widget/res/layout/dialer_toolbar.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical">
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="top"
+ android:textSize="@dimen/toolbar_title_text_size"
+ android:textColor="@color/background_dialer_white"
+ android:fontFamily="sans-serif-medium"/>
+
+ <TextView
+ android:id="@+id/subtitle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="@dimen/toolbar_subtitle_text_size"
+ android:textColor="@color/background_dialer_white"
+ android:visibility="gone"/>
+ </LinearLayout>
+</merge> \ 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 6c4ea604f..0b1c1f15b 100644
--- a/java/com/android/dialer/widget/res/values/dimens.xml
+++ b/java/com/android/dialer/widget/res/values/dimens.xml
@@ -20,4 +20,9 @@
<dimen name="textview_item_padding">16dp</dimen>
<dimen name="message_remaining_char_text_size">12sp</dimen>
<dimen name="message_divider_height">1dp</dimen>
+
+ <dimen name="toolbar_title_text_size">20sp</dimen>
+ <dimen name="toolbar_title_small_text_size">14sp</dimen>
+ <dimen name="toolbar_subtitle_text_size">12sp</dimen>
+ <dimen name="toolbar_elevation">4dp</dimen>
</resources> \ No newline at end of file